PERFORCE change 127283 for review

Roman Divacky rdivacky at FreeBSD.org
Sun Oct 7 10:27:26 PDT 2007


http://perforce.freebsd.org/chv.cgi?CH=127283

Change 127283 by rdivacky at rdivacky_witten on 2007/10/07 17:26:54

	IFrdivacky_at
	an attempt to bring in working *at syscalls.

Affected files ...

.. //depot/projects/linuxolator/src/sys/amd64/linux32/linux.h#28 integrate
.. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_dummy.c#14 integrate
.. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_proto.h#26 integrate
.. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_sysent.c#25 edit
.. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_sysvec.c#15 integrate
.. //depot/projects/linuxolator/src/sys/amd64/linux32/syscalls.master#26 integrate
.. //depot/projects/linuxolator/src/sys/compat/linux/linux_file.c#26 edit
.. //depot/projects/linuxolator/src/sys/compat/linux/linux_file.h#1 branch
.. //depot/projects/linuxolator/src/sys/compat/linux/linux_ioctl.c#4 integrate
.. //depot/projects/linuxolator/src/sys/compat/linux/linux_ioctl.h#5 integrate
.. //depot/projects/linuxolator/src/sys/compat/linux/linux_misc.c#66 edit
.. //depot/projects/linuxolator/src/sys/compat/linux/linux_stats.c#14 edit
.. //depot/projects/linuxolator/src/sys/compat/linux/linux_uid16.c#6 integrate
.. //depot/projects/linuxolator/src/sys/compat/linux/linux_util.c#4 integrate
.. //depot/projects/linuxolator/src/sys/compat/linux/linux_util.h#6 edit
.. //depot/projects/linuxolator/src/sys/compat/ndis/subr_ndis.c#5 edit
.. //depot/projects/linuxolator/src/sys/compat/svr4/svr4_fcntl.c#7 edit
.. //depot/projects/linuxolator/src/sys/compat/svr4/svr4_sysvec.c#2 integrate
.. //depot/projects/linuxolator/src/sys/dev/md/md.c#6 edit
.. //depot/projects/linuxolator/src/sys/dev/streams/streams.c#5 edit
.. //depot/projects/linuxolator/src/sys/i386/ibcs2/ibcs2_fcntl.c#4 edit
.. //depot/projects/linuxolator/src/sys/i386/ibcs2/ibcs2_util.c#2 integrate
.. //depot/projects/linuxolator/src/sys/i386/linux/linux.h#24 integrate
.. //depot/projects/linuxolator/src/sys/i386/linux/linux_dummy.c#12 integrate
.. //depot/projects/linuxolator/src/sys/i386/linux/linux_proto.h#25 edit
.. //depot/projects/linuxolator/src/sys/i386/linux/linux_sysent.c#24 edit
.. //depot/projects/linuxolator/src/sys/i386/linux/linux_sysvec.c#8 integrate
.. //depot/projects/linuxolator/src/sys/i386/linux/syscalls.master#24 integrate
.. //depot/projects/linuxolator/src/sys/kern/imgact_elf.c#5 integrate
.. //depot/projects/linuxolator/src/sys/kern/init_sysent.c#9 integrate
.. //depot/projects/linuxolator/src/sys/kern/kern_acct.c#9 edit
.. //depot/projects/linuxolator/src/sys/kern/kern_alq.c#6 edit
.. //depot/projects/linuxolator/src/sys/kern/kern_descrip.c#12 integrate
.. //depot/projects/linuxolator/src/sys/kern/kern_exec.c#8 integrate
.. //depot/projects/linuxolator/src/sys/kern/kern_kse.c#8 integrate
.. //depot/projects/linuxolator/src/sys/kern/kern_ktrace.c#10 edit
.. //depot/projects/linuxolator/src/sys/kern/kern_linker.c#9 edit
.. //depot/projects/linuxolator/src/sys/kern/kern_sig.c#13 edit
.. //depot/projects/linuxolator/src/sys/kern/link_elf.c#6 edit
.. //depot/projects/linuxolator/src/sys/kern/syscalls.c#9 integrate
.. //depot/projects/linuxolator/src/sys/kern/syscalls.master#8 integrate
.. //depot/projects/linuxolator/src/sys/kern/systrace_args.c#9 integrate
.. //depot/projects/linuxolator/src/sys/kern/tty_cons.c#6 edit
.. //depot/projects/linuxolator/src/sys/kern/vfs_lookup.c#13 integrate
.. //depot/projects/linuxolator/src/sys/kern/vfs_syscalls.c#17 integrate
.. //depot/projects/linuxolator/src/sys/kern/vfs_vnops.c#8 edit
.. //depot/projects/linuxolator/src/sys/security/audit/audit_syscalls.c#11 edit
.. //depot/projects/linuxolator/src/sys/sys/eventhandler.h#6 integrate
.. //depot/projects/linuxolator/src/sys/sys/fcntl.h#2 integrate
.. //depot/projects/linuxolator/src/sys/sys/file.h#3 integrate
.. //depot/projects/linuxolator/src/sys/sys/imgact.h#2 integrate
.. //depot/projects/linuxolator/src/sys/sys/namei.h#3 integrate
.. //depot/projects/linuxolator/src/sys/sys/sem.h#6 integrate
.. //depot/projects/linuxolator/src/sys/sys/stat.h#2 integrate
.. //depot/projects/linuxolator/src/sys/sys/syscall.h#9 integrate
.. //depot/projects/linuxolator/src/sys/sys/syscall.mk#9 integrate
.. //depot/projects/linuxolator/src/sys/sys/syscallsubr.h#8 integrate
.. //depot/projects/linuxolator/src/sys/sys/sysproto.h#9 integrate
.. //depot/projects/linuxolator/src/sys/sys/time.h#3 integrate
.. //depot/projects/linuxolator/src/sys/sys/vnode.h#10 edit
.. //depot/projects/linuxolator/src/sys/ufs/ufs/ufs_quota.c#12 edit

