113672Ssam #ifndef lint 2*18622Sralph static char sccsid[] = "@(#)systat.c 5.3 (Berkeley) 04/10/85"; 313672Ssam #endif 413672Ssam 513672Ssam #include "uucp.h" 613672Ssam 713672Ssam extern time_t time(); 813672Ssam 917838Sralph #define STATNAME(f, n) sprintf(f, "%s/%s/%.7s", Spool, "STST", n) 1013672Ssam #define S_SIZE 100 1113672Ssam 12*18622Sralph /* 13*18622Sralph * make system status entry 1413672Ssam * return codes: none 1513672Ssam */ 1613672Ssam systat(name, type, text) 1713672Ssam char *name, *text; 1813672Ssam int type; 1913672Ssam { 2013672Ssam char filename[MAXFULLNAME], line[S_SIZE]; 2117838Sralph int count, oldtype; 2213672Ssam register FILE *fp; 2317838Sralph time_t prestime, rtry; 2413672Ssam 2513672Ssam if (type == 0) 2613672Ssam return; 2713672Ssam line[0] = '\0'; 2813672Ssam time(&prestime); 2913672Ssam count = 0; 3013672Ssam STATNAME(filename, name); 3113672Ssam 3213672Ssam fp = fopen(filename, "r"); 3313672Ssam if (fp != NULL) { 3413672Ssam fgets(line, S_SIZE, fp); 3517838Sralph sscanf(line, "%d %d", &oldtype, &count); 3613672Ssam if (count <= 0) 3713672Ssam count = 0; 3813672Ssam fclose(fp); 3917838Sralph /* If merely 'wrong time', don't change existing STST */ 4017838Sralph if (type == SS_WRONGTIME && oldtype != SS_INPROGRESS) 4117838Sralph return; 4213672Ssam } 4313672Ssam 4417838Sralph rtry = Retrytime; 4517838Sralph /* if failures repeat, don't try so often, 4617838Sralph * to forstall a 'MAX RECALLS' situation. 4717838Sralph */ 4817838Sralph if (type == SS_FAIL) { 4913672Ssam count++; 5017838Sralph if (count > 5) { 5117838Sralph rtry = rtry * (count-5); 5217838Sralph if (rtry > ONEDAY/2) 5317838Sralph rtry = ONEDAY/2; 5417838Sralph } 5517838Sralph } 5613672Ssam 5717838Sralph 5817838Sralph #ifdef VMS 5917838Sralph unlink(filename); 6017838Sralph #endif VMS 6113672Ssam fp = fopen(filename, "w"); 6217838Sralph ASSERT(fp != NULL, "SYSTAT OPEN FAIL", filename, 0); 6317838Sralph fprintf(fp, "%d %d %ld %ld %s %s\n", type, count, prestime, rtry, text, name); 6413672Ssam fclose(fp); 6513672Ssam return; 6613672Ssam } 6713672Ssam 6813672Ssam /*** 6913672Ssam * rmstat(name) remove system status entry 7013672Ssam * char *name; 7113672Ssam * 7213672Ssam * return codes: none 7313672Ssam */ 7413672Ssam 7513672Ssam rmstat(name) 7613672Ssam char *name; 7713672Ssam { 7813672Ssam char filename[MAXFULLNAME]; 7913672Ssam 8013672Ssam STATNAME(filename, name); 8113672Ssam unlink(filename); 8213672Ssam } 8313672Ssam 8413672Ssam /*** 8513672Ssam * callok(name) check system status for call 8613672Ssam * char *name; 8713672Ssam * 8813672Ssam * return codes 0 - ok | >0 system status 8913672Ssam */ 9013672Ssam 9113672Ssam callok(name) 9213672Ssam char *name; 9313672Ssam { 9413672Ssam char filename[MAXFULLNAME], line[S_SIZE]; 9513672Ssam register FILE *fp; 9617838Sralph time_t lasttime, prestime, retrytime; 9717838Sralph long t1, t2; 9813672Ssam int count, type; 9913672Ssam 10013672Ssam STATNAME(filename, name); 10113672Ssam fp = fopen(filename, "r"); 10213672Ssam if (fp == NULL) 10313672Ssam return(SS_OK); 10413672Ssam 10513672Ssam if (fgets(line, S_SIZE, fp) == NULL) { 10613672Ssam /* no data */ 10713672Ssam fclose(fp); 10813672Ssam unlink(filename); 10913672Ssam return(SS_OK); 11013672Ssam } 11113672Ssam 11213672Ssam fclose(fp); 11313672Ssam time(&prestime); 11417838Sralph sscanf(line, "%d%d%ld%ld", &type, &count, &t1, &t2); 11517838Sralph lasttime = t1; 11617838Sralph retrytime = t2; 11713672Ssam 11813672Ssam switch(type) { 11913672Ssam case SS_BADSEQ: 12013672Ssam case SS_CALLBACK: 12113672Ssam case SS_NODEVICE: 12213672Ssam case SS_INPROGRESS: /*let LCK take care of it */ 12313672Ssam return(SS_OK); 12413672Ssam 12513672Ssam case SS_FAIL: 12613672Ssam if (count > MAXRECALLS) { 12713672Ssam logent("MAX RECALLS", "NO CALL"); 12813672Ssam DEBUG(4, "MAX RECALL COUNT %d\n", count); 12917838Sralph if (Debug) { 13017838Sralph logent("debugging", "continuing anyway"); 13117838Sralph return SS_OK; 13217838Sralph } 13317838Sralph return type; 13413672Ssam } 13513672Ssam 13613672Ssam if (prestime - lasttime < retrytime) { 13713672Ssam logent("RETRY TIME NOT REACHED", "NO CALL"); 13817838Sralph DEBUG(4, "RETRY TIME (%ld) NOT REACHED\n", retrytime); 13917838Sralph if (Debug) { 14017838Sralph logent("debugging", "continuing anyway"); 14117838Sralph return SS_OK; 14217838Sralph } 14317838Sralph return type; 14413672Ssam } 14513672Ssam 14617838Sralph return SS_OK; 14713672Ssam default: 14817838Sralph return SS_OK; 14913672Ssam } 15013672Ssam } 151