From ed376231430eec00d2a3e27658a610cf64e442ec Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Thu, 20 Oct 2011 15:12:46 +0300 Subject: [PATCH] Better error checking and reporting --- main.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 69 insertions(+), 14 deletions(-) diff --git a/main.c b/main.c index 10bf929..13e6696 100644 --- a/main.c +++ b/main.c @@ -101,7 +101,7 @@ Property *get_device_properties(char *node) { /*printf("Got property '%s' = '%s'\n", prop.name, prop.value);*/ - props = (Property *)realloc(props, (n_props*2)*sizeof(Property)); + props = (Property *)realloc(props, (n_props+2)*sizeof(Property)); props[n_props] = prop; ++n_props; @@ -168,6 +168,9 @@ Device *get_devices(void) int n_devices = 0; dir = opendir("/dev/disk/by-id"); + if(!dir) + return NULL; + while((de = readdir(dir))) { if(de->d_name[0]=='.' && (de->d_name[1]==0 || (de->d_name[1]=='.' && de->d_name[2]==0))) @@ -217,8 +220,13 @@ Device *get_devices(void) free_properties(props); } - devices[n_devices].node = NULL; - devices[n_devices].label = NULL; + closedir(dir); + + if(devices) + { + devices[n_devices].node = NULL; + devices[n_devices].label = NULL; + } return devices; } @@ -247,25 +255,60 @@ void row_activated(GtkTreeView *list, GtkTreePath *path, GtkTreeViewColumn *colu { Device *device; int pid; + int pipe_fd[2]; gtk_tree_model_get(model, &iter, 1, &device, -1); + pipe(pipe_fd); + pid = fork(); if(pid==0) { + close(pipe_fd[0]); + dup2(pipe_fd[1], 1); + dup2(pipe_fd[1], 2); execl("/usr/bin/pmount", "pmount", device->node, device->label, NULL); _exit(1); } else if(pid>0) { - waitpid(pid, NULL, 0); + char buf[1024]; + int pos = 0; + int status; + + close(pipe_fd[1]); + + while(1) + { + int len; + + len = read(pipe_fd[0], buf+pos, sizeof(buf)-pos-1); + if(len<=0) + break; + pos += len; + } + + buf[pos] = 0; + + waitpid(pid, &status, 0); + if(!WIFEXITED(status) || WEXITSTATUS(status)) + { + GtkWidget *dialog; + + dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", buf); + g_signal_connect(dialog, "response", >k_main_quit, NULL); + gtk_widget_show_all(dialog); + } + else + gtk_main_quit(); + } + else + { } } (void)column; (void)user_data; - - gtk_main_quit(); } int main(int argc, char **argv) @@ -302,19 +345,31 @@ int main(int argc, char **argv) selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list)); devices = get_devices(); - latest = 0; - for(i=0; devices[i].node; ++i) + if(devices) { - gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, 0, devices[i].description, 1, &devices[i], -1); - if(devices[i].time>latest) + latest = 0; + for(i=0; devices[i].node; ++i) { - latest = devices[i].time; - gtk_tree_selection_select_iter(selection, &iter); + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, 0, devices[i].description, 1, &devices[i], -1); + if(devices[i].time>latest) + { + latest = devices[i].time; + gtk_tree_selection_select_iter(selection, &iter); + } } + + gtk_widget_show_all(window); + } + else + { + GtkWidget *dialog; + + dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "No devices found"); + g_signal_connect(dialog, "response", >k_main_quit, NULL); + gtk_widget_show_all(dialog); } - gtk_widget_show_all(window); gtk_main(); free_devices(devices); -- 2.43.0