aboutsummaryrefslogtreecommitdiff
path: root/sendmail/libsm/syslogio.c
diff options
context:
space:
mode:
Diffstat (limited to 'sendmail/libsm/syslogio.c')
-rw-r--r--sendmail/libsm/syslogio.c220
1 files changed, 220 insertions, 0 deletions
diff --git a/sendmail/libsm/syslogio.c b/sendmail/libsm/syslogio.c
new file mode 100644
index 000000000000..24fa3a23b313
--- /dev/null
+++ b/sendmail/libsm/syslogio.c
@@ -0,0 +1,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("@(#)$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;
+ }
+}