1 /* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2005 Mathieu Desnoyers
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation;
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
24 #include <glib/gprintf.h>
28 #include <gdk/gdkkeysyms.h>
30 #include <lttv/lttv.h>
31 #include <lttv/module.h>
32 #include <lttv/hook.h>
34 #include <lttvwindow/lttvwindow.h>
35 #include <lttvwindow/lttvwindowtraces.h>
36 #include <lttvwindow/callbacks.h>
37 #include <lttvwindow/lttv_plugin_tab.h>
39 #include "hTraceControlInsert.xpm"
40 #include "TraceControlStart.xpm"
41 #include "TraceControlPause.xpm"
42 #include "TraceControlStop.xpm"
44 #include <sys/types.h>
55 #define MAX_ARGS_LEN PATH_MAX * 10
57 GSList
*g_control_list
= NULL
;
59 /*! \file lttv/modules/gui/tracecontrol/tracecontrol.c
60 * \brief Graphic trace start/stop control interface.
62 * This plugin interacts with lttctl to start/stop tracing. It needs to take the
63 * root password to be able to interact with lttctl.
67 typedef struct _ControlData ControlData
;
72 GtkWidget
*guicontrol_get_widget(ControlData
*tcd
);
73 ControlData
*gui_control(LttvPluginTab
*ptab
);
74 void gui_control_destructor(ControlData
*tcd
);
75 GtkWidget
* h_guicontrol(LttvPlugin
*plugin
);
76 void control_destroy_walk(gpointer data
, gpointer user_data
);
82 static void arm_clicked (GtkButton
*button
, gpointer user_data
);
83 static void disarm_clicked (GtkButton
*button
, gpointer user_data
);
84 static void start_clicked (GtkButton
*button
, gpointer user_data
);
85 static void pause_clicked (GtkButton
*button
, gpointer user_data
);
86 static void unpause_clicked (GtkButton
*button
, gpointer user_data
);
87 static void stop_clicked (GtkButton
*button
, gpointer user_data
);
91 * @struct _ControlData
93 * @brief Main structure of gui control
96 Tab
*tab
; /**< current tab of module */
98 GtkWidget
*window
; /**< window */
100 GtkWidget
*main_box
; /**< main container */
101 GtkWidget
*ltt_armall_button
;
102 GtkWidget
*ltt_disarmall_button
;
103 GtkWidget
*start_button
;
104 GtkWidget
*pause_button
;
105 GtkWidget
*unpause_button
;
106 GtkWidget
*stop_button
;
107 GtkWidget
*username_label
;
108 GtkWidget
*username_entry
;
109 GtkWidget
*password_label
;
110 GtkWidget
*password_entry
;
111 GtkWidget
*channel_dir_label
;
112 GtkWidget
*channel_dir_entry
;
113 GtkWidget
*trace_dir_label
;
114 GtkWidget
*trace_dir_entry
;
115 GtkWidget
*trace_name_label
;
116 GtkWidget
*trace_name_entry
;
117 GtkWidget
*trace_mode_label
;
118 GtkWidget
*trace_mode_combo
;
119 GtkWidget
*start_daemon_label
;
120 GtkWidget
*start_daemon_check
;
121 GtkWidget
*append_label
;
122 GtkWidget
*append_check
;
123 GtkWidget
*optional_label
;
124 GtkWidget
*subbuf_size_label
;
125 GtkWidget
*subbuf_size_entry
;
126 GtkWidget
*subbuf_num_label
;
127 GtkWidget
*subbuf_num_entry
;
128 GtkWidget
*lttd_threads_label
;
129 GtkWidget
*lttd_threads_entry
;
130 GtkWidget
*lttctl_path_label
;
131 GtkWidget
*lttctl_path_entry
;
132 GtkWidget
*lttd_path_label
;
133 GtkWidget
*lttd_path_entry
;
134 GtkWidget
*ltt_armall_path_label
;
135 GtkWidget
*ltt_armall_path_entry
;
136 GtkWidget
*ltt_disarmall_path_label
;
137 GtkWidget
*ltt_disarmall_path_entry
;
141 * @fn GtkWidget* guicontrol_get_widget(ControlData*)
143 * This function returns the current main widget
144 * used by this module
145 * @param tcd the module struct
146 * @return The main widget
149 guicontrol_get_widget(ControlData
*tcd
)
155 * @fn ControlData* gui_control(Tab*)
157 * Constructor is used to create ControlData data structure.
158 * @param tab The tab structure used by the widget
159 * @return The Filter viewer data created.
162 gui_control(LttvPluginTab
*ptab
)
164 Tab
*tab
= ptab
->tab
;
165 g_debug("filter::gui_control()");
168 GtkCellRenderer
*renderer
;
169 GtkTreeViewColumn
*column
;
171 ControlData
* tcd
= g_new(ControlData
,1);
175 tcd
->window
= gtk_window_new(GTK_WINDOW_TOPLEVEL
);
176 gtk_window_set_title(GTK_WINDOW(tcd
->window
), "LTTng Trace Control");
178 * Initiating GtkTable layout
179 * starts with 2 rows and 5 columns and
180 * expands when expressions added
182 tcd
->main_box
= gtk_table_new(14,7,FALSE
);
183 gtk_table_set_row_spacings(GTK_TABLE(tcd
->main_box
),5);
184 gtk_table_set_col_spacings(GTK_TABLE(tcd
->main_box
),5);
186 gtk_container_add(GTK_CONTAINER(tcd
->window
), GTK_WIDGET(tcd
->main_box
));
188 GList
*focus_chain
= NULL
;
191 * start/pause/stop buttons
196 pixbuf
= gdk_pixbuf_new_from_xpm_data((const char **)TraceControlStart_xpm
);
197 image
= gtk_image_new_from_pixbuf(pixbuf
);
198 tcd
->ltt_armall_button
= gtk_button_new_with_label("Arm LTTng kernel probes");
199 //2.6 gtk_button_set_image(GTK_BUTTON(tcd->ltt_armall_button), image);
200 g_object_set(G_OBJECT(tcd
->ltt_armall_button
), "image", image
, NULL
);
201 gtk_button_set_alignment(GTK_BUTTON(tcd
->ltt_armall_button
), 0.0, 0.0);
202 gtk_widget_show (tcd
->ltt_armall_button
);
203 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->ltt_armall_button
,6,7,0,1,GTK_FILL
,GTK_FILL
,2,2);
205 pixbuf
= gdk_pixbuf_new_from_xpm_data((const char **)TraceControlStop_xpm
);
206 image
= gtk_image_new_from_pixbuf(pixbuf
);
207 tcd
->ltt_disarmall_button
= gtk_button_new_with_label("Disarm LTTng kernel probes");
208 //2.6 gtk_button_set_image(GTK_BUTTON(tcd->ltt_disarmall_button), image);
209 g_object_set(G_OBJECT(tcd
->ltt_disarmall_button
), "image", image
, NULL
);
210 gtk_button_set_alignment(GTK_BUTTON(tcd
->ltt_disarmall_button
), 0.0, 0.0);
211 gtk_widget_show (tcd
->ltt_disarmall_button
);
212 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->ltt_disarmall_button
,6,7,1,2,GTK_FILL
,GTK_FILL
,2,2);
214 pixbuf
= gdk_pixbuf_new_from_xpm_data((const char **)TraceControlStart_xpm
);
215 image
= gtk_image_new_from_pixbuf(pixbuf
);
216 tcd
->start_button
= gtk_button_new_with_label("start");
217 //2.6 gtk_button_set_image(GTK_BUTTON(tcd->start_button), image);
218 g_object_set(G_OBJECT(tcd
->start_button
), "image", image
, NULL
);
219 gtk_button_set_alignment(GTK_BUTTON(tcd
->start_button
), 0.0, 0.0);
220 gtk_widget_show (tcd
->start_button
);
221 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->start_button
,6,7,2,3,GTK_FILL
,GTK_FILL
,2,2);
223 pixbuf
= gdk_pixbuf_new_from_xpm_data((const char **)TraceControlPause_xpm
);
224 image
= gtk_image_new_from_pixbuf(pixbuf
);
225 tcd
->pause_button
= gtk_button_new_with_label("pause");
226 //2.6 gtk_button_set_image(GTK_BUTTON(tcd->pause_button), image);
227 g_object_set(G_OBJECT(tcd
->pause_button
), "image", image
, NULL
);
228 gtk_button_set_alignment(GTK_BUTTON(tcd
->pause_button
), 0.0, 0.0);
229 gtk_widget_show (tcd
->pause_button
);
230 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->pause_button
,6,7,3,4,GTK_FILL
,GTK_FILL
,2,2);
232 pixbuf
= gdk_pixbuf_new_from_xpm_data((const char **)TraceControlPause_xpm
);
233 image
= gtk_image_new_from_pixbuf(pixbuf
);
234 tcd
->unpause_button
= gtk_button_new_with_label("unpause");
235 //2.6 gtk_button_set_image(GTK_BUTTON(tcd->unpause_button), image);
236 g_object_set(G_OBJECT(tcd
->unpause_button
), "image", image
, NULL
);
237 gtk_button_set_alignment(GTK_BUTTON(tcd
->unpause_button
), 0.0, 0.0);
238 gtk_widget_show (tcd
->unpause_button
);
239 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->unpause_button
,6,7,4,5,GTK_FILL
,GTK_FILL
,2,2);
241 pixbuf
= gdk_pixbuf_new_from_xpm_data((const char **)TraceControlStop_xpm
);
242 image
= gtk_image_new_from_pixbuf(pixbuf
);
243 tcd
->stop_button
= gtk_button_new_with_label("stop");
244 //2.6 gtk_button_set_image(GTK_BUTTON(tcd->stop_button), image);
245 g_object_set(G_OBJECT(tcd
->stop_button
), "image", image
, NULL
);
246 gtk_button_set_alignment(GTK_BUTTON(tcd
->stop_button
), 0.0, 0.0);
247 gtk_widget_show (tcd
->stop_button
);
248 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->stop_button
,6,7,5,6,GTK_FILL
,GTK_FILL
,2,2);
251 * First half of the filter window
252 * - textual entry of filter expression
253 * - processing button
255 tcd
->username_label
= gtk_label_new("Username:");
256 gtk_widget_show (tcd
->username_label
);
257 tcd
->username_entry
= gtk_entry_new();
258 gtk_entry_set_text(GTK_ENTRY(tcd
->username_entry
),"root");
259 gtk_widget_show (tcd
->username_entry
);
260 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->username_label
,0,2,0,1,GTK_FILL
,GTK_FILL
,2,2);
261 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->username_entry
,2,6,0,1,GTK_FILL
|GTK_EXPAND
|GTK_SHRINK
,GTK_FILL
,0,0);
265 tcd
->password_label
= gtk_label_new("Password:");
266 gtk_widget_show (tcd
->password_label
);
267 tcd
->password_entry
= gtk_entry_new();
268 gtk_entry_set_visibility(GTK_ENTRY(tcd
->password_entry
), FALSE
);
269 gtk_widget_show (tcd
->password_entry
);
270 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->password_label
,0,2,1,2,GTK_FILL
,GTK_FILL
,2,2);
271 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->password_entry
,2,6,1,2,GTK_FILL
|GTK_EXPAND
|GTK_SHRINK
,GTK_FILL
,0,0);
274 tcd
->channel_dir_label
= gtk_label_new("Channel directory:");
275 gtk_widget_show (tcd
->channel_dir_label
);
276 tcd
->channel_dir_entry
= gtk_entry_new();
277 gtk_entry_set_text(GTK_ENTRY(tcd
->channel_dir_entry
),"/mnt/debugfs/ltt");
278 gtk_widget_show (tcd
->channel_dir_entry
);
279 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->channel_dir_label
,0,2,2,3,GTK_FILL
,GTK_FILL
,2,2);
280 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->channel_dir_entry
,2,6,2,3,GTK_FILL
|GTK_EXPAND
|GTK_SHRINK
,GTK_FILL
,0,0);
282 tcd
->trace_dir_label
= gtk_label_new("Trace directory:");
283 gtk_widget_show (tcd
->trace_dir_label
);
284 tcd
->trace_dir_entry
= gtk_entry_new();
285 gtk_entry_set_text(GTK_ENTRY(tcd
->trace_dir_entry
),"/tmp/trace1");
286 gtk_widget_show (tcd
->trace_dir_entry
);
287 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->trace_dir_label
,0,2,3,4,GTK_FILL
,GTK_FILL
,2,2);
288 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->trace_dir_entry
,2,6,3,4,GTK_FILL
|GTK_EXPAND
|GTK_SHRINK
,GTK_FILL
,0,0);
290 tcd
->trace_name_label
= gtk_label_new("Trace name:");
291 gtk_widget_show (tcd
->trace_name_label
);
292 tcd
->trace_name_entry
= gtk_entry_new();
293 gtk_entry_set_text(GTK_ENTRY(tcd
->trace_name_entry
),"trace");
294 gtk_widget_show (tcd
->trace_name_entry
);
295 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->trace_name_label
,0,2,4,5,GTK_FILL
,GTK_FILL
,2,2);
296 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->trace_name_entry
,2,6,4,5,GTK_FILL
|GTK_EXPAND
|GTK_SHRINK
,GTK_FILL
,0,0);
298 tcd
->trace_mode_label
= gtk_label_new("Trace mode ");
299 gtk_widget_show (tcd
->trace_mode_label
);
300 tcd
->trace_mode_combo
= gtk_combo_box_new_text();
301 gtk_combo_box_append_text(GTK_COMBO_BOX(tcd
->trace_mode_combo
),
303 gtk_combo_box_append_text(GTK_COMBO_BOX(tcd
->trace_mode_combo
),
305 gtk_combo_box_set_active(GTK_COMBO_BOX(tcd
->trace_mode_combo
), 0);
306 gtk_widget_show (tcd
->trace_mode_combo
);
307 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->trace_mode_label
,0,2,5,6,GTK_FILL
,GTK_FILL
,2,2);
308 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->trace_mode_combo
,2,6,5,6,GTK_FILL
|GTK_EXPAND
|GTK_SHRINK
,GTK_FILL
,0,0);
310 tcd
->start_daemon_label
= gtk_label_new("Start daemon ");
311 gtk_widget_show (tcd
->start_daemon_label
);
312 tcd
->start_daemon_check
= gtk_check_button_new();
313 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tcd
->start_daemon_check
), TRUE
);
314 gtk_widget_show (tcd
->start_daemon_check
);
315 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->start_daemon_label
,0,2,6,7,GTK_FILL
,GTK_FILL
,2,2);
316 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->start_daemon_check
,2,6,6,7,GTK_FILL
,GTK_FILL
,0,0);
318 tcd
->append_label
= gtk_label_new("Append to trace ");
319 gtk_widget_show (tcd
->append_label
);
320 tcd
->append_check
= gtk_check_button_new();
321 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tcd
->append_check
), FALSE
);
322 gtk_widget_show (tcd
->append_check
);
323 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->append_label
,0,2,7,8,GTK_FILL
,GTK_FILL
,2,2);
324 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->append_check
,2,6,7,8,GTK_FILL
,GTK_FILL
,0,0);
327 tcd
->optional_label
= gtk_label_new("Optional fields ");
328 gtk_widget_show (tcd
->optional_label
);
329 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->optional_label
,0,6,8,9,GTK_FILL
,GTK_FILL
,2,2);
331 tcd
->subbuf_size_label
= gtk_label_new("Subbuffer size:");
332 gtk_widget_show (tcd
->subbuf_size_label
);
333 tcd
->subbuf_size_entry
= gtk_entry_new();
334 gtk_widget_show (tcd
->subbuf_size_entry
);
335 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->subbuf_size_label
,0,2,9,10,GTK_FILL
,GTK_FILL
,2,2);
336 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);
338 tcd
->subbuf_num_label
= gtk_label_new("Number of subbuffers:");
339 gtk_widget_show (tcd
->subbuf_num_label
);
340 tcd
->subbuf_num_entry
= gtk_entry_new();
341 gtk_widget_show (tcd
->subbuf_num_entry
);
342 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->subbuf_num_label
,0,2,10,11,GTK_FILL
,GTK_FILL
,2,2);
343 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);
345 tcd
->lttd_threads_label
= gtk_label_new("Number of lttd threads:");
346 gtk_widget_show (tcd
->lttd_threads_label
);
347 tcd
->lttd_threads_entry
= gtk_entry_new();
348 gtk_entry_set_text(GTK_ENTRY(tcd
->lttd_threads_entry
), "1");
349 gtk_widget_show (tcd
->lttd_threads_entry
);
350 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->lttd_threads_label
,0,2,11,12,GTK_FILL
,GTK_FILL
,2,2);
351 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->lttd_threads_entry
,2,6,11,12,GTK_FILL
|GTK_EXPAND
|GTK_SHRINK
,GTK_FILL
,0,0);
353 tcd
->lttctl_path_label
= gtk_label_new("path to lttctl:");
354 gtk_widget_show (tcd
->lttctl_path_label
);
355 tcd
->lttctl_path_entry
= gtk_entry_new();
356 gtk_entry_set_text(GTK_ENTRY(tcd
->lttctl_path_entry
),PACKAGE_BIN_DIR
"/lttctl");
357 gtk_widget_show (tcd
->lttctl_path_entry
);
358 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->lttctl_path_label
,0,2,12,13,GTK_FILL
,GTK_FILL
,2,2);
359 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->lttctl_path_entry
,2,6,12,13,GTK_FILL
|GTK_EXPAND
|GTK_SHRINK
,GTK_FILL
,0,0);
362 tcd
->lttd_path_label
= gtk_label_new("path to lttd:");
363 gtk_widget_show (tcd
->lttd_path_label
);
364 tcd
->lttd_path_entry
= gtk_entry_new();
365 gtk_entry_set_text(GTK_ENTRY(tcd
->lttd_path_entry
),PACKAGE_BIN_DIR
"/lttd");
366 gtk_widget_show (tcd
->lttd_path_entry
);
367 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->lttd_path_label
,0,2,13,14,GTK_FILL
,GTK_FILL
,2,2);
368 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->lttd_path_entry
,2,6,13,14,GTK_FILL
|GTK_EXPAND
|GTK_SHRINK
,GTK_FILL
,0,0);
370 tcd
->ltt_armall_path_label
= gtk_label_new("path to ltt_armall:");
371 gtk_widget_show (tcd
->ltt_armall_path_label
);
372 tcd
->ltt_armall_path_entry
= gtk_entry_new();
373 gtk_entry_set_text(GTK_ENTRY(tcd
->ltt_armall_path_entry
),PACKAGE_BIN_DIR
"/ltt-armall");
374 gtk_widget_show (tcd
->ltt_armall_path_entry
);
375 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->ltt_armall_path_label
,0,2,14,15,GTK_FILL
,GTK_FILL
,2,2);
376 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->ltt_armall_path_entry
,2,6,14,15,GTK_FILL
|GTK_EXPAND
|GTK_SHRINK
,GTK_FILL
,0,0);
378 tcd
->ltt_disarmall_path_label
= gtk_label_new("path to ltt_disarmall:");
379 gtk_widget_show (tcd
->ltt_disarmall_path_label
);
380 tcd
->ltt_disarmall_path_entry
= gtk_entry_new();
381 gtk_entry_set_text(GTK_ENTRY(tcd
->ltt_disarmall_path_entry
),PACKAGE_BIN_DIR
"/ltt-disarmall");
382 gtk_widget_show (tcd
->ltt_disarmall_path_entry
);
383 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->ltt_disarmall_path_label
,0,2,15,16,GTK_FILL
,GTK_FILL
,2,2);
384 gtk_table_attach( GTK_TABLE(tcd
->main_box
),tcd
->ltt_disarmall_path_entry
,2,6,15,16,GTK_FILL
|GTK_EXPAND
|GTK_SHRINK
,GTK_FILL
,0,0);
386 focus_chain
= g_list_append (focus_chain
, tcd
->username_entry
);
387 focus_chain
= g_list_append (focus_chain
, tcd
->password_entry
);
388 focus_chain
= g_list_append (focus_chain
, tcd
->ltt_armall_path_entry
);
389 focus_chain
= g_list_append (focus_chain
, tcd
->ltt_disarmall_path_entry
);
390 focus_chain
= g_list_append (focus_chain
, tcd
->start_button
);
391 focus_chain
= g_list_append (focus_chain
, tcd
->pause_button
);
392 focus_chain
= g_list_append (focus_chain
, tcd
->unpause_button
);
393 focus_chain
= g_list_append (focus_chain
, tcd
->stop_button
);
394 focus_chain
= g_list_append (focus_chain
, tcd
->channel_dir_entry
);
395 focus_chain
= g_list_append (focus_chain
, tcd
->trace_dir_entry
);
396 focus_chain
= g_list_append (focus_chain
, tcd
->trace_name_entry
);
397 focus_chain
= g_list_append (focus_chain
, tcd
->trace_mode_combo
);
398 focus_chain
= g_list_append (focus_chain
, tcd
->start_daemon_check
);
399 focus_chain
= g_list_append (focus_chain
, tcd
->append_check
);
400 focus_chain
= g_list_append (focus_chain
, tcd
->subbuf_size_entry
);
401 focus_chain
= g_list_append (focus_chain
, tcd
->subbuf_num_entry
);
402 focus_chain
= g_list_append (focus_chain
, tcd
->lttd_threads_entry
);
403 focus_chain
= g_list_append (focus_chain
, tcd
->lttctl_path_entry
);
404 focus_chain
= g_list_append (focus_chain
, tcd
->lttd_path_entry
);
406 gtk_container_set_focus_chain(GTK_CONTAINER(tcd
->main_box
), focus_chain
);
408 g_list_free(focus_chain
);
410 g_signal_connect(G_OBJECT(tcd
->start_button
), "clicked",
411 (GCallback
)start_clicked
, tcd
);
412 g_signal_connect(G_OBJECT(tcd
->pause_button
), "clicked",
413 (GCallback
)pause_clicked
, tcd
);
414 g_signal_connect(G_OBJECT(tcd
->unpause_button
), "clicked",
415 (GCallback
)unpause_clicked
, tcd
);
416 g_signal_connect(G_OBJECT(tcd
->stop_button
), "clicked",
417 (GCallback
)stop_clicked
, tcd
);
418 g_signal_connect(G_OBJECT(tcd
->ltt_armall_button
), "clicked",
419 (GCallback
)arm_clicked
, tcd
);
420 g_signal_connect(G_OBJECT(tcd
->ltt_disarmall_button
), "clicked",
421 (GCallback
)disarm_clicked
, tcd
);
424 * show main container
426 gtk_widget_show(tcd
->main_box
);
427 gtk_widget_show(tcd
->window
);
430 g_object_set_data_full(
431 G_OBJECT(guicontrol_get_widget(tcd
)),
432 "control_viewer_data",
434 (GDestroyNotify
)gui_control_destructor
);
436 g_control_list
= g_slist_append(
445 * @fn void gui_control_destructor(ControlData*)
447 * Destructor for the filter gui module
448 * @param tcd The module structure
451 gui_control_destructor(ControlData
*tcd
)
455 /* May already been done by GTK window closing */
456 if(GTK_IS_WIDGET(guicontrol_get_widget(tcd
))){
457 g_info("widget still exists");
460 // lttvwindow_unregister_traceset_notify(tcd->tab,
461 // filter_traceset_changed,
462 // filter_viewer_data);
464 lttvwindowtraces_background_notify_remove(tcd
);
466 g_control_list
= g_slist_remove(g_control_list
, tcd
);
471 static int execute_command(const gchar
*command
, const gchar
*username
,
472 const gchar
*password
, const gchar
*lttd_path
)
476 pid
= forkpty(&fdpty
, NULL
, NULL
, NULL
);
484 /* discuss with su */
485 struct timeval timeout
;
489 struct pollfd pollfd
;
492 enum read_state
{ GET_LINE
, GET_SEMI
, GET_SPACE
} read_state
= GET_LINE
;
494 retval
= fcntl(fdpty
, F_SETFL
, O_WRONLY
);
496 perror("Error in fcntl");
500 /* Read the output from the child terminal before the prompt. If no data in
501 * 200 ms, we stop reading to give the password */
502 g_info("Reading from child console...");
505 pollfd
.events
= POLLIN
|POLLPRI
|POLLERR
|POLLHUP
|POLLNVAL
;
507 num_rdy
= poll(&pollfd
, 1, -1);
509 perror("Poll error");
513 /* Timeout : Stop waiting for chars */
514 if(num_rdy
== 0) goto wait_child
;
516 switch(pollfd
.revents
) {
518 g_warning("Error returned in polling fd\n");
522 g_info("Polling FD : hung up.");
526 g_warning("Polling fd tells it is not open");
531 count
= read (fdpty
, buf
, 256);
536 for(i
=0; i
<count
; i
++) {
540 read_state
= GET_SEMI
;
541 g_debug("Tracecontrol input line skip\n");
546 g_debug("Tracecontrol input : marker found\n");
547 read_state
= GET_SPACE
;
552 g_debug("Tracecontrol input space marker found\n");
558 } else if(count
== -1) {
559 perror("Error in read");
565 g_warning("Child hung up too fast");
572 pollfd
.events
= POLLOUT
|POLLERR
|POLLHUP
|POLLNVAL
;
574 num_rdy
= poll(&pollfd
, 1, -1);
576 perror("Poll error");
580 /* Write the password */
581 g_info("Got su prompt, now writing password...");
584 ret
= write(fdpty
, password
, strlen(password
));
585 if(ret
< 0) perror("Error in write");
586 ret
= write(fdpty
, "\n", 1);
587 if(ret
< 0) perror("Error in write");
589 /* Take the output from the terminal and show it on the real console */
590 g_info("Getting data from child terminal...");
594 pollfd
.events
= POLLIN
|POLLPRI
|POLLERR
|POLLHUP
|POLLNVAL
;
596 num_rdy
= poll(&pollfd
, 1, -1);
598 perror("Poll error");
601 if(num_rdy
== 0) break;
603 if(pollfd
.revents
& (POLLERR
|POLLNVAL
)) {
604 g_warning("Error returned in polling fd\n");
608 if(pollfd
.revents
& (POLLIN
|POLLPRI
) ) {
609 count
= read (fdpty
, buf
, 256);
613 } else if(count
== -1) {
614 perror("Error in read");
619 if(pollfd
.revents
& POLLHUP
) {
620 g_info("Polling FD : hung up.");
624 if(num_hup
> 0) goto wait_child
;
627 g_info("Waiting for child exit...");
629 ret
= waitpid(pid
, &status
, 0);
632 g_warning("An error occured in wait : %s",
635 if(WIFEXITED(status
))
636 if(WEXITSTATUS(status
) != 0) {
637 retval
= WEXITSTATUS(status
);
638 g_warning("An error occured in the su command : %s",
643 g_info("Child exited.");
645 } else if(pid
== 0) {
646 /* Setup environment variables */
647 if(strcmp(lttd_path
, "") != 0)
648 setenv("LTT_DAEMON", lttd_path
, 1);
650 /* One comment line (must be only one) */
651 g_printf("Executing (as %s) : %s\n", username
, command
);
653 execlp("su", "su", "-p", "-c", command
, username
, NULL
);
654 exit(-1); /* not supposed to happen! */
656 //gint ret = execvp();
660 g_warning("Error happened when forking for su");
669 void start_clicked (GtkButton
*button
, gpointer user_data
)
671 ControlData
*tcd
= (ControlData
*)user_data
;
673 const gchar
*username
= gtk_entry_get_text(GTK_ENTRY(tcd
->username_entry
));
674 const gchar
*password
= gtk_entry_get_text(GTK_ENTRY(tcd
->password_entry
));
675 const gchar
*channel_dir
=
676 gtk_entry_get_text(GTK_ENTRY(tcd
->channel_dir_entry
));
677 const gchar
*trace_dir
= gtk_entry_get_text(GTK_ENTRY(tcd
->trace_dir_entry
));
678 const gchar
*trace_name
=
679 gtk_entry_get_text(GTK_ENTRY(tcd
->trace_name_entry
));
681 const gchar
*trace_mode_sel
;
684 gtk_combo_box_get_active_iter(GTK_COMBO_BOX(tcd
->trace_mode_combo
), &iter
);
686 gtk_combo_box_get_model(GTK_COMBO_BOX(tcd
->trace_mode_combo
)),
687 &iter
, 0, &trace_mode_sel
, -1);
688 //const gchar *trace_mode_sel =
689 //2.6+ gtk_combo_box_get_active_text(GTK_COMBO_BOX(tcd->trace_mode_combo));
690 const gchar
*trace_mode
;
691 if(strcmp(trace_mode_sel
, "normal") == 0)
692 trace_mode
= "normal";
694 trace_mode
= "flight";
696 gboolean start_daemon
=
697 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tcd
->start_daemon_check
));
700 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tcd
->append_check
));
702 const gchar
*subbuf_size
=
703 gtk_entry_get_text(GTK_ENTRY(tcd
->subbuf_size_entry
));
704 const gchar
*subbuf_num
=
705 gtk_entry_get_text(GTK_ENTRY(tcd
->subbuf_num_entry
));
706 const gchar
*threads_num
=
707 gtk_entry_get_text(GTK_ENTRY(tcd
->lttd_threads_entry
));
708 const gchar
*lttctl_path
=
709 gtk_entry_get_text(GTK_ENTRY(tcd
->lttctl_path_entry
));
710 const gchar
*lttd_path
= gtk_entry_get_text(GTK_ENTRY(tcd
->lttd_path_entry
));
712 /* Setup arguments to su */
714 gchar args
[MAX_ARGS_LEN
];
715 gint args_left
= MAX_ARGS_LEN
- 1; /* for \0 */
720 strncat(args
, "exec", args_left
);
721 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
724 strncat(args
, " ", args_left
);
725 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
727 if(strcmp(lttctl_path
, "") == 0)
728 strncat(args
, "lttctl", args_left
);
730 strncat(args
, lttctl_path
, args_left
);
731 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
734 strncat(args
, " ", args_left
);
735 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
739 strncat(args
, "-C", args_left
);
740 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
742 /* Simply create the channel and then start tracing */
743 //strncat(args, "-b", args_left);
744 //args_left = MAX_ARGS_LEN - strlen(args) - 1;
748 strncat(args
, " ", args_left
);
749 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
752 strncat(args
, "--channel_root ", args_left
);
753 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
754 strncat(args
, channel_dir
, args_left
);
755 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
758 strncat(args
, " ", args_left
);
759 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
762 strncat(args
, "-w ", args_left
);
763 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
764 strncat(args
, trace_dir
, args_left
);
765 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
768 strncat(args
, " ", args_left
);
769 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
771 if(strcmp(trace_mode
, "flight") == 0) {
772 strncat(args
, "-o channel.all.overwrite=1", args_left
);
773 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
775 strncat(args
, "-o channel.all.overwrite=0", args_left
);
776 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
779 /* Append to trace ? */
782 strncat(args
, " ", args_left
);
783 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
784 strncat(args
, "-a", args_left
);
785 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
788 /* optional arguments */
790 if(strcmp(subbuf_size
, "") != 0) {
792 strncat(args
, " ", args_left
);
793 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
795 strncat(args
, "-o channel.all.bufsize=", args_left
);
796 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
797 strncat(args
, subbuf_size
, args_left
);
798 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
801 /* number of subbuffers */
802 if(strcmp(subbuf_num
, "") != 0) {
804 strncat(args
, " ", args_left
);
805 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
807 strncat(args
, "-o channel.all.bufnum=", args_left
);
808 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
809 strncat(args
, subbuf_num
, args_left
);
810 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
813 /* number of lttd threads */
814 if(strcmp(threads_num
, "") != 0) {
816 strncat(args
, " ", args_left
);
817 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
819 strncat(args
, "-n ", args_left
);
820 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
821 strncat(args
, threads_num
, args_left
);
822 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
826 strncat(args
, " ", args_left
);
827 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
830 strncat(args
, trace_name
, args_left
);
831 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
833 int retval
= execute_command(args
, username
, password
, lttd_path
);
837 guint msg_left
= 256;
839 strcpy(msg
, "A problem occured when executing the su command : ");
840 msg_left
= 256 - strlen(msg
) - 1;
841 strncat(msg
, strerror(retval
), msg_left
);
842 GtkWidget
*dialogue
=
843 gtk_message_dialog_new(
844 GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button
))),
845 GTK_DIALOG_MODAL
|GTK_DIALOG_DESTROY_WITH_PARENT
,
849 gtk_dialog_run(GTK_DIALOG(dialogue
));
850 gtk_widget_destroy(dialogue
);
856 void pause_clicked (GtkButton
*button
, gpointer user_data
)
858 ControlData
*tcd
= (ControlData
*)user_data
;
860 const gchar
*username
= gtk_entry_get_text(GTK_ENTRY(tcd
->username_entry
));
861 const gchar
*password
= gtk_entry_get_text(GTK_ENTRY(tcd
->password_entry
));
862 const gchar
*trace_name
=
863 gtk_entry_get_text(GTK_ENTRY(tcd
->trace_name_entry
));
864 const gchar
*lttd_path
= "";
866 const gchar
*lttctl_path
=
867 gtk_entry_get_text(GTK_ENTRY(tcd
->lttctl_path_entry
));
869 /* Setup arguments to su */
871 gchar args
[MAX_ARGS_LEN
];
872 gint args_left
= MAX_ARGS_LEN
- 1; /* for \0 */
877 strncat(args
, "exec", args_left
);
878 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
881 strncat(args
, " ", args_left
);
882 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
884 if(strcmp(lttctl_path
, "") == 0)
885 strncat(args
, "lttctl", args_left
);
887 strncat(args
, lttctl_path
, args_left
);
888 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
891 strncat(args
, " ", args_left
);
892 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
894 /* Simply pause tracing */
895 strncat(args
, "-p", args_left
);
896 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
899 strncat(args
, " ", args_left
);
900 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
903 strncat(args
, trace_name
, args_left
);
904 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
906 int retval
= execute_command(args
, username
, password
, lttd_path
);
909 guint msg_left
= 256;
911 strcpy(msg
, "A problem occured when executing the su command : ");
912 msg_left
= 256 - strlen(msg
) - 1;
913 strncat(msg
, strerror(retval
), msg_left
);
914 GtkWidget
*dialogue
=
915 gtk_message_dialog_new(
916 GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button
))),
917 GTK_DIALOG_MODAL
|GTK_DIALOG_DESTROY_WITH_PARENT
,
921 gtk_dialog_run(GTK_DIALOG(dialogue
));
922 gtk_widget_destroy(dialogue
);
927 void unpause_clicked (GtkButton
*button
, gpointer user_data
)
929 ControlData
*tcd
= (ControlData
*)user_data
;
931 const gchar
*username
= gtk_entry_get_text(GTK_ENTRY(tcd
->username_entry
));
932 const gchar
*password
= gtk_entry_get_text(GTK_ENTRY(tcd
->password_entry
));
933 const gchar
*trace_name
=
934 gtk_entry_get_text(GTK_ENTRY(tcd
->trace_name_entry
));
935 const gchar
*lttd_path
= "";
937 const gchar
*lttctl_path
=
938 gtk_entry_get_text(GTK_ENTRY(tcd
->lttctl_path_entry
));
940 /* Setup arguments to su */
942 gchar args
[MAX_ARGS_LEN
];
943 gint args_left
= MAX_ARGS_LEN
- 1; /* for \0 */
948 strncat(args
, "exec", args_left
);
949 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
952 strncat(args
, " ", args_left
);
953 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
955 if(strcmp(lttctl_path
, "") == 0)
956 strncat(args
, "lttctl", args_left
);
958 strncat(args
, lttctl_path
, args_left
);
959 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
962 strncat(args
, " ", args_left
);
963 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
965 /* Simply unpause tracing */
966 strncat(args
, "-s", args_left
);
967 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
970 strncat(args
, " ", args_left
);
971 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
974 strncat(args
, trace_name
, args_left
);
975 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
977 int retval
= execute_command(args
, username
, password
, lttd_path
);
980 guint msg_left
= 256;
982 strcpy(msg
, "A problem occured when executing the su command : ");
983 msg_left
= 256 - strlen(msg
) - 1;
984 strncat(msg
, strerror(retval
), msg_left
);
985 GtkWidget
*dialogue
=
986 gtk_message_dialog_new(
987 GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button
))),
988 GTK_DIALOG_MODAL
|GTK_DIALOG_DESTROY_WITH_PARENT
,
992 gtk_dialog_run(GTK_DIALOG(dialogue
));
993 gtk_widget_destroy(dialogue
);
998 void stop_clicked (GtkButton
*button
, gpointer user_data
)
1000 ControlData
*tcd
= (ControlData
*)user_data
;
1002 const gchar
*username
= gtk_entry_get_text(GTK_ENTRY(tcd
->username_entry
));
1003 const gchar
*password
= gtk_entry_get_text(GTK_ENTRY(tcd
->password_entry
));
1004 const gchar
*trace_name
=
1005 gtk_entry_get_text(GTK_ENTRY(tcd
->trace_name_entry
));
1006 const gchar
*lttd_path
= "";
1007 const gchar
*trace_mode
;
1008 const gchar
*trace_mode_sel
;
1011 gtk_combo_box_get_active_iter(GTK_COMBO_BOX(tcd
->trace_mode_combo
), &iter
);
1013 gtk_combo_box_get_model(GTK_COMBO_BOX(tcd
->trace_mode_combo
)),
1014 &iter
, 0, &trace_mode_sel
, -1);
1015 if(strcmp(trace_mode_sel
, "normal") == 0)
1016 trace_mode
= "normal";
1018 trace_mode
= "flight";
1020 const gchar
*lttctl_path
=
1021 gtk_entry_get_text(GTK_ENTRY(tcd
->lttctl_path_entry
));
1022 gchar
*trace_dir
= gtk_entry_get_text(GTK_ENTRY(tcd
->trace_dir_entry
));
1023 GSList
* trace_list
= NULL
;
1025 trace_list
= g_slist_append(trace_list
, trace_dir
);
1027 /* Setup arguments to su */
1029 gchar args
[MAX_ARGS_LEN
];
1030 gint args_left
= MAX_ARGS_LEN
- 1; /* for \0 */
1035 strncat(args
, "exec", args_left
);
1036 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
1039 strncat(args
, " ", args_left
);
1040 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
1042 if(strcmp(lttctl_path
, "") == 0)
1043 strncat(args
, "lttctl", args_left
);
1045 strncat(args
, lttctl_path
, args_left
);
1046 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
1049 strncat(args
, " ", args_left
);
1050 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
1052 /* Simply stop tracing and destroy channel */
1053 strncat(args
, "-D", args_left
);
1054 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
1056 if(strcmp(trace_mode
, "flight") == 0) {
1058 strncat(args
, " ", args_left
);
1059 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
1062 strncat(args
, "-w ", args_left
);
1063 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
1064 strncat(args
, trace_dir
, args_left
);
1065 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
1069 strncat(args
, " ", args_left
);
1070 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
1073 strncat(args
, trace_name
, args_left
);
1074 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
1076 int retval
= execute_command(args
, username
, password
, lttd_path
);
1079 guint msg_left
= 256;
1081 strcpy(msg
, "A problem occured when executing the su command : ");
1082 msg_left
= 256 - strlen(msg
) - 1;
1083 strncat(msg
, strerror(retval
), msg_left
);
1084 GtkWidget
*dialogue
=
1085 gtk_message_dialog_new(
1086 GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button
))),
1087 GTK_DIALOG_MODAL
|GTK_DIALOG_DESTROY_WITH_PARENT
,
1091 gtk_dialog_run(GTK_DIALOG(dialogue
));
1092 gtk_widget_destroy(dialogue
);
1097 /* Ask to the user if he wants to open the trace in a new window */
1098 GtkWidget
*dialogue
;
1102 dialogue
= gtk_dialog_new_with_buttons("Open trace ?",
1103 GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button
))),
1104 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
1105 GTK_STOCK_YES
,GTK_RESPONSE_ACCEPT
,
1106 GTK_STOCK_NO
,GTK_RESPONSE_REJECT
,
1108 label
= gtk_label_new("Do you want to open the trace in LTTV ?");
1109 gtk_widget_show(label
);
1111 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialogue
)->vbox
),
1114 id
= gtk_dialog_run(GTK_DIALOG(dialogue
));
1117 case GTK_RESPONSE_ACCEPT
:
1119 create_main_window_with_trace_list(trace_list
);
1122 case GTK_RESPONSE_REJECT
:
1126 gtk_widget_destroy(dialogue
);
1127 g_slist_free(trace_list
);
1130 void arm_clicked (GtkButton
*button
, gpointer user_data
)
1132 ControlData
*tcd
= (ControlData
*)user_data
;
1134 const gchar
*username
= gtk_entry_get_text(GTK_ENTRY(tcd
->username_entry
));
1135 const gchar
*password
= gtk_entry_get_text(GTK_ENTRY(tcd
->password_entry
));
1136 const gchar
*ltt_armall_path
=
1137 gtk_entry_get_text(GTK_ENTRY(tcd
->ltt_armall_path_entry
));
1139 /* Setup arguments to su */
1141 gchar args
[MAX_ARGS_LEN
];
1142 gint args_left
= MAX_ARGS_LEN
- 1; /* for \0 */
1147 strncat(args
, "exec", args_left
);
1148 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
1151 strncat(args
, " ", args_left
);
1152 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
1154 if(strcmp(ltt_armall_path
, "") == 0)
1155 strncat(args
, "ltt-armall", args_left
);
1157 strncat(args
, ltt_armall_path
, args_left
);
1158 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
1160 int retval
= execute_command(args
, username
, password
, "");
1163 guint msg_left
= 256;
1165 strcpy(msg
, "A problem occured when executing the su command : ");
1166 msg_left
= 256 - strlen(msg
) - 1;
1167 strncat(msg
, strerror(retval
), msg_left
);
1168 GtkWidget
*dialogue
=
1169 gtk_message_dialog_new(
1170 GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button
))),
1171 GTK_DIALOG_MODAL
|GTK_DIALOG_DESTROY_WITH_PARENT
,
1175 gtk_dialog_run(GTK_DIALOG(dialogue
));
1176 gtk_widget_destroy(dialogue
);
1181 void disarm_clicked (GtkButton
*button
, gpointer user_data
)
1183 ControlData
*tcd
= (ControlData
*)user_data
;
1185 const gchar
*username
= gtk_entry_get_text(GTK_ENTRY(tcd
->username_entry
));
1186 const gchar
*password
= gtk_entry_get_text(GTK_ENTRY(tcd
->password_entry
));
1187 const gchar
*ltt_disarmall_path
=
1188 gtk_entry_get_text(GTK_ENTRY(tcd
->ltt_disarmall_path_entry
));
1190 /* Setup arguments to su */
1192 gchar args
[MAX_ARGS_LEN
];
1193 gint args_left
= MAX_ARGS_LEN
- 1; /* for \0 */
1198 strncat(args
, "exec", args_left
);
1199 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
1202 strncat(args
, " ", args_left
);
1203 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
1205 if(strcmp(ltt_disarmall_path
, "") == 0)
1206 strncat(args
, "ltt-disarmall", args_left
);
1208 strncat(args
, ltt_disarmall_path
, args_left
);
1209 args_left
= MAX_ARGS_LEN
- strlen(args
) - 1;
1211 int retval
= execute_command(args
, username
, password
, "");
1214 guint msg_left
= 256;
1216 strcpy(msg
, "A problem occured when executing the su command : ");
1217 msg_left
= 256 - strlen(msg
) - 1;
1218 strncat(msg
, strerror(retval
), msg_left
);
1219 GtkWidget
*dialogue
=
1220 gtk_message_dialog_new(
1221 GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button
))),
1222 GTK_DIALOG_MODAL
|GTK_DIALOG_DESTROY_WITH_PARENT
,
1226 gtk_dialog_run(GTK_DIALOG(dialogue
));
1227 gtk_widget_destroy(dialogue
);
1234 * @fn GtkWidget* h_guicontrol(Tab*)
1236 * Control Module's constructor hook
1238 * This constructor is given as a parameter to the menuitem and toolbar button
1239 * registration. It creates the list.
1240 * @param tab A pointer to the parent window.
1241 * @return The widget created.
1244 h_guicontrol(LttvPlugin
*plugin
)
1246 LttvPluginTab
*ptab
= LTTV_PLUGIN_TAB(plugin
);
1247 ControlData
* f
= gui_control(ptab
);
1253 * @fn static void init()
1255 * This function initializes the Filter Viewer functionnality through the
1258 static void init() {
1260 lttvwindow_register_constructor("guicontrol",
1262 "Insert Tracing Control Module",
1263 hTraceControlInsert_xpm
,
1264 "Insert Tracing Control Module",
1269 * @fn void control_destroy_walk(gpointer,gpointer)
1271 * Initiate the destruction of the current gui module
1272 * on the GTK Interface
1275 control_destroy_walk(gpointer data
, gpointer user_data
)
1277 ControlData
*tcd
= (ControlData
*)data
;
1279 g_debug("traceontrol.c : control_destroy_walk, %p", tcd
);
1281 /* May already have been done by GTK window closing */
1282 if(GTK_IS_WIDGET(guicontrol_get_widget(tcd
)))
1283 gtk_widget_destroy(guicontrol_get_widget(tcd
));
1287 * @fn static void destroy()
1288 * @brief plugin's destroy function
1290 * This function releases the memory reserved by the module and unregisters
1291 * everything that has been registered in the gtkTraceSet API.
1293 static void destroy() {
1295 g_slist_foreach(g_control_list
, control_destroy_walk
, NULL
);
1297 lttvwindow_unregister_constructor(h_guicontrol
);
1302 LTTV_MODULE("guitracecontrol", "Trace Control Window", \
1303 "Graphical module that let user control kernel tracing", \
1304 init
, destroy
, "lttvwindow")