Add fdopen_unlocked() wrapper

This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2019-04-04 11:27:08 +02:00
parent 41f6e627d7
commit 02e23d1a1a
5 changed files with 37 additions and 17 deletions

View File

@ -49,3 +49,15 @@ expression f, g, path, p;
if (r < 0)
return ...;
- (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
@@
expression f, fd, options;
@@
- f = fdopen(fd, options);
+ r = fdopen_unlocked(fd, options, &f);
+ if (r < 0) {
- if (!f) {
...
- return -errno;
+ return r;
}
- (void) __fsetlocking(f, FSETLOCKING_BYCALLER);

View File

@ -42,6 +42,19 @@ int fopen_unlocked(const char *path, const char *options, FILE **ret) {
return 0;
}
int fdopen_unlocked(int fd, const char *options, FILE **ret) {
assert(ret);
FILE *f = fdopen(fd, options);
if (!f)
return -errno;
(void) __fsetlocking(f, FSETLOCKING_BYCALLER);
*ret = f;
return 0;
}
int write_string_stream_ts(
FILE *f,
const char *line,
@ -167,14 +180,11 @@ int write_string_file_ts(
goto fail;
}
f = fdopen(fd, "w");
if (!f) {
r = -errno;
r = fdopen_unlocked(fd, "w", &f);
if (r < 0) {
safe_close(fd);
goto fail;
}
(void) __fsetlocking(f, FSETLOCKING_BYCALLER);
}
if (flags & WRITE_STRING_FILE_DISABLE_BUFFER)

View File

@ -34,6 +34,7 @@ typedef enum {
} ReadFullFileFlags;
int fopen_unlocked(const char *path, const char *options, FILE **ret);
int fdopen_unlocked(int fd, const char *options, FILE **ret);
int write_string_stream_ts(FILE *f, const char *line, WriteStringFileFlags flags, struct timespec *ts);
static inline int write_string_stream(FILE *f, const char *line, WriteStringFileFlags flags) {

View File

@ -6,6 +6,7 @@
#include "alloc-util.h"
#include "fd-util.h"
#include "fileio.h"
#include "fs-util.h"
#include "hexdecoct.h"
#include "macro.h"
@ -42,16 +43,14 @@ int fopen_temporary(const char *path, FILE **_f, char **_temp_path) {
/* This assumes that returned FILE object is short-lived and used within the same single-threaded
* context and never shared externally, hence locking is not necessary. */
f = fdopen(fd, "w");
if (!f) {
unlink_noerrno(t);
r = fdopen_unlocked(fd, "w", &f);
if (r < 0) {
unlink(t);
free(t);
safe_close(fd);
return -errno;
return r;
}
(void) __fsetlocking(f, FSETLOCKING_BYCALLER);
*_f = f;
*_temp_path = t;

View File

@ -1091,12 +1091,10 @@ static int test_chroot_dropin(
return log_debug_errno(errno, "Failed to open %s/%s: %m", where, p);
}
f = fdopen(fd, "r");
if (!f)
return log_debug_errno(errno, "Failed to convert file handle: %m");
fd = -1;
(void) __fsetlocking(f, FSETLOCKING_BYCALLER);
r = fdopen_unlocked(fd, "r", &f);
if (r < 0)
return log_debug_errno(r, "Failed to convert file handle: %m");
TAKE_FD(fd);
r = read_line(f, LONG_LINE_MAX, &line);
if (r < 0)