113672Ssam #ifndef lint 2*23675Sbloom static char sccsid[] = "@(#)systat.c 5.4 (Berkeley) 06/23/85"; 313672Ssam #endif 413672Ssam 513672Ssam #include "uucp.h" 613672Ssam 7*23675Sbloom #define STATNAME(f, n) sprintf(f, "%s/%s/%s", Spool, "STST", n) 813672Ssam #define S_SIZE 100 913672Ssam 10*23675Sbloom /*LINTLIBRARY*/ 11*23675Sbloom 1218622Sralph /* 1318622Sralph * 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 84*23675Sbloom /* 85*23675Sbloom * check system status for call 8613672Ssam * 8713672Ssam * return codes 0 - ok | >0 system status 8813672Ssam */ 8913672Ssam 9013672Ssam callok(name) 9113672Ssam char *name; 9213672Ssam { 9313672Ssam char filename[MAXFULLNAME], line[S_SIZE]; 9413672Ssam register FILE *fp; 9517838Sralph time_t lasttime, prestime, retrytime; 9617838Sralph long t1, t2; 9713672Ssam int count, type; 9813672Ssam 9913672Ssam STATNAME(filename, name); 10013672Ssam fp = fopen(filename, "r"); 10113672Ssam if (fp == NULL) 10213672Ssam return(SS_OK); 10313672Ssam 10413672Ssam if (fgets(line, S_SIZE, fp) == NULL) { 10513672Ssam /* no data */ 10613672Ssam fclose(fp); 10713672Ssam unlink(filename); 10813672Ssam return(SS_OK); 10913672Ssam } 11013672Ssam 11113672Ssam fclose(fp); 11213672Ssam time(&prestime); 11317838Sralph sscanf(line, "%d%d%ld%ld", &type, &count, &t1, &t2); 11417838Sralph lasttime = t1; 11517838Sralph retrytime = t2; 11613672Ssam 11713672Ssam switch(type) { 11813672Ssam case SS_BADSEQ: 11913672Ssam case SS_CALLBACK: 12013672Ssam case SS_NODEVICE: 12113672Ssam case SS_INPROGRESS: /*let LCK take care of it */ 12213672Ssam return(SS_OK); 12313672Ssam 12413672Ssam case SS_FAIL: 12513672Ssam if (count > MAXRECALLS) { 12613672Ssam logent("MAX RECALLS", "NO CALL"); 12713672Ssam DEBUG(4, "MAX RECALL COUNT %d\n", count); 12817838Sralph if (Debug) { 12917838Sralph logent("debugging", "continuing anyway"); 13017838Sralph return SS_OK; 13117838Sralph } 13217838Sralph return type; 13313672Ssam } 13413672Ssam 13513672Ssam if (prestime - lasttime < retrytime) { 13613672Ssam logent("RETRY TIME NOT REACHED", "NO CALL"); 13717838Sralph DEBUG(4, "RETRY TIME (%ld) NOT REACHED\n", retrytime); 13817838Sralph if (Debug) { 13917838Sralph logent("debugging", "continuing anyway"); 14017838Sralph return SS_OK; 14117838Sralph } 14217838Sralph return type; 14313672Ssam } 14413672Ssam 14517838Sralph return SS_OK; 14613672Ssam default: 14717838Sralph return SS_OK; 14813672Ssam } 14913672Ssam } 150