X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=networking%2Fisrv_identd.c;h=f564d604afb13b3ca7c47def05de4d3fb3cb3e29;hb=eb7f9acda147543079f261753a11d2afa340fc5e;hp=a96ac6041f1979e4f3d76e79a411def3f6fc96fb;hpb=43d5d429fd7a80ca02eb8388f058fd9654cc118d;p=oweals%2Fbusybox.git diff --git a/networking/isrv_identd.c b/networking/isrv_identd.c index a96ac6041..f564d604a 100644 --- a/networking/isrv_identd.c +++ b/networking/isrv_identd.c @@ -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 #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); }