busybox/sysklogd/logger.c
<<
>>
Prefs
   1/* vi: set sw=4 ts=4: */
   2/*
   3 * Mini logger implementation for busybox
   4 *
   5 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
   6 *
   7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
   8 */
   9
  10/*
  11 * Done in syslogd_and_logger.c:
  12#include "libbb.h"
  13#define SYSLOG_NAMES
  14#define SYSLOG_NAMES_CONST
  15#include <syslog.h>
  16*/
  17
  18/* Decode a symbolic name to a numeric value
  19 * this function is based on code
  20 * Copyright (c) 1983, 1993
  21 * The Regents of the University of California.  All rights reserved.
  22 *
  23 * Original copyright notice is retained at the end of this file.
  24 */
  25static int decode(char *name, const CODE *codetab)
  26{
  27        const CODE *c;
  28
  29        if (isdigit(*name))
  30                return atoi(name);
  31        for (c = codetab; c->c_name; c++) {
  32                if (!strcasecmp(name, c->c_name)) {
  33                        return c->c_val;
  34                }
  35        }
  36
  37        return -1;
  38}
  39
  40/* Decode a symbolic name to a numeric value
  41 * this function is based on code
  42 * Copyright (c) 1983, 1993
  43 * The Regents of the University of California.  All rights reserved.
  44 *
  45 * Original copyright notice is retained at the end of this file.
  46 */
  47static int pencode(char *s)
  48{
  49        char *save;
  50        int lev, fac = LOG_USER;
  51
  52        for (save = s; *s && *s != '.'; ++s)
  53                ;
  54        if (*s) {
  55                *s = '\0';
  56                fac = decode(save, facilitynames);
  57                if (fac < 0)
  58                        bb_error_msg_and_die("unknown %s name: %s", "facility", save);
  59                *s++ = '.';
  60        } else {
  61                s = save;
  62        }
  63        lev = decode(s, prioritynames);
  64        if (lev < 0)
  65                bb_error_msg_and_die("unknown %s name: %s", "priority", save);
  66        return ((lev & LOG_PRIMASK) | (fac & LOG_FACMASK));
  67}
  68
  69#define strbuf bb_common_bufsiz1
  70
  71int logger_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
  72int logger_main(int argc, char **argv)
  73{
  74        char *str_p, *str_t;
  75        int opt;
  76        int i = 0;
  77
  78        /* Fill out the name string early (may be overwritten later) */
  79        str_t = uid2uname_utoa(geteuid());
  80
  81        /* Parse any options */
  82        opt = getopt32(argv, "p:st:", &str_p, &str_t);
  83
  84        if (opt & 0x2) /* -s */
  85                i |= LOG_PERROR;
  86        //if (opt & 0x4) /* -t */
  87        openlog(str_t, i, 0);
  88        i = LOG_USER | LOG_NOTICE;
  89        if (opt & 0x1) /* -p */
  90                i = pencode(str_p);
  91
  92        argc -= optind;
  93        argv += optind;
  94        if (!argc) {
  95                while (fgets(strbuf, COMMON_BUFSIZE, stdin)) {
  96                        if (strbuf[0]
  97                         && NOT_LONE_CHAR(strbuf, '\n')
  98                        ) {
  99                                /* Neither "" nor "\n" */
 100                                syslog(i, "%s", strbuf);
 101                        }
 102                }
 103        } else {
 104                char *message = NULL;
 105                int len = 0;
 106                int pos = 0;
 107                do {
 108                        len += strlen(*argv) + 1;
 109                        message = xrealloc(message, len + 1);
 110                        sprintf(message + pos, " %s", *argv),
 111                        pos = len;
 112                } while (*++argv);
 113                syslog(i, "%s", message + 1); /* skip leading " " */
 114        }
 115
 116        closelog();
 117        return EXIT_SUCCESS;
 118}
 119
 120/* Clean up. Needed because we are included from syslogd_and_logger.c */
 121#undef strbuf
 122
 123/*-
 124 * Copyright (c) 1983, 1993
 125 *      The Regents of the University of California.  All rights reserved.
 126 *
 127 * This is the original license statement for the decode and pencode functions.
 128 *
 129 * Redistribution and use in source and binary forms, with or without
 130 * modification, are permitted provided that the following conditions
 131 * are met:
 132 * 1. Redistributions of source code must retain the above copyright
 133 *    notice, this list of conditions and the following disclaimer.
 134 * 2. Redistributions in binary form must reproduce the above copyright
 135 *    notice, this list of conditions and the following disclaimer in the
 136 *    documentation and/or other materials provided with the distribution.
 137 *
 138 * 3. <BSD Advertising Clause omitted per the July 22, 1999 licensing change
 139 *              ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change>
 140 *
 141 * 4. Neither the name of the University nor the names of its contributors
 142 *    may be used to endorse or promote products derived from this software
 143 *    without specific prior written permission.
 144 *
 145 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 146 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 147 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 148 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 149 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 150 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 151 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 152 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 153 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 154 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 155 * SUCH DAMAGE.
 156 */
 157