mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
util_path: Add functions to test path is read/write-only
For root the functions util_path_is_readable() and util_path_is_writable() do not take the path's permissions into account. The function access() succeeds as root is allowed to read/write any file regardless of its permissions. Introduce the functions util_path_is_readonly_file() and util_path_is_writeonly_file() to test whether a path is a regular file and is either read-only (neither user, group, nor other have write permission, but one or more of user, group, and other have read permission) or write-only (neither user, group, nor other have read permission, but one or more of user, group, and other have write permission). Signed-off-by: Jens Remus <jremus@linux.ibm.com> Reviewed-by: Jan Hoeppner <hoeppner@linux.ibm.com> Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
* @{
|
||||
* @brief Work with paths
|
||||
*
|
||||
* Copyright IBM Corp. 2016, 2017
|
||||
* Copyright IBM Corp. 2016, 2019
|
||||
*
|
||||
* s390-tools is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See LICENSE for details.
|
||||
@@ -21,5 +21,7 @@ bool util_path_is_writable(const char *fmt, ...);
|
||||
bool util_path_is_dir(const char *fmt, ...);
|
||||
bool util_path_is_reg_file(const char *fmt, ...);
|
||||
bool util_path_exists(const char *fmt, ...);
|
||||
bool util_path_is_readonly_file(const char *fmt, ...);
|
||||
bool util_path_is_writeonly_file(const char *fmt, ...);
|
||||
|
||||
#endif /** LIB_UTIL_PATH_H @} */
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Work with paths
|
||||
*
|
||||
* Copyright IBM Corp. 2016, 2017
|
||||
* Copyright IBM Corp. 2016, 2019
|
||||
*
|
||||
* s390-tools is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See LICENSE for details.
|
||||
@@ -217,3 +217,58 @@ bool util_path_exists(const char *fmt, ...)
|
||||
free(path);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if path exists, is a regular file, and permission is read-only
|
||||
*
|
||||
* @param[in] fmt Format string for path to test
|
||||
* @param[in] ... Variable arguments for format string
|
||||
*
|
||||
* @returns true Path exists, is a regular file, and permission does
|
||||
* not allow any write but allows read
|
||||
* false Otherwise
|
||||
*/
|
||||
bool util_path_is_readonly_file(const char *fmt, ...)
|
||||
{
|
||||
bool rc = false;
|
||||
struct stat sb;
|
||||
va_list ap;
|
||||
char *path;
|
||||
|
||||
UTIL_VASPRINTF(&path, fmt, ap);
|
||||
if (stat(path, &sb) == 0) {
|
||||
rc = S_ISREG(sb.st_mode) &&
|
||||
(sb.st_mode & 0222) == 0 &&
|
||||
(sb.st_mode & 0444) != 0;
|
||||
}
|
||||
free(path);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if path exists, is a regular file, and permission is write-only
|
||||
*
|
||||
* @param[in] fmt Format string for path to test
|
||||
* @param[in] ... Variable arguments for format string
|
||||
*
|
||||
* @returns true Path exists, is a regular file, and permission does
|
||||
* not allow any read but allows write
|
||||
* false Otherwise
|
||||
*/
|
||||
bool util_path_is_writeonly_file(const char *fmt, ...)
|
||||
{
|
||||
bool rc = false;
|
||||
struct stat sb;
|
||||
va_list ap;
|
||||
char *path;
|
||||
|
||||
UTIL_VASPRINTF(&path, fmt, ap);
|
||||
if (stat(path, &sb) == 0) {
|
||||
rc = S_ISREG(sb.st_mode) &&
|
||||
(sb.st_mode & 0222) != 0 &&
|
||||
(sb.st_mode & 0444) == 0;
|
||||
}
|
||||
free(path);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user