diff options
author | Alasdair Kergon <agk@redhat.com> | 2005-10-17 17:56:27 +0000 |
---|---|---|
committer | Alasdair Kergon <agk@redhat.com> | 2005-10-17 17:56:27 +0000 |
commit | a653923fe70a81a0a78a0d4cb6d2d18144fc57e6 (patch) | |
tree | 6ca926ecd83de47e63d3874e6144a6e0c32f3627 /lib/misc/lvm-exec.c | |
parent | 191abde97efc6c0a262b2d69ccfccdd53d1b26a6 (diff) | |
download | lvm2-a653923fe70a81a0a78a0d4cb6d2d18144fc57e6.tar.gz lvm2-a653923fe70a81a0a78a0d4cb6d2d18144fc57e6.tar.xz lvm2-a653923fe70a81a0a78a0d4cb6d2d18144fc57e6.zip |
Attempt to load missing targets using modprobe.
Diffstat (limited to 'lib/misc/lvm-exec.c')
-rw-r--r-- | lib/misc/lvm-exec.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/misc/lvm-exec.c b/lib/misc/lvm-exec.c new file mode 100644 index 00000000..209a2cc5 --- /dev/null +++ b/lib/misc/lvm-exec.c @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. + * Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved. + * + * This file is part of LVM2. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU General Public License v.2. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "lib.h" +#include "lvm-exec.h" + +#include <unistd.h> +#include <sys/wait.h> + +/* + * Execute and wait for external command + */ +int exec_cmd(const char *command, const char *fscmd, const char *lv_path, + const char *size) +{ + pid_t pid; + int status; + + log_verbose("Executing: %s %s %s %s", command, fscmd, lv_path, size); + + if ((pid = fork()) == -1) { + log_error("fork failed: %s", strerror(errno)); + return 0; + } + + if (!pid) { + /* Child */ + /* FIXME Use execve directly */ + execlp(command, command, fscmd, lv_path, size, NULL); + log_sys_error("execlp", command); + exit(errno); + } + + /* Parent */ + if (wait4(pid, &status, 0, NULL) != pid) { + log_error("wait4 child process %u failed: %s", pid, + strerror(errno)); + return 0; + } + + if (!WIFEXITED(status)) { + log_error("Child %u exited abnormally", pid); + return 0; + } + + if (WEXITSTATUS(status)) { + log_error("%s failed: %u", command, WEXITSTATUS(status)); + return 0; + } + + return 1; +} |