113672Ssam #ifndef lint 2*33957Srick static char sccsid[] = "@(#)systat.c 5.5 (Berkeley) 04/05/88"; 313672Ssam #endif 413672Ssam 513672Ssam #include "uucp.h" 613672Ssam 723675Sbloom #define STATNAME(f, n) sprintf(f, "%s/%s/%s", Spool, "STST", n) 813672Ssam #define S_SIZE 100 913672Ssam 1023675Sbloom /*LINTLIBRARY*/ 1123675Sbloom 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"); 62*33957Srick if (fp == NULL) { 63*33957Srick syslog(LOG_ERR, "fopen(%s) failed: %m", filename); 64*33957Srick cleanup(FAIL); 65*33957Srick } 6617838Sralph fprintf(fp, "%d %d %ld %ld %s %s\n", type, count, prestime, rtry, text, name); 6713672Ssam fclose(fp); 6813672Ssam } 6913672Ssam 70*33957Srick /* 71*33957Srick * remove system status entry 7213672Ssam * 7313672Ssam * return codes: none 7413672Ssam */ 7513672Ssam rmstat(name) 7613672Ssam char *name; 7713672Ssam { 7813672Ssam char filename[MAXFULLNAME]; 7913672Ssam 8013672Ssam STATNAME(filename, name); 8113672Ssam unlink(filename); 8213672Ssam } 8313672Ssam 8423675Sbloom /* 8523675Sbloom * check system status for call 8613672Ssam * 8713672Ssam * return codes 0 - ok | >0 system status 8813672Ssam */ 8913672Ssam callok(name) 9013672Ssam char *name; 9113672Ssam { 9213672Ssam char filename[MAXFULLNAME], line[S_SIZE]; 9313672Ssam register FILE *fp; 9417838Sralph time_t lasttime, prestime, retrytime; 9517838Sralph long t1, t2; 9613672Ssam int count, type; 9713672Ssam 9813672Ssam STATNAME(filename, name); 9913672Ssam fp = fopen(filename, "r"); 10013672Ssam if (fp == NULL) 10113672Ssam return(SS_OK); 10213672Ssam 10313672Ssam if (fgets(line, S_SIZE, fp) == NULL) { 10413672Ssam /* no data */ 10513672Ssam fclose(fp); 10613672Ssam unlink(filename); 10713672Ssam return(SS_OK); 10813672Ssam } 10913672Ssam 11013672Ssam fclose(fp); 11113672Ssam time(&prestime); 11217838Sralph sscanf(line, "%d%d%ld%ld", &type, &count, &t1, &t2); 11317838Sralph lasttime = t1; 11417838Sralph retrytime = t2; 11513672Ssam 11613672Ssam switch(type) { 11713672Ssam case SS_BADSEQ: 11813672Ssam case SS_CALLBACK: 11913672Ssam case SS_NODEVICE: 12013672Ssam case SS_INPROGRESS: /*let LCK take care of it */ 12113672Ssam return(SS_OK); 12213672Ssam 12313672Ssam case SS_FAIL: 12413672Ssam if (count > MAXRECALLS) { 12513672Ssam logent("MAX RECALLS", "NO CALL"); 12613672Ssam DEBUG(4, "MAX RECALL COUNT %d\n", count); 12717838Sralph if (Debug) { 12817838Sralph logent("debugging", "continuing anyway"); 12917838Sralph return SS_OK; 13017838Sralph } 13117838Sralph return type; 13213672Ssam } 13313672Ssam 13413672Ssam if (prestime - lasttime < retrytime) { 13513672Ssam logent("RETRY TIME NOT REACHED", "NO CALL"); 13617838Sralph DEBUG(4, "RETRY TIME (%ld) NOT REACHED\n", retrytime); 13717838Sralph if (Debug) { 13817838Sralph logent("debugging", "continuing anyway"); 13917838Sralph return SS_OK; 14017838Sralph } 14117838Sralph return type; 14213672Ssam } 14313672Ssam 14417838Sralph return SS_OK; 14513672Ssam default: 14617838Sralph return SS_OK; 14713672Ssam } 14813672Ssam } 149