1 /* Wireless tab */
2 #include "disk.h"
3 
4 /* Boxes */
5 GtkWidget *topbox;
6 GtkWidget *botbox;
7 
8 GtkWidget *wedit;
9 GtkWidget *woptions;
10 
11 /* Widgets */
12 GtkWidget *wcommands;
13 GtkWidget *winterface; /* combo box */
14 GtkWidget *wdev; /* combo box */
15 GtkWidget *whosts; /* combo box */
16 GtkWidget *wapply;
17 GtkWidget *wpass;  /* text entry */
18 
19 GtkTreeStore *wtree;
20 
21 /* In case we issue a second root command. */
22 gboolean exec2; /* Execute another command. */
23 char *secondcmd;
24 char *wtmp; /* Tmpfile */
25 
26 /* Functions */
27 void CleanWireless();
28 void CleanOptions();
29 void WTopbox();
30 GtkWidget *WScrolled(GtkWidget *);
31 GtkWidget *ComboModes();
32 GtkWidget *ComboCommands();
33 GtkWidget *ComboWlanDevices();
34 GtkWidget *ComboWlanInterfaces();
35 void WGridEntries();
36 void ExecCreate();
37 void ExecDestroy();
38 void ExecConnect();
39 char *GetBssid(char *);
40 void ExecUp();
41 void ExecDown();
42 void ExecScan();
43 void ExecModify();
44 void ApplyClicked( GtkWidget *, gpointer);
45 void OptionsCreate();
46 void OptionsConnect();
47 gboolean ComboHosts();
48 GtkWidget *DrawHosts();
49 void DrawOptions(char *);
50 void command_changed( GtkWidget *, gpointer);
51 void winterface_changed( GtkWidget *, gpointer);
52 void WEditor();
53 void WBottomView();
54 GtkWidget *WTreeview(GtkWidget *);
55 void WFillTree(GtkWidget *);
56 void AfterRootCmd();
57 void wireless();
58 
CleanWireless()59 void CleanWireless() {
60 
61 	if(GTK_IS_WIDGET (wbox))
62 		gtk_widget_destroy(wbox);
63 }
64 
CleanOptions()65 void CleanOptions() {
66 
67 	if(GTK_IS_WIDGET (woptions))
68 		gtk_widget_destroy(woptions);
69 
70 	woptions = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
71 	gtk_container_add (GTK_CONTAINER (topbox), woptions);
72 }
73 
GetBssid(char * string)74 char *GetBssid(char *string) {
75 
76 	int start = 33; /* Skip ssid. */
77 	char *bssid = malloc(20);
78 	if(bssid == NULL)
79 		return bssid;
80 
81 	memset(bssid, 0, 20);
82 	while(strncmp(&string[start], " ", 1) == 0) //&& (start <= 40))
83 		start++;
84 
85 	strncpy(bssid, &string[start], 18);
86 	return bssid;
87 }
88 
AfterRootCmd()89 void AfterRootCmd() {
90 
91 	if(exec2 == TRUE) {
92 		exec2 = FALSE;
93 		if(secondcmd != NULL)
94 			execute_me(secondcmd, USR);
95 	}
96 	else {
97 		if(wtmp != NULL) { /* Clean up */
98 			unlink(wtmp);
99 			free(wtmp);
100 			wtmp = NULL;
101 		}
102 		wireless();
103 	}
104 }
105 
WTopbox()106 void WTopbox() {
107 
108 	/* A box at the upper half. */
109 	topbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
110 	gtk_container_add (GTK_CONTAINER (wbox), topbox);
111 	gtk_widget_set_size_request(topbox, 300, 200); /* width, height */
112 }
113 
WScrolled(GtkWidget * box)114 GtkWidget *WScrolled(GtkWidget *box) {
115 	/* Scrolled window. */
116 	GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
117 	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
118                                     GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
119 	gtk_box_pack_start(GTK_BOX(box), scrolled_window, FALSE, TRUE, 0);
120 	gtk_scrolled_window_set_propagate_natural_height (GTK_SCROLLED_WINDOW(scrolled_window), TRUE);
121 	gtk_scrolled_window_set_propagate_natural_width (GTK_SCROLLED_WINDOW(scrolled_window), TRUE);
122 
123 	return scrolled_window;
124 }
125 
ComboModes()126 GtkWidget *ComboModes() {
127 	GtkWidget *c = gtk_combo_box_text_new();
128 	gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (c), NULL, "adhoc");
129 
130 	return c;
131 }
132 
ComboCommands()133 GtkWidget *ComboCommands() {
134 	GtkWidget *c = gtk_combo_box_text_new();
135 	gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (c), NULL, "Create");
136 	gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (c), NULL, "Destroy");
137 	gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (c), NULL, "Scan");
138 	gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (c), NULL, "Modify");
139 	gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (c), NULL, "Connect");
140 	gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (c), NULL, "Up");
141 	gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (c), NULL, "Down");
142 	g_signal_connect (c, "changed", G_CALLBACK (command_changed), NULL);
143 
144 	gtk_grid_attach(GTK_GRID(wedit), c, 0, 0, 1, 1);
145 	return c;
146 }
147 
ComboWlanDevices()148 GtkWidget *ComboWlanDevices() {
149 
150 	/* Combo box with all wlan devices on the system. */
151 
152 	gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT (wdev));
153 
154 	char line[MAXLINE];
155 	char *dev;
156 	char *brk;
157 
158 	memset(line, 0, MAXLINE);
159 	FILE *fp = popen("sysctl -n net.wlan.devices", "r");
160 	while(fgets(line, MAXLINE, fp)) {
161 
162 		cosmetics(line);
163 		dev = strtok_r(line, " ", &brk);
164 		while(dev) {
165 
166 			gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (wdev), NULL, dev);
167 			dev = strtok_r( NULL, " ", &brk);
168 		}
169 	}
170 	pclose(fp);
171 
172 	return wdev;
173 }
174 
ComboWlanInterfaces()175 GtkWidget *ComboWlanInterfaces() {
176 
177 	/* Box with all currently configured wlan interfaces */
178 
179 	gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT (winterface));
180 
181 	char line[MAXLINE];
182 	FILE *fp = popen("ifconfig -g wlan | sed 's/ /\\n/g'", "r");
183 	while(fgets(line, MAXLINE, fp)) {
184 
185 		cosmetics(line);
186 		gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (winterface), NULL, line);
187 	}
188 	pclose(fp);
189 
190 	return winterface;
191 }
192 
WGridEntries()193 void WGridEntries() {
194 
195 	wcommands = ComboCommands();
196 	wdev = gtk_combo_box_text_new();
197 	winterface = gtk_combo_box_text_new();
198 	wapply = gtk_button_new_with_mnemonic(l.apply);
199 
200 
201 	g_signal_connect(wapply, "clicked", G_CALLBACK(ApplyClicked), NULL);
202 	g_signal_connect (winterface, "changed", G_CALLBACK (winterface_changed), NULL);
203 
204 	gtk_grid_attach(GTK_GRID(wedit), gtk_label_new("   "), 0, 4, 1, 1);
205 //	gtk_grid_attach(GTK_GRID(wedit), gtk_label_new("   "), 0, 5, 1, 1);
206 	gtk_grid_attach(GTK_GRID(wedit), wdev, 0, 6, 1, 1);
207 	gtk_grid_attach(GTK_GRID(wedit), winterface, 0, 7, 1, 1);
208 	gtk_grid_attach(GTK_GRID(wedit), wapply, 0, 8, 1, 1);
209 }
210 
ExecCreate()211 void ExecCreate() {
212 
213 	const gchar *dev =  gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (GTK_COMBO_BOX_TEXT (wdev)));
214 	if((dev == NULL) || (strlen(dev) == 0)) {
215 		msg("No wlan devices chosen. Driver issues?");
216 		return;
217 	}
218 
219 	char *cmd = malloc(CMDSIZE);
220 	if(cmd == NULL)
221 		return;
222 	memset(cmd, 0, CMDSIZE);
223 	sprintf(cmd, "ifconfig wlan create wlandev %s", dev);
224 
225 	exec2 = FALSE;
226 	execute_me(cmd, USR);
227 }
228 
ExecDestroy()229 void ExecDestroy() {
230 
231 	char *what;
232 	what = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (winterface));
233 	if((what == NULL) || (strlen(what) == 0)) {
234 		msg("no device!");
235 		return;
236 	}
237 	char *cmd = malloc(CMDSIZE);
238 	if(cmd == NULL)
239 		return;
240 	memset(cmd, 0, CMDSIZE);
241 	sprintf(cmd, "ifconfig %s destroy", what);
242 
243 	exec2 = FALSE;
244 	execute_me(cmd, USR);
245 }
246 
ExecScan()247 void ExecScan() {
248 
249 	char *what;
250 	what = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (winterface));
251 	if(what == NULL) {
252 		return;
253 	}
254 	char line[MAXLINE];
255 	char cmd[CMDSIZE];
256 	int row = 0;
257 
258 	memset(line, 0, MAXLINE);
259 	memset(cmd, 0, CMDSIZE);
260 
261 	GtkWidget *g = DrawHosts();
262 
263 	sprintf(cmd, "ifconfig %s list scan", what);
264 	FILE *fp = popen(cmd, "r");
265 	if(fp == NULL)
266 		return;
267 	while(fgets(line, MAXLINE, fp)) {
268 		cosmetics(line);
269 		/* XXX: This might look better in a treeview. */
270 		gtk_grid_attach(GTK_GRID (g), gtk_label_new(line), 0, row, 1, 1);
271 		gtk_grid_attach(GTK_GRID (g), gtk_label_new("-- "), 1, row, 1, 1);
272 
273 		row++;
274 		memset(line, 0, MAXLINE);
275 	}
276 	pclose(fp);
277 
278 	if(row == 0)
279 		gtk_grid_attach(GTK_GRID (g), gtk_label_new("No results!"), 0, row, 1, 1);
280 
281 
282 	gtk_grid_attach(GTK_GRID (g), gtk_label_new("   "), 0, (row+1), 1, 1);
283 	gtk_widget_show_all(woptions);
284 }
285 
ExecModify()286 void ExecModify() {
287 }
288 
ExecDown()289 void ExecDown() {
290 
291 	char *what;
292 	what = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (winterface));
293 	if(what == NULL)
294 		return;
295 	char *cmd = malloc(CMDSIZE);
296 	if(cmd == NULL)
297 		return;
298 	memset(cmd, 0, CMDSIZE);
299 	sprintf(cmd, "ifconfig %s down", what);
300 	free(what);
301 	exec2 = FALSE;
302 	execute_me(cmd, USR);
303 	}
304 
ExecUp()305 void ExecUp() {
306 
307 	char *what;
308 	what = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (winterface));
309 	if(what == NULL)
310 		return;
311 	char *cmd = malloc(CMDSIZE);
312 	if(cmd == NULL)
313 		return;
314 	memset(cmd, 0, CMDSIZE);
315 	sprintf(cmd, "ifconfig %s up", what);
316 	free(what);
317 	exec2 = FALSE;
318 	execute_me(cmd, USR);
319 	}
320 
ExecConnect()321 void ExecConnect() {
322 
323 	/* Network interface. */
324 	char *dev;
325 	dev = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT (winterface));
326 	if(dev == NULL) {
327 		return;
328 	}
329 
330 	/* Access point. */
331 	char *h;
332 	h = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT (whosts));
333 	if(h == NULL) {
334 		return;
335 	}
336 	/* Only care for bssid. */
337 	char *bssid = GetBssid(h);
338 
339 	/* Passphrase. */
340 	const gchar *gpass = gtk_entry_get_text(GTK_ENTRY (wpass));
341 	if(!gtk_widget_is_visible(GTK_WIDGET (wpass)) || (gpass == NULL) || (strlen(gpass) == 0)) {
342 		return;
343 	}
344 
345 	/*
346 	 * XXX: This is certainly a dirty way to connect.
347 	 * echo > /tmp
348 	 * pkill wpa_supplicant
349 	 * wpa_supplicant -i -B -c
350 	 */
351 	char *tmpfile = random_filename();
352 	char *cmd = malloc(MAXLINE); /* Make it big. */
353 	memset(cmd, 0, MAXLINE);
354 	snprintf(cmd, MAXLINE, "echo 'ctrl_interface=/var/run/wpa_supplicant\nnetwork={\nbssid=%s\npsk=\"%s\"\n}\n' > %s", bssid, gpass, tmpfile);
355 	FILE *fp = popen(cmd, "r");
356 	pclose(fp);
357 
358 	/* pkill wpa_supplicant */
359 	memset(cmd, 0, MAXLINE);
360 	sprintf(cmd, "pkill wpa_supplicant");
361 
362 	/* Second command: wpa_supplicant -i -B -c */
363 	secondcmd = malloc(MAXLINE); /* Make it big. */
364 	memset(secondcmd, 0, MAXLINE);
365 	snprintf(secondcmd, MAXLINE, "wpa_supplicant -i %s -B -c %s", dev, tmpfile);
366 	exec2 = TRUE;
367 	wtmp = tmpfile;
368 
369 	free(bssid);
370 	free(dev);
371 	free(h);
372 //	unlink(tmpfile);
373 	execute_me(cmd, USR);
374 }
375 
ApplyClicked(GtkWidget * w,gpointer p)376 void ApplyClicked( GtkWidget *w, gpointer p) {
377 
378 	/* Default is to only execute one root command. */
379 	exec2 = FALSE;
380 	secondcmd = NULL;
381 	wtmp = NULL;
382 
383 	char *what;
384 	what = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (wcommands));
385 	if(what == NULL) {
386 		return;
387 	}
388 	if(strcmp(what, "Create") == 0) {
389 		free(what);
390 		ExecCreate();
391 		wireless();
392 	}
393 	else if(strcmp(what, "Destroy") == 0) {
394 		free(what);
395 		ExecDestroy();
396 		wireless();
397 	}
398 	else if(strcmp(what, "Scan") == 0) {
399 		free(what);
400 		ExecScan();
401 	}
402 	else if(strcmp(what, "Modify") == 0) {
403 		free(what);
404 		ExecModify();
405 	}
406 	else if(strcmp(what, "Connect") == 0) {
407 		free(what);
408 		ExecConnect();
409 		wireless();
410 	}
411 	else if(strcmp(what, "Up") == 0) {
412 		free(what);
413 		ExecUp();
414 		//wireless(); XXX: ???
415 	}
416 	else if(strcmp(what, "Down") == 0) {
417 		free(what);
418 		ExecDown();
419 		//wireless(); XXX: ???
420 	}
421 }
422 
OptionsCreate()423 void OptionsCreate() {
424 
425 	gtk_container_add(GTK_CONTAINER (woptions), gtk_label_new("Options:"));
426 
427 // XXX: todo: Add Modes.
428 //	gtk_container_add(GTK_CONTAINER (woptions), ComboModes());
429 
430 	gtk_widget_show_all(woptions);
431 }
432 
OptionsConnect()433 void OptionsConnect() {
434 
435 	/* Did he choose an interface yet? */
436 	char *dev;
437 	dev = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (winterface));
438 	if((dev == NULL) || (strlen(dev) == 0)) {
439 		msg("Choose an interface!");
440 		return;
441 	}
442 
443 	wpass = gtk_entry_new();
444 	gtk_entry_buffer_set_max_length (gtk_entry_get_buffer(GTK_ENTRY (wpass)), 30);
445 	gtk_entry_set_width_chars(GTK_ENTRY(wpass), 20);
446 	gtk_entry_set_placeholder_text (GTK_ENTRY(wpass), "Passphrase");
447 
448 
449 	gtk_container_add(GTK_CONTAINER (woptions), gtk_label_new("Options:"));
450 	if(ComboHosts() == TRUE)
451 		gtk_container_add(GTK_CONTAINER (woptions), whosts);
452 	else
453 		gtk_container_add(GTK_CONTAINER (woptions), gtk_label_new("I scanned, but no Access Points were found!"));
454 	gtk_container_add(GTK_CONTAINER (woptions), wpass);
455 
456 	gtk_widget_show_all(woptions);
457 }
458 
ComboHosts()459 gboolean ComboHosts() {
460 
461 	if(GTK_IS_WIDGET(whosts))
462 		gtk_widget_destroy(whosts);
463 	whosts = gtk_combo_box_text_new();
464 
465 	char *what;
466 	what = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (winterface));
467 	if(what == NULL) {
468 		msg("Choose a wlan interface!");
469 		return FALSE;
470 	}
471 	char line[MAXLINE];
472 	char cmd[CMDSIZE];
473 	int items = 0;
474 
475 	memset(line, 0, MAXLINE);
476 	memset(cmd, 0, CMDSIZE);
477 
478 	sprintf(cmd, "ifconfig %s list scan", what);
479 	FILE *fp = popen(cmd, "r");
480 	if(fp == NULL)
481 		return FALSE;
482 	while(fgets(line, MAXLINE, fp)) {
483 		/* Only show ssid and bssid */
484 		line[56] = '\0';
485 		gtk_combo_box_text_append( GTK_COMBO_BOX_TEXT (whosts), NULL, line);
486 		memset(line, 0, MAXLINE);
487 		items++;
488 	}
489 	pclose(fp);
490 
491 	if(items == 0)
492 		return FALSE;
493 	return TRUE;
494 }
495 
DrawHosts()496 GtkWidget *DrawHosts() {
497 
498 	CleanOptions();
499 
500 	GtkWidget *s = WScrolled(woptions);
501 
502 	/* Grid */
503 	GtkWidget *hg	 = gtk_grid_new();
504 	gtk_grid_set_column_homogeneous(GTK_GRID(hg), FALSE);
505 //	gtk_grid_insert_column(GTK_GRID(gh), 7);
506 	gtk_grid_set_row_spacing(GTK_GRID(hg), 5);
507 	gtk_grid_set_column_spacing(GTK_GRID(hg), 0);
508 	gtk_container_add(GTK_CONTAINER (s), hg);
509 
510 	return hg;
511 }
512 
DrawOptions(char * what)513 void DrawOptions(char *what) {
514 
515 	CleanOptions();
516 
517 
518 	if(strcmp(what, "Create") == 0) {
519 		OptionsCreate();
520 		gtk_widget_show(wdev);
521 	}
522 	else if(strcmp(what, "Destroy") == 0) {
523 		gtk_widget_show(winterface);
524 	}
525 	else if(strcmp(what, "Scan") == 0) {
526 		/* No options */
527 		gtk_widget_show(winterface);
528 	}
529 	else if(strcmp(what, "Connect") == 0) {
530 		gtk_widget_show(winterface);
531 		OptionsConnect();
532 	}
533 	else if(strcmp(what, "Up") == 0) {
534 		/* No options */
535 		gtk_widget_show(winterface);
536 	}
537 	else if(strcmp(what, "Down") == 0) {
538 		/* No options */
539 		gtk_widget_show(winterface);
540 	}
541 	else if(strcmp(what, "Modify") == 0) {
542 		/* empty for now */
543 	}
544 }
545 
command_changed(GtkWidget * w,gpointer p)546 void command_changed( GtkWidget *w, gpointer p) {
547 
548 	if(GTK_IS_WIDGET (winterface))
549 		gtk_widget_hide(winterface);
550 	gtk_widget_show(wapply);
551 
552 	char *cmd;
553 	cmd = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (wcommands));
554 	if(cmd == NULL)
555 		return;
556 
557 	/* Update devices and interfaces. */
558 	wdev = ComboWlanDevices();
559 	winterface = ComboWlanInterfaces();
560 
561 	gtk_widget_hide(GTK_WIDGET (wdev));
562 	gtk_widget_hide(GTK_WIDGET (winterface));
563 	/* Present relevant options to user. */
564 	DrawOptions(cmd);
565 	free(cmd);
566 }
567 
winterface_changed(GtkWidget * w,gpointer p)568 void winterface_changed( GtkWidget *w, gpointer p) {
569 
570 	char *cmd;
571 	cmd = gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT (wcommands));
572 	if((cmd == NULL) || (strlen(cmd) == 0)) {
573 		return;
574 	}
575 	if(strcmp(cmd, "Connect") == 0) {
576 		DrawOptions(cmd);
577 	}
578 }
579 
WEditor()580 void WEditor() {
581 
582 	WTopbox();
583 
584 	/* Grid */
585 	wedit = gtk_grid_new();
586 	gtk_grid_set_column_homogeneous(GTK_GRID(wedit), FALSE);
587 	gtk_grid_insert_column(GTK_GRID(wedit), 7);
588 	gtk_grid_set_row_spacing(GTK_GRID(wedit), 5);
589 	gtk_grid_set_column_spacing(GTK_GRID(wedit), 5);
590 	gtk_box_pack_start(GTK_BOX(topbox), wedit, FALSE, FALSE, 10);
591 
592 	WGridEntries();
593 
594 	/* Options */
595 	woptions = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
596 	gtk_container_add (GTK_CONTAINER (topbox), woptions);
597 }
598 
WTreeview(GtkWidget * box)599 GtkWidget *WTreeview(GtkWidget *box) {
600 
601 	GtkWidget *view = gtk_tree_view_new();
602 
603 	gtk_container_add(GTK_CONTAINER(box), view);
604 	GtkCellRenderer *cell = gtk_cell_renderer_text_new();
605 
606 	g_object_set(cell, "font", opt.fontsize, NULL);
607 	//g_object_set(cell,"editable", TRUE, NULL);
608 	//gtk_tree_view_set_enable_search(view, TRUE);
609 	g_object_set(view, "enable-grid-lines", GTK_TREE_VIEW_GRID_LINES_BOTH, NULL);
610 
611 
612 	char *col_title = "Name";
613 	GtkTreeViewColumn *col = gtk_tree_view_column_new();
614 	gtk_tree_view_column_set_title(col, col_title);
615 	gtk_tree_view_column_set_clickable(col, TRUE);
616 	gtk_tree_view_column_set_reorderable(col, TRUE);
617 	gtk_tree_view_column_set_resizable(col, TRUE);
618   	gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
619 
620 	gtk_tree_view_column_pack_start(col, cell, TRUE);
621 	gtk_tree_view_column_add_attribute(col, cell, "text", 0);
622 
623 	wtree = gtk_tree_store_new(1, G_TYPE_STRING);
624 
625 	gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(wtree));
626 	g_object_unref(wtree); /* destroy model automatically with view. */
627   	gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)),
628                              GTK_SELECTION_SINGLE);
629 
630 	return view;
631 }
632 
WFillTree(GtkWidget * tv)633 void WFillTree(GtkWidget *tv) {
634 
635 	/* Execute "ifconfig -g inet*/
636 	char cmd[CMDSIZE];
637 	char *devlist;
638 	char *devinfo;
639 	char *dev;
640 	char *brk;
641 
642 	GtkTreeIter child;
643 	GtkTreeIter parent;
644 
645 
646 	devlist = command("ifconfig -g wlan | tr \"\n\" \" \"");
647 	if((devlist == NULL) || (strlen(devlist) == 0))
648 		return;
649 
650 
651 	dev = strtok_r(devlist, " ", &brk);
652 	while(dev) {
653 
654 		gtk_tree_store_append(wtree, &parent, NULL);
655 		gtk_tree_store_set(wtree, &parent, 0, dev, -1);
656 
657 		sprintf(cmd, "ifconfig %s", dev);
658 		devinfo = command(cmd);
659 		if(devinfo != NULL) {
660 			gtk_tree_store_append(wtree, &child, &parent);
661 			gtk_tree_store_set(wtree, &child, 0, devinfo, -1);
662 			free(devinfo);
663 		}
664 		/* next device */
665 		dev = strtok_r( NULL, " ", &brk);
666 	}
667 
668 	free(devlist);
669 
670 	gtk_tree_view_expand_all(GTK_TREE_VIEW(tv));
671 	gtk_tree_view_set_enable_search (GTK_TREE_VIEW(tv), TRUE);
672 	gtk_tree_view_set_enable_tree_lines (GTK_TREE_VIEW(tv), TRUE);
673 	gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(tv), GTK_TREE_VIEW_GRID_LINES_BOTH);
674 
675 }
676 
WBottomView()677 void WBottomView() {
678 
679 	/* A top level container. */
680 	botbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 15);
681 	gtk_container_add (GTK_CONTAINER (wbox), botbox);
682 
683 	/* A scrolled window. */
684 	GtkWidget *sw = WScrolled(botbox);
685 
686 	/* A treeview */
687 	GtkWidget *tv = WTreeview(sw);
688 
689 	/* Fill the treestore. */
690 	WFillTree(tv);
691 
692 	/* Update treeview nicely. */
693 	gtk_widget_hide(sw);
694 	gtk_widget_show(sw);
695 }
696 
wireless()697 void wireless() {
698 
699 	CleanWireless();
700 
701 	/* A top level container. */
702 	wbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 15);
703 	gtk_container_add (GTK_CONTAINER (tab9), wbox);
704 
705 	/* Editor */
706 	WEditor();
707 
708 	/* Display current wireless interfaces. */
709 	WBottomView();
710 
711 	gtk_widget_show_all(wbox);
712 	gtk_widget_hide(wapply);
713 	gtk_widget_hide(winterface);
714 	gtk_widget_hide(wdev);
715 }
716 
717