16c12252aSsam #ifndef lint 2*c9dd95d8Sralph static char sccsid[] = "@(#)gnxseq.c 5.3 (Berkeley) 01/22/85"; 36c12252aSsam #endif 46c12252aSsam 56c12252aSsam #include "uucp.h" 66c12252aSsam #include <sys/types.h> 7*c9dd95d8Sralph #ifdef BSD4_2 80d244a74Ssam #include <sys/time.h> 9*c9dd95d8Sralph #else sane 10*c9dd95d8Sralph #include <time.h> 11*c9dd95d8Sralph #endif sane 12*c9dd95d8Sralph 13*c9dd95d8Sralph #ifdef GNXSEQ 146c12252aSsam 156c12252aSsam extern time_t time(); 166c12252aSsam 176c12252aSsam /******* 186c12252aSsam * gnxseq(rmtname) get next conversation sequence number 196c12252aSsam * char *rmtname; 206c12252aSsam * 216c12252aSsam * return - 0 no entry | >0 sequence number 226c12252aSsam */ 236c12252aSsam 246c12252aSsam gnxseq(rmtname) 256c12252aSsam char *rmtname; 266c12252aSsam { 276c12252aSsam int count = 0, ct, ret, i; 286c12252aSsam register struct tm *tp; 296c12252aSsam extern struct tm *localtime(); 306c12252aSsam time_t clock; 316c12252aSsam register FILE *fp0, *fp1; 326c12252aSsam char buf[BUFSIZ], name[NAMESIZE]; 336c12252aSsam 346c12252aSsam if (access(SQFILE, 0) != 0) /* nothing to do here */ 356c12252aSsam return(0); 366c12252aSsam 376c12252aSsam for (i = 0; i < 5; i++) { 386c12252aSsam if ((ret = ulockf(SQLOCK, (time_t) SQTIME)) == 0) 396c12252aSsam break; 406c12252aSsam sleep(5); 416c12252aSsam } 426c12252aSsam if (ret != 0) { 436c12252aSsam logent("CAN'T LOCK", SQLOCK); 446c12252aSsam DEBUG(4, "can't lock %s\n", SQLOCK); 456c12252aSsam return(0); 466c12252aSsam } 476c12252aSsam if ((fp0 = fopen(SQFILE, "r")) == NULL) 486c12252aSsam return(0); 496c12252aSsam if ((fp1 = fopen(SQTMP, "w")) == NULL) { 506c12252aSsam fclose(fp0); 516c12252aSsam return(0); 526c12252aSsam } 536c12252aSsam chmod(SQTMP, 0400); 546c12252aSsam 556c12252aSsam while (fgets(buf, BUFSIZ, fp0) != NULL) { 566c12252aSsam ret = sscanf(buf, "%s%d", name, &ct); 576c12252aSsam if (ret < 2) 586c12252aSsam ct = 0; 596c12252aSsam name[7] = '\0'; 606c12252aSsam if (ct > 9998) 616c12252aSsam ct = 0; 626c12252aSsam if (strcmp(rmtname, name) != SAME) { 636c12252aSsam fputs(buf, fp1); 646c12252aSsam continue; 656c12252aSsam } 666c12252aSsam 676c12252aSsam /* found name */ 686c12252aSsam count = ++ct; 696c12252aSsam time(&clock); 706c12252aSsam tp = localtime(&clock); 71*c9dd95d8Sralph #ifdef USG 72*c9dd95d8Sralph fprintf(fp1, "%s %d %d/%d-%2.2d:%2.2d\n", name, ct, 736c12252aSsam tp->tm_mon + 1, tp->tm_mday, tp->tm_hour, 746c12252aSsam tp->tm_min); 75*c9dd95d8Sralph #endif 76*c9dd95d8Sralph #ifndef USG 77*c9dd95d8Sralph fprintf(fp1, "%s %d %d/%d-%02d:%02d\n", name, ct, 78*c9dd95d8Sralph tp->tm_mon + 1, tp->tm_mday, tp->tm_hour, 79*c9dd95d8Sralph tp->tm_min); 80*c9dd95d8Sralph #endif 816c12252aSsam while (fgets(buf, BUFSIZ, fp0) != NULL) 826c12252aSsam fputs(buf, fp1); 836c12252aSsam } 846c12252aSsam fclose(fp0); 856c12252aSsam fclose(fp1); 866c12252aSsam if (count == 0) { 876c12252aSsam rmlock(SQLOCK); 886c12252aSsam unlink(SQTMP); 896c12252aSsam } 906c12252aSsam return(count); 916c12252aSsam } 926c12252aSsam 936c12252aSsam 946c12252aSsam /*** 956c12252aSsam * cmtseq() commit sequence update 966c12252aSsam * 976c12252aSsam * return 0 ok | other - link failed 986c12252aSsam */ 996c12252aSsam 1006c12252aSsam cmtseq() 1016c12252aSsam { 1026c12252aSsam register int ret; 1036c12252aSsam 104*c9dd95d8Sralph if ((ret = access(SQTMP, 04)) != 0) { 1056c12252aSsam rmlock(SQLOCK); 1066c12252aSsam return(0); 1076c12252aSsam } 1086c12252aSsam unlink(SQFILE); 1096c12252aSsam ret = link(SQTMP, SQFILE); 1106c12252aSsam unlink(SQTMP); 1116c12252aSsam rmlock(SQLOCK); 1126c12252aSsam return(ret); 1136c12252aSsam } 1146c12252aSsam 1156c12252aSsam /*** 1166c12252aSsam * ulkseq() unlock sequence file 1176c12252aSsam */ 1186c12252aSsam 1196c12252aSsam ulkseq() 1206c12252aSsam { 1216c12252aSsam unlink(SQTMP); 1226c12252aSsam rmlock(SQLOCK); 1236c12252aSsam } 124*c9dd95d8Sralph #endif GNXSEQ 125