/*---------------------------------------------------------------------------*/ static int log_append_logfile(const struct lxc_log_appender *appender, struct lxc_log_event *event) { char buffer[LXC_LOG_BUFFER_SIZE]; int n; int ms; if (lxc_log_fd == -1) return 0; ms = event->timestamp.tv_usec / 1000; n = snprintf(buffer, sizeof(buffer), "%15s %10ld.%03d %-8s %s - ", log_prefix, event->timestamp.tv_sec, ms, lxc_log_priority_to_string(event->priority), event->category); n += vsnprintf(buffer + n, sizeof(buffer) - n, event->fmt, *event->vap); if (n >= sizeof(buffer) - 1) { WARN("truncated next event from %d to %zd bytes", n, sizeof(buffer)); n = sizeof(buffer) - 1; } buffer[n] = '\n'; return write(lxc_log_fd, buffer, n + 1); }
static int execute_start(struct lxc_handler *handler, void* data) { int j, i = 0; struct execute_args *my_args = data; char **argv; int argc = 0, argc_add; char *initpath; while (my_args->argv[argc++]); argc_add = 4; if (my_args->quiet) argc_add++; if (!handler->conf->rootfs.path) { argc_add += 4; if (lxc_log_has_valid_level()) argc_add += 2; } argv = malloc((argc + argc_add) * sizeof(*argv)); if (!argv) goto out1; initpath = choose_init(); if (!initpath) { ERROR("Failed to find an lxc-init"); goto out2; } argv[i++] = initpath; if (my_args->quiet) argv[i++] = "--quiet"; if (!handler->conf->rootfs.path) { argv[i++] = "--name"; argv[i++] = (char *)handler->name; argv[i++] = "--lxcpath"; argv[i++] = (char *)handler->lxcpath; if (lxc_log_has_valid_level()) { argv[i++] = "--logpriority"; argv[i++] = (char *) lxc_log_priority_to_string(lxc_log_get_level()); } } argv[i++] = "--"; for (j = 0; j < argc; j++) argv[i++] = my_args->argv[j]; argv[i++] = NULL; NOTICE("exec'ing '%s'", my_args->argv[0]); execvp(argv[0], argv); SYSERROR("failed to exec %s", argv[0]); free(initpath); out2: free(argv); out1: return 1; }
/*---------------------------------------------------------------------------*/ static int log_append_logfile(const struct lxc_log_appender *appender, struct lxc_log_event *event) { char date[LXC_LOG_DATEFOMAT_SIZE] = "20150427012246"; char buffer[LXC_LOG_BUFFER_SIZE]; const struct tm *t; int n; int ms; int fd_to_use = -1; #ifndef NO_LXC_CONF if (!lxc_log_use_global_fd && current_config) fd_to_use = current_config->logfd; #endif if (fd_to_use == -1) fd_to_use = lxc_log_fd; if (fd_to_use == -1) return 0; t = localtime(&event->timestamp.tv_sec); strftime(date, sizeof(date), "%Y%m%d%H%M%S", t); ms = event->timestamp.tv_usec / 1000; n = snprintf(buffer, sizeof(buffer), "%15s%s%s %10s.%03d %-8s %s - %s:%s:%d - ", log_prefix, log_vmname ? " " : "", log_vmname ? log_vmname : "", date, ms, lxc_log_priority_to_string(event->priority), event->category, event->locinfo->file, event->locinfo->func, event->locinfo->line); if (n < 0) return n; if (n < sizeof(buffer) - 1) n += vsnprintf(buffer + n, sizeof(buffer) - n, event->fmt, *event->vap); else { WARN("truncated next event from %d to %zd bytes", n, sizeof(buffer)); n = sizeof(buffer) - 1; } buffer[n] = '\n'; return write(fd_to_use, buffer, n + 1); }
/*---------------------------------------------------------------------------*/ static int log_append_logfile(const struct lxc_log_appender *appender, struct lxc_log_event *event) { char buffer[LXC_LOG_BUFFER_SIZE]; int n; int ms; int fd_to_use = -1; #ifndef NO_LXC_CONF if (!lxc_log_use_global_fd && current_config) fd_to_use = current_config->logfd; #endif if (fd_to_use == -1) fd_to_use = lxc_log_fd; if (fd_to_use == -1) return 0; ms = event->timestamp.tv_usec / 1000; n = snprintf(buffer, sizeof(buffer), "%15s %10ld.%03d %-8s %s - %s:%s:%d - ", log_prefix, event->timestamp.tv_sec, ms, lxc_log_priority_to_string(event->priority), event->category, event->locinfo->file, event->locinfo->func, event->locinfo->line); n += vsnprintf(buffer + n, sizeof(buffer) - n, event->fmt, *event->vap); if (n >= sizeof(buffer) - 1) { WARN("truncated next event from %d to %zd bytes", n, sizeof(buffer)); n = sizeof(buffer) - 1; } buffer[n] = '\n'; return write(fd_to_use, buffer, n + 1); }
static int execute_start(struct lxc_handler *handler, void* data) { int j, i = 0; struct execute_args *my_args = data; char **argv; int argc = 0, argc_add; char *initpath; while (my_args->argv[argc++]); /* lxc-init -n name -- [argc] NULL -> 5 */ argc_add = 5; if (my_args->quiet) argc_add++; if (!handler->conf->rootfs.path) argc_add += 2; if (lxc_log_has_valid_level()) argc_add += 2; argv = malloc((argc + argc_add) * sizeof(*argv)); if (!argv) goto out1; initpath = choose_init(NULL); if (!initpath) { ERROR("Failed to find an init.lxc or init.lxc.static"); goto out2; } argv[i++] = initpath; argv[i++] = "-n"; argv[i++] = (char *)handler->name; if (lxc_log_has_valid_level()) { argv[i++] = "-l"; argv[i++] = (char *)lxc_log_priority_to_string(lxc_log_get_level()); } if (handler->conf->logfile) { argv[i++] = "-o"; argv[i++] = (char *)handler->conf->logfile; } if (my_args->quiet) argv[i++] = "--quiet"; if (!handler->conf->rootfs.path) { argv[i++] = "-P"; argv[i++] = (char *)handler->lxcpath; } argv[i++] = "--"; for (j = 0; j < argc; j++) argv[i++] = my_args->argv[j]; argv[i++] = NULL; NOTICE("Exec'ing \"%s\"", my_args->argv[0]); execvp(argv[0], argv); SYSERROR("Failed to exec %s", argv[0]); free(initpath); out2: free(argv); out1: return 1; }