I *always* forgotting svn add
[oweals/busybox.git] / networking / fakeidentd.c
index 40d5cf1b7c5b9bb65f53133ce396403dd89f6aa1..8967a7a386a4a0be34693275631a96fa5302008f 100644 (file)
@@ -6,56 +6,24 @@
  * Original Author: Tomi Ollila <too@iki.fi>
  *                  http://www.guru-group.fi/~too/sw/
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <sys/syslog.h>
-
-#include <pwd.h>
-#include <netdb.h>
-
+#include "busybox.h"
 #include <sys/syslog.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <time.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <arpa/inet.h>
 #include <sys/uio.h>
 
-#include "busybox.h"
 
 #define IDENT_PORT  113
 #define MAXCONNS    20
 #define MAXIDLETIME 45
 
 static const char ident_substr[] = " : USERID : UNIX : ";
-static const int ident_substr_len = sizeof(ident_substr) - 1;
+enum { ident_substr_len = sizeof(ident_substr) - 1 };
 #define PIDFILE "/var/run/identd.pid"
 
 /*
- * We have to track the 'first connection socket' so that we 
+ * We have to track the 'first connection socket' so that we
  * don't go around closing file descriptors for non-clients.
  *
  * descriptor setup normally
@@ -96,7 +64,7 @@ static void replyError(int s, char *buf);
 static const char *nobodystr = "nobody"; /* this needs to be declared like this */
 static char *bind_ip_address = "0.0.0.0";
 
-static inline void movefd(int from, int to)
+static void movefd(int from, int to)
 {
        if (from != to) {
                dup2(from, to);
@@ -109,29 +77,24 @@ static void inetbind(void)
        int s, port;
        struct sockaddr_in addr;
        int len = sizeof(addr);
-       int one = 1;
        struct servent *se;
 
-       if ((se = getservbyname("identd", "tcp")) == NULL)
-               port = IDENT_PORT;
-       else
+       se = getservbyname("identd", "tcp");
+       port = IDENT_PORT;
+       if (se)
                port = se->s_port;
 
-       if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
-               bb_perror_msg_and_die("Cannot create server socket");
+       s = xsocket(AF_INET, SOCK_STREAM, 0);
 
-       setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
+       setsockopt_reuseaddr(s);
 
        memset(&addr, 0, sizeof(addr));
        addr.sin_addr.s_addr = inet_addr(bind_ip_address);
        addr.sin_family = AF_INET;
        addr.sin_port = htons(port);
 
-       if (bind(s, (struct sockaddr *)&addr, len) < 0)
-               bb_perror_msg_and_die("Cannot bind() port %i", IDENT_PORT);
-
-       if (listen(s, 5) < 0)
-               bb_perror_msg_and_die("Cannot listen() on port %i", IDENT_PORT);
+       xbind(s, (struct sockaddr *)&addr, len);
+       xlisten(s, 5);
 
        movefd(s, 0);
 }
@@ -144,15 +107,15 @@ static void handlexitsigs(int signum)
 }
 
 /* May succeed. If not, won't care. */
-static inline void writepid(uid_t nobody, uid_t nogrp)
+static void writepid(uid_t nobody, uid_t nogrp)
 {
-       char buf[24];
+       char buf[sizeof(int)*3 + 2];
        int fd = open(PIDFILE, O_WRONLY|O_CREAT|O_TRUNC, 0664);
 
        if (fd < 0)
                return;
 
-       snprintf(buf, 23, "%d\n", getpid());
+       sprintf(buf, "%d\n", getpid());
        write(fd, buf, strlen(buf));
        fchown(fd, nobody, nogrp);
        close(fd);
@@ -171,20 +134,20 @@ static int godaemon(void)
 
        switch (fork()) {
        case -1:
-               bb_perror_msg_and_die("Could not fork");
+               bb_perror_msg_and_die("fork");
 
        case 0:
                pw = getpwnam(nobodystr);
                if (pw == NULL)
-                       bb_error_msg_and_die("Cannot find uid/gid of user '%s'", nobodystr);
+                       bb_error_msg_and_die("cannot find uid/gid of user '%s'", nobodystr);
                nobody = pw->pw_uid;
                nogrp = pw->pw_gid;
                writepid(nobody, nogrp);
 
                close(0);
                inetbind();
-               if (setgid(nogrp))   bb_error_msg_and_die("Could not setgid()");
-               if (setuid(nobody))  bb_error_msg_and_die("Could not setuid()");
+               xsetgid(nogrp);
+               xsetuid(nobody);
                close(1);
                close(2);
 
@@ -193,7 +156,6 @@ static int godaemon(void)
 
                setsid();
 
-               openlog(bb_applet_name, 0, LOG_DAEMON);
                return 1;
        }
 
@@ -255,13 +217,17 @@ static int checkInput(char *buf, int len, int l)
 
 int fakeidentd_main(int argc, char **argv)
 {
+       /* This applet is an inetd-style daemon */
+       openlog(applet_name, 0, LOG_DAEMON);
+       logmode = LOGMODE_SYSLOG;
+
        memset(conns, 0, sizeof(conns));
        memset(&G, 0, sizeof(G));
        FD_ZERO(&G.readfds);
        FD_SET(0, &G.readfds);
 
        /* handle -b <ip> parameter */
-       bb_getopt_ulflags(argc, argv, "b:", &bind_ip_address);
+       getopt32(argc, argv, "b:", &bind_ip_address);
        /* handle optional REPLY STRING */
        if (optind < argc)
                G.identuser = argv[optind];
@@ -322,7 +288,7 @@ deleteconn:
 
                if (s < 0) {
                        if (errno != EINTR) /* EINTR */
-                               syslog(LOG_ERR, "accept: %s", strerror(errno));
+                               bb_perror_msg("accept");
                } else {
                        if (G.conncnt == MAXCONNS)
                                i = closeOldest();
@@ -336,7 +302,7 @@ deleteconn:
                        conns[i].lasttime = time(NULL);
                }
        }
-       } /* end of while(1) */
+       } /* end of while (1) */
 
        return 0;
 }