util.h revision 059cb3858acd038ff2cef10a3a99119bf71a8fc6
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering#pragma once
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering/***
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering This file is part of systemd.
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering Copyright 2010 Lennart Poettering
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering systemd is free software; you can redistribute it and/or modify it
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering under the terms of the GNU Lesser General Public License as published by
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering the Free Software Foundation; either version 2.1 of the License, or
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering (at your option) any later version.
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering systemd is distributed in the hope that it will be useful, but
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering Lesser General Public License for more details.
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering You should have received a copy of the GNU Lesser General Public License
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering***/
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering#include <alloca.h>
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering#include <inttypes.h>
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering#include <time.h>
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering#include <sys/time.h>
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering#include <stdarg.h>
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering#include <stdbool.h>
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering#include <stdlib.h>
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#include <stdio.h>
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#include <signal.h>
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering#include <sched.h>
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#include <limits.h>
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#include <sys/types.h>
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#include <sys/stat.h>
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#include <dirent.h>
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#include <sys/resource.h>
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#include <stddef.h>
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#include <unistd.h>
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#include <locale.h>
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#include <mntent.h>
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#include <sys/socket.h>
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering#if SIZEOF_PID_T == 4
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering# define PID_FMT "%" PRIu32
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#elif SIZEOF_PID_T == 2
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering# define PID_FMT "%" PRIu16
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#else
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering# error Unknown pid_t size
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#endif
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#if SIZEOF_UID_T == 4
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering# define UID_FMT "%" PRIu32
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#elif SIZEOF_UID_T == 2
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering# define UID_FMT "%" PRIu16
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#else
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poettering# error Unknown uid_t size
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poettering#endif
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering#if SIZEOF_GID_T == 4
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering# define GID_FMT "%" PRIu32
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering#elif SIZEOF_GID_T == 2
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering# define GID_FMT "%" PRIu16
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#else
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering# error Unknown gid_t size
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#endif
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#include "macro.h"
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#include "time-util.h"
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering/* What is interpreted as whitespace? */
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#define WHITESPACE " \t\n\r"
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering#define NEWLINE "\n\r"
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering#define QUOTES "\"\'"
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#define COMMENTS "#;"
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering#define GLOB_CHARS "*?["
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering#define FORMAT_BYTES_MAX 8
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering#define ANSI_HIGHLIGHT_ON "\x1B[1;39m"
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering#define ANSI_RED_ON "\x1B[31m"
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering#define ANSI_HIGHLIGHT_RED_ON "\x1B[1;31m"
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering#define ANSI_GREEN_ON "\x1B[32m"
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering#define ANSI_HIGHLIGHT_GREEN_ON "\x1B[1;32m"
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#define ANSI_HIGHLIGHT_YELLOW_ON "\x1B[1;33m"
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#define ANSI_HIGHLIGHT_BLUE_ON "\x1B[1;34m"
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#define ANSI_HIGHLIGHT_OFF "\x1B[0m"
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering#define ANSI_ERASE_TO_END_OF_LINE "\x1B[K"
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringsize_t page_size(void);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#define PAGE_ALIGN(l) ALIGN_TO((l), page_size())
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering#define streq(a,b) (strcmp((a),(b)) == 0)
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering#define strneq(a, b, n) (strncmp((a), (b), (n)) == 0)
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#define strcaseeq(a,b) (strcasecmp((a),(b)) == 0)
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#define strncaseeq(a, b, n) (strncasecmp((a), (b), (n)) == 0)
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringbool streq_ptr(const char *a, const char *b) _pure_;
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering#define new(t, n) ((t*) malloc_multiply(sizeof(t), (n)))
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering#define new0(t, n) ((t*) calloc((n), sizeof(t)))
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#define newa(t, n) ((t*) alloca(sizeof(t)*(n)))
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#define newdup(t, p, n) ((t*) memdup_multiply(p, sizeof(t), (n)))
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#define malloc0(n) (calloc((n), 1))
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringstatic inline const char* yes_no(bool b) {
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return b ? "yes" : "no";
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering}
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poetteringstatic inline const char* true_false(bool b) {
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return b ? "true" : "false";
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering}
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringstatic inline const char* strempty(const char *s) {
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return s ? s : "";
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering}
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringstatic inline const char* strnull(const char *s) {
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering return s ? s : "(null)";
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering}
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
56f64d95763a799ba4475daf44d8e9f72a1bd474Michal Schmidtstatic inline const char *strna(const char *s) {
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return s ? s : "n/a";
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering}
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringstatic inline bool isempty(const char *p) {
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return !p || !p[0];
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering}
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringstatic inline const char *startswith(const char *s, const char *prefix) {
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering if (strncmp(s, prefix, strlen(prefix)) == 0)
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return s + strlen(prefix);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return NULL;
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering}
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringstatic inline const char *startswith_no_case(const char *s, const char *prefix) {
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering if (strncasecmp(s, prefix, strlen(prefix)) == 0)
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return s + strlen(prefix);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return NULL;
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering}
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poetteringchar *endswith(const char *s, const char *postfix) _pure_;
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poetteringbool first_word(const char *s, const char *word) _pure_;
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint close_nointr(int fd);
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poetteringvoid close_nointr_nofail(int fd);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringvoid close_many(const int fds[], unsigned n_fd);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint parse_size(const char *t, off_t base, off_t *size);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint parse_boolean(const char *v) _pure_;
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poetteringint parse_pid(const char *s, pid_t* ret_pid);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint parse_uid(const char *s, uid_t* ret_uid);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#define parse_gid(s, ret_uid) parse_uid(s, ret_uid)
56f64d95763a799ba4475daf44d8e9f72a1bd474Michal Schmidt
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint safe_atou(const char *s, unsigned *ret_u);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint safe_atoi(const char *s, int *ret_i);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint safe_atollu(const char *s, unsigned long long *ret_u);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint safe_atolli(const char *s, long long int *ret_i);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint safe_atod(const char *s, double *ret_d);
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering#if __WORDSIZE == 32
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringstatic inline int safe_atolu(const char *s, unsigned long *ret_u) {
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering assert_cc(sizeof(unsigned long) == sizeof(unsigned));
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return safe_atou(s, (unsigned*) ret_u);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering}
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poetteringstatic inline int safe_atoli(const char *s, long int *ret_u) {
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poettering assert_cc(sizeof(long int) == sizeof(int));
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poettering return safe_atoi(s, (int*) ret_u);
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poettering}
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poettering#else
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poetteringstatic inline int safe_atolu(const char *s, unsigned long *ret_u) {
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poettering assert_cc(sizeof(unsigned long) == sizeof(unsigned long long));
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering return safe_atollu(s, (unsigned long long*) ret_u);
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poettering}
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringstatic inline int safe_atoli(const char *s, long int *ret_u) {
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poettering assert_cc(sizeof(long int) == sizeof(long long int));
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return safe_atolli(s, (long long int*) ret_u);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering}
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering#endif
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringstatic inline int safe_atou32(const char *s, uint32_t *ret_u) {
56f64d95763a799ba4475daf44d8e9f72a1bd474Michal Schmidt assert_cc(sizeof(uint32_t) == sizeof(unsigned));
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return safe_atou(s, (unsigned*) ret_u);
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering}
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringstatic inline int safe_atoi32(const char *s, int32_t *ret_i) {
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering assert_cc(sizeof(int32_t) == sizeof(int));
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering return safe_atoi(s, (int*) ret_i);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering}
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringstatic inline int safe_atou64(const char *s, uint64_t *ret_u) {
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering assert_cc(sizeof(uint64_t) == sizeof(unsigned long long));
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering return safe_atollu(s, (unsigned long long*) ret_u);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering}
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringstatic inline int safe_atoi64(const char *s, int64_t *ret_i) {
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering assert_cc(sizeof(int64_t) == sizeof(long long int));
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return safe_atolli(s, (long long int*) ret_i);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering}
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering
56f64d95763a799ba4475daf44d8e9f72a1bd474Michal Schmidtchar *split(const char *c, size_t *l, const char *separator, bool quoted, char **state);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering#define FOREACH_WORD(word, length, s, state) \
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering _FOREACH_WORD(word, length, s, WHITESPACE, false, state)
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering#define FOREACH_WORD_SEPARATOR(word, length, s, separator, state) \
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering _FOREACH_WORD(word, length, s, separator, false, state)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering#define FOREACH_WORD_QUOTED(word, length, s, state) \
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering _FOREACH_WORD(word, length, s, WHITESPACE, true, state)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#define FOREACH_WORD_SEPARATOR_QUOTED(word, length, s, separator, state) \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering _FOREACH_WORD(word, length, s, separator, true, state)
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering#define _FOREACH_WORD(word, length, s, separator, quoted, state) \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering for ((state) = NULL, (word) = split((s), &(length), (separator), (quoted), &(state)); (word); (word) = split((s), &(length), (separator), (quoted), &(state)))
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringpid_t get_parent_of_pid(pid_t pid, pid_t *ppid);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint get_starttime_of_pid(pid_t pid, unsigned long long *st);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringchar *strappend(const char *s, const char *suffix);
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poetteringchar *strnappend(const char *s, const char *suffix, size_t length);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringchar *replace_env(const char *format, char **env);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringchar **replace_env_argv(char **argv, char **env);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poetteringint readlink_malloc(const char *p, char **r);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint readlink_and_make_absolute(const char *p, char **r);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint readlink_and_canonicalize(const char *p, char **r);
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint reset_all_signal_handlers(void);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poetteringchar *strstrip(char *s);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringchar *delete_chars(char *s, const char *bad);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringchar *truncate_nl(char *s);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringchar *file_in_same_dir(const char *path, const char *filename);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringint rmdir_parents(const char *path, const char *stop);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint get_process_state(pid_t pid);
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringint get_process_comm(pid_t pid, char **name);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint get_process_exe(pid_t pid, char **name);
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringint get_process_uid(pid_t pid, uid_t *uid);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint get_process_gid(pid_t pid, gid_t *gid);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint get_process_capeff(pid_t pid, char **capeff);
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringchar hexchar(int x) _const_;
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint unhexchar(char c) _const_;
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringchar octchar(int x) _const_;
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint unoctchar(char c) _const_;
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringchar decchar(int x) _const_;
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint undecchar(char c) _const_;
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringchar *cescape(const char *s);
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringchar *cunescape(const char *s);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringchar *cunescape_length(const char *s, size_t length);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringchar *cunescape_length_with_prefix(const char *s, size_t length, const char *prefix);
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringchar *xescape(const char *s, const char *bad);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringchar *ascii_strlower(char *path);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringbool dirent_is_file(const struct dirent *de) _pure_;
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringbool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix) _pure_;
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringbool ignore_file(const char *filename) _pure_;
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringbool chars_intersect(const char *a, const char *b) _pure_;
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringint make_stdio(int fd);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint make_null_stdio(void);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint make_console_stdio(void);
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint dev_urandom(void *p, size_t n);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringvoid random_bytes(void *p, size_t n);
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringstatic inline uint64_t random_u64(void) {
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering uint64_t u;
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering random_bytes(&u, sizeof(u));
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering return u;
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering}
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringstatic inline uint32_t random_u32(void) {
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering uint32_t u;
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering random_bytes(&u, sizeof(u));
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return u;
679bc6cb9016715339aac4ae6b2d5371c6262935Lennart Poettering}
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering/* For basic lookup tables with strictly enumerated entries */
4ba93280223ceb5de1bcedb196c38252f334521aLennart Poettering#define __DEFINE_STRING_TABLE_LOOKUP(name,type,scope) \
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering scope const char *name##_to_string(type i) { \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering if (i < 0 || i >= (type) ELEMENTSOF(name##_table)) \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering return NULL; \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering return name##_table[i]; \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering } \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering scope type name##_from_string(const char *s) { \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering type i; \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering if (!s) \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return (type) -1; \
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering for (i = 0; i < (type)ELEMENTSOF(name##_table); i++) \
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering if (name##_table[i] && \
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering streq(name##_table[i], s)) \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return i; \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return (type) -1; \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering } \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering struct __useless_struct_to_allow_trailing_semicolon__
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poettering#define DEFINE_STRING_TABLE_LOOKUP(name,type) __DEFINE_STRING_TABLE_LOOKUP(name,type,)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering#define DEFINE_PRIVATE_STRING_TABLE_LOOKUP(name,type) __DEFINE_STRING_TABLE_LOOKUP(name,type,static)
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering/* For string conversions where numbers are also acceptable */
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering#define DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(name,type,max) \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering int name##_to_string_alloc(type i, char **str) { \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering char *s; \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering int r; \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering if (i < 0 || i > max) \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return -ERANGE; \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering if (i < (type) ELEMENTSOF(name##_table)) { \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering s = strdup(name##_table[i]); \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering if (!s) \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering return log_oom(); \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering } else { \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering r = asprintf(&s, "%u", i); \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering if (r < 0) \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering return log_oom(); \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering } \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering *str = s; \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return 0; \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering } \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering type name##_from_string(const char *s) { \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering type i; \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering unsigned u = 0; \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering assert(s); \
eaf73b061604c028aa28f960870a9b46aab2f76aLuke Shumaker for (i = 0; i < (type)ELEMENTSOF(name##_table); i++) \
7c63b23f499069b7bbdf5e74d3e7a622918341e9Tom Gundersen if (name##_table[i] && \
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering streq(name##_table[i], s)) \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering return i; \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering if (safe_atou(s, &u) >= 0 && u <= max) \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering return (type) u; \
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering return (type) -1; \
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering } \
90d14d2015dda79c7b465b74dd3aaf2dfc25d43cLuke Shumaker struct __useless_struct_to_allow_trailing_semicolon__
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poetteringint fd_nonblock(int fd, bool nonblock);
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poetteringint fd_cloexec(int fd, bool cloexec);
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poetteringint close_all_fds(const int except[], unsigned n_except);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poetteringbool fstype_is_network(const char *fstype);
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint chvt(int vt);
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringint read_one_char(FILE *f, char *ret, usec_t timeout, bool *need_nl);
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poetteringint ask(char *ret, const char *replies, const char *text, ...) _printf_(3, 4);
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poetteringint reset_terminal_fd(int fd, bool switch_to_text);
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poetteringint reset_terminal(const char *name);
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poetteringint open_terminal(const char *name, int mode);
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringint acquire_terminal(const char *name, bool fail, bool force, bool ignore_tiocstty_eperm, usec_t timeout);
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poetteringint release_terminal(void);
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poetteringint flush_fd(int fd);
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint ignore_signals(int sig, ...);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint default_signals(int sig, ...);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint sigaction_many(const struct sigaction *sa, ...);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint close_pipe(int p[]);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint fopen_temporary(const char *path, FILE **_f, char **_temp_path);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll);
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poetteringssize_t loop_write(int fd, const void *buf, size_t nbytes, bool do_poll);
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poetteringbool is_device_path(const char *path);
9c857b9d160c10b4454fc9f83442c1878343422fLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint dir_is_empty(const char *path);
679bc6cb9016715339aac4ae6b2d5371c6262935Lennart Poetteringchar* dirname_malloc(const char *path);
679bc6cb9016715339aac4ae6b2d5371c6262935Lennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringvoid rename_process(const char name[8]);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringvoid sigset_add_many(sigset_t *ss, ...);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringbool hostname_is_set(void);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringchar* gethostname_malloc(void);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringchar* getlogname_malloc(void);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringchar* getusername_malloc(void);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint getttyname_malloc(int fd, char **r);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint getttyname_harder(int fd, char **r);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint get_ctty_devnr(pid_t pid, dev_t *d);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint get_ctty(pid_t, dev_t *_devnr, char **r);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint chmod_and_chown(const char *path, mode_t mode, uid_t uid, gid_t gid);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint fchmod_and_fchown(int fd, mode_t mode, uid_t uid, gid_t gid);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint rm_rf_children(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint rm_rf_children_dangerous(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev);
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint rm_rf(const char *path, bool only_dirs, bool delete_root, bool honour_sticky);
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringint rm_rf_dangerous(const char *path, bool only_dirs, bool delete_root, bool honour_sticky);
d60473c7ba32f2325a13f0357b23fd8e25609650Lennart Poettering
d60473c7ba32f2325a13f0357b23fd8e25609650Lennart Poetteringint pipe_eof(int fd);
d60473c7ba32f2325a13f0357b23fd8e25609650Lennart Poettering
d60473c7ba32f2325a13f0357b23fd8e25609650Lennart Poetteringcpu_set_t* cpu_set_malloc(unsigned *ncpus);
d60473c7ba32f2325a13f0357b23fd8e25609650Lennart Poettering
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringint status_vprintf(const char *status, bool ellipse, bool ephemeral, const char *format, va_list ap) _printf_(4,0);
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringint status_printf(const char *status, bool ellipse, bool ephemeral, const char *format, ...) _printf_(4,5);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poetteringint fd_columns(int fd);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poetteringunsigned columns(void);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poetteringint fd_lines(int fd);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poetteringunsigned lines(void);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poetteringvoid columns_lines_cache_reset(int _unused_ signum);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poetteringbool on_tty(void);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poetteringstatic inline const char *ansi_highlight(void) {
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return on_tty() ? ANSI_HIGHLIGHT_ON : "";
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poettering}
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poettering
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poetteringstatic inline const char *ansi_highlight_red(void) {
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poettering return on_tty() ? ANSI_HIGHLIGHT_RED_ON : "";
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poettering}
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poettering
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poetteringstatic inline const char *ansi_highlight_green(void) {
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poettering return on_tty() ? ANSI_HIGHLIGHT_GREEN_ON : "";
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poettering}
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poettering
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poetteringstatic inline const char *ansi_highlight_yellow(void) {
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poettering return on_tty() ? ANSI_HIGHLIGHT_YELLOW_ON : "";
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poettering}
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poettering
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poetteringstatic inline const char *ansi_highlight_blue(void) {
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poettering return on_tty() ? ANSI_HIGHLIGHT_BLUE_ON : "";
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poettering}
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poettering
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poetteringstatic inline const char *ansi_highlight_off(void) {
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poettering return on_tty() ? ANSI_HIGHLIGHT_OFF : "";
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poettering}
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poettering
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poetteringint running_in_chroot(void);
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poettering
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poetteringchar *ellipsize(const char *s, size_t length, unsigned percent);
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poettering /* bytes columns */
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poetteringchar *ellipsize_mem(const char *s, size_t old_length, size_t new_length, unsigned percent);
da054c3782f25b3b18243f6c76dcfcf90ba70274Lennart Poettering
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poetteringint touch(const char *path);
char *unquote(const char *s, const char *quotes);
char *normalize_env_assignment(const char *s);
int wait_for_terminate(pid_t pid, siginfo_t *status);
int wait_for_terminate_and_warn(const char *name, pid_t pid);
noreturn void freeze(void);
bool null_or_empty(struct stat *st) _pure_;
int null_or_empty_path(const char *fn);
DIR *xopendirat(int dirfd, const char *name, int flags);
char *fstab_node_to_udev_node(const char *p);
char *resolve_dev_console(char **active);
bool tty_is_vc(const char *tty);
bool tty_is_vc_resolve(const char *tty);
bool tty_is_console(const char *tty) _pure_;
int vtnr_from_tty(const char *tty);
const char *default_term_for_tty(const char *tty);
void execute_directory(const char *directory, DIR *_d, usec_t timeout, char *argv[]);
int kill_and_sigcont(pid_t pid, int sig);
bool nulstr_contains(const char*nulstr, const char *needle);
bool plymouth_running(void);
bool hostname_is_valid(const char *s) _pure_;
char* hostname_cleanup(char *s, bool lowercase);
char* strshorten(char *s, size_t l);
int terminal_vhangup_fd(int fd);
int terminal_vhangup(const char *name);
int vt_disallocate(const char *name);
int copy_file(const char *from, const char *to, int flags);
int symlink_atomic(const char *from, const char *to);
int fchmod_umask(int fd, mode_t mode);
bool display_is_local(const char *display) _pure_;
int socket_from_display(const char *display, char **path);
int get_user_creds(const char **username, uid_t *uid, gid_t *gid, const char **home, const char **shell);
int get_group_creds(const char **groupname, gid_t *gid);
int in_gid(gid_t gid);
int in_group(const char *name);
char* uid_to_name(uid_t uid);
char* gid_to_name(gid_t gid);
int glob_exists(const char *path);
int glob_extend(char ***strv, const char *path);
int dirent_ensure_type(DIR *d, struct dirent *de);
int in_search_path(const char *path, char **search);
int get_files_in_directory(const char *path, char ***list);
char *strjoin(const char *x, ...) _sentinel_;
bool is_main_thread(void);
bool in_charset(const char *s, const char* charset) _pure_;
int block_get_whole_disk(dev_t d, dev_t *ret);
int file_is_priv_sticky(const char *p);
int strdup_or_null(const char *a, char **b);
#define NULSTR_FOREACH(i, l) \
for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1)
#define NULSTR_FOREACH_PAIR(i, j, l) \
for ((i) = (l), (j) = strchr((i), 0)+1; (i) && *(i); (i) = strchr((j), 0)+1, (j) = *(i) ? strchr((i), 0)+1 : (i))
int ioprio_class_to_string_alloc(int i, char **s);
int ioprio_class_from_string(const char *s);
const char *sigchld_code_to_string(int i) _const_;
int sigchld_code_from_string(const char *s) _pure_;
int log_facility_unshifted_to_string_alloc(int i, char **s);
int log_facility_unshifted_from_string(const char *s);
int log_level_to_string_alloc(int i, char **s);
int log_level_from_string(const char *s);
int sched_policy_to_string_alloc(int i, char **s);
int sched_policy_from_string(const char *s);
const char *rlimit_to_string(int i) _const_;
int rlimit_from_string(const char *s) _pure_;
int ip_tos_to_string_alloc(int i, char **s);
int ip_tos_from_string(const char *s);
const char *signal_to_string(int i) _const_;
int signal_from_string(const char *s) _pure_;
int signal_from_string_try_harder(const char *s);
extern int saved_argc;
extern char **saved_argv;
bool kexec_loaded(void);
int prot_from_flags(int flags) _const_;
char *format_bytes(char *buf, size_t l, off_t t);
int fd_wait_for_event(int fd, int event, usec_t timeout);
void* memdup(const void *p, size_t l) _alloc_(2);
int is_kernel_thread(pid_t pid);
int fd_inc_sndbuf(int fd, size_t n);
int fd_inc_rcvbuf(int fd, size_t n);
int fork_agent(pid_t *pid, const int except[], unsigned n_except, const char *path, ...);
int setrlimit_closest(int resource, const struct rlimit *rlim);
int getenv_for_pid(pid_t pid, const char *field, char **_value);
bool is_valid_documentation_url(const char *url) _pure_;
bool in_initrd(void);
void warn_melody(void);
int get_home_dir(char **ret);
int get_shell(char **_ret);
static inline void freep(void *p) {
free(*(void**) p);
}
#define DEFINE_TRIVIAL_CLEANUP_FUNC(type, func) \
static inline void func##p(type *p) { \
if (*p) \
func(*p); \
} \
struct __useless_struct_to_allow_trailing_semicolon__
static inline void closep(int *fd) {
if (*fd >= 0)
close_nointr_nofail(*fd);
}
static inline void umaskp(mode_t *u) {
umask(*u);
}
static inline void close_pipep(int (*p)[2]) {
close_pipe(*p);
}
DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, fclose);
DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, pclose);
DEFINE_TRIVIAL_CLEANUP_FUNC(DIR*, closedir);
DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, endmntent);
#define _cleanup_free_ _cleanup_(freep)
#define _cleanup_close_ _cleanup_(closep)
#define _cleanup_umask_ _cleanup_(umaskp)
#define _cleanup_globfree_ _cleanup_(globfree)
#define _cleanup_fclose_ _cleanup_(fclosep)
#define _cleanup_pclose_ _cleanup_(pclosep)
#define _cleanup_closedir_ _cleanup_(closedirp)
#define _cleanup_endmntent_ _cleanup_(endmntentp)
#define _cleanup_close_pipe_ _cleanup_(close_pipep)
_malloc_ _alloc_(1, 2) static inline void *malloc_multiply(size_t a, size_t b) {
if (_unlikely_(b == 0 || a > ((size_t) -1) / b))
return NULL;
return malloc(a * b);
}
_alloc_(2, 3) static inline void *memdup_multiply(const void *p, size_t a, size_t b) {
if (_unlikely_(b == 0 || a > ((size_t) -1) / b))
return NULL;
return memdup(p, a * b);
}
bool filename_is_safe(const char *p) _pure_;
bool path_is_safe(const char *p) _pure_;
bool string_is_safe(const char *p) _pure_;
bool string_has_cc(const char *p) _pure_;
/**
* Check if a string contains any glob patterns.
*/
_pure_ static inline bool string_is_glob(const char *p) {
return !!strpbrk(p, GLOB_CHARS);
}
void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
int (*compar) (const void *, const void *, void *),
void *arg);
bool is_locale_utf8(void);
typedef enum DrawSpecialChar {
DRAW_TREE_VERT,
DRAW_TREE_BRANCH,
DRAW_TREE_RIGHT,
DRAW_TREE_SPACE,
DRAW_TRIANGULAR_BULLET,
DRAW_BLACK_CIRCLE,
_DRAW_SPECIAL_CHAR_MAX
} DrawSpecialChar;
const char *draw_special_char(DrawSpecialChar ch);
char *strreplace(const char *text, const char *old_string, const char *new_string);
char *strip_tab_ansi(char **p, size_t *l);
int on_ac_power(void);
int search_and_fopen(const char *path, const char *mode, const char **search, FILE **_f);
int search_and_fopen_nulstr(const char *path, const char *mode, const char *search, FILE **_f);
#define FOREACH_LINE(line, f, on_error) \
for (;;) \
if (!fgets(line, sizeof(line), f)) { \
if (ferror(f)) { \
on_error; \
} \
break; \
} else
#define FOREACH_DIRENT(de, d, on_error) \
for (errno = 0, de = readdir(d);; errno = 0, de = readdir(d)) \
if (!de) { \
if (errno > 0) { \
on_error; \
} \
break; \
} else if (ignore_file((de)->d_name)) \
continue; \
else
static inline void *mempset(void *s, int c, size_t n) {
memset(s, c, n);
return (uint8_t*)s + n;
}
char *hexmem(const void *p, size_t l);
void *unhexmem(const char *p, size_t l);
char *strextend(char **x, ...) _sentinel_;
char *strrep(const char *s, unsigned n);
void* greedy_realloc(void **p, size_t *allocated, size_t need);
void* greedy_realloc0(void **p, size_t *allocated, size_t need);
#define GREEDY_REALLOC(array, allocated, need) \
greedy_realloc((void**) &(array), &(allocated), sizeof((array)[0]) * (need))
#define GREEDY_REALLOC0(array, allocated, need) \
greedy_realloc0((void**) &(array), &(allocated), sizeof((array)[0]) * (need))
#define GREEDY_REALLOC0_T(array, count, need) \
({ \
size_t _size = (count) * sizeof((array)[0]); \
void *_ptr = GREEDY_REALLOC0((array), _size, (need)); \
if (_ptr) \
(count) = _size / sizeof((array)[0]); \
_ptr; \
})
static inline void _reset_errno_(int *saved_errno) {
errno = *saved_errno;
}
#define PROTECT_ERRNO _cleanup_(_reset_errno_) __attribute__((unused)) int _saved_errno_ = errno
struct _umask_struct_ {
mode_t mask;
bool quit;
};
static inline void _reset_umask_(struct _umask_struct_ *s) {
umask(s->mask);
};
#define RUN_WITH_UMASK(mask) \
for (_cleanup_(_reset_umask_) struct _umask_struct_ _saved_umask_ = { umask(mask), false }; \
!_saved_umask_.quit ; \
_saved_umask_.quit = true)
static inline unsigned u64log2(uint64_t n) {
#if __SIZEOF_LONG_LONG__ == 8
return (n > 1) ? (unsigned) __builtin_clzll(n) ^ 63U : 0;
#else
#error "Wut?"
#endif
}
static inline unsigned u32ctz(uint32_t n) {
#if __SIZEOF_INT__ == 4
return __builtin_ctz(n);
#else
#error "Wut?"
#endif
}
static inline bool logind_running(void) {
return access("/run/systemd/seats/", F_OK) >= 0;
}
#define DECIMAL_STR_WIDTH(x) \
({ \
typeof(x) _x_ = (x); \
unsigned ans = 1; \
while (_x_ /= 10) \
ans++; \
ans; \
})
int unlink_noerrno(const char *path);
#define alloca0(n) \
({ \
char *_new_; \
size_t _len_ = n; \
_new_ = alloca(_len_); \
(void *) memset(_new_, 0, _len_); \
})
#define strappenda(a, b) \
({ \
const char *_a_ = (a), *_b_ = (b); \
char *_c_; \
size_t _x_, _y_; \
_x_ = strlen(_a_); \
_y_ = strlen(_b_); \
_c_ = alloca(_x_ + _y_ + 1); \
strcpy(stpcpy(_c_, _a_), _b_); \
_c_; \
})
#define procfs_file_alloca(pid, field) \
({ \
pid_t _pid_ = (pid); \
const char *_r_; \
if (_pid_ == 0) { \
_r_ = ("/proc/self/" field); \
} else { \
_r_ = alloca(strlen("/proc/") + DECIMAL_STR_MAX(pid_t) + 1 + sizeof(field)); \
sprintf((char*) _r_, "/proc/"PID_FMT"/" field, _pid_); \
} \
_r_; \
})
struct _locale_struct_ {
locale_t saved_locale;
locale_t new_locale;
bool quit;
};
static inline void _reset_locale_(struct _locale_struct_ *s) {
PROTECT_ERRNO;
if (s->saved_locale != (locale_t) 0)
uselocale(s->saved_locale);
if (s->new_locale != (locale_t) 0)
freelocale(s->new_locale);
}
#define RUN_WITH_LOCALE(mask, loc) \
for (_cleanup_(_reset_locale_) struct _locale_struct_ _saved_locale_ = { (locale_t) 0, (locale_t) 0, false }; \
({ \
if (!_saved_locale_.quit) { \
PROTECT_ERRNO; \
_saved_locale_.new_locale = newlocale((mask), (loc), (locale_t) 0); \
if (_saved_locale_.new_locale != (locale_t) 0) \
_saved_locale_.saved_locale = uselocale(_saved_locale_.new_locale); \
} \
!_saved_locale_.quit; }) ; \
_saved_locale_.quit = true)
bool id128_is_valid(const char *s) _pure_;
int split_pair(const char *s, const char *sep, char **l, char **r);
int shall_restore_state(void);
/**
* Normal qsort requires base to be nonnull. Here were require
* that only if nmemb > 0.
*/
static inline void qsort_safe(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *)) {
if (nmemb) {
assert(base);
qsort(base, nmemb, size, compar);
}
}
int proc_cmdline(char **ret);
int parse_proc_cmdline(int (*parse_word)(const char *key, const char *value));
int container_get_leader(const char *machine, pid_t *pid);
int namespace_open(pid_t pid, int *pidns_fd, int *mntns_fd, int *root_fd);
int namespace_enter(int pidns_fd, int mntns_fd, int root_fd);
bool pid_is_alive(pid_t pid);
bool pid_is_unwaited(pid_t pid);
int getpeercred(int fd, struct ucred *ucred);
int getpeersec(int fd, char **ret);
int writev_safe(int fd, const struct iovec *w, int j);
int mkostemp_safe(char *pattern, int flags);
int open_tmpfile(const char *path, int flags);
int fd_warn_permissions(const char *path, int fd);
unsigned long personality_from_string(const char *p);
const char *personality_to_string(unsigned long);
uint64_t physical_memory(void);