X-Git-Url: http://git.tdb.fi/?p=pmount-gui.git;a=blobdiff_plain;f=main.c;h=9172ab6d7b9d049c6c432b063e24c1f82caa2d93;hp=fe41c4a560d858271642232a53ac58fd8685c70a;hb=b70580815b02ba5ccf83d8d96c5138afbc7124ae;hpb=d98a1c5391c9da786574a84b69a50cbc31a170bf diff --git a/main.c b/main.c index fe41c4a..9172ab6 100644 --- a/main.c +++ b/main.c @@ -47,6 +47,7 @@ typedef struct sGuiContext } GuiContext; int verbosity = 0; +char **pmount_argv = NULL; /** Parses a string of the form name=value and places the components in a Property @@ -82,6 +83,7 @@ the array. */ Property *get_device_properties(char *node) { + static const char *udevadm_path = NULL; int pid; int pipe_fd[2]; char *buf; @@ -91,6 +93,22 @@ Property *get_device_properties(char *node) Property *props = NULL; int n_props = 0; + if(!udevadm_path) + { + struct stat st; + udevadm_path = "/bin/udevadm"; + if(stat(udevadm_path, &st)<0 || !(st.st_mode&0111)) + { + udevadm_path = "/sbin/udevadm"; + if(stat(udevadm_path, &st)<0 || !(st.st_mode&0111)) + { + udevadm_path = NULL; + perror("Unable to find udevadm"); + return NULL; + } + } + } + pipe(pipe_fd); pid = fork(); @@ -103,7 +121,9 @@ Property *get_device_properties(char *node) close(pipe_fd[0]); dup2(pipe_fd[1], 1); - execl("/sbin/udevadm", "udevadm", "info", "-q", "property", "-n", node, NULL); + if(execl(udevadm_path, "udevadm", "info", "-q", "property", "-n", node, NULL)<0) + fprintf(stderr, "Unable to execute %s: %s\n", udevadm_path, strerror(errno)); + _exit(1); } else if(pid<0) @@ -523,7 +543,6 @@ Device *get_devices(void) char **nodes = NULL; Device *devices = NULL; int n_devices = 0; - char **mounted = NULL; char **fstab = NULL; int i; @@ -542,6 +561,7 @@ Device *get_devices(void) { if(verbosity>=2) printf(" No properties\n"); + free(nodes[i]); continue; } @@ -607,7 +627,7 @@ Device *get_devices(void) } free(nodes); - free_string_array(mounted); + free_string_array(fstab); if(devices) { @@ -690,12 +710,31 @@ int toggle_device(Device *device, char *out_buf, int out_size) if(pid==0) { /* Child process */ + + /* Complete construction of pmount call */ + int last; + + pmount_argv[0] = "pmount"; + + last = 0; + while(pmount_argv[++last]); + + pmount_argv[last] = device->node; + pmount_argv[last+1] = mount_point+7; + pmount_argv[last+2] = NULL; + if(verbosity>=1) { if(umount) printf("Running pumount %s\n", device->node); else - printf("Running pmount %s %s\n", device->node, mount_point+7); + { + int i = 0; + printf("Running pmount"); + while(pmount_argv[++i]) + printf(" %s", pmount_argv[i]); + printf("\n"); + } } close(pipe_fd[0]); @@ -705,7 +744,7 @@ int toggle_device(Device *device, char *out_buf, int out_size) if(umount) execl("/usr/bin/pumount", "pumount", device->node, NULL); else - execl("/usr/bin/pmount", "pmount", device->node, mount_point+7, NULL); + execvp("/usr/bin/pmount", pmount_argv); _exit(1); } else if(pid<0) @@ -1003,8 +1042,8 @@ gboolean inotify_event_available(GIOChannel *source, GIOCondition condition, gpo void show_help(void) { printf("pmount-gui\n" - "Copyright (c) 2011-2015 Mikko Rasa, Mikkosoft Productions\n\n" - "Usage: pmount-gui [-v] [-u] [-r ] [-m|-M] [-h]\n\n" + "Copyright (c) 2011-2016 Mikko Rasa, Mikkosoft Productions\n\n" + "Usage: pmount-gui [-v] [-u] [-r ] [-m|-M] [-h] [-- ]\n\n" "Options:\n" " -v Increase verbosity\n" " -u Unmount a device (default is mount)\n" @@ -1025,6 +1064,7 @@ int main(int argc, char **argv) int opt; int umount = 0; int n_listed; + int i; context.manager = 0; context.autohide = 0; @@ -1061,10 +1101,19 @@ int main(int argc, char **argv) return 0; } + /* argc - optind equals to number of options after "--" */ + /* One empty element at the beginning is for program name for execvp */ + /* Three empty elements at the end are required options for pmount + NULL */ + + pmount_argv = malloc(sizeof(char *)*(argc-optind+4)); + + for(i=0; i<(argc-optind); ++i) + pmount_argv[i+1] = argv[optind+i]; + pmount_argv[argc-optind+1] = NULL; + context.window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_container_set_border_width(GTK_CONTAINER(context.window), 5); g_signal_connect(context.window, "destroy", G_CALLBACK(>k_main_quit), NULL); - g_signal_connect(context.window, "key-press-event", G_CALLBACK(&key_press), NULL); box = gtk_vbox_new(FALSE, 5); gtk_container_add(GTK_CONTAINER(context.window), box); @@ -1113,6 +1162,8 @@ int main(int argc, char **argv) umount = -1; } + else + g_signal_connect(context.window, "key-press-event", G_CALLBACK(&key_press), NULL); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(context.list)); g_signal_connect(selection, "changed", G_CALLBACK(&selection_changed), &context); @@ -1142,5 +1193,7 @@ int main(int argc, char **argv) if(context.inotify_fd>=0) close(context.inotify_fd); + free(pmount_argv); + return 0; }