Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1808)

Unified Diff: fusl/src/stat/fchmodat.c

Issue 1573973002: Add a "fork" of musl as //fusl. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « fusl/src/stat/fchmod.c ('k') | fusl/src/stat/fstat.c » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: fusl/src/stat/fchmodat.c
diff --git a/fusl/src/stat/fchmodat.c b/fusl/src/stat/fchmodat.c
new file mode 100644
index 0000000000000000000000000000000000000000..d94667aed5e1a4aa1e924bd89a8ba3aa3ec6aa16
--- /dev/null
+++ b/fusl/src/stat/fchmodat.c
@@ -0,0 +1,39 @@
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "syscall.h"
+
+void __procfdname(char *, unsigned);
+
+int fchmodat(int fd, const char *path, mode_t mode, int flag)
+{
+ if (!flag) return syscall(SYS_fchmodat, fd, path, mode, flag);
+
+ if (flag != AT_SYMLINK_NOFOLLOW)
+ return __syscall_ret(-EINVAL);
+
+ struct stat st;
+ int ret, fd2;
+ char proc[15+3*sizeof(int)];
+
+ if ((ret = __syscall(SYS_fstatat, fd, path, &st, flag)))
+ return __syscall_ret(ret);
+ if (S_ISLNK(st.st_mode))
+ return __syscall_ret(-EOPNOTSUPP);
+
+ if ((fd2 = __syscall(SYS_openat, fd, path, O_RDONLY|O_PATH|O_NOFOLLOW|O_NOCTTY|O_CLOEXEC)) < 0) {
+ if (fd2 == -ELOOP)
+ return __syscall_ret(-EOPNOTSUPP);
+ return __syscall_ret(fd2);
+ }
+
+ __procfdname(proc, fd2);
+ ret = __syscall(SYS_fstatat, AT_FDCWD, proc, &st, 0);
+ if (!ret) {
+ if (S_ISLNK(st.st_mode)) ret = -EOPNOTSUPP;
+ else ret = __syscall(SYS_fchmodat, AT_FDCWD, proc, mode);
+ }
+
+ __syscall(SYS_close, fd2);
+ return __syscall_ret(ret);
+}
« no previous file with comments | « fusl/src/stat/fchmod.c ('k') | fusl/src/stat/fstat.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698