X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=main.c;h=e4fb87e425019da9253866b68a2d7a4f7ef60671;hb=7e81aa89ec90d60b877e921de642f7eb5eb4bbbf;hp=e5b644024648727747d9fdd564ff1d5770448df1;hpb=e5c4ceadcb31af3f3bd9f9b9f640d871b35bf55b;p=pmount-gui.git diff --git a/main.c b/main.c index e5b6440..e4fb87e 100644 --- a/main.c +++ b/main.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -31,6 +32,7 @@ typedef struct sDevice int verbosity = 0; char *post_mount_command = NULL; +char **pmount_argv = NULL; /** Parses a string of the form name=value and places the components in a Property @@ -635,19 +637,38 @@ int toggle_device(Device *device, char *out_buf, int out_size) { int umount = !!device->mount_point; char mount_point[1024]; - int len; int pos = 0; int status = 0; fd_set fds; struct timeval timeout; int pid; int pipe_fd[2]; + char suffix = 0; out_buf[0] = 0; - len = snprintf(mount_point, sizeof(mount_point), "/media/%s", device->label); - if(len>=(int)sizeof(mount_point)) - return -1; + /* Find a mount point that does not exist yet. */ + while(1) + { + int len; + + len = snprintf(mount_point, sizeof(mount_point), "/media/%s", device->label); + if(len+2>=(int)sizeof(mount_point)) + return -1; + + if(suffix) + len += snprintf(mount_point+len, sizeof(mount_point)-len, "_%c", suffix); + + if(access(mount_point, F_OK)<0 && errno==ENOENT) + break; + + if(suffix==0) + suffix = '1'; + else if(suffix<'9') + ++suffix; + else + return -1; + } pipe(pipe_fd); @@ -655,12 +676,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]); @@ -670,7 +710,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) @@ -833,7 +873,7 @@ void show_help(void) { printf("pmount-gui\n" "Copyright (c) 2011-2015 Mikko Rasa, Mikkosoft Productions\n\n" - "Usage: pmount-gui [-v] [-u] [-r ] [-h]\n\n" + "Usage: pmount-gui [-v] [-u] [-r ] [-h] [-- ]\n\n" "Options:\n" " -v Increase verbosity\n" " -u Unmount a device (default is mount)\n" @@ -876,6 +916,16 @@ 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; + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_container_set_border_width(GTK_CONTAINER(window), 5); g_signal_connect(window, "destroy", G_CALLBACK(>k_main_quit), NULL); @@ -943,5 +993,7 @@ int main(int argc, char **argv) free_devices(devices); + free(pmount_argv); + return 0; }