Formatting

This commit is contained in:
Glenn L McGrath 2004-02-18 13:12:53 +00:00
parent aac2a19e50
commit 82d42dbb57

View File

@ -830,160 +830,164 @@ extern int inetd_main(int argc, char *argv[])
}
for (;;) {
int n, ctrl;
fd_set readable;
fd_set readable;
int ctrl;
int n;
if (nsock == 0) {
sigprocmask(SIG_BLOCK, &blockmask, NULL);
while (nsock == 0)
sigsuspend(&emptymask);
sigprocmask(SIG_SETMASK, &emptymask, NULL);
}
readable = allsock;
if ((n = select(maxsock + 1, &readable, (fd_set *)0,
(fd_set *)0, (struct timeval *)0)) <= 0) {
if (n < 0 && errno != EINTR)
syslog(LOG_WARNING, "select: %m");
sleep(1);
continue;
}
for (sep = servtab; n && sep; sep = sep->se_next)
if (sep->se_fd != -1 && FD_ISSET(sep->se_fd, &readable)) {
n--;
if (!sep->se_wait && sep->se_socktype == SOCK_STREAM) {
/* Fixed AGC */
fcntl(sep->se_fd, F_SETFL, O_NDELAY);
/* --------- */
ctrl = accept(sep->se_fd, NULL, NULL);
fcntl(sep->se_fd, F_SETFL, 0);
if (ctrl < 0) {
if (errno == EINTR || errno == EWOULDBLOCK)
continue;
syslog(LOG_WARNING, "accept (for %s): %m",
sep->se_service);
continue;
if (nsock == 0) {
sigprocmask(SIG_BLOCK, &blockmask, NULL);
while (nsock == 0) {
sigsuspend(&emptymask);
}
} else
ctrl = sep->se_fd;
sigprocmask(SIG_BLOCK, &blockmask, NULL);
pid = 0;
#ifdef INETD_FEATURE_ENABLED
if (sep->se_bi == 0 || sep->se_bi->bi_fork)
#endif
{
if (sep->se_count++ == 0)
(void)gettimeofday(&sep->se_time, (struct timezone *)0);
else if (sep->se_count >= sep->se_max) {
struct timeval now;
(void)gettimeofday(&now, (struct timezone *)0);
if (now.tv_sec - sep->se_time.tv_sec >
CNT_INTVL) {
sep->se_time = now;
sep->se_count = 1;
} else {
syslog(LOG_ERR,
"%s/%s server failing (looping), service terminated",
sep->se_service, sep->se_proto);
FD_CLR(sep->se_fd, &allsock);
(void) close(sep->se_fd);
sep->se_fd = -1;
sep->se_count = 0;
nsock--;
sigprocmask(SIG_SETMASK, &emptymask,
NULL);
if (!timingout) {
timingout = 1;
alarm(RETRYTIME);
sigprocmask(SIG_SETMASK, &emptymask, NULL);
}
readable = allsock;
n = select(maxsock + 1, &readable, (fd_set *)0, (fd_set *)0, (struct timeval *)0);
if (n <= 0) {
if (n < 0 && errno != EINTR) {
syslog(LOG_WARNING, "select: %m");
}
sleep(1);
continue;
}
for (sep = servtab; n && sep; sep = sep->se_next) {
if (sep->se_fd != -1 && FD_ISSET(sep->se_fd, &readable)) {
n--;
if (!sep->se_wait && sep->se_socktype == SOCK_STREAM) {
/* Fixed AGC */
fcntl(sep->se_fd, F_SETFL, O_NDELAY);
/* --------- */
ctrl = accept(sep->se_fd, NULL, NULL);
fcntl(sep->se_fd, F_SETFL, 0);
if (ctrl < 0) {
if (errno == EINTR || errno == EWOULDBLOCK) {
continue;
}
syslog(LOG_WARNING, "accept (for %s): %m",
sep->se_service);
continue;
}
continue;
} else {
ctrl = sep->se_fd;
}
}
pid = fork();
if (pid < 0) {
syslog(LOG_ERR, "fork: %m");
if (sep->se_socktype == SOCK_STREAM)
close(ctrl);
sigprocmask(SIG_SETMASK, &emptymask, NULL);
sleep(1);
continue;
}
if (pid && sep->se_wait) {
sep->se_wait = pid;
FD_CLR(sep->se_fd, &allsock);
nsock--;
}
}
sigprocmask(SIG_SETMASK, &emptymask, NULL);
if (pid == 0) {
sigprocmask(SIG_BLOCK, &blockmask, NULL);
pid = 0;
#ifdef INETD_FEATURE_ENABLED
if (sep->se_bi)
(*sep->se_bi->bi_fn)(ctrl, sep);
else
if (sep->se_bi == 0 || sep->se_bi->bi_fork)
#endif
{
struct passwd *pwd = getpwnam(sep->se_user);
if (pwd == NULL) {
syslog_err_and_discard_dg(
sep->se_socktype,
"getpwnam: %s: No such user",
sep->se_user);
{
if (sep->se_count++ == 0) {
gettimeofday(&sep->se_time, (struct timezone *)0);
}
else if (sep->se_count >= sep->se_max) {
struct timeval now;
gettimeofday(&now, (struct timezone *)0);
if (now.tv_sec - sep->se_time.tv_sec > CNT_INTVL) {
sep->se_time = now;
sep->se_count = 1;
} else {
syslog(LOG_ERR,
"%s/%s server failing (looping), service terminated",
sep->se_service, sep->se_proto);
FD_CLR(sep->se_fd, &allsock);
close(sep->se_fd);
sep->se_fd = -1;
sep->se_count = 0;
nsock--;
sigprocmask(SIG_SETMASK, &emptymask, NULL);
if (!timingout) {
timingout = 1;
alarm(RETRYTIME);
}
continue;
}
}
pid = fork();
if (pid < 0) {
syslog(LOG_ERR, "fork: %m");
if (sep->se_socktype == SOCK_STREAM) {
close(ctrl);
}
sigprocmask(SIG_SETMASK, &emptymask, NULL);
sleep(1);
continue;
}
if (pid && sep->se_wait) {
sep->se_wait = pid;
FD_CLR(sep->se_fd, &allsock);
nsock--;
}
}
if (sep->se_group &&
(grp = getgrnam(sep->se_group)) == NULL) {
syslog_err_and_discard_dg(
sep->se_socktype,
"getgrnam: %s: No such group",
sep->se_group);
}
/*
* Ok. There are four cases here:
* 1. nonroot user, no group specified
* 2. nonroot user, some group specified
* 3. root user, no group specified
* 4. root user, some group specified
* In cases 2 and 4 we setgid to the specified
* group. In cases 1 and 2 we run initgroups
* to run with the groups of the given user.
* In case 4 we do setgroups to run with the
* given group. In case 3 we do nothing.
*/
if (pwd->pw_uid) {
if (sep->se_group)
pwd->pw_gid = grp->gr_gid;
setgid((gid_t)pwd->pw_gid);
initgroups(pwd->pw_name, pwd->pw_gid);
setuid((uid_t)pwd->pw_uid);
} else if (sep->se_group) {
setgid((gid_t)grp->gr_gid);
setgroups(1, &grp->gr_gid);
}
dup2(ctrl, 0);
close(ctrl);
dup2(0, 1);
dup2(0, 2);
sigprocmask(SIG_SETMASK, &emptymask, NULL);
if (pid == 0) {
#ifdef INETD_FEATURE_ENABLED
if (sep->se_bi) {
(*sep->se_bi->bi_fn)(ctrl, sep);
} else
#endif
{
struct passwd *pwd = getpwnam(sep->se_user);
if (pwd == NULL) {
syslog_err_and_discard_dg(
sep->se_socktype,
"getpwnam: %s: No such user",
sep->se_user);
}
if (sep->se_group && (grp = getgrnam(sep->se_group)) == NULL) {
syslog_err_and_discard_dg(sep->se_socktype,
"getgrnam: %s: No such group", sep->se_group);
}
/*
* Ok. There are four cases here:
* 1. nonroot user, no group specified
* 2. nonroot user, some group specified
* 3. root user, no group specified
* 4. root user, some group specified
* In cases 2 and 4 we setgid to the specified
* group. In cases 1 and 2 we run initgroups
* to run with the groups of the given user.
* In case 4 we do setgroups to run with the
* given group. In case 3 we do nothing.
*/
if (pwd->pw_uid) {
if (sep->se_group) {
pwd->pw_gid = grp->gr_gid;
}
setgid((gid_t)pwd->pw_gid);
initgroups(pwd->pw_name, pwd->pw_gid);
setuid((uid_t)pwd->pw_uid);
} else if (sep->se_group) {
setgid((gid_t)grp->gr_gid);
setgroups(1, &grp->gr_gid);
}
dup2(ctrl, 0);
close(ctrl);
dup2(0, 1);
dup2(0, 2);
#ifdef RLIMIT_NOFILE
if (rlim_ofile.rlim_cur != rlim_ofile_cur) {
if (setrlimit(RLIMIT_NOFILE,
&rlim_ofile) < 0)
syslog(LOG_ERR,"setrlimit: %m");
}
if (rlim_ofile.rlim_cur != rlim_ofile_cur) {
if (setrlimit(RLIMIT_NOFILE, &rlim_ofile) < 0) {
syslog(LOG_ERR,"setrlimit: %m");
}
}
#endif
for (ctrl = rlim_ofile_cur-1; --ctrl > 2; )
(void)close(ctrl);
for (ctrl = rlim_ofile_cur-1; --ctrl > 2; ) {
(void)close(ctrl);
}
memset(&sa, 0, sizeof(sa));
sa.sa_handler = SIG_DFL;
sigaction(SIGPIPE, &sa, NULL);
memset(&sa, 0, sizeof(sa));
sa.sa_handler = SIG_DFL;
sigaction(SIGPIPE, &sa, NULL);
execv(sep->se_server, sep->se_argv);
syslog_err_and_discard_dg(sep->se_socktype,
"execv %s: %m", sep->se_server);
execv(sep->se_server, sep->se_argv);
syslog_err_and_discard_dg(sep->se_socktype, "execv %s: %m", sep->se_server);
}
}
if (!sep->se_wait && sep->se_socktype == SOCK_STREAM) {
close(ctrl);
}
}
}
if (!sep->se_wait && sep->se_socktype == SOCK_STREAM)
close(ctrl);
}
}
}