X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Futil.h;h=fc59481b997090441a0ada7aff022f59e58c55c9;hb=ad450c3e0418fe23e2896e581575cb06564ca29a;hp=87ad317319315b07052f98bd3c0c719e7d3deca2;hpb=60e6abf16bd8fe6c78b42074f7fb357c02e6ddbd;p=elogind.git diff --git a/src/shared/util.h b/src/shared/util.h index 87ad31731..fc59481b9 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -158,15 +158,23 @@ static inline bool isempty(const char *p) { return !p || !p[0]; } -static inline const char *startswith(const char *s, const char *prefix) { - if (strncmp(s, prefix, strlen(prefix)) == 0) - return s + strlen(prefix); +static inline char *startswith(const char *s, const char *prefix) { + size_t l; + + l = strlen(prefix); + if (strncmp(s, prefix, l) == 0) + return (char*) s + l; + return NULL; } -static inline const char *startswith_no_case(const char *s, const char *prefix) { - if (strncasecmp(s, prefix, strlen(prefix)) == 0) - return s + strlen(prefix); +static inline char *startswith_no_case(const char *s, const char *prefix) { + size_t l; + + l = strlen(prefix); + if (strncasecmp(s, prefix, l) == 0) + return (char*) s + l; + return NULL; } @@ -197,7 +205,7 @@ int safe_atod(const char *s, double *ret_d); int safe_atou8(const char *s, uint8_t *ret); -#if __WORDSIZE == 32 +#if LONG_MAX == INT_MAX static inline int safe_atolu(const char *s, unsigned long *ret_u) { assert_cc(sizeof(unsigned long) == sizeof(unsigned)); return safe_atou(s, (unsigned*) ret_u); @@ -237,6 +245,9 @@ static inline int safe_atoi64(const char *s, int64_t *ret_i) { return safe_atolli(s, (long long int*) ret_i); } +int safe_atou16(const char *s, uint16_t *ret); +int safe_atoi16(const char *s, int16_t *ret); + const char* split(const char **state, size_t *l, const char *separator, bool quoted); #define FOREACH_WORD(word, length, s, state) \ @@ -262,10 +273,12 @@ char **replace_env_argv(char **argv, char **env); int readlinkat_malloc(int fd, const char *p, char **ret); int readlink_malloc(const char *p, char **r); +int readlink_value(const char *p, char **ret); int readlink_and_make_absolute(const char *p, char **r); int readlink_and_canonicalize(const char *p, char **r); int reset_all_signal_handlers(void); +int reset_signal_mask(void); char *strstrip(char *s); char *delete_chars(char *s, const char *bad); @@ -282,6 +295,8 @@ 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); int get_process_capeff(pid_t pid, char **capeff); +int get_process_cwd(pid_t pid, char **cwd); +int get_process_root(pid_t pid, char **root); char hexchar(int x) _const_; int unhexchar(char c) _const_; @@ -312,6 +327,7 @@ int make_console_stdio(void); int dev_urandom(void *p, size_t n); void random_bytes(void *p, size_t n); +void initialize_srand(void); static inline uint64_t random_u64(void) { uint64_t u; @@ -423,6 +439,7 @@ int sigprocmask_many(int how, ...); bool hostname_is_set(void); +char* lookup_uid(uid_t uid); char* gethostname_malloc(void); char* getlogname_malloc(void); char* getusername_malloc(void); @@ -571,10 +588,6 @@ static inline bool _pure_ in_charset(const char *s, const char* charset) { 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) @@ -785,6 +798,15 @@ static inline void _reset_errno_(int *saved_errno) { #define PROTECT_ERRNO _cleanup_(_reset_errno_) __attribute__((unused)) int _saved_errno_ = errno +static inline int negative_errno(void) { + /* This helper should be used to shut up gcc if you know 'errno' is + * negative. Instead of "return -errno;", use "return negative_errno();" + * It will suppress bogus gcc warnings in case it assumes 'errno' might + * be 0 and thus the caller's error-handling might not be triggered. */ + assert_return(errno > 0, -EINVAL); + return -errno; +} + struct _umask_struct_ { mode_t mask; bool quit; @@ -821,6 +843,21 @@ static inline int log2i(int x) { return __SIZEOF_INT__ * 8 - __builtin_clz(x) - 1; } +static inline unsigned log2u(unsigned x) { + assert(x > 0); + + return sizeof(unsigned) * 8 - __builtin_clz(x) - 1; +} + +static inline unsigned log2u_round_up(unsigned x) { + assert(x > 0); + + if (x == 1) + return 0; + + return log2u(x - 1) + 1; +} + static inline bool logind_running(void) { return access("/run/systemd/seats/", F_OK) >= 0; } @@ -844,6 +881,22 @@ int unlink_noerrno(const char *path); (void *) memset(_new_, 0, _len_); \ }) +#define alloca_align(size, align) \ + ({ \ + void *_ptr_; \ + size_t _mask_ = (align) - 1; \ + _ptr_ = alloca((size) + _mask_); \ + (void*)(((uintptr_t)_ptr_ + _mask_) & ~_mask_); \ + }) + +#define alloca0_align(size, align) \ + ({ \ + void *_new_; \ + size_t _size_ = (size); \ + _new_ = alloca_align(_size_, (align)); \ + (void*)memset(_new_, 0, _size_); \ + }) + #define strappenda(a, ...) \ ({ \ int _len = strlen(a); \ @@ -967,6 +1020,11 @@ bool is_localhost(const char *hostname); int take_password_lock(const char *root); int is_symlink(const char *path); +int is_dir(const char *path, bool follow); -int unquote_first_word(const char **p, char **ret); +int unquote_first_word(const char **p, char **ret, bool relax); int unquote_many_words(const char **p, ...) _sentinel_; + +int free_and_strdup(char **p, const char *s); + +int sethostname_idempotent(const char *s);