From owner-p4-projects@FreeBSD.ORG Sun Oct 7 17:27:26 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 99EA516A41A; Sun, 7 Oct 2007 17:27:25 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0553516A418 for ; Sun, 7 Oct 2007 17:27:25 +0000 (UTC) (envelope-from rdivacky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id E565313C465 for ; Sun, 7 Oct 2007 17:27:24 +0000 (UTC) (envelope-from rdivacky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l97HROni085732 for ; Sun, 7 Oct 2007 17:27:24 GMT (envelope-from rdivacky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l97HRN8V085729 for perforce@freebsd.org; Sun, 7 Oct 2007 17:27:23 GMT (envelope-from rdivacky@FreeBSD.org) Date: Sun, 7 Oct 2007 17:27:23 GMT Message-Id: <200710071727.l97HRN8V085729@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to rdivacky@FreeBSD.org using -f From: Roman Divacky To: Perforce Change Reviews Cc: Subject: PERFORCE change 127283 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 07 Oct 2007 17:27:26 -0000 http://perforce.freebsd.org/chv.cgi?CH=127283 Change 127283 by rdivacky@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 ==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_sysvec.c#15 (text+ko) ==== @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -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 #endif #include +#include 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 #endif +#include #include #include #include @@ -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 +#include #include @@ -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 #include #include #include ==== //depot/projects/linuxolator/src/sys/compat/linux/linux_util.c#4 (text+ko) ==== @@ -36,6 +36,7 @@ #include #include +#include #include #include #include @@ -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) <<<