summaryrefslogtreecommitdiff
path: root/src/basic/fs-util.h
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2019-10-24 10:33:20 +0200
committerYu Watanabe <watanabe.yu+github@gmail.com>2019-10-24 22:44:24 +0900
commita5648b809457d120500b2acb18b31e2168a4817a (patch)
tree59846b7791dce151e858a889f1281bad28c55ffe /src/basic/fs-util.h
parent58ce85f6a17b6db03265e6a974120b18d1c0855a (diff)
downloadsystemd-a5648b809457d120500b2acb18b31e2168a4817a.tar.gz
basic/fs-util: change CHASE_OPEN flag into a separate output parameter
chase_symlinks() would return negative on error, and either a non-negative status or a non-negative fd when CHASE_OPEN was given. This made the interface quite complicated, because dependning on the flags used, we would get two different "types" of return object. Coverity was always confused by this, and flagged every use of chase_symlinks() without CHASE_OPEN as a resource leak (because it would this that an fd is returned). This patch uses a saparate output parameter, so there is no confusion. (I think it is OK to have functions which return either an error or an fd. It's only returning *either* an fd or a non-fd that is confusing.)
Diffstat (limited to 'src/basic/fs-util.h')
-rw-r--r--src/basic/fs-util.h16
1 files changed, 7 insertions, 9 deletions
diff --git a/src/basic/fs-util.h b/src/basic/fs-util.h
index fa0f0de9a3..78d68be9fd 100644
--- a/src/basic/fs-util.h
+++ b/src/basic/fs-util.h
@@ -79,23 +79,21 @@ enum {
CHASE_NONEXISTENT = 1 << 1, /* It's OK if the path doesn't actually exist. */
CHASE_NO_AUTOFS = 1 << 2, /* Return -EREMOTE if autofs mount point found */
CHASE_SAFE = 1 << 3, /* Return EPERM if we ever traverse from unprivileged to privileged files or directories */
- CHASE_OPEN = 1 << 4, /* Return an O_PATH object to the final component */
- CHASE_TRAIL_SLASH = 1 << 5, /* Any trailing slash will be preserved */
- CHASE_STEP = 1 << 6, /* Just execute a single step of the normalization */
- CHASE_NOFOLLOW = 1 << 7, /* Do not follow the path's right-most compontent. With CHASE_OPEN, when
- * the path's right-most component refers to symlink, return O_PATH fd of
- * the symlink. */
- CHASE_WARN = 1 << 8, /* Emit an appropriate warning when an error is encountered */
+ CHASE_TRAIL_SLASH = 1 << 4, /* Any trailing slash will be preserved */
+ CHASE_STEP = 1 << 5, /* Just execute a single step of the normalization */
+ CHASE_NOFOLLOW = 1 << 6, /* Do not follow the path's right-most compontent. With ret_fd, when the path's
+ * right-most component refers to symlink, return O_PATH fd of the symlink. */
+ CHASE_WARN = 1 << 7, /* Emit an appropriate warning when an error is encountered */
};
/* How many iterations to execute before returning -ELOOP */
#define CHASE_SYMLINKS_MAX 32
-int chase_symlinks(const char *path_with_prefix, const char *root, unsigned flags, char **ret);
+int chase_symlinks(const char *path_with_prefix, const char *root, unsigned flags, char **ret_path, int *ret_fd);
int chase_symlinks_and_open(const char *path, const char *root, unsigned chase_flags, int open_flags, char **ret_path);
int chase_symlinks_and_opendir(const char *path, const char *root, unsigned chase_flags, char **ret_path, DIR **ret_dir);
-int chase_symlinks_and_stat(const char *path, const char *root, unsigned chase_flags, char **ret_path, struct stat *ret_stat);
+int chase_symlinks_and_stat(const char *path, const char *root, unsigned chase_flags, char **ret_path, struct stat *ret_stat, int *ret_fd);
/* Useful for usage with _cleanup_(), removes a directory and frees the pointer */
static inline void rmdir_and_free(char *p) {