--- ./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 #include #include -#include +/* #include */ #include #include #include @@ -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 +all: + $(CC) $(CFLAGS) $(LDFLAGS) -o inetd inetd.c