From owner-freebsd-hackers Tue Aug 6 12:55:27 1996 Return-Path: owner-hackers Received: (from root@localhost) by freefall.freebsd.org (8.7.5/8.7.3) id MAA16274 for hackers-outgoing; Tue, 6 Aug 1996 12:55:27 -0700 (PDT) Received: from whistle.com (s205m131.whistle.com [207.76.205.131]) by freefall.freebsd.org (8.7.5/8.7.3) with ESMTP id MAA16261 for ; Tue, 6 Aug 1996 12:55:19 -0700 (PDT) Received: (from smap@localhost) by whistle.com (8.7.5/8.6.12) id MAA22086 for ; Tue, 6 Aug 1996 12:54:48 -0700 (PDT) Received: from current1.whistle.com(207.76.205.22) by whistle.com via smap (V1.3) id sma022084; Tue Aug 6 12:54:45 1996 Received: (from julian@localhost) by current1.whistle.com (8.7.5/8.7.3) id MAA12611 for hackers@freebsd.org; Tue, 6 Aug 1996 12:54:09 -0700 (PDT) Date: Tue, 6 Aug 1996 12:54:09 -0700 (PDT) From: Julian Elischer Message-Id: <199608061954.MAA12611@current1.whistle.com> To: hackers@freebsd.org Subject: please comment on this: Sender: owner-hackers@freebsd.org X-Loop: FreeBSD.org Precedence: bulk Here at whistle, we want to run different services on different interfaces, so here are some patches to allow inetd to bind to an address. does anyone have any complaints about this feature? is it in any way a security hole? If I don't hear any problems or if people like it, I'd like to add this to our sources.. julian Index: inetd.8 =================================================================== RCS file: /cvs/freebsd/src/usr.sbin/inetd/inetd.8,v retrieving revision 1.8 diff -c -r1.8 inetd.8 *** 1.8 1996/02/07 17:15:00 --- inetd.8 1996/08/06 19:29:15 *************** *** 44,49 **** --- 44,51 ---- .Op Fl d .Op Fl l .Op Fl R Ar rate + .Op Fl a Ar address + .Op Fl p Ar filename .Op Ar configuration file .Sh DESCRIPTION The *************** *** 78,83 **** --- 80,89 ---- .It Fl R Ar rate Specifies the maximum number of times a service can be invoked in one minute; the default is 256. + .It Fl a + Specify a specific IP address to bind to. + .It Fl p + Specify an alternate file in which to store the process ID. .El .Pp Upon execution, Index: inetd.c =================================================================== RCS file: /cvs/freebsd/src/usr.sbin/inetd/inetd.c,v retrieving revision 1.12 diff -c -r1.12 inetd.c *** 1.12 1996/07/17 15:00:28 --- inetd.c 1996/08/06 19:29:15 *************** *** 143,148 **** --- 143,149 ---- int toomany = TOOMANY; struct servent *sp; struct rpcent *rpc; + struct in_addr bind_address; struct servtab { char *se_service; /* name of service */ *************** *** 238,243 **** --- 239,245 ---- #define NUMINT (sizeof(intab) / sizeof(struct inent)) char *CONFIG = _PATH_INETDCONF; + char *pid_file = _PATH_INETDPID; #ifdef OLD_SETPROCTITLE char **Argv; *************** *** 270,276 **** openlog("inetd", LOG_PID | LOG_NOWAIT, LOG_DAEMON); ! while ((ch = getopt(argc, argv, "dlR:")) != EOF) switch(ch) { case 'd': debug = 1; --- 272,279 ---- openlog("inetd", LOG_PID | LOG_NOWAIT, LOG_DAEMON); ! bind_address.s_addr = htonl(INADDR_ANY); ! while ((ch = getopt(argc, argv, "dlR:a:p:")) != EOF) switch(ch) { case 'd': debug = 1; *************** *** 291,300 **** toomany = tmpint; break; } case '?': default: syslog(LOG_ERR, ! "usage: inetd [-dl] [-R rate] [conf-file]"); exit(1); } argc -= optind; --- 294,314 ---- toomany = tmpint; break; } + case 'a': + if (!inet_aton(optarg, &bind_address)) { + syslog(LOG_ERR, + "-a %s: invalid IP address", optarg); + exit(1); + } + break; + case 'p': + pid_file = optarg; + break; case '?': default: syslog(LOG_ERR, ! "usage: inetd [-dl] [-a address] [-R rate]" ! " [-p pidfile] [conf-file]"); exit(1); } argc -= optind; *************** *** 317,328 **** /* no big deal if it fails.. */ } pid = getpid(); ! fp = fopen(_PATH_INETDPID, "w"); if (fp) { fprintf(fp, "%ld\n", (long)pid); fclose(fp); } else { ! syslog(LOG_WARNING, _PATH_INETDPID ": %m"); } } memset(&sv, 0, sizeof(sv)); --- 331,342 ---- /* no big deal if it fails.. */ } pid = getpid(); ! fp = fopen(pid_file, "w"); if (fp) { fprintf(fp, "%ld\n", (long)pid); fclose(fp); } else { ! syslog(LOG_WARNING, "%s: %m", pid_file); } } memset(&sv, 0, sizeof(sv)); *************** *** 918,924 **** sep->se_rpc_lowvers = 0; sep->se_ctrladdr.sin_family = AF_INET; sep->se_ctrladdr.sin_port = 0; ! sep->se_ctrladdr.sin_addr.s_addr = htonl(INADDR_ANY); if ((versp = rindex(sep->se_service, '/'))) { *versp++ = '\0'; switch (sscanf(versp, "%d-%d", --- 932,938 ---- sep->se_rpc_lowvers = 0; sep->se_ctrladdr.sin_family = AF_INET; sep->se_ctrladdr.sin_port = 0; ! sep->se_ctrladdr.sin_addr = bind_address; if ((versp = rindex(sep->se_service, '/'))) { *versp++ = '\0'; switch (sscanf(versp, "%d-%d",