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=c8d048f9b28999110ed311776da7a73e90a24b3d;hb=585314e84c1a2e8941309874088963985e063213;hpb=cd3bd60a2e4bb08526d953a323bbe1a0ace78b9e diff --git a/src/shared/util.h b/src/shared/util.h index c8d048f9b..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,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)) @@ -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); @@ -345,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); @@ -367,12 +378,14 @@ 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); @@ -416,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); @@ -431,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); @@ -451,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); @@ -506,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); @@ -527,4 +536,25 @@ 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); +}