ea50d71feb
prevents doing this in one pass.
221 lines
4.1 KiB
C
221 lines
4.1 KiB
C
/*
|
|
* 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("@(#)$Id: 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;
|
|
}
|
|
}
|