From: Mikko Rasa Date: Thu, 20 Oct 2011 12:58:09 +0000 (+0300) Subject: Add verbose flag and unmount mode X-Git-Url: http://git.tdb.fi/?p=pmount-gui.git;a=commitdiff_plain;h=9547dca153610b13cab14725c8d16ccc134ec188 Add verbose flag and unmount mode --- diff --git a/main.c b/main.c index 7d941c1..910983f 100644 --- a/main.c +++ b/main.c @@ -22,6 +22,8 @@ typedef struct sDevice time_t time; } Device; +int verbosity = 0; + int parse_property(char *str, int size, Property *prop) { int equals = -1; @@ -50,13 +52,14 @@ Property *get_device_properties(char *node) int pid; int pipe_fd[2]; - /*printf("Examining device %s\n", node);*/ - pipe(pipe_fd); pid = fork(); if(pid==0) { + if(verbosity>=2) + printf("Running udevadm info -q property -n \"%s\"\n", node); + close(pipe_fd[0]); dup2(pipe_fd[1], 1); @@ -101,8 +104,6 @@ Property *get_device_properties(char *node) if(parse_property(buf, newline, &prop)==0) { - /*printf("Got property '%s' = '%s'\n", prop.name, prop.value);*/ - props = (Property *)realloc(props, (n_props+2)*sizeof(Property)); props[n_props] = prop; ++n_props; @@ -114,8 +115,11 @@ Property *get_device_properties(char *node) break; } - props[n_props].name = NULL; - props[n_props].value = NULL; + if(props) + { + props[n_props].name = NULL; + props[n_props].value = NULL; + } waitpid(pid, NULL, 0); close(pipe_fd[0]); @@ -225,7 +229,24 @@ Device *get_devices(void) continue; snprintf(fnbuf, sizeof(fnbuf), "/dev/disk/by-id/%s", de->d_name); + if(verbosity>=1) + printf("Examining device %s\n", fnbuf); + Property *props = get_device_properties(fnbuf); + if(!props) + { + if(verbosity>=2) + printf(" No properties\n"); + continue; + } + + if(verbosity>=2) + { + int i; + for(i=0; props[i].name; ++i) + printf(" %s = %s\n", props[i].name, props[i].value); + } + if(match_property_value(props, "ID_BUS", "usb") && match_property_value(props, "DEVTYPE", "partition")) { char *devname; @@ -236,7 +257,8 @@ Device *get_devices(void) char pos; struct stat st; - /*printf("Using device %s\n", fnbuf);*/ + if(verbosity>=1) + printf(" Using device\n"); devname = get_property_value(props, "DEVNAME"); @@ -303,6 +325,7 @@ void row_activated(GtkTreeView *list, GtkTreePath *path, GtkTreeViewColumn *colu { GtkTreeModel *model; GtkTreeIter iter; + int umount = *(int *)user_data; model = gtk_tree_view_get_model(list); @@ -319,10 +342,22 @@ void row_activated(GtkTreeView *list, GtkTreePath *path, GtkTreeViewColumn *colu pid = fork(); if(pid==0) { + if(verbosity>=2) + { + if(umount) + printf("Running pumount %s\n", device->node); + else + printf("Running pmount %s %s\n", device->node, device->label); + } + close(pipe_fd[0]); dup2(pipe_fd[1], 1); dup2(pipe_fd[1], 2); - execl("/usr/bin/pmount", "pmount", device->node, device->label, NULL); + + if(umount) + execl("/usr/bin/pumount", "pumount", device->node, NULL); + else + execl("/usr/bin/pmount", "pmount", device->node, device->label, NULL); _exit(1); } else if(pid>0) @@ -363,7 +398,6 @@ void row_activated(GtkTreeView *list, GtkTreePath *path, GtkTreeViewColumn *colu } (void)column; - (void)user_data; } int main(int argc, char **argv) @@ -377,9 +411,22 @@ int main(int argc, char **argv) Device *devices; int i; time_t latest; + int opt; + int umount = 0; + int n_listed; gtk_init(&argc, &argv); + while((opt = getopt(argc, argv, "vu"))!=-1) switch(opt) + { + case 'v': + ++verbosity; + break; + case 'u': + umount = 1; + break; + } + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_container_set_border_width(GTK_CONTAINER(window), 5); g_signal_connect(window, "destroy", >k_main_quit, NULL); @@ -390,7 +437,7 @@ int main(int argc, char **argv) list = gtk_tree_view_new(); gtk_container_add(GTK_CONTAINER(viewport), list); - g_signal_connect(list, "row-activated", (GCallback)&row_activated, NULL); + g_signal_connect(list, "row-activated", (GCallback)&row_activated, &umount); store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER); gtk_tree_view_set_model(GTK_TREE_VIEW(list), GTK_TREE_MODEL(store)); @@ -400,11 +447,12 @@ int main(int argc, char **argv) selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list)); devices = get_devices(); + n_listed = 0; if(devices) { latest = 0; for(i=0; devices[i].node; ++i) - if(!devices[i].mounted) + if(!devices[i].mounted==!umount) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, devices[i].description, 1, &devices[i], -1); @@ -413,15 +461,20 @@ int main(int argc, char **argv) latest = devices[i].time; gtk_tree_selection_select_iter(selection, &iter); } + + ++n_listed; } - gtk_widget_show_all(window); } + + if(n_listed) + gtk_widget_show_all(window); else { GtkWidget *dialog; - dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "No devices found"); + dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, + "No devices to %s", (umount ? "unmount" : "mount")); g_signal_connect(dialog, "response", >k_main_quit, NULL); gtk_widget_show_all(dialog); }