1 /*
2 * Copyright (c) 2000-2001 Proofpoint, Inc. and its suppliers.
3 * All rights reserved.
4 *
5 * By using this file, you agree to the terms and conditions set
6 * forth in the LICENSE file which can be found at the top level of
7 * the sendmail distribution.
8 */
9
10 #include <sm/gen.h>
11 SM_RCSID("@(#)$Id: syslogio.c,v 1.30 2013-11-22 20:51:43 ca Exp $")
12 #include <stdlib.h>
13 #include <unistd.h>
14 #include <fcntl.h>
15 #include <syslog.h>
16 #include <errno.h>
17 #ifdef SM_RPOOL
18 # include <sm/rpool.h>
19 #endif
20 #include <sm/io.h>
21 #include "local.h"
22
23 /*
24 ** Overall:
25 ** This is a output file type that copies its output to the syslog daemon.
26 ** Each line of output is written as a separate syslog message.
27 ** The client is responsible for calling openlog() before writing to
28 ** any syslog file, and calling closelog() after all syslog output is complete.
29 ** The only state associated with a syslog file is 'int priority',
30 ** which we store in fp->f_ival.
31 */
32
33 /*
34 ** SM_SYSLOGOPEN -- open a file pointer to syslog
35 **
36 ** Parameters:
37 ** fp -- file pointer assigned for the open
38 ** info -- priority level of the syslog messages
39 ** flags -- not used
40 ** rpool -- ignored
41 **
42 ** Returns:
43 ** 0 (zero) success always (see Overall)
44 */
45
46 int
47 sm_syslogopen(fp, info, flags, rpool)
48 SM_FILE_T *fp;
49 const void *info;
50 int flags;
51 const void *rpool;
52 {
53 int *priority = (int *)info;
54
55 fp->f_ival = *priority;
56 return 0;
57 }
58
59 /*
60 ** SM_SYSLOGREAD -- read function for syslog
61 **
62 ** This is a "stub" function (placeholder) that always returns an error.
63 ** It is an error to read syslog.
64 **
65 ** Parameters:
66 ** fp -- the file pointer
67 ** buf -- buffer to place the data read
68 ** n -- number of bytes to read
69 **
70 ** Returns:
71 ** -1 (error) always and sets errno
72 */
73
74 ssize_t
sm_syslogread(fp,buf,n)75 sm_syslogread(fp, buf, n)
76 SM_FILE_T *fp;
77 char *buf;
78 size_t n;
79 {
80 /* an error to read */
81 errno = ENODEV;
82 return -1;
83 }
84
85 /*
86 ** SM_SYSLOGWRITE -- write function for syslog
87 **
88 ** Send output to syslog.
89 **
90 ** Parameters:
91 ** fp -- the file pointer
92 ** buf -- buffer that the write data comes from
93 ** n -- number of bytes to write
94 **
95 ** Returns:
96 ** 0 (zero) for success always
97 */
98
99 /*
100 ** XXX TODO: more work needs to be done to ensure that each line of output
101 ** XXX written to a syslog file is mapped to exactly one syslog message.
102 */
103 ssize_t
sm_syslogwrite(fp,buf,n)104 sm_syslogwrite(fp, buf, n)
105 SM_FILE_T *fp;
106 char const *buf;
107 size_t n;
108 {
109 syslog(fp->f_ival, "%s", buf);
110 return 0;
111 }
112
113 /*
114 ** SM_SYSLOGSEEK -- position the syslog file offset
115 **
116 ** This is a "stub" function (placeholder) that always returns an error.
117 ** It is an error to seek syslog.
118 **
119 ** Parameters:
120 ** fp -- the file pointer
121 ** offset -- the new offset position relative to 'whence'
122 ** whence -- flag indicating start of 'offset'
123 **
124 ** Returns:
125 ** -1 (error) always.
126 */
127
128 off_t
sm_syslogseek(fp,offset,whence)129 sm_syslogseek(fp, offset, whence)
130 SM_FILE_T *fp;
131 off_t offset;
132 int whence;
133 {
134 errno = ENODEV;
135 return -1;
136 }
137
138 /*
139 ** SM_SYSLOGCLOSE -- close the syslog file pointer
140 **
141 ** Parameters:
142 ** fp -- the file pointer
143 **
144 ** Returns:
145 ** 0 (zero) success always (see Overall)
146 **
147 */
148
149 int
sm_syslogclose(fp)150 sm_syslogclose(fp)
151 SM_FILE_T *fp;
152 {
153 return 0;
154 }
155
156 /*
157 ** SM_SYSLOGSETINFO -- set information for the file pointer
158 **
159 ** Parameters:
160 ** fp -- the file pointer being set
161 ** what -- what information is being set
162 ** valp -- information content being set to
163 **
164 ** Returns:
165 ** -1 on failure
166 ** 0 (zero) on success
167 **
168 ** Side Effects:
169 ** Sets internal file pointer data
170 */
171
172 int
sm_syslogsetinfo(fp,what,valp)173 sm_syslogsetinfo(fp, what, valp)
174 SM_FILE_T *fp;
175 int what;
176 void *valp;
177 {
178 switch (what)
179 {
180 case SM_IO_SL_PRIO:
181 fp->f_ival = *((int *)(valp));
182 return 0;
183 default:
184 errno = EINVAL;
185 return -1;
186 }
187 }
188
189 /*
190 ** SM_SYSLOGGETINFO -- get information relating to the file pointer
191 **
192 ** Parameters:
193 ** fp -- the file pointer being queried
194 ** what -- the information type being queried
195 ** valp -- location to placed queried information
196 **
197 ** Returns:
198 ** 0 (zero) on success
199 ** -1 on failure
200 **
201 ** Side Effects:
202 ** Fills in 'valp' with data.
203 */
204
205 int
sm_sysloggetinfo(fp,what,valp)206 sm_sysloggetinfo(fp, what, valp)
207 SM_FILE_T *fp;
208 int what;
209 void *valp;
210 {
211 switch (what)
212 {
213 case SM_IO_SL_PRIO:
214 *((int *)(valp)) = fp->f_ival;
215 return 0;
216 default:
217 errno = EINVAL;
218 return -1;
219 }
220 }
221