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