]> mj.ucw.cz Git - nwho.git/blobdiff - nwhod.c
Fixed calculation of idle time (only atime should be used)
[nwho.git] / nwhod.c
diff --git a/nwhod.c b/nwhod.c
index 8d98bc8dd5831564fb6f6b73cf6927891f51851c..5d0cee02fae186192658bf61d73da082bef5f040 100644 (file)
--- a/nwhod.c
+++ b/nwhod.c
@@ -20,7 +20,6 @@
 #include <utmp.h>
 #include <signal.h>
 #include <dirent.h>
-#include <asm/types.h>
 #include <errno.h>
 
 #include "net.h"
@@ -59,31 +58,31 @@ net_init(char *name)
   if (name)
     {
       if (! (h = gethostbyname(name)))
-       die("%s: %m", name);
+       die("Failed to resolve %s", name);
     }
   else
     h = NULL;
 
   sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
   if (sock < 0)
-    die("socket: %m");
+    die("Cannot create socket: %m");
 
   sa.sin_family = AF_INET;
   sa.sin_port = port = htons(NWHO_PORT);
   sa.sin_addr.s_addr = INADDR_ANY;
   if (bind(sock, (struct sockaddr *) &sa, sizeof(sa)) < 0)
-    die("bind: %m");
+    die("Cannot bind to UDP port %d: %m", NWHO_PORT);
 
   if (h)
     {
       memcpy(&sa.sin_addr.s_addr, h->h_addr, sizeof(sa.sin_addr.s_addr));
       if (connect(sock, (struct sockaddr *) &sa, sizeof(sa)) < 0)
-       die("connect: %m");
+       die("Cannot connect socket: %m");
     }
 }
 
 static void
-scan_utmp(struct rywho_pkt *p, time_t now)
+scan_utmp(struct nwho_pkt *p, time_t now)
 {
   struct utmp *u;
   int cnt = 0;
@@ -108,10 +107,6 @@ scan_utmp(struct rywho_pkt *p, time_t now)
          continue;
        h->mesg_y = !!(S_IWGRP & st.st_mode);
        last = st.st_atime;
-       if (st.st_mtime > last)
-         last = st.st_mtime;
-       if (st.st_ctime > last)
-         last = st.st_ctime;
        if (now < last)
          last = now;
        h->idle_time = htonl(now - last);
@@ -121,7 +116,7 @@ scan_utmp(struct rywho_pkt *p, time_t now)
 }
 
 static void
-scan_load(struct rywho_pkt *p)
+scan_load(struct nwho_pkt *p)
 {
   int n, i, j[6];
   char buf[256];
@@ -150,7 +145,7 @@ scan_load(struct rywho_pkt *p)
 }
 
 static void
-make_pkt(struct rywho_pkt *pkt)
+make_pkt(struct nwho_pkt *pkt)
 {
   bzero(pkt, sizeof(pkt));
   pkt->magic = htonl(NWHO_MAGIC);
@@ -175,7 +170,7 @@ cleanup(void)
 }
 
 static void
-save_pkt(char *name, struct rywho_pkt *pkt, int len)
+save_pkt(char *name, struct nwho_pkt *pkt, int len)
 {
   int fd = open(name, O_WRONLY | O_CREAT, 0666);
   if (fd < 0)
@@ -199,16 +194,16 @@ is_valid(u32 ipa)
 static void
 receive(void)
 {
-  int r, al;
-  struct rywho_pkt pkt;
+  int r;
+  struct nwho_pkt pkt;
   struct sockaddr_in sa;
-  int n = sizeof(struct rywho_pkt) - MAX_USERS * sizeof(struct userinfo);
+  socklen_t al = sizeof(sa);
+  int n = sizeof(struct nwho_pkt) - MAX_USERS * sizeof(struct userinfo);
   struct hostrec *e;
   struct hostent *h;
   char *c;
 
   alarm(DEFAULT_PRUNE_TIME);
-  al = sizeof(sa);
   r = recvfrom(sock, &pkt, sizeof(pkt), 0, (struct sockaddr *) &sa, &al);
   alarm(0);
   now = time(NULL);
@@ -280,7 +275,7 @@ receive(void)
 static void
 local_scan(void)
 {
-  struct rywho_pkt pkt;
+  struct nwho_pkt pkt;
   static char hostname[64];
 
   make_pkt(&pkt);
@@ -311,6 +306,12 @@ do_tick(void)
 static void
 daemonize(void)
 {
+  pid_t pid = fork();
+  if (pid < 0)
+    die("Fork failed: %m");
+  if (pid)
+    exit(0);
+
   close(0);
   close(1);
   close(2);
@@ -349,7 +350,7 @@ server(void)
 static void
 client(char *serv)
 {
-  struct rywho_pkt pkt;
+  struct nwho_pkt pkt;
 
   net_init(serv);
   utmpname(UTMP_FILE);
@@ -367,24 +368,14 @@ client(char *serv)
 int
 main(int argc, char **argv)
 {
-  int pid;
-
-  if (argc != 1 && argc != 2)
-    {
-      fprintf(stderr, "Usage: nwhod [<server>]\n");
-      return 1;
-    }
-  pid = fork();
-  if (pid < 0)
-    {
-      perror("fork");
-      return 1;
-    }
-  if (pid)
-    return 0;
   if (argc == 2)
     client(argv[1]);
   else if (argc == 1)
     server();
-  return 1;
+  else
+    {
+      fprintf(stderr, "Usage: nwhod [<server>]\n");
+      return 1;
+    }
+  return 0;
 }