xref: /csrg-svn/usr.bin/uucp/libuu/gnxseq.c (revision 62386)
148652Sbostic /*-
2*62386Sbostic  * Copyright (c) 1985, 1993
3*62386Sbostic  *	The Regents of the University of California.  All rights reserved.
448652Sbostic  *
548652Sbostic  * %sccs.include.proprietary.c%
648652Sbostic  */
748652Sbostic 
813655Ssam #ifndef lint
9*62386Sbostic static char sccsid[] = "@(#)gnxseq.c	8.1 (Berkeley) 06/06/93";
1048652Sbostic #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 
gnxseq(rmtname)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 
cmtseq()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 
ulkseq()12413655Ssam ulkseq()
12513655Ssam {
12613655Ssam 	unlink(SQTMP);
12713655Ssam 	rmlock(SQLOCK);
12813655Ssam }
12917835Sralph #endif GNXSEQ
130