chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
a1d41e1
)
macro: introduce _cleanup_free_ macro for automatic freeing of scoped vars and make...
author
Lennart Poettering
<lennart@poettering.net>
Thu, 13 Sep 2012 20:30:26 +0000
(22:30 +0200)
committer
Lennart Poettering
<lennart@poettering.net>
Thu, 13 Sep 2012 20:30:26 +0000
(22:30 +0200)
src/core/hostname-setup.c
patch
|
blob
|
history
src/core/load-fragment.c
patch
|
blob
|
history
src/shared/macro.h
patch
|
blob
|
history
src/shared/util.c
patch
|
blob
|
history
src/shared/util.h
patch
|
blob
|
history
diff --git
a/src/core/hostname-setup.c
b/src/core/hostname-setup.c
index 25ea09c733d3070e2e5479d43ad499be8a9f24ad..120024065a036551573b00f3d8ca438eedee2fe1 100644
(file)
--- a/
src/core/hostname-setup.c
+++ b/
src/core/hostname-setup.c
@@
-67,7
+67,7
@@
static int read_distro_hostname(char **hn) {
#if defined(TARGET_FEDORA) || defined(TARGET_ARCH) || defined(TARGET_GENTOO) || defined(TARGET_ALTLINUX) || defined(TARGET_MANDRIVA) || defined(TARGET_MAGEIA)
int r;
#if defined(TARGET_FEDORA) || defined(TARGET_ARCH) || defined(TARGET_GENTOO) || defined(TARGET_ALTLINUX) || defined(TARGET_MANDRIVA) || defined(TARGET_MAGEIA)
int r;
-
FILE *f
;
+
_cleanup_fclose_ FILE *f = NULL
;
assert(hn);
assert(hn);
@@
-114,7
+114,6
@@
static int read_distro_hostname(char **hn) {
r = -ENOENT;
finish:
r = -ENOENT;
finish:
- fclose(f);
return r;
#elif defined(TARGET_SUSE) || defined(TARGET_SLACKWARE)
return r;
#elif defined(TARGET_SUSE) || defined(TARGET_SLACKWARE)
diff --git
a/src/core/load-fragment.c
b/src/core/load-fragment.c
index 482d28b79587221dc2523532663350100f0b75be..1f3da70aca34337bdd20383b0bcbf77f7be2c1ce 100644
(file)
--- a/
src/core/load-fragment.c
+++ b/
src/core/load-fragment.c
@@
-1469,7
+1469,7
@@
int config_parse_unit_condition_path(
Unit *u = data;
bool trigger, negate;
Condition *c;
Unit *u = data;
bool trigger, negate;
Condition *c;
-
char *p
;
+
_cleanup_free_ char *p = NULL
;
assert(filename);
assert(lvalue);
assert(filename);
assert(lvalue);
@@
-1496,7
+1496,6
@@
int config_parse_unit_condition_path(
c = condition_new(cond, p, trigger, negate);
if (!c)
return -ENOMEM;
c = condition_new(cond, p, trigger, negate);
if (!c)
return -ENOMEM;
- free(p);
LIST_PREPEND(Condition, conditions, u->conditions, c);
return 0;
LIST_PREPEND(Condition, conditions, u->conditions, c);
return 0;
@@
-1516,7
+1515,7
@@
int config_parse_unit_condition_string(
Unit *u = data;
bool trigger, negate;
Condition *c;
Unit *u = data;
bool trigger, negate;
Condition *c;
-
char *s
;
+
_cleanup_free_ char *s = NULL
;
assert(filename);
assert(lvalue);
assert(filename);
assert(lvalue);
@@
-1538,7
+1537,6
@@
int config_parse_unit_condition_string(
c = condition_new(cond, s, trigger, negate);
if (!c)
return log_oom();
c = condition_new(cond, s, trigger, negate);
if (!c)
return log_oom();
- free(s);
LIST_PREPEND(Condition, conditions, u->conditions, c);
return 0;
LIST_PREPEND(Condition, conditions, u->conditions, c);
return 0;
diff --git
a/src/shared/macro.h
b/src/shared/macro.h
index 4595750394d8a2a5d43c68d27d46eb0d1ec55a64..df17617b1ebc9c2ccd16533574cf284feca1632a 100644
(file)
--- a/
src/shared/macro.h
+++ b/
src/shared/macro.h
@@
-187,4
+187,7
@@
static inline size_t IOVEC_INCREMENT(struct iovec *i, unsigned n, size_t k) {
return k;
}
return k;
}
+#define _cleanup_free_ __attribute__((cleanup(freep)))
+#define _cleanup_fclose_ __attribute__((cleanup(fclosep)))
+
#include "log.h"
#include "log.h"
diff --git
a/src/shared/util.c
b/src/shared/util.c
index eaf2721381fc3c3d2b44ce84a179ad7f67ab7d99..887cc6749e7610a2a75b5e890451bfd037fc3bea 100644
(file)
--- a/
src/shared/util.c
+++ b/
src/shared/util.c
@@
-489,7
+489,7
@@
char *split_quoted(const char *c, size_t *l, char **state) {
int get_parent_of_pid(pid_t pid, pid_t *_ppid) {
int r;
int get_parent_of_pid(pid_t pid, pid_t *_ppid) {
int r;
-
FILE *f
;
+
_cleanup_fclose_ FILE *f = NULL
;
char fn[PATH_MAX], line[LINE_MAX], *p;
long unsigned ppid;
char fn[PATH_MAX], line[LINE_MAX], *p;
long unsigned ppid;
@@
-499,22
+499,22
@@
int get_parent_of_pid(pid_t pid, pid_t *_ppid) {
assert_se(snprintf(fn, sizeof(fn)-1, "/proc/%lu/stat", (unsigned long) pid) < (int) (sizeof(fn)-1));
char_array_0(fn);
assert_se(snprintf(fn, sizeof(fn)-1, "/proc/%lu/stat", (unsigned long) pid) < (int) (sizeof(fn)-1));
char_array_0(fn);
- if (!(f = fopen(fn, "re")))
+ f = fopen(fn, "re");
+ if (!f)
return -errno;
return -errno;
- if (!
(fgets(line, sizeof(line), f)
)) {
+ if (!
fgets(line, sizeof(line), f
)) {
r = feof(f) ? -EIO : -errno;
fclose(f);
return r;
}
r = feof(f) ? -EIO : -errno;
fclose(f);
return r;
}
- fclose(f);
-
/* Let's skip the pid and comm fields. The latter is enclosed
* in () but does not escape any () in its value, so let's
* skip over it manually */
/* Let's skip the pid and comm fields. The latter is enclosed
* in () but does not escape any () in its value, so let's
* skip over it manually */
- if (!(p = strrchr(line, ')')))
+ p = strrchr(line, ')');
+ if (!p)
return -EIO;
p++;
return -EIO;
p++;
@@
-685,8
+685,7
@@
finish:
}
int read_one_line_file(const char *fn, char **line) {
}
int read_one_line_file(const char *fn, char **line) {
- FILE *f;
- int r;
+ _cleanup_fclose_ FILE *f = NULL;
char t[LINE_MAX], *c;
assert(fn);
char t[LINE_MAX], *c;
assert(fn);
@@
-698,50
+697,37
@@
int read_one_line_file(const char *fn, char **line) {
if (!fgets(t, sizeof(t), f)) {
if (!fgets(t, sizeof(t), f)) {
- if (ferror(f)) {
- r = -errno;
- goto finish;
- }
+ if (ferror(f))
+ return -errno;
t[0] = 0;
}
c = strdup(t);
t[0] = 0;
}
c = strdup(t);
- if (!c) {
- r = -ENOMEM;
- goto finish;
- }
-
+ if (!c)
+ return -ENOMEM;
truncate_nl(c);
*line = c;
truncate_nl(c);
*line = c;
- r = 0;
-
-finish:
- fclose(f);
- return r;
+ return 0;
}
int read_full_file(const char *fn, char **contents, size_t *size) {
}
int read_full_file(const char *fn, char **contents, size_t *size) {
- FILE *f;
- int r;
+ _cleanup_fclose_ FILE *f = NULL;
size_t n, l;
size_t n, l;
- char *buf = NULL;
+
_cleanup_free_
char *buf = NULL;
struct stat st;
struct stat st;
- if (!(f = fopen(fn, "re")))
+ f = fopen(fn, "re");
+ if (!f)
return -errno;
return -errno;
- if (fstat(fileno(f), &st) < 0) {
- r = -errno;
- goto finish;
- }
+ if (fstat(fileno(f), &st) < 0)
+ return -errno;
/* Safety check */
/* Safety check */
- if (st.st_size > 4*1024*1024) {
- r = -E2BIG;
- goto finish;
- }
+ if (st.st_size > 4*1024*1024)
+ return -E2BIG;
n = st.st_size > 0 ? st.st_size : LINE_MAX;
l = 0;
n = st.st_size > 0 ? st.st_size : LINE_MAX;
l = 0;
@@
-750,19
+736,16
@@
int read_full_file(const char *fn, char **contents, size_t *size) {
char *t;
size_t k;
char *t;
size_t k;
- if (!(t = realloc(buf, n+1))) {
- r = -ENOMEM;
- goto finish;
- }
+ t = realloc(buf, n+1);
+ if (!t)
+ return -ENOMEM;
buf = t;
k = fread(buf + l, 1, n - l, f);
if (k <= 0) {
buf = t;
k = fread(buf + l, 1, n - l, f);
if (k <= 0) {
- if (ferror(f)) {
- r = -errno;
- goto finish;
- }
+ if (ferror(f))
+ return -errno;
break;
}
break;
}
@@
-771,10
+754,8
@@
int read_full_file(const char *fn, char **contents, size_t *size) {
n *= 2;
/* Safety check */
n *= 2;
/* Safety check */
- if (n > 4*1024*1024) {
- r = -E2BIG;
- goto finish;
- }
+ if (n > 4*1024*1024)
+ return -E2BIG;
}
buf[l] = 0;
}
buf[l] = 0;
@@
-784,13
+765,7
@@
int read_full_file(const char *fn, char **contents, size_t *size) {
if (size)
*size = l;
if (size)
*size = l;
- r = 0;
-
-finish:
- fclose(f);
- free(buf);
-
- return r;
+ return 0;
}
int parse_env_file(
}
int parse_env_file(
@@
-5903,3
+5878,12
@@
int get_shell(char **_sh) {
*_sh = sh;
return 0;
}
*_sh = sh;
return 0;
}
+
+void freep(void *p) {
+ free(*(void**) p);
+}
+
+void fclosep(FILE **f) {
+ if (*f)
+ fclose(*f);
+}
diff --git
a/src/shared/util.h
b/src/shared/util.h
index 19edf98355d3f3c0913e1a41797bb0a19e59c8b7..770a0082239cd8c949eb4472f87a0239971b4195 100644
(file)
--- a/
src/shared/util.h
+++ b/
src/shared/util.h
@@
-528,3
+528,6
@@
void warn_melody(void);
int get_shell(char **ret);
int get_home_dir(char **ret);
int get_shell(char **ret);
int get_home_dir(char **ret);
+
+void freep(void *p);
+void fclosep(FILE **f);