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 Proofpoint, 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("@(#)$Id: syslogio.c,v 1.30 2013-11-22 20:51:43 ca 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;
}
}
|