return write_string_stream(f, line);
}
+int write_string_file_no_create(const char *fn, const char *line) {
+ _cleanup_fclose_ FILE *f = NULL;
+ int fd;
+
+ assert(fn);
+ assert(line);
+
+ /* We manually build our own version of fopen(..., "we") that
+ * without O_CREAT */
+ fd = open(fn, O_WRONLY|O_CLOEXEC|O_NOCTTY);
+ if (fd < 0)
+ return -errno;
+
+ f = fdopen(fd, "we");
+ if (!f) {
+ safe_close(fd);
+ return -errno;
+ }
+
+ return write_string_stream(f, line);
+}
+
int write_string_file_atomic(const char *fn, const char *line) {
_cleanup_fclose_ FILE *f = NULL;
_cleanup_free_ char *p = NULL;
const char *fname,
const char *newline,
int (*push) (const char *filename, unsigned line,
- const char *key, char *value, void *userdata),
- void *userdata) {
+ const char *key, char *value, void *userdata, int *n_pushed),
+ void *userdata,
+ int *n_pushed) {
_cleanup_free_ char *contents = NULL, *key = NULL;
size_t key_alloc = 0, n_key = 0, value_alloc = 0, n_value = 0, last_value_whitespace = (size_t) -1, last_key_whitespace = (size_t) -1;
if (last_key_whitespace != (size_t) -1)
key[last_key_whitespace] = 0;
- r = push(fname, line, key, value, userdata);
+ r = push(fname, line, key, value, userdata, n_pushed);
if (r < 0)
goto fail;
if (last_key_whitespace != (size_t) -1)
key[last_key_whitespace] = 0;
- r = push(fname, line, key, value, userdata);
+ r = push(fname, line, key, value, userdata, n_pushed);
if (r < 0)
goto fail;
if (last_key_whitespace != (size_t) -1)
key[last_key_whitespace] = 0;
- r = push(fname, line, key, value, userdata);
+ r = push(fname, line, key, value, userdata, n_pushed);
if (r < 0)
goto fail;
}
static int parse_env_file_push(
const char *filename, unsigned line,
const char *key, char *value,
- void *userdata) {
+ void *userdata,
+ int *n_pushed) {
const char *k;
va_list aq, *ap = userdata;
va_end(aq);
free(*v);
*v = value;
+
+ if (n_pushed)
+ (*n_pushed)++;
+
return 1;
}
}
const char *newline, ...) {
va_list ap;
- int r;
+ int r, n_pushed = 0;
if (!newline)
newline = NEWLINE;
va_start(ap, newline);
- r = parse_env_file_internal(NULL, fname, newline, parse_env_file_push, &ap);
+ r = parse_env_file_internal(NULL, fname, newline, parse_env_file_push, &ap, &n_pushed);
va_end(ap);
- return r;
+ return r < 0 ? r : n_pushed;
}
static int load_env_file_push(
const char *filename, unsigned line,
const char *key, char *value,
- void *userdata) {
+ void *userdata,
+ int *n_pushed) {
char ***m = userdata;
char *p;
int r;
if (r < 0)
return r;
+ if (n_pushed)
+ (*n_pushed)++;
+
free(value);
return 0;
}
if (!newline)
newline = NEWLINE;
- r = parse_env_file_internal(f, fname, newline, load_env_file_push, &m);
+ r = parse_env_file_internal(f, fname, newline, load_env_file_push, &m, NULL);
if (r < 0) {
strv_free(m);
return r;
static int load_env_file_push_pairs(
const char *filename, unsigned line,
const char *key, char *value,
- void *userdata) {
+ void *userdata,
+ int *n_pushed) {
char ***m = userdata;
int r;
return r;
}
+ if (n_pushed)
+ (*n_pushed)++;
+
return 0;
}
if (!newline)
newline = NEWLINE;
- r = parse_env_file_internal(f, fname, newline, load_env_file_push_pairs, &m);
+ r = parse_env_file_internal(f, fname, newline, load_env_file_push_pairs, &m, NULL);
if (r < 0) {
strv_free(m);
return r;