From 8e7be40d1386e6053d4663114a00e0390400350f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 3 Oct 2013 22:13:55 -0400 Subject: [PATCH] Introduce _cleanup_endmntent_ (cherry picked from commit 5862d652ba14178cff46b8a8fc6c6d8392bf32b1) Related: #1098310 --- src/cryptsetup/cryptsetup.c | 19 ++++++------------- src/fstab-generator/fstab-generator.c | 17 +++++------------ src/remount-fs/remount-fs.c | 13 ++++--------- src/shared/util.h | 7 +++++++ 4 files changed, 22 insertions(+), 34 deletions(-) diff --git a/src/cryptsetup/cryptsetup.c b/src/cryptsetup/cryptsetup.c index 769c3e4..4f2f52a 100644 --- a/src/cryptsetup/cryptsetup.c +++ b/src/cryptsetup/cryptsetup.c @@ -236,31 +236,24 @@ finish: } static char *disk_mount_point(const char *label) { - char *mp = NULL; _cleanup_free_ char *device = NULL; - FILE *f = NULL; + _cleanup_endmntent_ FILE *f = NULL; struct mntent *m; /* Yeah, we don't support native systemd unit files here for now */ if (asprintf(&device, "/dev/mapper/%s", label) < 0) - goto finish; + return NULL; f = setmntent("/etc/fstab", "r"); if (!f) - goto finish; + return NULL; while ((m = getmntent(f))) - if (path_equal(m->mnt_fsname, device)) { - mp = strdup(m->mnt_dir); - break; - } - -finish: - if (f) - endmntent(f); + if (path_equal(m->mnt_fsname, device)) + return strdup(m->mnt_dir); - return mp; + return NULL; } static int get_password(const char *name, usec_t until, bool accept_cached, char ***passwords) { diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c index c0c2992..78d7609 100644 --- a/src/fstab-generator/fstab-generator.c +++ b/src/fstab-generator/fstab-generator.c @@ -327,15 +327,12 @@ static int add_mount( } static int parse_fstab(const char *prefix, bool initrd) { - _cleanup_free_ char *fstab_path = NULL; - FILE *f; + char *fstab_path; + _cleanup_endmntent_ FILE *f; int r = 0; struct mntent *me; - fstab_path = strjoin(strempty(prefix), "/etc/fstab", NULL); - if (!fstab_path) - return log_oom(); - + fstab_path = strappenda(strempty(prefix), "/etc/fstab"); f = setmntent(fstab_path, "r"); if (!f) { if (errno == ENOENT) @@ -354,10 +351,8 @@ static int parse_fstab(const char *prefix, bool initrd) { what = fstab_node_to_udev_node(me->mnt_fsname); where = strjoin(strempty(prefix), me->mnt_dir, NULL); - if (!what || !where) { - r = log_oom(); - goto finish; - } + if (!what || !where) + return log_oom(); if (is_path(where)) path_kill_slashes(where); @@ -395,8 +390,6 @@ static int parse_fstab(const char *prefix, bool initrd) { r = k; } -finish: - endmntent(f); return r; } diff --git a/src/remount-fs/remount-fs.c b/src/remount-fs/remount-fs.c index f432718..847637a 100644 --- a/src/remount-fs/remount-fs.c +++ b/src/remount-fs/remount-fs.c @@ -40,7 +40,7 @@ int main(int argc, char *argv[]) { int ret = EXIT_FAILURE; - FILE *f = NULL; + _cleanup_endmntent_ FILE *f = NULL; struct mntent* me; Hashmap *pids = NULL; @@ -57,13 +57,11 @@ int main(int argc, char *argv[]) { f = setmntent("/etc/fstab", "r"); if (!f) { - if (errno == ENOENT) { - ret = EXIT_SUCCESS; - goto finish; - } + if (errno == ENOENT) + return EXIT_SUCCESS; log_error("Failed to open /etc/fstab: %m"); - goto finish; + return EXIT_FAILURE; } pids = hashmap_new(trivial_hash_func, trivial_compare_func); @@ -162,8 +160,5 @@ finish: if (pids) hashmap_free_free(pids); - if (f) - endmntent(f); - return ret; } diff --git a/src/shared/util.h b/src/shared/util.h index 3a4bc98..5a1e1bc 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -39,6 +39,7 @@ #include #include #include +#include #include "macro.h" #include "time-util.h" @@ -579,6 +580,11 @@ static inline void umaskp(mode_t *u) { umask(*u); } +static inline void endmntentp(FILE **f) { + if (*f) + endmntent(*f); +} + #define _cleanup_free_ _cleanup_(freep) #define _cleanup_fclose_ _cleanup_(fclosep) #define _cleanup_pclose_ _cleanup_(pclosep) @@ -586,6 +592,7 @@ static inline void umaskp(mode_t *u) { #define _cleanup_closedir_ _cleanup_(closedirp) #define _cleanup_umask_ _cleanup_(umaskp) #define _cleanup_globfree_ _cleanup_(globfree) +#define _cleanup_endmntent_ _cleanup_(endmntentp) _malloc_ _alloc_(1, 2) static inline void *malloc_multiply(size_t a, size_t b) { if (_unlikely_(b == 0 || a > ((size_t) -1) / b))