#include "busybox.h"
//#define CONFIG_FEATURE_INETD_RPC
-//#define CONFIG_FEATURE_INETD_SUPPORT_BILTIN_ECHO
-//#define CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DISCARD
-//#define CONFIG_FEATURE_INETD_SUPPORT_BILTIN_TIME
-//#define CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DAYTIME
-//#define CONFIG_FEATURE_INETD_SUPPORT_BILTIN_CHARGEN
+//#define CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO
+//#define CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD
+//#define CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME
+//#define CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME
+//#define CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN
//#define CONFIG_FEATURE_IPV6
#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
/* Check unsupporting builtin */
-#if defined CONFIG_FEATURE_INETD_SUPPORT_BILTIN_ECHO || \
- defined CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DISCARD || \
- defined CONFIG_FEATURE_INETD_SUPPORT_BILTIN_TIME || \
- defined CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DAYTIME || \
- defined CONFIG_FEATURE_INETD_SUPPORT_BILTIN_CHARGEN
+#if defined CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO || \
+ defined CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD || \
+ defined CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME || \
+ defined CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME || \
+ defined CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN
# define INETD_FEATURE_ENABLED
#endif
-#if defined CONFIG_FEATURE_INETD_SUPPORT_BILTIN_ECHO || \
- defined CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DISCARD || \
- defined CONFIG_FEATURE_INETD_SUPPORT_BILTIN_CHARGEN
+#if defined CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO || \
+ defined CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD || \
+ defined CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN
# define INETD_SETPROCTITLE
#endif
char *se_user; /* user name to run as */
char *se_group; /* group name to run as */
#ifdef INETD_FEATURE_ENABLED
- const struct biltin *se_bi; /* if built-in, description */
+ const struct builtin *se_bi; /* if built-in, description */
#endif
char *se_server; /* server program */
#define MAXARGV 20
static servtab_t *servtab;
#ifdef INETD_FEATURE_ENABLED
-struct biltin
+struct builtin
{
const char *bi_service; /* internally provided service name */
int bi_socktype; /* type of socket supported */
};
/* Echo received data */
-#ifdef CONFIG_FEATURE_INETD_SUPPORT_BILTIN_ECHO
+#ifdef CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO
static void echo_stream (int, servtab_t *);
static void echo_dg (int, servtab_t *);
#endif
/* Internet /dev/null */
-#ifdef CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DISCARD
+#ifdef CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD
static void discard_stream (int, servtab_t *);
static void discard_dg (int, servtab_t *);
#endif
/* Return 32 bit time since 1900 */
-#ifdef CONFIG_FEATURE_INETD_SUPPORT_BILTIN_TIME
+#ifdef CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME
static void machtime_stream (int, servtab_t *);
static void machtime_dg (int, servtab_t *);
#endif
/* Return human-readable time */
-#ifdef CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DAYTIME
+#ifdef CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME
static void daytime_stream (int, servtab_t *);
static void daytime_dg (int, servtab_t *);
#endif
/* Familiar character generator */
-#ifdef CONFIG_FEATURE_INETD_SUPPORT_BILTIN_CHARGEN
+#ifdef CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN
static void chargen_stream (int, servtab_t *);
static void chargen_dg (int, servtab_t *);
#endif
-static const struct biltin biltins[] = {
-#ifdef CONFIG_FEATURE_INETD_SUPPORT_BILTIN_ECHO
+static const struct builtin builtins[] = {
+#ifdef CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO
/* Echo received data */
{"echo", SOCK_STREAM, 1, 0, echo_stream,},
{"echo", SOCK_DGRAM, 0, 0, echo_dg,},
#endif
-#ifdef CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DISCARD
+#ifdef CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD
/* Internet /dev/null */
{"discard", SOCK_STREAM, 1, 0, discard_stream,},
{"discard", SOCK_DGRAM, 0, 0, discard_dg,},
#endif
-#ifdef CONFIG_FEATURE_INETD_SUPPORT_BILTIN_TIME
+#ifdef CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME
/* Return 32 bit time since 1900 */
{"time", SOCK_STREAM, 0, 0, machtime_stream,},
{"time", SOCK_DGRAM, 0, 0, machtime_dg,},
#endif
-#ifdef CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DAYTIME
+#ifdef CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME
/* Return human-readable time */
{"daytime", SOCK_STREAM, 0, 0, daytime_stream,},
{"daytime", SOCK_DGRAM, 0, 0, daytime_dg,},
#endif
-#ifdef CONFIG_FEATURE_INETD_SUPPORT_BILTIN_CHARGEN
+#ifdef CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN
/* Familiar character generator */
{"chargen", SOCK_STREAM, 1, 0, chargen_stream,},
{"chargen", SOCK_DGRAM, 0, 0, chargen_dg,},
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 */
sep->se_server = newstr (skip (&cp));
if (strcmp (sep->se_server, "internal") == 0) {
#ifdef INETD_FEATURE_ENABLED
- const struct biltin *bi;
+ const struct builtin *bi;
- for (bi = biltins; bi->bi_service; bi++)
+ for (bi = builtins; bi->bi_service; bi++)
if (bi->bi_socktype == sep->se_socktype &&
strcmp (bi->bi_service, sep->se_service) == 0)
break;
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;
/* reexec for vfork() do continue parent */
vfork_daemon_rexec (0, 0, argc, argv, "-f");
#else
- daemon (0, 0);
+ daemon (0, 0); /* bb_xdaemon? */
#endif /* uClinux */
} else {
setsid ();
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) {
*/
#define BUFSIZE 4096
-#if defined(CONFIG_FEATURE_INETD_SUPPORT_BILTIN_ECHO) || \
- defined(CONFIG_FEATURE_INETD_SUPPORT_BILTIN_CHARGEN) || \
- defined(CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DAYTIME)
+#if defined(CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO) || \
+ defined(CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN) || \
+ defined(CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME)
static int dg_badinput (struct sockaddr_in *dg_sin)
{
if (ntohs (dg_sin->sin_port) < IPPORT_RESERVED)
}
#endif
-#ifdef CONFIG_FEATURE_INETD_SUPPORT_BILTIN_ECHO
+#ifdef CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO
/* Echo service -- echo data back */
/* ARGSUSED */
static void
/* 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;
return;
(void) sendto (s, buffer, i, 0, &sa, sizeof (sa));
}
-#endif /* CONFIG_FEATURE_INETD_SUPPORT_BILTIN_ECHO */
+#endif /* CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO */
-#ifdef CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DISCARD
+#ifdef CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD
/* Discard service -- ignore data */
/* ARGSUSED */
static void
/* 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];
(void) read (s, buffer, sizeof (buffer));
}
-#endif /* CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DISCARD */
+#endif /* CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD */
-#ifdef CONFIG_FEATURE_INETD_SUPPORT_BILTIN_CHARGEN
+#ifdef CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN
#define LINESIZ 72
static char ring[128];
static char *endring;
/* 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 ();
text[LINESIZ + 1] = '\n';
(void) sendto (s, text, sizeof (text), 0, &sa, sizeof (sa));
}
-#endif /* CONFIG_FEATURE_INETD_SUPPORT_BILTIN_CHARGEN */
+#endif /* CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN */
-#ifdef CONFIG_FEATURE_INETD_SUPPORT_BILTIN_TIME
+#ifdef CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME
/*
* Return a machine readable date and time, in the form of the
* number of seconds since midnight, Jan 1, 1900. Since gettimeofday
/* 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)
result = machtime ();
(void) sendto (s, (char *) &result, sizeof (result), 0, &sa, sizeof (sa));
}
-#endif /* CONFIG_FEATURE_INETD_SUPPORT_BILTIN_TIME */
+#endif /* CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME */
-#ifdef CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DAYTIME
+#ifdef CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_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);
(void) sprintf (buffer, "%.24s\r\n", ctime (&t));
(void) sendto (s, buffer, strlen (buffer), 0, &sa, sizeof (sa));
}
-#endif /* CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DAYTIME */
+#endif /* CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME */
+/* vi: set sw=4 ts=4: */