/*
 * Mini syslogd implementation for busybox
 *
 * Copyright (C) 1999 by Lineo, inc.
 * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 */

#include "internal.h"
#include <stdio.h>
#include <stdarg.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
#include <ctype.h>
#include <netdb.h>
#include <sys/klog.h>
#include <errno.h>
#include <paths.h>

#define ksyslog klogctl
extern int ksyslog(int type, char *buf, int len);


/* SYSLOG_NAMES defined to pull some extra junk from syslog.h */
#define SYSLOG_NAMES
#include <sys/syslog.h>

/* Path for the file where all log messages are written */
#define __LOG_FILE		"/var/log/messages"


static char* logFilePath = __LOG_FILE;
/* interval between marks in seconds */
static int MarkInterval = 20*60;
/* localhost's name */
static char LocalHostName[32];

static const char syslogd_usage[] =
    "syslogd [OPTION]...\n\n"
    "Linux system and kernel (provides klogd) logging utility.\n"
    "Note that this version of syslogd/klogd ignores /etc/syslog.conf.\n\n"
    "Options:\n"
    "\t-m\tChange the mark timestamp interval. default=20min. 0=off\n"
    "\t-n\tDo not fork into the background (for when run by init)\n"
#ifdef BB_KLOGD
    "\t-K\tDo not start up the klogd process (by default syslogd spawns klogd).\n"
#endif
    "\t-O\tSpecify an alternate log file.  default=/var/log/messages\n";


/* try to open up the specified device */
static int device_open(char *device, int mode)
{
    int m, f, fd = -1;

    m = mode | O_NONBLOCK;

    /* Retry up to 5 times */
    for (f = 0; f < 5; f++)
	if ((fd = open(device, m)) >= 0)
	    break;
    if (fd < 0)
	return fd;
    /* Reset original flags. */
    if (m != mode)
	fcntl(fd, F_SETFL, mode);
    return fd;
}

/* print a message to the log file */
static void message(char *fmt, ...)
{
    int fd;
    va_list arguments;

    if ((fd = device_open(logFilePath, O_WRONLY|O_CREAT|O_NOCTTY|O_APPEND|O_NONBLOCK)) >= 0) {
	va_start(arguments, fmt);
	vdprintf(fd, fmt, arguments);
	va_end(arguments);
	close(fd);
    } else {
	/* Always send console messages to /dev/console so people will see them. */
	if ((fd = device_open(_PATH_CONSOLE, O_WRONLY|O_NOCTTY|O_NONBLOCK)) >= 0) {
	    va_start(arguments, fmt);
	    vdprintf(fd, fmt, arguments);
	    va_end(arguments);
	    close(fd);
	} else {
	    fprintf(stderr, "Bummer, can't print: ");
	    va_start(arguments, fmt);
	    vfprintf(stderr, fmt, arguments);
	    fflush(stderr);
	    va_end(arguments);
	}
    }
}

static void logMessage( int pri, char* msg) 
{
    time_t  now;
    char *timestamp;
    static char res[20];
    CODE *c_pri, *c_fac;

    for (c_fac=facilitynames; c_fac->c_name && !(c_fac->c_val==LOG_FAC(pri)<<3); c_fac++);
    for (c_pri=prioritynames; c_pri->c_name && !(c_pri->c_val==LOG_PRI(pri)); c_pri++);
    if (*c_fac->c_name=='\0' || *c_pri->c_name=='\0')
	snprintf (res, sizeof(res), "<%d>", pri);
    else
	snprintf (res, sizeof(res), "%s.%s", c_fac->c_name, c_pri->c_name);

    if (strlen(msg) < 16 || msg[3] != ' ' || msg[6] != ' ' || 
	    msg[9] != ':' || msg[12] != ':' || msg[15] != ' ') 
    {
	time(&now);
	timestamp = ctime(&now) + 4;
	timestamp[15] = '\0';
    } else {
	timestamp = msg;
	timestamp[15] = '\0';
	msg += 16;
    }

    /* todo: supress duplicates */

    /* now spew out the message to wherever it is supposed to go */
    message( "%s %s %s %s\n", timestamp, LocalHostName, res, msg);
}

static void quit_signal(int sig)
{
    logMessage(LOG_SYSLOG|LOG_INFO, "System log daemon exiting.");
    unlink( _PATH_LOG);
    exit( TRUE);
}

static void restart_signal(int sig)
{
    /* pretend to restart */
    logMessage(LOG_SYSLOG|LOG_INFO, "syslogd restarting");
}

static void domark(int sig)
{
    if (MarkInterval > 0) {
	logMessage(LOG_SYSLOG|LOG_INFO, "-- MARK --");
	alarm(MarkInterval);
    }
}

