diff options
author | brian <brian@FreeBSD.org> | 2001-01-26 01:41:34 +0000 |
---|---|---|
committer | brian <brian@FreeBSD.org> | 2001-01-26 01:41:34 +0000 |
commit | 63b65f9457011d370ef859a506f558b2731883d2 (patch) | |
tree | 694b69d9cd6e10dc4a8f60f6fc9ebc124e7875db /usr.sbin | |
parent | a4be54702c06f4adfd819f74d6f5586d5362b361 (diff) | |
download | FreeBSD-src-63b65f9457011d370ef859a506f558b2731883d2.zip FreeBSD-src-63b65f9457011d370ef859a506f558b2731883d2.tar.gz |
Allow ``set server closed'' to close the diagnostic socket.
Allow ``set server open'' to re-open the diagnostic socket.
Handle SIGUSR1 by re-opening the diagnostic socket
When receiving SIGUSR2 (and in ``set server none''), don't forget the
socket details so that ``set server open'' and SIGUSR1 open it again.
Don't create the diagnostic socket as uid 0 ! It's far to dangerous.
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/ppp/bundle.c | 48 | ||||
-rw-r--r-- | usr.sbin/ppp/command.c | 31 | ||||
-rw-r--r-- | usr.sbin/ppp/main.c | 11 | ||||
-rw-r--r-- | usr.sbin/ppp/ppp.8 | 31 | ||||
-rw-r--r-- | usr.sbin/ppp/ppp.8.m4 | 31 | ||||
-rw-r--r-- | usr.sbin/ppp/prompt.c | 4 | ||||
-rw-r--r-- | usr.sbin/ppp/radius.c | 13 | ||||
-rw-r--r-- | usr.sbin/ppp/server.c | 150 | ||||
-rw-r--r-- | usr.sbin/ppp/server.h | 24 |
9 files changed, 258 insertions, 85 deletions
diff --git a/usr.sbin/ppp/bundle.c b/usr.sbin/ppp/bundle.c index 30627a1..1005ed2 100644 --- a/usr.sbin/ppp/bundle.c +++ b/usr.sbin/ppp/bundle.c @@ -96,6 +96,7 @@ #include "datalink.h" #include "ip.h" #include "iface.h" +#include "server.h" #define SCATTER_SEGMENTS 7 /* version, datalink, name, physical, throughput, throughput, device */ @@ -1177,18 +1178,29 @@ bundle_ShowStatus(struct cmdargs const *arg) arg->bundle->cfg.ifqueue); prompt_Printf(arg->prompt, "\nDefaults:\n"); - prompt_Printf(arg->prompt, " Label: %s\n", arg->bundle->cfg.label); - prompt_Printf(arg->prompt, " Auth name: %s\n", + prompt_Printf(arg->prompt, " Label: %s\n", + arg->bundle->cfg.label); + prompt_Printf(arg->prompt, " Auth name: %s\n", arg->bundle->cfg.auth.name); + prompt_Printf(arg->prompt, " Diagnostic socket: "); + if (*server.cfg.sockname != '\0') + prompt_Printf(arg->prompt, "%s, mask 0%03o%s\n", + server.cfg.sockname, (int)server.cfg.mask, + server.fd == -1 ? " (not open)" : ""); + else if (server.cfg.port != 0) + prompt_Printf(arg->prompt, "TCP port %d%s\n", server.cfg.port, + server.fd == -1 ? " (not open)" : ""); + else + prompt_Printf(arg->prompt, "none\n"); - prompt_Printf(arg->prompt, " Choked Timer: %ds\n", + prompt_Printf(arg->prompt, " Choked Timer: %ds\n", arg->bundle->cfg.choked.timeout); #ifndef NORADIUS radius_Show(&arg->bundle->radius, arg->prompt); #endif - prompt_Printf(arg->prompt, " Idle Timer: "); + prompt_Printf(arg->prompt, " Idle Timer: "); if (arg->bundle->cfg.idle.timeout) { prompt_Printf(arg->prompt, "%ds", arg->bundle->cfg.idle.timeout); if (arg->bundle->cfg.idle.min_timeout) @@ -1200,13 +1212,13 @@ bundle_ShowStatus(struct cmdargs const *arg) prompt_Printf(arg->prompt, "\n"); } else prompt_Printf(arg->prompt, "disabled\n"); - prompt_Printf(arg->prompt, " MTU: "); + prompt_Printf(arg->prompt, " MTU: "); if (arg->bundle->cfg.mtu) prompt_Printf(arg->prompt, "%d\n", arg->bundle->cfg.mtu); else prompt_Printf(arg->prompt, "unspecified\n"); - prompt_Printf(arg->prompt, " sendpipe: "); + prompt_Printf(arg->prompt, " sendpipe: "); if (arg->bundle->ncp.ipcp.cfg.sendpipe > 0) prompt_Printf(arg->prompt, "%-20ld", arg->bundle->ncp.ipcp.cfg.sendpipe); else @@ -1217,29 +1229,29 @@ bundle_ShowStatus(struct cmdargs const *arg) else prompt_Printf(arg->prompt, "unspecified\n"); - prompt_Printf(arg->prompt, " Sticky Routes: %-20.20s", + prompt_Printf(arg->prompt, " Sticky Routes: %-20.20s", optval(arg->bundle, OPT_SROUTES)); - prompt_Printf(arg->prompt, " Filter Decap: %s\n", + prompt_Printf(arg->prompt, " Filter Decap: %s\n", optval(arg->bundle, OPT_FILTERDECAP)); - prompt_Printf(arg->prompt, " ID check: %-20.20s", + prompt_Printf(arg->prompt, " ID check: %-20.20s", optval(arg->bundle, OPT_IDCHECK)); - prompt_Printf(arg->prompt, " Keep-Session: %s\n", + prompt_Printf(arg->prompt, " Keep-Session: %s\n", optval(arg->bundle, OPT_KEEPSESSION)); - prompt_Printf(arg->prompt, " Loopback: %-20.20s", + prompt_Printf(arg->prompt, " Loopback: %-20.20s", optval(arg->bundle, OPT_LOOPBACK)); - prompt_Printf(arg->prompt, " PasswdAuth: %s\n", + prompt_Printf(arg->prompt, " PasswdAuth: %s\n", optval(arg->bundle, OPT_PASSWDAUTH)); - prompt_Printf(arg->prompt, " Proxy: %-20.20s", + prompt_Printf(arg->prompt, " Proxy: %-20.20s", optval(arg->bundle, OPT_PROXY)); - prompt_Printf(arg->prompt, " Proxyall: %s\n", + prompt_Printf(arg->prompt, " Proxyall: %s\n", optval(arg->bundle, OPT_PROXYALL)); - prompt_Printf(arg->prompt, " TCPMSS Fixup: %-20.20s", + prompt_Printf(arg->prompt, " TCPMSS Fixup: %-20.20s", optval(arg->bundle, OPT_TCPMSSFIXUP)); - prompt_Printf(arg->prompt, " Throughput: %s\n", + prompt_Printf(arg->prompt, " Throughput: %s\n", optval(arg->bundle, OPT_THROUGHPUT)); - prompt_Printf(arg->prompt, " Utmp Logging: %-20.20s", + prompt_Printf(arg->prompt, " Utmp Logging: %-20.20s", optval(arg->bundle, OPT_UTMP)); - prompt_Printf(arg->prompt, " Iface-Alias: %s\n", + prompt_Printf(arg->prompt, " Iface-Alias: %s\n", optval(arg->bundle, OPT_IFACEALIAS)); return 0; diff --git a/usr.sbin/ppp/command.c b/usr.sbin/ppp/command.c index 05b25fd..ae68092 100644 --- a/usr.sbin/ppp/command.c +++ b/usr.sbin/ppp/command.c @@ -1287,14 +1287,35 @@ SetServer(struct cmdargs const *arg) return -1; } } else if (strcasecmp(port, "none") == 0) { + if (server_Clear(arg->bundle)) + log_Printf(LogPHASE, "Disabled server socket\n"); + return 0; + } else if (strcasecmp(port, "open") == 0) { + switch (server_Reopen(arg->bundle)) { + case SERVER_OK: + return 0; + case SERVER_FAILED: + log_Printf(LogPHASE, "Failed to reopen server port\n"); + return 1; + case SERVER_UNSET: + log_Printf(LogPHASE, "Cannot reopen unset server socket\n"); + return 1; + default: + break; + } + return -1; + } else if (strcasecmp(port, "closed") == 0) { if (server_Close(arg->bundle)) - log_Printf(LogPHASE, "Disabled server port.\n"); + log_Printf(LogPHASE, "Closed server socket\n"); + else + log_Printf(LogWARN, "Server socket not open\n"); + return 0; } else return -1; - strncpy(server.passwd, passwd, sizeof server.passwd - 1); - server.passwd[sizeof server.passwd - 1] = '\0'; + strncpy(server.cfg.passwd, passwd, sizeof server.cfg.passwd - 1); + server.cfg.passwd[sizeof server.cfg.passwd - 1] = '\0'; if (*port == '/') { mode_t imask; @@ -2060,8 +2081,8 @@ static struct cmdtab const SetCommands[] = { "Redial timeout", "set redial secs[+inc[-incmax]][.next] [attempts]"}, {"sendpipe", NULL, SetVariable, LOCAL_AUTH, "SENDPIPE value", "set sendpipe value", (const void *)VAR_SENDPIPE}, - {"server", "socket", SetServer, LOCAL_AUTH, - "server port", "set server|socket TcpPort|LocalName|none password [mask]"}, + {"server", "socket", SetServer, LOCAL_AUTH, "diagnostic port", + "set server|socket TcpPort|LocalName|none|open|closed [password [mask]]"}, {"speed", NULL, SetModemSpeed, LOCAL_AUTH | LOCAL_CX, "physical speed", "set speed value|sync"}, {"stopped", NULL, SetStoppedTimeout, LOCAL_AUTH | LOCAL_CX, diff --git a/usr.sbin/ppp/main.c b/usr.sbin/ppp/main.c index 6b72b76..ecc2e0f 100644 --- a/usr.sbin/ppp/main.c +++ b/usr.sbin/ppp/main.c @@ -162,7 +162,15 @@ static void BringDownServer(int signo) { /* Drops all child prompts too ! */ - server_Close(SignalBundle); + if (server_Close(SignalBundle)) + log_Printf(LogPHASE, "Closed server socket\n"); +} + +static void +RestartServer(int signo) +{ + /* Drops all child prompts and re-opens the socket */ + server_Reopen(SignalBundle); } static void @@ -371,6 +379,7 @@ main(int argc, char **argv) if (sw.mode == PHYS_INTERACTIVE) sig_signal(SIGTSTP, TerminalStop); + sig_signal(SIGUSR1, RestartServer); sig_signal(SIGUSR2, BringDownServer); lastlabel = argv[argc - 1]; diff --git a/usr.sbin/ppp/ppp.8 b/usr.sbin/ppp/ppp.8 index 998275a..4120382 100644 --- a/usr.sbin/ppp/ppp.8 +++ b/usr.sbin/ppp/ppp.8 @@ -2351,11 +2351,18 @@ mode. These signals tell .Nm to exit. +.It USR1 +This signal, tells +.Nm +to re-open any existing server socket, dropping all existing diagnostic +connections. Sockets that couldn't previously be opened will be retried. .It USR2 This signal, tells .Nm to close any existing server socket, dropping all existing diagnostic connections. +.Dv SIGUSR1 +can still be used to re-open the socket. .El .Pp .Sh MULTI-LINK PPP @@ -5141,7 +5148,7 @@ The optimum value is just over twice the MTU value. If .Ar value is unspecified or zero, the default kernel controlled value is used. -.It set server|socket Ar TcpPort|LocalName|none password Op Ar mask +.It set server|socket Ar TcpPort|LocalName|none|open|closed Op password Op Ar mask This command tells .Nm to listen on the given socket or @@ -5152,7 +5159,17 @@ The word .Ar none instructs .Nm -to close any existing socket. +to close any existing socket and clear the socket configuration. +The word +.Ar open +instructs +.Nm +to attempt to re-open the port. +The word +.Ar closed +instructs +.Nm +to close the open port. .Pp If you wish to specify a local domain socket, .Ar LocalName @@ -5169,7 +5186,7 @@ for details of how to translate TCP port names. You must also specify the password that must be entered by the client (using the .Dq passwd -command above) when connecting to this socket. +variable above) when connecting to this socket. If the password is specified as an empty string, no password is required for connecting clients. .Pp @@ -5194,7 +5211,13 @@ Currently, .Xr telnet 1 can also be used, but link encryption may be implemented in the future, so .Xr telnet 1 -should not be relied upon. +should be avoided. +.Pp +Note; +.Dv SIGUSR1 +and +.Dv SIGUSR2 +interact with the diagnostic socket. .It set speed Ar value This sets the speed of the serial device. If speed is specified as diff --git a/usr.sbin/ppp/ppp.8.m4 b/usr.sbin/ppp/ppp.8.m4 index 998275a..4120382 100644 --- a/usr.sbin/ppp/ppp.8.m4 +++ b/usr.sbin/ppp/ppp.8.m4 @@ -2351,11 +2351,18 @@ mode. These signals tell .Nm to exit. +.It USR1 +This signal, tells +.Nm +to re-open any existing server socket, dropping all existing diagnostic +connections. Sockets that couldn't previously be opened will be retried. .It USR2 This signal, tells .Nm to close any existing server socket, dropping all existing diagnostic connections. +.Dv SIGUSR1 +can still be used to re-open the socket. .El .Pp .Sh MULTI-LINK PPP @@ -5141,7 +5148,7 @@ The optimum value is just over twice the MTU value. If .Ar value is unspecified or zero, the default kernel controlled value is used. -.It set server|socket Ar TcpPort|LocalName|none password Op Ar mask +.It set server|socket Ar TcpPort|LocalName|none|open|closed Op password Op Ar mask This command tells .Nm to listen on the given socket or @@ -5152,7 +5159,17 @@ The word .Ar none instructs .Nm -to close any existing socket. +to close any existing socket and clear the socket configuration. +The word +.Ar open +instructs +.Nm +to attempt to re-open the port. +The word +.Ar closed +instructs +.Nm +to close the open port. .Pp If you wish to specify a local domain socket, .Ar LocalName @@ -5169,7 +5186,7 @@ for details of how to translate TCP port names. You must also specify the password that must be entered by the client (using the .Dq passwd -command above) when connecting to this socket. +variable above) when connecting to this socket. If the password is specified as an empty string, no password is required for connecting clients. .Pp @@ -5194,7 +5211,13 @@ Currently, .Xr telnet 1 can also be used, but link encryption may be implemented in the future, so .Xr telnet 1 -should not be relied upon. +should be avoided. +.Pp +Note; +.Dv SIGUSR1 +and +.Dv SIGUSR2 +interact with the diagnostic socket. .It set speed Ar value This sets the speed of the serial device. If speed is specified as diff --git a/usr.sbin/ppp/prompt.c b/usr.sbin/ppp/prompt.c index af333ee..46fb9ee 100644 --- a/usr.sbin/ppp/prompt.c +++ b/usr.sbin/ppp/prompt.c @@ -330,7 +330,7 @@ prompt_Create(struct server *s, struct bundle *bundle, int fd) p->fd_in = p->fd_out = fd; p->Term = fdopen(fd, "a+"); p->owner = s; - p->auth = *s->passwd ? LOCAL_NO_AUTH : LOCAL_AUTH; + p->auth = *s->cfg.passwd ? LOCAL_NO_AUTH : LOCAL_AUTH; p->src.type = "unknown"; *p->src.from = '\0'; } @@ -518,7 +518,7 @@ PasswdCommand(struct cmdargs const *arg) else pass = arg->argv[arg->argn]; - if (!strcmp(arg->prompt->owner->passwd, pass)) + if (!strcmp(arg->prompt->owner->cfg.passwd, pass)) arg->prompt->auth = LOCAL_AUTH; else arg->prompt->auth = LOCAL_NO_AUTH; diff --git a/usr.sbin/ppp/radius.c b/usr.sbin/ppp/radius.c index 37323fc..6e4a445 100644 --- a/usr.sbin/ppp/radius.c +++ b/usr.sbin/ppp/radius.c @@ -628,14 +628,15 @@ radius_Account(struct radius *r, struct radacct *ac, struct datalink *dl, void radius_Show(struct radius *r, struct prompt *p) { - prompt_Printf(p, " Radius config: %s", *r->cfg.file ? r->cfg.file : "none"); + prompt_Printf(p, " Radius config: %s", + *r->cfg.file ? r->cfg.file : "none"); if (r->valid) { - prompt_Printf(p, "\n IP: %s\n", inet_ntoa(r->ip)); - prompt_Printf(p, " Netmask: %s\n", inet_ntoa(r->mask)); - prompt_Printf(p, " MTU: %lu\n", r->mtu); - prompt_Printf(p, " VJ: %sabled\n", r->vj ? "en" : "dis"); + prompt_Printf(p, "\n IP: %s\n", inet_ntoa(r->ip)); + prompt_Printf(p, " Netmask: %s\n", inet_ntoa(r->mask)); + prompt_Printf(p, " MTU: %lu\n", r->mtu); + prompt_Printf(p, " VJ: %sabled\n", r->vj ? "en" : "dis"); if (r->routes) - route_ShowSticky(p, r->routes, " Routes", 16); + route_ShowSticky(p, r->routes, " Routes", 16); } else prompt_Printf(p, " (not authenticated)\n"); } diff --git a/usr.sbin/ppp/server.c b/usr.sbin/ppp/server.c index a87545c..5d29c8b 100644 --- a/usr.sbin/ppp/server.c +++ b/usr.sbin/ppp/server.c @@ -26,7 +26,8 @@ * $FreeBSD$ */ -#include <sys/types.h> +#include <sys/param.h> + #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> @@ -138,7 +139,7 @@ server_Read(struct fdescriptor *d, struct bundle *bundle, const fd_set *fdset) switch (sa->sa_family) { case AF_LOCAL: p->src.type = "local"; - strncpy(p->src.from, s->rm, sizeof p->src.from - 1); + strncpy(p->src.from, s->cfg.sockname, sizeof p->src.from - 1); p->src.from[sizeof p->src.from - 1] = '\0'; break; case AF_INET: @@ -180,70 +181,115 @@ struct server server = { -1 }; -int +enum server_stat +server_Reopen(struct bundle *bundle) +{ + char name[sizeof server.cfg.sockname]; + u_short port; + mode_t mask; + enum server_stat ret; + + if (server.cfg.sockname[0] != '\0') { + strcpy(name, server.cfg.sockname); + mask = server.cfg.mask; + server_Close(bundle); + if (server.cfg.sockname[0] != '\0') + /* blow it away - and hope nobody else is using it */ + unlink(server.cfg.sockname); + ret = server_LocalOpen(bundle, name, mask); + } else if (server.cfg.port != 0) { + port = server.cfg.port; + server_Close(bundle); + ret = server_TcpOpen(bundle, port); + } else + ret = SERVER_UNSET; + + return ret; +} + +enum server_stat server_LocalOpen(struct bundle *bundle, const char *name, mode_t mask) { + struct sockaddr_un ifsun; + mode_t oldmask; int s; - if (server.rm && !strcmp(server.rm, name)) { - if (chmod(server.rm, 0777 & ~mask)) - log_Printf(LogERROR, "Local: chmod: %s\n", strerror(errno)); - return 0; - } + oldmask = (mode_t)-1; /* Silence compiler */ + + if (server.cfg.sockname && !strcmp(server.cfg.sockname, name)) + server_Close(bundle); - memset(&server.ifsun, '\0', sizeof server.ifsun); - server.ifsun.sun_len = strlen(name); - if (server.ifsun.sun_len > sizeof server.ifsun.sun_path - 1) { + memset(&ifsun, '\0', sizeof ifsun); + ifsun.sun_len = strlen(name); + if (ifsun.sun_len > sizeof ifsun.sun_path - 1) { log_Printf(LogERROR, "Local: %s: Path too long\n", name); - return 2; + return SERVER_INVALID; } - server.ifsun.sun_family = AF_LOCAL; - strcpy(server.ifsun.sun_path, name); + ifsun.sun_family = AF_LOCAL; + strcpy(ifsun.sun_path, name); - s = ID0socket(PF_LOCAL, SOCK_STREAM, 0); + s = socket(PF_LOCAL, SOCK_STREAM, 0); if (s < 0) { log_Printf(LogERROR, "Local: socket: %s\n", strerror(errno)); - return 3; + goto failed; } setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s); if (mask != (mode_t)-1) - mask = umask(mask); - if (bind(s, (struct sockaddr *)&server.ifsun, sizeof server.ifsun) < 0) { + oldmask = umask(mask); + if (bind(s, (struct sockaddr *)&ifsun, sizeof ifsun) < 0) { if (mask != (mode_t)-1) - umask(mask); + umask(oldmask); log_Printf(LogWARN, "Local: bind: %s\n", strerror(errno)); close(s); - return 4; + goto failed; } if (mask != (mode_t)-1) - umask(mask); + umask(oldmask); if (listen(s, 5) != 0) { log_Printf(LogERROR, "Local: Unable to listen to socket -" " BUNDLE overload?\n"); close(s); - ID0unlink(name); - return 5; + unlink(name); + goto failed; } server_Close(bundle); server.fd = s; - server.rm = server.ifsun.sun_path; + server.cfg.port = 0; + strncpy(server.cfg.sockname, ifsun.sun_path, sizeof server.cfg.sockname - 1); + server.cfg.sockname[sizeof server.cfg.sockname - 1] = '\0'; + server.cfg.mask = mask; log_Printf(LogPHASE, "Listening at local socket %s.\n", name); - return 0; + + return SERVER_OK; + +failed: + if (server.fd == -1) { + server.fd = -1; + server.cfg.port = 0; + strncpy(server.cfg.sockname, ifsun.sun_path, + sizeof server.cfg.sockname - 1); + server.cfg.sockname[sizeof server.cfg.sockname - 1] = '\0'; + server.cfg.mask = mask; + } + return SERVER_FAILED; } -int -server_TcpOpen(struct bundle *bundle, int port) +enum server_stat +server_TcpOpen(struct bundle *bundle, u_short port) { struct sockaddr_in ifsin; int s; - if (server.port == port) - return 0; + if (server.cfg.port == port) + server_Close(bundle); + + if (port == 0) + return SERVER_INVALID; - s = ID0socket(PF_INET, SOCK_STREAM, 0); + s = socket(PF_INET, SOCK_STREAM, 0); if (s < 0) { log_Printf(LogERROR, "Tcp: socket: %s\n", strerror(errno)); - return 7; + goto failed; } memset(&ifsin, '\0', sizeof ifsin); ifsin.sin_family = AF_INET; @@ -253,40 +299,66 @@ server_TcpOpen(struct bundle *bundle, int port) if (bind(s, (struct sockaddr *)&ifsin, sizeof ifsin) < 0) { log_Printf(LogWARN, "Tcp: bind: %s\n", strerror(errno)); close(s); - return 8; + goto failed; } if (listen(s, 5) != 0) { log_Printf(LogERROR, "Tcp: Unable to listen to socket: %s\n", strerror(errno)); close(s); - return 9; + goto failed; } server_Close(bundle); server.fd = s; - server.port = port; + server.cfg.port = port; + *server.cfg.sockname = '\0'; + server.cfg.mask = 0; log_Printf(LogPHASE, "Listening at port %d.\n", port); - return 0; + return SERVER_OK; + +failed: + if (server.fd == -1) { + server.fd = -1; + server.cfg.port = port; + *server.cfg.sockname = '\0'; + server.cfg.mask = 0; + } + return SERVER_FAILED; } int server_Close(struct bundle *bundle) { if (server.fd >= 0) { - if (server.rm) { + if (*server.cfg.sockname != '\0') { struct sockaddr_un un; int sz = sizeof un; if (getsockname(server.fd, (struct sockaddr *)&un, &sz) == 0 && un.sun_family == AF_LOCAL && sz == sizeof un) - ID0unlink(un.sun_path); - server.rm = NULL; + unlink(un.sun_path); } close(server.fd); server.fd = -1; - server.port = 0; /* Drop associated prompts */ log_DestroyPrompts(&server); + return 1; } + return 0; } + +int +server_Clear(struct bundle *bundle) +{ + int ret; + + ret = server_Close(bundle); + + server.fd = -1; + server.cfg.port = 0; + *server.cfg.sockname = '\0'; + server.cfg.mask = 0; + + return ret; +} diff --git a/usr.sbin/ppp/server.h b/usr.sbin/ppp/server.h index 509099d..805c438 100644 --- a/usr.sbin/ppp/server.h +++ b/usr.sbin/ppp/server.h @@ -31,12 +31,22 @@ struct bundle; struct server { struct fdescriptor desc; int fd; - char passwd[50]; - struct sockaddr_un ifsun; /* local socket */ - char *rm; /* Points to local socket path */ + struct { + char passwd[50]; - u_short port; /* tcp socket */ + char sockname[MAXPATHLEN]; /* Points to local socket path */ + mode_t mask; + + u_short port; /* tcp socket */ + } cfg; +}; + +enum server_stat { + SERVER_OK, /* Diagnostic socket available */ + SERVER_INVALID, /* Bad args, can't be set up */ + SERVER_FAILED, /* Failed - lack of resources */ + SERVER_UNSET /* Not already set up */ }; #define descriptor2server(d) \ @@ -44,6 +54,8 @@ struct server { extern struct server server; -extern int server_LocalOpen(struct bundle *, const char *, mode_t); -extern int server_TcpOpen(struct bundle *, int); +extern enum server_stat server_LocalOpen(struct bundle *, const char *, mode_t); +extern enum server_stat server_TcpOpen(struct bundle *, u_short); +extern enum server_stat server_Reopen(struct bundle *); extern int server_Close(struct bundle *); +extern int server_Clear(struct bundle *); |