summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/basic/fileio.c18
-rw-r--r--src/basic/fileio.h1
-rw-r--r--src/shared/serialize.c2
-rw-r--r--src/test/test-clock.c9
-rw-r--r--src/test/test-conf-parser.c11
-rw-r--r--src/test/test-env-util.c11
-rw-r--r--src/test/test-fileio.c64
-rw-r--r--src/test/test-terminal-util.c8
8 files changed, 53 insertions, 71 deletions
diff --git a/src/basic/fileio.c b/src/basic/fileio.c
index d2fd4c47b3..f14afa5dce 100644
--- a/src/basic/fileio.c
+++ b/src/basic/fileio.c
@@ -1221,6 +1221,24 @@ int mkostemp_safe(char *pattern) {
return fd;
}
+int fmkostemp_safe(char *pattern, const char *mode, FILE **ret_f) {
+ int fd;
+ FILE *f;
+
+ fd = mkostemp_safe(pattern);
+ if (fd < 0)
+ return fd;
+
+ f = fdopen(fd, mode);
+ if (!f) {
+ safe_close(fd);
+ return -errno;
+ }
+
+ *ret_f = f;
+ return 0;
+}
+
int tempfn_xxxxxx(const char *p, const char *extra, char **ret) {
const char *fn;
char *t;
diff --git a/src/basic/fileio.h b/src/basic/fileio.h
index e84710f138..102d33d75f 100644
--- a/src/basic/fileio.h
+++ b/src/basic/fileio.h
@@ -64,6 +64,7 @@ int fflush_sync_and_check(FILE *f);
int fopen_temporary(const char *path, FILE **_f, char **_temp_path);
int mkostemp_safe(char *pattern);
+int fmkostemp_safe(char *pattern, const char *mode, FILE**_f);
int tempfn_xxxxxx(const char *p, const char *extra, char **ret);
int tempfn_random(const char *p, const char *extra, char **ret);
diff --git a/src/shared/serialize.c b/src/shared/serialize.c
index c76a0d0d9e..3a6f8f60eb 100644
--- a/src/shared/serialize.c
+++ b/src/shared/serialize.c
@@ -113,7 +113,7 @@ int serialize_strv(FILE *f, const char *key, char **l) {
int ret = 0, r;
char **i;
- /* Returns the first error */
+ /* Returns the first error, or positive if anything was serialized, 0 otherwise. */
STRV_FOREACH(i, l) {
r = serialize_item_escaped(f, key, *i);
diff --git a/src/test/test-clock.c b/src/test/test-clock.c
index 50e9b7756f..95ac8de91b 100644
--- a/src/test/test-clock.c
+++ b/src/test/test-clock.c
@@ -9,12 +9,12 @@
#include "clock-util.h"
#include "fd-util.h"
#include "fileio.h"
+#include "fs-util.h"
#include "log.h"
#include "macro.h"
static void test_clock_is_localtime(void) {
char adjtime[] = "/tmp/test-adjtime.XXXXXX";
- int fd = -1;
_cleanup_fclose_ FILE* f = NULL;
static const struct scenario {
@@ -41,17 +41,14 @@ static void test_clock_is_localtime(void) {
/* without an adjtime file we default to UTC */
assert_se(clock_is_localtime("/nonexisting/adjtime") == 0);
- fd = mkostemp_safe(adjtime);
- assert_se(fd >= 0);
+ assert_se(fmkostemp_safe(adjtime, "w", &f) == 0);
log_info("adjtime test file: %s", adjtime);
- f = fdopen(fd, "w");
- assert_se(f);
for (size_t i = 0; i < ELEMENTSOF(scenarios); ++i) {
log_info("scenario #%zu:, expected result %i", i, scenarios[i].expected_result);
log_info("%s", scenarios[i].contents);
rewind(f);
- ftruncate(fd, 0);
+ ftruncate(fileno(f), 0);
assert_se(write_string_stream(f, scenarios[i].contents, WRITE_STRING_FILE_AVOID_NEWLINE) == 0);
assert_se(clock_is_localtime(adjtime) == scenarios[i].expected_result);
}
diff --git a/src/test/test-conf-parser.c b/src/test/test-conf-parser.c
index ff951d12f4..91f1d9a386 100644
--- a/src/test/test-conf-parser.c
+++ b/src/test/test-conf-parser.c
@@ -311,9 +311,9 @@ static const char* const config_file[] = {
static void test_config_parse(unsigned i, const char *s) {
_cleanup_(unlink_tempfilep) char name[] = "/tmp/test-conf-parser.XXXXXX";
- int fd, r;
_cleanup_fclose_ FILE *f = NULL;
_cleanup_free_ char *setting1 = NULL;
+ int r;
const ConfigTableItem items[] = {
{ "Section", "setting1", config_parse_string, 0, &setting1},
@@ -322,12 +322,9 @@ static void test_config_parse(unsigned i, const char *s) {
log_info("== %s[%i] ==", __func__, i);
- fd = mkostemp_safe(name);
- assert_se(fd >= 0);
- assert_se((size_t) write(fd, s, strlen(s)) == strlen(s));
-
- assert_se(lseek(fd, 0, SEEK_SET) == 0);
- assert_se(f = fdopen(fd, "r"));
+ assert_se(fmkostemp_safe(name, "r+", &f) == 0);
+ assert_se(fwrite(s, strlen(s), 1, f) == 1);
+ rewind(f);
/*
int config_parse(const char *unit,
diff --git a/src/test/test-env-util.c b/src/test/test-env-util.c
index c988fc6eee..0ab671b476 100644
--- a/src/test/test-env-util.c
+++ b/src/test/test-env-util.c
@@ -323,8 +323,7 @@ static void test_serialize_environment(void) {
_cleanup_strv_free_ char **env = NULL, **env2 = NULL;
char fn[] = "/tmp/test-env-util.XXXXXXX";
_cleanup_fclose_ FILE *f = NULL;
- int fd, r;
-
+ int r;
assert_se(env = strv_new("A=1",
"B=2",
@@ -333,12 +332,8 @@ static void test_serialize_environment(void) {
"FOO%%=a\177b\nc\td e",
NULL));
- fd = mkostemp_safe(fn);
- assert_se(fd >= 0);
-
- assert_se(f = fdopen(fd, "r+"));
-
- assert_se(serialize_strv(f, "env", env) > 0);
+ assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
+ assert_se(serialize_strv(f, "env", env) == 1);
assert_se(fflush_and_check(f) == 0);
rewind(f);
diff --git a/src/test/test-fileio.c b/src/test/test-fileio.c
index aa38a7d29a..cabaef6ab8 100644
--- a/src/test/test-fileio.c
+++ b/src/test/test-fileio.c
@@ -23,24 +23,15 @@ static void test_parse_env_file(void) {
_cleanup_(unlink_tempfilep) char
t[] = "/tmp/test-fileio-in-XXXXXX",
p[] = "/tmp/test-fileio-out-XXXXXX";
- int fd, r;
FILE *f;
_cleanup_free_ char *one = NULL, *two = NULL, *three = NULL, *four = NULL, *five = NULL,
*six = NULL, *seven = NULL, *eight = NULL, *nine = NULL, *ten = NULL;
_cleanup_strv_free_ char **a = NULL, **b = NULL;
char **i;
unsigned k;
+ int r;
- fd = mkostemp_safe(p);
- assert_se(fd >= 0);
- close(fd);
-
- fd = mkostemp_safe(t);
- assert_se(fd >= 0);
-
- f = fdopen(fd, "w");
- assert_se(f);
-
+ assert_se(fmkostemp_safe(t, "w", &f) == 0);
fputs("one=BAR \n"
"# comment\n"
" # comment \n"
@@ -128,6 +119,12 @@ static void test_parse_env_file(void) {
assert_se(streq(nine, "nineval"));
assert_se(ten == NULL);
+ {
+ /* prepare a temporary file to write the environment to */
+ _cleanup_close_ int fd = mkostemp_safe(p);
+ assert_se(fd >= 0);
+ }
+
r = write_env_file(p, a);
assert_se(r >= 0);
@@ -139,21 +136,12 @@ static void test_parse_multiline_env_file(void) {
_cleanup_(unlink_tempfilep) char
t[] = "/tmp/test-fileio-in-XXXXXX",
p[] = "/tmp/test-fileio-out-XXXXXX";
- int fd, r;
FILE *f;
_cleanup_strv_free_ char **a = NULL, **b = NULL;
char **i;
+ int r;
- fd = mkostemp_safe(p);
- assert_se(fd >= 0);
- close(fd);
-
- fd = mkostemp_safe(t);
- assert_se(fd >= 0);
-
- f = fdopen(fd, "w");
- assert_se(f);
-
+ assert_se(fmkostemp_safe(t, "w", &f) == 0);
fputs("one=BAR\\\n"
" VAR\\\n"
"\tGAR\n"
@@ -180,6 +168,11 @@ static void test_parse_multiline_env_file(void) {
assert_se(streq_ptr(a[2], "tri=bar var \tgar "));
assert_se(a[3] == NULL);
+ {
+ _cleanup_close_ int fd = mkostemp_safe(p);
+ assert_se(fd >= 0);
+ }
+
r = write_env_file(p, a);
assert_se(r >= 0);
@@ -189,19 +182,14 @@ static void test_parse_multiline_env_file(void) {
static void test_merge_env_file(void) {
_cleanup_(unlink_tempfilep) char t[] = "/tmp/test-fileio-XXXXXX";
- int fd, r;
_cleanup_fclose_ FILE *f = NULL;
_cleanup_strv_free_ char **a = NULL;
char **i;
+ int r;
- fd = mkostemp_safe(t);
- assert_se(fd >= 0);
-
+ assert_se(fmkostemp_safe(t, "w", &f) == 0);
log_info("/* %s (%s) */", __func__, t);
- f = fdopen(fd, "w");
- assert_se(f);
-
r = write_string_stream(f,
"one=1 \n"
"twelve=${one}2\n"
@@ -258,19 +246,14 @@ static void test_merge_env_file(void) {
static void test_merge_env_file_invalid(void) {
_cleanup_(unlink_tempfilep) char t[] = "/tmp/test-fileio-XXXXXX";
- int fd, r;
_cleanup_fclose_ FILE *f = NULL;
_cleanup_strv_free_ char **a = NULL;
char **i;
+ int r;
- fd = mkostemp_safe(t);
- assert_se(fd >= 0);
-
+ assert_se(fmkostemp_safe(t, "w", &f) == 0);
log_info("/* %s (%s) */", __func__, t);
- f = fdopen(fd, "w");
- assert_se(f);
-
r = write_string_stream(f,
"unset one \n"
"unset one= \n"
@@ -297,16 +280,11 @@ static void test_merge_env_file_invalid(void) {
static void test_executable_is_script(void) {
_cleanup_(unlink_tempfilep) char t[] = "/tmp/test-fileio-XXXXXX";
- int fd, r;
_cleanup_fclose_ FILE *f = NULL;
char *command;
+ int r;
- fd = mkostemp_safe(t);
- assert_se(fd >= 0);
-
- f = fdopen(fd, "w");
- assert_se(f);
-
+ assert_se(fmkostemp_safe(t, "w", &f) == 0);
fputs("#! /bin/script -a -b \ngoo goo", f);
fflush(f);
diff --git a/src/test/test-terminal-util.c b/src/test/test-terminal-util.c
index 9f27c74139..fbe8133b10 100644
--- a/src/test/test-terminal-util.c
+++ b/src/test/test-terminal-util.c
@@ -32,15 +32,11 @@ static void test_read_one_char(void) {
char r;
bool need_nl;
char name[] = "/tmp/test-read_one_char.XXXXXX";
- int fd;
- fd = mkostemp_safe(name);
- assert_se(fd >= 0);
- file = fdopen(fd, "r+");
- assert_se(file);
+ assert(fmkostemp_safe(name, "r+", &file) == 0);
+
assert_se(fputs("c\n", file) >= 0);
rewind(file);
-
assert_se(read_one_char(file, &r, 1000000, &need_nl) >= 0);
assert_se(!need_nl);
assert_se(r == 'c');