X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Futil.h;h=488ce3ba6dc27181449e2e3efa8bc556820276b2;hp=26af5b30af668f3139191e064bcabda2c85f405c;hb=4ff4ebb1fbb7296f67b89b66d2d7f720b49b51c5;hpb=f405e86de361ec305dc2b8634efeaa23dc144053 diff --git a/src/shared/util.h b/src/shared/util.h index 26af5b30a..488ce3ba6 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -44,12 +44,6 @@ #include "macro.h" #include "time-util.h" -union dirent_storage { - struct dirent de; - uint8_t storage[offsetof(struct dirent, d_name) + - ((NAME_MAX + 1 + sizeof(long)) & ~(sizeof(long) - 1))]; -}; - /* What is interpreted as whitespace? */ #define WHITESPACE " \t\n\r" #define NEWLINE "\n\r" @@ -64,6 +58,7 @@ union dirent_storage { #define ANSI_GREEN_ON "\x1B[32m" #define ANSI_HIGHLIGHT_GREEN_ON "\x1B[1;32m" #define ANSI_HIGHLIGHT_YELLOW_ON "\x1B[1;33m" +#define ANSI_HIGHLIGHT_BLUE_ON "\x1B[1;34m" #define ANSI_HIGHLIGHT_OFF "\x1B[0m" #define ANSI_ERASE_TO_END_OF_LINE "\x1B[K" @@ -91,6 +86,10 @@ static inline const char* yes_no(bool b) { return b ? "yes" : "no"; } +static inline const char* true_false(bool b) { + return b ? "true" : "false"; +} + static inline const char* strempty(const char *s) { return s ? s : ""; } @@ -237,9 +236,6 @@ char *cunescape_length_with_prefix(const char *s, size_t length, const char *pre char *xescape(const char *s, const char *bad); -char *bus_path_escape(const char *s); -char *bus_path_unescape(const char *s); - char *ascii_strlower(char *path); bool dirent_is_file(const struct dirent *de) _pure_; @@ -320,7 +316,7 @@ bool fstype_is_network(const char *fstype); int chvt(int vt); int read_one_char(FILE *f, char *ret, usec_t timeout, bool *need_nl); -int ask(char *ret, const char *replies, const char *text, ...) _printf_attr_(3, 4); +int ask(char *ret, const char *replies, const char *text, ...) _printf_(3, 4); int reset_terminal_fd(int fd, bool switch_to_text); int reset_terminal(const char *name); @@ -374,8 +370,8 @@ int pipe_eof(int fd); cpu_set_t* cpu_set_malloc(unsigned *ncpus); -int status_vprintf(const char *status, bool ellipse, bool ephemeral, const char *format, va_list ap) _printf_attr_(4,0); -int status_printf(const char *status, bool ellipse, bool ephemeral, const char *format, ...) _printf_attr_(4,5); +int status_vprintf(const char *status, bool ellipse, bool ephemeral, const char *format, va_list ap) _printf_(4,0); +int status_printf(const char *status, bool ellipse, bool ephemeral, const char *format, ...) _printf_(4,5); int status_welcome(void); int fd_columns(int fd); @@ -398,6 +394,14 @@ static inline const char *ansi_highlight_green(void) { return on_tty() ? ANSI_HIGHLIGHT_GREEN_ON : ""; } +static inline const char *ansi_highlight_yellow(void) { + return on_tty() ? ANSI_HIGHLIGHT_YELLOW_ON : ""; +} + +static inline const char *ansi_highlight_blue(void) { + return on_tty() ? ANSI_HIGHLIGHT_BLUE_ON : ""; +} + static inline const char *ansi_highlight_off(void) { return on_tty() ? ANSI_HIGHLIGHT_OFF : ""; } @@ -416,7 +420,7 @@ 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); +noreturn void freeze(void); bool null_or_empty(struct stat *st) _pure_; int null_or_empty_path(const char *fn); @@ -551,48 +555,46 @@ 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); } -static inline void fclosep(FILE **f) { - if (*f) - fclose(*f); -} - -static inline void pclosep(FILE **f) { - if (*f) - pclose(*f); -} +#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 closedirp(DIR **d) { - if (*d) - closedir(*d); -} - static inline void umaskp(mode_t *u) { umask(*u); } -static inline void endmntentp(FILE **f) { - if (*f) - endmntent(*f); +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_fclose_ _cleanup_(fclosep) -#define _cleanup_pclose_ _cleanup_(pclosep) #define _cleanup_close_ _cleanup_(closep) -#define _cleanup_closedir_ _cleanup_(closedirp) #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)) @@ -625,6 +627,7 @@ typedef enum DrawSpecialChar { DRAW_TREE_RIGHT, DRAW_TREE_SPACE, DRAW_TRIANGULAR_BULLET, + DRAW_BLACK_CIRCLE, _DRAW_SPECIAL_CHAR_MAX } DrawSpecialChar; const char *draw_special_char(DrawSpecialChar ch); @@ -637,7 +640,6 @@ 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); -int create_tmp_dir(char template[], char** dir_name); #define FOREACH_LINE(line, f, on_error) \ for (;;) \ @@ -671,8 +673,11 @@ 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)) static inline void _reset_errno_(int *saved_errno) { errno = *saved_errno; @@ -772,3 +777,26 @@ bool id128_is_valid(const char *s) _pure_; void parse_user_at_host(char *arg, char **user, char **host); 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 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_valid(pid_t pid);