113655Ssam #ifndef lint 2*17835Sralph static char sccsid[] = "@(#)gnxseq.c 5.3 (Berkeley) 01/22/85"; 313655Ssam #endif 413655Ssam 513655Ssam #include "uucp.h" 613655Ssam #include <sys/types.h> 7*17835Sralph #ifdef BSD4_2 813706Ssam #include <sys/time.h> 9*17835Sralph #else sane 10*17835Sralph #include <time.h> 11*17835Sralph #endif sane 1213655Ssam 13*17835Sralph #ifdef GNXSEQ 14*17835Sralph 1513655Ssam extern time_t time(); 1613655Ssam 1713655Ssam /******* 1813655Ssam * gnxseq(rmtname) get next conversation sequence number 1913655Ssam * char *rmtname; 2013655Ssam * 2113655Ssam * return - 0 no entry | >0 sequence number 2213655Ssam */ 2313655Ssam 2413655Ssam gnxseq(rmtname) 2513655Ssam char *rmtname; 2613655Ssam { 2713655Ssam int count = 0, ct, ret, i; 2813655Ssam register struct tm *tp; 2913655Ssam extern struct tm *localtime(); 3013655Ssam time_t clock; 3113655Ssam register FILE *fp0, *fp1; 3213655Ssam char buf[BUFSIZ], name[NAMESIZE]; 3313655Ssam 3413655Ssam if (access(SQFILE, 0) != 0) /* nothing to do here */ 3513655Ssam return(0); 3613655Ssam 3713655Ssam for (i = 0; i < 5; i++) { 3813655Ssam if ((ret = ulockf(SQLOCK, (time_t) SQTIME)) == 0) 3913655Ssam break; 4013655Ssam sleep(5); 4113655Ssam } 4213655Ssam if (ret != 0) { 4313655Ssam logent("CAN'T LOCK", SQLOCK); 4413655Ssam DEBUG(4, "can't lock %s\n", SQLOCK); 4513655Ssam return(0); 4613655Ssam } 4713655Ssam if ((fp0 = fopen(SQFILE, "r")) == NULL) 4813655Ssam return(0); 4913655Ssam if ((fp1 = fopen(SQTMP, "w")) == NULL) { 5013655Ssam fclose(fp0); 5113655Ssam return(0); 5213655Ssam } 5313655Ssam chmod(SQTMP, 0400); 5413655Ssam 5513655Ssam while (fgets(buf, BUFSIZ, fp0) != NULL) { 5613655Ssam ret = sscanf(buf, "%s%d", name, &ct); 5713655Ssam if (ret < 2) 5813655Ssam ct = 0; 5913655Ssam name[7] = '\0'; 6013655Ssam if (ct > 9998) 6113655Ssam ct = 0; 6213655Ssam if (strcmp(rmtname, name) != SAME) { 6313655Ssam fputs(buf, fp1); 6413655Ssam continue; 6513655Ssam } 6613655Ssam 6713655Ssam /* found name */ 6813655Ssam count = ++ct; 6913655Ssam time(&clock); 7013655Ssam tp = localtime(&clock); 71*17835Sralph #ifdef USG 72*17835Sralph fprintf(fp1, "%s %d %d/%d-%2.2d:%2.2d\n", name, ct, 7313655Ssam tp->tm_mon + 1, tp->tm_mday, tp->tm_hour, 7413655Ssam tp->tm_min); 75*17835Sralph #endif 76*17835Sralph #ifndef USG 77*17835Sralph fprintf(fp1, "%s %d %d/%d-%02d:%02d\n", name, ct, 78*17835Sralph tp->tm_mon + 1, tp->tm_mday, tp->tm_hour, 79*17835Sralph tp->tm_min); 80*17835Sralph #endif 8113655Ssam while (fgets(buf, BUFSIZ, fp0) != NULL) 8213655Ssam fputs(buf, fp1); 8313655Ssam } 8413655Ssam fclose(fp0); 8513655Ssam fclose(fp1); 8613655Ssam if (count == 0) { 8713655Ssam rmlock(SQLOCK); 8813655Ssam unlink(SQTMP); 8913655Ssam } 9013655Ssam return(count); 9113655Ssam } 9213655Ssam 9313655Ssam 9413655Ssam /*** 9513655Ssam * cmtseq() commit sequence update 9613655Ssam * 9713655Ssam * return 0 ok | other - link failed 9813655Ssam */ 9913655Ssam 10013655Ssam cmtseq() 10113655Ssam { 10213655Ssam register int ret; 10313655Ssam 104*17835Sralph if ((ret = access(SQTMP, 04)) != 0) { 10513655Ssam rmlock(SQLOCK); 10613655Ssam return(0); 10713655Ssam } 10813655Ssam unlink(SQFILE); 10913655Ssam ret = link(SQTMP, SQFILE); 11013655Ssam unlink(SQTMP); 11113655Ssam rmlock(SQLOCK); 11213655Ssam return(ret); 11313655Ssam } 11413655Ssam 11513655Ssam /*** 11613655Ssam * ulkseq() unlock sequence file 11713655Ssam */ 11813655Ssam 11913655Ssam ulkseq() 12013655Ssam { 12113655Ssam unlink(SQTMP); 12213655Ssam rmlock(SQLOCK); 12313655Ssam } 124*17835Sralph #endif GNXSEQ 125