xref: /freebsd/contrib/sendmail/libsm/syslogio.c (revision 94c01205)
140266059SGregory Neil Shapiro /*
240266059SGregory Neil Shapiro  * Copyright (c) 2000-2001 Proofpoint, Inc. and its suppliers.
340266059SGregory Neil Shapiro  *      All rights reserved.
440266059SGregory Neil Shapiro  *
540266059SGregory Neil Shapiro  * By using this file, you agree to the terms and conditions set
640266059SGregory Neil Shapiro  * forth in the LICENSE file which can be found at the top level of
740266059SGregory Neil Shapiro  * the sendmail distribution.
840266059SGregory Neil Shapiro  */
940266059SGregory Neil Shapiro 
1040266059SGregory Neil Shapiro #include <sm/gen.h>
1194c01205SGregory Neil Shapiro SM_RCSID("@(#)$Id: syslogio.c,v 1.30 2013-11-22 20:51:43 ca Exp $")
1240266059SGregory Neil Shapiro #include <stdlib.h>
1340266059SGregory Neil Shapiro #include <unistd.h>
1440266059SGregory Neil Shapiro #include <fcntl.h>
1540266059SGregory Neil Shapiro #include <syslog.h>
1640266059SGregory Neil Shapiro #include <errno.h>
1740266059SGregory Neil Shapiro #ifdef SM_RPOOL
1840266059SGregory Neil Shapiro # include <sm/rpool.h>
1940266059SGregory Neil Shapiro #endif
2040266059SGregory Neil Shapiro #include <sm/io.h>
2140266059SGregory Neil Shapiro #include "local.h"
2240266059SGregory Neil Shapiro 
2340266059SGregory Neil Shapiro /*
2440266059SGregory Neil Shapiro **  Overall:
2540266059SGregory Neil Shapiro **  This is a output file type that copies its output to the syslog daemon.
2640266059SGregory Neil Shapiro **  Each line of output is written as a separate syslog message.
2740266059SGregory Neil Shapiro **  The client is responsible for calling openlog() before writing to
2840266059SGregory Neil Shapiro **  any syslog file, and calling closelog() after all syslog output is complete.
2940266059SGregory Neil Shapiro **  The only state associated with a syslog file is 'int priority',
3040266059SGregory Neil Shapiro **  which we store in fp->f_ival.
3140266059SGregory Neil Shapiro */
3240266059SGregory Neil Shapiro 
3340266059SGregory Neil Shapiro /*
3440266059SGregory Neil Shapiro **  SM_SYSLOGOPEN -- open a file pointer to syslog
3540266059SGregory Neil Shapiro **
3640266059SGregory Neil Shapiro **	Parameters:
3740266059SGregory Neil Shapiro **		fp -- file pointer assigned for the open
3840266059SGregory Neil Shapiro **		info -- priority level of the syslog messages
3940266059SGregory Neil Shapiro **		flags -- not used
4040266059SGregory Neil Shapiro **		rpool -- ignored
4140266059SGregory Neil Shapiro **
4240266059SGregory Neil Shapiro **	Returns:
4340266059SGregory Neil Shapiro **		0 (zero) success always (see Overall)
4440266059SGregory Neil Shapiro */
4540266059SGregory Neil Shapiro 
4640266059SGregory Neil Shapiro int
4740266059SGregory Neil Shapiro sm_syslogopen(fp, info, flags, rpool)
4840266059SGregory Neil Shapiro 	SM_FILE_T *fp;
4940266059SGregory Neil Shapiro 	const void *info;
5040266059SGregory Neil Shapiro 	int flags;
5140266059SGregory Neil Shapiro 	const void *rpool;
5240266059SGregory Neil Shapiro {
5340266059SGregory Neil Shapiro 	int *priority = (int *)info;
5440266059SGregory Neil Shapiro 
5540266059SGregory Neil Shapiro 	fp->f_ival = *priority;
5640266059SGregory Neil Shapiro 	return 0;
5740266059SGregory Neil Shapiro }
5840266059SGregory Neil Shapiro 
5940266059SGregory Neil Shapiro /*
6040266059SGregory Neil Shapiro **  SM_SYSLOGREAD -- read function for syslog
6140266059SGregory Neil Shapiro **
6240266059SGregory Neil Shapiro **  This is a "stub" function (placeholder) that always returns an error.
6340266059SGregory Neil Shapiro **  It is an error to read syslog.
6440266059SGregory Neil Shapiro **
6540266059SGregory Neil Shapiro **	Parameters:
6640266059SGregory Neil Shapiro **		fp -- the file pointer
6740266059SGregory Neil Shapiro **		buf -- buffer to place the data read
6840266059SGregory Neil Shapiro **		n -- number of bytes to read
6940266059SGregory Neil Shapiro **
7040266059SGregory Neil Shapiro **	Returns:
7140266059SGregory Neil Shapiro **		-1 (error) always and sets errno
7240266059SGregory Neil Shapiro */
7340266059SGregory Neil Shapiro 
7440266059SGregory Neil Shapiro ssize_t
sm_syslogread(fp,buf,n)7540266059SGregory Neil Shapiro sm_syslogread(fp, buf, n)
7640266059SGregory Neil Shapiro 	SM_FILE_T *fp;
7740266059SGregory Neil Shapiro 	char *buf;
7840266059SGregory Neil Shapiro 	size_t n;
7940266059SGregory Neil Shapiro {
8040266059SGregory Neil Shapiro 	/* an error to read */
8140266059SGregory Neil Shapiro 	errno = ENODEV;
8240266059SGregory Neil Shapiro 	return -1;
8340266059SGregory Neil Shapiro }
8440266059SGregory Neil Shapiro 
8540266059SGregory Neil Shapiro /*
8640266059SGregory Neil Shapiro **  SM_SYSLOGWRITE -- write function for syslog
8740266059SGregory Neil Shapiro **
8840266059SGregory Neil Shapiro **  Send output to syslog.
8940266059SGregory Neil Shapiro **
9040266059SGregory Neil Shapiro **	Parameters:
9140266059SGregory Neil Shapiro **		fp -- the file pointer
9240266059SGregory Neil Shapiro **		buf -- buffer that the write data comes from
9340266059SGregory Neil Shapiro **		n -- number of bytes to write
9440266059SGregory Neil Shapiro **
9540266059SGregory Neil Shapiro **	Returns:
9640266059SGregory Neil Shapiro **		0 (zero) for success always
9740266059SGregory Neil Shapiro */
9840266059SGregory Neil Shapiro 
9940266059SGregory Neil Shapiro /*
10040266059SGregory Neil Shapiro **  XXX TODO: more work needs to be done to ensure that each line of output
10140266059SGregory Neil Shapiro **  XXX written to a syslog file is mapped to exactly one syslog message.
10240266059SGregory Neil Shapiro */
10340266059SGregory Neil Shapiro ssize_t
sm_syslogwrite(fp,buf,n)10440266059SGregory Neil Shapiro sm_syslogwrite(fp, buf, n)
10540266059SGregory Neil Shapiro 	SM_FILE_T *fp;
10640266059SGregory Neil Shapiro 	char const *buf;
10740266059SGregory Neil Shapiro 	size_t n;
10840266059SGregory Neil Shapiro {
10940266059SGregory Neil Shapiro 	syslog(fp->f_ival, "%s", buf);
11040266059SGregory Neil Shapiro 	return 0;
11140266059SGregory Neil Shapiro }
11240266059SGregory Neil Shapiro 
11340266059SGregory Neil Shapiro /*
11440266059SGregory Neil Shapiro **  SM_SYSLOGSEEK -- position the syslog file offset
11540266059SGregory Neil Shapiro **
11640266059SGregory Neil Shapiro **  This is a "stub" function (placeholder) that always returns an error.
11740266059SGregory Neil Shapiro **  It is an error to seek syslog.
11840266059SGregory Neil Shapiro **
11940266059SGregory Neil Shapiro **	Parameters:
12040266059SGregory Neil Shapiro **		fp -- the file pointer
12140266059SGregory Neil Shapiro **		offset -- the new offset position relative to 'whence'
12240266059SGregory Neil Shapiro **		whence -- flag indicating start of 'offset'
12340266059SGregory Neil Shapiro **
12440266059SGregory Neil Shapiro **	Returns:
12540266059SGregory Neil Shapiro **		-1 (error) always.
12640266059SGregory Neil Shapiro */
12740266059SGregory Neil Shapiro 
12840266059SGregory Neil Shapiro off_t
sm_syslogseek(fp,offset,whence)12940266059SGregory Neil Shapiro sm_syslogseek(fp, offset, whence)
13040266059SGregory Neil Shapiro 	SM_FILE_T *fp;
13140266059SGregory Neil Shapiro 	off_t offset;
13240266059SGregory Neil Shapiro 	int whence;
13340266059SGregory Neil Shapiro {
13440266059SGregory Neil Shapiro 	errno = ENODEV;
13540266059SGregory Neil Shapiro 	return -1;
13640266059SGregory Neil Shapiro }
13740266059SGregory Neil Shapiro 
13840266059SGregory Neil Shapiro /*
13940266059SGregory Neil Shapiro **  SM_SYSLOGCLOSE -- close the syslog file pointer
14040266059SGregory Neil Shapiro **
14140266059SGregory Neil Shapiro **	Parameters:
14240266059SGregory Neil Shapiro **		fp -- the file pointer
14340266059SGregory Neil Shapiro **
14440266059SGregory Neil Shapiro **	Returns:
14540266059SGregory Neil Shapiro **		0 (zero) success always (see Overall)
14640266059SGregory Neil Shapiro **
14740266059SGregory Neil Shapiro */
14840266059SGregory Neil Shapiro 
14940266059SGregory Neil Shapiro int
sm_syslogclose(fp)15040266059SGregory Neil Shapiro sm_syslogclose(fp)
15140266059SGregory Neil Shapiro 	SM_FILE_T *fp;
15240266059SGregory Neil Shapiro {
15340266059SGregory Neil Shapiro 	return 0;
15440266059SGregory Neil Shapiro }
15540266059SGregory Neil Shapiro 
15640266059SGregory Neil Shapiro /*
15740266059SGregory Neil Shapiro **  SM_SYSLOGSETINFO -- set information for the file pointer
15840266059SGregory Neil Shapiro **
15940266059SGregory Neil Shapiro **	Parameters:
16040266059SGregory Neil Shapiro **		fp -- the file pointer being set
16140266059SGregory Neil Shapiro **		what -- what information is being set
16240266059SGregory Neil Shapiro **		valp -- information content being set to
16340266059SGregory Neil Shapiro **
16440266059SGregory Neil Shapiro **	Returns:
16540266059SGregory Neil Shapiro **		-1 on failure
16640266059SGregory Neil Shapiro **		0 (zero) on success
16740266059SGregory Neil Shapiro **
16840266059SGregory Neil Shapiro **	Side Effects:
16940266059SGregory Neil Shapiro **		Sets internal file pointer data
17040266059SGregory Neil Shapiro */
17140266059SGregory Neil Shapiro 
17240266059SGregory Neil Shapiro int
sm_syslogsetinfo(fp,what,valp)17340266059SGregory Neil Shapiro sm_syslogsetinfo(fp, what, valp)
17440266059SGregory Neil Shapiro 	SM_FILE_T *fp;
17540266059SGregory Neil Shapiro 	int what;
17640266059SGregory Neil Shapiro 	void *valp;
17740266059SGregory Neil Shapiro {
17840266059SGregory Neil Shapiro 	switch (what)
17940266059SGregory Neil Shapiro 	{
18040266059SGregory Neil Shapiro 	  case SM_IO_SL_PRIO:
18140266059SGregory Neil Shapiro 		fp->f_ival = *((int *)(valp));
18240266059SGregory Neil Shapiro 		return 0;
18340266059SGregory Neil Shapiro 	  default:
18440266059SGregory Neil Shapiro 		errno = EINVAL;
18540266059SGregory Neil Shapiro 		return -1;
18640266059SGregory Neil Shapiro 	}
18740266059SGregory Neil Shapiro }
18840266059SGregory Neil Shapiro 
18940266059SGregory Neil Shapiro /*
19040266059SGregory Neil Shapiro **  SM_SYSLOGGETINFO -- get information relating to the file pointer
19140266059SGregory Neil Shapiro **
19240266059SGregory Neil Shapiro **	Parameters:
19340266059SGregory Neil Shapiro **		fp -- the file pointer being queried
19440266059SGregory Neil Shapiro **		what -- the information type being queried
19540266059SGregory Neil Shapiro **		valp -- location to placed queried information
19640266059SGregory Neil Shapiro **
19740266059SGregory Neil Shapiro **	Returns:
19840266059SGregory Neil Shapiro **		0 (zero) on success
19940266059SGregory Neil Shapiro **		-1 on failure
20040266059SGregory Neil Shapiro **
20140266059SGregory Neil Shapiro **	Side Effects:
20240266059SGregory Neil Shapiro **		Fills in 'valp' with data.
20340266059SGregory Neil Shapiro */
20440266059SGregory Neil Shapiro 
20540266059SGregory Neil Shapiro int
sm_sysloggetinfo(fp,what,valp)20640266059SGregory Neil Shapiro sm_sysloggetinfo(fp, what, valp)
20740266059SGregory Neil Shapiro 	SM_FILE_T *fp;
20840266059SGregory Neil Shapiro 	int what;
20940266059SGregory Neil Shapiro 	void *valp;
21040266059SGregory Neil Shapiro {
21140266059SGregory Neil Shapiro 	switch (what)
21240266059SGregory Neil Shapiro 	{
21340266059SGregory Neil Shapiro 	  case SM_IO_SL_PRIO:
21440266059SGregory Neil Shapiro 		*((int *)(valp)) = fp->f_ival;
21540266059SGregory Neil Shapiro 		return 0;
21640266059SGregory Neil Shapiro 	  default:
21740266059SGregory Neil Shapiro 		errno = EINVAL;
21840266059SGregory Neil Shapiro 		return -1;
21940266059SGregory Neil Shapiro 	}
22040266059SGregory Neil Shapiro }
221