Blame lib/exec.c

Packit Service 3880ab
/* SPDX-License-Identifier: GPL-2.0 */
Packit Service 3880ab
#include <sys/wait.h>
Packit Service 3880ab
#include <stdio.h>
Packit Service 3880ab
#include <errno.h>
Packit Service 3880ab
#include <unistd.h>
Packit Service 3880ab
Packit Service 3880ab
#include "utils.h"
Packit Service 3880ab
#include "namespace.h"
Packit Service 3880ab
Packit Service 3880ab
int cmd_exec(const char *cmd, char **argv, bool do_fork,
Packit Service 3880ab
	     int (*setup)(void *), void *arg)
Packit Service 3880ab
{
Packit Service 3880ab
	fflush(stdout);
Packit Service 3880ab
	if (do_fork) {
Packit Service 3880ab
		int status;
Packit Service 3880ab
		pid_t pid;
Packit Service 3880ab
Packit Service 3880ab
		pid = fork();
Packit Service 3880ab
		if (pid < 0) {
Packit Service 3880ab
			perror("fork");
Packit Service 3880ab
			exit(1);
Packit Service 3880ab
		}
Packit Service 3880ab
Packit Service 3880ab
		if (pid != 0) {
Packit Service 3880ab
			/* Parent  */
Packit Service 3880ab
			if (waitpid(pid, &status, 0) < 0) {
Packit Service 3880ab
				perror("waitpid");
Packit Service 3880ab
				exit(1);
Packit Service 3880ab
			}
Packit Service 3880ab
Packit Service 3880ab
			if (WIFEXITED(status)) {
Packit Service 3880ab
				return WEXITSTATUS(status);
Packit Service 3880ab
			}
Packit Service 3880ab
Packit Service 3880ab
			exit(1);
Packit Service 3880ab
		}
Packit Service 3880ab
	}
Packit Service 3880ab
Packit Service 3880ab
	if (setup && setup(arg))
Packit Service 3880ab
		return -1;
Packit Service 3880ab
Packit Service 3880ab
	if (execvp(cmd, argv)  < 0)
Packit Service 3880ab
		fprintf(stderr, "exec of \"%s\" failed: %s\n",
Packit Service 3880ab
				cmd, strerror(errno));
Packit Service 3880ab
	_exit(1);
Packit Service 3880ab
}