trace control updated
[lttv.git] / trunk / lttv / lttv / modules / gui / tracecontrol / tracecontrol.c
CommitLineData
e7c8534e 1/* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2005 Mathieu Desnoyers
3 *
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;
7 *
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.
12 *
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,
16 * MA 02111-1307, USA.
17 */
18
19#ifdef HAVE_CONFIG_H
20#include <config.h>
21#endif
22
23#include <glib.h>
5e96e7e3 24#include <glib/gprintf.h>
e7c8534e 25#include <string.h>
26#include <gtk/gtk.h>
27#include <gdk/gdk.h>
28#include <gdk/gdkkeysyms.h>
29
30#include <lttv/lttv.h>
31#include <lttv/module.h>
32#include <lttv/hook.h>
e7c8534e 33
34#include <lttvwindow/lttvwindow.h>
35#include <lttvwindow/lttvwindowtraces.h>
5e96e7e3 36#include <lttvwindow/callbacks.h>
b154e818 37#include <lttvwindow/lttv_plugin_tab.h>
e7c8534e 38
39#include "hTraceControlInsert.xpm"
381229ee 40#include "TraceControlStart.xpm"
41#include "TraceControlPause.xpm"
42#include "TraceControlStop.xpm"
e7c8534e 43
77ef407f 44#include <sys/types.h>
45#include <unistd.h>
46#include <stdlib.h>
ff430216 47#include <pty.h>
48#include <utmp.h>
49#include <sys/wait.h>
86a65fdb 50#include <sys/poll.h>
6cec4cd2 51#include <errno.h>
b57800a3 52#include <fcntl.h>
53#include <sched.h>
77ef407f 54
f6f6abf0 55#define MAX_ARGS_LEN PATH_MAX * 10
e7c8534e 56
57GSList *g_control_list = NULL ;
58
59/*! \file lttv/modules/gui/tracecontrol/tracecontrol.c
60 * \brief Graphic trace start/stop control interface.
61 *
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.
64 *
65 */
66
67typedef struct _ControlData ControlData;
68
69/*
70 * Prototypes
71 */
72GtkWidget *guicontrol_get_widget(ControlData *tcd);
b154e818 73ControlData *gui_control(LttvPluginTab *ptab);
e7c8534e 74void gui_control_destructor(ControlData *tcd);
b154e818 75GtkWidget* h_guicontrol(LttvPlugin *plugin);
e7c8534e 76void control_destroy_walk(gpointer data, gpointer user_data);
77
78/*
79 * Callback functions
80 */
81
83b08c93 82static void arm_clicked (GtkButton *button, gpointer user_data);
83static void disarm_clicked (GtkButton *button, gpointer user_data);
77ef407f 84static void start_clicked (GtkButton *button, gpointer user_data);
85static void pause_clicked (GtkButton *button, gpointer user_data);
45653836 86static void unpause_clicked (GtkButton *button, gpointer user_data);
77ef407f 87static void stop_clicked (GtkButton *button, gpointer user_data);
e7c8534e 88
ff430216 89
e7c8534e 90/**
91 * @struct _ControlData
92 *
77ef407f 93 * @brief Main structure of gui control
e7c8534e 94 */
95struct _ControlData {
96 Tab *tab; /**< current tab of module */
97
77ef407f 98 GtkWidget *window; /**< window */
e7c8534e 99
77ef407f 100 GtkWidget *main_box; /**< main container */
83b08c93 101 GtkWidget *ltt_armall_button;
102 GtkWidget *ltt_disarmall_button;
77ef407f 103 GtkWidget *start_button;
104 GtkWidget *pause_button;
45653836 105 GtkWidget *unpause_button;
77ef407f 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;
45653836 121 GtkWidget *append_label;
122 GtkWidget *append_check;
77ef407f 123 GtkWidget *optional_label;
124 GtkWidget *subbuf_size_label;
125 GtkWidget *subbuf_size_entry;
126 GtkWidget *subbuf_num_label;
127 GtkWidget *subbuf_num_entry;
e6542e85 128 GtkWidget *lttd_threads_label;
129 GtkWidget *lttd_threads_entry;
77ef407f 130 GtkWidget *lttctl_path_label;
131 GtkWidget *lttctl_path_entry;
132 GtkWidget *lttd_path_label;
133 GtkWidget *lttd_path_entry;
83b08c93 134 GtkWidget *ltt_armall_path_label;
135 GtkWidget *ltt_armall_path_entry;
136 GtkWidget *ltt_disarmall_path_label;
137 GtkWidget *ltt_disarmall_path_entry;
e7c8534e 138};
139
140/**
141 * @fn GtkWidget* guicontrol_get_widget(ControlData*)
142 *
143 * This function returns the current main widget
144 * used by this module
145 * @param tcd the module struct
146 * @return The main widget
147 */
148GtkWidget*
149guicontrol_get_widget(ControlData *tcd)
150{
77ef407f 151 return tcd->window;
e7c8534e 152}
153
154/**
155 * @fn ControlData* gui_control(Tab*)
156 *
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.
160 */
161ControlData*
b154e818 162gui_control(LttvPluginTab *ptab)
e7c8534e 163{
b154e818 164 Tab *tab = ptab->tab;
e7c8534e 165 g_debug("filter::gui_control()");
166
167 unsigned i;
168 GtkCellRenderer *renderer;
169 GtkTreeViewColumn *column;
170
171 ControlData* tcd = g_new(ControlData,1);
172
173 tcd->tab = tab;
174
77ef407f 175 tcd->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
176 gtk_window_set_title(GTK_WINDOW(tcd->window), "LTTng Trace Control");
e7c8534e 177 /*
178 * Initiating GtkTable layout
179 * starts with 2 rows and 5 columns and
180 * expands when expressions added
181 */
77ef407f 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);
e7c8534e 185
77ef407f 186 gtk_container_add(GTK_CONTAINER(tcd->window), GTK_WIDGET(tcd->main_box));
e7c8534e 187
ff430216 188 GList *focus_chain = NULL;
189
381229ee 190 /*
191 * start/pause/stop buttons
192 */
83b08c93 193
381229ee 194 GdkPixbuf *pixbuf;
195 GtkWidget *image;
83b08c93 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);
204
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);
213
381229ee 214 pixbuf = gdk_pixbuf_new_from_xpm_data((const char **)TraceControlStart_xpm);
215 image = gtk_image_new_from_pixbuf(pixbuf);
77ef407f 216 tcd->start_button = gtk_button_new_with_label("start");
06e9af2d 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);
77ef407f 219 gtk_button_set_alignment(GTK_BUTTON(tcd->start_button), 0.0, 0.0);
220 gtk_widget_show (tcd->start_button);
83b08c93 221 gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->start_button,6,7,2,3,GTK_FILL,GTK_FILL,2,2);
381229ee 222
223 pixbuf = gdk_pixbuf_new_from_xpm_data((const char **)TraceControlPause_xpm);
224 image = gtk_image_new_from_pixbuf(pixbuf);
77ef407f 225 tcd->pause_button = gtk_button_new_with_label("pause");
06e9af2d 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);
77ef407f 228 gtk_button_set_alignment(GTK_BUTTON(tcd->pause_button), 0.0, 0.0);
229 gtk_widget_show (tcd->pause_button);
83b08c93 230 gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->pause_button,6,7,3,4,GTK_FILL,GTK_FILL,2,2);
381229ee 231
45653836 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");
06e9af2d 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);
45653836 237 gtk_button_set_alignment(GTK_BUTTON(tcd->unpause_button), 0.0, 0.0);
238 gtk_widget_show (tcd->unpause_button);
83b08c93 239 gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->unpause_button,6,7,4,5,GTK_FILL,GTK_FILL,2,2);
45653836 240
381229ee 241 pixbuf = gdk_pixbuf_new_from_xpm_data((const char **)TraceControlStop_xpm);
242 image = gtk_image_new_from_pixbuf(pixbuf);
77ef407f 243 tcd->stop_button = gtk_button_new_with_label("stop");
06e9af2d 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);
77ef407f 246 gtk_button_set_alignment(GTK_BUTTON(tcd->stop_button), 0.0, 0.0);
247 gtk_widget_show (tcd->stop_button);
83b08c93 248 gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->stop_button,6,7,5,6,GTK_FILL,GTK_FILL,2,2);
381229ee 249
e7c8534e 250 /*
251 * First half of the filter window
252 * - textual entry of filter expression
253 * - processing button
254 */
77ef407f 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);
262
263
264
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);
272
273
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();
9c86b517 277 gtk_entry_set_text(GTK_ENTRY(tcd->channel_dir_entry),"/mnt/debugfs/ltt");
77ef407f 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);
281
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);
289
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);
297
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),
381229ee 302 "normal");
77ef407f 303 gtk_combo_box_append_text(GTK_COMBO_BOX(tcd->trace_mode_combo),
381229ee 304 "flight recorder");
77ef407f 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);
309
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);
45653836 317
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);
325
77ef407f 326
327 tcd->optional_label = gtk_label_new("Optional fields ");
328 gtk_widget_show (tcd->optional_label);
45653836 329 gtk_table_attach( GTK_TABLE(tcd->main_box),tcd->optional_label,0,6,8,9,GTK_FILL,GTK_FILL,2,2);
77ef407f 330
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);
45653836 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);
77ef407f 337
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);
45653836 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);
77ef407f 344
e6542e85 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);
352
77ef407f 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();
ff430216 356 gtk_entry_set_text(GTK_ENTRY(tcd->lttctl_path_entry),PACKAGE_BIN_DIR "/lttctl");
77ef407f 357 gtk_widget_show (tcd->lttctl_path_entry);
e6542e85 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);
77ef407f 360
361
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();
ff430216 365 gtk_entry_set_text(GTK_ENTRY(tcd->lttd_path_entry),PACKAGE_BIN_DIR "/lttd");
77ef407f 366 gtk_widget_show (tcd->lttd_path_entry);
e6542e85 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);
381229ee 369
83b08c93 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();
b6c823fe 373 gtk_entry_set_text(GTK_ENTRY(tcd->ltt_armall_path_entry),PACKAGE_BIN_DIR "/ltt-armall");
83b08c93 374 gtk_widget_show (tcd->ltt_armall_path_entry);
c74df56f 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);
83b08c93 377
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();
b6c823fe 381 gtk_entry_set_text(GTK_ENTRY(tcd->ltt_disarmall_path_entry),PACKAGE_BIN_DIR "/ltt-disarmall");
83b08c93 382 gtk_widget_show (tcd->ltt_disarmall_path_entry);
c74df56f 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);
83b08c93 385
ff430216 386 focus_chain = g_list_append (focus_chain, tcd->username_entry);
387 focus_chain = g_list_append (focus_chain, tcd->password_entry);
83b08c93 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);
ff430216 390 focus_chain = g_list_append (focus_chain, tcd->start_button);
391 focus_chain = g_list_append (focus_chain, tcd->pause_button);
45653836 392 focus_chain = g_list_append (focus_chain, tcd->unpause_button);
ff430216 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);
45653836 399 focus_chain = g_list_append (focus_chain, tcd->append_check);
ff430216 400 focus_chain = g_list_append (focus_chain, tcd->subbuf_size_entry);
401 focus_chain = g_list_append (focus_chain, tcd->subbuf_num_entry);
e6542e85 402 focus_chain = g_list_append (focus_chain, tcd->lttd_threads_entry);
ff430216 403 focus_chain = g_list_append (focus_chain, tcd->lttctl_path_entry);
404 focus_chain = g_list_append (focus_chain, tcd->lttd_path_entry);
ff430216 405
406 gtk_container_set_focus_chain(GTK_CONTAINER(tcd->main_box), focus_chain);
407
382e4b92 408 g_list_free(focus_chain);
409
77ef407f 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);
45653836 414 g_signal_connect(G_OBJECT(tcd->unpause_button), "clicked",
415 (GCallback)unpause_clicked, tcd);
77ef407f 416 g_signal_connect(G_OBJECT(tcd->stop_button), "clicked",
417 (GCallback)stop_clicked, tcd);
83b08c93 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);
e7c8534e 422
423 /*
424 * show main container
425 */
77ef407f 426 gtk_widget_show(tcd->main_box);
427 gtk_widget_show(tcd->window);
e7c8534e 428
429
430 g_object_set_data_full(
77ef407f 431 G_OBJECT(guicontrol_get_widget(tcd)),
432 "control_viewer_data",
e7c8534e 433 tcd,
434 (GDestroyNotify)gui_control_destructor);
435
436 g_control_list = g_slist_append(
437 g_control_list,
438 tcd);
439
440 return tcd;
441}
442
443
444/**
445 * @fn void gui_control_destructor(ControlData*)
446 *
447 * Destructor for the filter gui module
448 * @param tcd The module structure
449 */
450void
451gui_control_destructor(ControlData *tcd)
452{
453 Tab *tab = tcd->tab;
454
455 /* May already been done by GTK window closing */
77ef407f 456 if(GTK_IS_WIDGET(guicontrol_get_widget(tcd))){
e7c8534e 457 g_info("widget still exists");
458 }
459// if(tab != NULL) {
460// lttvwindow_unregister_traceset_notify(tcd->tab,
461// filter_traceset_changed,
462// filter_viewer_data);
463// }
464 lttvwindowtraces_background_notify_remove(tcd);
465
466 g_control_list = g_slist_remove(g_control_list, tcd);
467
468 g_free(tcd);
469}
470
29e34d6c 471static int execute_command(const gchar *command, const gchar *username,
6bf6bb68 472 const gchar *password, const gchar *lttd_path)
77ef407f 473{
ff430216 474 pid_t pid;
475 int fdpty;
476 pid = forkpty(&fdpty, NULL, NULL, NULL);
29e34d6c 477 int retval = 0;
77ef407f 478
479 if(pid > 0) {
480 /* parent */
ff430216 481 gchar buf[256];
482 int status;
483 ssize_t count;
484 /* discuss with su */
485 struct timeval timeout;
486 timeout.tv_sec = 1;
487 timeout.tv_usec = 0;
ff430216 488
86a65fdb 489 struct pollfd pollfd;
490 int num_rdy;
491 int num_hup = 0;
b57800a3 492 enum read_state { GET_LINE, GET_SEMI, GET_SPACE } read_state = GET_LINE;
86a65fdb 493
b57800a3 494 retval = fcntl(fdpty, F_SETFL, O_WRONLY);
495 if(retval == -1) {
496 perror("Error in fcntl");
497 goto wait_child;
498 }
86a65fdb 499
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...");
503 while(1) {
504 pollfd.fd = fdpty;
75e2f396 505 pollfd.events = POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL;
86a65fdb 506
b57800a3 507 num_rdy = poll(&pollfd, 1, -1);
86a65fdb 508 if(num_rdy == -1) {
509 perror("Poll error");
510 goto wait_child;
511 }
86a65fdb 512
b57800a3 513 /* Timeout : Stop waiting for chars */
514 if(num_rdy == 0) goto wait_child;
86a65fdb 515
516 switch(pollfd.revents) {
517 case POLLERR:
518 g_warning("Error returned in polling fd\n");
519 num_hup++;
520 break;
521 case POLLHUP:
522 g_info("Polling FD : hung up.");
523 num_hup++;
524 break;
525 case POLLNVAL:
526 g_warning("Polling fd tells it is not open");
527 num_hup++;
528 break;
529 case POLLPRI:
530 case POLLIN:
531 count = read (fdpty, buf, 256);
532 if(count > 0) {
b57800a3 533 unsigned int i;
86a65fdb 534 buf[count] = '\0';
b57800a3 535 g_printf("%s", buf);
536 for(i=0; i<count; i++) {
537 switch(read_state) {
538 case GET_LINE:
539 if(buf[i] == '\n') {
540 read_state = GET_SEMI;
541 g_debug("Tracecontrol input line skip\n");
542 }
543 break;
544 case GET_SEMI:
545 if(buf[i] == ':') {
546 g_debug("Tracecontrol input : marker found\n");
547 read_state = GET_SPACE;
548 }
549 break;
550 case GET_SPACE:
551 if(buf[i] == ' ') {
552 g_debug("Tracecontrol input space marker found\n");
553 goto write_password;
554 }
555 break;
556 }
557 }
86a65fdb 558 } else if(count == -1) {
559 perror("Error in read");
560 goto wait_child;
561 }
562 break;
563 }
564 if(num_hup > 0) {
565 g_warning("Child hung up too fast");
566 goto wait_child;
567 }
568 }
b57800a3 569write_password:
570 fsync(fdpty);
571 pollfd.fd = fdpty;
572 pollfd.events = POLLOUT|POLLERR|POLLHUP|POLLNVAL;
573
574 num_rdy = poll(&pollfd, 1, -1);
575 if(num_rdy == -1) {
576 perror("Poll error");
577 goto wait_child;
578 }
579
86a65fdb 580 /* Write the password */
ff430216 581 g_info("Got su prompt, now writing password...");
ff430216 582 int ret;
b57800a3 583 sleep(1);
ff430216 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");
588 fsync(fdpty);
86a65fdb 589 /* Take the output from the terminal and show it on the real console */
590 g_info("Getting data from child terminal...");
591 while(1) {
592 int num_hup = 0;
593 pollfd.fd = fdpty;
75e2f396 594 pollfd.events = POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL;
86a65fdb 595
596 num_rdy = poll(&pollfd, 1, -1);
86a65fdb 597 if(num_rdy == -1) {
598 perror("Poll error");
599 goto wait_child;
600 }
86a65fdb 601 if(num_rdy == 0) break;
b57800a3 602
603 if(pollfd.revents & (POLLERR|POLLNVAL)) {
604 g_warning("Error returned in polling fd\n");
605 num_hup++;
606 }
607
608 if(pollfd.revents & (POLLIN|POLLPRI) ) {
609 count = read (fdpty, buf, 256);
610 if(count > 0) {
611 buf[count] = '\0';
612 printf("%s", buf);
613 } else if(count == -1) {
614 perror("Error in read");
615 goto wait_child;
616 }
617 }
618
619 if(pollfd.revents & POLLHUP) {
620 g_info("Polling FD : hung up.");
621 num_hup++;
622 }
86a65fdb 623
86a65fdb 624 if(num_hup > 0) goto wait_child;
625 }
626wait_child:
627 g_info("Waiting for child exit...");
628
629 ret = waitpid(pid, &status, 0);
6cec4cd2 630
631 if(ret == -1) {
632 g_warning("An error occured in wait : %s",
633 strerror(errno));
634 } else {
635 if(WIFEXITED(status))
636 if(WEXITSTATUS(status) != 0) {
637 retval = WEXITSTATUS(status);
638 g_warning("An error occured in the su command : %s",
639 strerror(retval));
640 }
641 }
77ef407f 642
86a65fdb 643 g_info("Child exited.");
77ef407f 644
645 } else if(pid == 0) {
f6f6abf0 646 /* Setup environment variables */
77ef407f 647 if(strcmp(lttd_path, "") != 0)
648 setenv("LTT_DAEMON", lttd_path, 1);
f6f6abf0 649
b57800a3 650 /* One comment line (must be only one) */
651 g_printf("Executing (as %s) : %s\n", username, command);
ff430216 652
45653836 653 execlp("su", "su", "-p", "-c", command, username, NULL);
654 exit(-1); /* not supposed to happen! */
655
656 //gint ret = execvp();
657
658 } else {
659 /* error */
660 g_warning("Error happened when forking for su");
661 }
86a65fdb 662
29e34d6c 663 return retval;
45653836 664}
86a65fdb 665
86a65fdb 666
45653836 667/* Callbacks */
f6f6abf0 668
45653836 669void start_clicked (GtkButton *button, gpointer user_data)
670{
671 ControlData *tcd = (ControlData*)user_data;
f6f6abf0 672
45653836 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));
680
382e4b92 681 const gchar *trace_mode_sel;
682 GtkTreeIter iter;
683
684 gtk_combo_box_get_active_iter(GTK_COMBO_BOX(tcd->trace_mode_combo), &iter);
685 gtk_tree_model_get(
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));
45653836 690 const gchar *trace_mode;
691 if(strcmp(trace_mode_sel, "normal") == 0)
692 trace_mode = "normal";
693 else
694 trace_mode = "flight";
695
696 gboolean start_daemon =
697 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tcd->start_daemon_check));
f6f6abf0 698
45653836 699 gboolean append =
700 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tcd->append_check));
701
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));
e6542e85 706 const gchar *threads_num =
707 gtk_entry_get_text(GTK_ENTRY(tcd->lttd_threads_entry));
45653836 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));
45653836 711
712 /* Setup arguments to su */
713 /* child */
714 gchar args[MAX_ARGS_LEN];
715 gint args_left = MAX_ARGS_LEN - 1; /* for \0 */
716
717 args[0] = '\0';
718
719 /* Command */
720 strncat(args, "exec", args_left);
721 args_left = MAX_ARGS_LEN - strlen(args) - 1;
722
723 /* space */
724 strncat(args, " ", args_left);
725 args_left = MAX_ARGS_LEN - strlen(args) - 1;
726
727 if(strcmp(lttctl_path, "") == 0)
728 strncat(args, "lttctl", args_left);
729 else
730 strncat(args, lttctl_path, args_left);
731 args_left = MAX_ARGS_LEN - strlen(args) - 1;
732
733 /* space */
734 strncat(args, " ", args_left);
735 args_left = MAX_ARGS_LEN - strlen(args) - 1;
736
e908999c 737 /* Start daemon ? */
738 if(start_daemon) {
739 strncat(args, "-C", args_left);
740 args_left = MAX_ARGS_LEN - strlen(args) - 1;
741 } else {
742 /* Simply create the channel and then start tracing */
743 //strncat(args, "-b", args_left);
744 //args_left = MAX_ARGS_LEN - strlen(args) - 1;
745 }
45653836 746
747 /* space */
748 strncat(args, " ", args_left);
749 args_left = MAX_ARGS_LEN - strlen(args) - 1;
750
e908999c 751 /* channel dir */
752 strncat(args, "--channel_root ", args_left);
45653836 753 args_left = MAX_ARGS_LEN - strlen(args) - 1;
e908999c 754 strncat(args, channel_dir, args_left);
45653836 755 args_left = MAX_ARGS_LEN - strlen(args) - 1;
756
757 /* space */
758 strncat(args, " ", args_left);
759 args_left = MAX_ARGS_LEN - strlen(args) - 1;
760
e908999c 761 /* trace dir */
762 strncat(args, "-w ", args_left);
45653836 763 args_left = MAX_ARGS_LEN - strlen(args) - 1;
e908999c 764 strncat(args, trace_dir, args_left);
45653836 765 args_left = MAX_ARGS_LEN - strlen(args) - 1;
766
767 /* space */
768 strncat(args, " ", args_left);
769 args_left = MAX_ARGS_LEN - strlen(args) - 1;
770
e908999c 771 if(strcmp(trace_mode, "flight") == 0) {
772 strncat(args, "-o channel.all.overwrite=1", args_left);
f6f6abf0 773 args_left = MAX_ARGS_LEN - strlen(args) - 1;
45653836 774 } else {
e908999c 775 strncat(args, "-o channel.all.overwrite=0", args_left);
f6f6abf0 776 args_left = MAX_ARGS_LEN - strlen(args) - 1;
45653836 777 }
778
45653836 779 /* Append to trace ? */
780 if(append) {
f6f6abf0 781 /* space */
782 strncat(args, " ", args_left);
783 args_left = MAX_ARGS_LEN - strlen(args) - 1;
45653836 784 strncat(args, "-a", args_left);
f6f6abf0 785 args_left = MAX_ARGS_LEN - strlen(args) - 1;
45653836 786 }
787
788 /* optional arguments */
789 /* subbuffer size */
790 if(strcmp(subbuf_size, "") != 0) {
f6f6abf0 791 /* space */
792 strncat(args, " ", args_left);
793 args_left = MAX_ARGS_LEN - strlen(args) - 1;
794
e908999c 795 strncat(args, "-o channel.all.bufsize=", args_left);
f6f6abf0 796 args_left = MAX_ARGS_LEN - strlen(args) - 1;
45653836 797 strncat(args, subbuf_size, args_left);
f6f6abf0 798 args_left = MAX_ARGS_LEN - strlen(args) - 1;
45653836 799 }
f6f6abf0 800
45653836 801 /* number of subbuffers */
802 if(strcmp(subbuf_num, "") != 0) {
f6f6abf0 803 /* space */
804 strncat(args, " ", args_left);
805 args_left = MAX_ARGS_LEN - strlen(args) - 1;
806
e908999c 807 strncat(args, "-o channel.all.bufnum=", args_left);
45653836 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;
811 }
ff430216 812
e6542e85 813 /* number of lttd threads */
814 if(strcmp(threads_num, "") != 0) {
815 /* space */
816 strncat(args, " ", args_left);
817 args_left = MAX_ARGS_LEN - strlen(args) - 1;
818
e908999c 819 strncat(args, "-n ", args_left);
e6542e85 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;
823 }
824
e908999c 825 /* space */
826 strncat(args, " ", args_left);
827 args_left = MAX_ARGS_LEN - strlen(args) - 1;
77ef407f 828
e908999c 829 /* name */
830 strncat(args, trace_name, args_left);
831 args_left = MAX_ARGS_LEN - strlen(args) - 1;
832
6bf6bb68 833 int retval = execute_command(args, username, password, lttd_path);
29e34d6c 834
835 if(retval) {
836 gchar msg[256];
837 guint msg_left = 256;
838
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,
846 GTK_MESSAGE_ERROR,
847 GTK_BUTTONS_OK,
848 msg);
849 gtk_dialog_run(GTK_DIALOG(dialogue));
850 gtk_widget_destroy(dialogue);
851 }
77ef407f 852
853}
854
855
856void pause_clicked (GtkButton *button, gpointer user_data)
857{
858 ControlData *tcd = (ControlData*)user_data;
859
45653836 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 = "";
45653836 865
866 const gchar *lttctl_path =
867 gtk_entry_get_text(GTK_ENTRY(tcd->lttctl_path_entry));
77ef407f 868
45653836 869 /* Setup arguments to su */
870 /* child */
871 gchar args[MAX_ARGS_LEN];
872 gint args_left = MAX_ARGS_LEN - 1; /* for \0 */
873
874 args[0] = '\0';
875
876 /* Command */
877 strncat(args, "exec", args_left);
878 args_left = MAX_ARGS_LEN - strlen(args) - 1;
879
880 /* space */
881 strncat(args, " ", args_left);
882 args_left = MAX_ARGS_LEN - strlen(args) - 1;
883
884 if(strcmp(lttctl_path, "") == 0)
885 strncat(args, "lttctl", args_left);
886 else
887 strncat(args, lttctl_path, args_left);
888 args_left = MAX_ARGS_LEN - strlen(args) - 1;
889
e908999c 890 /* space */
45653836 891 strncat(args, " ", args_left);
892 args_left = MAX_ARGS_LEN - strlen(args) - 1;
e908999c 893
894 /* Simply pause tracing */
895 strncat(args, "-p", args_left);
45653836 896 args_left = MAX_ARGS_LEN - strlen(args) - 1;
897
898 /* space */
899 strncat(args, " ", args_left);
900 args_left = MAX_ARGS_LEN - strlen(args) - 1;
e908999c 901
902 /* name */
903 strncat(args, trace_name, args_left);
45653836 904 args_left = MAX_ARGS_LEN - strlen(args) - 1;
905
6bf6bb68 906 int retval = execute_command(args, username, password, lttd_path);
29e34d6c 907 if(retval) {
908 gchar msg[256];
909 guint msg_left = 256;
910
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,
918 GTK_MESSAGE_ERROR,
919 GTK_BUTTONS_OK,
920 msg);
921 gtk_dialog_run(GTK_DIALOG(dialogue));
922 gtk_widget_destroy(dialogue);
923 }
924
45653836 925}
926
927void unpause_clicked (GtkButton *button, gpointer user_data)
928{
929 ControlData *tcd = (ControlData*)user_data;
930
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 = "";
45653836 936
937 const gchar *lttctl_path =
938 gtk_entry_get_text(GTK_ENTRY(tcd->lttctl_path_entry));
939
940 /* Setup arguments to su */
941 /* child */
942 gchar args[MAX_ARGS_LEN];
943 gint args_left = MAX_ARGS_LEN - 1; /* for \0 */
944
945 args[0] = '\0';
946
947 /* Command */
948 strncat(args, "exec", args_left);
949 args_left = MAX_ARGS_LEN - strlen(args) - 1;
950
951 /* space */
952 strncat(args, " ", args_left);
953 args_left = MAX_ARGS_LEN - strlen(args) - 1;
954
955 if(strcmp(lttctl_path, "") == 0)
956 strncat(args, "lttctl", args_left);
957 else
958 strncat(args, lttctl_path, args_left);
959 args_left = MAX_ARGS_LEN - strlen(args) - 1;
960
961 /* space */
962 strncat(args, " ", args_left);
963 args_left = MAX_ARGS_LEN - strlen(args) - 1;
e908999c 964
965 /* Simply unpause tracing */
966 strncat(args, "-s", args_left);
45653836 967 args_left = MAX_ARGS_LEN - strlen(args) - 1;
968
969 /* space */
970 strncat(args, " ", args_left);
971 args_left = MAX_ARGS_LEN - strlen(args) - 1;
e908999c 972
973 /* name */
974 strncat(args, trace_name, args_left);
45653836 975 args_left = MAX_ARGS_LEN - strlen(args) - 1;
976
6bf6bb68 977 int retval = execute_command(args, username, password, lttd_path);
29e34d6c 978 if(retval) {
979 gchar msg[256];
980 guint msg_left = 256;
981
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,
989 GTK_MESSAGE_ERROR,
990 GTK_BUTTONS_OK,
991 msg);
992 gtk_dialog_run(GTK_DIALOG(dialogue));
993 gtk_widget_destroy(dialogue);
994 }
995
77ef407f 996}
997
998void stop_clicked (GtkButton *button, gpointer user_data)
999{
1000 ControlData *tcd = (ControlData*)user_data;
1001
45653836 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 = "";
af22ae88 1007 const gchar *trace_mode;
1008 const gchar *trace_mode_sel;
1009 GtkTreeIter iter;
45653836 1010
af22ae88 1011 gtk_combo_box_get_active_iter(GTK_COMBO_BOX(tcd->trace_mode_combo), &iter);
1012 gtk_tree_model_get(
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";
1017 else
1018 trace_mode = "flight";
1019
45653836 1020 const gchar *lttctl_path =
1021 gtk_entry_get_text(GTK_ENTRY(tcd->lttctl_path_entry));
b154e818 1022 gchar *trace_dir = gtk_entry_get_text(GTK_ENTRY(tcd->trace_dir_entry));
1023 GSList * trace_list = NULL;
1024
1025 trace_list = g_slist_append(trace_list, trace_dir);
45653836 1026
1027 /* Setup arguments to su */
1028 /* child */
1029 gchar args[MAX_ARGS_LEN];
1030 gint args_left = MAX_ARGS_LEN - 1; /* for \0 */
1031
1032 args[0] = '\0';
1033
1034 /* Command */
1035 strncat(args, "exec", args_left);
1036 args_left = MAX_ARGS_LEN - strlen(args) - 1;
1037
1038 /* space */
1039 strncat(args, " ", args_left);
1040 args_left = MAX_ARGS_LEN - strlen(args) - 1;
1041
1042 if(strcmp(lttctl_path, "") == 0)
1043 strncat(args, "lttctl", args_left);
1044 else
1045 strncat(args, lttctl_path, args_left);
1046 args_left = MAX_ARGS_LEN - strlen(args) - 1;
1047
1048 /* space */
1049 strncat(args, " ", args_left);
1050 args_left = MAX_ARGS_LEN - strlen(args) - 1;
e908999c 1051
1052 /* Simply stop tracing and destroy channel */
1053 strncat(args, "-D", args_left);
45653836 1054 args_left = MAX_ARGS_LEN - strlen(args) - 1;
1055
e908999c 1056 if(strcmp(trace_mode, "flight") == 0) {
1057 /* space */
1058 strncat(args, " ", args_left);
1059 args_left = MAX_ARGS_LEN - strlen(args) - 1;
1060
1061 /* trace dir */
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;
1066 }
1067
45653836 1068 /* space */
1069 strncat(args, " ", args_left);
1070 args_left = MAX_ARGS_LEN - strlen(args) - 1;
e908999c 1071
1072 /* name */
1073 strncat(args, trace_name, args_left);
45653836 1074 args_left = MAX_ARGS_LEN - strlen(args) - 1;
1075
6bf6bb68 1076 int retval = execute_command(args, username, password, lttd_path);
29e34d6c 1077 if(retval) {
1078 gchar msg[256];
1079 guint msg_left = 256;
1080
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,
1088 GTK_MESSAGE_ERROR,
1089 GTK_BUTTONS_OK,
1090 msg);
1091 gtk_dialog_run(GTK_DIALOG(dialogue));
1092 gtk_widget_destroy(dialogue);
1093 return;
1094 }
1095
77ef407f 1096
8321ae6a 1097 /* Ask to the user if he wants to open the trace in a new window */
1098 GtkWidget *dialogue;
1099 GtkWidget *label;
1100 gint id;
1101
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,
1107 NULL);
1108 label = gtk_label_new("Do you want to open the trace in LTTV ?");
1109 gtk_widget_show(label);
1110
1111 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialogue)->vbox),
1112 label);
1113
1114 id = gtk_dialog_run(GTK_DIALOG(dialogue));
1115
1116 switch(id){
1117 case GTK_RESPONSE_ACCEPT:
1118 {
b154e818 1119 create_main_window_with_trace_list(trace_list);
8321ae6a 1120 }
1121 break;
1122 case GTK_RESPONSE_REJECT:
1123 default:
1124 break;
1125 }
1126 gtk_widget_destroy(dialogue);
b154e818 1127 g_slist_free(trace_list);
77ef407f 1128}
1129
83b08c93 1130void arm_clicked (GtkButton *button, gpointer user_data)
1131{
1132 ControlData *tcd = (ControlData*)user_data;
1133
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));
1138
1139 /* Setup arguments to su */
1140 /* child */
1141 gchar args[MAX_ARGS_LEN];
1142 gint args_left = MAX_ARGS_LEN - 1; /* for \0 */
1143
1144 args[0] = '\0';
1145
1146 /* Command */
1147 strncat(args, "exec", args_left);
1148 args_left = MAX_ARGS_LEN - strlen(args) - 1;
1149
1150 /* space */
1151 strncat(args, " ", args_left);
1152 args_left = MAX_ARGS_LEN - strlen(args) - 1;
1153
1154 if(strcmp(ltt_armall_path, "") == 0)
1155 strncat(args, "ltt-armall", args_left);
1156 else
1157 strncat(args, ltt_armall_path, args_left);
1158 args_left = MAX_ARGS_LEN - strlen(args) - 1;
1159
1160 int retval = execute_command(args, username, password, "");
1161 if(retval) {
1162 gchar msg[256];
1163 guint msg_left = 256;
1164
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,
1172 GTK_MESSAGE_ERROR,
1173 GTK_BUTTONS_OK,
1174 msg);
1175 gtk_dialog_run(GTK_DIALOG(dialogue));
1176 gtk_widget_destroy(dialogue);
1177 }
1178
1179}
1180
1181void disarm_clicked (GtkButton *button, gpointer user_data)
1182{
1183 ControlData *tcd = (ControlData*)user_data;
1184
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));
1189
1190 /* Setup arguments to su */
1191 /* child */
1192 gchar args[MAX_ARGS_LEN];
1193 gint args_left = MAX_ARGS_LEN - 1; /* for \0 */
1194
1195 args[0] = '\0';
1196
1197 /* Command */
1198 strncat(args, "exec", args_left);
1199 args_left = MAX_ARGS_LEN - strlen(args) - 1;
1200
1201 /* space */
1202 strncat(args, " ", args_left);
1203 args_left = MAX_ARGS_LEN - strlen(args) - 1;
1204
1205 if(strcmp(ltt_disarmall_path, "") == 0)
1206 strncat(args, "ltt-disarmall", args_left);
1207 else
1208 strncat(args, ltt_disarmall_path, args_left);
1209 args_left = MAX_ARGS_LEN - strlen(args) - 1;
1210
1211 int retval = execute_command(args, username, password, "");
1212 if(retval) {
1213 gchar msg[256];
1214 guint msg_left = 256;
1215
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,
1223 GTK_MESSAGE_ERROR,
1224 GTK_BUTTONS_OK,
1225 msg);
1226 gtk_dialog_run(GTK_DIALOG(dialogue));
1227 gtk_widget_destroy(dialogue);
1228 }
1229
1230}
1231
e7c8534e 1232
1233/**
1234 * @fn GtkWidget* h_guicontrol(Tab*)
1235 *
1236 * Control Module's constructor hook
1237 *
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.
1242 */
1243GtkWidget *
b154e818 1244h_guicontrol(LttvPlugin *plugin)
e7c8534e 1245{
b154e818 1246 LttvPluginTab *ptab = LTTV_PLUGIN_TAB(plugin);
1247 ControlData* f = gui_control(ptab);
e7c8534e 1248
1249 return NULL;
1250}
1251
1252/**
1253 * @fn static void init()
1254 *
1255 * This function initializes the Filter Viewer functionnality through the
1256 * gtkTraceSet API.
1257 */
1258static void init() {
1259
1260 lttvwindow_register_constructor("guicontrol",
1261 "/",
1262 "Insert Tracing Control Module",
1263 hTraceControlInsert_xpm,
1264 "Insert Tracing Control Module",
1265 h_guicontrol);
1266}
1267
1268/**
1269 * @fn void control_destroy_walk(gpointer,gpointer)
1270 *
1271 * Initiate the destruction of the current gui module
1272 * on the GTK Interface
1273 */
1274void
1275control_destroy_walk(gpointer data, gpointer user_data)
1276{
1277 ControlData *tcd = (ControlData*)data;
1278
1279 g_debug("traceontrol.c : control_destroy_walk, %p", tcd);
1280
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));
1284}
1285
1286/**
1287 * @fn static void destroy()
1288 * @brief plugin's destroy function
1289 *
1290 * This function releases the memory reserved by the module and unregisters
1291 * everything that has been registered in the gtkTraceSet API.
1292 */
1293static void destroy() {
1294
1295 g_slist_foreach(g_control_list, control_destroy_walk, NULL );
1296
1297 lttvwindow_unregister_constructor(h_guicontrol);
1298
1299}
1300
1301
1302LTTV_MODULE("guitracecontrol", "Trace Control Window", \
1303 "Graphical module that let user control kernel tracing", \
1304 init, destroy, "lttvwindow")
1305
This page took 0.125469 seconds and 4 git commands to generate.