ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libukcprog/src/logf.c
Revision: 1.1
Committed: Sat Mar 29 16:30:33 2003 UTC (21 years, 9 months ago) by tdb
Content type: text/plain
Branch: MAIN
CVS Tags: LIBUKCPROG_1_0_2, LIBUKCPROG_1_0_1, LIBUKCPROG_1_0, HEAD
Error occurred while calculating annotation data.
Log Message:
libukcprog is now a seperate package. I doubt this will be much use to
anyone other than us, but I see no reason why we can't package it up
and distribute it. Obviously we can't attach the GPL to this, as we
don't own it.

File Contents

# Content
1 /* logf.c -- Log file and error reporting routines. */
2
3 /* Copyright 1992 Godfrey Paul, University of Kent of Canterbury. */
4
5 char ukcprog_logf_sccsid[] = "$Id: logf.c,v 1.22 1999/07/15 11:10:21 djb1 Exp $ UKC";
6
7 #ifndef MSDOS
8 #include <sys/types.h>
9 #else
10 #include <sys/tk_types.h>
11 #endif
12
13 #include <fcntl.h>
14
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <string.h>
18 #include <time.h>
19 #include <errno.h>
20 #ifdef __STDC__
21 #ifndef VMS
22 #include <unistd.h>
23 #endif /* VMS */
24 #include <stdarg.h>
25 #else
26 #include <varargs.h>
27 #endif
28
29 #ifndef MSDOS
30 #ifndef __FreeBSD__
31 #ifndef linux
32 extern int sys_nerr, errno;
33 extern char *sys_errlist[];
34 #endif /* !linux */
35 #endif /* !__FreeBSD__ */
36 #endif /* !MSDOS */
37
38 #include "ukcprog.h"
39
40 static void write_logstr PROTO((const char *str, bool err));
41 static const char *get_errno_str PROTO((void));
42
43 static int Log_fd = 2; /* just print to stderr by default */
44 static int Log_level = LG_INFO; /* by default */
45 static char *Log_prefix; /* identification tag */
46 static int Log_prefix_len = 0;
47
48 /* This is to avoid using %m in logf_set_ofile. We should really make
49 * this public and use it in formf().
50 */
51 static const char *
52 get_errno_str()
53 {
54 static char buf[40];
55
56 if (errno > 0 && errno < sys_nerr && *sys_errlist[errno] != '\0')
57 return sys_errlist[errno];
58
59 sprintf(buf, "[errno=%d (unknown value)]", errno);
60 return buf;
61 }
62
63 int
64 logf_set_ofile(filename, prefix)
65 const char *filename, *prefix;
66 {
67 static bool first_time = TRUE;
68 int fd;
69
70 if (filename != NULL) {
71 if ((fd = open(filename, O_RDWR|O_APPEND|O_CREAT, 0666)) < 0) {
72 errf("Can't open logfile %s (%s)",
73 filename, get_errno_str());
74 return -1;
75 }
76
77 if (!first_time)
78 (void)close(Log_fd);
79 else
80 first_time = FALSE;
81
82 Log_fd = fd;
83 }
84
85 if (prefix != NULL) {
86 if (Log_prefix != NULL)
87 free(Log_prefix);
88 Log_prefix = strsave(prefix);
89 Log_prefix_len = strlen(Log_prefix);
90 }
91
92 return 0;
93 }
94
95
96 static void
97 write_logstr(str, err)
98 const char *str;
99 bool err;
100 {
101 time_t now;
102 const char *errstr;
103
104 if (Log_fd < 0) {
105 fprintf(stderr, "%s: %s\n", errf_get_progname(), str);
106 return;
107 }
108
109 now = time((time_t *)NULL);
110 errstr = err ? " ERROR: " : " ";
111
112 write(Log_fd, ctime(&now), sizeof("Fri Sep 9 15:10:00 ") - 1);
113 write(Log_fd, Log_prefix, Log_prefix_len);
114 write(Log_fd, errstr, strlen(errstr));
115 write(Log_fd, str, strlen(str));
116 write(Log_fd, "\n", 1);
117 }
118
119
120 #ifdef __STDC__
121 void
122 logf(int level, const char *fmt, ...)
123 {
124
125 #else /* !__STDC__ */
126 void
127 logf(va_alist)
128 va_dcl
129 {
130 int level;
131 char *fmt;
132 #endif /* !__STDC__ */
133 va_list args;
134 char buffer[100];
135 char *s;
136
137 #ifdef __STDC__
138 va_start(args, fmt);
139 #else
140 va_start(args);
141 level = va_arg(args, int);
142 fmt = va_arg(args, char *);
143 #endif
144 if (level < Log_level) {
145 va_end(args);
146 return;
147 }
148
149 s = formf(buffer, sizeof(buffer), fmt, args);
150 va_end(args);
151 write_logstr(s, FALSE);
152
153 if (s != buffer)
154 free(s); /* allocated by formf() */
155 }
156
157 int
158 logf_set_level(new_level)
159 int new_level;
160 {
161 int old;
162
163 old = Log_level;
164 Log_level = new_level;
165 logf(LG_LOG, "Log level changed from %d to %d", old, new_level);
166
167 return old;
168 }
169
170
171 void
172 logf_errf_ofunc(str)
173 const char *str;
174 {
175 write_logstr(str, TRUE);
176 }