Date: Sun, 24 Feb 2013 11:31:00 +0000 (UTC) From: Dmitry Chagin <dchagin@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r247219 - in user/dchagin/lemul/sys: amd64/linux32 compat/linux i386/linux Message-ID: <201302241131.r1OBV0c0012664@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: dchagin Date: Sun Feb 24 11:31:00 2013 New Revision: 247219 URL: http://svnweb.freebsd.org/changeset/base/247219 Log: Implement waitid() system call. Modified: user/dchagin/lemul/sys/amd64/linux32/linux32_dummy.c user/dchagin/lemul/sys/amd64/linux32/linux32_machdep.c user/dchagin/lemul/sys/amd64/linux32/syscalls.master user/dchagin/lemul/sys/compat/linux/linux_misc.h user/dchagin/lemul/sys/i386/linux/linux_dummy.c user/dchagin/lemul/sys/i386/linux/linux_machdep.c user/dchagin/lemul/sys/i386/linux/syscalls.master Modified: user/dchagin/lemul/sys/amd64/linux32/linux32_dummy.c ============================================================================== --- user/dchagin/lemul/sys/amd64/linux32/linux32_dummy.c Sun Feb 24 11:28:51 2013 (r247218) +++ user/dchagin/lemul/sys/amd64/linux32/linux32_dummy.c Sun Feb 24 11:31:00 2013 (r247219) @@ -90,7 +90,6 @@ DUMMY(mq_timedreceive); DUMMY(mq_notify); DUMMY(mq_getsetattr); DUMMY(kexec_load); -DUMMY(waitid); /* linux 2.6.11: */ DUMMY(add_key); DUMMY(request_key); Modified: user/dchagin/lemul/sys/amd64/linux32/linux32_machdep.c ============================================================================== --- user/dchagin/lemul/sys/amd64/linux32/linux32_machdep.c Sun Feb 24 11:28:51 2013 (r247218) +++ user/dchagin/lemul/sys/amd64/linux32/linux32_machdep.c Sun Feb 24 11:31:00 2013 (r247219) @@ -1046,3 +1046,64 @@ linux_wait4(struct thread *td, struct li return (error); } + +int +linux_waitid(struct thread *td, struct linux_waitid_args *args) +{ + int status, options, sig; + struct __wrusage wru; + struct l_rusage lru; + siginfo_t siginfo; + l_siginfo_t lsi; + idtype_t idtype; + int error; + + options = 0; + linux_to_bsd_waitopts(args->options, &options); + + if (options & ~(WNOHANG | WNOWAIT | WEXITED | WUNTRACED | WCONTINUED)) + return (EINVAL); + if (!(options & (WEXITED | WUNTRACED | WCONTINUED))) + return (EINVAL); + + switch (args->idtype) { + case LINUX_P_ALL: + idtype = P_ALL; + break; + case LINUX_P_PID: + if (args->id <= 0) + return (EINVAL); + idtype = P_PID; + break; + case LINUX_P_PGID: + if (args->id <= 0) + return (EINVAL); + idtype = P_PGID; + break; + default: + return (EINVAL); + } + + error = kern_wait6(td, idtype, args->id, &status, options, + &wru, &siginfo); + if (error) + return (error); + td->td_retval[0] = 0; + + if (args->rusage != NULL) { + bsd_to_linux_rusage(&wru.wru_children, &lru); + error = copyout(&lru, args->rusage, sizeof(lru)); + if (error) + return (error); + } + + if (args->info != NULL) { + sig = siginfo.si_signo; + if (siginfo.si_signo <= td->td_proc->p_sysent->sv_sigsize) + sig = td->td_proc->p_sysent->sv_sigtbl[_SIG_IDX(sig)]; + siginfo_to_lsiginfo(&siginfo, &lsi, sig); + error = copyout(&lsi, args->info, sizeof(lsi)); + } + + return (error); +} Modified: user/dchagin/lemul/sys/amd64/linux32/syscalls.master ============================================================================== --- user/dchagin/lemul/sys/amd64/linux32/syscalls.master Sun Feb 24 11:28:51 2013 (r247218) +++ user/dchagin/lemul/sys/amd64/linux32/syscalls.master Sun Feb 24 11:31:00 2013 (r247219) @@ -464,7 +464,8 @@ 281 AUE_NULL STD { int linux_mq_notify(void); } 282 AUE_NULL STD { int linux_mq_getsetattr(void); } 283 AUE_NULL STD { int linux_kexec_load(void); } -284 AUE_NULL STD { int linux_waitid(void); } +284 AUE_WAIT6 STD { int linux_waitid(int idtype, l_pid_t id, l_siginfo_t *info, \ + int options, struct l_rusage *rusage); } 285 AUE_NULL UNIMPL ; linux 2.6.11: 286 AUE_NULL STD { int linux_add_key(void); } Modified: user/dchagin/lemul/sys/compat/linux/linux_misc.h ============================================================================== --- user/dchagin/lemul/sys/compat/linux/linux_misc.h Sun Feb 24 11:28:51 2013 (r247218) +++ user/dchagin/lemul/sys/compat/linux/linux_misc.h Sun Feb 24 11:31:00 2013 (r247219) @@ -122,6 +122,12 @@ extern int stclohz; #define __WALL 0x40000000 #define __WCLONE 0x80000000 +/* Linux waitid idtype */ +#define LINUX_P_ALL 0 +#define LINUX_P_PID 1 +#define LINUX_P_PGID 2 + + int linux_common_wait(struct thread *td, int pid, int *status, int options, struct rusage *ru); void linux_to_bsd_waitopts(int options, int *bsdopts); Modified: user/dchagin/lemul/sys/i386/linux/linux_dummy.c ============================================================================== --- user/dchagin/lemul/sys/i386/linux/linux_dummy.c Sun Feb 24 11:28:51 2013 (r247218) +++ user/dchagin/lemul/sys/i386/linux/linux_dummy.c Sun Feb 24 11:31:00 2013 (r247219) @@ -81,7 +81,6 @@ DUMMY(mbind); DUMMY(get_mempolicy); DUMMY(set_mempolicy); DUMMY(kexec_load); -DUMMY(waitid); /* linux 2.6.11: */ DUMMY(add_key); DUMMY(request_key); Modified: user/dchagin/lemul/sys/i386/linux/linux_machdep.c ============================================================================== --- user/dchagin/lemul/sys/i386/linux/linux_machdep.c Sun Feb 24 11:28:51 2013 (r247218) +++ user/dchagin/lemul/sys/i386/linux/linux_machdep.c Sun Feb 24 11:31:00 2013 (r247219) @@ -1097,3 +1097,63 @@ linux_wait4(struct thread *td, struct li return (error); } + +int +linux_waitid(struct thread *td, struct linux_waitid_args *args) +{ + int status, options, sig; + struct __wrusage wru; + siginfo_t siginfo; + l_siginfo_t lsi; + idtype_t idtype; + int error; + + options = 0; + linux_to_bsd_waitopts(args->options, &options); + + if (options & ~(WNOHANG | WNOWAIT | WEXITED | WUNTRACED | WCONTINUED)) + return (EINVAL); + if (!(options & (WEXITED | WUNTRACED | WCONTINUED))) + return (EINVAL); + + switch (args->idtype) { + case LINUX_P_ALL: + idtype = P_ALL; + break; + case LINUX_P_PID: + if (args->id <= 0) + return (EINVAL); + idtype = P_PID; + break; + case LINUX_P_PGID: + if (args->id <= 0) + return (EINVAL); + idtype = P_PGID; + break; + default: + return (EINVAL); + } + + error = kern_wait6(td, idtype, args->id, &status, options, + &wru, &siginfo); + if (error) + return (error); + td->td_retval[0] = 0; + + if (args->rusage != NULL) { + error = copyout(&wru.wru_children, args->rusage, + sizeof(wru.wru_children)); + if (error) + return (error); + } + + if (args->info != NULL) { + sig = siginfo.si_signo; + if (siginfo.si_signo <= td->td_proc->p_sysent->sv_sigsize) + sig = td->td_proc->p_sysent->sv_sigtbl[_SIG_IDX(sig)]; + siginfo_to_lsiginfo(&siginfo, &lsi, sig); + error = copyout(&lsi, args->info, sizeof(lsi)); + } + + return (error); +} Modified: user/dchagin/lemul/sys/i386/linux/syscalls.master ============================================================================== --- user/dchagin/lemul/sys/i386/linux/syscalls.master Sun Feb 24 11:28:51 2013 (r247218) +++ user/dchagin/lemul/sys/i386/linux/syscalls.master Sun Feb 24 11:31:00 2013 (r247219) @@ -474,7 +474,8 @@ 282 AUE_NULL STD { int linux_mq_getsetattr(l_mqd_t mqd, const struct mq_attr *attr, \ struct mq_attr *oattr); } 283 AUE_NULL STD { int linux_kexec_load(void); } -284 AUE_NULL STD { int linux_waitid(void); } +284 AUE_WAIT6 STD { int linux_waitid(int idtype, l_pid_t id, l_siginfo_t *info, \ + int options, struct l_rusage *rusage); } 285 AUE_NULL UNIMPL ; linux 2.6.11: 286 AUE_NULL STD { int linux_add_key(void); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201302241131.r1OBV0c0012664>