changeset: 11:86c788e5d212
tag: tip
user: Dimitrios Papastamos <stateless [at] archlinux.us>
date: Wed May 13 19:56:07 2009 -0700
files: README skvm.c
description:
When a drive is cold ejected, make sure to umount the device
and remove the mount point.
diff -r 99dfa9d53535 -r 86c788e5d212 README
--- a/README Sat May 09 16:16:33 2009 -0700
+++ b/README Wed May 13 19:56:07 2009 -0700
@@ -21,3 +21,7 @@
* sudo /etc/rc.d/skvm start
* sudo /etc/rc.d/skvm restart
* sudo /etc/rc.d/skvm stop
+
+If you want to unmount the drives, you will have to be root. If you
+cold eject a drive, skvm will unmount it and delete the mountpoint.
+That is probably not a good idea.
diff -r 99dfa9d53535 -r 86c788e5d212 skvm.c
--- a/skvm.c Sat May 09 16:16:33 2009 -0700
+++ b/skvm.c Wed May 13 19:56:07 2009 -0700
@@ -30,7 +30,13 @@
*/
/* feel free to alter these to your liking */
+
+/* NOTE: you may want to use the sync mount option if you plan
+ * to cold eject your usb drives. Even though the side-effects
+ * are probably not worth it.
+ */
#define MOUNT_CMD_PATH "/bin/mount"
+#define UMOUNT_CMD_PATH "/bin/umount"
#define DEFAULT_MNT_OPTIONS "noexec,nosuid"
#define BASE_MNT_DIR "/media/"
@@ -49,6 +55,18 @@
p1->volume = p2->volume; \
p1->drive = p2->drive; \
} while (0)
+#define EXEC_CMD(args) \
+ g_spawn_sync( \
+ "/", \
+ (args), \
+ (gchar **)NULL, \
+ 0, \
+ (GSpawnChildSetupFunc)NULL, \
+ (gpointer)NULL, \
+ (gchar **)NULL, \
+ (gchar **)NULL, \
+ (gint *)NULL, \
+ (GError **)NULL)
/* ============================
* = Structs
@@ -121,6 +139,7 @@
static void consider_fstab(struct device_t *device);
static void do_args(struct device_t *device);
static int do_mount(struct device_t *device);
+static int do_umount(const struct device_t *device);
/* general function helpers */
static inline int file_exists(const char *path);
@@ -316,6 +335,9 @@
if (!strcmp(did, iter->did)) {
mountp = iter->mountp;
if (!file_exists(mountp)) {
+ if (!is_mounted(iter->dev))
+ if (do_umount(iter))
+ printf("FUCK ME\n");
if (rmdir(mountp) < 0)
syslog(LOG_WARNING, "%s:%d: %s", __FILE__, __LINE__,
strerror(errno));
@@ -568,6 +590,7 @@
endmntent(fp);
}
+/* TODO: might actually remove this one */
static void
do_args(struct device_t *device) {
int i = 0;
@@ -582,7 +605,7 @@
device->args[i++] = (!device->opt) ? DEFAULT_MNT_OPTIONS : device->opt;
device->args[i++] = device->dev;
device->args[i++] = device->mountp;
- device->args[i] = NULL;
+ device->args[i] = (char *)NULL;
}
static int
@@ -591,17 +614,18 @@
return -1;
do_args(device);
- return (g_spawn_sync(
- "/",
- device->args,
- (gchar **)NULL,
- 0,
- (GSpawnChildSetupFunc)NULL,
- (gpointer)NULL,
- (gchar **)NULL,
- (gchar **)NULL,
- (gint *)NULL,
- (GError **)NULL) ? 0 : -1);
+ return EXEC_CMD(device->args) ? 0 : -1;
+}
+
+static int
+do_umount(const struct device_t *device) {
+ if (!device)
+ return -1;
+
+ return EXEC_CMD(
+ ((char *[]) {
+ UMOUNT_CMD_PATH, device->dev, (char *)NULL
+ })) ? 0 : -1;
}
static inline int
Received on Wed May 13 2009 - 18:56:14 UTC
This archive was generated by hypermail 2.2.0 : Wed May 13 2009 - 19:00:06 UTC