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