Move the convert_sigevent32() utility function into freebsd32_misc.c
for consumption outside the vfs_aio.c. For SIGEV_THREAD_ID and SIGEV_SIGNAL notification delivery methods, also copy in the sigev_value, since librt event pumping loop compares note generation number with the value passed through sigev_value. Tested by: Petr Salinger <Petr.Salinger@seznam.cz> Sponsored by: The FreeBSD Foundation MFC after: 1 week
This commit is contained in:
parent
a81c9a9468
commit
9731998997
@ -2912,3 +2912,29 @@ freebsd32_posix_fadvise(struct thread *td,
|
||||
return (kern_posix_fadvise(td, uap->fd, PAIR32TO64(off_t, uap->offset),
|
||||
PAIR32TO64(off_t, uap->len), uap->advice));
|
||||
}
|
||||
|
||||
int
|
||||
convert_sigevent32(struct sigevent32 *sig32, struct sigevent *sig)
|
||||
{
|
||||
|
||||
CP(*sig32, *sig, sigev_notify);
|
||||
switch (sig->sigev_notify) {
|
||||
case SIGEV_NONE:
|
||||
break;
|
||||
case SIGEV_THREAD_ID:
|
||||
CP(*sig32, *sig, sigev_notify_thread_id);
|
||||
/* FALLTHROUGH */
|
||||
case SIGEV_SIGNAL:
|
||||
CP(*sig32, *sig, sigev_signo);
|
||||
PTRIN_CP(*sig32, *sig, sigev_value.sival_ptr);
|
||||
break;
|
||||
case SIGEV_KEVENT:
|
||||
CP(*sig32, *sig, sigev_notify_kqueue);
|
||||
CP(*sig32, *sig, sigev_notify_kevent_flags);
|
||||
PTRIN_CP(*sig32, *sig, sigev_value.sival_ptr);
|
||||
break;
|
||||
default:
|
||||
return (EINVAL);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
@ -97,6 +97,8 @@ struct sigevent32 {
|
||||
} _sigev_un;
|
||||
};
|
||||
|
||||
struct sigevent;
|
||||
int convert_sigevent32(struct sigevent32 *sig32, struct sigevent *sig);
|
||||
void siginfo_to_siginfo32(const siginfo_t *src, struct siginfo32 *dst);
|
||||
|
||||
#endif /* !_COMPAT_FREEBSD32_SIGNAL_H_ */
|
||||
|
@ -2754,31 +2754,6 @@ aiocb32_copyin_old_sigevent(struct aiocb *ujob, struct aiocb *kjob)
|
||||
&kjob->aio_sigevent));
|
||||
}
|
||||
|
||||
static int
|
||||
convert_sigevent32(struct sigevent32 *sig32, struct sigevent *sig)
|
||||
{
|
||||
|
||||
CP(*sig32, *sig, sigev_notify);
|
||||
switch (sig->sigev_notify) {
|
||||
case SIGEV_NONE:
|
||||
break;
|
||||
case SIGEV_THREAD_ID:
|
||||
CP(*sig32, *sig, sigev_notify_thread_id);
|
||||
/* FALLTHROUGH */
|
||||
case SIGEV_SIGNAL:
|
||||
CP(*sig32, *sig, sigev_signo);
|
||||
break;
|
||||
case SIGEV_KEVENT:
|
||||
CP(*sig32, *sig, sigev_notify_kqueue);
|
||||
CP(*sig32, *sig, sigev_notify_kevent_flags);
|
||||
PTRIN_CP(*sig32, *sig, sigev_value.sival_ptr);
|
||||
break;
|
||||
default:
|
||||
return (EINVAL);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
aiocb32_copyin(struct aiocb *ujob, struct aiocb *kjob)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user