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=75921a452bf203af051938a9ed60c3f2c2ff9c65;hpb=86a65fdbbfe799d8a31d1fcfa6774ce9366054d4;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 75921a45..da4df4fb 100644 --- a/ltt/branches/poly/lttv/modules/gui/tracecontrol/tracecontrol.c +++ b/ltt/branches/poly/lttv/modules/gui/tracecontrol/tracecontrol.c @@ -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,8 +318,8 @@ 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:"); @@ -307,37 +328,21 @@ gui_control(Tab *tab) 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 */ @@ -561,137 +537,205 @@ wait_child: ret = waitpid(pid, &status, 0); - if(WIFEXITED(ret)) - if(WEXITSTATUS(ret) != 0) - g_warning("An error occured in the su command : %s", - strerror(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); - /* Command */ - strncat(args, "exec", args_left); - args_left = MAX_ARGS_LEN - strlen(args) - 1; + execlp("su", "su", "-p", "-c", command, username, NULL); + exit(-1); /* not supposed to happen! */ + + //gint ret = execvp(); + + } else { + /* error */ + g_warning("Error happened when forking for su"); + } - /* space */ - strncat(args, " ", args_left); - args_left = MAX_ARGS_LEN - strlen(args) - 1; + return retval; +} - 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; +/* Callbacks */ - /* 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; +void start_clicked (GtkButton *button, gpointer user_data) +{ + ControlData *tcd = (ControlData*)user_data; - /* space */ - strncat(args, " ", args_left); - args_left = MAX_ARGS_LEN - strlen(args) - 1; + 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; - /* trace dir */ - strncat(args, "-t ", args_left); + 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, "-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); - //args_left = MAX_ARGS_LEN - strlen(args) - 1; - - g_message("Executing (as %s) : %s\n", username, args); - - execlp("su", "su", "-p", "-c", args, username, NULL); - exit(-1); /* not supposed to happen! */ - //system(args); - //system("echo blah"); - //exit(0); - - //gint ret = execvp(); - } 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); } } @@ -701,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); }