X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=src%2Fshared%2Futil.h;h=a9c39b867ea1a05b58af339641973113f59b2630;hb=a9e12476ed32256690eb801099c41526834b6390;hp=908593564ebd27459a736014240df5a9d1e6ed9a;hpb=952d817a41dfe207d159f8278f4d7f1f7654c572;p=elogind.git diff --git a/src/shared/util.h b/src/shared/util.h index 908593564..a9c39b867 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,9 +31,11 @@ #include #include #include +#include #include #include #include +#include #include "macro.h" @@ -46,6 +47,12 @@ typedef struct dual_timestamp { 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 @@ -104,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)) @@ -134,7 +141,7 @@ static inline bool isempty(const char *p) { return !p || !p[0]; } -bool endswith(const char *s, const char *postfix); +char *endswith(const char *s, const char *postfix); bool startswith(const char *s, const char *prefix); bool startswith_no_case(const char *s, const char *prefix); @@ -246,6 +253,7 @@ 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); @@ -257,6 +265,7 @@ 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); @@ -278,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); @@ -321,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); @@ -344,9 +354,11 @@ void rename_process(const char name[8]); void sigset_add_many(sigset_t *ss, ...); -char* gethostname_malloc(void); 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); @@ -358,21 +370,25 @@ 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); - int fd_lines(int fd); unsigned lines(void); +void columns_lines_cache_reset(int _unused_ signum); + +bool on_tty(void); int running_in_chroot(void); @@ -413,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); @@ -428,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); @@ -448,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); @@ -503,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); @@ -524,4 +536,34 @@ bool in_initrd(void); void warn_melody(void); -#endif +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); +} + +bool filename_is_safe(const char *p); +bool string_is_safe(const char *p); + +int parse_timestamp(const char *t, usec_t *usec); + +void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size, + int (*compar) (const void *, const void *, void *), + void *arg);