Changeset 32979


Ignore:
Timestamp:
Aug 2, 2017, 3:22:25 AM (3 weeks ago)
Author:
brainslayer
Message:

override crash problem while logging

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/router/libutils/airbag.c

    r32978 r32979  
    4444#include <stdlib.h>
    4545#include <string.h>
     46#include <time.h>
    4647
    4748#include <syslog.h>
     
    334335}
    335336
     337static const struct {
     338        short sun_family;
     339        char sun_path[9];
     340} log_addr = {
     341AF_UNIX, "/dev/log"};
     342
     343static int log_fd = -1;
     344static int log_facility = LOG_USER;
     345static int log_opt;
     346static char log_ident[32];
     347
     348static int is_lost_conn(int e)
     349{
     350        return e == ECONNREFUSED || e == ECONNRESET || e == ENOTCONN || e == EPIPE;
     351}
     352
     353static void slog(int priority, const char *message)
     354{
     355        char *buf;
     356        int errno_save = errno;
     357        int pid;
     358        int l;
     359        int hlen;
     360        int fd;
     361        if (log_fd < 0) {
     362                log_fd = socket(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0);
     363                if (log_fd >= 0)
     364                        connect(log_fd, (void *)&log_addr, sizeof log_addr);
     365
     366        }
     367        if (!(priority & LOG_FACMASK))
     368                priority |= log_facility;
     369        pid = (log_opt & LOG_PID) ? getpid() : 0;
     370        l = 0;
     371        l = asprintf(&buf, "<%d>%n%s%s%.0d%s: %s", priority, &hlen, log_ident, "[" + !pid, pid, "]" + !pid, message);
     372        errno = errno_save;
     373        if (l >= 0) {
     374                if (send(log_fd, buf, l, 0) < 0 && (!is_lost_conn(errno)
     375                                                    || connect(log_fd, (void *)&log_addr, sizeof log_addr) < 0 || send(log_fd, buf, l, 0) < 0)
     376                    && (log_opt & LOG_CONS)) {
     377                        fd = open("/dev/console", O_WRONLY | O_NOCTTY | O_CLOEXEC);
     378                        if (fd >= 0) {
     379                                dprintf(fd, "%.*s", l - hlen, buf + hlen);
     380                                close(fd);
     381                        }
     382                }
     383                if (log_opt & LOG_PERROR)
     384                        dprintf(2, "%.*s", l - hlen, buf + hlen);
     385        }
     386        if (buf)
     387                free(buf);
     388}
     389
    336390static int airbag_printf(char *fmt, ...)
    337391{
     
    342396        int size = vasprintf(&temp, fmt, args);
    343397        va_end(args);
     398
    344399        if (!size || size < 0)
    345400                return 0;
     
    352407        free(temp);
    353408        if (strchr(buffer, '\n')) {
    354 #ifndef HAVE_X86
    355                 dd_syslog(LOG_ERR, "%s", buffer);
    356 #endif
     409                slog(LOG_ERR, buffer);
    357410                fprintf(stderr, "%s", buffer);
    358411                free(buffer);
Note: See TracChangeset for help on using the changeset viewer.