Differences ...

==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux.h#28 (text+ko) ====

@@ -579,8 +579,6 @@
 #define	LINUX_F_WRLCK		1
 #define	LINUX_F_UNLCK		2
 
-#define	LINUX_AT_FDCWD		-100
-
 /*
  * mount flags
  */

==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_dummy.c#14 (text+ko) ====


==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_proto.h#26 (text+ko) ====

@@ -2,8 +2,8 @@
  * System call prototypes.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/amd64/linux32/linux32_proto.h,v 1.33 2007/09/18 19:50:32 dwmalone Exp $
- * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.29 2007/08/28 12:26:34 kib Exp 
+ * $FreeBSD$
+ * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.30 2007/09/18 19:50:32 dwmalone Exp 
  */
 
 #ifndef _LINUX_SYSPROTO_H_
@@ -911,26 +911,43 @@
 };
 struct linux_openat_args {
 	char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)];
-	char filename_l_[PADL_(char *)]; char * filename; char filename_r_[PADR_(char *)];
+	char filename_l_[PADL_(const char *)]; const char * filename; char filename_r_[PADR_(const char *)];
 	char flags_l_[PADL_(l_int)]; l_int flags; char flags_r_[PADR_(l_int)];
 	char mode_l_[PADL_(l_int)]; l_int mode; char mode_r_[PADR_(l_int)];
 };
 struct linux_mkdirat_args {
 	char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)];
+>>>> ORIGINAL //depot/vendor/freebsd/src/sys/amd64/linux32/linux32_proto.h#33
+==== THEIRS //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_proto.h#9
+	char pathname_l_[PADL_(const char *)]; const char * pathname; char pathname_r_[PADR_(const char *)];
+==== YOURS //rdivacky_witten/projects/linuxolator/src/sys/amd64/linux32/linux32_proto.h
 	char pathname_l_[PADL_(char *)]; char * pathname; char pathname_r_[PADR_(char *)];
+<<<<
 	char mode_l_[PADL_(l_int)]; l_int mode; char mode_r_[PADR_(l_int)];
 };
 struct linux_mknodat_args {
 	char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)];
+>>>> ORIGINAL //depot/vendor/freebsd/src/sys/amd64/linux32/linux32_proto.h#33
+==== THEIRS //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_proto.h#9
+	char filename_l_[PADL_(const char *)]; const char * filename; char filename_r_[PADR_(const char *)];
+==== YOURS //rdivacky_witten/projects/linuxolator/src/sys/amd64/linux32/linux32_proto.h
 	char filename_l_[PADL_(char *)]; char * filename; char filename_r_[PADR_(char *)];
+<<<<
 	char mode_l_[PADL_(l_int)]; l_int mode; char mode_r_[PADR_(l_int)];
 	char dev_l_[PADL_(l_uint)]; l_uint dev; char dev_r_[PADR_(l_uint)];
 };
 struct linux_fchownat_args {
 	char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)];
+>>>> ORIGINAL //depot/vendor/freebsd/src/sys/amd64/linux32/linux32_proto.h#33
+==== THEIRS //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_proto.h#9
+	char filename_l_[PADL_(const char *)]; const char * filename; char filename_r_[PADR_(const char *)];
+	char uid_l_[PADL_(l_uid16_t)]; l_uid16_t uid; char uid_r_[PADR_(l_uid16_t)];
+	char gid_l_[PADL_(l_gid16_t)]; l_gid16_t gid; char gid_r_[PADR_(l_gid16_t)];
+==== YOURS //rdivacky_witten/projects/linuxolator/src/sys/amd64/linux32/linux32_proto.h
 	char filename_l_[PADL_(char *)]; char * filename; char filename_r_[PADR_(char *)];
 	char user_l_[PADL_(uid_t)]; uid_t user; char user_r_[PADR_(uid_t)];
 	char group_l_[PADL_(gid_t)]; gid_t group; char group_r_[PADR_(gid_t)];
+<<<<
 	char flag_l_[PADL_(l_int)]; l_int flag; char flag_r_[PADR_(l_int)];
 };
 struct linux_futimesat_args {
@@ -946,41 +963,87 @@
 };
 struct linux_unlinkat_args {
 	char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)];
+>>>> ORIGINAL //depot/vendor/freebsd/src/sys/amd64/linux32/linux32_proto.h#33
+==== THEIRS //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_proto.h#9
+	char pathname_l_[PADL_(const char *)]; const char * pathname; char pathname_r_[PADR_(const char *)];
+==== YOURS //rdivacky_witten/projects/linuxolator/src/sys/amd64/linux32/linux32_proto.h
 	char pathname_l_[PADL_(char *)]; char * pathname; char pathname_r_[PADR_(char *)];
