X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Fgui%2Ftracecontrol%2Ftracecontrol.c;h=da4df4fb8b1951644f3977a0b78d0ca23b312d62;hb=29e34d6c3b4a9fa6fb181647d224efaac2461ffb;hp=4097e0cdf9db5e9cc096231c31d69dabde9c2ea1;hpb=ff430216c1cf25fad25d253d161a42af2f9790eb;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/gui/tracecontrol/tracecontrol.c b/ltt/branches/poly/lttv/modules/gui/tracecontrol/tracecontrol.c index 4097e0cd..da4df4fb 100644 --- a/ltt/branches/poly/lttv/modules/gui/tracecontrol/tracecontrol.c +++ b/ltt/branches/poly/lttv/modules/gui/tracecontrol/tracecontrol.c @@ -44,7 +44,7 @@ #include #include #include -#include +#include #define MAX_ARGS_LEN PATH_MAX * 10 @@ -75,6 +75,7 @@ void control_destroy_walk(gpointer data, gpointer user_data); static void start_clicked (GtkButton *button, gpointer user_data); static void pause_clicked (GtkButton *button, gpointer user_data); +static void unpause_clicked (GtkButton *button, gpointer user_data); static void stop_clicked (GtkButton *button, gpointer user_data); @@ -91,6 +92,7 @@ struct _ControlData { GtkWidget *main_box; /**< main container */ GtkWidget *start_button; GtkWidget *pause_button; + GtkWidget *unpause_button; GtkWidget *stop_button; GtkWidget *username_label; GtkWidget *username_entry; @@ -106,6 +108,8 @@ struct _ControlData { GtkWidget *trace_mode_combo; GtkWidget *start_daemon_label; GtkWidget *start_daemon_check; + GtkWidget *append_label; + GtkWidget *append_check; GtkWidget *optional_label; GtkWidget *subbuf_size_label; GtkWidget *subbuf_size_entry; @@ -189,13 +193,21 @@ gui_control(Tab *tab) gtk_widget_show (tcd->pause_button); gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->pause_button,6,7,1,2,GTK_FILL,GTK_FILL,2,2); + pixbuf = gdk_pixbuf_new_from_xpm_data((const char **)TraceControlPause_xpm); + image = gtk_image_new_from_pixbuf(pixbuf); + tcd->unpause_button = gtk_button_new_with_label("unpause"); + gtk_button_set_image(GTK_BUTTON(tcd->unpause_button), image); + gtk_button_set_alignment(GTK_BUTTON(tcd->unpause_button), 0.0, 0.0); + gtk_widget_show (tcd->unpause_button); + gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->unpause_button,6,7,2,3,GTK_FILL,GTK_FILL,2,2); + pixbuf = gdk_pixbuf_new_from_xpm_data((const char **)TraceControlStop_xpm); image = gtk_image_new_from_pixbuf(pixbuf); tcd->stop_button = gtk_button_new_with_label("stop"); gtk_button_set_image(GTK_BUTTON(tcd->stop_button), image); gtk_button_set_alignment(GTK_BUTTON(tcd->stop_button), 0.0, 0.0); gtk_widget_show (tcd->stop_button); - gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->stop_button,6,7,2,3,GTK_FILL,GTK_FILL,2,2); + gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->stop_button,6,7,3,4,GTK_FILL,GTK_FILL,2,2); /* * First half of the filter window @@ -264,32 +276,41 @@ gui_control(Tab *tab) gtk_widget_show (tcd->start_daemon_check); gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->start_daemon_label,0,2,6,7,GTK_FILL,GTK_FILL,2,2); gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->start_daemon_check,2,6,6,7,GTK_FILL,GTK_FILL,0,0); + + tcd->append_label = gtk_label_new("Append to trace "); + gtk_widget_show (tcd->append_label); + tcd->append_check = gtk_check_button_new(); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tcd->append_check), FALSE); + gtk_widget_show (tcd->append_check); + gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->append_label,0,2,7,8,GTK_FILL,GTK_FILL,2,2); + gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->append_check,2,6,7,8,GTK_FILL,GTK_FILL,0,0); + tcd->optional_label = gtk_label_new("Optional fields "); gtk_widget_show (tcd->optional_label); - gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->optional_label,0,6,7,8,GTK_FILL,GTK_FILL,2,2); + gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->optional_label,0,6,8,9,GTK_FILL,GTK_FILL,2,2); tcd->subbuf_size_label = gtk_label_new("Subbuffer size:"); gtk_widget_show (tcd->subbuf_size_label); tcd->subbuf_size_entry = gtk_entry_new(); gtk_widget_show (tcd->subbuf_size_entry); - gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->subbuf_size_label,0,2,8,9,GTK_FILL,GTK_FILL,2,2); - gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->subbuf_size_entry,2,6,8,9,GTK_FILL|GTK_EXPAND|GTK_SHRINK,GTK_FILL,0,0); + gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->subbuf_size_label,0,2,9,10,GTK_FILL,GTK_FILL,2,2); + gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->subbuf_size_entry,2,6,9,10,GTK_FILL|GTK_EXPAND|GTK_SHRINK,GTK_FILL,0,0); tcd->subbuf_num_label = gtk_label_new("Number of subbuffers:"); gtk_widget_show (tcd->subbuf_num_label); tcd->subbuf_num_entry = gtk_entry_new(); gtk_widget_show (tcd->subbuf_num_entry); - gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->subbuf_num_label,0,2,9,10,GTK_FILL,GTK_FILL,2,2); - gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->subbuf_num_entry,2,6,9,10,GTK_FILL|GTK_EXPAND|GTK_SHRINK,GTK_FILL,0,0); + gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->subbuf_num_label,0,2,10,11,GTK_FILL,GTK_FILL,2,2); + gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->subbuf_num_entry,2,6,10,11,GTK_FILL|GTK_EXPAND|GTK_SHRINK,GTK_FILL,0,0); tcd->lttctl_path_label = gtk_label_new("path to lttctl:"); gtk_widget_show (tcd->lttctl_path_label); tcd->lttctl_path_entry = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(tcd->lttctl_path_entry),PACKAGE_BIN_DIR "/lttctl"); gtk_widget_show (tcd->lttctl_path_entry); - gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->lttctl_path_label,0,2,10,11,GTK_FILL,GTK_FILL,2,2); - gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->lttctl_path_entry,2,6,10,11,GTK_FILL|GTK_EXPAND|GTK_SHRINK,GTK_FILL,0,0); + gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->lttctl_path_label,0,2,11,12,GTK_FILL,GTK_FILL,2,2); + gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->lttctl_path_entry,2,6,11,12,GTK_FILL|GTK_EXPAND|GTK_SHRINK,GTK_FILL,0,0); tcd->lttd_path_label = gtk_label_new("path to lttd:"); @@ -297,47 +318,31 @@ gui_control(Tab *tab) tcd->lttd_path_entry = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(tcd->lttd_path_entry),PACKAGE_BIN_DIR "/lttd"); gtk_widget_show (tcd->lttd_path_entry); - gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->lttd_path_label,0,2,11,12,GTK_FILL,GTK_FILL,2,2); - gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->lttd_path_entry,2,6,11,12,GTK_FILL|GTK_EXPAND|GTK_SHRINK,GTK_FILL,0,0); + gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->lttd_path_label,0,2,12,13,GTK_FILL,GTK_FILL,2,2); + gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->lttd_path_entry,2,6,12,13,GTK_FILL|GTK_EXPAND|GTK_SHRINK,GTK_FILL,0,0); tcd->fac_path_label = gtk_label_new("path to facilities:"); gtk_widget_show (tcd->fac_path_label); tcd->fac_path_entry = gtk_entry_new(); - gtk_entry_set_text(GTK_ENTRY(tcd->fac_path_entry),PACKAGE_DATA_DIR "/facilities"); + gtk_entry_set_text(GTK_ENTRY(tcd->fac_path_entry),PACKAGE_DATA_DIR "/" PACKAGE "/facilities"); gtk_widget_set_size_request(tcd->fac_path_entry, 250, -1); gtk_widget_show (tcd->fac_path_entry); - gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->fac_path_label,0,2,12,13,GTK_FILL,GTK_FILL,2,2); - gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->fac_path_entry,2,6,12,13,GTK_FILL|GTK_EXPAND|GTK_SHRINK,GTK_FILL,0,0); - - - GtkWidget *start_button; - GtkWidget *pause_button; - GtkWidget *stop_button; - - GtkWidget *username_entry; - GtkWidget *password_entry; - GtkWidget *channel_dir_entry; - GtkWidget *trace_dir_entry; - GtkWidget *trace_name_entry; - GtkWidget *trace_mode_combo; - GtkWidget *start_daemon_check; - GtkWidget *subbuf_size_entry; - GtkWidget *subbuf_num_entry; - GtkWidget *lttctl_path_entry; - GtkWidget *lttd_path_entry; - GtkWidget *fac_path_entry; + gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->fac_path_label,0,2,13,14,GTK_FILL,GTK_FILL,2,2); + gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->fac_path_entry,2,6,13,14,GTK_FILL|GTK_EXPAND|GTK_SHRINK,GTK_FILL,0,0); focus_chain = g_list_append (focus_chain, tcd->username_entry); focus_chain = g_list_append (focus_chain, tcd->password_entry); focus_chain = g_list_append (focus_chain, tcd->start_button); focus_chain = g_list_append (focus_chain, tcd->pause_button); + focus_chain = g_list_append (focus_chain, tcd->unpause_button); focus_chain = g_list_append (focus_chain, tcd->stop_button); focus_chain = g_list_append (focus_chain, tcd->channel_dir_entry); focus_chain = g_list_append (focus_chain, tcd->trace_dir_entry); focus_chain = g_list_append (focus_chain, tcd->trace_name_entry); focus_chain = g_list_append (focus_chain, tcd->trace_mode_combo); focus_chain = g_list_append (focus_chain, tcd->start_daemon_check); + focus_chain = g_list_append (focus_chain, tcd->append_check); focus_chain = g_list_append (focus_chain, tcd->subbuf_size_entry); focus_chain = g_list_append (focus_chain, tcd->subbuf_num_entry); focus_chain = g_list_append (focus_chain, tcd->lttctl_path_entry); @@ -350,6 +355,8 @@ gui_control(Tab *tab) (GCallback)start_clicked, tcd); g_signal_connect(G_OBJECT(tcd->pause_button), "clicked", (GCallback)pause_clicked, tcd); + g_signal_connect(G_OBJECT(tcd->unpause_button), "clicked", + (GCallback)unpause_clicked, tcd); g_signal_connect(G_OBJECT(tcd->stop_button), "clicked", (GCallback)stop_clicked, tcd); @@ -401,44 +408,13 @@ gui_control_destructor(ControlData *tcd) g_free(tcd); } -/* Callbacks */ - -void start_clicked (GtkButton *button, gpointer user_data) +static int execute_command(const gchar *command, const gchar *username, + const gchar *password, const gchar *lttd_path, const gchar *fac_path) { - ControlData *tcd = (ControlData*)user_data; - - const gchar *username = gtk_entry_get_text(GTK_ENTRY(tcd->username_entry)); - const gchar *password = gtk_entry_get_text(GTK_ENTRY(tcd->password_entry)); - const gchar *channel_dir = - gtk_entry_get_text(GTK_ENTRY(tcd->channel_dir_entry)); - const gchar *trace_dir = gtk_entry_get_text(GTK_ENTRY(tcd->trace_dir_entry)); - const gchar *trace_name = - gtk_entry_get_text(GTK_ENTRY(tcd->trace_name_entry)); - - const gchar *trace_mode_sel = - gtk_combo_box_get_active_text(GTK_COMBO_BOX(tcd->trace_mode_combo)); - const gchar *trace_mode; - if(strcmp(trace_mode_sel, "normal") == 0) - trace_mode = "normal"; - else - trace_mode = "flight"; - - gboolean start_daemon = - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tcd->start_daemon_check)); - - const gchar *subbuf_size = - gtk_entry_get_text(GTK_ENTRY(tcd->subbuf_size_entry)); - const gchar *subbuf_num = - gtk_entry_get_text(GTK_ENTRY(tcd->subbuf_num_entry)); - const gchar *lttctl_path = - gtk_entry_get_text(GTK_ENTRY(tcd->lttctl_path_entry)); - const gchar *lttd_path = gtk_entry_get_text(GTK_ENTRY(tcd->lttd_path_entry)); - const gchar *fac_path = gtk_entry_get_text(GTK_ENTRY(tcd->fac_path_entry)); - - //pid_t pid = fork(); pid_t pid; int fdpty; pid = forkpty(&fdpty, NULL, NULL, NULL); + int retval = 0; if(pid > 0) { /* parent */ @@ -449,32 +425,63 @@ void start_clicked (GtkButton *button, gpointer user_data) struct timeval timeout; timeout.tv_sec = 1; timeout.tv_usec = 0; - int nbdes; - fd_set readfds; - FD_ZERO(&readfds); - FD_SET(fdpty, &readfds); - - nbdes = select(fdpty+1, &readfds, NULL, NULL, &timeout); - - if(nbdes > 0) { - do { - count = read (fdpty, buf, 256); - if(count > 0) { - buf[count] = '\0'; - printf("%s", buf); - } - } while(select(fdpty+1, &readfds, NULL, NULL, &timeout) > 0); - - } else if(nbdes == -1) { - perror("Timeout occured when waiting for su password prompt"); - return; - } else { - g_warning("No data within 2 seconds when waiting for su prompt"); - return; - } + struct pollfd pollfd; + int num_rdy; + int num_hup = 0; + + + /* Read the output from the child terminal before the prompt. If no data in + * 200 ms, we stop reading to give the password */ + g_info("Reading from child console..."); + while(1) { + pollfd.fd = fdpty; + pollfd.events = POLLIN|POLLPRI; + + num_rdy = poll(&pollfd, 1, 200); +#if 0 + if(num_rdy == -1) { + perror("Poll error"); + goto wait_child; + } +#endif //0 + + /* Timeout : stop waiting for chars */ + if(num_rdy == 0) break; + + switch(pollfd.revents) { + case POLLERR: + g_warning("Error returned in polling fd\n"); + num_hup++; + break; + case POLLHUP: + g_info("Polling FD : hung up."); + num_hup++; + break; + case POLLNVAL: + g_warning("Polling fd tells it is not open"); + num_hup++; + break; + case POLLPRI: + case POLLIN: + count = read (fdpty, buf, 256); + if(count > 0) { + buf[count] = '\0'; + printf("%s", buf); + } else if(count == -1) { + perror("Error in read"); + goto wait_child; + } + break; + } + if(num_hup > 0) { + g_warning("Child hung up too fast"); + goto wait_child; + } + } + + /* Write the password */ g_info("Got su prompt, now writing password..."); - sleep(1); int ret; ret = write(fdpty, password, strlen(password)); if(ret < 0) perror("Error in write"); @@ -482,136 +489,253 @@ void start_clicked (GtkButton *button, gpointer user_data) if(ret < 0) perror("Error in write"); fsync(fdpty); - FD_ZERO(&readfds); - FD_SET(fdpty, &readfds); - do { - if (select(fdpty+1, &readfds, NULL, NULL, &timeout) < 0) { - g_warning("Cannot read from child pipe"); - return; + /* Take the output from the terminal and show it on the real console */ + g_info("Getting data from child terminal..."); + while(1) { + int num_hup = 0; + pollfd.fd = fdpty; + pollfd.events = POLLIN|POLLPRI; + + num_rdy = poll(&pollfd, 1, -1); +#if 0 + if(num_rdy == -1) { + perror("Poll error"); + goto wait_child; + } +#endif //0 + if(num_rdy == 0) break; + + switch(pollfd.revents) { + case POLLERR: + g_warning("Error returned in polling fd\n"); + num_hup++; + break; + case POLLHUP: + g_info("Polling FD : hung up."); + num_hup++; + break; + case POLLNVAL: + g_warning("Polling fd tells it is not open"); + num_hup++; + break; + case POLLPRI: + case POLLIN: + count = read (fdpty, buf, 256); + if(count > 0) { + buf[count] = '\0'; + printf("%s", buf); + } else if(count == -1) { + perror("Error in read"); + goto wait_child; + } + break; } - if(FD_ISSET(fdpty, &readfds)) { - count = read(fdpty, buf, 256); - buf[count] = '\0'; - printf("%s", buf); - } else FD_SET(fdpty, &readfds); - usleep(200); - } while(!(ret = waitpid(pid, &status, WNOHANG))); + if(num_hup > 0) goto wait_child; + } +wait_child: + g_info("Waiting for child exit..."); + + ret = waitpid(pid, &status, 0); - if(WIFEXITED(ret)) - if(WEXITSTATUS(ret) != 0) - g_warning("An error occured in the su command, exit code : %hhu", - WEXITSTATUS(ret)); + if(WIFEXITED(status)) + if(WEXITSTATUS(status) != 0) { + retval = WEXITSTATUS(status); + g_warning("An error occured in the su command : %s", + strerror(retval)); + } + g_info("Child exited."); } else if(pid == 0) { - /* child */ - gchar args[MAX_ARGS_LEN]; - gint args_left = MAX_ARGS_LEN - 1; /* for \0 */ - /* Setup environment variables */ if(strcmp(lttd_path, "") != 0) setenv("LTT_DAEMON", lttd_path, 1); if(strcmp(fac_path, "") != 0) setenv("LTT_FACILITIES", fac_path, 1); - /* Setup arguments to su */ - strncpy(args, "\"", args_left); - args_left = MAX_ARGS_LEN - strlen(args) - 1; + g_message("Executing (as %s) : %s\n", username, command); + + execlp("su", "su", "-p", "-c", command, username, NULL); + exit(-1); /* not supposed to happen! */ - if(strcmp(lttctl_path, "") == 0) - lttctl_path = "lttctl"; + //gint ret = execvp(); + + } else { + /* error */ + g_warning("Error happened when forking for su"); + } - /* channel dir */ - strncat(args, "-l ", args_left); - args_left = MAX_ARGS_LEN - strlen(args) - 1; - strncat(args, channel_dir, args_left); - args_left = MAX_ARGS_LEN - strlen(args) - 1; + return retval; +} - /* space */ - strncat(args, " ", args_left); - args_left = MAX_ARGS_LEN - strlen(args) - 1; - /* trace dir */ - strncat(args, "-t ", args_left); +/* Callbacks */ + +void start_clicked (GtkButton *button, gpointer user_data) +{ + ControlData *tcd = (ControlData*)user_data; + + const gchar *username = gtk_entry_get_text(GTK_ENTRY(tcd->username_entry)); + const gchar *password = gtk_entry_get_text(GTK_ENTRY(tcd->password_entry)); + const gchar *channel_dir = + gtk_entry_get_text(GTK_ENTRY(tcd->channel_dir_entry)); + const gchar *trace_dir = gtk_entry_get_text(GTK_ENTRY(tcd->trace_dir_entry)); + const gchar *trace_name = + gtk_entry_get_text(GTK_ENTRY(tcd->trace_name_entry)); + + const gchar *trace_mode_sel = + gtk_combo_box_get_active_text(GTK_COMBO_BOX(tcd->trace_mode_combo)); + const gchar *trace_mode; + if(strcmp(trace_mode_sel, "normal") == 0) + trace_mode = "normal"; + else + trace_mode = "flight"; + + gboolean start_daemon = + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tcd->start_daemon_check)); + + gboolean append = + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tcd->append_check)); + + const gchar *subbuf_size = + gtk_entry_get_text(GTK_ENTRY(tcd->subbuf_size_entry)); + const gchar *subbuf_num = + gtk_entry_get_text(GTK_ENTRY(tcd->subbuf_num_entry)); + const gchar *lttctl_path = + gtk_entry_get_text(GTK_ENTRY(tcd->lttctl_path_entry)); + const gchar *lttd_path = gtk_entry_get_text(GTK_ENTRY(tcd->lttd_path_entry)); + const gchar *fac_path = gtk_entry_get_text(GTK_ENTRY(tcd->fac_path_entry)); + + + /* Setup arguments to su */ + /* child */ + gchar args[MAX_ARGS_LEN]; + gint args_left = MAX_ARGS_LEN - 1; /* for \0 */ + + args[0] = '\0'; + + /* Command */ + strncat(args, "exec", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* space */ + strncat(args, " ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + if(strcmp(lttctl_path, "") == 0) + strncat(args, "lttctl", args_left); + else + strncat(args, lttctl_path, args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* space */ + strncat(args, " ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* channel dir */ + strncat(args, "-l ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + strncat(args, channel_dir, args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* space */ + strncat(args, " ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* trace dir */ + strncat(args, "-t ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + strncat(args, trace_dir, args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* space */ + strncat(args, " ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* name */ + strncat(args, "-n ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + strncat(args, trace_name, args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* space */ + strncat(args, " ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* trace mode */ + strncat(args, "-m ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + strncat(args, trace_mode, args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* space */ + strncat(args, " ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* Start daemon ? */ + if(start_daemon) { + strncat(args, "-d", args_left); args_left = MAX_ARGS_LEN - strlen(args) - 1; - strncat(args, trace_dir, args_left); + } else { + /* Simply create the channel and then start tracing */ + strncat(args, "-b", args_left); args_left = MAX_ARGS_LEN - strlen(args) - 1; + } + + /* Append to trace ? */ + if(append) { /* space */ strncat(args, " ", args_left); args_left = MAX_ARGS_LEN - strlen(args) - 1; - - /* name */ - strncat(args, "-n ", args_left); - args_left = MAX_ARGS_LEN - strlen(args) - 1; - strncat(args, trace_name, args_left); + strncat(args, "-a", args_left); args_left = MAX_ARGS_LEN - strlen(args) - 1; - + } + + /* optional arguments */ + /* subbuffer size */ + if(strcmp(subbuf_size, "") != 0) { /* space */ strncat(args, " ", args_left); args_left = MAX_ARGS_LEN - strlen(args) - 1; - /* trace mode */ - strncat(args, "-m ", args_left); + strncat(args, "-z ", args_left); args_left = MAX_ARGS_LEN - strlen(args) - 1; - strncat(args, trace_mode, args_left); + strncat(args, subbuf_size, args_left); args_left = MAX_ARGS_LEN - strlen(args) - 1; + } + /* number of subbuffers */ + if(strcmp(subbuf_num, "") != 0) { /* space */ strncat(args, " ", args_left); args_left = MAX_ARGS_LEN - strlen(args) - 1; - /* Start daemon ? */ - if(start_daemon) { - strncat(args, "-d", args_left); - args_left = MAX_ARGS_LEN - strlen(args) - 1; - } else { - /* Simply create the channel and then start tracing */ - strncat(args, "-b", args_left); - args_left = MAX_ARGS_LEN - strlen(args) - 1; - } - - /* optional arguments */ - /* subbuffer size */ - if(strcmp(subbuf_size, "") != 0) { - /* space */ - strncat(args, " ", args_left); - args_left = MAX_ARGS_LEN - strlen(args) - 1; - - strncat(args, "-z ", args_left); - args_left = MAX_ARGS_LEN - strlen(args) - 1; - strncat(args, subbuf_size, args_left); - args_left = MAX_ARGS_LEN - strlen(args) - 1; - } - - /* number of subbuffers */ - if(strcmp(subbuf_num, "") != 0) { - /* space */ - strncat(args, " ", args_left); - args_left = MAX_ARGS_LEN - strlen(args) - 1; - - strncat(args, "-x ", args_left); - args_left = MAX_ARGS_LEN - strlen(args) - 1; - strncat(args, subbuf_num, args_left); - args_left = MAX_ARGS_LEN - strlen(args) - 1; - } - - strncat(args, "\"", args_left); + strncat(args, "-x ", args_left); args_left = MAX_ARGS_LEN - strlen(args) - 1; - - //printf("Executing (as %s) : %s %s\n", username, lttctl_path, args); - - execlp("su", "su", "-p", "-c", lttctl_path, username, args, NULL); - exit(-1); /* not supposed to happen! */ - //system(args); - //system("echo blah"); - //exit(0); - - //gint ret = execvp(); + strncat(args, subbuf_num, args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + } + - } else { - /* error */ - g_warning("Error happened when forking for su"); + int retval = execute_command(args, username, password, lttd_path, fac_path); + + if(retval) { + gchar msg[256]; + guint msg_left = 256; + + strcpy(msg, "A problem occured when executing the su command : "); + msg_left = 256 - strlen(msg) - 1; + strncat(msg, strerror(retval), msg_left); + GtkWidget *dialogue = + gtk_message_dialog_new( + GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button))), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + msg); + gtk_dialog_run(GTK_DIALOG(dialogue)); + gtk_widget_destroy(dialogue); } } @@ -621,13 +745,255 @@ void pause_clicked (GtkButton *button, gpointer user_data) { ControlData *tcd = (ControlData*)user_data; + const gchar *username = gtk_entry_get_text(GTK_ENTRY(tcd->username_entry)); + const gchar *password = gtk_entry_get_text(GTK_ENTRY(tcd->password_entry)); + const gchar *trace_name = + gtk_entry_get_text(GTK_ENTRY(tcd->trace_name_entry)); + const gchar *lttd_path = ""; + const gchar *fac_path = ""; + + const gchar *lttctl_path = + gtk_entry_get_text(GTK_ENTRY(tcd->lttctl_path_entry)); + + /* Setup arguments to su */ + /* child */ + gchar args[MAX_ARGS_LEN]; + gint args_left = MAX_ARGS_LEN - 1; /* for \0 */ + + args[0] = '\0'; + + /* Command */ + strncat(args, "exec", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* space */ + strncat(args, " ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + if(strcmp(lttctl_path, "") == 0) + strncat(args, "lttctl", args_left); + else + strncat(args, lttctl_path, args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* space */ + strncat(args, " ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* name */ + strncat(args, "-n ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + strncat(args, trace_name, args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* space */ + strncat(args, " ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* Simply pause tracing */ + strncat(args, "-q", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + int retval = execute_command(args, username, password, lttd_path, fac_path); + if(retval) { + gchar msg[256]; + guint msg_left = 256; + + strcpy(msg, "A problem occured when executing the su command : "); + msg_left = 256 - strlen(msg) - 1; + strncat(msg, strerror(retval), msg_left); + GtkWidget *dialogue = + gtk_message_dialog_new( + GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button))), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + msg); + gtk_dialog_run(GTK_DIALOG(dialogue)); + gtk_widget_destroy(dialogue); + } + +} + +void unpause_clicked (GtkButton *button, gpointer user_data) +{ + ControlData *tcd = (ControlData*)user_data; + + const gchar *username = gtk_entry_get_text(GTK_ENTRY(tcd->username_entry)); + const gchar *password = gtk_entry_get_text(GTK_ENTRY(tcd->password_entry)); + const gchar *trace_name = + gtk_entry_get_text(GTK_ENTRY(tcd->trace_name_entry)); + const gchar *lttd_path = ""; + const gchar *fac_path = ""; + + const gchar *lttctl_path = + gtk_entry_get_text(GTK_ENTRY(tcd->lttctl_path_entry)); + + /* Setup arguments to su */ + /* child */ + gchar args[MAX_ARGS_LEN]; + gint args_left = MAX_ARGS_LEN - 1; /* for \0 */ + + args[0] = '\0'; + + /* Command */ + strncat(args, "exec", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* space */ + strncat(args, " ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + if(strcmp(lttctl_path, "") == 0) + strncat(args, "lttctl", args_left); + else + strncat(args, lttctl_path, args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + /* space */ + strncat(args, " ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* name */ + strncat(args, "-n ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + strncat(args, trace_name, args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* space */ + strncat(args, " ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* Simply unpause tracing */ + strncat(args, "-s", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + int retval = execute_command(args, username, password, lttd_path, fac_path); + if(retval) { + gchar msg[256]; + guint msg_left = 256; + + strcpy(msg, "A problem occured when executing the su command : "); + msg_left = 256 - strlen(msg) - 1; + strncat(msg, strerror(retval), msg_left); + GtkWidget *dialogue = + gtk_message_dialog_new( + GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button))), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + msg); + gtk_dialog_run(GTK_DIALOG(dialogue)); + gtk_widget_destroy(dialogue); + } + } void stop_clicked (GtkButton *button, gpointer user_data) { ControlData *tcd = (ControlData*)user_data; + const gchar *username = gtk_entry_get_text(GTK_ENTRY(tcd->username_entry)); + const gchar *password = gtk_entry_get_text(GTK_ENTRY(tcd->password_entry)); + const gchar *trace_name = + gtk_entry_get_text(GTK_ENTRY(tcd->trace_name_entry)); + const gchar *lttd_path = ""; + const gchar *fac_path = ""; + + const gchar *lttctl_path = + gtk_entry_get_text(GTK_ENTRY(tcd->lttctl_path_entry)); + const gchar *trace_dir = gtk_entry_get_text(GTK_ENTRY(tcd->trace_dir_entry)); + + /* Setup arguments to su */ + /* child */ + gchar args[MAX_ARGS_LEN]; + gint args_left = MAX_ARGS_LEN - 1; /* for \0 */ + + args[0] = '\0'; + + /* Command */ + strncat(args, "exec", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* space */ + strncat(args, " ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + if(strcmp(lttctl_path, "") == 0) + strncat(args, "lttctl", args_left); + else + strncat(args, lttctl_path, args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* space */ + strncat(args, " ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* name */ + strncat(args, "-n ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + strncat(args, trace_name, args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* space */ + strncat(args, " ", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + /* Simply stop tracing and destroy channel */ + strncat(args, "-R", args_left); + args_left = MAX_ARGS_LEN - strlen(args) - 1; + + int retval = execute_command(args, username, password, lttd_path, fac_path); + if(retval) { + gchar msg[256]; + guint msg_left = 256; + + strcpy(msg, "A problem occured when executing the su command : "); + msg_left = 256 - strlen(msg) - 1; + strncat(msg, strerror(retval), msg_left); + GtkWidget *dialogue = + gtk_message_dialog_new( + GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button))), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + msg); + gtk_dialog_run(GTK_DIALOG(dialogue)); + gtk_widget_destroy(dialogue); + return; + } + + + /* Ask to the user if he wants to open the trace in a new window */ + GtkWidget *dialogue; + GtkWidget *label; + gint id; + + dialogue = gtk_dialog_new_with_buttons("Open trace ?", + GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button))), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_YES,GTK_RESPONSE_ACCEPT, + GTK_STOCK_NO,GTK_RESPONSE_REJECT, + NULL); + label = gtk_label_new("Do you want to open the trace in LTTV ?"); + gtk_widget_show(label); + + gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialogue)->vbox), + label); + + id = gtk_dialog_run(GTK_DIALOG(dialogue)); + + switch(id){ + case GTK_RESPONSE_ACCEPT: + { + create_main_window_with_trace(trace_dir); + } + break; + case GTK_RESPONSE_REJECT: + default: + break; + } + gtk_widget_destroy(dialogue); }