X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Futil.h;h=117855de819933fc173e6e9d9e7073ea00bb8501;hb=2d5bdf5bc0e4714d42e5999a4e37553a6bf83575;hp=86456542679491cb0228fdf2f7898c099b3ae4f2;hpb=b68fa010f72599e6da5822feda5ae3a47a4e63d8;p=elogind.git diff --git a/src/shared/util.h b/src/shared/util.h index 864565426..117855de8 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -198,17 +198,22 @@ static inline int safe_atoi64(const char *s, int64_t *ret_i) { return safe_atolli(s, (long long int*) ret_i); } -char *split(const char *c, size_t *l, const char *separator, char **state); -char *split_quoted(const char *c, size_t *l, char **state); +char *split(const char *c, size_t *l, const char *separator, bool quoted, char **state); #define FOREACH_WORD(word, length, s, state) \ - for ((state) = NULL, (word) = split((s), &(length), WHITESPACE, &(state)); (word); (word) = split((s), &(length), WHITESPACE, &(state))) + _FOREACH_WORD(word, length, s, WHITESPACE, false, state) #define FOREACH_WORD_SEPARATOR(word, length, s, separator, state) \ - for ((state) = NULL, (word) = split((s), &(length), (separator), &(state)); (word); (word) = split((s), &(length), (separator), &(state))) + _FOREACH_WORD(word, length, s, separator, false, state) #define FOREACH_WORD_QUOTED(word, length, s, state) \ - for ((state) = NULL, (word) = split_quoted((s), &(length), &(state)); (word); (word) = split_quoted((s), &(length), &(state))) + _FOREACH_WORD(word, length, s, WHITESPACE, true, state) + +#define FOREACH_WORD_SEPARATOR_QUOTED(word, length, s, separator, state) \ + _FOREACH_WORD(word, length, s, separator, true, state) + +#define _FOREACH_WORD(word, length, s, separator, quoted, state) \ + for ((state) = NULL, (word) = split((s), &(length), (separator), (quoted), &(state)); (word); (word) = split((s), &(length), (separator), (quoted), &(state))) pid_t get_parent_of_pid(pid_t pid, pid_t *ppid); int get_starttime_of_pid(pid_t pid, unsigned long long *st); @@ -267,6 +272,7 @@ int make_stdio(int fd); int make_null_stdio(void); int make_console_stdio(void); +int dev_urandom(void *p, size_t n); void random_bytes(void *p, size_t n); static inline uint64_t random_u64(void) { @@ -290,7 +296,8 @@ static inline uint32_t random_u32(void) { } \ scope type name##_from_string(const char *s) { \ type i; \ - assert(s); \ + if (!s) \ + return (type) -1; \ for (i = 0; i < (type)ELEMENTSOF(name##_table); i++) \ if (name##_table[i] && \ streq(name##_table[i], s)) \ @@ -843,3 +850,8 @@ bool pid_valid(pid_t pid); int getpeercred(int fd, struct ucred *ucred); int getpeersec(int fd, char **ret); + +int writev_safe(int fd, const struct iovec *w, int j); + +int mkostemp_safe(char *pattern, int flags); +int open_tmpfile(const char *path, int flags);