xref: /original-bsd/usr.bin/uucp/libuu/gnxseq.c (revision 4b2c5e10)
1 #ifndef lint
2 static char sccsid[] = "@(#)gnxseq.c	5.2 (Berkeley) 07/02/83";
3 #endif
4 
5 #include "uucp.h"
6 #include <sys/types.h>
7 #include <sys/time.h>
8 
9 extern	time_t	time();
10 
11 /*******
12  *	gnxseq(rmtname)		get next conversation sequence number
13  *	char *rmtname;
14  *
15  *	return - 0 no entry | >0 sequence number
16  */
17 
18 gnxseq(rmtname)
19 char *rmtname;
20 {
21 	int count = 0, ct, ret, i;
22 	register struct tm *tp;
23 	extern struct tm *localtime();
24 	time_t clock;
25 	register FILE *fp0, *fp1;
26 	char buf[BUFSIZ], name[NAMESIZE];
27 
28 	if (access(SQFILE, 0) != 0)	/* nothing to do here */
29 		return(0);
30 
31 	for (i = 0; i < 5; i++) {
32 		if ((ret = ulockf(SQLOCK, (time_t)  SQTIME)) == 0)
33 			break;
34 		sleep(5);
35 	}
36 	if (ret != 0) {
37 		logent("CAN'T LOCK", SQLOCK);
38 		DEBUG(4, "can't lock %s\n", SQLOCK);
39 		return(0);
40 	}
41 	if ((fp0 = fopen(SQFILE, "r")) == NULL)
42 		return(0);
43 	if ((fp1 = fopen(SQTMP, "w")) == NULL) {
44 		fclose(fp0);
45 		return(0);
46 	}
47 	chmod(SQTMP, 0400);
48 
49 	while (fgets(buf, BUFSIZ, fp0) != NULL) {
50 		ret = sscanf(buf, "%s%d", name, &ct);
51 		if (ret < 2)
52 			ct = 0;
53 		name[7] = '\0';
54 		if (ct > 9998)
55 			ct = 0;
56 		if (strcmp(rmtname, name) != SAME) {
57 			fputs(buf, fp1);
58 			continue;
59 		}
60 
61 		/*  found name  */
62 		count = ++ct;
63 		time(&clock);
64 		tp = localtime(&clock);
65 		fprintf(fp1, "%s %d %d/%d-%d:%02d\n", name, ct,
66 		  tp->tm_mon + 1, tp->tm_mday, tp->tm_hour,
67 		  tp->tm_min);
68 		while (fgets(buf, BUFSIZ, fp0) != NULL)
69 			fputs(buf, fp1);
70 	}
71 	fclose(fp0);
72 	fclose(fp1);
73 	if (count == 0) {
74 		rmlock(SQLOCK);
75 		unlink(SQTMP);
76 	}
77 	return(count);
78 }
79 
80 
81 /***
82  *	cmtseq()	commit sequence update
83  *
84  *	return  0  ok | other - link failed
85  */
86 
87 cmtseq()
88 {
89 	register int ret;
90 
91 	if ((ret = access(SQTMP, 0400)) != 0) {
92 		rmlock(SQLOCK);
93 		return(0);
94 	}
95 	unlink(SQFILE);
96 	ret = link(SQTMP, SQFILE);
97 	unlink(SQTMP);
98 	rmlock(SQLOCK);
99 	return(ret);
100 }
101 
102 /***
103  *	ulkseq()	unlock sequence file
104  */
105 
106 ulkseq()
107 {
108 	unlink(SQTMP);
109 	rmlock(SQLOCK);
110 }
111