/* * 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_RCSID("@(#)$Id: syslogio.c,v 1.29 2001/09/11 04:04:49 gshapiro Exp $") #include #include #include #include #include #ifdef SM_RPOOL # include #endif /* SM_RPOOL */ #include #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; } }