1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
23/*	  All Rights Reserved  	*/
24
25#include "uucp.h"
26
27/*
28 * get next conversation sequence number
29 *	rmtname	-> name of remote system
30 * returns:
31 *	0	-> no entery
32 *	1	-> 0 sequence number
33 */
34int
35gnxseq(char *rmtname)
36{
37	register FILE *fp0, *fp1;
38	register struct tm *tp;
39	int count = 0, ct, ret;
40	char buf[BUFSIZ], name[NAMESIZE];
41	time_t clock;
42
43	if (access(SQFILE, 0) != 0)
44		return (0);
45
46	{
47		int i;
48		for (i = 0; i < 5; i++)
49			if ((ret = mklock(SQLOCK)) == SUCCESS)
50				break;
51		sleep(5);
52	}
53	if (ret != SUCCESS) {
54		logent("CAN'T LOCK", SQLOCK);
55		DEBUG(4, "can't lock %s\n", SQLOCK);
56		return (0);
57	}
58	if ((fp0 = fopen(SQFILE, "r")) == NULL)
59		return (0);
60	if ((fp1 = fopen(SQTMP, "w")) == NULL) {
61		fclose(fp0);
62		return (0);
63	}
64	chmod(SQTMP, DFILEMODE);
65
66	while (fgets(buf, BUFSIZ, fp0) != NULL) {
67		ret = sscanf(buf, "%s%d", name, &ct);
68		if (ret < 2)
69			ct = 0;
70		name[7] = '\0';
71		if (ct > 9998)
72			ct = 0;
73		if (strncmp(rmtname, name, SYSNSIZE) != SAME) {
74			fputs(buf, fp1);
75			continue;
76		}
77
78		/*
79		 * found name
80		 */
81		count = ++ct;
82		time(&clock);
83		tp = localtime(&clock);
84		fprintf(fp1, "%s %d %d/%d-%d:%2.2d\n", name, ct,
85		    tp->tm_mon + 1, tp->tm_mday, tp->tm_hour,
86		    tp->tm_min);
87
88		/*
89		 * write should be checked
90		 */
91		while (fgets(buf, BUFSIZ, fp0) != NULL)
92			fputs(buf, fp1);
93	}
94	fclose(fp0);
95	fclose(fp1);
96	if (count == 0) {
97		rmlock(SQLOCK);
98		unlink(SQTMP);
99	}
100	return (count);
101}
102
103/*
104 * commit sequence update
105 * returns:
106 *	0	-> ok
107 *	other	-> link failed
108 */
109int
110cmtseq(void)
111{
112	int ret;
113
114	if ((ret = access(SQTMP, 0)) != 0) {
115		rmlock(SQLOCK);
116		return (0);
117	}
118	unlink(SQFILE);
119	ret = link(SQTMP, SQFILE);
120	unlink(SQTMP);
121	rmlock(SQLOCK);
122	return (ret);
123}
124
125/*
126 * unlock sequence file
127 */
128void
129ulkseq(void)
130{
131	unlink(SQTMP);
132	rmlock(SQLOCK);
133}
134