ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/ihost/libukcprog/logf.c
Revision: 1.1
Committed: Fri Mar 8 14:37:29 2002 UTC (22 years, 8 months ago) by tdb
Content type: text/plain
Branch: MAIN
CVS Tags: IHOST_1_5_3, IHOST_1_5_2, IHOST_1_5_1, IHOST_1_5, IHOST_1_0_RC1
Log Message:
I'm not usually up for putting third party sources in here, but in this
case I'll make an exception. This is ukcprog, a set of useful C functions
which the ihost plugins Pete's writing uses. It's got a pretty free license
too. I've munged the Makefile around, as all it needs to do now is make the
library, not install anything. The idea is to statically compile the other
programs against this library, making the final binary independent of this
code etc.

File Contents

# User Rev Content
1 tdb 1.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     }