summaryrefslogtreecommitdiff
path: root/gnu/usr.sbin/sendmail/libsm/syslogio.c
blob: 99e8644af341c8595748dd2b852e03e522e11caa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
/*
 * Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
 *      All rights reserved.
 *
 * By using this file, you agree to the terms and conditions set
 * forth in the LICENSE file which can be found at the top level of
 * the sendmail distribution.
 */

#include <sm/gen.h>
SM_RCSID("@(#)$Sendmail: syslogio.c,v 1.29 2001/09/11 04:04:49 gshapiro Exp $")
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <syslog.h>
#include <errno.h>
#ifdef SM_RPOOL
# include <sm/rpool.h>
#endif /* SM_RPOOL */
#include <sm/io.h>
#include "local.h"

/*
**  Overall:
**  This is a output file type that copies its output to the syslog daemon.
**  Each line of output is written as a separate syslog message.
**  The client is responsible for calling openlog() before writing to
**  any syslog file, and calling closelog() after all syslog output is complete.
**  The only state associated with a syslog file is 'int priority',
**  which we store in fp->f_ival.
*/

/*
**  SM_SYSLOGOPEN -- open a file pointer to syslog
**
**	Parameters:
**		fp -- file pointer assigned for the open
**		info -- priority level of the syslog messages
**		flags -- not used
**		rpool -- ignored
**
**	Returns:
**		0 (zero) success always (see Overall)
*/

int
sm_syslogopen(fp, info, flags, rpool)
	SM_FILE_T *fp;
	const void *info;
	int flags;
	const void *rpool;
{
	int *priority = (int *)info;

	fp->f_ival = *priority;
	return 0;
}

/*
**  SM_SYSLOGREAD -- read function for syslog
**
**  This is a "stub" function (placeholder) that always returns an error.
**  It is an error to read syslog.
**
**	Parameters:
**		fp -- the file pointer
**		buf -- buffer to place the data read
**		n -- number of bytes to read
**
**	Returns:
**		-1 (error) always and sets errno
*/

ssize_t
sm_syslogread(fp, buf, n)
	SM_FILE_T *fp;
	char *buf;
	size_t n;
{
	/* an error to read */
	errno = ENODEV;
	return -1;
}

/*
**  SM_SYSLOGWRITE -- write function for syslog
**
**  Send output to syslog.
**
**	Parameters:
**		fp -- the file pointer
**		buf -- buffer that the write data comes from
**		n -- number of bytes to write
**
**	Returns:
**		0 (zero) for success always
*/

/*
**  XXX TODO: more work needs to be done to ensure that each line of output
**  XXX written to a syslog file is mapped to exactly one syslog message.
*/
ssize_t
sm_syslogwrite(fp, buf, n)
	SM_FILE_T *fp;
	char const *buf;
	size_t n;
{
	syslog(fp->f_ival, "%s", buf);
	return 0;
}

/*
**  SM_SYSLOGSEEK -- position the syslog file offset
**
**  This is a "stub" function (placeholder) that always returns an error.
**  It is an error to seek syslog.
**
**	Parameters:
**		fp -- the file pointer
**		offset -- the new offset position relative to 'whence'
**		whence -- flag indicating start of 'offset'
**
**	Returns:
**		-1 (error) always.
*/

off_t
sm_syslogseek(fp, offset, whence)
	SM_FILE_T *fp;
	off_t offset;
	int whence;
{
	errno = ENODEV;
	return -1;
}

/*
**  SM_SYSLOGCLOSE -- close the syslog file pointer
**
**	Parameters:
**		fp -- the file pointer
**
**	Returns:
**		0 (zero) success always (see Overall)
**
*/

int
sm_syslogclose(fp)
	SM_FILE_T *fp;
{
	return 0;
}

/*
**  SM_SYSLOGSETINFO -- set information for the file pointer
**
**	Parameters:
**		fp -- the file pointer being set
**		what -- what information is being set
**		valp -- information content being set to
**
**	Returns:
**		-1 on failure
**		0 (zero) on success
**
**	Side Effects:
**		Sets internal file pointer data
*/

int
sm_syslogsetinfo(fp, what, valp)
	SM_FILE_T *fp;
	int what;
	void *valp;
{
	switch (what)
	{
	  case SM_IO_SL_PRIO:
		fp->f_ival = *((int *)(valp));
		return 0;
	  default:
		errno = EINVAL;
		return -1;
	}
}

/*
**  SM_SYSLOGGETINFO -- get information relating to the file pointer
**
**	Parameters:
**		fp -- the file pointer being queried
**		what -- the information type being queried
**		valp -- location to placed queried information
**
**	Returns:
**		0 (zero) on success
**		-1 on failure
**
**	Side Effects:
**		Fills in 'valp' with data.
*/

int
sm_sysloggetinfo(fp, what, valp)
	SM_FILE_T *fp;
	int what;
	void *valp;
{
	switch (what)
	{
	  case SM_IO_SL_PRIO:
		*((int *)(valp)) = fp->f_ival;
		return 0;
	  default:
		errno = EINVAL;
		return -1;
	}
}