summaryrefslogtreecommitdiff
path: root/source/n/inetd
diff options
context:
space:
mode:
Diffstat (limited to 'source/n/inetd')
-rw-r--r--source/n/inetd/inetd-OpenBSD-1.79.diff890
-rwxr-xr-xsource/n/inetd/inetd.SlackBuild68
-rw-r--r--source/n/inetd/inetd.loopingdos.diff54
-rw-r--r--source/n/inetd/slack-desc19
4 files changed, 1031 insertions, 0 deletions
diff --git a/source/n/inetd/inetd-OpenBSD-1.79.diff b/source/n/inetd/inetd-OpenBSD-1.79.diff
new file mode 100644
index 00000000..e1550beb
--- /dev/null
+++ b/source/n/inetd/inetd-OpenBSD-1.79.diff
@@ -0,0 +1,890 @@
+--- ./inetd.c.orig Tue Jan 30 20:00:10 2001
++++ ./inetd.c Tue Feb 6 17:17:14 2001
+@@ -1,3 +1,4 @@
++/* $Slackware: inetd.c 1.79s 2001/02/06 13:18:00 volkerdi Exp $ */
+ /* $OpenBSD: inetd.c,v 1.79 2001/01/30 08:30:57 deraadt Exp $ */
+ /* $NetBSD: inetd.c,v 1.11 1996/02/22 11:14:41 mycroft Exp $ */
+ /*
+@@ -40,8 +41,9 @@
+ #endif /* not lint */
+
+ #ifndef lint
+-/*static char sccsid[] = "from: @(#)inetd.c 5.30 (Berkeley) 6/3/91";*/
++static char sccsid[] = "from: @(#)inetd.c 5.30 (Berkeley) 6/3/91";
+ static char rcsid[] = "$OpenBSD: inetd.c,v 1.79 2001/01/30 08:30:57 deraadt Exp $";
++static char xtraid[] = "$Slackware: inetd.c 1.79s 2001/02/06 13:18:00 volkerdi Exp $";
+ #endif /* not lint */
+
+ /*
+@@ -163,7 +165,7 @@
+ #include <stdlib.h>
+ #include <unistd.h>
+ #include <string.h>
+-#include <login_cap.h>
++/* #include <login_cap.h> */
+ #include <rpc/rpc.h>
+ #include <rpc/pmap_clnt.h>
+ #include <rpcsvc/nfs_prot.h>
+@@ -176,17 +178,20 @@
+ #define SIGBLOCK (sigmask(SIGCHLD)|sigmask(SIGHUP)|sigmask(SIGALRM))
+
+ void config __P((int));
+-void doconfig __P((void));
+-void reap __P((int));
+-void doreap __P((void));
++/* void doconfig __P((void)); */
++/* void reap __P((int)); */
++/* void doreap __P((void)); */
++void reapchild __P ((int));
+ void retry __P((int));
+-void doretry __P((void));
++/* void doretry __P((void)); */
+ void goaway __P((int));
+
+-int debug = 0;
++static int debug = 0;
++static int global_queuelen = 128;
+ int nsock, maxsock;
+-fd_set *allsockp;
+-int allsockn;
++/* fd_set *allsockp; */
++fd_set allsock;
++/* int allsockn; */
+ int toomany = TOOMANY;
+ int options;
+ int timingout;
+@@ -230,13 +235,13 @@
+ struct sockaddr_in se_un_ctrladdr_in;
+ struct sockaddr_in6 se_un_ctrladdr_in6;
+ struct sockaddr_un se_un_ctrladdr_un;
+- struct sockaddr_storage se_un_ctrladdr_storage;
++ /* struct sockaddr_storage se_un_ctrladdr_storage; */
+ } se_un; /* bound address */
+ #define se_ctrladdr se_un.se_un_ctrladdr
+ #define se_ctrladdr_in se_un.se_un_ctrladdr_in
+ #define se_ctrladdr_in6 se_un.se_un_ctrladdr_in6
+ #define se_ctrladdr_un se_un.se_un_ctrladdr_un
+-#define se_ctrladdr_storage se_un.se_un_ctrladdr_storage
++/* #define se_ctrladdr_storage se_un.se_un_ctrladdr_storage */
+ int se_ctrladdr_size;
+ int se_max; /* max # of instances of this service */
+ int se_count; /* number started since se_time */
+@@ -282,12 +287,12 @@
+ { "chargen", SOCK_STREAM, 1, 0, chargen_stream },
+ { "chargen", SOCK_DGRAM, 0, 0, chargen_dg },
+
+- { 0 }
++ { NULL, 0, 0, 0, NULL }
+ };
+
+-sig_atomic_t wantretry;
+-sig_atomic_t wantconfig;
+-sig_atomic_t wantreap;
++/* sig_atomic_t wantretry; */
++/* sig_atomic_t wantconfig; */
++/* sig_atomic_t wantreap; */
+
+ #define NUMINT (sizeof(intab) / sizeof(struct inent))
+ char *CONFIG = _PATH_INETDCONF;
+@@ -297,6 +302,8 @@
+
+ void logpid __P((void));
+
++/* This function is unused in the Linux port */
++#ifdef OpenBSD
+ void
+ fd_grow(fd_set **fdsp, int *bytes, int fd)
+ {
+@@ -316,24 +323,26 @@
+ *bytes = newbytes;
+ }
+ }
++#endif
+
+ int
+ main(argc, argv, envp)
+ int argc;
+ char *argv[], *envp[];
+ {
+- extern char *optarg;
+- extern int optind;
++ /* extern char *optarg; */
++ /* extern int optind; */
+ register struct servtab *sep;
+ register struct passwd *pwd;
+ register struct group *grp = NULL;
+ register int tmpint;
+ struct sigaction sa, sapipe;
+ int ch, dofork;
++ int nodaemon = 0;
+ pid_t pid;
+ char buf[50];
+- fd_set *readablep = NULL;
+- int readablen = 0;
++ /* fd_set *readablep = NULL; */
++ /* int readablen = 0; */
+
+ Argv = argv;
+ if (envp == 0 || *envp == 0)
+@@ -356,7 +365,7 @@
+ int val;
+
+ val = strtoul(optarg, &p, 0);
+- if (val >= 1 && *p == NULL) {
++ if (val >= 1 && *p == (char) NULL) {
+ toomany = val;
+ break;
+ }
+@@ -385,10 +394,13 @@
+ exit(1);
+ }
+
+- if (debug == 0) {
+- daemon(0, 0);
+- if (uid == 0)
+- (void) setlogin("");
++ if (nodaemon == 0)
++ daemon (0, 0);
++ else if (debug == 0) {
++ /* daemon(0, 0); */
++ /* if (uid == 0) */
++ /* (void) setlogin(""); */
++ setsid ();
+ }
+
+ if (uid == 0) {
+@@ -418,10 +430,12 @@
+ sigaddset(&sa.sa_mask, SIGHUP);
+ sa.sa_handler = retry;
+ sigaction(SIGALRM, &sa, NULL);
+- doconfig();
++ /* doconfig(); */
++ config (SIGHUP);
+ sa.sa_handler = config;
+ sigaction(SIGHUP, &sa, NULL);
+- sa.sa_handler = reap;
++ /* sa.sa_handler = reap; */
++ sa.sa_handler = reapchild;
+ sigaction(SIGCHLD, &sa, NULL);
+ sa.sa_handler = goaway;
+ sigaction(SIGTERM, &sa, NULL);
+@@ -443,6 +457,7 @@
+
+ for (;;) {
+ int n, ctrl = -1;
++ fd_set readable;
+
+ if (nsock == 0) {
+ (void) sigblock(SIGBLOCK);
+@@ -451,6 +466,8 @@
+ (void) sigsetmask(0L);
+ }
+
++ /* Well, this all looks like cruft to me ;^) */
++#ifdef OpenBSD
+ if (readablen != allsockn) {
+ if (readablep)
+ free(readablep);
+@@ -478,8 +495,10 @@
+ wantreap = 0;
+ continue;
+ }
++#endif
+
+- if ((n = select(maxsock + 1, readablep, NULL, NULL, NULL)) <= 0) {
++ readable = allsock;
++ if ((n = select(maxsock + 1, &readable, NULL, NULL, NULL)) <= 0) {
+ if (n < 0 && errno != EINTR) {
+ syslog(LOG_WARNING, "select: %m");
+ sleep(1);
+@@ -487,7 +506,7 @@
+ continue;
+ }
+ for (sep = servtab; n && sep; sep = sep->se_next)
+- if (sep->se_fd != -1 && FD_ISSET(sep->se_fd, readablep)) {
++ if (sep->se_fd != -1 && FD_ISSET(sep->se_fd, &readable)) {
+ n--;
+ if (debug)
+ fprintf(stderr, "someone wants %s\n", sep->se_service);
+@@ -556,7 +575,7 @@
+ if (!sep->se_wait &&
+ sep->se_socktype == SOCK_STREAM)
+ close(ctrl);
+- FD_CLR(sep->se_fd, allsockp);
++ FD_CLR(sep->se_fd, &allsock);
+ (void) close(sep->se_fd);
+ sep->se_fd = -1;
+ sep->se_count = 0;
+@@ -581,7 +600,7 @@
+ }
+ if (pid && sep->se_wait) {
+ sep->se_wait = pid;
+- FD_CLR(sep->se_fd, allsockp);
++ FD_CLR(sep->se_fd, &allsock);
+ nsock--;
+ }
+ sigsetmask(0L);
+@@ -595,7 +614,7 @@
+ sep->se_user);
+ if (sep->se_socktype != SOCK_STREAM)
+ recv(0, buf, sizeof (buf), 0);
+- exit(1);
++ _exit(1);
+ }
+ if (setsid() <0)
+ syslog(LOG_ERR, "%s: setsid: %m",
+@@ -607,27 +626,33 @@
+ sep->se_group);
+ if (sep->se_socktype != SOCK_STREAM)
+ recv(0, buf, sizeof (buf), 0);
+- exit(1);
++ _exit(1);
+ }
+ if (uid != 0) {
+ /* a user running private inetd */
+ if (uid != pwd->pw_uid)
+- exit(1);
+- } else {
+- tmpint = LOGIN_SETALL &
+- ~(LOGIN_SETGROUP|LOGIN_SETLOGIN);
+- if (pwd->pw_uid)
+- tmpint |= LOGIN_SETGROUP|LOGIN_SETLOGIN;
++ _exit(1);
++ } else if (pwd->pw_uid) {
++ /* tmpint = LOGIN_SETALL & */
++ /* ~(LOGIN_SETGROUP|LOGIN_SETLOGIN); */
++ /* if (pwd->pw_uid) */
++ /* tmpint |= LOGIN_SETGROUP|LOGIN_SETLOGIN; */
+ if (sep->se_group) {
+ pwd->pw_gid = grp->gr_gid;
+- tmpint |= LOGIN_SETGROUP;
++ /* tmpint |= LOGIN_SETGROUP; */
+ }
+- if (setusercontext(0, pwd, pwd->pw_uid,
+- tmpint) < 0)
+- syslog(LOG_ERR,
+- "%s/%s: setusercontext: %m",
+- sep->se_service,
+- sep->se_proto);
++ setgid ((gid_t) pwd->pw_gid);
++ initgroups (pwd->pw_name, pwd->pw_gid);
++ setuid ((uid_t) pwd->pw_uid);
++ /* if (setusercontext(0, pwd, pwd->pw_uid, */
++ /* tmpint) < 0) */
++ /* syslog(LOG_ERR, */
++ /* "%s/%s: setusercontext: %m", */
++ /* sep->se_service, */
++ /* sep->se_proto); */
++ } else if (sep->se_group) {
++ setgid (grp->gr_gid);
++ setgroups (1, &grp->gr_gid);
+ }
+ if (debug)
+ fprintf(stderr, "%d execl %s\n",
+@@ -636,6 +661,9 @@
+ close(ctrl);
+ dup2(0, 1);
+ dup2(0, 2);
++ if (rlim_ofile.rlim_cur != rlim_ofile_cur)
++ if (setrlimit (RLIMIT_NOFILE, &rlim_ofile) < 0)
++ syslog (LOG_ERR, "setrlimit: %m");
+ closelog();
+ for (tmpint = rlim_ofile_cur-1; --tmpint > 2; )
+ (void)close(tmpint);
+@@ -644,7 +672,7 @@
+ if (sep->se_socktype != SOCK_STREAM)
+ recv(0, buf, sizeof (buf), 0);
+ syslog(LOG_ERR, "execv %s: %m", sep->se_server);
+- exit(1);
++ _exit(1);
+ }
+ }
+ if (!sep->se_wait && sep->se_socktype == SOCK_STREAM)
+@@ -654,13 +682,14 @@
+ }
+
+ int
+-dg_badinput(sa)
+- struct sockaddr *sa;
++dg_badinput(sin)
++ struct sockaddr_in *sin;
+ {
+ struct in_addr in;
+ #ifdef INET6
+ struct in6_addr *in6;
+ #endif
++#ifdef OpenBSD
+ u_int16_t port;
+ int i;
+
+@@ -703,28 +732,40 @@
+
+ if (port < IPPORT_RESERVED || port == NFS_PORT)
+ goto bad;
++#endif
+
++ if (ntohs (sin->sin_port) < IPPORT_RESERVED)
++ return (1);
++ if (sin->sin_addr.s_addr == htonl (INADDR_BROADCAST))
++ return (1);
++ /* XXX compare against broadcast addresses in SIOCGIFCONF list? */
+ return (0);
+
++#ifdef OpenBSD
+ bad:
+ return (1);
++#endif
+ }
+
++#ifdef OpenBSD
+ void
+ reap(int sig)
+ {
+ wantreap = 1;
+ }
++#endif
+
+ void
+-doreap(void)
++reapchild(int sig)
+ {
+ pid_t pid;
+ int save_errno = errno, status;
+ register struct servtab *sep;
+
++#ifdef OpenBSD
+ if (debug)
+ fprintf(stderr, "reaping asked for\n");
++#endif
+
+ for (;;) {
+ pid = wait3(&status, WNOHANG, NULL);
+@@ -743,8 +784,8 @@
+ "%s: exit signal 0x%x",
+ sep->se_server, WTERMSIG(status));
+ sep->se_wait = 1;
+- fd_grow(&allsockp, &allsockn, sep->se_fd);
+- FD_SET(sep->se_fd, allsockp);
++ /* fd_grow(&allsockp, &allsockn, sep->se_fd); */
++ FD_SET(sep->se_fd, &allsock);
+ nsock++;
+ if (debug)
+ fprintf(stderr, "restored %s, fd %d\n",
+@@ -766,14 +807,16 @@
+ struct servtab *enter __P((struct servtab *));
+ int matchconf __P((struct servtab *, struct servtab *));
+
++#ifdef OpenBSD
+ void
+ config(int sig)
+ {
+ wantconfig = 1;
+ }
++#endif
+
+ void
+-doconfig(void)
++config(int sig)
+ {
+ register struct servtab *sep, *cp, **sepp;
+ int omask;
+@@ -887,7 +930,7 @@
+ if (port != sep->se_ctrladdr_in.sin_port) {
+ sep->se_ctrladdr_in.sin_port = port;
+ if (sep->se_fd != -1) {
+- FD_CLR(sep->se_fd, allsockp);
++ FD_CLR(sep->se_fd, &allsock);
+ nsock--;
+ (void) close(sep->se_fd);
+ }
+@@ -942,7 +985,7 @@
+ if (port != sep->se_ctrladdr_in6.sin6_port) {
+ sep->se_ctrladdr_in6.sin6_port = port;
+ if (sep->se_fd != -1) {
+- FD_CLR(sep->se_fd, allsockp);
++ FD_CLR(sep->se_fd, &allsock);
+ nsock--;
+ (void) close(sep->se_fd);
+ }
+@@ -979,7 +1022,7 @@
+ }
+ *sepp = sep->se_next;
+ if (sep->se_fd != -1) {
+- FD_CLR(sep->se_fd, allsockp);
++ FD_CLR(sep->se_fd, &allsock);
+ nsock--;
+ (void) close(sep->se_fd);
+ }
+@@ -995,14 +1038,16 @@
+ (void) sigsetmask(omask);
+ }
+
++#ifdef OpenBSD
+ void
+ retry(int sig)
+ {
+ wantretry = 1;
+ }
++#endif
+
+ void
+-doretry(void)
++retry(int sig)
+ {
+ register struct servtab *sep;
+
+@@ -1046,7 +1091,7 @@
+ (void)close(sep->se_fd);
+ }
+ (void)unlink(_PATH_INETDPID);
+- _exit(0);
++ exit(0);
+ }
+
+ int bump_nofile __P((void));
+@@ -1102,9 +1147,9 @@
+ } else
+ r = bind(sep->se_fd, &sep->se_ctrladdr, sep->se_ctrladdr_size);
+ if (r < 0) {
+- syslog(LOG_ERR, "%s/%s: bind: %m",
+- sep->se_service, sep->se_proto);
+- (void) close(sep->se_fd);
++ syslog(LOG_ERR, "%s/%s (%d): bind: %m",
++ sep->se_service, sep->se_proto, sep->se_ctrladdr.sa_family);
++ close(sep->se_fd);
+ sep->se_fd = -1;
+ if (!timingout) {
+ timingout = 1;
+@@ -1113,10 +1158,10 @@
+ return;
+ }
+ if (sep->se_socktype == SOCK_STREAM)
+- listen(sep->se_fd, 10);
++ listen(sep->se_fd, global_queuelen);
+
+- fd_grow(&allsockp, &allsockn, sep->se_fd);
+- FD_SET(sep->se_fd, allsockp);
++ /* fd_grow(&allsockp, &allsockn, sep->se_fd); */
++ FD_SET(sep->se_fd, &allsock);
+ nsock++;
+ if (sep->se_fd > maxsock) {
+ maxsock = sep->se_fd;
+@@ -1230,10 +1275,12 @@
+ &new->se_ctrladdr_in6.sin6_addr,
+ sizeof(new->se_ctrladdr_in6.sin6_addr)) != 0)
+ return (0);
++#ifdef OpenBSD
+ if (old->se_family == AF_INET6 && new->se_family == AF_INET6 &&
+ old->se_ctrladdr_in6.sin6_scope_id !=
+ new->se_ctrladdr_in6.sin6_scope_id)
+ return (0);
++#endif
+
+ return (1);
+ }
+@@ -1241,7 +1288,7 @@
+ FILE *fconfig = NULL;
+ char line[1024];
+ char *defhost;
+-char *skip __P((char **, int));
++char *skip __P((char **));
+ char *nextline __P((FILE *));
+ char *newstr __P((char *));
+ struct servtab *dupconfig __P((struct servtab *));
+@@ -1277,7 +1324,7 @@
+ {
+ register struct servtab *sep;
+ int argc;
+- char *cp, *arg, *s;
++ char *cp, *arg;
+ char *hostdelim;
+ struct servtab *nsep;
+ struct servtab *psep;
+@@ -1288,19 +1335,19 @@
+ exit(1);
+ }
+
+- memset(sep, 0, sizeof *sep);
++ /* memset(sep, 0, sizeof *sep); */
+ more:
+- freeconfig(sep);
++ /* freeconfig(sep); */
+
+ while ((cp = nextline(fconfig)) && *cp == '#')
+ ;
+ if (cp == NULL) {
+- free(sep);
++ /* free(sep); */
+ return (NULL);
+ }
+
+ memset((char *)sep, 0, sizeof *sep);
+- arg = skip(&cp, 0);
++ arg = skip(&cp);
+ if (arg == NULL) {
+ /* A blank line. */
+ goto more;
+@@ -1310,10 +1357,12 @@
+ hostdelim = strrchr(arg, ':');
+ if (hostdelim) {
+ *hostdelim = '\0';
++#ifdef OpenBSD
+ if (arg[0] == '[' && hostdelim > arg && hostdelim[-1] == ']') {
+ hostdelim[-1] = '\0';
+ sep->se_hostaddr = newstr(arg + 1);
+ } else
++#endif
+ sep->se_hostaddr = newstr(arg);
+ arg = hostdelim + 1;
+ /*
+@@ -1321,10 +1370,10 @@
+ * default host for the following lines.
+ */
+ if (*arg == '\0') {
+- arg = skip(&cp, 0);
++ arg = skip(&cp);
+ if (cp == NULL) {
+ free(defhost);
+- defhost = newstr(sep->se_hostaddr);
++ defhost = sep->se_hostaddr;
+ goto more;
+ }
+ }
+@@ -1332,8 +1381,11 @@
+ sep->se_hostaddr = newstr(defhost);
+
+ sep->se_service = newstr(arg);
++#ifdef OpenBSD
+ if ((arg = skip(&cp, 1)) == NULL)
+ goto more;
++#endif
++ arg = skip (&cp);
+
+ if (strcmp(arg, "stream") == 0)
+ sep->se_socktype = SOCK_STREAM;
+@@ -1348,10 +1400,12 @@
+ else
+ sep->se_socktype = -1;
+
++#ifdef OpenBSD
+ if ((arg = skip(&cp, 1)) == NULL)
+ goto more;
++#endif
+
+- sep->se_proto = newstr(arg);
++ sep->se_proto = newstr(skip (&cp));
+
+ if (strcmp(sep->se_proto, "unix") == 0) {
+ sep->se_family = AF_UNIX;
+@@ -1389,10 +1443,11 @@
+ goto badafterall;
+ }
+ }
+- arg = skip(&cp, 1);
++ arg = skip(&cp);
+ if (arg == NULL)
+ goto more;
+
++#ifdef OpenBSD
+ s = strchr(arg, '.');
+ if (s) {
+ char *p;
+@@ -1406,11 +1461,20 @@
+ }
+ } else
+ sep->se_max = toomany;
++#endif
+
++ {
++ char *s = strchr (arg, '.');
++ if (s) {
++ *s++ = '\0';
++ sep->se_max = atoi (s);
++ } else
++ sep->se_max = toomany;
++ }
+ sep->se_wait = strcmp(arg, "wait") == 0;
+- if ((arg = skip(&cp, 1)) == NULL)
+- goto more;
+- sep->se_user = newstr(arg);
++ /* if ((arg = skip(&cp, 1)) == NULL) */
++ /* goto more; */
++ sep->se_user = newstr(skip (&cp));
+ arg = strchr(sep->se_user, '.');
+ if (arg == NULL)
+ arg = strchr(sep->se_user, ':');
+@@ -1418,12 +1482,12 @@
+ *arg++ = '\0';
+ sep->se_group = newstr(arg);
+ }
+- if ((arg = skip(&cp, 1)) == NULL)
+- goto more;
++ /* if ((arg = skip(&cp, 1)) == NULL) */
++ /* goto more; */
+
+- sep->se_server = newstr(arg);
++ sep->se_server = newstr(skip (&cp));
+ if (strcmp(sep->se_server, "internal") == 0) {
+- struct biltin *bi;
++ register struct biltin *bi;
+
+ for (bi = biltins; bi->bi_service; bi++)
+ if (bi->bi_socktype == sep->se_socktype &&
+@@ -1439,7 +1503,7 @@
+ } else
+ sep->se_bi = NULL;
+ argc = 0;
+- for (arg = skip(&cp, 0); cp; arg = skip(&cp, 0)) {
++ for (arg = skip(&cp); cp; arg = skip(&cp)) {
+ if (argc < MAXARGV)
+ sep->se_argv[argc++] = newstr(arg);
+ }
+@@ -1468,7 +1532,9 @@
+ nsep = sep;
+ while (nsep != NULL) {
+ nsep->se_checked = 1;
+- switch (nsep->se_family) {
++ /* switch (nsep->se_family) { */
++ if (nsep->se_family == AF_INET) {
++#ifdef OpenBSD
+ case AF_INET:
+ case AF_INET6:
+ {
+@@ -1488,7 +1554,13 @@
+ goto skip;
+ }
+ close(s);
++#endif
++ if (!strcmp (nsep->se_hostaddr, "*"))
++ nsep->se_ctrladdr_in.sin_addr.s_addr = INADDR_ANY;
++ else if (!inet_aton (nsep->se_hostaddr, &nsep->se_ctrladdr_in.sin_addr)) {
++ struct hostent *hp;
+
++#ifdef OpenBSD
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = nsep->se_family;
+ hints.ai_socktype = nsep->se_socktype;
+@@ -1517,7 +1589,22 @@
+ res->ai_addr, res->ai_addrlen);
+ continue;
+ }
++#endif
++ hp = gethostbyname (nsep->se_hostaddr);
++ if (hp == 0) {
++ syslog (LOG_ERR, "%s: unknown host", nsep->se_hostaddr);
++ nsep->se_checked = 0;
++ goto skip;
++ } else if (hp->h_addrtype != AF_INET) {
++ syslog (LOG_ERR,
++ "%s: address isn't an Internet "
++ "address", nsep->se_hostaddr);
++ nsep->se_checked = 0;
++ goto skip;
++ } else {
++ int i = 1;
+
++#ifdef OpenBSD
+ psep = dupconfig(nsep);
+ psep->se_hostaddr = newstr(nsep->se_hostaddr);
+ psep->se_checked = 1;
+@@ -1535,7 +1622,26 @@
+ freeaddrinfo(res0);
+ break;
+ }
++#endif
++ memmove (&nsep->se_ctrladdr_in.sin_addr,
++ hp->h_addr_list[0], sizeof (struct in_addr));
++ while (hp->h_addr_list[i] != NULL) {
++ psep = dupconfig (nsep);
++ psep->se_hostaddr = newstr (nsep->se_hostaddr);
++ psep->se_checked = 1;
++ memmove (&psep->se_ctrladdr_in.sin_addr,
++ hp->h_addr_list[i], sizeof (struct in_addr));
++ psep->se_ctrladdr_size = sizeof (psep->se_ctrladdr_in);
++ i++;
++ /* Prepend to list, don't want to look up its */
++ /* hostname again. */
++ psep->se_next = sep;
++ sep = psep;
++ }
++ }
++ }
+ }
++/* XXX BUG?: is this skip: label supposed to remain? */
+ skip:
+ nsep = nsep->se_next;
+ }
+@@ -1593,17 +1699,17 @@
+ }
+
+ char *
+-skip(cpp, report)
++skip(cpp)
+ char **cpp;
+- int report;
++ /* int report; */
+ {
+- char *cp = *cpp;
++ register char *cp = *cpp;
+ char *start;
+
+-erp:
++/* erp: */
+ if (*cpp == NULL) {
+- if (report)
+- syslog(LOG_ERR, "syntax error in inetd config file");
++ /* if (report) */
++ /* syslog(LOG_ERR, "syntax error in inetd config file"); */
+ return (NULL);
+ }
+
+@@ -1619,16 +1725,18 @@
+ if ((cp = nextline(fconfig)))
+ goto again;
+ *cpp = NULL;
+- goto erp;
++ /* goto erp; */
++ return (NULL);
+ }
+ start = cp;
+ while (*cp && *cp != ' ' && *cp != '\t')
+ cp++;
+ if (*cp != '\0')
+ *cp++ = '\0';
+- if ((*cpp = cp) == NULL)
+- goto erp;
++ /* if ((*cpp = cp) == NULL) */
++ /* goto erp; */
+
++ *cpp = cp;
+ return (start);
+ }
+
+@@ -1796,15 +1904,16 @@
+ {
+ char buffer[BUFSIZE];
+ int i, size;
+- struct sockaddr_storage ss;
++ /* struct sockaddr_storage ss; */
++ struct sockaddr sa;
+
+- size = sizeof(ss);
+- if ((i = recvfrom(s, buffer, sizeof(buffer), 0, (struct sockaddr *)&ss,
++ size = sizeof(sa);
++ if ((i = recvfrom(s, buffer, sizeof(buffer), 0, &sa,
+ &size)) < 0)
+ return;
+- if (dg_badinput((struct sockaddr *)&ss))
++ if (dg_badinput((struct sockaddr_in *)&sa))
+ return;
+- (void) sendto(s, buffer, i, 0, (struct sockaddr *)&ss, size);
++ (void) sendto(s, buffer, i, 0, &sa, sizeof(sa));
+ }
+
+ /* ARGSUSED */
+@@ -1890,7 +1999,8 @@
+ int s;
+ struct servtab *sep;
+ {
+- struct sockaddr_storage ss;
++ /* struct sockaddr_storage ss; */
++ struct sockaddr sa;
+ static char *rs;
+ int len, size;
+ char text[LINESIZ+2];
+@@ -1900,11 +2010,11 @@
+ rs = ring;
+ }
+
+- size = sizeof(ss);
+- if (recvfrom(s, text, sizeof(text), 0, (struct sockaddr *)&ss,
++ size = sizeof(sa);
++ if (recvfrom(s, text, sizeof(text), 0, &sa,
+ &size) < 0)
+ return;
+- if (dg_badinput((struct sockaddr *)&ss))
++ if (dg_badinput((struct sockaddr_in *)&sa))
+ return;
+
+ if ((len = endring - rs) >= LINESIZ)
+@@ -1917,7 +2027,7 @@
+ rs = ring;
+ text[LINESIZ] = '\r';
+ text[LINESIZ + 1] = '\n';
+- (void) sendto(s, text, sizeof(text), 0, (struct sockaddr *)&ss, size);
++ (void) sendto(s, text, sizeof(text), 0, &sa, sizeof(sa));
+ }
+
+ /*
+@@ -1959,18 +2069,23 @@
+ struct servtab *sep;
+ {
+ u_int result;
+- struct sockaddr_storage ss;
++ /* struct sockaddr_storage ss; */
++ struct sockaddr sa;
++ struct sockaddr_in *sin;
+ int size;
+
+- size = sizeof(ss);
++ size = sizeof(sa);
+ if (recvfrom(s, (char *)&result, sizeof(result), 0,
+- (struct sockaddr *)&ss, &size) < 0)
++ &sa, &size) < 0)
+ return;
+- if (dg_badinput((struct sockaddr *)&ss))
++ /* if (dg_badinput((struct sockaddr *)&ss)) */
++ sin = (struct sockaddr_in *) &sa;
++ if (sin->sin_addr.s_addr == htonl (INADDR_BROADCAST) ||
++ ntohs (sin->sin_port) < IPPORT_RESERVED / 2)
+ return;
+ result = machtime();
+ (void) sendto(s, (char *) &result, sizeof(result), 0,
+- (struct sockaddr *)&ss, size);
++ &sa, sizeof(sa));
+ }
+
+ /* ARGSUSED */
+@@ -1996,20 +2111,21 @@
+ {
+ char buffer[256];
+ time_t time(), clock;
+- struct sockaddr_storage ss;
++ /* struct sockaddr_storage ss; */
++ struct sockaddr sa;
+ int size;
+
+ clock = time((time_t *) 0);
+
+- size = sizeof(ss);
+- if (recvfrom(s, buffer, sizeof(buffer), 0, (struct sockaddr *)&ss,
++ size = sizeof(sa);
++ if (recvfrom(s, buffer, sizeof(buffer), 0, &sa,
+ &size) < 0)
+ return;
+- if (dg_badinput((struct sockaddr *)&ss))
++ if (dg_badinput((struct sockaddr_in *)&sa))
+ return;
+ (void) sprintf(buffer, "%.24s\r\n", ctime(&clock));
+- (void) sendto(s, buffer, strlen(buffer), 0, (struct sockaddr *)&ss,
+- size);
++ (void) sendto(s, buffer, strlen(buffer), 0, &sa,
++ sizeof(sa));
+ }
+
+ /*
+--- ./Makefile.orig Thu Mar 30 17:00:49 2000
++++ ./Makefile Tue Feb 6 17:18:05 2001
+@@ -1,7 +1,6 @@
+-# $OpenBSD: Makefile,v 1.3 2000/03/31 01:00:49 deraadt Exp $
++CC = gcc
++CFLAGS = -O2
++LDFLAGS = -s
+
+-PROG= inetd
+-MAN= inetd.8
+-MLINKS= inetd.8 inetd.conf.5
+-
+-.include <bsd.prog.mk>
++all:
++ $(CC) $(CFLAGS) $(LDFLAGS) -o inetd inetd.c
diff --git a/source/n/inetd/inetd.SlackBuild b/source/n/inetd/inetd.SlackBuild
new file mode 100755
index 00000000..8a86a350
--- /dev/null
+++ b/source/n/inetd/inetd.SlackBuild
@@ -0,0 +1,68 @@
+#!/bin/sh
+
+# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, Minnesota, USA
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+VERSION=1.79s
+ARCH=${ARCH:-x86_64}
+BUILD=${BUILD:-8}
+
+CWD=$(pwd)
+TMP=${TMP:-/tmp}
+PKG=$TMP/package-inetd
+
+rm -rf $PKG
+mkdir -p $TMP $PKG
+
+# Explode the package framework:
+cd $PKG
+explodepkg $CWD/_inetd.tar.gz
+
+echo "+====================+"
+echo "| inetd-OpenBSD-1.79 |"
+echo "+====================+"
+cd $TMP
+rm -rf inetd
+tar xvf $CWD/inetd-OpenBSD-1.79.tar.gz || exit 1
+cd inetd
+zcat $CWD/inetd-OpenBSD-1.79.diff.gz | patch -p1 --backup --suffix=.orig --verbose -E
+zcat $CWD/inetd.loopingdos.diff.gz | patch -p1 --backup --suffix=.orig --verbose -E
+
+# GCC 4 fix (thanks Fred Emmott)
+sed -i 's#(type)\([a-z]\)=(type)\([a-z]\)#\1=(type)\2#g' inetd.c
+
+make || exit 1
+
+strip inetd
+cat inetd > $PKG/usr/sbin/inetd
+cat inetd.8 | gzip -9c > $PKG/usr/man/man8/inetd.8.gz
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+# Build the package:
+cd $PKG
+/sbin/makepkg -l y -c n $TMP/inetd-$VERSION-$ARCH-$BUILD.txz
+
+# Clean up the extra stuff:
+if [ "$1" = "--cleanup" ]; then
+ rm -rf $TMP/inetd
+ rm -rf $PKG
+fi
diff --git a/source/n/inetd/inetd.loopingdos.diff b/source/n/inetd/inetd.loopingdos.diff
new file mode 100644
index 00000000..5bfcc53f
--- /dev/null
+++ b/source/n/inetd/inetd.loopingdos.diff
@@ -0,0 +1,54 @@
+--- ./inetd.c.orig 2003-09-06 15:08:41.000000000 -0700
++++ ./inetd.c 2003-09-06 16:26:24.000000000 -0700
+@@ -171,7 +171,8 @@
+ #include <rpcsvc/nfs_prot.h>
+ #include "pathnames.h"
+
+-#define TOOMANY 256 /* don't start more than TOOMANY */
++#define TOOMANY 0 /* don't start more than TOOMANY */
++ /* zero disables this stupid "feature" */
+ #define CNT_INTVL 60 /* servers in CNT_INTVL sec. */
+ #define RETRYTIME (60*10) /* retry after bind or server fail */
+
+@@ -365,7 +366,7 @@
+ int val;
+
+ val = strtoul(optarg, &p, 0);
+- if (val >= 1 && *p == (char) NULL) {
++ if (val >= 0 && *p == (char) NULL) {
+ toomany = val;
+ break;
+ }
+@@ -546,7 +547,7 @@
+ if (dofork) {
+ if (sep->se_count++ == 0)
+ (void)gettimeofday(&sep->se_time, NULL);
+- else if (sep->se_count >= sep->se_max) {
++ else if (toomany > 0 && sep->se_count >= sep->se_max) {
+ struct timeval now;
+
+ (void)gettimeofday(&now, NULL);
+--- ./inetd.8.orig 2003-09-06 16:26:50.000000000 -0700
++++ ./inetd.8 2003-09-06 16:30:27.000000000 -0700
+@@ -68,7 +68,8 @@
+ Turns on debugging.
+ .It Fl R Ar rate
+ Specify the maximum number of times a service can be invoked
+-in one minute; the default is 256.
++in one minute; the default is unlimited. A rate of 0 allows an
++unlimited number of invocations.
+ .El
+ .Pp
+ Upon execution,
+@@ -249,9 +250,8 @@
+ spawned from
+ .Nm inetd
+ within an interval of 60 seconds.
+-When omitted,
+-.Dq max
+-defaults to 256.
++The default is unlimited (setting a limit may actually make it easier for
++an attacker to create a denial-of-service, and is not recommended).
+ .Pp
+ Stream servers are usually marked as
+ .Dq nowait
diff --git a/source/n/inetd/slack-desc b/source/n/inetd/slack-desc
new file mode 100644
index 00000000..7f5c15c5
--- /dev/null
+++ b/source/n/inetd/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description. Line
+# up the first '|' above the ':' following the base package name, and the '|'
+# on the right side marks the last column you can put a character in. You must
+# make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':'.
+
+ |-----handy-ruler------------------------------------------------------|
+inetd: inetd (Internet super-server)
+inetd:
+inetd: This is a program to listen for connections on certain Internet
+inetd: sockets and invokes a program to service the request. Essentially,
+inetd: inetd allows running one daemon to invoke several others, reducing
+inetd: load on the system. Many of the network services are run through
+inetd: inetd, so you'll probably need it.
+inetd:
+inetd: This version of inetd was ported from OpenBSD.
+inetd:
+inetd: