X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Futil.h;h=61b88a8b2e6ad0279dea5ecef46609b72115605a;hp=cca611836370778bc751e081be94540a96a6a983;hb=585314e84c1a2e8941309874088963985e063213;hpb=bbc98d32560cc456531bf254f7b69054921082bd diff --git a/src/shared/util.h b/src/shared/util.h index cca611836..61b88a8b2 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -1,7 +1,6 @@ /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ -#ifndef fooutilhfoo -#define fooutilhfoo +#pragma once /*** This file is part of systemd. @@ -32,19 +31,28 @@ #include #include #include +#include #include #include #include +#include #include "macro.h" typedef uint64_t usec_t; +typedef uint64_t nsec_t; typedef struct dual_timestamp { usec_t realtime; usec_t monotonic; } dual_timestamp; +union dirent_storage { + struct dirent de; + uint8_t storage[offsetof(struct dirent, d_name) + + ((NAME_MAX + 1 + sizeof(long)) & ~(sizeof(long) - 1))]; +}; + #define MSEC_PER_SEC 1000ULL #define USEC_PER_SEC 1000000ULL #define USEC_PER_MSEC 1000ULL @@ -53,11 +61,17 @@ typedef struct dual_timestamp { #define NSEC_PER_USEC 1000ULL #define USEC_PER_MINUTE (60ULL*USEC_PER_SEC) +#define NSEC_PER_MINUTE (60ULL*NSEC_PER_SEC) #define USEC_PER_HOUR (60ULL*USEC_PER_MINUTE) +#define NSEC_PER_HOUR (60ULL*NSEC_PER_MINUTE) #define USEC_PER_DAY (24ULL*USEC_PER_HOUR) +#define NSEC_PER_DAY (24ULL*NSEC_PER_HOUR) #define USEC_PER_WEEK (7ULL*USEC_PER_DAY) +#define NSEC_PER_WEEK (7ULL*NSEC_PER_DAY) #define USEC_PER_MONTH (2629800ULL*USEC_PER_SEC) +#define NSEC_PER_MONTH (2629800ULL*NSEC_PER_SEC) #define USEC_PER_YEAR (31557600ULL*USEC_PER_SEC) +#define NSEC_PER_YEAR (31557600ULL*NSEC_PER_SEC) /* What is interpreted as whitespace? */ #define WHITESPACE " \t\n\r" @@ -73,6 +87,7 @@ typedef struct dual_timestamp { #define ANSI_HIGHLIGHT_ON "\x1B[1;39m" #define ANSI_HIGHLIGHT_RED_ON "\x1B[1;31m" #define ANSI_HIGHLIGHT_GREEN_ON "\x1B[1;32m" +#define ANSI_HIGHLIGHT_YELLOW_ON "\x1B[1;33m" #define ANSI_HIGHLIGHT_OFF "\x1B[0m" usec_t now(clockid_t clock); @@ -96,13 +111,13 @@ size_t page_size(void); bool streq_ptr(const char *a, const char *b); -#define new(t, n) ((t*) malloc(sizeof(t)*(n))) +#define new(t, n) ((t*) malloc_multiply(sizeof(t), (n))) #define new0(t, n) ((t*) calloc((n), sizeof(t))) #define newa(t, n) ((t*) alloca(sizeof(t)*(n))) -#define newdup(t, p, n) ((t*) memdup(p, sizeof(t)*(n)) +#define newdup(t, p, n) ((t*) memdup_multiply(p, sizeof(t), (n))) #define malloc0(n) (calloc((n), 1)) @@ -122,10 +137,6 @@ static inline const char *strna(const char *s) { return s ? s : "n/a"; } -static inline bool is_path_absolute(const char *p) { - return *p == '/'; -} - static inline bool isempty(const char *p) { return !p || !p[0]; } @@ -142,6 +153,7 @@ void close_many(const int fds[], unsigned n_fd); int parse_boolean(const char *v); int parse_usec(const char *t, usec_t *usec); +int parse_nsec(const char *t, nsec_t *nsec); int parse_bytes(const char *t, off_t *bytes); int parse_pid(const char *s, pid_t* ret_pid); int parse_uid(const char *s, uid_t* ret_uid); @@ -205,8 +217,6 @@ char *split_quoted(const char *c, size_t *l, char **state); #define FOREACH_WORD_QUOTED(word, length, s, state) \ for ((state) = NULL, (word) = split_quoted((s), &(length), &(state)); (word); (word) = split_quoted((s), &(length), &(state))) -char **split_path_and_make_absolute(const char *p); - pid_t get_parent_of_pid(pid_t pid, pid_t *ppid); int get_starttime_of_pid(pid_t pid, unsigned long long *st); @@ -229,17 +239,6 @@ int readlink_malloc(const char *p, char **r); int readlink_and_make_absolute(const char *p, char **r); int readlink_and_canonicalize(const char *p, char **r); -char *file_name_from_path(const char *p); -bool is_path(const char *p); - -bool path_is_absolute(const char *p); -char *path_make_absolute(const char *p, const char *prefix); -char *path_make_absolute_cwd(const char *p); - -char **strv_path_make_absolute_cwd(char **l); -char **strv_path_canonicalize(char **l); -char **strv_path_remove_empty(char **l); - int reset_all_signal_handlers(void); char *strstrip(char *s); @@ -248,14 +247,13 @@ char *truncate_nl(char *s); char *file_in_same_dir(const char *path, const char *filename); -int parent_of_path(const char *path, char **parent); - int rmdir_parents(const char *path, const char *stop); int get_process_comm(pid_t pid, char **name); int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line); int get_process_exe(pid_t pid, char **name); int get_process_uid(pid_t pid, uid_t *uid); +int get_process_gid(pid_t pid, gid_t *gid); char hexchar(int x); int unhexchar(char c); @@ -267,17 +265,13 @@ int undecchar(char c); char *cescape(const char *s); char *cunescape(const char *s); char *cunescape_length(const char *s, size_t length); +char *cunescape_length_with_prefix(const char *s, size_t length, const char *prefix); char *xescape(const char *s, const char *bad); char *bus_path_escape(const char *s); char *bus_path_unescape(const char *s); -char *path_kill_slashes(char *path); - -bool path_startswith(const char *path, const char *prefix); -bool path_equal(const char *a, const char *b); - char *ascii_strlower(char *path); bool dirent_is_file(const struct dirent *de); @@ -293,6 +287,7 @@ char *format_timespan(char *buf, size_t l, usec_t t); int make_stdio(int fd); int make_null_stdio(void); +int make_console_stdio(void); unsigned long long random_ull(void); @@ -336,7 +331,7 @@ int reset_terminal_fd(int fd, bool switch_to_text); int reset_terminal(const char *name); int open_terminal(const char *name, int mode); -int acquire_terminal(const char *name, bool fail, bool force, bool ignore_tiocstty_eperm); +int acquire_terminal(const char *name, bool fail, bool force, bool ignore_tiocstty_eperm, usec_t timeout); int release_terminal(void); int flush_fd(int fd); @@ -351,9 +346,6 @@ int fopen_temporary(const char *path, FILE **_f, char **_temp_path); ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll); ssize_t loop_write(int fd, const void *buf, size_t nbytes, bool do_poll); -int path_is_mount_point(const char *path, bool allow_symlink); -int path_is_read_only_fs(const char *path); - bool is_device_path(const char *path); int dir_is_empty(const char *path); @@ -362,8 +354,11 @@ void rename_process(const char name[8]); void sigset_add_many(sigset_t *ss, ...); +bool hostname_is_set(void); + char* gethostname_malloc(void); char* getlogname_malloc(void); +char* getusername_malloc(void); int getttyname_malloc(int fd, char **r); int getttyname_harder(int fd, char **r); @@ -374,18 +369,23 @@ int get_ctty(pid_t, dev_t *_devnr, char **r); int chmod_and_chown(const char *path, mode_t mode, uid_t uid, gid_t gid); int fchmod_and_fchown(int fd, mode_t mode, uid_t uid, gid_t gid); +int rm_rf_children(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev); +int rm_rf_children_dangerous(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev); int rm_rf(const char *path, bool only_dirs, bool delete_root, bool honour_sticky); +int rm_rf_dangerous(const char *path, bool only_dirs, bool delete_root, bool honour_sticky); int pipe_eof(int fd); cpu_set_t* cpu_set_malloc(unsigned *ncpus); -void status_vprintf(const char *status, bool ellipse, const char *format, va_list ap); -void status_printf(const char *status, bool ellipse, const char *format, ...); -void status_welcome(void); +int status_vprintf(const char *status, bool ellipse, const char *format, va_list ap); +int status_printf(const char *status, bool ellipse, const char *format, ...); +int status_welcome(void); int fd_columns(int fd); unsigned columns(void); +unsigned columns_uncached(void); +void columns_cache_reset(int _unused_ signum); int fd_lines(int fd); unsigned lines(void); @@ -429,10 +429,6 @@ bool nulstr_contains(const char*nulstr, const char *needle); bool plymouth_running(void); -void parse_syslog_priority(char **p, int *priority); -void skip_syslog_pid(char **buf); -void skip_syslog_date(char **buf); - bool hostname_is_valid(const char *s); char* hostname_cleanup(char *s); @@ -444,15 +440,15 @@ int terminal_vhangup(const char *name); int vt_disallocate(const char *name); int copy_file(const char *from, const char *to); -int symlink_or_copy(const char *from, const char *to); -int symlink_or_copy_atomic(const char *from, const char *to); + +int symlink_atomic(const char *from, const char *to); int fchmod_umask(int fd, mode_t mode); bool display_is_local(const char *display); 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); +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_group(const char *name); @@ -464,7 +460,7 @@ 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 *join(const char *x, ...) _sentinel_; +char *strjoin(const char *x, ...) _sentinel_; bool is_main_thread(void); @@ -519,7 +515,7 @@ 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); +void* memdup(const void *p, size_t l) _malloc_; int is_kernel_thread(pid_t pid); @@ -532,4 +528,33 @@ int setrlimit_closest(int resource, const struct rlimit *rlim); int getenv_for_pid(pid_t pid, const char *field, char **_value); -#endif +int can_sleep(const char *type); + +bool is_valid_documentation_url(const char *url); + +bool in_initrd(void); + +void warn_melody(void); + +int get_shell(char **ret); +int get_home_dir(char **ret); + +void freep(void *p); +void fclosep(FILE **f); +void closep(int *fd); +void closedirp(DIR **d); +void umaskp(mode_t *u); + +_malloc_ 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); +} + +_malloc_ 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); +}