113655Ssam #ifndef lint 2*13706Ssam static char sccsid[] = "@(#)gnxseq.c 5.2 (Berkeley) 07/02/83"; 313655Ssam #endif 413655Ssam 513655Ssam #include "uucp.h" 613655Ssam #include <sys/types.h> 7*13706Ssam #include <sys/time.h> 813655Ssam 913655Ssam extern time_t time(); 1013655Ssam 1113655Ssam /******* 1213655Ssam * gnxseq(rmtname) get next conversation sequence number 1313655Ssam * char *rmtname; 1413655Ssam * 1513655Ssam * return - 0 no entry | >0 sequence number 1613655Ssam */ 1713655Ssam 1813655Ssam gnxseq(rmtname) 1913655Ssam char *rmtname; 2013655Ssam { 2113655Ssam int count = 0, ct, ret, i; 2213655Ssam register struct tm *tp; 2313655Ssam extern struct tm *localtime(); 2413655Ssam time_t clock; 2513655Ssam register FILE *fp0, *fp1; 2613655Ssam char buf[BUFSIZ], name[NAMESIZE]; 2713655Ssam 2813655Ssam if (access(SQFILE, 0) != 0) /* nothing to do here */ 2913655Ssam return(0); 3013655Ssam 3113655Ssam for (i = 0; i < 5; i++) { 3213655Ssam if ((ret = ulockf(SQLOCK, (time_t) SQTIME)) == 0) 3313655Ssam break; 3413655Ssam sleep(5); 3513655Ssam } 3613655Ssam if (ret != 0) { 3713655Ssam logent("CAN'T LOCK", SQLOCK); 3813655Ssam DEBUG(4, "can't lock %s\n", SQLOCK); 3913655Ssam return(0); 4013655Ssam } 4113655Ssam if ((fp0 = fopen(SQFILE, "r")) == NULL) 4213655Ssam return(0); 4313655Ssam if ((fp1 = fopen(SQTMP, "w")) == NULL) { 4413655Ssam fclose(fp0); 4513655Ssam return(0); 4613655Ssam } 4713655Ssam chmod(SQTMP, 0400); 4813655Ssam 4913655Ssam while (fgets(buf, BUFSIZ, fp0) != NULL) { 5013655Ssam ret = sscanf(buf, "%s%d", name, &ct); 5113655Ssam if (ret < 2) 5213655Ssam ct = 0; 5313655Ssam name[7] = '\0'; 5413655Ssam if (ct > 9998) 5513655Ssam ct = 0; 5613655Ssam if (strcmp(rmtname, name) != SAME) { 5713655Ssam fputs(buf, fp1); 5813655Ssam continue; 5913655Ssam } 6013655Ssam 6113655Ssam /* found name */ 6213655Ssam count = ++ct; 6313655Ssam time(&clock); 6413655Ssam tp = localtime(&clock); 6513655Ssam fprintf(fp1, "%s %d %d/%d-%d:%02d\n", name, ct, 6613655Ssam tp->tm_mon + 1, tp->tm_mday, tp->tm_hour, 6713655Ssam tp->tm_min); 6813655Ssam while (fgets(buf, BUFSIZ, fp0) != NULL) 6913655Ssam fputs(buf, fp1); 7013655Ssam } 7113655Ssam fclose(fp0); 7213655Ssam fclose(fp1); 7313655Ssam if (count == 0) { 7413655Ssam rmlock(SQLOCK); 7513655Ssam unlink(SQTMP); 7613655Ssam } 7713655Ssam return(count); 7813655Ssam } 7913655Ssam 8013655Ssam 8113655Ssam /*** 8213655Ssam * cmtseq() commit sequence update 8313655Ssam * 8413655Ssam * return 0 ok | other - link failed 8513655Ssam */ 8613655Ssam 8713655Ssam cmtseq() 8813655Ssam { 8913655Ssam register int ret; 9013655Ssam 9113655Ssam if ((ret = access(SQTMP, 0400)) != 0) { 9213655Ssam rmlock(SQLOCK); 9313655Ssam return(0); 9413655Ssam } 9513655Ssam unlink(SQFILE); 9613655Ssam ret = link(SQTMP, SQFILE); 9713655Ssam unlink(SQTMP); 9813655Ssam rmlock(SQLOCK); 9913655Ssam return(ret); 10013655Ssam } 10113655Ssam 10213655Ssam /*** 10313655Ssam * ulkseq() unlock sequence file 10413655Ssam */ 10513655Ssam 10613655Ssam ulkseq() 10713655Ssam { 10813655Ssam unlink(SQTMP); 10913655Ssam rmlock(SQLOCK); 11013655Ssam } 111