aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/inetd/inetd.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/inetd/inetd.c')
-rw-r--r--usr.sbin/inetd/inetd.c132
1 files changed, 40 insertions, 92 deletions
diff --git a/usr.sbin/inetd/inetd.c b/usr.sbin/inetd/inetd.c
index 2d6c0ee741f8..6dac72a0fc57 100644
--- a/usr.sbin/inetd/inetd.c
+++ b/usr.sbin/inetd/inetd.c
@@ -39,7 +39,7 @@ char copyright[] =
#ifndef lint
/*static char sccsid[] = "from: @(#)inetd.c 5.30 (Berkeley) 6/3/91";*/
-static char rcsid[] = "$Id: inetd.c,v 1.4 1993/10/18 23:03:20 rgrimes Exp $";
+static char rcsid[] = "$Id: inetd.c,v 1.7 1994/02/05 09:46:42 wollman Exp $";
#endif /* not lint */
/*
@@ -110,7 +110,7 @@ static char rcsid[] = "$Id: inetd.c,v 1.4 1993/10/18 23:03:20 rgrimes Exp $";
#include <rpc/rpc.h>
#include "pathnames.h"
-#define TOOMANY 40 /* don't start more than TOOMANY */
+#define TOOMANY 256 /* don't start more than TOOMANY */
#define CNT_INTVL 60 /* servers in CNT_INTVL sec. */
#define RETRYTIME (60*10) /* retry after bind or server fail */
@@ -155,6 +155,10 @@ int pmap_set(u_long prognum,u_long versnum,int protocol,u_short port);
/* comes from -lutil ?? */
void daemon();
+char * config_open(const char *filename,int contlines);
+void config_close();
+char * config_next();
+char * config_skip(char **p);
/* Prototypes */
void reapchild();
@@ -163,12 +167,8 @@ void unregisterrpc(struct servtab *sep);
void retry();
void setup(struct servtab *sep);
struct servtab * enter(struct servtab *cp);
-int setconfig();
-void endconfig();
struct servtab * getconfigent();
void freeconfig(struct servtab *cp);
-char * skip(char **cpp);
-char * nextline(FILE *fd);
char * newstr(char *cp);
void setproctitle(char *a, int s);
void echo_stream(int s,struct servtab *sep);
@@ -249,7 +249,7 @@ main(int argc, char **argv, char **envp)
break;
case '?':
default:
- fprintf(stderr, "usage: inetd [-d]");
+ fprintf(stderr, "usage: inetd [-dl]");
exit(1);
}
argc -= optind;
@@ -359,6 +359,11 @@ main(int argc, char **argv, char **envp)
timingout = 1;
alarm(RETRYTIME);
}
+ /*
+ * DON'T fork!
+ */
+ sigsetmask(0L);
+ continue;
}
}
pid = fork();
@@ -456,9 +461,11 @@ config()
{
struct servtab *sep, *cp, **sepp;
long omask;
+ char *p;
- if (!setconfig()) {
- syslog(LOG_ERR, "%s: %m", CONFIG);
+ p = config_open(CONFIG,1); /* 1 means allow continuation lines */
+ if(p) {
+ syslog(LOG_ERR, "%s on %s: %m", p, CONFIG);
return;
}
for (sep = servtab; sep; sep = sep->se_next)
@@ -538,7 +545,7 @@ config()
if (sep->se_fd == -1)
setup(sep);
}
- endconfig();
+ config_close();
/*
* Purge anything not looked at above.
*/
@@ -634,7 +641,8 @@ setsockopt(fd, SOL_SOCKET, opt, (char *)&on, sizeof (on))
return;
}
if (sep->se_rpc) {
- int i, len;
+ int i, len = sizeof(struct sockaddr);
+
if (getsockname(sep->se_fd, (struct sockaddr *)&sep->se_ctrladdr,
&len) < 0) {
syslog(LOG_ERR, "%s/%s: getsockname: %m",
@@ -682,30 +690,7 @@ enter(struct servtab *cp)
return (sep);
}
-FILE *fconfig = NULL;
struct servtab serv;
-char line[256];
-
-int
-setconfig()
-{
-
- if (fconfig != NULL) {
- fseek(fconfig, 0L, L_SET);
- return (1);
- }
- fconfig = fopen(CONFIG, "r");
- return (fconfig != NULL);
-}
-
-void
-endconfig()
-{
- if (fconfig) {
- (void) fclose(fconfig);
- fconfig = NULL;
- }
-}
struct servtab *
getconfigent()
@@ -715,16 +700,13 @@ getconfigent()
char *cp, *arg;
char *versp;
-more:
- while ((cp = nextline(fconfig)) && *cp == '#')
- ;
- if (cp == NULL)
- return ((struct servtab *)0);
- arg = skip(&cp);
- if (arg == NULL)
- goto more;
- sep->se_service = newstr(arg);
- arg = skip(&cp);
+ more:
+ cp = config_next();
+ if(!cp)
+ return 0;
+ fprintf(stderr,"<%s>\n",cp);
+ sep->se_service = newstr(config_skip(&cp));
+ arg = config_skip(&cp);
if (strcmp(arg, "stream") == 0)
sep->se_socktype = SOCK_STREAM;
else if (strcmp(arg, "dgram") == 0)
@@ -737,7 +719,7 @@ more:
sep->se_socktype = SOCK_RAW;
else
sep->se_socktype = -1;
- sep->se_proto = newstr(skip(&cp));
+ sep->se_proto = newstr(config_skip(&cp));
sep->se_rpc = 0;
if (strncmp(sep->se_proto, "rpc/", 4) == 0) {
sep->se_proto += 4;
@@ -768,10 +750,18 @@ more:
sep->se_rpc_highvers = 1;
}
}
- arg = skip(&cp);
- sep->se_wait = strcmp(arg, "wait") == 0;
- sep->se_user = newstr(skip(&cp));
- sep->se_server = newstr(skip(&cp));
+ arg = config_skip(&cp);
+ if(!strcmp(arg,"wait"))
+ sep->se_wait = 1;
+ else if(!strcmp(arg,"nowait"))
+ sep->se_wait = 0;
+ else {
+ syslog(LOG_ERR, "should be wait or nowait: %s unknown\n", arg);
+ goto more;
+ }
+
+ sep->se_user = newstr(config_skip(&cp));
+ sep->se_server = newstr(config_skip(&cp));
if (strcmp(sep->se_server, "internal") == 0) {
struct biltin *bi;
@@ -789,7 +779,7 @@ more:
} else
sep->se_bi = NULL;
argc = 0;
- for (arg = skip(&cp); cp; arg = skip(&cp))
+ for (arg = config_skip(&cp); arg; arg = config_skip(&cp))
if (argc < MAXARGV)
sep->se_argv[argc++] = newstr(arg);
while (argc <= MAXARGV)
@@ -816,48 +806,6 @@ freeconfig(struct servtab *cp)
}
char *
-skip(char **cpp)
-{
- char *cp = *cpp;
- char *start;
-
-again:
- while (*cp == ' ' || *cp == '\t')
- cp++;
- if (*cp == '\0') {
- int c;
-
- c = getc(fconfig);
- (void) ungetc(c, fconfig);
- if (c == ' ' || c == '\t')
- if ((cp = nextline(fconfig)))
- goto again;
- *cpp = (char *)0;
- return ((char *)0);
- }
- start = cp;
- while (*cp && *cp != ' ' && *cp != '\t')
- cp++;
- if (*cp != '\0')
- *cp++ = '\0';
- *cpp = cp;
- return (start);
-}
-
-char *
-nextline(FILE *fd)
-{
- char *cp;
-
- if (fgets(line, sizeof (line), fd) == NULL)
- return ((char *)0);
- cp = index(line, '\n');
- if (cp)
- *cp = '\0';
- return (line);
-}
-
-char *
newstr(char *cp)
{
if ((cp = strdup(cp ? cp : "")))