=================================================================== RCS file: /src/master/inetd/Makefile,v retrieving revision 1.1.1.3 diff -u -r1.1.1.3 Makefile --- 1.1.1.3 1995/06/12 21:55:38 +++ Makefile 1995/06/12 23:11:57 @@ -1,11 +1,10 @@ +# Inetd from BSD 4.4 PROG= inetd +LIBS= -lresolv -l44bsd -ldb MAN8= inetd.0 MLINKS= inetd.8 inetd.5 -DPADD= ${LIBUTIL} -LDADD= -lutil +CC=gcc -.include +$(PROG): $(PROG).c + $(LINK.c) -o $@ $< $(LIBS) =================================================================== RCS file: /src/master/inetd/inetd.c,v retrieving revision 1.1.1.3 diff -u -r1.1.1.3 inetd.c --- 1.1.1.3 1995/06/12 21:55:40 +++ inetd.c 1995/06/12 23:11:59 @@ -99,6 +97,8 @@ #include #include #include +#include +#include #include #include @@ -116,6 +116,10 @@ #include "pathnames.h" +#ifndef LINE_MAX +#define LINE_MAX 1024 +#endif /* LINE_MAX */ + #define TOOMANY 40 /* don't start more than TOOMANY */ #define CNT_INTVL 60 /* servers in CNT_INTVL sec. */ #define RETRYTIME (60*10) /* retry after bind or server fail */ @@ -138,6 +142,7 @@ short se_wait; /* single threaded server */ short se_checked; /* looked at during merge */ char *se_user; /* user name to run as */ + int se_maxloop; /* maximum number of loops before termination */ struct biltin *se_bi; /* if built-in, description */ char *se_server; /* server program */ #define MAXARGV 20 @@ -231,6 +236,8 @@ int tmpint, ch, dofork; pid_t pid; char buf[50]; + extern char *optarg; + extern int optind; openlog("inetd", LOG_PID | LOG_NOWAIT, LOG_DAEMON); @@ -263,9 +270,11 @@ if (argc > 0) CONFIG = argv[0]; - if (debug == 0) { +#if 0 + if (debug == 0) daemon(0, 0); - } +#endif + openlog("inetd", LOG_PID | LOG_NOWAIT, LOG_DAEMON); memset(&sv, 0, sizeof(sv)); sv.sv_mask = SIGBLOCK; sv.sv_handler = retry; @@ -281,7 +290,7 @@ #define DUMMYSIZE 100 char dummy[DUMMYSIZE]; - (void)memset(dummy, 'x', sizeof(DUMMYSIZE) - 1); + (void)memset(dummy, 'x', DUMMYSIZE - 1); dummy[DUMMYSIZE - 1] = '\0'; (void)setenv("inetd_dummy", dummy, 1); } @@ -342,7 +351,7 @@ if (sep->se_count++ == 0) (void)gettimeofday(&sep->se_time, (struct timezone *)0); - else if (sep->se_count >= toomany) { + else if (sep->se_maxloop && (sep->se_count >= sep->se_maxloop)) { struct timeval now; (void)gettimeofday(&now, (struct timezone *)0); @@ -412,6 +421,9 @@ recv(0, buf, sizeof (buf), 0); _exit(1); } + if (pwd->pw_dir) { + setenv("HOME",pwd->pw_dir,1); + } if (pwd->pw_uid) { if (setgid(pwd->pw_gid) < 0) { syslog(LOG_ERR, @@ -776,6 +788,7 @@ } } sep->se_user = newstr(sskip(&cp)); + sep->se_maxloop = atoi(skip(&cp)); sep->se_server = newstr(sskip(&cp)); if (strcmp(sep->se_server, "internal") == 0) { struct biltin *bi; @@ -899,6 +912,7 @@ char *a; int s; { +#if 0 int size; struct sockaddr_in sin; @@ -907,6 +921,7 @@ setproctitle("-%s [%s]", a, inet_ntoa(sin.sin_addr)); else setproctitle("-%s", a); +#endif } /* @@ -1161,6 +1176,8 @@ sep->se_wait, sep->se_user, (int)sep->se_bi, sep->se_server); } + + /* * Based on TCPMUX.C by Mark K. Lottor November 1988 * sri-nic::ps:tcpmux.c @@ -1241,3 +1258,178 @@ strwrite(s, "-Service not available\r\n"); return (NULL); } + + +#ifdef __sun__ +/* + * Copyright (c) 1987, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid1[] = "@(#)setenv.c 8.1 (Berkeley) 6/4/93"; +static char sccsid2[] = "@(#)getenv.c 8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ + +#ifndef __STDC__ +#define const +#endif + +#include +#include +#include + +#ifndef __P +#define __P(x) () +#endif +static char *__findenv __P((const char *, int *)); + +/* + * setenv -- + * Set the value of the environmental variable "name" to be + * "value". If rewrite is set, replace any current value. + */ +setenv(name, value, rewrite) + register const char *name; + register const char *value; + int rewrite; +{ + extern char **environ; + static int alloced; /* if allocated space before */ + register char *c; + int l_value, offset; + + if (*value == '=') /* no `=' in value */ + ++value; + l_value = strlen(value); + if ((c = __findenv(name, &offset))) { /* find if already exists */ + if (!rewrite) + return (0); + if (strlen(c) >= l_value) { /* old larger; copy over */ + while (*c++ = *value++); + return (0); + } + } else { /* create new slot */ + register int cnt; + register char **p; + + for (p = environ, cnt = 0; *p; ++p, ++cnt); + if (alloced) { /* just increase size */ + environ = (char **)realloc((char *)environ, + (size_t)(sizeof(char *) * (cnt + 2))); + if (!environ) + return (-1); + } + else { /* get new space */ + alloced = 1; /* copy old entries into it */ + p = (char **)malloc((size_t)(sizeof(char *) * (cnt + 2))); + if (!p) + return (-1); +#if defined(USG) + memcpy( p,environ, cnt * sizeof(char *)); +#else /*USG*/ + bcopy(environ, p, cnt * sizeof(char *)); +#endif /*USG*/ + environ = p; + } + environ[cnt + 1] = NULL; + offset = cnt; + } + for (c = (char *)name; *c && *c != '='; ++c); /* no `=' in name */ + if (!(environ[offset] = /* name + `=' + value */ + malloc((size_t)((int)(c - name) + l_value + 2)))) + return (-1); + for (c = environ[offset]; (*c = *name++) && *c != '='; ++c); + for (*c++ = '='; *c++ = *value++;); + return (0); +} + +/* + * unsetenv(name) -- + * Delete environmental variable "name". + */ +void +unsetenv(name) + const char *name; +{ + extern char **environ; + register char **p; + int offset; + + while (__findenv(name, &offset)) /* if set multiple times */ + for (p = &environ[offset];; ++p) + if (!(*p = *(p + 1))) + break; +} + +/* + * getenv -- + * Returns ptr to value associated with name, if any, else NULL. + */ +char * +getenv(name) + const char *name; +{ + int offset; + + return (__findenv(name, &offset)); +} + +/* + * __findenv -- + * Returns pointer to value associated with name, if any, else NULL. + * Sets offset to be the offset of the name/value combination in the + * environmental array, for use by setenv(3) and unsetenv(3). + * Explicitly removes '=' in argument name. + */ +static char * +__findenv(name, offset) + register const char *name; + int *offset; +{ + extern char **environ; + register int len; + register const char *np; + register char **p, *c; + + if (name == NULL || environ == NULL) + return (NULL); + for (np = name; *np && *np != '='; ++np) + continue; + len = np - name; + for (p = environ; (c = *p) != NULL; ++p) + if (strncmp(c, name, len) == 0 && c[len] == '=') { + *offset = p - environ; + return (c + len + 1); + } + return (NULL); +} +#endif =================================================================== RCS file: /src/master/inetd/pathnames.h,v retrieving revision 1.1.1.2 diff -u -r1.1.1.2 pathnames.h --- 1.1.1.2 1995/06/12 21:55:42 +++ pathnames.h 1995/06/12 22:09:53 @@ -33,6 +33,4 @@ * @(#)pathnames.h 8.1 (Berkeley) 6/6/93 */ -#include - #define _PATH_INETDCONF "/etc/inetd.conf"