*/
#include "busybox.h"
-
-#include <unistd.h>
-#include <string.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <sys/syslog.h>
-
-#include <pwd.h>
-
#include <sys/syslog.h>
-#include <time.h>
-#include <sys/socket.h>
-#include <errno.h>
#include <sys/uio.h>
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);
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;
- s = bb_xsocket(AF_INET, SOCK_STREAM, 0);
+ 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_xbind? */
- bb_perror_msg_and_die("Cannot bind() port %i", IDENT_PORT);
-
- if (listen(s, 5) < 0) /* bb_xlisten? */
- 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];
+ 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);
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();
conns[i].lasttime = time(NULL);
}
}
- } /* end of while(1) */
+ } /* end of while (1) */
return 0;
}