1 /*-
2 * Copyright (c) 1985, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.proprietary.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)gnxseq.c 8.1 (Berkeley) 06/06/93";
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
gnxseq(rmtname)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
cmtseq()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
ulkseq()124 ulkseq()
125 {
126 unlink(SQTMP);
127 rmlock(SQLOCK);
128 }
129 #endif GNXSEQ
130