diff --git a/evutil.c b/evutil.c index 7e392790..b6634591 100644 --- a/evutil.c +++ b/evutil.c @@ -88,7 +88,7 @@ #endif int -evutil_open_closeonexec(const char *pathname, int flags, mode_t mode) +evutil_open_closeonexec(const char *pathname, int flags, unsigned mode) { int fd; @@ -96,7 +96,10 @@ evutil_open_closeonexec(const char *pathname, int flags, mode_t mode) flags |= O_CLOEXEC; #endif - fd = open(pathname, flags, mode); + if (flags & O_CREAT) + fd = open(pathname, flags, (mode_t)mode); + else + fd = open(pathname, flags); if (fd < 0) return -1; diff --git a/util-internal.h b/util-internal.h index d09aa471..47fe962d 100644 --- a/util-internal.h +++ b/util-internal.h @@ -161,7 +161,10 @@ char EVUTIL_TOLOWER(char c); #define EVUTIL_UPCAST(ptr, type, field) \ ((type *)(((char*)(ptr)) - evutil_offsetof(type, field))) -int evutil_open_closeonexec(const char *pathname, int flags, mode_t mode); +/* As open(pathname, flags, mode), except that the file is always opened with + * the close-on-exec flag set. (And the mode argument is mandatory.) + */ +int evutil_open_closeonexec(const char *pathname, int flags, unsigned mode); int evutil_read_file(const char *filename, char **content_out, size_t *len_out, int is_binary);