1*48652Sbostic /*- 2*48652Sbostic * Copyright (c) 1985 The Regents of the University of California. 3*48652Sbostic * All rights reserved. 4*48652Sbostic * 5*48652Sbostic * %sccs.include.proprietary.c% 6*48652Sbostic */ 7*48652Sbostic 813655Ssam #ifndef lint 9*48652Sbostic static char sccsid[] = "@(#)gnxseq.c 5.5 (Berkeley) 04/24/91"; 10*48652Sbostic #endif /* not lint */ 1113655Ssam 1213655Ssam #include "uucp.h" 1317835Sralph #ifdef BSD4_2 1413706Ssam #include <sys/time.h> 1517835Sralph #else sane 1617835Sralph #include <time.h> 1717835Sralph #endif sane 1813655Ssam 1923609Sbloom /*LINTLIBRARY*/ 2023609Sbloom 2117835Sralph #ifdef GNXSEQ 2217835Sralph 2323609Sbloom /* 2423609Sbloom * get next conversation sequence number 2513655Ssam * 2613655Ssam * return - 0 no entry | >0 sequence number 2713655Ssam */ 2813655Ssam 2913655Ssam gnxseq(rmtname) 3013655Ssam char *rmtname; 3113655Ssam { 3213655Ssam int count = 0, ct, ret, i; 3313655Ssam register struct tm *tp; 3413655Ssam extern struct tm *localtime(); 3513655Ssam time_t clock; 3613655Ssam register FILE *fp0, *fp1; 3713655Ssam char buf[BUFSIZ], name[NAMESIZE]; 3813655Ssam 3913655Ssam if (access(SQFILE, 0) != 0) /* nothing to do here */ 4013655Ssam return(0); 4113655Ssam 4213655Ssam for (i = 0; i < 5; i++) { 4313655Ssam if ((ret = ulockf(SQLOCK, (time_t) SQTIME)) == 0) 4413655Ssam break; 4513655Ssam sleep(5); 4613655Ssam } 4713655Ssam if (ret != 0) { 4813655Ssam logent("CAN'T LOCK", SQLOCK); 4913655Ssam DEBUG(4, "can't lock %s\n", SQLOCK); 5013655Ssam return(0); 5113655Ssam } 5213655Ssam if ((fp0 = fopen(SQFILE, "r")) == NULL) 5313655Ssam return(0); 5413655Ssam if ((fp1 = fopen(SQTMP, "w")) == NULL) { 5513655Ssam fclose(fp0); 5613655Ssam return(0); 5713655Ssam } 5813655Ssam chmod(SQTMP, 0400); 5913655Ssam 6013655Ssam while (fgets(buf, BUFSIZ, fp0) != NULL) { 6113655Ssam ret = sscanf(buf, "%s%d", name, &ct); 6213655Ssam if (ret < 2) 6313655Ssam ct = 0; 6423609Sbloom name[MAXBASENAME] = '\0'; 6513655Ssam if (ct > 9998) 6613655Ssam ct = 0; 6723609Sbloom if (strncmp(rmtname, name, MAXBASENAME) != SAME) { 6813655Ssam fputs(buf, fp1); 6913655Ssam continue; 7013655Ssam } 7113655Ssam 7213655Ssam /* found name */ 7313655Ssam count = ++ct; 7413655Ssam time(&clock); 7513655Ssam tp = localtime(&clock); 7617835Sralph #ifdef USG 7717835Sralph fprintf(fp1, "%s %d %d/%d-%2.2d:%2.2d\n", name, ct, 7813655Ssam tp->tm_mon + 1, tp->tm_mday, tp->tm_hour, 7913655Ssam tp->tm_min); 8017835Sralph #endif 8117835Sralph #ifndef USG 8217835Sralph fprintf(fp1, "%s %d %d/%d-%02d:%02d\n", name, ct, 8317835Sralph tp->tm_mon + 1, tp->tm_mday, tp->tm_hour, 8417835Sralph tp->tm_min); 8517835Sralph #endif 8613655Ssam while (fgets(buf, BUFSIZ, fp0) != NULL) 8713655Ssam fputs(buf, fp1); 8813655Ssam } 8913655Ssam fclose(fp0); 9013655Ssam fclose(fp1); 9113655Ssam if (count == 0) { 9213655Ssam rmlock(SQLOCK); 9313655Ssam unlink(SQTMP); 9413655Ssam } 9513655Ssam return(count); 9613655Ssam } 9713655Ssam 9813655Ssam 9913655Ssam /*** 10013655Ssam * cmtseq() commit sequence update 10113655Ssam * 10213655Ssam * return 0 ok | other - link failed 10313655Ssam */ 10413655Ssam 10513655Ssam cmtseq() 10613655Ssam { 10713655Ssam register int ret; 10813655Ssam 10917835Sralph if ((ret = access(SQTMP, 04)) != 0) { 11013655Ssam rmlock(SQLOCK); 11113655Ssam return(0); 11213655Ssam } 11313655Ssam unlink(SQFILE); 11413655Ssam ret = link(SQTMP, SQFILE); 11513655Ssam unlink(SQTMP); 11613655Ssam rmlock(SQLOCK); 11713655Ssam return(ret); 11813655Ssam } 11913655Ssam 12013655Ssam /*** 12113655Ssam * ulkseq() unlock sequence file 12213655Ssam */ 12313655Ssam 12413655Ssam ulkseq() 12513655Ssam { 12613655Ssam unlink(SQTMP); 12713655Ssam rmlock(SQLOCK); 12813655Ssam } 12917835Sralph #endif GNXSEQ 130