X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Futil.h;h=70c20fdcf10cb6a4ec5e2c677d9233bf314d4971;hp=11d28665b6ba5144d5b81fae22124ace9e1ceda5;hb=03e334a1c7dc8c20c38902aa039440763acc9b17;hpb=9d9951a460a90ef0e1e0384742cefdcf85193f8c diff --git a/src/shared/util.h b/src/shared/util.h index 11d28665b..70c20fdcf 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -149,7 +149,8 @@ char *endswith(const char *s, const char *postfix) _pure_; bool first_word(const char *s, const char *word) _pure_; int close_nointr(int fd); -void close_nointr_nofail(int fd); +int safe_close(int fd); + void close_many(const int fds[], unsigned n_fd); int parse_size(const char *t, off_t base, off_t *size); @@ -531,7 +532,11 @@ char *strjoin(const char *x, ...) _sentinel_; bool is_main_thread(void); -bool in_charset(const char *s, const char* charset) _pure_; +static inline bool _pure_ in_charset(const char *s, const char* charset) { + assert(s); + assert(charset); + return s[strspn(s, charset)] == '\0'; +} int block_get_whole_disk(dev_t d, dev_t *ret); @@ -616,8 +621,7 @@ static inline void freep(void *p) { struct __useless_struct_to_allow_trailing_semicolon__ static inline void closep(int *fd) { - if (*fd >= 0) - close_nointr_nofail(*fd); + safe_close(*fd); } static inline void umaskp(mode_t *u) { @@ -692,8 +696,8 @@ char *strip_tab_ansi(char **p, size_t *l); 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 search_and_fopen(const char *path, const char *mode, const char *root, const char **search, FILE **_f); +int search_and_fopen_nulstr(const char *path, const char *mode, const char *root, const char *search, FILE **_f); #define FOREACH_LINE(line, f, on_error) \ for (;;) \ @@ -778,6 +782,12 @@ static inline unsigned u32ctz(uint32_t n) { #endif } +static inline int log2i(int x) { + assert(x > 0); + + return __SIZEOF_INT__ * 8 - __builtin_clz(x) - 1; +} + static inline bool logind_running(void) { return access("/run/systemd/seats/", F_OK) >= 0; } @@ -813,6 +823,19 @@ int unlink_noerrno(const char *path); _c_; \ }) +#define strappenda3(a, b, c) \ + ({ \ + const char *_a_ = (a), *_b_ = (b), *_c_ = (c); \ + char *_d_; \ + size_t _x_, _y_, _z_; \ + _x_ = strlen(_a_); \ + _y_ = strlen(_b_); \ + _z_ = strlen(_c_); \ + _d_ = alloca(_x_ + _y_ + _z_ + 1); \ + strcpy(stpcpy(stpcpy(_d_, _a_), _b_), _c_); \ + _d_; \ + }) + #define procfs_file_alloca(pid, field) \ ({ \ pid_t _pid_ = (pid); \ @@ -897,3 +920,5 @@ const char *personality_to_string(unsigned long); uint64_t physical_memory(void); char* mount_test_option(const char *haystack, const char *needle); + +void hexdump(FILE *f, const void *p, size_t s);