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