+<<<<
 	char flag_l_[PADL_(l_int)]; l_int flag; char flag_r_[PADR_(l_int)];
 };
 struct linux_renameat_args {
 	char olddfd_l_[PADL_(l_int)]; l_int olddfd; char olddfd_r_[PADR_(l_int)];
+>>>> ORIGINAL //depot/vendor/freebsd/src/sys/amd64/linux32/linux32_proto.h#33
+==== THEIRS //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_proto.h#9
+	char oldname_l_[PADL_(const char *)]; const char * oldname; char oldname_r_[PADR_(const char *)];
+	char newdfd_l_[PADL_(l_int)]; l_int newdfd; char newdfd_r_[PADR_(l_int)];
+	char newname_l_[PADL_(const char *)]; const char * newname; char newname_r_[PADR_(const char *)];
+==== YOURS //rdivacky_witten/projects/linuxolator/src/sys/amd64/linux32/linux32_proto.h
 	char oldname_l_[PADL_(char *)]; char * oldname; char oldname_r_[PADR_(char *)];
 	char newdfd_l_[PADL_(l_int)]; l_int newdfd; char newdfd_r_[PADR_(l_int)];
 	char newname_l_[PADL_(char *)]; char * newname; char newname_r_[PADR_(char *)];
+<<<<
 };
 struct linux_linkat_args {
 	char olddfd_l_[PADL_(l_int)]; l_int olddfd; char olddfd_r_[PADR_(l_int)];
+>>>> ORIGINAL //depot/vendor/freebsd/src/sys/amd64/linux32/linux32_proto.h#33
+==== THEIRS //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_proto.h#9
+	char oldname_l_[PADL_(const char *)]; const char * oldname; char oldname_r_[PADR_(const char *)];
+	char newdfd_l_[PADL_(l_int)]; l_int newdfd; char newdfd_r_[PADR_(l_int)];
+	char newname_l_[PADL_(const char *)]; const char * newname; char newname_r_[PADR_(const char *)];
+	char flags_l_[PADL_(l_int)]; l_int flags; char flags_r_[PADR_(l_int)];
+==== YOURS //rdivacky_witten/projects/linuxolator/src/sys/amd64/linux32/linux32_proto.h
 	char oldname_l_[PADL_(char *)]; char * oldname; char oldname_r_[PADR_(char *)];
 	char newdfd_l_[PADL_(l_int)]; l_int newdfd; char newdfd_r_[PADR_(l_int)];
 	char newname_l_[PADL_(char *)]; char * newname; char newname_r_[PADR_(char *)];
 	char flags_l_[PADL_(l_int)]; l_int flags; char flags_r_[PADR_(l_int)];
+<<<<
 };
 struct linux_symlinkat_args {
+>>>> ORIGINAL //depot/vendor/freebsd/src/sys/amd64/linux32/linux32_proto.h#33
+	register_t dummy;
+==== THEIRS //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_proto.h#9
+	char oldname_l_[PADL_(const char *)]; const char * oldname; char oldname_r_[PADR_(const char *)];
+==== YOURS //rdivacky_witten/projects/linuxolator/src/sys/amd64/linux32/linux32_proto.h
 	char oldname_l_[PADL_(char *)]; char * oldname; char oldname_r_[PADR_(char *)];
+<<<<
 	char newdfd_l_[PADL_(l_int)]; l_int newdfd; char newdfd_r_[PADR_(l_int)];
+>>>> ORIGINAL //depot/vendor/freebsd/src/sys/amd64/linux32/linux32_proto.h#33
+==== THEIRS //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_proto.h#9
+	char newname_l_[PADL_(const char *)]; const char * newname; char newname_r_[PADR_(const char *)];
+==== YOURS //rdivacky_witten/projects/linuxolator/src/sys/amd64/linux32/linux32_proto.h
 	char newname_l_[PADL_(char *)]; char * newname; char newname_r_[PADR_(char *)];
+<<<<
 };
 struct linux_readlinkat_args {
 	char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)];
+>>>> ORIGINAL //depot/vendor/freebsd/src/sys/amd64/linux32/linux32_proto.h#33
+==== THEIRS //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_proto.h#9
+	char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)];
+==== YOURS //rdivacky_witten/projects/linuxolator/src/sys/amd64/linux32/linux32_proto.h
 	char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
+<<<<
 	char buf_l_[PADL_(char *)]; char * buf; char buf_r_[PADR_(char *)];
 	char bufsiz_l_[PADL_(l_int)]; l_int bufsiz; char bufsiz_r_[PADR_(l_int)];
 };
 struct linux_fchmodat_args {
 	char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)];
+>>>> ORIGINAL //depot/vendor/freebsd/src/sys/amd64/linux32/linux32_proto.h#33
+==== THEIRS //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_proto.h#9
+	char filename_l_[PADL_(const char *)]; const char * filename; char filename_r_[PADR_(const char *)];
+==== YOURS //rdivacky_witten/projects/linuxolator/src/sys/amd64/linux32/linux32_proto.h
 	char filename_l_[PADL_(char *)]; char * filename; char filename_r_[PADR_(char *)];
+<<<<
 	char mode_l_[PADL_(l_mode_t)]; l_mode_t mode; char mode_r_[PADR_(l_mode_t)];
 };
 struct linux_faccessat_args {
 	char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)];
+>>>> ORIGINAL //depot/vendor/freebsd/src/sys/amd64/linux32/linux32_proto.h#33
+==== THEIRS //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_proto.h#9
+	char filename_l_[PADL_(const char *)]; const char * filename; char filename_r_[PADR_(const char *)];
+==== YOURS //rdivacky_witten/projects/linuxolator/src/sys/amd64/linux32/linux32_proto.h
 	char filename_l_[PADL_(char *)]; char * filename; char filename_r_[PADR_(char *)];
