mirror of https://github.com/xemu-project/xemu.git
util: drop qemu_fork()
Fortunately, qemu_fork() is no longer used since commit
a95570e3e4
("io/command: use glib GSpawn, instead of open-coding
fork/exec"). (GSpawn uses posix_spawn() whenever possible instead)
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Message-Id: <20230221124802.4103554-2-marcandre.lureau@redhat.com>
This commit is contained in:
parent
29c8a9e31a
commit
8278e30c45
|
@ -665,20 +665,6 @@ void qemu_prealloc_mem(int fd, char *area, size_t sz, int max_threads,
|
||||||
*/
|
*/
|
||||||
char *qemu_get_pid_name(pid_t pid);
|
char *qemu_get_pid_name(pid_t pid);
|
||||||
|
|
||||||
/**
|
|
||||||
* qemu_fork:
|
|
||||||
*
|
|
||||||
* A version of fork that avoids signal handler race
|
|
||||||
* conditions that can lead to child process getting
|
|
||||||
* signals that are otherwise only expected by the
|
|
||||||
* parent. It also resets all signal handlers to the
|
|
||||||
* default settings.
|
|
||||||
*
|
|
||||||
* Returns 0 to child process, pid number to parent
|
|
||||||
* or -1 on failure.
|
|
||||||
*/
|
|
||||||
pid_t qemu_fork(Error **errp);
|
|
||||||
|
|
||||||
/* Using intptr_t ensures that qemu_*_page_mask is sign-extended even
|
/* Using intptr_t ensures that qemu_*_page_mask is sign-extended even
|
||||||
* when intptr_t is 32-bit and we are aligning a long long.
|
* when intptr_t is 32-bit and we are aligning a long long.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -583,76 +583,6 @@ char *qemu_get_pid_name(pid_t pid)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pid_t qemu_fork(Error **errp)
|
|
||||||
{
|
|
||||||
sigset_t oldmask, newmask;
|
|
||||||
struct sigaction sig_action;
|
|
||||||
int saved_errno;
|
|
||||||
pid_t pid;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Need to block signals now, so that child process can safely
|
|
||||||
* kill off caller's signal handlers without a race.
|
|
||||||
*/
|
|
||||||
sigfillset(&newmask);
|
|
||||||
if (pthread_sigmask(SIG_SETMASK, &newmask, &oldmask) != 0) {
|
|
||||||
error_setg_errno(errp, errno,
|
|
||||||
"cannot block signals");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pid = fork();
|
|
||||||
saved_errno = errno;
|
|
||||||
|
|
||||||
if (pid < 0) {
|
|
||||||
/* attempt to restore signal mask, but ignore failure, to
|
|
||||||
* avoid obscuring the fork failure */
|
|
||||||
(void)pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
|
|
||||||
error_setg_errno(errp, saved_errno,
|
|
||||||
"cannot fork child process");
|
|
||||||
errno = saved_errno;
|
|
||||||
return -1;
|
|
||||||
} else if (pid) {
|
|
||||||
/* parent process */
|
|
||||||
|
|
||||||
/* Restore our original signal mask now that the child is
|
|
||||||
* safely running. Only documented failures are EFAULT (not
|
|
||||||
* possible, since we are using just-grabbed mask) or EINVAL
|
|
||||||
* (not possible, since we are using correct arguments). */
|
|
||||||
(void)pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
|
|
||||||
} else {
|
|
||||||
/* child process */
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
/* Clear out all signal handlers from parent so nothing
|
|
||||||
* unexpected can happen in our child once we unblock
|
|
||||||
* signals */
|
|
||||||
sig_action.sa_handler = SIG_DFL;
|
|
||||||
sig_action.sa_flags = 0;
|
|
||||||
sigemptyset(&sig_action.sa_mask);
|
|
||||||
|
|
||||||
for (i = 1; i < NSIG; i++) {
|
|
||||||
/* Only possible errors are EFAULT or EINVAL The former
|
|
||||||
* won't happen, the latter we expect, so no need to check
|
|
||||||
* return value */
|
|
||||||
(void)sigaction(i, &sig_action, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Unmask all signals in child, since we've no idea what the
|
|
||||||
* caller's done with their signal mask and don't want to
|
|
||||||
* propagate that to children */
|
|
||||||
sigemptyset(&newmask);
|
|
||||||
if (pthread_sigmask(SIG_SETMASK, &newmask, NULL) != 0) {
|
|
||||||
Error *local_err = NULL;
|
|
||||||
error_setg_errno(&local_err, errno,
|
|
||||||
"cannot unblock signals");
|
|
||||||
error_report_err(local_err);
|
|
||||||
_exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return pid;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *qemu_alloc_stack(size_t *sz)
|
void *qemu_alloc_stack(size_t *sz)
|
||||||
{
|
{
|
||||||
void *ptr, *guardpage;
|
void *ptr, *guardpage;
|
||||||
|
|
|
@ -283,15 +283,6 @@ char *qemu_get_pid_name(pid_t pid)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pid_t qemu_fork(Error **errp)
|
|
||||||
{
|
|
||||||
errno = ENOSYS;
|
|
||||||
error_setg_errno(errp, errno,
|
|
||||||
"cannot fork child process");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#undef connect
|
#undef connect
|
||||||
int qemu_connect_wrap(int sockfd, const struct sockaddr *addr,
|
int qemu_connect_wrap(int sockfd, const struct sockaddr *addr,
|
||||||
socklen_t addrlen)
|
socklen_t addrlen)
|
||||||
|
|
Loading…
Reference in New Issue