Implement pselect6() system call.
Differential Revision: https://reviews.freebsd.org/D1051 Reviewed by: trasz
This commit is contained in:
parent
e7fa9de6eb
commit
ae50b4d7b5
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=283403
@ -95,7 +95,6 @@ DUMMY(inotify_add_watch);
|
|||||||
DUMMY(inotify_rm_watch);
|
DUMMY(inotify_rm_watch);
|
||||||
/* linux 2.6.16: */
|
/* linux 2.6.16: */
|
||||||
DUMMY(migrate_pages);
|
DUMMY(migrate_pages);
|
||||||
DUMMY(pselect6);
|
|
||||||
DUMMY(ppoll);
|
DUMMY(ppoll);
|
||||||
DUMMY(unshare);
|
DUMMY(unshare);
|
||||||
/* linux 2.6.17: */
|
/* linux 2.6.17: */
|
||||||
|
@ -508,7 +508,9 @@
|
|||||||
306 AUE_FCHMODAT STD { int linux_fchmodat(l_int dfd, const char *filename, \
|
306 AUE_FCHMODAT STD { int linux_fchmodat(l_int dfd, const char *filename, \
|
||||||
l_mode_t mode); }
|
l_mode_t mode); }
|
||||||
307 AUE_FACCESSAT STD { int linux_faccessat(l_int dfd, const char *filename, l_int amode, int flag); }
|
307 AUE_FACCESSAT STD { int linux_faccessat(l_int dfd, const char *filename, l_int amode, int flag); }
|
||||||
308 AUE_NULL STD { int linux_pselect6(void); }
|
308 AUE_SELECT STD { int linux_pselect6(l_int nfds, l_fd_set *readfds, \
|
||||||
|
l_fd_set *writefds, l_fd_set *exceptfds, \
|
||||||
|
struct l_timespec *tsp, l_uintptr_t *sig); }
|
||||||
309 AUE_NULL STD { int linux_ppoll(void); }
|
309 AUE_NULL STD { int linux_ppoll(void); }
|
||||||
310 AUE_NULL STD { int linux_unshare(void); }
|
310 AUE_NULL STD { int linux_unshare(void); }
|
||||||
; linux 2.6.17:
|
; linux 2.6.17:
|
||||||
|
@ -116,6 +116,12 @@ struct l_sysinfo {
|
|||||||
l_uint mem_unit;
|
l_uint mem_unit;
|
||||||
char _f[20-2*sizeof(l_long)-sizeof(l_int)]; /* padding */
|
char _f[20-2*sizeof(l_long)-sizeof(l_int)]; /* padding */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct l_pselect6arg {
|
||||||
|
l_uintptr_t ss;
|
||||||
|
l_size_t ss_len;
|
||||||
|
};
|
||||||
|
|
||||||
int
|
int
|
||||||
linux_sysinfo(struct thread *td, struct linux_sysinfo_args *args)
|
linux_sysinfo(struct thread *td, struct linux_sysinfo_args *args)
|
||||||
{
|
{
|
||||||
@ -2107,6 +2113,84 @@ linux_prlimit64(struct thread *td, struct linux_prlimit64_args *args)
|
|||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
linux_pselect6(struct thread *td, struct linux_pselect6_args *args)
|
||||||
|
{
|
||||||
|
struct timeval utv, tv0, tv1, *tvp;
|
||||||
|
struct l_pselect6arg lpse6;
|
||||||
|
struct l_timespec lts;
|
||||||
|
struct timespec uts;
|
||||||
|
l_sigset_t l_ss;
|
||||||
|
sigset_t *ssp;
|
||||||
|
sigset_t ss;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
ssp = NULL;
|
||||||
|
if (args->sig != NULL) {
|
||||||
|
error = copyin(args->sig, &lpse6, sizeof(lpse6));
|
||||||
|
if (error != 0)
|
||||||
|
return (error);
|
||||||
|
if (lpse6.ss_len != sizeof(l_ss))
|
||||||
|
return (EINVAL);
|
||||||
|
if (lpse6.ss != 0) {
|
||||||
|
error = copyin(PTRIN(lpse6.ss), &l_ss,
|
||||||
|
sizeof(l_ss));
|
||||||
|
if (error != 0)
|
||||||
|
return (error);
|
||||||
|
linux_to_bsd_sigset(&l_ss, &ss);
|
||||||
|
ssp = &ss;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Currently glibc changes nanosecond number to microsecond.
|
||||||
|
* This mean losing precision but for now it is hardly seen.
|
||||||
|
*/
|
||||||
|
if (args->tsp != NULL) {
|
||||||
|
error = copyin(args->tsp, <s, sizeof(lts));
|
||||||
|
if (error != 0)
|
||||||
|
return (error);
|
||||||
|
uts.tv_sec = lts.tv_sec;
|
||||||
|
uts.tv_nsec = lts.tv_nsec;
|
||||||
|
|
||||||
|
TIMESPEC_TO_TIMEVAL(&utv, &uts);
|
||||||
|
if (itimerfix(&utv))
|
||||||
|
return (EINVAL);
|
||||||
|
|
||||||
|
microtime(&tv0);
|
||||||
|
tvp = &utv;
|
||||||
|
} else
|
||||||
|
tvp = NULL;
|
||||||
|
|
||||||
|
error = kern_pselect(td, args->nfds, args->readfds, args->writefds,
|
||||||
|
args->exceptfds, tvp, ssp, sizeof(l_int) * 8);
|
||||||
|
|
||||||
|
if (error == 0 && args->tsp != NULL) {
|
||||||
|
if (td->td_retval[0] != 0) {
|
||||||
|
/*
|
||||||
|
* Compute how much time was left of the timeout,
|
||||||
|
* by subtracting the current time and the time
|
||||||
|
* before we started the call, and subtracting
|
||||||
|
* that result from the user-supplied value.
|
||||||
|
*/
|
||||||
|
|
||||||
|
microtime(&tv1);
|
||||||
|
timevalsub(&tv1, &tv0);
|
||||||
|
timevalsub(&utv, &tv1);
|
||||||
|
if (utv.tv_sec < 0)
|
||||||
|
timevalclear(&utv);
|
||||||
|
} else
|
||||||
|
timevalclear(&utv);
|
||||||
|
|
||||||
|
TIMEVAL_TO_TIMESPEC(&utv, &uts);
|
||||||
|
lts.tv_sec = uts.tv_sec;
|
||||||
|
lts.tv_nsec = uts.tv_nsec;
|
||||||
|
error = copyout(<s, args->tsp, sizeof(lts));
|
||||||
|
}
|
||||||
|
|
||||||
|
return (error);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
linux_sched_rr_get_interval(struct thread *td,
|
linux_sched_rr_get_interval(struct thread *td,
|
||||||
struct linux_sched_rr_get_interval_args *uap)
|
struct linux_sched_rr_get_interval_args *uap)
|
||||||
|
@ -91,7 +91,6 @@ DUMMY(inotify_add_watch);
|
|||||||
DUMMY(inotify_rm_watch);
|
DUMMY(inotify_rm_watch);
|
||||||
/* linux 2.6.16: */
|
/* linux 2.6.16: */
|
||||||
DUMMY(migrate_pages);
|
DUMMY(migrate_pages);
|
||||||
DUMMY(pselect6);
|
|
||||||
DUMMY(ppoll);
|
DUMMY(ppoll);
|
||||||
DUMMY(unshare);
|
DUMMY(unshare);
|
||||||
/* linux 2.6.17: */
|
/* linux 2.6.17: */
|
||||||
|
@ -516,7 +516,9 @@
|
|||||||
306 AUE_FCHMODAT STD { int linux_fchmodat(l_int dfd, const char *filename, \
|
306 AUE_FCHMODAT STD { int linux_fchmodat(l_int dfd, const char *filename, \
|
||||||
l_mode_t mode); }
|
l_mode_t mode); }
|
||||||
307 AUE_FACCESSAT STD { int linux_faccessat(l_int dfd, const char *filename, l_int amode, l_int flag); }
|
307 AUE_FACCESSAT STD { int linux_faccessat(l_int dfd, const char *filename, l_int amode, l_int flag); }
|
||||||
308 AUE_NULL STD { int linux_pselect6(void); }
|
308 AUE_SELECT STD { int linux_pselect6(l_int nfds, l_fd_set *readfds, \
|
||||||
|
l_fd_set *writefds, l_fd_set *exceptfds, \
|
||||||
|
struct l_timespec *tsp, l_uintptr_t *sig); }
|
||||||
309 AUE_NULL STD { int linux_ppoll(void); }
|
309 AUE_NULL STD { int linux_ppoll(void); }
|
||||||
310 AUE_NULL STD { int linux_unshare(void); }
|
310 AUE_NULL STD { int linux_unshare(void); }
|
||||||
; linux 2.6.17:
|
; linux 2.6.17:
|
||||||
|
Loading…
Reference in New Issue
Block a user