1 /* Srmsrvr.c: this file contains Socket library support
2  * Authors:      Charles E. Campbell, Jr.
3  *               Terry McRoberts
4  * Copyright:    Copyright (C) 1999-2005 Charles E. Campbell, Jr. {{{1
5  *               Permission is hereby granted to use and distribute this code,
6  *               with or without modifications, provided that this copyright
7  *               notice is copied with it. Like anything else that's free,
8  *               Srmsrvr.c is provided *as is* and comes with no warranty
9  *               of any kind, either expressed or implied. By using this
10  *               software, you agree that in no event will the copyright
11  *               holder be liable for any damages resulting from the use
12  *               of this software.
13  * Date:         Aug 22, 2005
14  */
15 #include <stdio.h>
16 #include <unistd.h>
17 #include "xtdio.h"
18 #include "sockets.h"
19 
20 /* -------------------------------------------------------------------------
21  * Local Definitions:
22  */
23 #define BUFSIZE 128
24 #define TIMEOUT  20L
25 
26 /* ------------------------------------------------------------------------- */
27 
28 /* Srmsrvr: this function removes a server from the PortMaster's table
29  * It only needs a server name.
30  *
31  *  Returns:  PM_OK    if it worked
32  *            PM_SORRY otherwise
33  */
34 #ifdef __PROTOTYPE__
Srmsrvr(char * skthost)35 SKTEVENT Srmsrvr(char *skthost)
36 #else
37 SKTEVENT Srmsrvr(skthost)
38 char *skthost;
39 #endif
40 {
41 char       *at                 = NULL;
42 char       *hostname           = NULL;
43 int         trycnt;
44 Socket     *pmskt              = NULL;
45 static char localhost[BUFSIZE] = "";
46 SKTEVENT    mesg;
47 
48 
49 /* parse skthost into sktname and hostname strings */
50 at= strchr(skthost,'@');
51 if(!at) {	/* fill in missing hostname with current host */
52 	char *pmshare= NULL;
53 	/* if sharing a PortMaster and no host was specified, use the PMSHARE-specified
54 	 * host (if PMSHARE exists), otherwise use localhost
55 	 */
56 	pmshare= getenv("PMSHARE");
57 	if(pmshare) hostname= pmshare;
58 	else {
59 		if(!localhost[0]) gethostname(localhost,BUFSIZE);
60 		hostname= localhost;
61 		}
62 	pmskt= Sopen_clientport(hostname,"SktRmSrvr",PORTMASTER);
63 	}
64 
65 else {	/* use hostname specified in skthost */
66 	skthost[(int) (at - skthost)]= '\0';
67 	hostname= skthost + ((int) (at - skthost)) + 1;
68 	pmskt   = Sopen_clientport(hostname,"SktRmSrvr",PORTMASTER);
69 	}
70 
71 /* --- PortMaster Interface --- */
72 if(!pmskt) {
73 	if(at) skthost[(int) (at - skthost)]= '@';
74 	return PM_SORRY;
75 	}
76 
77 trycnt= 0;
78 do {
79 	mesg= htons(PM_RMSERVER);
80 	Swrite(pmskt,(char *) &mesg,sizeof(mesg));
81 
82 	/* don't wait forever... */
83 	if(Stimeoutwait(pmskt,TIMEOUT,0L) < 0) {
84 		shutdown(pmskt->skt,2);
85 		close(pmskt->skt);
86 		freeSocket(pmskt);
87 		return PM_SORRY;
88 		}
89 
90 	/* read PortMaster's response */
91 	if(Sreadbytes(pmskt,(char *) &mesg,sizeof(mesg)) <= 0) {
92 		if(at) skthost[(int) (at - skthost)]= '@';
93 		shutdown(pmskt->skt,2);
94 		close(pmskt->skt);
95 		return PM_SORRY;
96 		}
97 	mesg= ntohs(mesg);
98 
99 	/* only allow PM_MAXTRY attempts to communicate with the PortMaster */
100 	if(++trycnt >= PM_MAXTRY) {
101 		if(at) skthost[(int) (at - skthost)]= '@';
102 		shutdown(pmskt->skt,2);
103 		close(pmskt->skt);
104 		return PM_SORRY;
105 		}
106 	} while(mesg != PM_OK);
107 
108 Sputs(skthost,pmskt);
109 
110 /* read PortMaster's response (should be PM_OK) */
111 Sreadbytes(pmskt,(char *) &mesg,sizeof(mesg));
112 shutdown(pmskt->skt,2);
113 close(pmskt->skt);
114 mesg= ntohs(mesg);
115 
116 /* restore skthost string */
117 if(at) skthost[(int) (at - skthost)]= '@';
118 
119 return mesg;
120 }
121 
122 /* ---------------------------------------------------------------------
123  * vim: ts=4
124  */
125