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/*
23 * Copyright 1998 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
28/*	  All Rights Reserved  	*/
29
30
31#pragma ident	"%Z%%M%	%I%	%E% SMI"
32
33#include "uucp.h"
34
35static FILE	*_Lf = NULL;
36static FILE	*_Cf = NULL;
37static int	_Sf = -1;
38static int	CurRole = MASTER;	/* Uucico's current role. */
39
40/*
41 * Make log entry
42 *	text	-> ptr to text string
43 *	status	-> ptr to status string
44 * Returns:
45 *	none
46 */
47void
48logent(text, status)
49register char	*text, *status;
50{
51	static	char	logfile[MAXFULLNAME];
52	char		*prev;
53
54	if (*Rmtname == NULLCHAR) /* ignore logging if Rmtname is not yet set */
55		return;
56
57	prev = _uu_setlocale(LC_ALL, "C");
58	if (Nstat.t_pid == 0)
59		Nstat.t_pid = getpid();
60
61	if (_Lf != NULL
62	   && strncmp(Rmtname, BASENAME(logfile, '/'), MAXBASENAME) != 0) {
63		fclose(_Lf);
64		_Lf = NULL;
65	}
66
67	if (_Lf == NULL) {
68		sprintf(logfile, "%s/%s", Logfile, Rmtname);
69		_Lf = fopen(logfile, "a");
70		(void) chmod(logfile, LOGFILEMODE);
71		if (_Lf == NULL) {
72			(void) _uu_resetlocale(LC_ALL, prev);
73			return;
74		}
75		setbuf(_Lf, CNULL);
76	}
77	(void) fseek(_Lf, 0L, 2);
78	(void) fprintf(_Lf, "%s %s %s ", User, Rmtname, Jobid);
79	(void) fprintf(_Lf, "(%s,%ld,%d) ", timeStamp(), (long) Nstat.t_pid, Seqn);
80	(void) fprintf(_Lf, "%s (%s)\n", status, text);
81	(void) _uu_resetlocale(LC_ALL, prev);
82	return;
83}
84
85
86/*
87 * Make entry for a conversation (uucico only)
88 *	text	-> pointer to message string
89 * Returns:
90 *	none
91 */
92void
93usyslog(text)
94register char	*text;
95{
96	int	sbuflen;
97	char	sysbuf[BUFSIZ];
98	char	*prev = _uu_setlocale(LC_ALL, "C");
99
100	(void) sprintf(sysbuf, "%s!%s %s (%s) (%c,%ld,%d) [%s] %s\n",
101		Rmtname, User, CurRole == SLAVE ? "S" : "M", timeStamp(),
102		Pchar, (long) getpid(), Seqn, Dc, text);
103	sbuflen = strlen(sysbuf);
104	if (_Sf < 0) {
105		errno = 0;
106		_Sf = open(SYSLOG, 1);
107		if (errno == ENOENT) {
108			_Sf = creat(SYSLOG, LOGFILEMODE);
109			(void) chmod(SYSLOG, LOGFILEMODE);
110		}
111		if (_Sf < 0) {
112			(void) _uu_resetlocale(LC_ALL, prev);
113			return;
114		}
115	}
116	(void) lseek(_Sf, 0L, 2);
117	(void) write(_Sf, sysbuf, sbuflen);
118	(void) _uu_resetlocale(LC_ALL, prev);
119	return;
120}
121
122/*
123 * Make entry for a command
124 *	argc	-> number of command arguments
125 *	argv	-> pointer array to command arguments
126 * Returns:
127 *	none
128 */
129void
130commandlog(argc,argv)
131int argc;
132char **argv;
133{
134	int	fd;
135	char	*prev = _uu_setlocale(LC_ALL, "C");
136
137	if (_Cf == NULL) {
138		errno = 0;
139		fd = open(CMDLOG, O_WRONLY | O_APPEND);
140		if (errno == ENOENT) {
141			fd = creat(CMDLOG, LOGFILEMODE);
142			(void) chmod(CMDLOG, LOGFILEMODE);
143		}
144		if (fd < 0 || (_Cf = fdopen(fd, "a")) == NULL) {
145			(void) _uu_resetlocale(LC_ALL, prev);
146			return;
147		}
148	}
149	(void) fprintf(_Cf, "%s (%s) ",User, timeStamp() );
150	while (argc-- > 0) {
151		(void) fprintf(_Cf, "%s%c", *argv++, (argc > 0)?' ':'\n');
152	}
153	(void) fflush(_Cf);
154	(void) _uu_resetlocale(LC_ALL, prev);
155	return;
156}
157
158/*
159 * Close log files before a fork
160 */
161void
162ucloselog()
163{
164	if (_Sf >= 0) {
165		(void) close(_Sf);
166		_Sf = -1;
167	}
168	if (_Lf) {
169		(void) fclose(_Lf);
170		_Lf = NULL;
171	}
172	if (_Cf) {
173		(void) fclose(_Cf);
174		_Cf = NULL;
175	}
176	return;
177}
178
179/*
180 *	millitick()
181 *
182 *	return msec since last time called
183 */
184#ifdef ATTSV
185#include <values.h>
186
187time_t
188millitick()
189{
190	struct tms	tbuf;
191	time_t	now, rval;
192	static time_t	past;	/* guaranteed 0 first time called */
193
194	if (past == 0) {
195		past = times(&tbuf);
196		rval = 0;
197	} else {
198		now = times(&tbuf);
199		if (now - past > MAXLONG / 1000)	/* would overflow */
200			rval = (now - past) / HZ * 1000;
201		else
202			rval = (now - past) * 1000 / HZ;
203		past = now;
204	}
205	return(rval);
206}
207
208#else /* !ATTSV */
209time_t
210millitick()
211{
212	struct timeb	tbuf;
213	static struct timeb	tbuf1;
214	static past;		/* guaranteed 0 first time called */
215	time_t	rval;
216
217	if (past == 0) {
218		past++;
219		rval = 0;
220		ftime(&tbuf1);
221	} else {
222		ftime(&tbuf);
223		rval = (tbuf.time - tbuf1.time) * 1000
224			+ tbuf.millitm - tbuf1.millitm;
225		tbuf1 = tbuf;
226	}
227	return(rval);
228}
229#endif /* ATTSV */
230