* 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
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);
else
port = se->s_port;
- s = bb_xsocket(AF_INET, SOCK_STREAM, 0);
+ s = xsocket(AF_INET, SOCK_STREAM, 0);
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
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);
}
}
/* 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];
int fd = open(PIDFILE, O_WRONLY|O_CREAT|O_TRUNC, 0664);
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);
setsid();
- openlog(bb_applet_name, 0, LOG_DAEMON);
return 1;
}
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];
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();