convert to use new select macros (and up to 256 sockets)
SCCS-vsn: usr.sbin/inetd/inetd.c 5.3
#endif not lint
#ifndef lint
#endif not lint
#ifndef lint
-static char sccsid[] = "@(#)inetd.c 5.2 (Berkeley) %G%";
+static char sccsid[] = "@(#)inetd.c 5.3 (Berkeley) %G%";
char *malloc();
int debug = 0;
char *malloc();
int debug = 0;
+int nsock, maxsock;
+fd_set allsock;
int options;
struct servent *sp;
int options;
struct servent *sp;
int argc;
char *argv[];
{
int argc;
char *argv[];
{
register struct servtab *sep;
register struct passwd *pwd;
char *cp, buf[50];
register struct servtab *sep;
register struct passwd *pwd;
char *cp, buf[50];
signal(SIGHUP, config);
signal(SIGCHLD, reapchild);
for (;;) {
signal(SIGHUP, config);
signal(SIGCHLD, reapchild);
for (;;) {
+ int s, ctrl, n;
+ fd_set readable;
sigpause(0);
readable = allsock;
sigpause(0);
readable = allsock;
- if (select(32, &readable, 0, 0, 0) <= 0)
- continue;
- s = ffs(readable)-1;
- if (s < 0)
+ if ((n = select(maxsock + 1, &readable, 0, 0, 0)) <= 0)
+ for (s = 0; s <= maxsock; s++)
+ if (FD_ISSET(s, &readable))
+ break;
for (sep = servtab; sep; sep = sep->se_next)
if (s == sep->se_fd)
goto found;
for (sep = servtab; sep; sep = sep->se_next)
if (s == sep->se_fd)
goto found;
found:
if (debug)
fprintf(stderr, "someone wants %s\n", sep->se_service);
found:
if (debug)
fprintf(stderr, "someone wants %s\n", sep->se_service);
- if (sep->se_socktype == SOCK_STREAM) {
+ if (!sep->se_wait && sep->se_socktype == SOCK_STREAM) {
ctrl = accept(s, 0, 0);
if (debug)
fprintf(stderr, "accept, ctrl %d\n", ctrl);
ctrl = accept(s, 0, 0);
if (debug)
fprintf(stderr, "accept, ctrl %d\n", ctrl);
}
} else
ctrl = sep->se_fd;
}
} else
ctrl = sep->se_fd;
-#define mask(sig) (1 << (sig - 1))
- sigblock(mask(SIGCHLD)|mask(SIGHUP));
+ sigblock(sigmask(SIGCHLD)|sigmask(SIGHUP));
pid = fork();
if (pid < 0) {
pid = fork();
if (pid < 0) {
- if (sep->se_socktype == SOCK_STREAM)
+ if (!sep->se_wait && sep->se_socktype == SOCK_STREAM)
close(ctrl);
sleep(1);
continue;
}
if (sep->se_wait) {
sep->se_wait = pid;
close(ctrl);
sleep(1);
continue;
}
if (sep->se_wait) {
sep->se_wait = pid;
+ FD_CLR(s, &allsock);
+ nsock--;
}
sigsetmask(0);
if (pid == 0) {
}
sigsetmask(0);
if (pid == 0) {
- dup2(ctrl, 0), close(ctrl), dup2(0, 1);
+ dup2(ctrl, 0); close(ctrl); dup2(0, 1); dup2(0, 2);
for (i = getdtablesize(); --i > 2; )
close(i);
if ((pwd = getpwnam(sep->se_user)) == NULL) {
for (i = getdtablesize(); --i > 2; )
close(i);
if ((pwd = getpwnam(sep->se_user)) == NULL) {
syslog(LOG_ERR, "execv %s: %m", sep->se_server);
_exit(1);
}
syslog(LOG_ERR, "execv %s: %m", sep->se_server);
_exit(1);
}
- if (sep->se_socktype == SOCK_STREAM)
+ if (!sep->se_wait && sep->se_socktype == SOCK_STREAM)
if (debug)
fprintf(stderr, "restored %s, fd %d\n",
sep->se_service, sep->se_fd);
if (debug)
fprintf(stderr, "restored %s, fd %d\n",
sep->se_service, sep->se_fd);
- allsock |= 1 << sep->se_fd;
+ FD_SET(sep->se_fd, &allsock);
+ nsock++;
- omask = sigblock(mask(SIGCHLD));
+ omask = sigblock(sigmask(SIGCHLD));
sep->se_wait = cp->se_wait;
#define SWAP(a, b) { char *c = a; a = b; b = c; }
if (cp->se_server)
sep->se_wait = cp->se_wait;
#define SWAP(a, b) { char *c = a; a = b; b = c; }
if (cp->se_server)
}
if (sep->se_socktype == SOCK_STREAM)
listen(sep->se_fd, 10);
}
if (sep->se_socktype == SOCK_STREAM)
listen(sep->se_fd, 10);
- allsock |= 1 << sep->se_fd;
+ FD_SET(sep->se_fd, &allsock);
+ nsock++;
+ if (sep->se_fd > maxsock)
+ maxsock = sep->se_fd;
}
endconfig();
/*
* Purge anything not looked at above.
*/
}
endconfig();
/*
* Purge anything not looked at above.
*/
- omask = sigblock(mask(SIGCHLD));
+ omask = sigblock(sigmask(SIGCHLD));
sepp = &servtab;
while (sep = *sepp) {
if (sep->se_checked) {
sepp = &servtab;
while (sep = *sepp) {
if (sep->se_checked) {
}
*sepp = sep->se_next;
if (sep->se_fd != -1) {
}
*sepp = sep->se_next;
if (sep->se_fd != -1) {
- allsock &= ~(1 << sep->se_fd);
+ FD_CLR(sep->se_fd, &allsock);
+ nsock--;
(void) close(sep->se_fd);
}
freeconfig(sep);
(void) close(sep->se_fd);
}
freeconfig(sep);
struct servtab *cp;
{
register struct servtab *sep;
struct servtab *cp;
{
register struct servtab *sep;
char *strdup();
sep = (struct servtab *)malloc(sizeof (*sep));
char *strdup();
sep = (struct servtab *)malloc(sizeof (*sep));
}
*sep = *cp;
sep->se_fd = -1;
}
*sep = *cp;
sep->se_fd = -1;
- omask = sigblock(mask(SIGCHLD));
+ omask = sigblock(sigmask(SIGCHLD));
sep->se_next = servtab;
servtab = sep;
sigsetmask(omask);
sep->se_next = servtab;
servtab = sep;
sigsetmask(omask);