]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/ntp/libntp/msyslog.c
This commit was generated by cvs2svn to compensate for changes in r57422,
[FreeBSD/FreeBSD.git] / contrib / ntp / libntp / msyslog.c
1 /*
2  * msyslog - either send a message to the terminal or print it on
3  *           the standard output.
4  *
5  * Converted to use varargs, much better ... jks
6  */
7
8 #ifdef HAVE_CONFIG_H
9 # include <config.h>
10 #endif
11
12 #ifdef HAVE_SYS_TYPES_H
13 # include <sys/types.h>
14 #endif
15 #ifdef HAVE_UNISTD_H
16 # include <unistd.h>
17 #endif
18
19 #include <stdio.h>
20
21 #include "ntp_types.h"
22 #include "ntp_string.h"
23 #include "ntp_stdlib.h"
24 #include "ntp_syslog.h"
25
26 #ifdef SYS_WINNT
27 # include "..\ports\winnt\libntp\log.h"
28 # include "..\ports\winnt\libntp\messages.h"
29 #endif
30
31 int syslogit = 1;
32
33 FILE *syslog_file = NULL;
34
35 u_long ntp_syslogmask =  ~ (u_long) 0;
36
37 #ifdef SYS_WINNT
38 HANDLE  hEventSource;
39 LPTSTR lpszStrings[1];
40 static WORD event_type[] = {
41         EVENTLOG_ERROR_TYPE, EVENTLOG_ERROR_TYPE, EVENTLOG_ERROR_TYPE, EVENTLOG_ERROR_TYPE,
42         EVENTLOG_WARNING_TYPE,
43         EVENTLOG_INFORMATION_TYPE, EVENTLOG_INFORMATION_TYPE, EVENTLOG_INFORMATION_TYPE,
44 };
45 #endif /* SYS_WINNT */
46 extern  char *progname;
47
48 #if defined(__STDC__) || defined(HAVE_STDARG_H)
49 void msyslog(int level, const char *fmt, ...)
50 #else /* defined(__STDC__) || defined(HAVE_STDARG_H) */
51      /*VARARGS*/
52      void msyslog(va_alist)
53      va_dcl
54 #endif /* defined(__STDC__) || defined(HAVE_STDARG_H) */
55 {
56 #if defined(__STDC__) || defined(HAVE_STDARG_H)
57 #else
58         int level;
59         const char *fmt;
60 #endif
61         va_list ap;
62         char buf[1025], nfmt[256];
63 #if !defined(VMS)
64         char xerr[50];
65 #endif
66         register int c;
67         register char *n, *prog;
68         register const char *f;
69 #ifdef CHAR_SYS_ERRLIST
70         extern int sys_nerr;
71         extern char *sys_errlist[];
72 #endif
73         int olderrno;
74         char *err;
75
76 #if defined(__STDC__) || defined(HAVE_STDARG_H)
77         va_start(ap, fmt);
78 #else
79         va_start(ap);
80
81         level = va_arg(ap, int);
82         fmt = va_arg(ap, char *);
83 #endif
84
85         olderrno = errno;
86         n = nfmt;
87         f = fmt;
88         while ((c = *f++) != '\0' && c != '\n' && n < &nfmt[252]) {
89                 if (c != '%') {
90                         *n++ = c;
91                         continue;
92                 }
93                 if ((c = *f++) != 'm') {
94                         *n++ = '%';
95                         *n++ = c;
96                         continue;
97                 }
98                 err = 0;
99 #if !defined(VMS) && !defined(SYS_WINNT) && !defined (SYS_VXWORKS)
100                 if ((unsigned)olderrno > sys_nerr)
101                     sprintf((char *)(err = xerr), "error %d", olderrno);
102                 else
103                     err = (char*)sys_errlist[olderrno];
104 #elif defined(VMS) || defined (SYS_VXWORKS)
105                 err = strerror(olderrno);
106 #else  /* SYS_WINNT */
107                 err = xerr;
108                 FormatMessage( 
109                         FORMAT_MESSAGE_FROM_SYSTEM,
110                         NULL,
111                         GetLastError(),
112                         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
113                         (LPTSTR) err,
114                         sizeof(xerr),
115                         NULL);
116
117 #endif /* VMS && SYS_WINNT */
118                 if ((n + strlen(err)) < &nfmt[254]) {
119                         strcpy(n, err);
120                         n += strlen(err);
121                 }
122         }
123 #if !defined(VMS)
124         if (!syslogit)
125 #endif /* VMS */
126             *n++ = '\n';
127         *n = '\0';
128
129         vsprintf(buf, nfmt, ap);
130 #if !defined(VMS) && !defined (SYS_VXWORKS)
131         if (syslogit)
132 #ifndef SYS_WINNT
133             syslog(level, "%s", buf);
134 #else
135         {
136                 lpszStrings[0] = buf;
137  
138                 switch (event_type[level])
139                 {
140                     case EVENTLOG_ERROR_TYPE:
141                         reportAnEEvent(NTP_ERROR,1,lpszStrings);
142                         break;
143                     case EVENTLOG_INFORMATION_TYPE:
144                         reportAnIEvent(NTP_INFO,1,lpszStrings);
145                         break;
146                     case EVENTLOG_WARNING_TYPE:
147                         reportAnWEvent(NTP_WARNING,1,lpszStrings);
148                         break;
149                 } /* switch end */
150
151         } 
152 #endif /* SYS_WINNT */
153         else
154 #endif /* VMS  && SYS_VXWORKS*/
155         {
156                 FILE *out_file = syslog_file ? syslog_file
157                         : level <= LOG_ERR ? stderr : stdout;
158                 /* syslog() provides the timestamp, so if we're not using
159                    syslog, we must provide it. */
160                 prog = strrchr(progname, '/');
161                 if (prog == NULL)
162                     prog = progname;
163                 else
164                     prog++;
165                 (void) fprintf(out_file, "%s ", humanlogtime ());
166                 (void) fprintf(out_file, "%s[%d]: %s", prog, (int)getpid(), buf);
167                 fflush (out_file);
168         }
169         va_end(ap);
170 }