Turn doPwMount() in to a mount command wrapper. We're already calling
mount(8) and capturing error messages so we can pass them back up to our
Python code, so the same for unmounting filesystems.
---
isys/imount.c | 127 +++++++++++++++++++++++++++++++++++++--------------------
isys/imount.h | 7 +++-
2 files changed, 89 insertions(+), 45 deletions(-)
diff --git a/isys/imount.c b/isys/imount.c
index fd51fde..1579ed5 100644
--- a/isys/imount.c
+++ b/isys/imount.c
@@ -1,7 +1,7 @@
/*
* imount.c
*
- * Copyright (C) 2007, 2008 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2007, 2008, 2009 Red Hat, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -68,44 +68,58 @@ static int readFD(int fd, char **buf) {
return filesize;
}
-int doPwMount(char *dev, char *where, char *fs, char *options, char **err) {
+int mountCommandWrapper(int mode, char *dev, char *where, char *fs,
+ char *options, char **err) {
int rc, child, status, pipefd[2];
- char *opts = NULL, *device;
+ char *opts = NULL, *device = NULL, *cmd = NULL;
int programLogFD;
- if (mkdirChain(where))
- return IMOUNT_ERR_ERRNO;
+ if (mode == IMOUNT_MODE_MOUNT) {
+ cmd = "/bin/mount";
+ } else if (mode == IMOUNT_MODE_UMOUNT) {
+ cmd = "/bin/umount";
+ } else {
+ return IMOUNT_ERR_MODE;
+ }
- if (strstr(fs, "nfs")) {
- if (options) {
- if (asprintf(&opts, "%s,nolock", options) == -1) {
- fprintf(stderr, "%s: %d: %s\n", __func__, __LINE__,
- strerror(errno));
- fflush(stderr);
- abort();
+ if (mode == IMOUNT_MODE_MOUNT) {
+ if (mkdirChain(where))
+ return IMOUNT_ERR_ERRNO;
+
+ if (strstr(fs, "nfs")) {
+ if (options) {
+ if (asprintf(&opts, "%s,nolock", options) == -1) {
+ fprintf(stderr, "%s: %d: %s\n", __func__, __LINE__,
+ strerror(errno));
+ fflush(stderr);
+ abort();
+ }
+ } else {
+ opts = strdup("nolock");
}
+
+ device = strdup(dev);
} else {
- opts = strdup("nolock");
- }
- device = strdup(dev);
- } else {
- if ((options&& strstr(options, "bind") == NULL)&&
- strncmp(dev, "LABEL=", 6)&& strncmp(dev, "UUID=", 5)&&
- *dev != '/') {
- if (asprintf(&device, "/dev/%s", dev) == -1) {
- fprintf(stderr, "%s: %d: %s\n", __func__, __LINE__,
- strerror(errno));
- fflush(stderr);
- abort();
- }
- } else {
- device = strdup(dev);
+ if ((options&& strstr(options, "bind") == NULL)&&
+ strncmp(dev, "LABEL=", 6)&& strncmp(dev, "UUID=", 5)&&
+ *dev != '/') {
+ if (asprintf(&device, "/dev/%s", dev) == -1) {
+ fprintf(stderr, "%s: %d: %s\n", __func__, __LINE__,
+ strerror(errno));
+ fflush(stderr);
+ abort();
+ }
+ } else {
+ device = strdup(dev);
+ }
+
+ if (options)
+ opts = strdup(options);
}
- if (options)
- opts = strdup(options);
}
- programLogFD = open("/tmp/program.log", O_APPEND|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
+ programLogFD = open("/tmp/program.log",
+ O_APPEND|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if (pipe(pipefd))
return IMOUNT_ERR_ERRNO;
@@ -116,8 +130,9 @@ int doPwMount(char *dev, char *where, char *fs, char *options, char **err) {
close(pipefd[0]);
/* Close stdin entirely, redirect stdout to /tmp/program.log, and
- * redirect stderr to a pipe so we can put error messages into exceptions.
- * We'll only use these messages should mount also return an error code.
+ * redirect stderr to a pipe so we can put error messages into
+ * exceptions. We'll only use these messages should mount also
+ * return an error code.
*/
fd = open("/dev/tty5", O_RDONLY);
close(STDIN_FILENO);
@@ -129,17 +144,25 @@ int doPwMount(char *dev, char *where, char *fs, char *options, char **err) {
dup2(pipefd[1], STDERR_FILENO);
- if (opts) {
- fprintf(stdout, "Running... /bin/mount -n -t %s -o %s %s %s\n",
- fs, opts, device, where);
- rc = execl("/bin/mount",
- "/bin/mount", "-n", "-t", fs, "-o", opts, device, where, NULL);
+ if (mode == IMOUNT_MODE_MOUNT) {
+ if (opts) {
+ fprintf(stdout, "Running... %s -n -t %s -o %s %s %s\n",
+ cmd, fs, opts, device, where);
+ rc = execl(cmd, cmd,
+ "-n", "-t", fs, "-o", opts, device, where, NULL);
+ exit(1);
+ } else {
+ fprintf(stdout, "Running... %s -n -t %s %s %s\n",
+ cmd, fs, device, where);
+ rc = execl(cmd, cmd, "-n", "-t", fs, device, where, NULL);
+ exit(1);
+ }
+ } else if (mode == IMOUNT_MODE_UMOUNT) {
+ fprintf(stdout, "Running... %s %s\n", cmd, where);
+ rc = execl(cmd, cmd, where, NULL);
exit(1);
- }
- else {
- fprintf(stdout, "Running... /bin/mount -n -t %s %s %s\n",
- fs, device, where);
- rc = execl("/bin/mount", "/bin/mount", "-n", "-t", fs, device, where, NULL);
+ } else {
+ fprintf(stdout, "Running... Unknown imount mode: %d\n", mode);
exit(1);
}
}
@@ -158,14 +181,30 @@ int doPwMount(char *dev, char *where, char *fs, char *options, char **err) {
close(programLogFD);
- free(opts);
- free(device);
+ if (opts) {
+ free(opts);
+ }
+
+ if (device) {
+ free(device);
+ }
+
if (!WIFEXITED(status) || (WIFEXITED(status)&& WEXITSTATUS(status)))
return IMOUNT_ERR_OTHER;
return 0;
}
+int doPwMount(char *dev, char *where, char *fs, char *options, char **err) {
+ return mountCommandWrapper(IMOUNT_MODE_MOUNT,
+ dev, where, fs, options, err);
+}
+
+int doPwUmount(char *where, char **err) {
+ return mountCommandWrapper(IMOUNT_MODE_UMOUNT,
+ NULL, where, NULL, NULL, err);
+}
+
int mkdirChain(char * origChain) {
char * chain;
char * chptr;
diff --git a/isys/imount.h b/isys/imount.h
index 9f9c425..95cca38 100644
--- a/isys/imount.h
+++ b/isys/imount.h
@@ -1,7 +1,7 @@
/*
* imount.h
*
- * Copyright (C) 2007 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2007, 2008, 2009 Red Hat, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -22,6 +22,7 @@
#define IMOUNT_ERR_ERRNO 1
#define IMOUNT_ERR_OTHER 2
+#define IMOUNT_ERR_MODE 3
#include<sys/mount.h> /* for umount() */
@@ -29,7 +30,11 @@
#define IMOUNT_BIND 2
#define IMOUNT_REMOUNT 4
+#define IMOUNT_MODE_MOUNT 1
+#define IMOUNT_MODE_UMOUNT 2
+
int doPwMount(char *dev, char *where, char *fs, char *options, char **err);
+int doPwUmount(char *where, char **err);
int mkdirChain(char * origChain);
#endif