syslogd: add config option to include milliseconds in timestamps
[oweals/busybox.git] / networking / isrv_identd.c
index a96ac6041f1979e4f3d76e79a411def3f6fc96fb..f564d604afb13b3ca7c47def05de4d3fb3cb3e29 100644 (file)
@@ -4,10 +4,32 @@
  *
  * Copyright (C) 2007 Denys Vlasenko
  *
- * Licensed under GPL version 2, see file LICENSE in this tarball for details.
+ * Licensed under GPLv2, see file LICENSE in this source tree.
  */
+//config:config FAKEIDENTD
+//config:      bool "fakeidentd (8.7 kb)"
+//config:      default y
+//config:      select FEATURE_SYSLOG
+//config:      help
+//config:      fakeidentd listens on the ident port and returns a predefined
+//config:      fake value on any query.
+
+//applet:IF_FAKEIDENTD(APPLET(fakeidentd, BB_DIR_USR_SBIN, BB_SUID_DROP))
+
+//kbuild:lib-$(CONFIG_FAKEIDENTD) += isrv_identd.o isrv.o
+
+//usage:#define fakeidentd_trivial_usage
+//usage:       "[-fiw] [-b ADDR] [STRING]"
+//usage:#define fakeidentd_full_usage "\n\n"
+//usage:       "Provide fake ident (auth) service\n"
+//usage:     "\n       -f      Run in foreground"
+//usage:     "\n       -i      Inetd mode"
+//usage:     "\n       -w      Inetd 'wait' mode"
+//usage:     "\n       -b ADDR Bind to specified address"
+//usage:     "\n       STRING  Ident answer string (default: nobody)"
 
 #include "libbb.h"
+#include "common_bufsiz.h"
 #include <syslog.h>
 #include "isrv.h"
 
@@ -15,8 +37,7 @@ enum { TIMEOUT = 20 };
 
 typedef struct identd_buf_t {
        int pos;
-       int fd_flag;
-       char buf[64 - 2*sizeof(int)];
+       char buf[64 - sizeof(int)];
 } identd_buf_t;
 
 #define bogouser bb_common_bufsiz1
@@ -32,7 +53,7 @@ static int new_peer(isrv_state_t *state, int fd)
        if (isrv_register_fd(state, peer, fd) < 0)
                return peer; /* failure, unregister peer */
 
-       buf->fd_flag = fcntl(fd, F_GETFL) | O_NONBLOCK;
+       ndelay_on(fd);
        isrv_want_rd(state, fd);
        return 0;
 }
@@ -41,19 +62,16 @@ static int do_rd(int fd, void **paramp)
 {
        identd_buf_t *buf = *paramp;
        char *cur, *p;
-       int retval = 0; /* session is ok (so far) */
        int sz;
 
        cur = buf->buf + buf->pos;
 
-       if (buf->fd_flag & O_NONBLOCK)
-               fcntl(fd, F_SETFL, buf->fd_flag);
-       sz = safe_read(fd, cur, sizeof(buf->buf) - buf->pos);
+       sz = safe_read(fd, cur, sizeof(buf->buf) - 1 - buf->pos);
 
        if (sz < 0) {
                if (errno != EAGAIN)
-                       goto term; /* terminate this session if !EAGAIN */
-               goto ok;
+                       goto term;
+               return 0; /* "session is ok" */
        }
 
        buf->pos += sz;
@@ -61,22 +79,25 @@ static int do_rd(int fd, void **paramp)
        p = strpbrk(cur, "\r\n");
        if (p)
                *p = '\0';
-       if (!p && sz && buf->pos <= sizeof(buf->buf))
-               goto ok;
+       if (!p && sz)
+               return 0;  /* "session is ok" */
+
        /* Terminate session. If we are in server mode, then
         * fd is still in nonblocking mode - we never block here */
-       if (fd == 0) fd++; /* inetd mode? then write to fd 1 */
+       if (fd == 0)
+               fd++; /* inetd mode? then write to fd 1 */
        fdprintf(fd, "%s : USERID : UNIX : %s\r\n", buf->buf, bogouser);
+       /*
+        * Why bother if we are going to close fd now anyway?
+        * if (server)
+        *      ndelay_off(fd);
+        */
  term:
        free(buf);
-       retval = 1; /* terminate */
- ok:
-       if (buf->fd_flag & O_NONBLOCK)
-               fcntl(fd, F_SETFL, buf->fd_flag & ~O_NONBLOCK);
-       return retval;
+       return 1; /* "terminate" */
 }
 
-static int do_timeout(void **paramp ATTRIBUTE_UNUSED)
+static int do_timeout(void **paramp UNUSED_PARAM)
 {
        return 1; /* terminate session */
 }
@@ -85,15 +106,14 @@ static void inetd_mode(void)
 {
        identd_buf_t *buf = xzalloc(sizeof(*buf));
        /* buf->pos = 0; - xzalloc did it */
-       /* We do NOT want nonblocking I/O here! */
-       /* buf->fd_flag = 0; - xzalloc did it */
        do
                alarm(TIMEOUT);
+               /* Note: we do NOT want nonblocking I/O here! */
        while (do_rd(0, (void*)&buf) == 0);
 }
 
 int fakeidentd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int fakeidentd_main(int argc ATTRIBUTE_UNUSED, char **argv)
+int fakeidentd_main(int argc UNUSED_PARAM, char **argv)
 {
        enum {
                OPT_foreground = 0x1,
@@ -107,10 +127,12 @@ int fakeidentd_main(int argc ATTRIBUTE_UNUSED, char **argv)
        unsigned opt;
        int fd;
 
+       setup_common_bufsiz();
+
        opt = getopt32(argv, "fiwb:", &bind_address);
        strcpy(bogouser, "nobody");
        if (argv[optind])
-               strncpy(bogouser, argv[optind], sizeof(bogouser));
+               strncpy(bogouser, argv[optind], COMMON_BUFSIZE - 1);
 
        /* Daemonize if no -f and no -i and no -w */
        if (!(opt & OPT_fiw))
@@ -122,7 +144,7 @@ int fakeidentd_main(int argc ATTRIBUTE_UNUSED, char **argv)
         * log to stderr. I like daemontools more. Go their way.
         * (Or maybe we need yet another option "log to syslog") */
        if (!(opt & OPT_fiw) /* || (opt & OPT_syslog) */) {
-               openlog(applet_name, 0, LOG_DAEMON);
+               openlog(applet_name, LOG_PID, LOG_DAEMON);
                logmode = LOGMODE_SYSLOG;
        }
 
@@ -137,7 +159,7 @@ int fakeidentd_main(int argc ATTRIBUTE_UNUSED, char **argv)
        fd = 0;
        if (!(opt & OPT_inetdwait)) {
                fd = create_and_bind_stream_or_die(bind_address,
-                               bb_lookup_port("identd", "tcp", 113));
+                               bb_lookup_std_port("identd", "tcp", 113));
                xlisten(fd, 5);
        }