#define ACL_FAILURE 0
#define ACL_SUCCESS 1
+/* Even though most other library functions reliably return -1 for
+ * error, it feels a little wrong to re-use the ACL_ERROR constant.
+ */
+#define CLOSE_ERROR -1
+#define NFTW_ERROR -1
+#define OPEN_ERROR -1
+#define SNPRINTF_ERROR -1
+#define STAT_ERROR -1
int safe_open_ex(int at_fd, char* pathname, int flags) {
if (pathname != NULL && strlen(pathname) == 0) {
openat() opens only the next directory (and doesn't recurse). */
*firstslash = '\0';
int fd = safe_open_ex(at_fd, pathname, flags);
- if (fd == -1) {
+ if (fd == OPEN_ERROR) {
if (errno != ELOOP) {
/* Don't output anything if we ignore a symlink */
perror("safe_open_ex (safe_open_ex)");
}
- return -1;
+ return OPEN_ERROR;
}
/* The ++ is safe because there needs to be at least a null byte
after the first slash, even if it's the last real character in
the string. */
int result = safe_open_ex(fd, firstslash+1, flags);
- if (close(fd) == -1) {
+ if (close(fd) == CLOSE_ERROR) {
perror("safe_open_ex (close)");
- return -1;
+ return OPEN_ERROR;
}
return result;
}
int safe_open(const char* pathname, int flags) {
if (pathname == NULL || strlen(pathname) == 0 || pathname[0] == '\0') {
/* error? */
- return -1;
+ return OPEN_ERROR;
}
char abspath[PATH_MAX];
char* cwd = get_current_dir_name();
if (cwd == NULL) {
perror("safe_open (get_current_dir_name)");
- return -1;
+ return OPEN_ERROR;
}
char abs_cwd[PATH_MAX];
if (realpath(cwd, abs_cwd) == NULL) {
perror("safe_open (realpath)");
free(cwd);
- return -1;
+ return OPEN_ERROR;
}
snprintf_result = snprintf(abspath, PATH_MAX, "%s/%s", abs_cwd, pathname);
free(cwd);
}
- if (snprintf_result == -1 || snprintf_result > PATH_MAX) {
+ if (snprintf_result == SNPRINTF_ERROR || snprintf_result > PATH_MAX) {
perror("safe_open (snprintf)");
- return -1;
+ return OPEN_ERROR;
}
int fd = open("/", flags);
}
int result = safe_open_ex(fd, abspath+1, flags);
- if (close(fd) == -1) {
+ if (close(fd) == CLOSE_ERROR) {
perror("safe_open (close)");
- return -1;
+ return OPEN_ERROR;
}
return result;
}
char* parent = dirname(path_copy);
fd = safe_open(path, O_NOFOLLOW);
- if (fd == -1) {
+ if (fd == OPEN_ERROR) {
if (errno == ELOOP) {
result = ACL_FAILURE; /* hit a symlink */
goto cleanup;
*/
if (sp == NULL) {
struct stat s;
- if (fstat(fd, &s) == -1) {
+ if (fstat(fd, &s) == STAT_ERROR) {
perror("apply_default_acl (fstat)");
goto cleanup;
}
if (defacl != (acl_t)NULL) {
acl_free(defacl);
}
- if (fd >= 0 && close(fd) == -1) {
+ if (fd >= 0 && close(fd) == CLOSE_ERROR) {
perror("apply_default_acl (close)");
result = ACL_ERROR;
}
return true;
}
- /* nftw will return -1 on error, or if the supplied function
+ /* nftw will return NFTW_ERROR on error, or if the supplied function
* (apply_default_acl_nftw) returns a non-zero result, nftw will
* return that.
*/
- if (nftw_result == -1) {
+ if (nftw_result == NFTW_ERROR) {
perror("apply_default_acl_recursive (nftw)");
}