#ifdef CONFIG_FEATURE_INETD_RPC
#include <rpc/rpc.h>
#include <rpc/pmap_clnt.h>
-#include <rpcsvc/nfs_prot.h>
#endif
#define _PATH_INETDCONF "/etc/inetd.conf"
#define CNT_INTVL 60 /* servers in CNT_INTVL sec. */
#define RETRYTIME (60*10) /* retry after bind or server fail */
-#define SIGBLOCK (sigmask(SIGCHLD)|sigmask(SIGHUP)|sigmask(SIGALRM))
-
#ifndef RLIMIT_NOFILE
#define RLIMIT_NOFILE RLIMIT_OFILE
#endif
int n;
struct sockaddr_in ir_sin;
struct protoent *pp;
+ socklen_t size;
if ((pp = getprotobyname (sep->se_proto + 4)) == NULL) {
syslog (LOG_ERR, "%s: getproto: %m", sep->se_proto);
return;
}
- n = sizeof ir_sin;
- if (getsockname (sep->se_fd, (struct sockaddr *) &ir_sin, &n) < 0) {
+ size = sizeof ir_sin;
+ if (getsockname (sep->se_fd, (struct sockaddr *) &ir_sin, &size) < 0) {
syslog (LOG_ERR, "%s/%s: getsockname: %m",
sep->se_service, sep->se_proto);
return;
free (cp->se_group);
free (cp->se_server);
for (i = 0; i < MAXARGV; i++)
- if (cp->se_argv[i])
- free (cp->se_argv[i]);
+ free (cp->se_argv[i]);
}
static int bump_nofile (void)
else {
r = bind (sep->se_fd, &sep->se_ctrladdr, sep->se_ctrladdr_size);
if (r == 0) {
- int len = sep->se_ctrladdr_size;
+ socklen_t len = sep->se_ctrladdr_size;
int saveerrno = errno;
/* update se_ctrladdr_in.sin_port */
return (sep);
}
+#define Block_Using_Signals(m) do { sigemptyset(&m); \
+ sigaddset(&m, SIGCHLD); \
+ sigaddset(&m, SIGHUP); \
+ sigaddset(&m, SIGALRM); \
+ sigprocmask(SIG_BLOCK, &m, NULL); \
+ } while(0)
+
+
static servtab_t *enter (servtab_t *cp)
{
servtab_t *sep;
- int omask;
+ sigset_t omask;
sep = new_servtab();
*sep = *cp;
#ifdef CONFIG_FEATURE_INETD_RPC
sep->se_rpcprog = -1;
#endif
- omask = sigblock (SIGBLOCK);
+ Block_Using_Signals(omask);
sep->se_next = servtab;
servtab = sep;
- sigsetmask (omask);
+ sigprocmask(SIG_UNBLOCK, &omask, NULL);
return (sep);
}
return (1);
}
-static void config (int sig __attribute__((unused)))
+static void config (int sig ATTRIBUTE_UNUSED)
{
servtab_t *sep, *cp, **sepp;
- int omask;
+ sigset_t omask;
int add;
size_t n;
char protoname[10];
#define SWAP(type, a, b) do {type c=(type)a; a=(type)b; b=(type)c;} while (0)
- omask = sigblock (SIGBLOCK);
+ Block_Using_Signals(omask);
/*
* sep->se_wait may be holding the pid of a daemon
* that we're waiting for. If so, don't overwrite
sep->se_rpcversl = cp->se_rpcversl;
sep->se_rpcversh = cp->se_rpcversh;
#endif
- sigsetmask (omask);
+ sigprocmask(SIG_UNBLOCK, &omask, NULL);
freeconfig (cp);
add = 1;
} else {
/*
* Purge anything not looked at above.
*/
- omask = sigblock (SIGBLOCK);
+ Block_Using_Signals(omask);
sepp = &servtab;
while ((sep = *sepp)) {
if (sep->se_checked) {
freeconfig (sep);
free (sep);
}
- (void) sigsetmask (omask);
+ sigprocmask(SIG_UNBLOCK, &omask, NULL);
}
-static void reapchild (int sig __attribute__((unused)))
+static void reapchild (int sig ATTRIBUTE_UNUSED)
{
pid_t pid;
int save_errno = errno, status;
errno = save_errno;
}
-static void retry (int sig __attribute__((unused)))
+static void retry (int sig ATTRIBUTE_UNUSED)
{
servtab_t *sep;
}
}
-static void goaway (int sig __attribute__((unused)))
+static void goaway (int sig ATTRIBUTE_UNUSED)
{
servtab_t *sep;
static void
inetd_setproctitle (char *a, int s)
{
- int size;
+ socklen_t size;
char *cp;
struct sockaddr_in prt_sin;
char buf[80];
pid_t pid;
char buf[50];
char *stoomany;
+ sigset_t omask, wait_mask;
#ifdef INETD_SETPROCTITLE
extern char **environ;
sigaction (SIGINT, &sa, NULL);
sa.sa_handler = SIG_IGN;
sigaction (SIGPIPE, &sa, &sapipe);
-
+ memset(&wait_mask, 0, sizeof(wait_mask));
{
/* space for daemons to overwrite environment for ps */
#define DUMMYSIZE 100
fd_set readable;
if (nsock == 0) {
- (void) sigblock (SIGBLOCK);
+ Block_Using_Signals(omask);
while (nsock == 0)
- sigpause (0L);
- (void) sigsetmask (0L);
+ sigsuspend (&wait_mask);
+ sigprocmask(SIG_UNBLOCK, &omask, NULL);
}
readable = allsock;
}
if (sep->se_family == AF_INET && sep->se_socktype == SOCK_STREAM) {
struct sockaddr_in peer;
- int plen = sizeof (peer);
+ socklen_t plen = sizeof (peer);
if (getpeername (ctrl, (struct sockaddr *) &peer, &plen) < 0) {
syslog (LOG_WARNING, "could not getpeername");
}
} else
ctrl = sep->se_fd;
- (void) sigblock (SIGBLOCK);
+ Block_Using_Signals(omask);
pid = 0;
#ifdef INETD_FEATURE_ENABLED
if (sep->se_bi == 0 || sep->se_bi->bi_fork)
sep->se_fd = -1;
sep->se_count = 0;
nsock--;
- sigsetmask (0L);
+ sigprocmask(SIG_UNBLOCK, &omask, NULL);
if (!timingout) {
timingout = 1;
alarm (RETRYTIME);
syslog (LOG_ERR, "fork: %m");
if (!sep->se_wait && sep->se_socktype == SOCK_STREAM)
close (ctrl);
- sigsetmask (0L);
+ sigprocmask(SIG_UNBLOCK, &omask, NULL);
sleep (1);
continue;
}
FD_CLR (sep->se_fd, &allsock);
nsock--;
}
- sigsetmask (0L);
+ sigprocmask(SIG_UNBLOCK, &omask, NULL);
if (pid == 0) {
#ifdef INETD_FEATURE_ENABLED
if (sep->se_bi) {
/* Echo service -- echo data back */
/* ARGSUSED */
static void
-echo_dg (int s, servtab_t *sep __attribute__((unused)))
+echo_dg (int s, servtab_t *sep ATTRIBUTE_UNUSED)
{
char buffer[BUFSIZE];
- int i, size;
+ int i;
+ socklen_t size;
/* struct sockaddr_storage ss; */
struct sockaddr sa;
/* Discard service -- ignore data */
/* ARGSUSED */
static void
-discard_dg (int s, servtab_t *sep __attribute__((unused)))
+discard_dg (int s, servtab_t *sep ATTRIBUTE_UNUSED)
{
char buffer[BUFSIZE];
/* Character generator */
/* ARGSUSED */
static void
-chargen_dg (int s, servtab_t *sep __attribute__((unused)))
+chargen_dg (int s, servtab_t *sep ATTRIBUTE_UNUSED)
{
/* struct sockaddr_storage ss; */
struct sockaddr sa;
static char *rs;
- int len, size;
+ int len;
char text[LINESIZ + 2];
+ socklen_t size;
if (endring == 0) {
initring ();
/* ARGSUSED */
static void
-machtime_stream (int s, servtab_t *sep __attribute__((unused)))
+machtime_stream (int s, servtab_t *sep ATTRIBUTE_UNUSED)
{
u_int result;
/* ARGSUSED */
static void
-machtime_dg (int s, servtab_t *sep __attribute__((unused)))
+machtime_dg (int s, servtab_t *sep ATTRIBUTE_UNUSED)
{
u_int result;
/* struct sockaddr_storage ss; */
struct sockaddr sa;
struct sockaddr_in *dg_sin;
- int size;
+ socklen_t size;
size = sizeof (sa);
if (recvfrom (s, (char *) &result, sizeof (result), 0, &sa, &size) < 0)
#ifdef CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DAYTIME
/* Return human-readable time of day */
/* ARGSUSED */
-static void daytime_stream (int s, servtab_t *sep __attribute__((unused)))
+static void daytime_stream (int s, servtab_t *sep ATTRIBUTE_UNUSED)
{
char buffer[256];
time_t t;
/* Return human-readable time of day */
/* ARGSUSED */
void
-daytime_dg (int s, servtab_t *sep __attribute__((unused)))
+daytime_dg (int s, servtab_t *sep ATTRIBUTE_UNUSED)
{
char buffer[256];
time_t t;
/* struct sockaddr_storage ss; */
struct sockaddr sa;
- int size;
+ socklen_t size;
t = time ((time_t *) 0);