int log_internalv( int level, int error, const char *file, int line, const char *func, const char *format, va_list ap) { PROTECT_ERRNO; char buffer[LINE_MAX]; if (error < 0) error = -error; if (_likely_(LOG_PRI(level) > log_max_level)) return -error; /* Make sure that %m maps to the specified error */ if (error != 0) errno = error; vsnprintf(buffer, sizeof(buffer), format, ap); return log_dispatch(level, error, file, line, func, NULL, NULL, buffer); }
int log_object_internalv( int level, int error, const char *file, int line, const char *func, const char *object_field, const char *object, const char *format, va_list ap) { PROTECT_ERRNO; char *buffer, *b; size_t l; if (error < 0) error = -error; if (_likely_(LOG_PRI(level) > log_max_level)) return -error; /* Make sure that %m maps to the specified error */ if (error != 0) errno = error; /* Prepend the object name before the message */ if (object) { size_t n; n = strlen(object); l = n + 2 + LINE_MAX; buffer = newa(char, l); b = stpcpy(stpcpy(buffer, object), ": "); } else {
int sigbus_pop(void **ret) { assert(ret); for (;;) { unsigned u, c; __sync_synchronize(); c = n_sigbus_queue; if (_likely_(c == 0)) return 0; if (_unlikely_(c >= SIGBUS_QUEUE_MAX)) return -EOVERFLOW; for (u = 0; u < SIGBUS_QUEUE_MAX; u++) { void *addr; addr = sigbus_queue[u]; if (!addr) continue; if (__sync_bool_compare_and_swap(&sigbus_queue[u], addr, NULL)) { __sync_fetch_and_sub(&n_sigbus_queue, 1); *ret = addr; return 1; } } } }
size_t page_size(void) { static thread_local size_t pgsz = 0; long r; if (_likely_(pgsz > 0)) return pgsz; r = sysconf(_SC_PAGESIZE); assert(r > 0); pgsz = (size_t) r; return pgsz; }
int log_dump_internal( int level, int error, const char *file, int line, const char *func, char *buffer) { PROTECT_ERRNO; /* This modifies the buffer... */ if (error < 0) error = -error; if (_likely_(LOG_PRI(level) > log_max_level)) return -error; return log_dispatch(level, error, file, line, func, NULL, NULL, buffer); }
unsigned lines(void) { const char *e; int l; if (_likely_(cached_lines > 0)) return cached_lines; l = 0; e = getenv("LINES"); if (e) (void) safe_atoi(e, &l); if (l <= 0) l = fd_lines(STDOUT_FILENO); if (l <= 0) l = 24; cached_lines = l; return cached_lines; }
unsigned columns(void) { const char *e; int c; if (_likely_(cached_columns > 0)) return cached_columns; c = 0; e = getenv("COLUMNS"); if (e) (void) safe_atoi(e, &c); if (c <= 0) c = fd_columns(STDOUT_FILENO); if (c <= 0) c = 80; cached_columns = c; return cached_columns; }
int log_metav( int level, const char*file, int line, const char *func, const char *format, va_list ap) { char buffer[LINE_MAX]; int saved_errno, r; if (_likely_(LOG_PRI(level) > log_max_level)) return 0; saved_errno = errno; vsnprintf(buffer, sizeof(buffer), format, ap); char_array_0(buffer); r = log_dispatch(level, file, line, func, buffer); errno = saved_errno; return r; }
int detect_container(const char **id) { static thread_local int cached_found = -1; static thread_local const char *cached_id = NULL; _cleanup_free_ char *m = NULL; const char *_id = NULL, *e = NULL; int r; if (_likely_(cached_found >= 0)) { if (id) *id = cached_id; return cached_found; } /* /proc/vz exists in container and outside of the container, * /proc/bc only outside of the container. */ if (access("/proc/vz", F_OK) >= 0 && access("/proc/bc", F_OK) < 0) { _id = "openvz"; r = 1; goto finish; } if (getpid() == 1) { /* If we are PID 1 we can just check our own * environment variable */ e = getenv("container"); if (isempty(e)) { r = 0; goto finish; } } else { /* Otherwise, PID 1 dropped this information into a * file in /run. This is better than accessing * /proc/1/environ, since we don't need CAP_SYS_PTRACE * for that. */ r = read_one_line_file("/run/systemd/container", &m); if (r == -ENOENT) { r = 0; goto finish; } if (r < 0) return r; e = m; } /* We only recognize a selected few here, since we want to * enforce a redacted namespace */ if (streq(e, "lxc")) _id ="lxc"; else if (streq(e, "lxc-libvirt")) _id = "lxc-libvirt"; else if (streq(e, "systemd-nspawn")) _id = "systemd-nspawn"; else if (streq(e, "docker")) _id = "docker"; else _id = "other"; r = 1; finish: cached_found = r; cached_id = _id; if (id) *id = _id; return r; }