]> mj.ucw.cz Git - nwho.git/blob - nwho.c
Use <inttypes.h> instead of <asm/types.h>
[nwho.git] / nwho.c
1 /*
2  *      The Remote User Information Lister
3  *
4  *      (c) 1997--2010 Martin Mares <mj@ucw.cz>
5  *
6  *      This software may be freely distributed and used according to the terms
7  *      of the GNU General Public License. See file COPYING in any of the GNU packages.
8  */
9
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include <fcntl.h>
14 #include <unistd.h>
15 #include <dirent.h>
16 #include <time.h>
17 #include <netinet/in.h>
18
19 #include "net.h"
20
21 static int is_uptime;
22 static time_t now;
23
24 static void
25 puttime(int s)
26 {
27   int d, h, m;
28   if (s < 100)
29     printf("%4ds", s);
30   else
31     {
32       m = s/60;
33       s %= 60;
34       h = m/60;
35       m %= 60;
36       if (h < 100)
37         printf("%02d.%02d", h, m);
38       else
39         {
40           d = h/24;
41           h %= 24;
42           if (d < 100)
43             printf("%2dd%02d", d, h);
44           else
45             printf("%4dd", d);
46         }
47     }
48 }
49
50 static void
51 show_uptime(char *name, struct rywho_pkt *p)
52 {
53   int i;
54
55   if (now - ntohl(p->server_time) >= DEFAULT_DOWN_TIME)
56     {
57       printf("%-16s down\n", name);
58       return;
59     }
60   printf("%-16s up ", name);
61   puttime(ntohl(p->uptime));
62   printf("  load");
63   for(i=0; i<3; i++)
64     {
65       int l = ntohl(p->avl[i]);
66       printf(" %2d.%02d", l/100, l%100);
67     }
68   printf(" %3d users\n", (int) ntohl(p->num_users));
69 }
70
71 static void
72 show_users(char *name, struct rywho_pkt *p)
73 {
74   int u;
75   int m = ntohl(p->num_users);
76   struct userinfo *i;
77
78   if (now - ntohl(p->server_time) >= DEFAULT_DOWN_TIME)
79     return;
80   for(u=0; u<m; u++)
81     {
82       i = &p->users[u];
83       printf("%-8.8s %-7s %c %-16s ", i->name, i->con, (i->mesg_y ? ' ' : '-'), name);
84       puttime(ntohl(i->login_time));
85       putchar(' ');
86       puttime(ntohl(i->idle_time));
87       putchar('\n');
88     }
89   if (m == MAX_USERS)
90     printf("%s: MAX_USERS reached!\n", name);
91 }
92
93 static void
94 scan(void)
95 {
96   DIR *d;
97   struct dirent *e;
98   struct rywho_pkt pkt;
99   int fd, r;
100   int is = 0;
101
102   if (chdir(NWHO_SPOOL_DIR) < 0)
103     {
104       fprintf(stderr, "chdir(" NWHO_SPOOL_DIR "): %m\n");
105       exit(1);
106     }
107   d = opendir(".");
108   if (!d)
109     {
110       perror("opendir");
111       exit(1);
112     }
113   while (e = readdir(d))
114     if (e->d_name[0] != '.')
115       {
116         fd = open(e->d_name, O_RDONLY);
117         if (fd < 0)
118           {
119             fprintf(stderr, "%s: %m\n", e->d_name);
120             continue;
121           }
122         r = read(fd, &pkt, sizeof(pkt));
123         close(fd);
124         if (r < sizeof(struct rywho_pkt) - MAX_USERS*sizeof(struct userinfo)
125             || pkt.magic != htonl(NWHO_MAGIC)
126             || r != sizeof(struct rywho_pkt) - (MAX_USERS - ntohl(pkt.num_users))*sizeof(struct userinfo))
127           {
128             fprintf(stderr, "%s: Malformed record\n", e->d_name);
129             continue;
130           }
131         (is_uptime ? show_uptime : show_users)(e->d_name, &pkt);
132         is = 1;
133       }
134   closedir(d);
135   if (!is)
136     puts("No data available.");
137 }
138
139 int
140 main(int argc, char **argv)
141 {
142   if (strstr(argv[0], "uptime"))
143     is_uptime = 1;
144   if (argc != 1)
145     {
146       fprintf(stderr, "Usage: %s\n", argv[0]);
147       return 1;
148     }
149   if (!is_uptime)
150     puts("Name     Li      M Where            LogT  IdleT");
151   now = time(NULL);
152   scan();
153   return 0;
154 }