|
|
1.1 root 1: /* /sccs/src/cmd/uucp/s.gnxseq.c
2: gnxseq.c 1.1 8/30/84 17:37:25
3: */
4: #include "uucp.h"
5: VERSION(@(#)gnxseq.c 1.1);
6:
7: /*
8: * get next conversation sequence number
9: * rmtname -> name of remote system
10: * returns:
11: * 0 -> no entery
12: * 1 -> 0 sequence number
13: */
14: gnxseq(rmtname)
15: char *rmtname;
16: {
17: register FILE *fp0, *fp1;
18: register struct tm *tp;
19: extern struct tm *localtime();
20: int count = 0, ct, ret;
21: char buf[BUFSIZ], name[NAMESIZE];
22: time_t clock, time();
23:
24: if (access(SQFILE, 0) != 0)
25: return(0);
26:
27: {
28: register int i;
29: for (i = 0; i < 5; i++)
30: if ((ret = ulockf(SQLOCK, (time_t) SQTIME)) == 0)
31: break;
32: sleep(5);
33: }
34: if (ret != 0) {
35: logent("CAN'T LOCK", SQLOCK);
36: DEBUG(4, "can't lock %s\n", SQLOCK);
37: return(0);
38: }
39: if ((fp0 = fopen(SQFILE, "r")) == NULL)
40: return(0);
41: if ((fp1 = fopen(SQTMP, "w")) == NULL) {
42: fclose(fp0);
43: return(0);
44: }
45: chmod(SQTMP, 0400);
46:
47: while (fgets(buf, BUFSIZ, fp0) != NULL) {
48: ret = sscanf(buf, "%s%d", name, &ct);
49: if (ret < 2)
50: ct = 0;
51: name[7] = '\0';
52: if (ct > 9998)
53: ct = 0;
54: if (strncmp(rmtname, name, SYSNSIZE) != SAME) {
55: fputs(buf, fp1);
56: continue;
57: }
58:
59: /*
60: * found name
61: */
62: count = ++ct;
63: time(&clock);
64: tp = localtime(&clock);
65: fprintf(fp1, "%s %d %d/%d-%d:%2.2d\n", name, ct,
66: tp->tm_mon + 1, tp->tm_mday, tp->tm_hour,
67: tp->tm_min);
68:
69: /*
70: * write should be checked
71: */
72: while (fgets(buf, BUFSIZ, fp0) != NULL)
73: fputs(buf, fp1);
74: }
75: fclose(fp0);
76: fclose(fp1);
77: if (count == 0) {
78: rmlock(SQLOCK);
79: unlink(SQTMP);
80: }
81: return(count);
82: }
83:
84: /*
85: * commit sequence update
86: * returns:
87: * 0 -> ok
88: * other -> link failed
89: */
90: cmtseq()
91: {
92: register int ret;
93:
94: if ((ret = access(SQTMP, 0)) != 0) {
95: rmlock(SQLOCK);
96: return(0);
97: }
98: unlink(SQFILE);
99: ret = link(SQTMP, SQFILE);
100: unlink(SQTMP);
101: rmlock(SQLOCK);
102: return(ret);
103: }
104:
105: /*
106: * unlock sequence file
107: */
108: ulkseq()
109: {
110: unlink(SQTMP);
111: rmlock(SQLOCK);
112: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.