xref: /original-bsd/usr.bin/uucp/libuu/gnxseq.c (revision 8216efb6)
19677bed1Sbostic /*-
2*8216efb6Sbostic  * Copyright (c) 1985, 1993
3*8216efb6Sbostic  *	The Regents of the University of California.  All rights reserved.
49677bed1Sbostic  *
59677bed1Sbostic  * %sccs.include.proprietary.c%
69677bed1Sbostic  */
79677bed1Sbostic 
86c12252aSsam #ifndef lint
9*8216efb6Sbostic static char sccsid[] = "@(#)gnxseq.c	8.1 (Berkeley) 06/06/93";
109677bed1Sbostic #endif /* not lint */
116c12252aSsam 
126c12252aSsam #include "uucp.h"
13c9dd95d8Sralph #ifdef BSD4_2
140d244a74Ssam #include <sys/time.h>
15c9dd95d8Sralph #else sane
16c9dd95d8Sralph #include <time.h>
17c9dd95d8Sralph #endif sane
18c9dd95d8Sralph 
19fd99b45cSbloom /*LINTLIBRARY*/
20fd99b45cSbloom 
21c9dd95d8Sralph #ifdef GNXSEQ
226c12252aSsam 
23fd99b45cSbloom /*
24fd99b45cSbloom  *	get next conversation sequence number
256c12252aSsam  *
266c12252aSsam  *	return - 0 no entry | >0 sequence number
276c12252aSsam  */
286c12252aSsam 
gnxseq(rmtname)296c12252aSsam gnxseq(rmtname)
306c12252aSsam char *rmtname;
316c12252aSsam {
326c12252aSsam 	int count = 0, ct, ret, i;
336c12252aSsam 	register struct tm *tp;
346c12252aSsam 	extern struct tm *localtime();
356c12252aSsam 	time_t clock;
366c12252aSsam 	register FILE *fp0, *fp1;
376c12252aSsam 	char buf[BUFSIZ], name[NAMESIZE];
386c12252aSsam 
396c12252aSsam 	if (access(SQFILE, 0) != 0)	/* nothing to do here */
406c12252aSsam 		return(0);
416c12252aSsam 
426c12252aSsam 	for (i = 0; i < 5; i++) {
436c12252aSsam 		if ((ret = ulockf(SQLOCK, (time_t)  SQTIME)) == 0)
446c12252aSsam 			break;
456c12252aSsam 		sleep(5);
466c12252aSsam 	}
476c12252aSsam 	if (ret != 0) {
486c12252aSsam 		logent("CAN'T LOCK", SQLOCK);
496c12252aSsam 		DEBUG(4, "can't lock %s\n", SQLOCK);
506c12252aSsam 		return(0);
516c12252aSsam 	}
526c12252aSsam 	if ((fp0 = fopen(SQFILE, "r")) == NULL)
536c12252aSsam 		return(0);
546c12252aSsam 	if ((fp1 = fopen(SQTMP, "w")) == NULL) {
556c12252aSsam 		fclose(fp0);
566c12252aSsam 		return(0);
576c12252aSsam 	}
586c12252aSsam 	chmod(SQTMP, 0400);
596c12252aSsam 
606c12252aSsam 	while (fgets(buf, BUFSIZ, fp0) != NULL) {
616c12252aSsam 		ret = sscanf(buf, "%s%d", name, &ct);
626c12252aSsam 		if (ret < 2)
636c12252aSsam 			ct = 0;
64fd99b45cSbloom 		name[MAXBASENAME] = '\0';
656c12252aSsam 		if (ct > 9998)
666c12252aSsam 			ct = 0;
67fd99b45cSbloom 		if (strncmp(rmtname, name, MAXBASENAME) != SAME) {
686c12252aSsam 			fputs(buf, fp1);
696c12252aSsam 			continue;
706c12252aSsam 		}
716c12252aSsam 
726c12252aSsam 		/*  found name  */
736c12252aSsam 		count = ++ct;
746c12252aSsam 		time(&clock);
756c12252aSsam 		tp = localtime(&clock);
76c9dd95d8Sralph #ifdef USG
77c9dd95d8Sralph 		fprintf(fp1, "%s %d %d/%d-%2.2d:%2.2d\n", name, ct,
786c12252aSsam 		  tp->tm_mon + 1, tp->tm_mday, tp->tm_hour,
796c12252aSsam 		  tp->tm_min);
80c9dd95d8Sralph #endif
81c9dd95d8Sralph #ifndef USG
82c9dd95d8Sralph 		fprintf(fp1, "%s %d %d/%d-%02d:%02d\n", name, ct,
83c9dd95d8Sralph 		  tp->tm_mon + 1, tp->tm_mday, tp->tm_hour,
84c9dd95d8Sralph 		  tp->tm_min);
85c9dd95d8Sralph #endif
866c12252aSsam 		while (fgets(buf, BUFSIZ, fp0) != NULL)
876c12252aSsam 			fputs(buf, fp1);
886c12252aSsam 	}
896c12252aSsam 	fclose(fp0);
906c12252aSsam 	fclose(fp1);
916c12252aSsam 	if (count == 0) {
926c12252aSsam 		rmlock(SQLOCK);
936c12252aSsam 		unlink(SQTMP);
946c12252aSsam 	}
956c12252aSsam 	return(count);
966c12252aSsam }
976c12252aSsam 
986c12252aSsam 
996c12252aSsam /***
1006c12252aSsam  *	cmtseq()	commit sequence update
1016c12252aSsam  *
1026c12252aSsam  *	return  0  ok | other - link failed
1036c12252aSsam  */
1046c12252aSsam 
cmtseq()1056c12252aSsam cmtseq()
1066c12252aSsam {
1076c12252aSsam 	register int ret;
1086c12252aSsam 
109c9dd95d8Sralph 	if ((ret = access(SQTMP, 04)) != 0) {
1106c12252aSsam 		rmlock(SQLOCK);
1116c12252aSsam 		return(0);
1126c12252aSsam 	}
1136c12252aSsam 	unlink(SQFILE);
1146c12252aSsam 	ret = link(SQTMP, SQFILE);
1156c12252aSsam 	unlink(SQTMP);
1166c12252aSsam 	rmlock(SQLOCK);
1176c12252aSsam 	return(ret);
1186c12252aSsam }
1196c12252aSsam 
1206c12252aSsam /***
1216c12252aSsam  *	ulkseq()	unlock sequence file
1226c12252aSsam  */
1236c12252aSsam 
ulkseq()1246c12252aSsam ulkseq()
1256c12252aSsam {
1266c12252aSsam 	unlink(SQTMP);
1276c12252aSsam 	rmlock(SQLOCK);
1286c12252aSsam }
129c9dd95d8Sralph #endif GNXSEQ
130