X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Futil.h;h=affb66998c1977c78b53bd8b142f2c2cf1b0bcc2;hb=ed757c0cb03eef50e8d9aeb4682401c3e9486f0b;hp=d5a48eb00f152afc995f1f859c6f972d831d3114;hpb=5b4c61cd0b7d35f5a905c83a0ee111a1876a7873;p=elogind.git diff --git a/src/shared/util.h b/src/shared/util.h index d5a48eb00..affb66998 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -31,9 +31,11 @@ #include #include #include +#include #include #include #include +#include #include "macro.h" @@ -45,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 @@ -103,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)) @@ -245,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); @@ -369,16 +378,17 @@ 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); - 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); @@ -419,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); @@ -434,8 +440,8 @@ 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); @@ -509,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,3 +538,28 @@ 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); +} + +bool filename_is_safe(const char *p); +bool string_is_safe(const char *p); + +int parse_timestamp(const char *t, usec_t *usec);