X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Futil.h;h=6575f5681199108799b54dfa5fb5059538dce9b8;hp=99ec0a39bdc4ee1212d4f6aec5ab974c3468d4a9;hb=31885cd5e38ec9807a6a7ab32660cf8c2fcf48f7;hpb=2244a6fbe6012924e74c7f2197512a55e9238b05
diff --git a/src/shared/util.h b/src/shared/util.h
index 99ec0a39b..6575f5681 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -21,6 +21,7 @@
along with systemd; If not, see .
***/
+#include
#include
#include
#include
@@ -38,7 +39,6 @@
#include
#include
-#include
#include "macro.h"
#include "time-util.h"
@@ -52,7 +52,7 @@ union dirent_storage {
#define WHITESPACE " \t\n\r"
#define NEWLINE "\n\r"
#define QUOTES "\"\'"
-#define COMMENTS "#;\n"
+#define COMMENTS "#;"
#define FORMAT_BYTES_MAX 8
@@ -527,19 +527,37 @@ static inline void freep(void *p) {
free(*(void**) p);
}
-void fclosep(FILE **f);
-void pclosep(FILE **f);
-void closep(int *fd);
-void closedirp(DIR **d);
-static inline void umaskp(mode_t *u) {
- umask(*u);
+static inline void fclosep(FILE **f) {
+ if (*f)
+ fclose(*f);
+}
+
+static inline void pclosep(FILE **f) {
+ if (*f)
+ pclose(*f);
+}
+
+static inline void closep(int *fd) {
+ if (*fd >= 0)
+ close_nointr_nofail(*fd);
}
-static inline void journal_closep(sd_journal **j) {
- sd_journal_close(*j);
+static inline void closedirp(DIR **d) {
+ if (*d)
+ closedir(*d);
}
-#define _cleanup_globfree_ __attribute__((cleanup(globfree)))
+static inline void umaskp(mode_t *u) {
+ umask(*u);
+}
+
+#define _cleanup_free_ _cleanup_(freep)
+#define _cleanup_fclose_ _cleanup_(fclosep)
+#define _cleanup_pclose_ _cleanup_(pclosep)
+#define _cleanup_close_ _cleanup_(closep)
+#define _cleanup_closedir_ _cleanup_(closedirp)
+#define _cleanup_umask_ _cleanup_(umaskp)
+#define _cleanup_globfree_ _cleanup_(globfree)
_malloc_ static inline void *malloc_multiply(size_t a, size_t b) {
if (_unlikely_(b == 0 || a > ((size_t) -1) / b))
@@ -608,7 +626,7 @@ int create_tmp_dir(char template[], char** dir_name);
static inline void *mempset(void *s, int c, size_t n) {
memset(s, c, n);
- return (char*)s + n;
+ return (uint8_t*)s + n;
}
char *hexmem(const void *p, size_t l);
@@ -619,7 +637,7 @@ char *strrep(const char *s, unsigned n);
void* greedy_realloc(void **p, size_t *allocated, size_t need);
#define GREEDY_REALLOC(array, allocated, need) \
- greedy_realloc((void**) &(array), &(allocated), (sizeof *array) * (need))
+ greedy_realloc((void**) &(array), &(allocated), sizeof((array)[0]) * (need))
static inline void _reset_errno_(int *saved_errno) {
errno = *saved_errno;
@@ -649,11 +667,42 @@ static inline bool logind_running(void) {
return access("/run/systemd/seats/", F_OK) >= 0;
}
-static inline unsigned decimal_str_max(unsigned x) {
- unsigned ans = 1;
- while (x /= 10)
- ans ++;
- return ans;
-}
+#define DECIMAL_STR_WIDTH(x) \
+ ({ \
+ typeof(x) _x_ = (x); \
+ unsigned ans = 1; \
+ while (_x_ /= 10) \
+ ans++; \
+ ans; \
+ })
int unlink_noerrno(const char *path);
+
+#define alloca0(n) \
+ ({ \
+ char *_new_; \
+ size_t _len_ = n; \
+ _new_ = alloca(_len_); \
+ (void *) memset(_new_, 0, _len_); \
+ })
+
+#define strappenda(a, b) \
+ ({ \
+ const char *_a_ = (a), *_b_ = (b); \
+ char *_c_; \
+ size_t _x_, _y_; \
+ _x_ = strlen(_a_); \
+ _y_ = strlen(_b_); \
+ _c_ = alloca(_x_ + _y_ + 1); \
+ strcpy(stpcpy(_c_, _a_), _b_); \
+ _c_; \
+ })
+
+#define procfs_file_alloca(pid, field) \
+ ({ \
+ pid_t _pid_ = (pid); \
+ char *_r_; \
+ _r_ = alloca(sizeof("/proc/") -1 + DECIMAL_STR_MAX(pid_t) + 1 + sizeof(field)); \
+ sprintf(_r_, "/proc/%lu/" field, (unsigned long) _pid_); \
+ _r_; \
+ })