|
@@ -902,3 +902,30 @@ asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t *uinfo)
|
|
|
set_fs (old_fs);
|
|
|
return ret;
|
|
|
}
|
|
|
+
|
|
|
+asmlinkage long
|
|
|
+sys32_waitid(int which, compat_pid_t pid,
|
|
|
+ compat_siginfo_t __user *uinfo, int options,
|
|
|
+ struct compat_rusage __user *uru)
|
|
|
+{
|
|
|
+ siginfo_t info;
|
|
|
+ struct rusage ru;
|
|
|
+ long ret;
|
|
|
+ mm_segment_t old_fs = get_fs();
|
|
|
+
|
|
|
+ info.si_signo = 0;
|
|
|
+ set_fs (KERNEL_DS);
|
|
|
+ ret = sys_waitid(which, pid, (siginfo_t __user *) &info, options,
|
|
|
+ uru ? (struct rusage __user *) &ru : NULL);
|
|
|
+ set_fs (old_fs);
|
|
|
+
|
|
|
+ if (ret < 0 || info.si_signo == 0)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ if (uru && (ret = put_compat_rusage(&ru, uru)))
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ BUG_ON(info.si_code & __SI_MASK);
|
|
|
+ info.si_code |= __SI_CHLD;
|
|
|
+ return copy_siginfo_to_user32(uinfo, &info);
|
|
|
+}
|