xref: /illumos-gate/usr/src/cmd/bnu/logent.c (revision 069e6b7e31ba5dcbc5441b98af272714d9a5455c)
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 
35 static FILE	*_Lf = NULL;
36 static FILE	*_Cf = NULL;
37 static int	_Sf = -1;
38 static 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  */
47 void
48 logent(text, status)
49 register 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  */
92 void
93 usyslog(text)
94 register 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  */
129 void
130 commandlog(argc,argv)
131 int argc;
132 char **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  */
161 void
162 ucloselog()
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 
187 time_t
188 millitick()
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 */
209 time_t
210 millitick()
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