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