/*
* The Remote User Information Daemon
*
- * (c) 1997--2010 Martin Mares <mj@ucw.cz>
+ * (c) 1997--2017 Martin Mares <mj@ucw.cz>
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <stdarg.h>
#include <fcntl.h>
+#include <getopt.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netdb.h>
#include <dirent.h>
#include <errno.h>
-#include "net.h"
+#include "nwho.h"
struct hostrec {
struct hostrec *next;
u32 addr;
};
+static int do_not_daemonize;
static int sock, port;
static struct hostrec *first_host;
static time_t now, last_local_scan;
static char hostname[64];
-static void die(char *msg, ...) __attribute__((noreturn));
-
-static void
-die(char *msg, ...)
-{
- va_list args;
-
- va_start(args, msg);
- fprintf(stderr, "nwhod: ");
- vfprintf(stderr, msg, args);
- fputc('\n', stderr);
- exit(1);
-}
-
static void
net_init(char *name)
{
static void
make_pkt(struct nwho_pkt *pkt)
{
- bzero(pkt, sizeof(pkt));
+ bzero(pkt, sizeof(*pkt));
pkt->magic = htonl(NWHO_MAGIC);
pkt->local_time = htonl(now);
scan_utmp(pkt, now);
static void
save_pkt(char *name, struct nwho_pkt *pkt)
{
- int len = sizeof(pkt) - (MAX_USERS - ntohl(pkt->num_users))*sizeof(struct userinfo);
+ int len = nwho_pkt_size(pkt);
int fd = open(name, O_WRONLY | O_CREAT, 0666);
if (fd < 0)
{
if (r < n ||
pkt.magic != htonl(NWHO_MAGIC) ||
ntohl(pkt.num_users) > MAX_USERS ||
- r != n + ntohl(pkt.num_users)*sizeof(struct userinfo))
+ r < nwho_pkt_size(&pkt))
{
syslog(LOG_WARNING, "Malformed packet from %s", inet_ntoa(sa.sin_addr));
return;
static void
daemonize(void)
{
+ if (do_not_daemonize)
+ return;
+
pid_t pid = fork();
if (pid < 0)
die("Fork failed: %m");
{
now = time(NULL);
make_pkt(&pkt);
- if (send(sock, &pkt, sizeof(pkt) - (MAX_USERS - ntohl(pkt.num_users))*sizeof(struct userinfo), 0) < 0)
+ if (send(sock, &pkt, nwho_pkt_size(&pkt), 0) < 0)
syslog(LOG_ERR, "sendmsg: %m");
sleep(DEFAULT_SEND_TIME);
}
}
+static void
+usage(void)
+{
+ fprintf(stderr, "Usage: nwhod [-d] [<server>]\n");
+ exit(1);
+}
+
int
main(int argc, char **argv)
{
- if (argc == 2)
- client(argv[1]);
- else if (argc == 1)
- server();
- else
+ if (argc == 2 && !strcmp(argv[1], "--version"))
+ {
+ printf("nwho " STRINGIFY(VERSION) "\n");
+ return 0;
+ }
+
+ int opt;
+ while ((opt = getopt(argc, argv, "d")) >= 0)
+ switch (opt)
+ {
+ case 'd':
+ do_not_daemonize = 1;
+ break;
+ default:
+ usage();
+ }
+
+ if (optind == argc-1)
{
- fprintf(stderr, "Usage: nwhod [<server>]\n");
- return 1;
+ if (argv[optind][0])
+ client(argv[optind]);
+ else
+ server();
}
+ else if (optind == argc)
+ server();
+ else
+ usage();
return 0;
}