1 /*
2  * Copyright (c) 2001 Mark Fullmer and The Ohio State University
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  *      $Id: fterr.c,v 1.9 2003/02/13 02:38:41 maf Exp $
27  */
28 
29 #include "ftconfig.h"
30 #include "ftlib.h"
31 
32 #include <errno.h>
33 #include <stdio.h>
34 #include <syslog.h>
35 #include <stdarg.h>
36 #include <stdlib.h>
37 
38 #if HAVE_STRINGS_H
39  #include <strings.h>
40 #endif
41 #if HAVE_STRING_H
42   #include <string.h>
43 #endif
44 
45 
46 #define FTERR_FILE   1
47 #define FTERR_SYSLOG 2
48 
49 static int fterr_flags = FTERR_FILE;
50 static FILE *fterr_file;
51 static char *fterr_id = "";
52 static void (*fterr_exit)(int);
53 
fterr_setexit(void (* f)(int))54 void fterr_setexit(void (*f)(int))
55 {
56         fterr_exit = f;
57 } /* fterr_set_exit */
58 
59 
fterr_setid(char * id)60 void fterr_setid(char *id)
61 {
62   char *c;
63 
64   /* skip to end */
65   for (c = id; *c; ++c);
66 
67   /* skip back to first / or begining */
68   for (; (c != id) && (*c != '/'); --c);
69 
70   if (c != id)
71     fterr_id = c+1;
72   else
73     fterr_id = c;
74 
75 }
76 
fterr_setfile(int enable,void * fp)77 void fterr_setfile(int enable, void *fp)
78 {
79   if (enable) {
80     fterr_flags |= FTERR_FILE;
81     fterr_file = fp;
82   }
83   else
84     fterr_flags &= ~FTERR_FILE;
85 }
86 
fterr_setsyslog(int enable,int logopt,int facility)87 void fterr_setsyslog(int enable, int logopt, int facility)
88 {
89   if (enable) {
90     fterr_flags |= FTERR_SYSLOG;
91     openlog(fterr_id, logopt, facility);
92   } else {
93     if (fterr_flags & FTERR_SYSLOG)
94       closelog();
95     fterr_flags &= ~FTERR_SYSLOG;
96   }
97 }
98 
fterr_info(const char * fmt,...)99 void fterr_info(const char *fmt, ...)
100 {
101   va_list ap;
102   char buf[1025];
103   char buf2[1025];
104 
105   va_start(ap, fmt);
106   vsnprintf(buf, (size_t)1024, fmt, ap);
107   va_end(ap);
108 
109   snprintf(buf2, 1024, "%s: %s", fterr_id, buf);
110 
111   if (fterr_flags & FTERR_FILE)
112     fprintf(((fterr_file) ? fterr_file : stderr), "%s\n", buf2);
113 
114   if (fterr_flags & FTERR_SYSLOG)
115     syslog(LOG_INFO, "%s", buf);
116 
117 } /* fterr_info */
118 
fterr_err(int code,const char * fmt,...)119 void fterr_err(int code, const char *fmt, ...)
120 {
121   va_list ap;
122   char buf[1025];
123   char buf2[1025];
124 
125   va_start(ap, fmt);
126   vsnprintf(buf, (size_t)1024, fmt, ap);
127   va_end(ap);
128 
129 
130   if (fterr_flags & FTERR_FILE) {
131     snprintf(buf2, 1024, "%s: %s: %s", fterr_id, buf, strerror(errno));
132     fprintf(((fterr_file) ? fterr_file : stderr), "%s\n", buf2);
133   }
134 
135   if (fterr_flags & FTERR_SYSLOG) {
136     snprintf(buf2, 1024, "%s: %s", buf, strerror(errno));
137     syslog(LOG_INFO, "%s", buf2);
138   }
139 
140   if (fterr_exit)
141     fterr_exit(code);
142   exit (code);
143 
144 } /* fterr_err */
145 
fterr_errx(int code,const char * fmt,...)146 void fterr_errx(int code, const char *fmt, ...)
147 {
148   va_list ap;
149   char buf[1025];
150   char buf2[1025];
151 
152   va_start(ap, fmt);
153   vsnprintf(buf, (size_t)1024, fmt, ap);
154   va_end(ap);
155 
156   if (fterr_flags & FTERR_FILE) {
157     snprintf(buf2, 1024, "%s: %s", fterr_id, buf);
158     fprintf(((fterr_file) ? fterr_file : stderr), "%s\n", buf2);
159   }
160 
161   if (fterr_flags & FTERR_SYSLOG)
162     syslog(LOG_INFO, "%s", buf);
163 
164   if (fterr_exit)
165     fterr_exit(code);
166   exit (code);
167 
168 } /* fterr_errx */
169 
fterr_warnx(const char * fmt,...)170 void fterr_warnx(const char *fmt, ...)
171 {
172   va_list ap;
173   char buf[1025];
174   char buf2[1025];
175 
176   va_start(ap, fmt);
177   vsnprintf(buf, (size_t)1024, fmt, ap);
178   va_end(ap);
179 
180   if (fterr_flags & FTERR_FILE) {
181     snprintf(buf2, 1024, "%s: %s", fterr_id, buf);
182     fprintf(((fterr_file) ? fterr_file : stderr), "%s\n", buf2);
183   }
184 
185   if (fterr_flags & FTERR_SYSLOG)
186     syslog(LOG_INFO, "%s", buf);
187 
188 } /* fterr_warnx */
189 
fterr_warn(const char * fmt,...)190 void fterr_warn(const char *fmt, ...)
191 {
192   va_list ap;
193   char buf[1025];
194   char buf2[1025];
195 
196   va_start(ap, fmt);
197   vsnprintf(buf, (size_t)1024, fmt, ap);
198   va_end(ap);
199 
200 
201   if (fterr_flags & FTERR_FILE) {
202     snprintf(buf2, 1024, "%s: %s: %s", fterr_id, buf, strerror(errno));
203     fprintf(((fterr_file) ? fterr_file : stderr), "%s\n", buf2);
204   }
205 
206   if (fterr_flags & FTERR_SYSLOG) {
207     snprintf(buf2, 1024, "%s: %s", buf, strerror(errno));
208     syslog(LOG_INFO, "%s", buf2);
209   }
210 
211 } /* fterr_warn */
212 
213