static void doSyslogd(void)
{
    struct sockaddr_un sunx;
    int fd, conn;
    size_t addrLength;
    char buf[1024];
    char *q, *p = buf;
    int readSize;

    /* Remove any preexisting socket/file */
    unlink(_PATH_LOG);

    /* Set up sig handlers */
    signal(SIGINT,  quit_signal);
    signal(SIGTERM, quit_signal);
    signal(SIGQUIT, quit_signal);
    signal(SIGHUP,  restart_signal);
    signal(SIGALRM, domark);
    alarm(MarkInterval);


    unlink( _PATH_LOG);
    memset(&sunx, 0, sizeof(sunx));
    sunx.sun_family = AF_UNIX;	/* Unix domain socket */
    strncpy(sunx.sun_path, _PATH_LOG, sizeof(sunx.sun_path));
    if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0 ) {
        perror("Couldn't obtain descriptor for socket " _PATH_LOG);
	exit( FALSE);
    }

    addrLength = sizeof(sunx.sun_family) + strlen(sunx.sun_path);
    if ( (bind(fd, (struct sockaddr *) &sunx, addrLength)) ||
	    (fchmod(fd, 0666) < 0) || (listen(fd, 5)) ) 
    {
	perror("Could not connect to socket " _PATH_LOG);
	exit( FALSE);
    }
    
    
    logMessage(LOG_SYSLOG|LOG_INFO, "syslogd started: "
	    "BusyBox v" BB_VER " (" BB_BT ")");


    while ((conn = accept(fd, (struct sockaddr *) &sunx, 
                          &addrLength)) >= 0) 
    {
	while ((readSize=read(conn, buf, sizeof(buf))) > 0)
	{
	    char line[1025];
	    unsigned char c;
	    int pri = (LOG_USER|LOG_NOTICE);

	    memset (line, 0, sizeof(line));
	    p = buf;
	    q = line;
	    while ( p && (c = *p) && q < &line[sizeof(line) - 1]) {
		if (c == '<') {
		    /* Parse the magic priority number */
		    pri = 0;
		    while (isdigit(*(++p))) {
			pri = 10 * pri + (*p - '0');
		    }
		    if (pri &~ (LOG_FACMASK|LOG_PRIMASK))
			pri = (LOG_USER|LOG_NOTICE);
		} else if (c == '\n') {
		    *q++ = ' ';
		} else if (iscntrl(c)&&(c<0177)) {
		    *q++ = '^';
		    *q++ = c ^ 0100;
		} else {
		    *q++ = c;
		}
		p++;
	    }
	    *q = '\0';

	    /* Now log it */
	    logMessage( pri, line);
	}
        close(conn);
    }

    close(fd);
}

#ifdef BB_KLOGD

static void klogd_signal(int sig)
{
    ksyslog(7, NULL, 0);
    ksyslog(0, 0, 0);
    logMessage(LOG_SYSLOG|LOG_INFO, "Kernel log daemon exiting.");
    exit( TRUE);
}

static void doKlogd(void)
{
    int priority=LOG_INFO;
    char log_buffer[4096];
    char *logp;

    /* Set up sig handlers */
    signal(SIGINT,  klogd_signal);
    signal(SIGKILL, klogd_signal);
    signal(SIGTERM, klogd_signal);
    signal(SIGHUP,  klogd_signal);
    logMessage(LOG_SYSLOG|LOG_INFO, "klogd started: "
	    "BusyBox v" BB_VER " (" BB_BT ")");

    ksyslog(1, NULL, 0);

    while (1) {
	/* Use kernel syscalls */
	memset(log_buffer, '\0', sizeof(log_buffer));
	if ( ksyslog(2, log_buffer, sizeof(log_buffer)) < 0 ) {
	    char message[80];
	    if ( errno == EINTR )
		continue;
	    snprintf(message, 79, "klogd: Error return from sys_sycall: " \
		    "%d - %s.\n", errno, strerror(errno));
	    logMessage(LOG_SYSLOG|LOG_ERR, message);
	    exit(1);
	}
	logp=log_buffer;
        if ( *log_buffer == '<' )
        {
	    switch ( *(log_buffer+1) )
	    {
		case '0':
		    priority = LOG_EMERG;
		    break;
		case '1':
		    priority = LOG_ALERT;
		    break;
		case '2':
		    priority = LOG_CRIT;
		    break;
		case '3':
		    priority = LOG_ERR;
		    break;
		case '4':
		    priority = LOG_WARNING;
		    break;
		case '5':
		    priority = LOG_NOTICE;
		    break;
		case '6':
		    priority = LOG_INFO;
		    break;
		case '7':
		default:
		    priority = LOG_DEBUG;
	    }
	    logp+=3;
        }
	logMessage(LOG_KERN|priority, logp);
    }

}

#endif

extern int syslogd_main(int argc, char **argv)
{
    int	pid, klogd_pid;
    int doFork = TRUE;
#ifdef BB_KLOGD
    int startKlogd = TRUE;
#endif
    char *p;
    char **argv1=argv;
    
    while (--argc > 0 && **(++argv1) == '-') {
	while (*(++(*argv1))) {
	    switch (**argv1) {
	    case 'm':
		if (--argc == 0) {
		    usage(syslogd_usage);
		}
		MarkInterval = atoi(*(++argv1))*60;
		break;
	    case 'n':
		doFork = FALSE;
		break;
#ifdef BB_KLOGD
	    case 'K':
		startKlogd = FALSE;
		break;
#endif
	    case 'O':
		if (--argc == 0) {
		    usage(syslogd_usage);
		}
		logFilePath = *(++argv1);
		break;
	    default:
		usage(syslogd_usage);
	    }
	}
    }
    
    /* Store away localhost's name before the fork */
    gethostname(LocalHostName, sizeof(LocalHostName));
    if ( (p = strchr(LocalHostName, '.')) ) {
	*p++ = '\0';
    }

    if (doFork == TRUE) {
	pid = fork();
	if ( pid < 0 )
	    exit( pid);
	else if ( pid == 0 ) {
	    strncpy(argv[0], "syslogd",strlen(argv[0]));
	    doSyslogd();
	}
    } else {
	doSyslogd();
    }

#ifdef BB_KLOGD
    /* Start up the klogd process */
    if (startKlogd == TRUE) {
	klogd_pid = fork();
	if (klogd_pid == 0 ) {
		strncpy(argv[0], "klogd", strlen(argv[0]));
		doKlogd();
	}
    }
#endif

    exit( TRUE);
}