+<<<<
 	char mode_l_[PADL_(l_int)]; l_int mode; char mode_r_[PADR_(l_int)];
 };
 struct linux_pselect6_args {

==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_sysent.c#25 (text+ko) ====

@@ -2,8 +2,8 @@
  * System call switch table.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/amd64/linux32/linux32_sysent.c,v 1.33 2007/09/18 19:50:32 dwmalone Exp $
- * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.29 2007/08/28 12:26:34 kib Exp 
+ * $FreeBSD$
+ * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.30 2007/09/18 19:50:32 dwmalone Exp 
  */
 
 #include <bsm/audit_kevents.h>

==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_sysvec.c#15 (text+ko) ====

@@ -43,6 +43,7 @@
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/exec.h>
+#include <sys/fcntl.h>
 #include <sys/imgact.h>
 #include <sys/imgact_elf.h>
 #include <sys/kernel.h>
@@ -789,7 +790,7 @@
 	     */
 	    if ((error = exec_shell_imgact(imgp)) == 0) {
 		    linux_emul_convpath(FIRST_THREAD_IN_PROC(imgp->proc),
-			imgp->interpreter_name, UIO_SYSSPACE, &rpath, 0);
+			imgp->interpreter_name, UIO_SYSSPACE, &rpath, 0, AT_FDCWD);
 		    if (rpath != NULL) {
 			    len = strlen(rpath) + 1;
 

==== //depot/projects/linuxolator/src/sys/amd64/linux32/syscalls.master#26 (text+ko) ====

@@ -465,7 +465,7 @@
 292	AUE_NULL	STD	{ int linux_inotify_add_watch(void); }
 293	AUE_NULL	STD	{ int linux_inotify_rm_watch(void); }
 294	AUE_NULL	STD	{ int linux_migrate_pages(void); }
-295	AUE_OPEN_RWTC	STD	{ int linux_openat(l_int dfd, char *filename, \
+295	AUE_OPEN_RWTC	STD	{ int linux_openat(l_int dfd, const char *filename, \
 					l_int flags, l_int mode); }
 296	AUE_NULL	STD	{ int linux_mkdirat(l_int dfd, char *pathname, l_int mode); }
 297	AUE_NULL	STD	{ int linux_mknodat(l_int dfd, char *filename, l_int mode, \

==== //depot/projects/linuxolator/src/sys/compat/linux/linux_file.c#26 (text+ko) ====

@@ -67,6 +67,7 @@
 #include <machine/../linux/linux_proto.h>
 #endif
 #include <compat/linux/linux_util.h>
+#include <compat/linux/linux_file.h>
 
 int
 linux_creat(struct thread *td, struct linux_creat_args *args)
@@ -81,14 +82,14 @@
 		printf(ARGS(creat, "%s, %d"), path, args->mode);
 #endif
     error = kern_open(td, path, UIO_SYSSPACE, O_WRONLY | O_CREAT | O_TRUNC,
-	args->mode, -1);
+	args->mode);
     LFREEPATH(path);
     return (error);
 }
 
 
-int
-linux_common_open(struct thread *td, char *path, int l_flags, int mode, int dirfd)
+static int
+linux_common_open(struct thread *td, int dirfd, char *path, int l_flags, int mode)
 {
     struct proc *p = td->td_proc;
     struct file *fp;
@@ -130,7 +131,10 @@
 	bsd_flags |= O_NOFOLLOW;
     /* XXX LINUX_O_NOATIME: unable to be easily implemented. */
 
-    error = kern_open(td, path, UIO_SYSSPACE, bsd_flags, mode, dirfd);
+    if (dirfd != -1)
+	error = kern_openat(td, dirfd, path, UIO_SYSSPACE, bsd_flags, mode);
+    else
+	error = kern_open(td, path, UIO_SYSSPACE, bsd_flags, mode);
     if (!error) {
 	    fd = td->td_retval[0];
 	    /*
@@ -179,8 +183,26 @@
 int
 linux_openat(struct thread *td, struct linux_openat_args *args)
 {
-   	/* this is going to be replaced in the next commit */
-	return (ENOSYS);
+   	char *path;
+	int dfd;
+
+	if (args->dfd == LINUX_AT_FDCWD)
+		dfd = AT_FDCWD;
+	else
+		dfd = args->dfd;
+
+    	if (args->flags & LINUX_O_CREAT)
+		LCONVPATH_AT(td, args->filename, &path, 1, dfd);
+    	else
+		LCONVPATH_AT(td, args->filename, &path, 0, dfd);
+
+#ifdef DEBUG
+	if (ldebug(openat))
+		printf(ARGS(openat, "%i, %s, 0x%x, 0x%x"), args->dfd,
+		    path, args->flags, args->mode);
+#endif
+
+	return linux_common_open(td, dfd, path, args->flags, args->mode);
 }
 
 int
@@ -199,7 +221,7 @@
 		    path, args->flags, args->mode);
 #endif
 
-	return linux_common_open(td, path, args->flags, args->mode, -1);
+    return linux_common_open(td, -1, path, args->flags, args->mode);
 }
 
 int
@@ -542,7 +564,7 @@
 	if (ldebug(access))
 		printf(ARGS(access, "%s, %d"), path, args->flags);
 #endif
-	error = kern_access(td, path, UIO_SYSSPACE, args->flags, -1);
+	error = kern_access(td, path, UIO_SYSSPACE, args->flags);
 	LFREEPATH(path);
 
 	return (error);
@@ -558,19 +580,19 @@
 	if (args->mode & ~(F_OK | X_OK | W_OK | R_OK))
 		return (EINVAL);
 
-	LCONVPATHEXIST(td, args->filename, &path);
+	if (args->dfd == LINUX_AT_FDCWD)
+		dfd = -1;
+	else
+		dfd = args->dfd;
+
+	LCONVPATHEXIST_AT(td, args->filename, &path, dfd);
 
 #ifdef DEBUG
 	if (ldebug(access))
 		printf(ARGS(access, "%s, %d"), path, args->mode);
 #endif
 
-	if (args->dfd == LINUX_AT_FDCWD)
-		dfd = -1;
-	else
-		dfd = args->dfd;
-
-	error = kern_access(td, path, UIO_SYSSPACE, args->mode, dfd);
+	error = kern_accessat(td, dfd, path, UIO_SYSSPACE, args->mode);
 	LFREEPATH(path);
 
 	return (error);
@@ -603,9 +625,37 @@
 int
 linux_unlinkat(struct thread *td, struct linux_unlinkat_args *args)
 {
-	return (ENOSYS);
+	char *path;
+	int error, dfd;
+	struct stat st;
+
+	if (args->flag & ~LINUX_AT_REMOVEDIR)
+		return (EINVAL);
+
+	if (args->dfd == LINUX_AT_FDCWD)
+		dfd = AT_FDCWD;
+	else
+		dfd = args->dfd;
+
+	LCONVPATHEXIST_AT(td, args->pathname, &path, dfd);
+
+#ifdef DEBUG
+	if (ldebug(unlinkat))
+		printf(ARGS(unlinkat, "%s"), path);
+#endif
+
+	if (args->flag & LINUX_AT_REMOVEDIR)
+		error = kern_rmdirat(td, dfd, path, UIO_SYSSPACE);
+	else
+		error = kern_unlinkat(td, dfd, path, UIO_SYSSPACE);
+	if (error == EPERM && !(args->flag & LINUX_AT_REMOVEDIR))
+		/* Introduce POSIX noncompliant behaviour of Linux */
+		if (kern_statat(td, dfd, path, UIO_SYSSPACE, &st) == 0)
+			if (S_ISDIR(st.st_mode))
+				error = EISDIR;
+	LFREEPATH(path);
+	return (error);
 }
-
 int
 linux_chdir(struct thread *td, struct linux_chdir_args *args)
 {
@@ -643,7 +693,24 @@
 int
 linux_fchmodat(struct thread *td, struct linux_fchmodat_args *args)
 {
-	return (ENOSYS);
+	char *path;
+	int error, dfd;
+
+	if (args->dfd == LINUX_AT_FDCWD)
+		dfd = AT_FDCWD;
+	else
+		dfd = args->dfd;
+
+	LCONVPATHEXIST_AT(td, args->filename, &path, dfd);
+
+#ifdef DEBUG
+	if (ldebug(fchmodat))
+		printf(ARGS(fchmodat, "%s, %d"), path, args->mode);
+#endif
+
+	error = kern_chmodat(td, dfd, path, UIO_SYSSPACE, args->mode);
+	LFREEPATH(path);
+	return (error);
 }
 
 int
@@ -666,7 +733,23 @@
 int
 linux_mkdirat(struct thread *td, struct linux_mkdirat_args *args)
 {
-	return (ENOSYS);
+	char *path;
+	int error, dfd;
+
+	if (args->dfd == LINUX_AT_FDCWD)
+		dfd = AT_FDCWD;
+	else
+		dfd = args->dfd;
+
+	LCONVPATHCREAT_AT(td, args->pathname, &path, dfd);
+
+#ifdef DEBUG
+	if (ldebug(mkdirat))
+		printf(ARGS(mkdirat, "%s, %d"), path, args->mode);
+#endif
+	error = kern_mkdirat(td, dfd, path, UIO_SYSSPACE, args->mode);
+	LFREEPATH(path);
+	return (error);
 }
 
 int
@@ -694,7 +777,7 @@
 
 	LCONVPATHEXIST(td, args->from, &from);
 	/* Expand LCONVPATHCREATE so that `from' can be freed on errors */
-	error = linux_emul_convpath(td, args->to, UIO_USERSPACE, &to, 1);
+	error = linux_emul_convpath(td, args->to, UIO_USERSPACE, &to, 1, AT_FDCWD);
 	if (to == NULL) {
 		LFREEPATH(from);
 		return (error);
@@ -713,7 +796,35 @@
 int
 linux_renameat(struct thread *td, struct linux_renameat_args *args)
 {
-	return (ENOSYS);
+	char *from, *to;
+	int error, olddfd, newdfd;
+
+	if (args->olddfd == LINUX_AT_FDCWD)
+		olddfd = AT_FDCWD;
+	else
+		olddfd = args->olddfd;
+
+	if (args->newdfd == LINUX_AT_FDCWD)
+		newdfd = AT_FDCWD;
+	else
+		newdfd = args->newdfd;
+
+	LCONVPATHEXIST_AT(td, args->oldname, &from, olddfd);
+	/* Expand LCONVPATHCREATE so that `from' can be freed on errors */
+	error = linux_emul_convpath(td, args->newname, UIO_USERSPACE, &to, 1, newdfd);
+	if (to == NULL) {
+		LFREEPATH(from);
+		return (error);
+	}
+
+#ifdef DEBUG
+	if (ldebug(renameat))
+		printf(ARGS(renameat, "%s, %s"), from, to);
+#endif
+	error = kern_renameat(td, olddfd, from, newdfd, to, UIO_SYSSPACE);
+	LFREEPATH(from);
+	LFREEPATH(to);
+	return (error);
 }
 
 int
@@ -724,7 +835,7 @@
 
 	LCONVPATHEXIST(td, args->path, &path);
 	/* Expand LCONVPATHCREATE so that `path' can be freed on errors */
-	error = linux_emul_convpath(td, args->to, UIO_USERSPACE, &to, 1);
+	error = linux_emul_convpath(td, args->to, UIO_USERSPACE, &to, 1, AT_FDCWD);
 	if (to == NULL) {
 		LFREEPATH(path);
 		return (error);
@@ -743,7 +854,31 @@
 int
 linux_symlinkat(struct thread *td, struct linux_symlinkat_args *args)
 {
-	return (ENOSYS);
+	char *path, *to;
+	int error, dfd;
+
+	if (args->newdfd == LINUX_AT_FDCWD)
+		dfd = AT_FDCWD;
+	else
+		dfd = args->newdfd;
+
+	LCONVPATHEXIST_AT(td, args->oldname, &path, dfd);
+	/* Expand LCONVPATHCREATE so that `path' can be freed on errors */
+	error = linux_emul_convpath(td, args->newname, UIO_USERSPACE, &to, 1, dfd);
+	if (to == NULL) {
+		LFREEPATH(path);
+		return (error);
+	}
+
+#ifdef DEBUG
+	if (ldebug(symlinkat))
+		printf(ARGS(symlinkat, "%s, %s"), path, to);
+#endif
+
+	error = kern_symlinkat(td, path, dfd, to, UIO_SYSSPACE);
+	LFREEPATH(path);
+	LFREEPATH(to);
+	return (error);
 }
 
 int
@@ -768,9 +903,27 @@
 int
 linux_readlinkat(struct thread *td, struct linux_readlinkat_args *args)
 {
-	return (ENOSYS);
+	char *name;
+	int error, dfd;
+
+	if (args->dfd == LINUX_AT_FDCWD)
+		dfd = AT_FDCWD;
+	else
+		dfd = args->dfd;
+
+	LCONVPATHEXIST_AT(td, args->path, &name, dfd);
+
+#ifdef DEBUG
+	if (ldebug(readlinkat))
+		printf(ARGS(readlinkat, "%s, %p, %d"), name, (void *)args->buf,
+		    args->bufsiz);
+#endif
+
+	error = kern_readlinkat(td, dfd, name, UIO_SYSSPACE, args->buf,
+	    UIO_USERSPACE, args->bufsiz);
+	LFREEPATH(name);
+	return (error);
 }
-
 int
 linux_truncate(struct thread *td, struct linux_truncate_args *args)
 {
@@ -811,7 +964,7 @@
 
 	LCONVPATHEXIST(td, args->path, &path);
 	/* Expand LCONVPATHCREATE so that `path' can be freed on errors */
-	error = linux_emul_convpath(td, args->to, UIO_USERSPACE, &to, 1);
+	error = linux_emul_convpath(td, args->to, UIO_USERSPACE, &to, 1, AT_FDCWD);
 	if (to == NULL) {
 		LFREEPATH(path);
 		return (error);
@@ -830,7 +983,44 @@
 int
 linux_linkat(struct thread *td, struct linux_linkat_args *args)
 {
-	return (ENOSYS);
+	char *path, *to;
+	int error, olddfd, newdfd;
+
+	/* 
+	 * don't laugh they really introduced flags argument
+	 * which is forbidden to use ;)
+	 */
+	if (args->flags != 0)
+		return (EINVAL);
+
+	if (args->olddfd == LINUX_AT_FDCWD)
+		olddfd = AT_FDCWD;
+	else
+		olddfd = args->olddfd;
+
+	if (args->newdfd == LINUX_AT_FDCWD)
+		newdfd = AT_FDCWD;
+	else
+		newdfd = args->newdfd;
+
+	LCONVPATHEXIST_AT(td, args->oldname, &path, olddfd);
+	/* Expand LCONVPATHCREATE so that `path' can be freed on errors */
+	error = linux_emul_convpath(td, args->newname, UIO_USERSPACE, &to, 1, newdfd);
+	if (to == NULL) {
+		LFREEPATH(path);
+		return (error);
+	}
+
+#ifdef DEBUG
+	if (ldebug(linkat))
+		printf(ARGS(linkat, "%i, %s, %i, %s, %i"), args->olddfd, path,
+			args->newdfd, to, args->flags);
+#endif
+
+	error = kern_linkat(td, olddfd, newdfd, path, to, UIO_SYSSPACE, FOLLOW);
+	LFREEPATH(path);
+	LFREEPATH(to);
+	return (error);
 }
 
 int
@@ -1299,6 +1489,35 @@
 }
 
 int
+linux_fchownat(struct thread *td, struct linux_fchownat_args *args)
+{
+	char *path;
+	int error, dfd;
+
+	if (args->flag & ~LINUX_AT_SYMLINK_NOFOLLOW)
+		return (EINVAL);	
+
+	if (args->dfd == LINUX_AT_FDCWD)
+		dfd = AT_FDCWD;
+	else
+		dfd = args->dfd;
+
+	LCONVPATHEXIST_AT(td, args->filename, &path, dfd);
+
+#ifdef DEBUG
+	if (ldebug(fchownat))
+		printf(ARGS(fchownat, "%s, %d, %d"), path, args->uid, args->gid);
+#endif
+
+	if (args->flag & LINUX_AT_SYMLINK_NOFOLLOW)
+		error = kern_lchownat(td, dfd, path, UIO_SYSSPACE, args->uid, args->gid);
+	else
+		error = kern_chownat(td, dfd, path, UIO_SYSSPACE, args->uid, args->gid);
+	LFREEPATH(path);
+	return (error);
+}
+
+int
 linux_lchown(struct thread *td, struct linux_lchown_args *args)
 {
 	char *path;
@@ -1314,16 +1533,3 @@
 	LFREEPATH(path);
 	return (error);
 }
-
-int
-linux_futimesat(struct thread *td, struct linux_futimesat_args *args)
-{
-	return (ENOSYS);
-}
-
-int
-linux_fchownat(struct thread *td, struct linux_fchownat_args *args)
-{
-	return (ENOSYS);
-}
-

==== //depot/projects/linuxolator/src/sys/compat/linux/linux_ioctl.c#4 (text+ko) ====


==== //depot/projects/linuxolator/src/sys/compat/linux/linux_ioctl.h#5 (text+ko) ====


==== //depot/projects/linuxolator/src/sys/compat/linux/linux_misc.c#66 (text+ko) ====

@@ -88,6 +88,7 @@
 #include <machine/../linux/linux_proto.h>
 #endif
 
+#include <compat/linux/linux_file.h>
 #include <compat/linux/linux_mib.h>
 #include <compat/linux/linux_signal.h>
 #include <compat/linux/linux_util.h>
@@ -836,7 +837,44 @@
 	LFREEPATH(fname);
 	return (error);
 }
-#endif /* __i386__ || __amd64__ */
+
+int
+linux_futimesat(struct thread *td, struct linux_futimesat_args *args)
+{
+	l_timeval ltv[2];
+	struct timeval tv[2], *tvp = NULL;
+	char *fname;
+	int error, dfd;
+
+	if (args->dfd == LINUX_AT_FDCWD)
+		dfd = AT_FDCWD;
+	else
+		dfd = args->dfd;
+
+	LCONVPATHEXIST_AT(td, args->filename, &fname, dfd);
+
+#ifdef DEBUG
+	if (ldebug(futimesat))
+		printf(ARGS(futimesat, "%s, *"), fname);
+#endif
+
+	if (args->utimes != NULL) {
+		if ((error = copyin(args->utimes, ltv, sizeof ltv))) {
+			LFREEPATH(fname);
+			return (error);
+		}
+		tv[0].tv_sec = ltv[0].tv_sec;
+		tv[0].tv_usec = ltv[0].tv_usec;
+		tv[1].tv_sec = ltv[1].tv_sec;
+		tv[1].tv_usec = ltv[1].tv_usec;
+		tvp = tv;
+	}
+
+	error = kern_utimesat(td, dfd, fname, UIO_SYSSPACE, tvp, UIO_SYSSPACE);
+	LFREEPATH(fname);
+	return (error);
+}
+#endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */
 
 #define __WCLONE 0x80000000
 
@@ -962,7 +1000,9 @@
 		/* FALLTHROUGH */
 	case S_IFREG:
 		error = kern_open(td, path, UIO_SYSSPACE,
-		    O_WRONLY | O_CREAT | O_TRUNC, args->mode, -1);
+		    O_WRONLY | O_CREAT | O_TRUNC, args->mode);
+		if (error == 0)
+			kern_close(td, td->td_retval[0]);
 		break;
 
 	default:
@@ -976,7 +1016,53 @@
 int
 linux_mknodat(struct thread *td, struct linux_mknodat_args *args)
 {
-	return (ENOSYS);
+	char *path;
+	int error, dfd;
+
+	if (args->dfd == LINUX_AT_FDCWD)
+		dfd = AT_FDCWD;
+	else
+		dfd = args->dfd;
+
+	LCONVPATHCREAT_AT(td, args->filename, &path, dfd);
+
+#ifdef DEBUG
+	if (ldebug(mknodat))
+		printf(ARGS(mknodat, "%s, %d, %d"), path, args->mode, args->dev);
+#endif
+
+	switch (args->mode & S_IFMT) {
+	case S_IFIFO:
+	case S_IFSOCK:
+		error = kern_mkfifoat(td, dfd, path, UIO_SYSSPACE, args->mode);
+		break;
+
+	case S_IFCHR:
+	case S_IFBLK:
+		error = kern_mknodat(td, dfd, path, UIO_SYSSPACE, args->mode,
+		    args->dev);
+		break;
+
+	case S_IFDIR:
+		error = EPERM;
+		break;
+
+	case 0:
+		args->mode |= S_IFREG;
+		/* FALLTHROUGH */
+	case S_IFREG:
+		error = kern_openat(td, dfd, path, UIO_SYSSPACE,
+		    O_WRONLY | O_CREAT | O_TRUNC, args->mode);
+		if (error == 0)
+			kern_close(td, td->td_retval[0]);
+		break;
+
+	default:
+		error = EINVAL;
+		break;
+	}
+	LFREEPATH(path);
+	return (error);
 }
 
 /*

==== //depot/projects/linuxolator/src/sys/compat/linux/linux_stats.c#14 (text+ko) ====

@@ -58,6 +58,7 @@
 #endif
 
 #include <compat/linux/linux_util.h>
+#include <compat/linux/linux_file.h>
 
 #include <security/mac/mac_framework.h>
 
@@ -125,7 +126,27 @@
 	if (!S_ISCHR(buf->st_mode) && !S_ISBLK(buf->st_mode))
 		return;
 	temp = td->td_retval[0];
-	if (kern_open(td, path, UIO_SYSSPACE, O_RDONLY, 0, -1) != 0)
+	if (kern_open(td, path, UIO_SYSSPACE, O_RDONLY, 0) != 0)
+		return;
+	fd = td->td_retval[0];
+	td->td_retval[0] = temp;
+	translate_fd_major_minor(td, fd, buf);
+	fdclose(fdp, fdp->fd_ofiles[fd], fd, td);
+}
+
+static void
+translate_path_major_minor_at(struct thread *td, char *path, struct stat *buf,
+    int dfd)
+{
+	struct proc *p = td->td_proc;	
+	struct filedesc *fdp = p->p_fd;
+	int fd;
+	int temp;
+
+	if (!S_ISCHR(buf->st_mode) && !S_ISBLK(buf->st_mode))
+		return;
+	temp = td->td_retval[0];
+	if (kern_openat(td, dfd, path, UIO_SYSSPACE, O_RDONLY, 0) != 0)
 		return;
 	fd = td->td_retval[0];
 	td->td_retval[0] = temp;
@@ -584,56 +605,39 @@
 	return (error);
 }
 
-/* XXX: racy? */
 int
 linux_fstatat64(struct thread *td, struct linux_fstatat64_args *args)
 {
-	int error;
-	char *path, *newpath;
-	int fd, dfd;
+	char *path;
+	int error, dfd;
 	struct stat buf;
 
-	/* open the file */
-	path = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
-	error = copyinstr(args->pathname, path, MAXPATHLEN, NULL);
-	if (error) {
-		free(path, M_TEMP);
-		return (EFAULT);
-	}
+	if (args->flag & ~LINUX_AT_SYMLINK_NOFOLLOW)
+		return (EINVAL);
+
+	if (args->dfd == LINUX_AT_FDCWD)
+		dfd = AT_FDCWD;
+	else
+		dfd = args->dfd;
 
-	LCONVPATH_SEG(td, path, &newpath, 0, UIO_SYSSPACE);
-	free(path, M_TEMP);
+	LCONVPATHEXIST_AT(td, args->pathname, &path, dfd);
 
 #ifdef DEBUG
 	if (ldebug(fstatat64))
-		printf(ARGS(fstatat64, "%i, %s, %i"), args->dfd, newpath, args->flag);
+		printf(ARGS(fstatat64, "%i, %s, %i"), args->dfd, path, args->flag);
 #endif
 
-	if (args->dfd == LINUX_AT_FDCWD)
-		dfd = -1;
+	if (args->flag & LINUX_AT_SYMLINK_NOFOLLOW)
+		error = kern_lstatat(td, dfd, path, UIO_SYSSPACE, &buf);
 	else
-		dfd = args->dfd;
-
-	error = kern_open(td, newpath, UIO_SYSSPACE, O_RDONLY, 0, dfd);
-	if (error) {
-		LFREEPATH(newpath);
-		return (error);
-	}
-	/* file opened */
-	fd = td->td_retval[0];
-	td->td_retval[0] = 0;
-
-	/* do the actual fstat */
-
-	error = kern_fstat(td, fd, &buf);
-	translate_fd_major_minor(td, fd, &buf);
+		error = kern_statat(td, dfd, path, UIO_SYSSPACE, &buf);
+		
+	translate_path_major_minor_at(td, args->pathname, &buf, dfd);
 	if (!error)
 		error = stat64_copyout(&buf, args->statbuf);
+	LFREEPATH(path);
 	
-	/* close the opened file */
-	kern_close(td, fd);
-	LFREEPATH(newpath);
-	return (0);
+	return (error);
 }
 
 #endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */

==== //depot/projects/linuxolator/src/sys/compat/linux/linux_uid16.c#6 (text+ko) ====

@@ -29,6 +29,7 @@
 
 #include "opt_compat.h"
 
+#include <sys/fcntl.h>
 #include <sys/param.h>
 #include <sys/lock.h>
 #include <sys/malloc.h>

==== //depot/projects/linuxolator/src/sys/compat/linux/linux_util.c#4 (text+ko) ====

@@ -36,6 +36,7 @@
 
 #include <sys/param.h>
 #include <sys/bus.h>
+#include <sys/fcntl.h>
 #include <sys/lock.h>
 #include <sys/malloc.h>
 #include <sys/linker_set.h>
@@ -65,16 +66,17 @@
  * named file, i.e. we check if the directory it should be in exists.
  */
 int
-linux_emul_convpath(td, path, pathseg, pbuf, cflag)
+linux_emul_convpath(td, path, pathseg, pbuf, cflag, dfd)
 	struct thread	 *td;
-	char		 *path;
+	const char	 *path;
 	enum uio_seg	  pathseg;
 	char		**pbuf;
 	int		  cflag;
+	int		  dfd;		
 {
 
-	return (kern_alternate_path(td, linux_emul_path, path, pathseg, pbuf,
-		cflag));
+	return kern_alternate_path(td, linux_emul_path, path, pathseg, pbuf,
+		cflag, dfd);
 }
 
 void

==== //depot/projects/linuxolator/src/sys/compat/linux/linux_util.h#6 (text+ko) ====

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list