UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_FDIO) += lseek-3
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_FDIO) += fstat-2
+UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_FDIO) += fchmod-2
+UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_FDIO) += fchown-3
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_FDIO) += fsync-1
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_FDIO) += fdatasync-1
return r;
}
+UK_SYSCALL_R_DEFINE(int, fchmod, int, fd, mode_t, mode)
+{
+ int r;
+ union uk_shim_file sf;
+
+ switch (uk_fdtab_shim_get(fd, &sf)) {
+ case UK_SHIM_OFILE:
+ r = uk_sys_fchmod(sf.ofile, mode);
+ uk_fdtab_ret(sf.ofile);
+ break;
+#if CONFIG_LIBVFSCORE
+ case UK_SHIM_LEGACY:
+ /* vfscore_fchmod returns positive error codes */
+ r = -vfscore_fchmod(sf.vfile, mode);
+ fdrop(sf.vfile);
+ break;
+#endif /* CONFIG_LIBVFSCORE */
+ default:
+ r = -EBADF;
+ }
+ return r;
+}
+
+UK_SYSCALL_R_DEFINE(int, fchown, int, fd, uid_t, owner, gid_t, group)
+{
+ int r;
+ union uk_shim_file sf;
+
+ switch (uk_fdtab_shim_get(fd, &sf)) {
+ case UK_SHIM_OFILE:
+ r = uk_sys_fchown(sf.ofile, owner, group);
+ uk_fdtab_ret(sf.ofile);
+ break;
+#if CONFIG_LIBVFSCORE
+ case UK_SHIM_LEGACY:
+ /* vfscore does not support fchown; stub out */
+ fdrop(sf.vfile);
+ r = 0;
+ break;
+#endif /* CONFIG_LIBVFSCORE */
+ default:
+ r = -EBADF;
+ }
+ return r;
+}
+
/* Ctl */
UK_SYSCALL_R_DEFINE(int, fsync, int, fd)
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += chdir-1
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += fchdir-1
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += chmod-2
-UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += fchmod-2
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += utime-2
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += utimes-2
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += mknod-3
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += mount-5
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += statfs-2
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += fstatfs-2
-UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += fchown-3
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += lchown-3
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += chown-3
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += stat-2
chmod
uk_syscall_e_chmod
uk_syscall_r_chmod
-fchmod
-uk_syscall_e_fchmod
-uk_syscall_r_fchmod
-fchown
-uk_syscall_e_fchown
-uk_syscall_r_fchown
dup
uk_syscall_e_dup
uk_syscall_r_dup
vfscore_ftruncate
vfscore_fallocate
vfscore_fstat
+vfscore_fchmod
vfscore_fcntl
vfscore_ioctl
int vfscore_lseek(struct vfscore_file *fp, off_t off, int type, off_t *origin);
int vfscore_fstat(struct vfscore_file *fp, struct stat *st);
+int vfscore_fchmod(struct vfscore_file *fp, mode_t mode);
int vfscore_fsync(struct vfscore_file *fp);
return -error;
}
-UK_TRACEPOINT(trace_vfs_fchmod, "\"%d\" 0%0o", int, mode_t);
-UK_TRACEPOINT(trace_vfs_fchmod_ret, "");
-
-UK_SYSCALL_R_DEFINE(int, fchmod, int, fd, mode_t, mode)
-{
- trace_vfs_fchmod(fd, mode);
- int error = sys_fchmod(fd, mode & UK_ALLPERMS);
- trace_vfs_fchmod_ret();
- if (error) {
- return -error;
- }
-
- return 0;
-}
-
-UK_TRACEPOINT(trace_vfs_fchown, "\"%d\" %d %d", int, uid_t, gid_t);
-UK_TRACEPOINT(trace_vfs_fchown_ret, "");
-
-UK_SYSCALL_R_DEFINE(int, fchown, int, fd, uid_t, owner, gid_t, group)
-{
- trace_vfs_fchown(fd, owner, group);
- UK_WARN_STUBBED();
- trace_vfs_fchown_ret();
- return 0;
-}
-
UK_SYSCALL_R_DEFINE(int, chown, const char*, path, uid_t, owner, gid_t, group)
{
UK_WARN_STUBBED();
}
int
-sys_fchmod(int fd, mode_t mode)
+vfscore_fchmod(struct vfscore_file *f, mode_t mode)
{
- struct vfscore_file *f = vfscore_get_file(fd);
- if (!f)
- return EBADF;
// Posix is ambivalent on what fchmod() should do on an fd that does not
// refer to a real file. It suggests an implementation may (but not must)
// fail EINVAL on a pipe, can behave in an "unspecified" manner on a
if (f->f_dentry->d_mount->m_flags & MNT_RDONLY) {
return EROFS;
} else {
- return vn_setmode(f->f_dentry->d_vnode, mode);
+ return vn_setmode(f->f_dentry->d_vnode, mode & UK_ALLPERMS);
}
}
*/
int sys_chmod(const char *path, mode_t mode);
-/**
- * Changes mode of the file specified by the open file descriptor fd.
- *
- * @param fd
- * An open file descriptor
- * @param mode
- * The new file mode
- * @return
- * - (0): Completed successfully
- * - (<0): Negative value with error code
- */
-int sys_fchmod(int fd, mode_t mode);
-
/**
* Converts to full path from the cwd of task and path.
*