113655Ssam #ifndef lint 2*23609Sbloom static char sccsid[] = "@(#)gnxseq.c 5.4 (Berkeley) 06/20/85"; 313655Ssam #endif 413655Ssam 513655Ssam #include "uucp.h" 617835Sralph #ifdef BSD4_2 713706Ssam #include <sys/time.h> 817835Sralph #else sane 917835Sralph #include <time.h> 1017835Sralph #endif sane 1113655Ssam 12*23609Sbloom /*LINTLIBRARY*/ 13*23609Sbloom 1417835Sralph #ifdef GNXSEQ 1517835Sralph 16*23609Sbloom /* 17*23609Sbloom * get next conversation sequence number 1813655Ssam * 1913655Ssam * return - 0 no entry | >0 sequence number 2013655Ssam */ 2113655Ssam 2213655Ssam gnxseq(rmtname) 2313655Ssam char *rmtname; 2413655Ssam { 2513655Ssam int count = 0, ct, ret, i; 2613655Ssam register struct tm *tp; 2713655Ssam extern struct tm *localtime(); 2813655Ssam time_t clock; 2913655Ssam register FILE *fp0, *fp1; 3013655Ssam char buf[BUFSIZ], name[NAMESIZE]; 3113655Ssam 3213655Ssam if (access(SQFILE, 0) != 0) /* nothing to do here */ 3313655Ssam return(0); 3413655Ssam 3513655Ssam for (i = 0; i < 5; i++) { 3613655Ssam if ((ret = ulockf(SQLOCK, (time_t) SQTIME)) == 0) 3713655Ssam break; 3813655Ssam sleep(5); 3913655Ssam } 4013655Ssam if (ret != 0) { 4113655Ssam logent("CAN'T LOCK", SQLOCK); 4213655Ssam DEBUG(4, "can't lock %s\n", SQLOCK); 4313655Ssam return(0); 4413655Ssam } 4513655Ssam if ((fp0 = fopen(SQFILE, "r")) == NULL) 4613655Ssam return(0); 4713655Ssam if ((fp1 = fopen(SQTMP, "w")) == NULL) { 4813655Ssam fclose(fp0); 4913655Ssam return(0); 5013655Ssam } 5113655Ssam chmod(SQTMP, 0400); 5213655Ssam 5313655Ssam while (fgets(buf, BUFSIZ, fp0) != NULL) { 5413655Ssam ret = sscanf(buf, "%s%d", name, &ct); 5513655Ssam if (ret < 2) 5613655Ssam ct = 0; 57*23609Sbloom name[MAXBASENAME] = '\0'; 5813655Ssam if (ct > 9998) 5913655Ssam ct = 0; 60*23609Sbloom if (strncmp(rmtname, name, MAXBASENAME) != SAME) { 6113655Ssam fputs(buf, fp1); 6213655Ssam continue; 6313655Ssam } 6413655Ssam 6513655Ssam /* found name */ 6613655Ssam count = ++ct; 6713655Ssam time(&clock); 6813655Ssam tp = localtime(&clock); 6917835Sralph #ifdef USG 7017835Sralph fprintf(fp1, "%s %d %d/%d-%2.2d:%2.2d\n", name, ct, 7113655Ssam tp->tm_mon + 1, tp->tm_mday, tp->tm_hour, 7213655Ssam tp->tm_min); 7317835Sralph #endif 7417835Sralph #ifndef USG 7517835Sralph fprintf(fp1, "%s %d %d/%d-%02d:%02d\n", name, ct, 7617835Sralph tp->tm_mon + 1, tp->tm_mday, tp->tm_hour, 7717835Sralph tp->tm_min); 7817835Sralph #endif 7913655Ssam while (fgets(buf, BUFSIZ, fp0) != NULL) 8013655Ssam fputs(buf, fp1); 8113655Ssam } 8213655Ssam fclose(fp0); 8313655Ssam fclose(fp1); 8413655Ssam if (count == 0) { 8513655Ssam rmlock(SQLOCK); 8613655Ssam unlink(SQTMP); 8713655Ssam } 8813655Ssam return(count); 8913655Ssam } 9013655Ssam 9113655Ssam 9213655Ssam /*** 9313655Ssam * cmtseq() commit sequence update 9413655Ssam * 9513655Ssam * return 0 ok | other - link failed 9613655Ssam */ 9713655Ssam 9813655Ssam cmtseq() 9913655Ssam { 10013655Ssam register int ret; 10113655Ssam 10217835Sralph if ((ret = access(SQTMP, 04)) != 0) { 10313655Ssam rmlock(SQLOCK); 10413655Ssam return(0); 10513655Ssam } 10613655Ssam unlink(SQFILE); 10713655Ssam ret = link(SQTMP, SQFILE); 10813655Ssam unlink(SQTMP); 10913655Ssam rmlock(SQLOCK); 11013655Ssam return(ret); 11113655Ssam } 11213655Ssam 11313655Ssam /*** 11413655Ssam * ulkseq() unlock sequence file 11513655Ssam */ 11613655Ssam 11713655Ssam ulkseq() 11813655Ssam { 11913655Ssam unlink(SQTMP); 12013655Ssam rmlock(SQLOCK); 12113655Ssam } 12217835Sralph #endif GNXSEQ 123