/*
 * 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.1.1.1 2002/03/12 18:00:20 zarzycki 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;
	}
}
