|
|
1.1 root 1: /* uusnap.c
2: (c) 1992 Heiko W.Rupp [email protected]
3: uusnap is a tool to display the activities of the connected
4: systems.
5:
6: Put a file uusnap.systems in NEWCONFIGDIR (see Makefile), in which
7: the systems, you want to monitor are listed, one on a single line.
8: The sequence of the files there determine the sequence of the
9: listing.
10:
11: At the moment it only works with taylor config and taylor dirs
12:
13: compile it form the Makefile or:
14: cc -c -g -pipe -O -I. -I. -DNEWCONFIGLIB=\"/usr/local/lib/uucp\" uusnap.c
15: cc -o uusnap uusnap.o
16: For this, uusnap.[ch] must be in the same directory as uucp.h and so.
17:
18: uusnap must have read access to SPOOLDIR/.Status in order to work.
19: */
20:
21: #define MAXSYS 30 /* maximum number of systems */
22: #define WAIT_NORMAL 10 /* wait period if noone is talking */
23: #define WAIT_TALKING 2 /* refresh display every second if */
24: /* someone is talking with us */
25:
26: #include "uucp.h"
27: #if USE_RCS_ID
28: char uusnap_rcsid[] = "$Id: uusnap.c,v 1.9 92/05/05 22:51:50 hwr Exp Locker: hwr $";
29: #endif
30:
31: #include <ctype.h>
32: #include <time.h>
33: #include <sys/types.h>
34: #include <sys/dir.h>
35:
36: extern char *ctime(time_t*);
37:
38: struct sysInfo {
39: char sysname[10]; /* name of the system to watch */
40: char *statfile; /* name of its status file */
41: char *spooldir; /* root of its spooldir */
42: int in; /* number of unprocessed in-files */
43: int out; /* number of files to send them */
44: time_t last; /* last poll time */
45: time_t next; /* time of next poll */
46: time_t lastidir; /* time of last in-spooldir access */
47: time_t lastodir; /* time of last outgoing spd acc */
48: time_t laststat; /* time of last status file access */
49: int status; /* status of the system */
50: int num_retries; /* number of retries */
51: };
52:
53: struct sysInfo Systems[MAXSYS];
54:
55:
56: /* I have extend the system status. If time for the specified system
57: is Never, I say so. To get this to work, one also should extend
58: uucico.c. It is not important to do this. With the normal uucico,
59: one only gets no status.
60: */
61:
62: const char *azStatus[] = /* Status codes as defined by uucico */
63: { /* listing them here instead of */
64: "Conversation complete", /* including the appropriate file */
65: "Port unavailable", /* reduces the size of the executable */
66: "Dial failed",
67: "Login failed",
68: "Handshake failed",
69: "Call failed",
70: "Talking",
71: "Wrong time to call",
72: "Time to call = Never !"
73: };
74:
75: main()
76: {
77: int i;
78: i=get_systems();
79: display_info(i);
80:
81: exit(0);
82: }
83:
84: int
85: get_systems()
86: {
87: char filename[1024];
88: char fn[1024];
89: char line[80];
90: FILE *fp;
91: int i=0;
92: int j;
93: struct stat stbuf;
94: struct sysInfo sys;
95:
96: strcpy(filename,NEWCONFIGLIB);
97: strcat(filename,"/uusnap.systems");
98: if ((fp=fopen(filename,"r"))!=NULL) {
99: while (fgets(line,80,fp)!=NULL) {
100: *(rindex(line,'\n'))='\0';
101: strcpy(sys.sysname,line); /* get the name of the system */
102: strcpy(fn,SPOOLDIR); /* get the name of the statusfile */
103: strcat(fn,"/.Status/");
104: strcat(fn,line);
105: sys.statfile=malloc(strlen(fn)+1);
106: strcpy(sys.statfile,fn);
107: strcpy(fn,SPOOLDIR); /* get the name of the spooldir */
108: strcat(fn,"/");
109: strcat(fn,line);
110: sys.spooldir=malloc(strlen(fn)+1);
111: strcpy(sys.spooldir,fn);
112: sys.laststat=0;
113: sys.lastidir=sys.lastodir=0;
114: Systems[i]=sys; /* get_stat_for_system needs it */
115: get_stat_for_system(i); /* now get the system status */
116: get_inq_num(i,TRUE); /* number of unprocessed files */
117: get_outq_num(i,TRUE); /* number of files to send */
118: i++;
119: }
120: fclose(fp);
121: }
122: else {
123: fprintf(stderr,"Can't open %s \n",filename);
124: exit(1);
125: }
126: return i;
127: }
128:
129:
130:
131: display_info(int numSys)
132: {
133: char *filename;
134: int sysnum;
135: FILE *fp;
136: char contentline[80];
137: char isTalking=FALSE;
138: struct stat stbuf;
139: struct sysInfo sys;
140: time_t time;
141:
142: filename = (char*)malloc(1024);
143: if (filename == NULL) {
144: fprintf(stderr, "Can't malloc 1024 bytes");
145: exit(1);
146: }
147:
148: while(TRUE) {
149: display_headline();
150: for (sysnum=0;sysnum<numSys;sysnum++) {
151: sys = Systems[sysnum];
152: stat(sys.statfile,&stbuf);
153: if ((time=stbuf.st_atime) > sys.laststat) {
154: get_stat_for_system(sysnum);
155: }
156: if(display_status_line(sysnum)==1)
157: isTalking=TRUE;
158: }
159: if (isTalking) {
160: sleep(WAIT_TALKING);
161: isTalking = FALSE;
162: }
163: else
164: sleep(WAIT_NORMAL); /* wait a bit */
165: }
166: return 0;
167: }
168:
169: int
170: display_status_line(int sn)
171: {
172: char *time_s;
173:
174: int sys_stat,num_retries,wait;
175: int i;
176: time_t last_time;
177: time_t next_time;
178:
179: struct sysInfo sys;
180:
181: sys = Systems[sn];
182:
183: printf("%10s ",sys.sysname);
184: get_inq_num(sn);
185: if (sys.in==0)
186: printf(" ");
187: else
188: printf("%3d ",sys.in);
189: get_outq_num(sn);
190: if (sys.out==0)
191: printf(" ");
192: else
193: printf("%3d ",sys.out);
194: time_s = ctime(&sys.last);
195: time_s = time_s + 11;
196: *(time_s+8)='\0';
197: printf("%8s ",time_s); /* time of last poll */
198: time_s = ctime(&sys.next);
199: time_s = time_s + 11;
200: *(time_s+8)='\0';
201: if (sys.last == sys.next)
202: printf(" ");
203: else
204: printf("%8s ",time_s); /* time of next poll */
205: if (sys.num_retries==0)
206: printf(" ");
207: else
208: printf("%2d ",sys.num_retries);
209: if (sys_stat==6) /* system is talking */
210: printf("\E[7m"); /* reverse video on */
211: printf("%s",azStatus[sys.status]);
212: if (sys.status==6) {
213: printf("\E[m\n"); /* reverse video off */
214: return 1;
215: }
216: else {
217: printf("\n");
218: return 0;
219: }
220: }
221:
222:
223: display_headline()
224: {
225: printf("\E[;H\E[2J"); /* clear screen */
226: printf("\E[7muusnap (press CTRL-C to escape)\E[m \n\n");
227: printf(" System #in #out last next #ret Status\n");
228: return 0;
229: }
230:
231: get_inq_num(int num,char firstTime)
232: {
233: int i=0;
234: char filename[1024];
235: struct stat stbuf;
236: DIR *dirp;
237:
238: strcpy(filename,Systems[num].spooldir);
239: strcat(filename,"/X./.");
240: stat(filename,&stbuf);
241: if ((stbuf.st_mtime > Systems[num].lastidir) || (firstTime)) {
242: if ((dirp=opendir(filename))!=NULL) {
243: while(readdir(dirp))
244: i++;
245: closedir(dirp);
246: stat(filename,&stbuf);
247: Systems[num].lastidir=stbuf.st_mtime;
248: }
249: else {
250: fprintf(stderr,"Can't open %s \n",filename);
251: exit(1);
252: }
253: if (i>=2)
254: i-=2; /* correct . and .. */
255: Systems[num].in=i;
256: }
257: return 0;
258: }
259:
260: get_outq_num(int sys,char firstTime)
261: {
262: int i=0;
263: char filename[1024];
264: struct stat stbuf;
265: DIR *dirp;
266:
267: strcpy(filename,Systems[sys].spooldir);
268: strcat(filename,"/C./.");
269: stat(filename,&stbuf);
270: if ((stbuf.st_mtime > Systems[sys].lastodir) || (firstTime)) {
271: if ((dirp=opendir(filename))!=NULL) {
272: while(readdir(dirp))
273: i++;
274: closedir(dirp);
275: stat(filename,&stbuf);
276: Systems[sys].lastodir=stbuf.st_mtime;
277: }
278: else {
279: fprintf(stderr,"Can't open %s \n",filename);
280: exit(1);
281: }
282: if (i>=2)
283: i-=2; /* correct . and .. */
284: Systems[sys].out=i;
285: }
286: return 0;
287: }
288:
289: get_stat_for_system(int i)
290: {
291: char fn[80];
292: struct sysInfo sys;
293: struct stat stbuf;
294: FILE *fp;
295: time_t wait;
296:
297: sys = Systems[i];
298: stat(sys.statfile,&stbuf);
299: if (stbuf.st_atime > sys.laststat) {
300: if ((fp=fopen(sys.statfile,"r"))!=NULL) {
301: fgets(fn,80,fp);
302: fclose(fp);
303: sscanf(fn,"%d %d %ld %d",
304: &sys.status,
305: &sys.num_retries,
306: &sys.last,
307: &wait);
308: sys.next=sys.last+wait;
309: }
310: else {
311: sys.status=0;
312: sys.num_retries=0;
313: sys.last=0;
314: sys.next=0;
315: }
316: stat(sys.statfile,&stbuf);
317: sys.laststat=stbuf.st_atime;
318: }
319: Systems[i] = sys;
320: return 0;
321: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.