加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
backport-stat-util-replace-is_dir-is_dir_fd-by-single-is_dir_.patch 2.51 KB
一键复制 编辑 原始数据 按行查看 历史
From ab77d5f0c18783c273d1b3b0e8126c7019ddb1f8 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Wed, 13 Jul 2022 23:43:36 +0200
Subject: [PATCH] stat-util: replace is_dir() + is_dir_fd() by single
is_dir_full() call
This new call can execute both of the old operations, but also do
generic fstatat() like behaviour.
(cherry picked from commit a586dc791ca465f4087473d2ad6794b7776aee2d)
(cherry picked from commit 9255fa3a15c5c7dea9ddb2ce5399d3b675f8368b)
(cherry picked from commit a77b81f1240ff7e0ea5d084d61875e1bdefc075d)
Conflict:NA
Reference:https://github.com/systemd/systemd/commit/ab77d5f0c18783c273d1b3b0e8126c7019ddb1f8
---
src/basic/stat-util.c | 20 ++++++--------------
src/basic/stat-util.h | 9 +++++++--
2 files changed, 13 insertions(+), 16 deletions(-)
diff --git a/src/basic/stat-util.c b/src/basic/stat-util.c
index 56f7652cec..652cfd1485 100644
--- a/src/basic/stat-util.c
+++ b/src/basic/stat-util.c
@@ -31,31 +31,23 @@ int is_symlink(const char *path) {
return !!S_ISLNK(info.st_mode);
}
-int is_dir(const char* path, bool follow) {
+int is_dir_full(int atfd, const char* path, bool follow) {
struct stat st;
int r;
- assert(path);
+ assert(atfd >= 0 || atfd == AT_FDCWD);
+ assert(atfd >= 0 || path);
- if (follow)
- r = stat(path, &st);
+ if (path)
+ r = fstatat(atfd, path, &st, follow ? 0 : AT_SYMLINK_NOFOLLOW);
else
- r = lstat(path, &st);
+ r = fstat(atfd, &st);
if (r < 0)
return -errno;
return !!S_ISDIR(st.st_mode);
}
-int is_dir_fd(int fd) {
- struct stat st;
-
- if (fstat(fd, &st) < 0)
- return -errno;
-
- return !!S_ISDIR(st.st_mode);
-}
-
int is_device_node(const char *path) {
struct stat info;
diff --git a/src/basic/stat-util.h b/src/basic/stat-util.h
index a566114f7c..f9a24c8775 100644
--- a/src/basic/stat-util.h
+++ b/src/basic/stat-util.h
@@ -13,8 +13,13 @@
#include "missing_stat.h"
int is_symlink(const char *path);
-int is_dir(const char *path, bool follow);
-int is_dir_fd(int fd);
+int is_dir_full(int atfd, const char *fname, bool follow);
+static inline int is_dir(const char *path, bool follow) {
+ return is_dir_full(AT_FDCWD, path, follow);
+}
+static inline int is_dir_fd(int fd) {
+ return is_dir_full(fd, NULL, false);
+}
int is_device_node(const char *path);
int dir_is_empty_at(int dir_fd, const char *path);
--
2.27.0
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化