BSD 3 development
[unix-history] / usr / src / cmd / uucp / systat.c
CommitLineData
16de3b80
BJ
1#include "uucp.h"
2#include <sys/types.h>
3
4#define STATNAME(f, n) sprintf(f, "%s/%s.%.7s", Spool, "STST", n)
5#define S_SIZE 100
6
7/*******
8 * systat(name, type, text) make system status entry
9 * char *name, *text;
10 * int type.
11 *
12 * return codes: none
13 */
14
15systat(name, type, text)
16char *name, *text;
17int type;
18{
19 char filename[MAXFULLNAME], line[S_SIZE];
20 int count;
21 FILE *fp;
22 time_t prestime;
23
24 if (type == 0)
25 return;
26 line[0] = '\0';
27 time(&prestime);
28 count = 0;
29 STATNAME(filename, name);
30
31 fp = fopen(filename, "r");
32 if (fp != NULL) {
33 fgets(line, S_SIZE, fp);
34 sscanf(&line[2], "%d", &count);
35 if (count <= 0)
36 count = 0;
37 fclose(fp);
38 }
39
40 if (type == SS_FAIL)
41 count++;
42
43 fp = fopen(filename, "w");
44 ASSERT(fp != NULL, "SYSTAT OPEN FAIL %s", "");
45 chmod(filename, 0666);
46 fprintf(fp, "%d %d %D %s %s\n", type, count, prestime, text, name);
47 fclose(fp);
48 return;
49}
50
51/***
52 * rmstat(name) remove system status entry
53 * char *name;
54 *
55 * return codes: none
56 */
57
58rmstat(name)
59char *name;
60{
61 char filename[MAXFULLNAME];
62
63 STATNAME(filename, name);
64 unlink(filename);
65}
66
67/***
68 * callok(name) check system status for call
69 * char *name;
70 *
71 * return codes 0 - ok | >0 system status
72 */
73
74callok(name)
75char *name;
76{
77 char filename[MAXFULLNAME], line[S_SIZE];
78 FILE *fp;
79 time_t lasttime, prestime;
80 int count, type;
81
82 STATNAME(filename, name);
83 fp = fopen(filename, "r");
84 if (fp == NULL)
85 return(SS_OK);
86
87 if (fgets(line, S_SIZE, fp) == NULL) {
88 /* no data */
89 fclose(fp);
90 unlink(filename);
91 return(SS_OK);
92 }
93
94 fclose(fp);
95 time(&prestime);
96 sscanf(line, "%d%d%D", &type, &count, &lasttime);
97
98 switch(type) {
99 case SS_BADSEQ:
100 case SS_CALLBACK:
101 return(SS_OK);
102 case SS_NODEVICE:
103 return(SS_OK);
104
105 case SS_INPROGRESS:
106 if (prestime - lasttime < INPROGTIME) {
107 DEBUG(4, "CALL IN PROGRESS %s\n", "");
108 return(type);
109 }
110 else
111 return(SS_OK);
112
113
114 case SS_FAIL:
115 if (count > MAXRECALLS) {
116 logent("MAX RECALLS", "NO CALL");
117 DEBUG(4, "MAX RECALL COUNT %d\n", count);
118 return(type);
119 }
120
121 if (prestime - lasttime < RETRYTIME) {
122 logent("RETRY TIME NOT REACHED", "NO CALL");
123 DEBUG(4, "RETRY TIME (%d) NOT REACHED\n", RETRYTIME);
124 return(type);
125 }
126
127 return(SS_OK);
128 default:
129 return(SS_OK);
130 }
131}