1 /*
2  * (C) Maint Laboratory 2003-2004
3  * Author: Elohin Igor'
4  * e-mail: maint@unona.ru
5  * fido  : 2:5070/222.52
6  * URL   : http://maint.unona.ru
7  */
8 #include <stdio.h>
9 #include <syslog.h>
10 #include <stdarg.h>
11 #include <unistd.h>
12 #include <limits.h>
13 #include "../common.h"
14 
15 extern int verbose;
16 extern char *prgname;
17 char logname[PATH_MAX];
18 static FILE *logfd;
19 
loginit(char * service,char * dir)20 void loginit(char *service, char *dir)
21 {
22     logname[0] = '\0';
23     if (dir != NULL) {
24 	snprintf(logname, sizeof(logname), "%s/%s", dir, service);
25 	if ((logfd = fopen(logname, "w+")) == NULL) {
26 	    fprintf(stderr, "Warning: Cannot open %s. Use syslog\n",
27 		    logname);
28 	    logname[0] = '\0';
29 	    service = "news";
30 	} else
31 	    return;
32     }
33     logname[0] = '\0';
34     openlog(service, LOG_CONS | LOG_NDELAY, LOG_NEWS);
35 }
36 
logclose()37 void logclose()
38 {
39     if (logname[0] != '\0') {
40         fflush(logfd);
41 	fclose(logfd);
42 	logname[0] = '\0';
43     } else {
44 	closelog();
45     }
46 }
myerror(const char * fmt,...)47 void myerror(const char *fmt, ...)
48 {
49     va_list ap;
50     char out[MSGBUF];
51 
52     va_start(ap, fmt);
53     vsnprintf(out, MSGBUF, fmt, ap);
54     va_end(ap);
55 
56     if (verbose == 1) {
57 	fprintf(stderr, "%s\n", out);
58 	fflush(stderr);
59     }
60     if (logname[0] != '\0'){
61 	fprintf(logfd, "%s %s: %s\n", diagtime(), prgname, out);
62         fflush(logfd);
63     } else
64 	syslog(LOG_ERR, "%s: %s", prgname, out);
65 }
message(const char * fmt,...)66 void message(const char *fmt, ...)
67 {
68     va_list ap;
69     char out[MSGBUF];
70 
71     va_start(ap, fmt);
72     vsnprintf(out, MSGBUF, fmt, ap);
73     va_end(ap);
74 
75     if (verbose == 1) {
76 	fprintf(stderr, "%s\n", out);
77 	fflush(stderr);
78     }
79     if (logname[0] != '\0'){
80 	fprintf(logfd, "%s %s: %s\n", diagtime(), prgname, out);
81         fflush(logfd);
82     } else
83 	syslog(LOG_INFO, "%s: %s", prgname, out);
84 }
notice(const char * fmt,...)85 void notice(const char *fmt, ...)
86 {
87     va_list ap;
88     char out[MSGBUF];
89 
90     va_start(ap, fmt);
91     vsnprintf(out, MSGBUF, fmt, ap);
92     va_end(ap);
93 
94     if (verbose == 1) {
95 	fprintf(stderr, "%s\n", out);
96 	fflush(stderr);
97     }
98     if (logname[0] != '\0'){
99 	fprintf(logfd, "%s %s: %s\n", diagtime(), prgname, out);
100         fflush(logfd);
101     } else
102 	syslog(LOG_NOTICE, "%s: %s", prgname, out);
103 }
dolog(int flag,const char * fmt,...)104 void dolog(int flag, const char *fmt, ...)
105 {
106     va_list ap;
107     char out[MSGBUF];
108 
109     va_start(ap, fmt);
110     vsnprintf(out, MSGBUF, fmt, ap);
111     va_end(ap);
112 
113     if (verbose == 1) {
114 	fprintf(stderr, "%s\n", out);
115 	fflush(stderr);
116     }
117     if (logname[0] != '\0'){
118 	fprintf(logfd, "%s %s: %s\n", diagtime(), prgname, out);
119         fflush(logfd);
120     } else
121 	syslog(flag, "%s: %s", prgname, out);
122 }
123