PERFORCE change 122092 for review
Roman Divacky
rdivacky at FreeBSD.org
Thu Jun 21 13:07:37 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=122092
Change 122092 by rdivacky at rdivacky_witten on 2007/06/21 13:06:56
Introduce fchmodat, fchownat. Change "flags" arugment ot faccessat
to "flag" to be consistent with the rest.
Affected files ...
.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/init_sysent.c#3 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/syscalls.c#3 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/syscalls.master#3 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/systrace_args.c#3 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_syscalls.c#27 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/sys/syscall.h#3 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/sys/syscall.mk#3 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/sys/syscallsubr.h#11 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/sys/sysproto.h#3 edit
Differences ...
==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/init_sysent.c#3 (text+ko) ====
@@ -505,4 +505,6 @@
{ AS(sctp_generic_sendmsg_iov_args), (sy_call_t *)sctp_generic_sendmsg_iov, AUE_NULL, NULL, 0, 0 }, /* 473 = sctp_generic_sendmsg_iov */
{ AS(sctp_generic_recvmsg_args), (sy_call_t *)sctp_generic_recvmsg, AUE_NULL, NULL, 0, 0 }, /* 474 = sctp_generic_recvmsg */
{ AS(faccessat_args), (sy_call_t *)faccessat, AUE_ACCESS, NULL, 0, 0 }, /* 475 = faccessat */
+ { AS(fchmodat_args), (sy_call_t *)fchmodat, AUE_CHMOD, NULL, 0, 0 }, /* 476 = fchmodat */
+ { AS(fchownat_args), (sy_call_t *)fchownat, AUE_CHOWN, NULL, 0, 0 }, /* 477 = fchownat */
};
==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/syscalls.c#3 (text+ko) ====
@@ -483,4 +483,6 @@
"sctp_generic_sendmsg_iov", /* 473 = sctp_generic_sendmsg_iov */
"sctp_generic_recvmsg", /* 474 = sctp_generic_recvmsg */
"faccessat", /* 475 = faccessat */
+ "fchmodat", /* 476 = fchmodat */
+ "fchownat", /* 477 = fchownat */
};
==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/syscalls.master#3 (text+ko) ====
@@ -835,6 +835,8 @@
474 AUE_NULL STD { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, \
struct sockaddr * from, __socklen_t *fromlenaddr, \
struct sctp_sndrcvinfo *sinfo, int *msg_flags); }
-475 AUE_ACCESS STD { int faccessat(int dirfd, char *path, int mode, int flags); }
+475 AUE_ACCESS STD { int faccessat(int dirfd, char *path, int mode, int flag); }
+476 AUE_CHMOD STD { int fchmodat(int dirfd, char *path, mode_t mode, int flag); }
+477 AUE_CHOWN STD { int fchownat(int dirfd, char *path, uid_t uid, gid_t gid, int flag); }
; Please copy any additions and changes to the following compatability tables:
; sys/compat/freebsd32/syscalls.master
==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/systrace_args.c#3 (text+ko) ====
@@ -2811,10 +2811,31 @@
iarg[0] = p->dirfd; /* int */
uarg[1] = (intptr_t) p->path; /* char * */
iarg[2] = p->mode; /* int */
- iarg[3] = p->flags; /* int */
+ iarg[3] = p->flag; /* int */
+ *n_args = 4;
+ break;
+ }
+ /* fchmodat */
+ case 476: {
+ struct fchmodat_args *p = params;
+ iarg[0] = p->dirfd; /* int */
+ uarg[1] = (intptr_t) p->path; /* char * */
+ iarg[2] = p->mode; /* mode_t */
+ iarg[3] = p->flag; /* int */
*n_args = 4;
break;
}
+ /* fchownat */
+ case 477: {
+ struct fchownat_args *p = params;
+ iarg[0] = p->dirfd; /* int */
+ uarg[1] = (intptr_t) p->path; /* char * */
+ uarg[2] = p->uid; /* uid_t */
+ iarg[3] = p->gid; /* gid_t */
+ iarg[4] = p->flag; /* int */
+ *n_args = 5;
+ break;
+ }
default:
*n_args = 0;
break;
==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_syscalls.c#27 (text+ko) ====
@@ -2026,15 +2026,15 @@
int dirfd;
char *path;
int mode;
- int flags;
+ int flag;
}
#endif
int faccessat(struct thread *td, struct faccessat_args *args)
{
- if (args->flags & ~AT_EACCESS)
+ if (args->flag & ~AT_EACCESS)
return (EINVAL);
/* XXX: what about mode? */
- return kern_accessat(td, args->path, UIO_USERSPACE, args->flags, args->dirfd);
+ return kern_accessat(td, args->path, UIO_USERSPACE, args->flag, args->dirfd);
}
int
@@ -2759,6 +2759,26 @@
return (kern_chmod(td, uap->path, UIO_USERSPACE, uap->mode));
}
+#ifndef _SYS_SYSPROTO_H_
+struct fchmodat_args {
+ int dirfd;
+ char *path;
+ mode_t mode;
+ int flag;
+}
+#endif
+int
+fchmodat(struct thread *td, struct fchmodat_args *args)
+{
+ if (args->flag & ~AT_SYMLINK_NOFOLLOW)
+ return (EINVAL);
+
+ if (args->flag & AT_SYMLINK_NOFOLLOW)
+ return kern_lchmodat(td, args->path, UIO_USERSPACE, args->mode, args->dirfd);
+ else
+ return kern_chmodat(td, args->path, UIO_USERSPACE, args->mode, args->dirfd);
+}
+
int
kern_chmod(struct thread *td, char *path, enum uio_seg pathseg, int mode)
{
@@ -2809,18 +2829,30 @@
int mode;
} */ *uap;
{
+ return kern_lchmodat(td, uap->path, UIO_USERSPACE, uap->mode, AT_FDCWD);
+}
+
+
+int
+kern_lchmodat(struct thread *td, char *path, enum uio_seg pathseg, mode_t mode, int dirfd)
+{
int error;
struct nameidata nd;
int vfslocked;
+ struct vnode *dir_vn;
+
+ error = kern_get_at(td, dirfd, &dir_vn);
+ if (error && !kern_absolute_path(path, pathseg))
+ return (error);
- AUDIT_ARG(mode, (mode_t)uap->mode);
- NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE | AUDITVNODE1, UIO_USERSPACE,
- uap->path, td);
+ AUDIT_ARG(mode, mode);
+ NDINIT_AT(&nd, LOOKUP, NOFOLLOW | MPSAFE | AUDITVNODE1, pathseg,
+ path, td, dir_vn);
if ((error = namei(&nd)) != 0)
return (error);
vfslocked = NDHASGIANT(&nd);
NDFREE(&nd, NDF_ONLY_PNBUF);
- error = setfmode(td, nd.ni_vp, uap->mode);
+ error = setfmode(td, nd.ni_vp, mode);
vrele(nd.ni_vp);
VFS_UNLOCK_GIANT(vfslocked);
return (error);
@@ -2918,6 +2950,23 @@
return (kern_chown(td, uap->path, UIO_USERSPACE, uap->uid, uap->gid));
}
+#ifndef _SYS_SYSPROTO_H_
+#endif
+int
+fchownat(struct thread *td, struct fchownat_args *args)
+{
+ if (args->flag & ~AT_SYMLINK_NOFOLLOW)
+ return (EINVAL);
+
+ if (args->flag & AT_SYMLINK_NOFOLLOW)
+ return kern_lchownat(td, args->path, UIO_USERSPACE, args->uid,
+ args->gid, args->dirfd);
+ else
+ return kern_chownat(td, args->path, UIO_USERSPACE, args->uid,
+ args->gid, args->dirfd);
+}
+
+
int
kern_chown(struct thread *td, char *path, enum uio_seg pathseg, int uid,
int gid)
==== //depot/projects/soc2007/rdivacky/linux_at/sys/sys/syscall.h#3 (text+ko) ====
@@ -395,4 +395,6 @@
#define SYS_sctp_generic_sendmsg_iov 473
#define SYS_sctp_generic_recvmsg 474
#define SYS_faccessat 475
-#define SYS_MAXSYSCALL 476
+#define SYS_fchmodat 476
+#define SYS_fchownat 477
+#define SYS_MAXSYSCALL 478
==== //depot/projects/soc2007/rdivacky/linux_at/sys/sys/syscall.mk#3 (text+ko) ====
@@ -336,4 +336,6 @@
sctp_generic_sendmsg.o \
sctp_generic_sendmsg_iov.o \
sctp_generic_recvmsg.o \
- faccessat.o
+ faccessat.o \
+ fchmodat.o \
+ fchownat.o
==== //depot/projects/soc2007/rdivacky/linux_at/sys/sys/syscallsubr.h#11 (text+ko) ====
@@ -70,6 +70,8 @@
int mode, int dirfd);
int kern_chown(struct thread *td, char *path, enum uio_seg pathseg, int uid,
int gid);
+int kern_lchmodat(struct thread *td, char *path, enum uio_seg pathseg,
+ mode_t mode, int dirfd);
int kern_chownat(struct thread *td, char *path, enum uio_seg pathseg, int uid,
int gid, int dirfd);
int kern_clock_getres(struct thread *td, clockid_t clock_id,
==== //depot/projects/soc2007/rdivacky/linux_at/sys/sys/sysproto.h#3 (text+ko) ====
@@ -1486,7 +1486,20 @@
char dirfd_l_[PADL_(int)]; int dirfd; char dirfd_r_[PADR_(int)];
char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
char mode_l_[PADL_(int)]; int mode; char mode_r_[PADR_(int)];
- char flags_l_[PADL_(int)]; int flags; char flags_r_[PADR_(int)];
+ char flag_l_[PADL_(int)]; int flag; char flag_r_[PADR_(int)];
+};
+struct fchmodat_args {
+ char dirfd_l_[PADL_(int)]; int dirfd; char dirfd_r_[PADR_(int)];
+ char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
+ char mode_l_[PADL_(mode_t)]; mode_t mode; char mode_r_[PADR_(mode_t)];
+ char flag_l_[PADL_(int)]; int flag; char flag_r_[PADR_(int)];
+};
+struct fchownat_args {
+ char dirfd_l_[PADL_(int)]; int dirfd; char dirfd_r_[PADR_(int)];
+ char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
+ char uid_l_[PADL_(uid_t)]; uid_t uid; char uid_r_[PADR_(uid_t)];
+ char gid_l_[PADL_(gid_t)]; gid_t gid; char gid_r_[PADR_(gid_t)];
+ char flag_l_[PADL_(int)]; int flag; char flag_r_[PADR_(int)];
};
int nosys(struct thread *, struct nosys_args *);
void sys_exit(struct thread *, struct sys_exit_args *);
@@ -1821,6 +1834,8 @@
int sctp_generic_sendmsg_iov(struct thread *, struct sctp_generic_sendmsg_iov_args *);
int sctp_generic_recvmsg(struct thread *, struct sctp_generic_recvmsg_args *);
int faccessat(struct thread *, struct faccessat_args *);
+int fchmodat(struct thread *, struct fchmodat_args *);
+int fchownat(struct thread *, struct fchownat_args *);
#ifdef COMPAT_43
@@ -2373,6 +2388,8 @@
#define SYS_AUE_sctp_generic_sendmsg_iov AUE_NULL
#define SYS_AUE_sctp_generic_recvmsg AUE_NULL
#define SYS_AUE_faccessat AUE_ACCESS
+#define SYS_AUE_fchmodat AUE_CHMOD
+#define SYS_AUE_fchownat AUE_CHOWN
#undef PAD_
#undef PADL_
More information about the p4-projects
mailing list