1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
23 /* All Rights Reserved */
24
25
26 #ident "%Z%%M% %I% %E% SMI" /* from SVR4 bnu:systat.c 2.7 */
27
28 #include "uucp.h"
29
30 #define STATNAME(f, n) ((void)sprintf(f, "%s/%s", STATDIR, n))
31 #define S_SIZE 100
32
33 /*
34 * make system status entry
35 * name -> system name
36 * text -> text string to read
37 * type -> ?
38 * return:
39 * none
40 */
41 void
systat(name,type,text,retry)42 systat(name, type, text, retry)
43 register int type;
44 char *name, *text;
45 long retry;
46 {
47 register FILE *fp;
48 int count;
49 char filename[MAXFULLNAME], line[S_SIZE];
50 time_t prestime;
51 long presretry = 0;
52 char *vec[5];
53
54 line[0] = '\0';
55 (void) time(&prestime);
56 count = 0;
57 STATNAME(filename, name);
58
59 fp = fopen(filename, "r");
60 if (fp != NULL) {
61 if (fgets(line, S_SIZE, fp) != NULL)
62 if (getargs(line, vec, 4) == 4) {
63 count = atoi(vec[1]);
64 presretry = atol(vec[3]);
65 }
66 if (count <= 0)
67 count = 0;
68 fclose(fp);
69 }
70
71 switch (type) {
72 /* if there is already a status file - don't change */
73 case SS_TIME_WRONG:
74 case SS_LOCKED_DEVICE:
75 case SS_CANT_ACCESS_DEVICE:
76 if (count > 1)
77 return;
78 break;
79
80 /* reset count on successful call */
81 case SS_OK:
82 case SS_INPROGRESS:
83 case SS_CONVERSATION: /* failure during conversation - contact ok */
84 retry = 0;
85 count = 0;
86 break;
87
88 /* Startup failure means protocol mismatch--some administrative
89 * action must be taken
90 */
91 case SS_STARTUP:
92 retry = MAXRETRYTIME;
93 count = 0;
94 break;
95 default: /* increment count and set up retry time */
96 count++;
97 if (!retry) { /* use exponential backoff */
98 if (presretry < RETRYTIME)
99 retry = RETRYTIME;
100 else {
101 retry = presretry + presretry;
102 if (retry > MAXRETRYTIME)
103 retry = MAXRETRYTIME;
104 }
105 }
106 else { /* use specified time */
107 if (retry < RETRYTIME)
108 retry = RETRYTIME;
109 }
110 break;
111 }
112
113 fp = fopen(filename, "w");
114 /* can't ASSERT since assert() calls systat() */
115 if (fp == NULL) {
116 errent(Ct_OPEN, filename, errno, __FILE__, __LINE__);
117 cleanup(FAIL);
118 }
119 (void) chmod(filename, PUB_FILEMODE);
120 (void) fprintf(fp, "%d %d %ld %ld %s %s\n",
121 type, count, prestime, retry, text, name);
122 (void) fclose(fp);
123 return;
124 }
125
126 /*
127 * check system status for call
128 * name -> system to check
129 * return:
130 * 0 -> ok
131 * >0 -> system status
132 */
133 int
callok(name)134 callok(name)
135 char *name;
136 {
137 register FILE *fp;
138 register int t;
139 long retrytime;
140 int count, type;
141 char filename[MAXFULLNAME], line[S_SIZE];
142 time_t lasttime, prestime;
143
144 STATNAME(filename, name);
145 fp = fopen(filename, "r");
146 if (fp == NULL)
147 return(SS_OK);
148
149 if (fgets(line, S_SIZE, fp) == NULL) {
150
151 /* no data */
152 fclose(fp);
153 (void) unlink(filename);
154 return(SS_OK);
155 }
156
157 fclose(fp);
158 (void) time(&prestime);
159 sscanf(line, "%d%d%ld%ld", &type, &count, &lasttime, &retrytime);
160 t = type;
161
162 switch(t) {
163 case SS_SEQBAD:
164 case SS_LOGIN_FAILED:
165 case SS_DIAL_FAILED:
166 case SS_BAD_LOG_MCH:
167 case SS_BADSYSTEM:
168 case SS_CANT_ACCESS_DEVICE:
169 case SS_WRONG_MCH:
170 case SS_RLOCKED:
171 case SS_RUNKNOWN:
172 case SS_RLOGIN:
173 case SS_UNKNOWN_RESPONSE:
174 case SS_CHAT_FAILED:
175 case SS_CALLBACK_LOOP:
176
177 if (prestime - lasttime < retrytime) {
178 logent("RETRY TIME NOT REACHED", "NO CALL");
179 CDEBUG(4, "RETRY TIME (%ld) NOT REACHED\n", retrytime);
180 return(type);
181 }
182
183 return(SS_OK);
184 default:
185 return(SS_OK);
186 }
187 }
188