PageRenderTime 65ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/packETH-1.7/src/callbacks.c

#
C | 4797 lines | 3438 code | 926 blank | 433 comment | 670 complexity | cd80ae1ceb7d98ae003d3ff989a70d07 MD5 | raw file
Possible License(s): GPL-3.0

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. * packETH - ethernet packet generator
  3. * By Miha Jemec <jemcek@gmail.com>
  4. * Copyright 2003 Miha Jemec, Iskratel
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version 2
  9. * of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  19. *
  20. * callback.c - all callback routines
  21. *
  22. *
  23. */
  24. #define MAXNUMLOADPACKETS 1000
  25. #include <gtk/gtk.h>
  26. #include <stdio.h>
  27. #include <string.h>
  28. #include <stdlib.h>
  29. #include "function.h"
  30. #include "callbacks.h"
  31. #include "interface.h"
  32. #include "support.h"
  33. #include "loadpacket.h"
  34. #include "savepacket.h"
  35. #include <unistd.h>
  36. #include <sys/ioctl.h>
  37. #include <sys/socket.h>
  38. #include <net/if.h>
  39. #include <ctype.h>
  40. #include <math.h>
  41. static GtkWidget *file_menu = NULL;
  42. static GtkWidget *save_file_menu = NULL;
  43. static GtkWidget *database_file_menu = NULL;
  44. static GtkWidget *interface_dialog_menu = NULL;
  45. static GtkWidget *error_dialog_menu = NULL;
  46. static GtkWidget *about_dialog_menu = NULL;
  47. static GtkWidget *tos_dialog_menu = NULL;
  48. static GtkWidget *fragment_dialog_menu = NULL;
  49. static GtkWidget *selection1_dialog = NULL;
  50. static GtkWidget *udp_payload_dialog = NULL;
  51. extern unsigned char packet[1522];
  52. extern int number;
  53. extern int stop_flag;
  54. gint row_number;/* this is because i cant get the selected row number*/
  55. gchar iftext[20];
  56. gchar address_filename[100] = "addresslist";
  57. static GtkWidget *entry_field;
  58. static GtkWidget *entry_field_ip;
  59. static GtkWidget *entry_field_ipv6;
  60. static GtkWidget *entry_field_udp;
  61. static GtkWidget *entry_field_tos;
  62. static GtkWidget *entry_field_fragment;
  63. static GtkButton *btx;
  64. static gboolean IP_yes = FALSE;
  65. static gboolean IPv6_yes = FALSE;
  66. static gboolean MAC_yes = FALSE;
  67. static int load_select_nr = 0;
  68. int show_error_dialog = 1;
  69. void
  70. IP_packet_toggled (GtkToggleButton *togglebutton,
  71. gpointer user_data)
  72. {
  73. GtkWidget *nt2;
  74. GtkWidget *nt4;
  75. GtkWidget *rb1, *rb2, *rb3, *rb4, *rb5;
  76. GtkWidget *option_menu, *opt_value;
  77. GtkWidget *option_menu2, *opt_value2;
  78. GtkWidget *cbt;
  79. cbt = lookup_widget(GTK_WIDGET(togglebutton), "auto_get_mac_cbt");
  80. gtk_widget_set_sensitive (cbt, TRUE);
  81. /* eth II */
  82. option_menu = lookup_widget(GTK_WIDGET(togglebutton), "L_optmenu1_bt");
  83. opt_value = lookup_widget(GTK_WIDGET(togglebutton), "L_ethtype");
  84. gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu), 0);
  85. gtk_entry_set_text(GTK_ENTRY(opt_value), "0800");
  86. /* eth 802.3 */
  87. option_menu2 = lookup_widget(GTK_WIDGET(togglebutton), "optionmenu6");
  88. opt_value2 = lookup_widget(GTK_WIDGET(togglebutton), "L_pid");
  89. gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu2), 0);
  90. gtk_entry_set_text(GTK_ENTRY(opt_value2), "0800");
  91. /* open ipv4 page */
  92. nt2 = lookup_widget(GTK_WIDGET(togglebutton), "notebook2");
  93. gtk_notebook_set_page(GTK_NOTEBOOK(nt2), 0);
  94. /* what is next page */
  95. rb1 = lookup_widget(GTK_WIDGET(togglebutton), "tcp_bt");
  96. rb2 = lookup_widget(GTK_WIDGET(togglebutton), "udp_bt");
  97. rb3 = lookup_widget(GTK_WIDGET(togglebutton), "icmp_bt");
  98. rb4 = lookup_widget(GTK_WIDGET(togglebutton), "ip_user_data_bt");
  99. rb5 = lookup_widget(GTK_WIDGET(togglebutton), "igmp_bt");
  100. nt4 = lookup_widget(GTK_WIDGET(togglebutton), "notebook4");
  101. gtk_editable_set_editable(GTK_EDITABLE(opt_value), FALSE);
  102. gtk_editable_set_editable(GTK_EDITABLE(opt_value2), FALSE);
  103. if (GTK_TOGGLE_BUTTON(rb1)->active)
  104. gtk_notebook_set_page(GTK_NOTEBOOK(nt4), 1);
  105. else if (GTK_TOGGLE_BUTTON(rb2)->active)
  106. gtk_notebook_set_page(GTK_NOTEBOOK(nt4), 0);
  107. else if (GTK_TOGGLE_BUTTON(rb3)->active)
  108. gtk_notebook_set_page(GTK_NOTEBOOK(nt4), 2);
  109. else if (GTK_TOGGLE_BUTTON(rb5)->active)
  110. gtk_notebook_set_page(GTK_NOTEBOOK(nt4), 4);
  111. else
  112. gtk_notebook_set_page(GTK_NOTEBOOK(nt4), 3);
  113. }
  114. void
  115. on_arppkt_radiobt_toggled (GtkToggleButton *togglebutton,
  116. gpointer user_data)
  117. {
  118. GtkWidget *nt2, *nt4;
  119. GtkWidget *option_menu, *opt_value;
  120. GtkWidget *option_menu2, *opt_value2;
  121. GtkWidget *cbt;
  122. cbt = lookup_widget(GTK_WIDGET(togglebutton), "auto_get_mac_cbt");
  123. gtk_widget_set_sensitive (cbt, TRUE);
  124. /* for eth II */
  125. option_menu = lookup_widget(GTK_WIDGET(togglebutton), "L_optmenu1_bt");
  126. opt_value = lookup_widget(GTK_WIDGET(togglebutton), "L_ethtype");
  127. gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu), 2);
  128. gtk_entry_set_text(GTK_ENTRY(opt_value), "0806");
  129. /* for eth 802.3 */
  130. option_menu2 = lookup_widget(GTK_WIDGET(togglebutton), "optionmenu6");
  131. opt_value2 = lookup_widget(GTK_WIDGET(togglebutton), "L_pid");
  132. gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu2), 2);
  133. gtk_entry_set_text(GTK_ENTRY(opt_value2), "0806");
  134. /* open arp notebook page and empty notebook page for 4 layer */
  135. nt2 = lookup_widget(GTK_WIDGET(togglebutton), "notebook2");
  136. gtk_notebook_set_page(GTK_NOTEBOOK(nt2), 3);
  137. nt4 = lookup_widget(GTK_WIDGET(togglebutton), "notebook4");
  138. gtk_notebook_set_page(GTK_NOTEBOOK(nt4), 5);
  139. gtk_editable_set_editable(GTK_EDITABLE(opt_value), FALSE);
  140. gtk_editable_set_editable(GTK_EDITABLE(opt_value2), FALSE);
  141. }
  142. void
  143. on_usedef2_radibt_toggled (GtkToggleButton *togglebutton,
  144. gpointer user_data)
  145. {
  146. GtkWidget *nt2, *nt4;
  147. GtkWidget *option_menu, *opt_value;
  148. //GtkWidget *cbt;
  149. //cbt = lookup_widget(GTK_WIDGET(togglebutton), "auto_get_mac_cbt");
  150. //if (GTK_TOGGLE_BUTTON(cbt)->active) {
  151. // on_auto_get_mac_cbt_toggled(togglebutton, user_data);
  152. // gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cbt), FALSE);
  153. // gtk_widget_set_sensitive (cbt, FALSE);
  154. //}
  155. //else
  156. // gtk_widget_set_sensitive (cbt, FALSE);
  157. /* for eth II */
  158. option_menu = lookup_widget(GTK_WIDGET(togglebutton), "L_optmenu1_bt");
  159. gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu), 3);
  160. opt_value = lookup_widget(GTK_WIDGET(togglebutton), "L_ethtype");
  161. gtk_editable_set_editable(GTK_EDITABLE(opt_value), TRUE);
  162. gtk_entry_set_text(GTK_ENTRY(opt_value), "");
  163. /* for eth 802.3 */
  164. option_menu = lookup_widget(GTK_WIDGET(togglebutton), "optionmenu6");
  165. gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu), 3);
  166. opt_value = lookup_widget(GTK_WIDGET(togglebutton), "L_pid");
  167. gtk_editable_set_editable(GTK_EDITABLE(opt_value), TRUE);
  168. gtk_entry_set_text(GTK_ENTRY(opt_value), "");
  169. /* set the correct notebooks */
  170. nt2 = lookup_widget(GTK_WIDGET(togglebutton), "notebook2");
  171. gtk_notebook_set_page(GTK_NOTEBOOK(nt2), 2);
  172. nt4 = lookup_widget(GTK_WIDGET(togglebutton), "notebook4");
  173. gtk_notebook_set_page(GTK_NOTEBOOK(nt4), 5);
  174. }
  175. void
  176. on_ver_II_bt_toggled (GtkToggleButton *togglebutton,
  177. gpointer user_data)
  178. {
  179. GtkWidget *nt1;
  180. GtkWidget *fr7;
  181. nt1 = lookup_widget(GTK_WIDGET(togglebutton), "notebook_ethtype");
  182. gtk_notebook_set_page(GTK_NOTEBOOK(nt1), 0);
  183. fr7 = lookup_widget(GTK_WIDGET(togglebutton), "frame7");
  184. gtk_widget_set_sensitive(fr7, FALSE);
  185. }
  186. void
  187. on_802_3_bt_toggled (GtkToggleButton *togglebutton,
  188. gpointer user_data)
  189. {
  190. GtkWidget *nt1;
  191. GtkWidget *fr7;
  192. nt1 = lookup_widget(GTK_WIDGET(togglebutton), "notebook_ethtype");
  193. gtk_notebook_set_page(GTK_NOTEBOOK(nt1), 1);
  194. fr7 = lookup_widget(GTK_WIDGET(togglebutton), "frame7");
  195. gtk_widget_set_sensitive(fr7, TRUE);
  196. }
  197. void
  198. on_802_1q_bt_clicked (GtkButton *button,
  199. gpointer user_data)
  200. {
  201. GtkWidget *fr6;
  202. fr6 = lookup_widget(GTK_WIDGET(button), "frame6");
  203. if (GTK_TOGGLE_BUTTON(button)->active)
  204. gtk_widget_set_sensitive(fr6, TRUE);
  205. else
  206. gtk_widget_set_sensitive(fr6, FALSE);
  207. }
  208. void
  209. on_L_8023_llc_tbt_toggled (GtkToggleButton *togglebutton,
  210. gpointer user_data)
  211. {
  212. GtkWidget *l_oui, *l_pid, *lbl_oui, *lbl_pid, *opt;
  213. l_oui = lookup_widget(GTK_WIDGET(togglebutton), "L_oui");
  214. l_pid = lookup_widget(GTK_WIDGET(togglebutton), "L_pid");
  215. lbl_oui = lookup_widget(GTK_WIDGET(togglebutton), "label_oui");
  216. lbl_pid = lookup_widget(GTK_WIDGET(togglebutton), "label_pid");
  217. lbl_pid = lookup_widget(GTK_WIDGET(togglebutton), "label_pid");
  218. opt = lookup_widget(GTK_WIDGET(togglebutton), "optionmenu6");
  219. gtk_entry_set_text(GTK_ENTRY(l_oui), "");
  220. gtk_entry_set_text(GTK_ENTRY(l_pid), "");
  221. gtk_widget_set_sensitive(l_oui, FALSE);
  222. gtk_widget_set_sensitive(l_pid, FALSE);
  223. gtk_widget_set_sensitive(lbl_oui, FALSE);
  224. gtk_widget_set_sensitive(lbl_pid, FALSE);
  225. gtk_widget_set_sensitive(opt, FALSE);
  226. }
  227. void
  228. on_L_8023_llcsnap_tbt_toggled (GtkToggleButton *togglebutton,
  229. gpointer user_data)
  230. {
  231. GtkWidget *l_oui, *l_pid, *lbl_oui, *lbl_pid, *opt, *menu, *menu_item;
  232. gint index;
  233. l_oui = lookup_widget(GTK_WIDGET(togglebutton), "L_oui");
  234. l_pid = lookup_widget(GTK_WIDGET(togglebutton), "L_pid");
  235. lbl_oui = lookup_widget(GTK_WIDGET(togglebutton), "label_oui");
  236. lbl_pid = lookup_widget(GTK_WIDGET(togglebutton), "label_pid");
  237. opt = lookup_widget(GTK_WIDGET(togglebutton), "optionmenu6");
  238. gtk_widget_set_sensitive(l_oui, TRUE);
  239. gtk_widget_set_sensitive(l_pid, TRUE);
  240. gtk_widget_set_sensitive(lbl_oui, TRUE);
  241. gtk_widget_set_sensitive(lbl_pid, TRUE);
  242. gtk_entry_set_text(GTK_ENTRY(l_oui), "000000");
  243. menu = GTK_OPTION_MENU(opt)->menu;
  244. menu_item = gtk_menu_get_active (GTK_MENU (menu));
  245. index = g_list_index (GTK_MENU_SHELL (menu)->children, menu_item);
  246. switch (index) {
  247. case 1: {
  248. gtk_entry_set_text(GTK_ENTRY(l_pid), "86DD");
  249. break;
  250. }
  251. case 2: {
  252. gtk_entry_set_text(GTK_ENTRY(l_pid), "0806");
  253. break;
  254. }
  255. case 3: {
  256. gtk_entry_set_text(GTK_ENTRY(l_pid), "");
  257. break;
  258. }
  259. default:
  260. gtk_entry_set_text(GTK_ENTRY(l_pid), "0800");
  261. }
  262. gtk_widget_set_sensitive(opt, TRUE);
  263. }
  264. void
  265. on_exit1_activate (GtkMenuItem *menuitem,
  266. gpointer user_data)
  267. {
  268. gtk_main_quit();
  269. }
  270. void
  271. on_about1_activate (GtkMenuItem *menuitem,
  272. gpointer user_data)
  273. {
  274. if (about_dialog_menu != NULL) {
  275. gdk_window_show(about_dialog_menu->window);
  276. gdk_window_raise(about_dialog_menu->window);
  277. return;
  278. }
  279. about_dialog_menu = create_about_dialog();
  280. gtk_widget_show(about_dialog_menu);
  281. }
  282. void
  283. on_window1_destroy (GtkObject *object,
  284. gpointer user_data)
  285. {
  286. gtk_main_quit();
  287. }
  288. void
  289. on_fileselection1_destroy (GtkObject *object,
  290. gpointer user_data)
  291. {
  292. file_menu = NULL;
  293. }
  294. /* button1 is the load button, so what this function will do depends on who called it:
  295. it can be one of the 4 basic windows: builder, gen-b, gen-s or gen-k.
  296. And there can be a call for this window from each of these windows too.
  297. */
  298. void
  299. on_ok_button1_clicked (GtkButton *button,
  300. gpointer user_data)
  301. {
  302. GtkWidget *notbk;
  303. gint page;
  304. FILE *file_p;
  305. gchar *fname /* , *fname2 */;
  306. char buff[101];
  307. fname = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(lookup_widget(gtk_widget_get_toplevel(GTK_WIDGET(button)),"fileselection1"))));
  308. //fname2 = g_strdup(gtk_entry_get_text(GTK_ENTRY(GTK_FILE_SELECTION (user_data)->selection_entry)));
  309. if((file_p = fopen(fname, "r")) == NULL) {
  310. //printf("can not open file for reading\n");
  311. error("Error: can't open file for reading!");
  312. return;
  313. }
  314. /* now who called this function */
  315. switch (load_select_nr) {
  316. case 1: { /* this is the toolbar load button, we need to know which notebook is open */
  317. notbk = lookup_widget(GTK_WIDGET(btx), "notebook1");
  318. page = gtk_notebook_get_current_page(GTK_NOTEBOOK(notbk));
  319. if (page == 0) { /* so we have the build notebook open */
  320. if (load_data(btx, file_p, 1, 1) == -1) {
  321. /* calling previous function with last argument =1 means loading for builder */
  322. fclose(file_p);
  323. return;
  324. }
  325. break;
  326. }
  327. else if (page == 1) { /* it is the send build generator */
  328. if (load_gen_b_data(btx, file_p) == -1) {
  329. error("Error: wrong file format!");
  330. fclose(file_p);
  331. return;
  332. }
  333. break;
  334. }
  335. /* page with sequence generator is open */
  336. else if (page == 2) { /* it is the send build generator */
  337. if (load_gen_s_data(btx, file_p) == -1) {
  338. error("Error: wrong file format!");
  339. fclose(file_p);
  340. return;
  341. }
  342. break;
  343. }
  344. else if (page == 3) { /* it is the send pcap file generator */
  345. if (load_data(btx, file_p, 2, MAXNUMLOADPACKETS) == -1) {
  346. error("Error: wrong file format!");
  347. fclose(file_p);
  348. return;
  349. }
  350. break;
  351. }
  352. }
  353. /* next are the select buttons on the gen-s window */
  354. case 2: ;
  355. case 3: ;
  356. case 4: ;
  357. case 5: ;
  358. case 6: ;
  359. case 7: ;
  360. case 8: ;
  361. case 9: ;
  362. case 10: {
  363. //if (check_if_file_is_packet(file_p) == -1) {
  364. if (load_data(btx, file_p, 1, 1) == -1) {
  365. error("Error: wrong file format!");
  366. fclose(file_p);
  367. return;
  368. }
  369. gtk_entry_set_text(GTK_ENTRY(entry_field), fname);
  370. break;
  371. }
  372. }
  373. fclose(file_p);
  374. snprintf(buff, 100, " Parameters loaded from file %s", fname);
  375. statusbar_text(btx, buff);
  376. gtk_grab_remove(gtk_widget_get_toplevel(GTK_WIDGET(button)));
  377. gtk_widget_destroy(gtk_widget_get_toplevel(GTK_WIDGET(button)));
  378. }
  379. void
  380. on_cancel_button1_clicked (GtkButton *button,
  381. gpointer user_data)
  382. {
  383. gtk_grab_remove(gtk_widget_get_toplevel(GTK_WIDGET(button)));
  384. gtk_widget_destroy(gtk_widget_get_toplevel(GTK_WIDGET(button)));
  385. }
  386. void
  387. on_Load_button_clicked (GtkButton *button,
  388. gpointer user_data)
  389. {
  390. statusbar_text(button, "");
  391. if (file_menu != NULL) {
  392. gdk_window_show(file_menu->window);
  393. gdk_window_raise(file_menu->window);
  394. return;
  395. }
  396. file_menu = create_fileselection1();
  397. gtk_widget_show(file_menu);
  398. btx = button;
  399. load_select_nr = 1;
  400. }
  401. void
  402. on_Save_button_clicked (GtkButton *button,
  403. gpointer user_data)
  404. {
  405. statusbar_text(button, "");
  406. if (save_file_menu != NULL) {
  407. gdk_window_show(save_file_menu->window);
  408. gdk_window_raise(save_file_menu->window);
  409. return;
  410. }
  411. save_file_menu = create_fileselection2();
  412. gtk_widget_show(save_file_menu);
  413. btx = button;
  414. }
  415. /* pressing the ok button in the save dialog causes us to be here */
  416. void
  417. on_ok_button2_clicked (GtkButton *button,
  418. gpointer user_data)
  419. {
  420. GtkWidget *notbk;
  421. gint page;
  422. gchar *fname;
  423. FILE *file_p;
  424. char buff4[101];
  425. /* hm, first we should decide, what are we going to save: a packet, send_built parameters,
  426. * send_sequence parameters or send kernel parameters. I last three cases we only save
  427. * the values and not also the packets themself (only the names of the packet)
  428. * so let's check which notebook is open */
  429. notbk = lookup_widget(GTK_WIDGET(btx), "notebook1");
  430. page = gtk_notebook_get_current_page(GTK_NOTEBOOK(notbk));
  431. fname = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(lookup_widget(gtk_widget_get_toplevel(GTK_WIDGET(button)),"fileselection2"))));
  432. /* lets check if the file exists and we don't allow to overwrite it
  433. * is there any way to do this in a more elegant manner? */
  434. //if((file_p = fopen(fname, "r")) != NULL) { /* could be also some other failure??? */
  435. // error("Error: wrong file name, file already exists!");
  436. // return;
  437. //}
  438. if((file_p = fopen(fname, "w")) == NULL) {
  439. error("Error: can not open file for saving");
  440. return;
  441. }
  442. if (page == 0) { /* so we have the build notebook open, it means we save the packet */
  443. /* YYY ok, this is not yet implemented */
  444. /* you could also add possibility to save even with this button on??? */
  445. //bt1 = lookup_widget(GTK_WIDGET(btx), "auto_get_mac_cbt");
  446. //if (GTK_TOGGLE_BUTTON(bt1)->active) {
  447. //printf("Error: you can't save in a packet if auto get link layer is on!\n");
  448. // error("Error: you can't save in a packet if auto get link layer is on!");
  449. // return;
  450. //}
  451. if (save_packet(btx, user_data, file_p) == -1) {
  452. fclose(file_p);
  453. return;
  454. }
  455. }
  456. else if (page == 1) { /* it is the send_built page */
  457. if (save_gen_b(btx, file_p) == -1) {
  458. fclose(file_p);
  459. return;
  460. }
  461. }
  462. else if (page == 2) {
  463. if (save_gen_s(btx, file_p) == -1) {
  464. fclose(file_p);
  465. return;
  466. }
  467. }
  468. else if (page == 3) {
  469. if (save_gen_pcap(btx, file_p) == -1) {
  470. fclose(file_p);
  471. return;
  472. }
  473. }
  474. else
  475. return;
  476. fclose(file_p);
  477. snprintf(buff4, 100, " Parameters saved in file %s", fname);
  478. statusbar_text(btx, buff4);
  479. gtk_grab_remove(gtk_widget_get_toplevel(GTK_WIDGET(button)));
  480. gtk_widget_destroy(gtk_widget_get_toplevel(GTK_WIDGET(button)));
  481. }
  482. void
  483. on_cancel_button2_clicked (GtkButton *button,
  484. gpointer user_data)
  485. {
  486. gtk_grab_remove(gtk_widget_get_toplevel(GTK_WIDGET(button)));
  487. gtk_widget_destroy(gtk_widget_get_toplevel(GTK_WIDGET(button)));
  488. }
  489. void
  490. on_fileselection2_destroy (GtkObject *object,
  491. gpointer user_data)
  492. {
  493. save_file_menu = NULL;
  494. }
  495. /*
  496. void
  497. on_clist1_select_row ( GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data)
  498. {
  499. GtkWidget *en_ip, *en_mac, *en_name;
  500. gchar *text_ip, *text_mac, *text_name;
  501. //gchar *textip, *textmac;
  502. //textip = (gchar *)malloc(16*sizeof(gchar));
  503. //textmac = (gchar *)malloc(18*sizeof(gchar));
  504. row_number = row;
  505. en_ip = lookup_widget(GTK_WIDGET(clist), "sel1_IP_entry");
  506. en_mac = lookup_widget(GTK_WIDGET(clist), "sel1_mac_entry");
  507. en_name = lookup_widget(GTK_WIDGET(clist), "entry153");
  508. gtk_clist_get_text(GTK_CLIST(clist), row, 0, &text_ip);
  509. gtk_clist_get_text(GTK_CLIST(clist), row, 1, &text_mac);
  510. gtk_clist_get_text(GTK_CLIST(clist), row, 2, &text_name);
  511. //strncpy(textip, text_ip, strlen(text_ip+1));
  512. //strncpy(textmac, text_mac, strlen(text_mac+1));
  513. gtk_entry_set_text(GTK_ENTRY(en_ip), text_ip);
  514. gtk_entry_set_text(GTK_ENTRY(en_mac), text_mac);
  515. gtk_entry_set_text(GTK_ENTRY(en_name), text_name);
  516. //free(textip);
  517. //free(textmac);
  518. //return;
  519. }
  520. */
  521. void
  522. on_sel1_add_bt_clicked (GtkButton *button,
  523. gpointer user_data)
  524. {
  525. GtkWidget *clist, *en_ip, *en_mac, *en_name, *en_ipv6;
  526. gchar *en_ip_t, *en_mac_t, *en_name_t, *en_ipv6_t;
  527. gchar *text_ip, *text_mac, *text_name, *text_ipv6;
  528. gchar *tmp[4];
  529. //gint number;
  530. GtkTreeModel *treestore;
  531. GtkTreeIter toplevel;
  532. clist = lookup_widget(GTK_WIDGET (selection1_dialog), "clist1");
  533. treestore = gtk_tree_view_get_model(GTK_TREE_VIEW(clist));
  534. en_ip = lookup_widget(GTK_WIDGET(clist), "sel1_IP_entry");
  535. en_ipv6 = lookup_widget(GTK_WIDGET(clist), "entry205");
  536. en_mac = lookup_widget(GTK_WIDGET(clist), "sel1_mac_entry");
  537. en_name = lookup_widget(GTK_WIDGET(clist), "entry153");
  538. /* is there any other elegant way to get the row number but with global variable? */
  539. en_ip_t = (char *)gtk_entry_get_text(GTK_ENTRY(en_ip));
  540. en_ipv6_t = (char *)gtk_entry_get_text(GTK_ENTRY(en_ipv6));
  541. en_mac_t = (char *)gtk_entry_get_text(GTK_ENTRY(en_mac));
  542. en_name_t = (char *)gtk_entry_get_text(GTK_ENTRY(en_name));
  543. /* we still have the value of the row number, so we can check wheather this is
  544. * the same as in the entry fields. so in case the user selects an entry and then
  545. * presses add button we won't get duplicated entries */
  546. GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(clist));
  547. GtkTreeIter iter;
  548. gtk_tree_selection_get_selected(selection,&treestore,&iter);
  549. gtk_tree_model_get(treestore,&iter,0,&text_ip,1,&text_ipv6,2,&text_mac,3,&text_name,-1);
  550. if ( (strlen(en_ip_t) == 0) && (strlen(en_ipv6_t) == 0) && (strlen(en_mac_t) == 0) )
  551. return;
  552. if ( (strcmp(en_ip_t, text_ip) == 0) && (strcmp(en_mac_t, text_mac) == 0) &&
  553. (strcmp(en_ipv6_t, text_ipv6) == 0) && (strcmp(en_name_t, text_name) == 0)) {
  554. //printf("values are the same, we don't insert them!\n");
  555. error("Error: values are the same, we don't insert them!");
  556. return;
  557. }
  558. /* now we have to check if the values are ok */
  559. if ( (strlen(en_ip_t) != 0) && (check_ip_address(en_ip_t) == -1) ) {
  560. //printf("wrong ip entry in address list\n");
  561. error("Error: wrong ip entry in address list");
  562. return;
  563. }
  564. if ( (strlen(en_ipv6_t) != 0) && (check_ipv6_address(en_ipv6_t, 0) == -1) ) {
  565. //printf("wrong ip entry in address list\n");
  566. error("Error: wrong ipv6 entry in address list");
  567. return;
  568. }
  569. if ( (strlen(en_mac_t) != 0) && (check_mac_address(en_mac_t) == -1) ) {
  570. //printf("wrong mac entry in address list\n");
  571. error("Error: wrong mac entry in address list");
  572. return;
  573. }
  574. tmp[0]= (gchar *)malloc(16*sizeof(gchar));
  575. tmp[1]= (gchar *)malloc(40*sizeof(gchar));
  576. tmp[2]= (gchar *)malloc(18*sizeof(gchar));
  577. tmp[3]= (gchar *)malloc(50*sizeof(gchar));
  578. strcpy(tmp[0], en_ip_t);
  579. strcpy(tmp[1], en_ipv6_t);
  580. strcpy(tmp[2], en_mac_t);
  581. strcpy(tmp[3], en_name_t);
  582. gtk_tree_store_append(GTK_TREE_STORE(treestore),&toplevel,NULL);
  583. gtk_tree_store_set(GTK_TREE_STORE(treestore),&toplevel,0,tmp[0],1,tmp[1],2,tmp[2],3,tmp[3],-1);
  584. free(tmp[0]);
  585. free(tmp[1]);
  586. free(tmp[2]);
  587. free(tmp[3]);
  588. }
  589. void
  590. on_sel1_delete_bt_clicked (GtkButton *button,
  591. gpointer user_data)
  592. {
  593. GtkWidget *clist;
  594. GtkTreeModel *treestore;
  595. //GtkTreeIter toplevel;
  596. clist = lookup_widget(GTK_WIDGET (selection1_dialog), "clist1");
  597. treestore = gtk_tree_view_get_model(GTK_TREE_VIEW(clist));
  598. GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(clist));
  599. GtkTreeIter iter;
  600. gtk_tree_selection_get_selected(selection,&treestore,&iter);
  601. gtk_tree_store_remove(GTK_TREE_STORE(treestore),&iter);
  602. gtk_tree_model_get_iter_first(treestore,&iter);
  603. gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(lookup_widget(GTK_WIDGET (selection1_dialog), "clist1"))),&iter);
  604. }
  605. void
  606. on_sel1_ok_bt_clicked (GtkButton *button,
  607. gpointer user_data)
  608. {
  609. GtkWidget *clist; // *en_ip, *en_mac;
  610. gchar *en_ip_t, *en_ipv6_t, *en_mac_t;
  611. gchar *text_ip, *text_ipv6, *text_mac, *text_name;
  612. gchar temp[100];
  613. FILE *fp;
  614. int i;
  615. /* so we want to insert the choosen values into the entry mac field.
  616. * we have to check again, that the values are correct
  617. * if they are not a warning should pop up and the window should stay open
  618. * if they are ok, then the value is inserted and we try to write in the file */
  619. GtkTreeModel *treestore;
  620. //GtkTreeIter toplevel;
  621. clist = lookup_widget(GTK_WIDGET (selection1_dialog), "clist1");
  622. treestore = gtk_tree_view_get_model(GTK_TREE_VIEW(clist));
  623. GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(clist));
  624. GtkTreeIter iter;
  625. gtk_tree_selection_get_selected(selection,&treestore,&iter);
  626. gtk_tree_model_get(treestore,&iter,0,&en_ip_t,1,&en_ipv6_t,2,&en_mac_t,-1);
  627. /* we need to access the L_dst_mac or L_src_mac entry in the main window!
  628. * that is why we putted it static global before */
  629. if (MAC_yes == TRUE) {
  630. if (check_mac_address(en_mac_t) == -1) {
  631. //printf("wrong mac entry in address list\n");
  632. error("Error: wrong mac entry in address list");
  633. return;
  634. }
  635. else
  636. gtk_entry_set_text(GTK_ENTRY(entry_field), en_mac_t);
  637. }
  638. /* in case we need to insert the IP value as well
  639. * this is in case of an arp packet or ip packet, so we check the IP_yes value */
  640. if (IP_yes == TRUE) {
  641. if (check_ip_address(en_ip_t) == -1) { // ---
  642. //printf("wrong ip entry in address list\n");
  643. error("Error: wrong ip entry in address list");
  644. return;
  645. }
  646. else
  647. gtk_entry_set_text(GTK_ENTRY(entry_field_ip), en_ip_t);
  648. }
  649. /* in case we need to insert the IP value as well
  650. * this is in case of an arp packet or ip packet, so we check the IP_yes value */
  651. else if (IPv6_yes == TRUE) {
  652. if (check_ipv6_address(en_ipv6_t, 0) == -1) { // ---
  653. //printf("wrong ip entry in address list\n");
  654. error("Error: wrong ipv6 entry in address list");
  655. return;
  656. }
  657. else
  658. gtk_entry_set_text(GTK_ENTRY(entry_field_ipv6), en_ipv6_t);
  659. }
  660. /* we need to reopen the file with datebase and overwrite it with
  661. * the values in the clist field */
  662. if((fp = fopen(address_filename, "w")) == NULL) { /* could be also some other failure??? */
  663. //printf("file %s with database can't be opened!\n", address_filename);
  664. snprintf(temp, 100, "file %s with database can't be opened", address_filename);
  665. error(temp);
  666. /* YYY we could call a function where we could select the database file */
  667. return;
  668. }
  669. //GtkTreeIter iter2;
  670. gtk_tree_model_get_iter_first(treestore,&iter);
  671. for(i=0; ; i++) {
  672. gtk_tree_model_get(treestore,&iter,0,&text_ip,1,&text_ipv6,2,&text_mac,3,&text_name,-1);
  673. fputs(text_ip, fp);
  674. fputc(44, fp);
  675. fputs(text_ipv6, fp);
  676. fputc(44, fp);
  677. fputs(text_mac, fp);
  678. fputc(44, fp);
  679. fputs(text_name, fp);
  680. fputc(10, fp);
  681. if (gtk_tree_model_iter_next(treestore,&iter) == FALSE)
  682. break;
  683. }
  684. fclose(fp);
  685. gtk_grab_remove(GTK_WIDGET(selection1_dialog));
  686. gtk_widget_destroy(GTK_WIDGET(selection1_dialog));
  687. }
  688. void
  689. on_sel1_cancel_bt_clicked (GtkButton *button,
  690. gpointer user_data)
  691. {
  692. gtk_grab_remove(gtk_widget_get_toplevel(GTK_WIDGET(button)));
  693. gtk_widget_destroy(gtk_widget_get_toplevel(GTK_WIDGET(button)));
  694. }
  695. void
  696. on_sel1_dialog_destroy (GtkObject *object,
  697. gpointer user_data)
  698. {
  699. selection1_dialog = NULL;
  700. }
  701. void
  702. on_L_dst_select_bt_clicked (GtkButton *button,
  703. gpointer user_data)
  704. {
  705. entry_field = lookup_widget(GTK_WIDGET(button), "L_dst_mac");
  706. IP_yes = FALSE;
  707. MAC_yes = TRUE;
  708. selection_dialog_show(button, user_data);
  709. }
  710. void
  711. on_L_src_select_bt_clicked (GtkButton *button,
  712. gpointer user_data)
  713. {
  714. entry_field = lookup_widget(GTK_WIDGET(button), "L_src_mac");
  715. IP_yes = FALSE;
  716. MAC_yes = TRUE;
  717. selection_dialog_show(button, user_data);
  718. }
  719. /* this one shows the addresslist dialog. it tries to open a file with addresses. It should return an error in case of file error or if the contents of the file does not hold the specified structure */
  720. void
  721. selection_dialog_show (GtkButton *button,
  722. gpointer user_data)
  723. {
  724. FILE *fp;
  725. gchar *row[4], tmp[130] /*, temp[100]*/;
  726. int i=0, ch, first = 0, second = 0, third=0;
  727. GtkTreeStore *treestore;
  728. GtkTreeIter toplevel;
  729. treestore = gtk_tree_store_new(4,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING);
  730. /* if there is a dialog already open, reopen it */
  731. if (selection1_dialog != NULL){
  732. gdk_window_show(selection1_dialog->window);
  733. gdk_window_raise(selection1_dialog->window);
  734. return;
  735. }
  736. /* if we can't open file then we raise an error dialog. user has to change the
  737. * address_filename variable using the File-> Select database option */
  738. if((fp = fopen(address_filename, "r")) == NULL) {
  739. //printf("file %s with database can't be opened!\n", address_filename);
  740. //snprintf(temp,100,"File %s with database can't be opened!\nClick on File->Select database",
  741. // address_filename);
  742. //error(temp);
  743. error("Error: Can't open selected address database!\n\n"
  744. "Click on File -> Select database\n"
  745. "to choose another one or create a new one\n\n"
  746. "File format: <IP address>,<MAC address>,<Name>");
  747. return;
  748. }
  749. /* create this dialog */
  750. selection1_dialog = create_sel1_dialog();
  751. /* resrve place for ip address, mac address and name, and ipv6 address */
  752. row[0]= (gchar *)malloc(16*sizeof(gchar));
  753. row[1]= (gchar *)malloc(40*sizeof(gchar));
  754. row[2]= (gchar *)malloc(18*sizeof(gchar));
  755. row[3]= (gchar *)malloc(50*sizeof(gchar));
  756. /* now we have to append the saved values: */
  757. /* we make following presumption: all entries must be in following format:
  758. * xxx.xxx.xxx.xxx,xx:xx:xx:xx:xx:xx,name
  759. * that means first there is IP in dot format and then mac address with : and name in the end
  760. * there can be an entry only with either ip or mac address and without name.
  761. * new lines and comments starting with # are allowed */
  762. for(;;) {
  763. /* we read the whole line and remember where the comma is
  764. * first is the place of the comma between ip and mac address
  765. * second ipv6, third is the variable holding the position between mac address and name
  766. * the line can have max 122 characters: 15 for ip , 40 for ipv6, 18 for mac and 50 for name
  767. * commas are obligatory */
  768. for (i=1, first = 0, second = 0, third=0; (ch=getc(fp)) != '\n' && i<122 && ch != EOF ;i++ ) {
  769. if (ch == ',') {
  770. if (first == 0)
  771. first = i;
  772. else if (second == 0)
  773. second = i;
  774. else if (third == 0)
  775. third = i;
  776. }
  777. tmp[i-1] = ch;
  778. }
  779. tmp[i-1] = '\0';
  780. /* if first and second and third are == 0 and ch== '\n' - new line, ok, skip this */
  781. if ( (first==0) && (second==0) && (third==0) && (ch == '\n') && (i==1) )
  782. continue;
  783. /* we also allow comments lines starting with # */
  784. if ( (i>1) && (tmp[0] == '#') )
  785. continue;
  786. /* first > 16 - ip address can not be longer then 15 char including points
  787. * second - first (mac address) exactly 18 char including : or 1 if without it
  788. * second - i > 50 - name can only have max 50 chars
  789. * if first and second are == 0 and i>0 there was no commas -> error
  790. * */
  791. if ( ( (first>16) || ((second-first)>40) || ((third-second)>18) || ((i-third)>50) ) ||
  792. ( (first==0) && (second==0) && (i>1)) ) {
  793. error("Error: Selected address database has wrong format!\n\n"
  794. "Click on File -> Select database\n"
  795. "to choose another one or create a new one\n\n"
  796. "File format: <IP address>,<MAC address>,<Name>");
  797. free(row[0]);
  798. free(row[1]);
  799. free(row[2]);
  800. free(row[3]);
  801. fclose(fp);
  802. selection1_dialog = NULL;
  803. return;
  804. }
  805. if (ch == EOF)
  806. break;
  807. tmp[first-1] = '\0';
  808. tmp[second-1] = '\0';
  809. tmp[third-1] = '\0';
  810. strncpy(row[0], tmp, first );
  811. strncpy(row[1], &tmp[first], (second-first));
  812. strncpy(row[2], &tmp[second], (third-second));
  813. strncpy(row[3], &tmp[third], (i-third));
  814. if ( (check_ip_address(row[0]) == -1) && (strlen(row[0]) !=0) ) {
  815. //printf("wrong ip entry in address list\n");
  816. error("Error: Wrong IP entry in address list!\n\n"
  817. "Click on File -> Select database\n"
  818. "to choose another one or create a new one\n\n"
  819. "File format: <IP address>,<MAC address>,<Name>");
  820. free(row[0]);
  821. free(row[1]);
  822. free(row[2]);
  823. free(row[3]);
  824. fclose(fp);
  825. selection1_dialog = NULL;
  826. return;
  827. }
  828. if ( (check_ipv6_address(row[1], 0) == -1) && (strlen(row[1]) !=0) ) {
  829. //printf("wrong ip entry in address list\n");
  830. error("Error: Wrong IPv6 entry in address list!\n\n"
  831. "Click on File -> Select database\n"
  832. "to choose another one or create a new one\n\n"
  833. "File format: <IP address>,<MAC address>,<Name>");
  834. free(row[0]);
  835. free(row[1]);
  836. free(row[2]);
  837. free(row[3]);
  838. fclose(fp);
  839. selection1_dialog = NULL;
  840. return;
  841. }
  842. if ( (check_mac_address(row[2]) == -1) && (strlen(row[2]) !=0) ) {
  843. //printf("wrong mac entry in address list\n");
  844. error("Error: Wrong MAC entry in address list\n\n"
  845. "Click on File -> Select database\n"
  846. "to choose another one or create a new one\n\n"
  847. "File format: <IP address>,<MAC address>,<Name>");
  848. free(row[0]);
  849. free(row[1]);
  850. free(row[2]);
  851. free(row[3]);
  852. fclose(fp);
  853. selection1_dialog = NULL;
  854. return;
  855. }
  856. gtk_tree_store_append(treestore,&toplevel,NULL);
  857. gtk_tree_store_set(treestore,&toplevel,0,row[0],1,row[1],2,row[2],3,row[3],-1);
  858. }
  859. free(row[0]);
  860. free(row[1]);
  861. free(row[2]);
  862. free(row[3]);
  863. gtk_widget_show(selection1_dialog);
  864. // GtkTreeView ...
  865. GtkTreeViewColumn *stolpec;
  866. GtkCellRenderer *renderer;
  867. stolpec = gtk_tree_view_column_new();
  868. gtk_tree_view_column_set_title(stolpec,"IPv4 address");
  869. gtk_tree_view_append_column(GTK_TREE_VIEW(lookup_widget(GTK_WIDGET (selection1_dialog), "clist1")),stolpec);
  870. renderer = gtk_cell_renderer_text_new();
  871. gtk_tree_view_column_pack_start(stolpec,renderer,TRUE);
  872. gtk_tree_view_column_add_attribute(stolpec,renderer,"text",0);
  873. stolpec = gtk_tree_view_column_new();
  874. gtk_tree_view_column_set_title(stolpec,"IPv6 address");
  875. gtk_tree_view_append_column(GTK_TREE_VIEW(lookup_widget(GTK_WIDGET (selection1_dialog), "clist1")),stolpec);
  876. renderer = gtk_cell_renderer_text_new();
  877. gtk_tree_view_column_pack_start(stolpec,renderer,TRUE);
  878. gtk_tree_view_column_add_attribute(stolpec,renderer,"text",1);
  879. stolpec = gtk_tree_view_column_new();
  880. gtk_tree_view_column_set_title(stolpec,"MAC value");
  881. gtk_tree_view_append_column(GTK_TREE_VIEW(lookup_widget(GTK_WIDGET (selection1_dialog), "clist1")),stolpec);
  882. renderer = gtk_cell_renderer_text_new();
  883. gtk_tree_view_column_pack_start(stolpec,renderer,TRUE);
  884. gtk_tree_view_column_add_attribute(stolpec,renderer,"text",2);
  885. stolpec = gtk_tree_view_column_new();
  886. gtk_tree_view_column_set_title(stolpec,"Name");
  887. gtk_tree_view_append_column(GTK_TREE_VIEW(lookup_widget(GTK_WIDGET (selection1_dialog), "clist1")),stolpec);
  888. renderer = gtk_cell_renderer_text_new();
  889. gtk_tree_view_column_pack_start(stolpec,renderer,TRUE);
  890. gtk_tree_view_column_add_attribute(stolpec,renderer,"text",3);
  891. GtkTreeModel *model = GTK_TREE_MODEL(treestore);
  892. gtk_tree_view_set_model(GTK_TREE_VIEW(lookup_widget(GTK_WIDGET (selection1_dialog), "clist1")),model);
  893. GtkTreeIter iter;
  894. gtk_tree_model_get_iter_first(model,&iter);
  895. g_object_unref(model);
  896. gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(lookup_widget(GTK_WIDGET (selection1_dialog), "clist1"))),GTK_SELECTION_SINGLE);
  897. gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(lookup_widget(GTK_WIDGET (selection1_dialog), "clist1"))),&iter);
  898. // ...
  899. fclose(fp);
  900. }
  901. void
  902. on_auto_get_mac_cbt_toggled (GtkToggleButton *togglebutton,
  903. gpointer user_data)
  904. {
  905. GtkWidget *hb5, *option_menu, *opt_value, *menu, *active_item;
  906. gint active_index;
  907. hb5 = lookup_widget(GTK_WIDGET(togglebutton), "hbox4");
  908. option_menu = lookup_widget(GTK_WIDGET(togglebutton), "L_optmenu1_bt");
  909. opt_value = lookup_widget(GTK_WIDGET(togglebutton), "L_ethtype");
  910. if (GTK_TOGGLE_BUTTON(togglebutton)->active) {
  911. gtk_widget_set_sensitive(hb5, FALSE);
  912. }
  913. else {
  914. gtk_widget_set_sensitive(hb5, TRUE);
  915. menu = GTK_OPTION_MENU (option_menu)->menu;
  916. active_item = gtk_menu_get_active (GTK_MENU (menu));
  917. active_index = g_list_index (GTK_MENU_SHELL (menu)->children, active_item);
  918. if (active_index == 0) {
  919. gtk_entry_set_text(GTK_ENTRY(opt_value), "0800");
  920. gtk_editable_set_editable(GTK_EDITABLE(opt_value), FALSE);
  921. }
  922. else if (active_index == 1) {
  923. gtk_entry_set_text(GTK_ENTRY(opt_value), "86DD");
  924. gtk_editable_set_editable(GTK_EDITABLE(opt_value), FALSE);
  925. }
  926. else if (active_index == 2) {
  927. gtk_entry_set_text(GTK_ENTRY(opt_value), "0806");
  928. gtk_editable_set_editable(GTK_EDITABLE(opt_value), FALSE);
  929. }
  930. else if (active_index == 3) {
  931. gtk_entry_set_text(GTK_ENTRY(opt_value), "");
  932. gtk_editable_set_editable(GTK_EDITABLE(opt_value), TRUE);
  933. }
  934. }
  935. }
  936. void
  937. on_tcp_bt_toggled (GtkToggleButton *togglebutton,
  938. gpointer user_data)
  939. {
  940. GtkWidget *nt4, *en1, *opt1;
  941. nt4 = lookup_widget(GTK_WIDGET(togglebutton), "notebook4");
  942. en1 = lookup_widget(GTK_WIDGET(togglebutton), "entry34");
  943. opt1 = lookup_widget(GTK_WIDGET(togglebutton), "optionmenu3");
  944. gtk_option_menu_set_history (GTK_OPTION_MENU (opt1), 3);
  945. gtk_notebook_set_page(GTK_NOTEBOOK(nt4), 1);
  946. gtk_entry_set_text(GTK_ENTRY(en1), "6");
  947. gtk_editable_set_editable(GTK_EDITABLE(en1), FALSE);
  948. }
  949. void
  950. on_udp_bt_toggled (GtkToggleButton *togglebutton,
  951. gpointer user_data)
  952. {
  953. GtkWidget *nt4, *en1, *opt1;
  954. nt4 = lookup_widget(GTK_WIDGET(togglebutton), "notebook4");
  955. en1 = lookup_widget(GTK_WIDGET(togglebutton), "entry34");
  956. opt1 = lookup_widget(GTK_WIDGET(togglebutton), "optionmenu3");
  957. gtk_notebook_set_page(GTK_NOTEBOOK(nt4), 0);
  958. gtk_option_menu_set_history (GTK_OPTION_MENU (opt1), 4);
  959. gtk_entry_set_text(GTK_ENTRY(en1), "17");
  960. gtk_editable_set_editable(GTK_EDITABLE(en1), FALSE);
  961. }
  962. void
  963. on_icmp_bt_toggled (GtkToggleButton *togglebutton,
  964. gpointer user_data)
  965. {
  966. GtkWidget *nt4, *en1, *opt1;
  967. nt4 = lookup_widget(GTK_WIDGET(togglebutton), "notebook4");
  968. en1 = lookup_widget(GTK_WIDGET(togglebutton), "entry34");
  969. opt1 = lookup_widget(GTK_WIDGET(togglebutton), "optionmenu3");
  970. gtk_option_menu_set_history (GTK_OPTION_MENU (opt1), 1);
  971. gtk_notebook_set_page(GTK_NOTEBOOK(nt4), 2);
  972. gtk_entry_set_text(GTK_ENTRY(en1), "1");
  973. gtk_editable_set_editable(GTK_EDITABLE(en1), FALSE);
  974. }
  975. void
  976. on_igmp_bt_toggled (GtkToggleButton *togglebutton,
  977. gpointer user_data)
  978. {
  979. GtkWidget *nt4, *en1, *opt1;
  980. nt4 = lookup_widget(GTK_WIDGET(togglebutton), "notebook4");
  981. en1 = lookup_widget(GTK_WIDGET(togglebutton), "entry34");
  982. opt1 = lookup_widget(GTK_WIDGET(togglebutton), "optionmenu3");
  983. gtk_option_menu_set_history (GTK_OPTION_MENU (opt1), 2);
  984. gtk_notebook_set_page(GTK_NOTEBOOK(nt4), 4);
  985. gtk_entry_set_text(GTK_ENTRY(en1), "2");
  986. gtk_editable_set_editable(GTK_EDITABLE(en1), FALSE);
  987. }
  988. void
  989. on_ip_user_data_bt_toggled (GtkToggleButton *togglebutton,
  990. gpointer user_data)
  991. {
  992. GtkWidget *nt4, *en1, *opt1;
  993. nt4 = lookup_widget(GTK_WIDGET(togglebutton), "notebook4");
  994. en1 = lookup_widget(GTK_WIDGET(togglebutton), "entry34");
  995. opt1 = lookup_widget(GTK_WIDGET(togglebutton), "optionmenu3");
  996. gtk_option_menu_set_history (GTK_OPTION_MENU (opt1), 5);
  997. gtk_notebook_set_page(GTK_NOTEBOOK(nt4), 3);
  998. gtk_entry_set_text(GTK_ENTRY(en1), "");
  999. gtk_editable_set_editable(GTK_EDITABLE(en1), TRUE);
  1000. }
  1001. void
  1002. on_L_optmenu1_bt_clicked (GtkButton *button,
  1003. gpointer user_data)
  1004. {
  1005. GtkWidget *option_menu, *menu, *active_item, *opt_value;
  1006. gint active_index;
  1007. option_menu = lookup_widget (GTK_WIDGET (button), "L_optmenu1_bt");
  1008. opt_value = lookup_widget (GTK_WIDGET (button), "L_ethtype");
  1009. menu = GTK_OPTION_MENU (option_menu)->menu;
  1010. active_item = gtk_menu_get_active (GTK_MENU (menu));
  1011. active_index = g_list_index (GTK_MENU_SHELL (menu)->children, active_item);
  1012. if (active_index == 0) {
  1013. gtk_entry_set_text(GTK_ENTRY(opt_value), "0800");
  1014. gtk_editable_set_editable(GTK_EDITABLE(opt_value), FALSE);
  1015. }
  1016. else if (active_index == 1) {
  1017. gtk_entry_set_text(GTK_ENTRY(opt_value), "86DD");
  1018. gtk_editable_set_editable(GTK_EDITABLE(opt_value), FALSE);
  1019. }
  1020. else if (active_index == 2) {
  1021. gtk_entry_set_text(GTK_ENTRY(opt_value), "0806");
  1022. gtk_editable_set_editable(GTK_EDITABLE(opt_value), FALSE);
  1023. }
  1024. else if (active_index == 3) {
  1025. gtk_entry_set_text(GTK_ENTRY(opt_value), "");
  1026. gtk_editable_set_editable(GTK_EDITABLE(opt_value), TRUE);
  1027. }
  1028. }
  1029. void
  1030. on_optionmenu6_clicked (GtkButton *button,
  1031. gpointer user_data)
  1032. {
  1033. GtkWidget *option_menu, *menu, *active_item, *opt_value;
  1034. gint active_index;
  1035. option_menu = lookup_widget (GTK_WIDGET (button), "optionmenu6");
  1036. opt_value = lookup_widget (GTK_WIDGET (button), "L_pid");
  1037. menu = GTK_OPTION_MENU (option_menu)->menu;
  1038. active_item = gtk_menu_get_active (GTK_MENU (menu));
  1039. active_index = g_list_index (GTK_MENU_SHELL (menu)->children, active_item);
  1040. if (active_index == 0) {
  1041. gtk_entry_set_text(GTK_ENTRY(opt_value), "0800");
  1042. gtk_editable_set_editable(GTK_EDITABLE(opt_value), FALSE);
  1043. }
  1044. else if (active_index == 1) {
  1045. gtk_entry_set_text(GTK_ENTRY(opt_value), "86DD");
  1046. gtk_editable_set_editable(GTK_EDITABLE(opt_value), FALSE);
  1047. }
  1048. else if (active_index == 2) {
  1049. gtk_entry_set_text(GTK_ENTRY(opt_value), "0806");
  1050. gtk_editable_set_editable(GTK_EDITABLE(opt_value), FALSE);
  1051. }
  1052. else if (active_index == 3) {
  1053. gtk_entry_set_text(GTK_ENTRY(opt_value), "");
  1054. gtk_editable_set_editable(GTK_EDITABLE(opt_value), TRUE);
  1055. }
  1056. }
  1057. void
  1058. on_optionmenu7_clicked (GtkButton *button,
  1059. gpointer user_data)
  1060. {
  1061. GtkWidget *option_menu, *menu, *active_item, *opt_value;
  1062. gint active_index;
  1063. option_menu = lookup_widget (GTK_WIDGET (button), "optionmenu7");
  1064. opt_value = lookup_widget (GTK_WIDGET (button), "entry102");
  1065. menu = GTK_OPTION_MENU (option_menu)->menu;
  1066. active_item = gtk_menu_get_active (GTK_MENU (menu));
  1067. active_index = g_list_index (GTK_MENU_SHELL (menu)->children, active_item);
  1068. if (active_index == 0) {
  1069. gtk_entry_set_text(GTK_ENTRY(opt_value), "8");
  1070. gtk_editable_set_editable(GTK_EDITABLE(opt_value), FALSE);
  1071. }
  1072. else if (active_index == 1) {
  1073. gtk_entry_set_text(GTK_ENTRY(opt_value), "0");
  1074. gtk_editable_set_editable(GTK_EDITABLE(opt_value), FALSE);
  1075. }
  1076. else if (active_index == 2) {
  1077. gtk_entry_set_text(GTK_ENTRY(opt_value), "4");
  1078. gtk_editable_set_editable(GTK_EDITABLE(opt_value), FALSE);
  1079. }
  1080. else if (active_index == 3) {
  1081. gtk_entry_set_text(GTK_ENTRY(opt_value), "18");
  1082. gtk_editable_set_editable(GTK_EDITABLE(opt_value), FALSE);
  1083. }
  1084. else if (active_index == 4) {
  1085. gtk_entry_set_text(GTK_ENTRY(opt_value), "");
  1086. gtk_editable_set_editable(GTK_EDITABLE(opt_value), TRUE);
  1087. }
  1088. }
  1089. void
  1090. on_IPv6_rdbt_toggled (GtkToggleButton *togglebutton,
  1091. gpointer user_data)
  1092. {
  1093. GtkWidget *nt2;
  1094. GtkWidget *nt4;
  1095. GtkWidget *option_menu, *opt_value;
  1096. GtkWidget *rb1, *rb2, *rb3, *rb4;
  1097. //cbt = lookup_widget(GTK_WIDGET(togglebutton), "auto_get_mac_cbt");
  1098. //gtk_widget_set_sensitive (cbt, TRUE);
  1099. option_menu = lookup_widget(GTK_WIDGET(togglebutton), "L_optmenu1_bt");
  1100. opt_value = lookup_widget(GTK_WIDGET(togglebutton), "L_ethtype");
  1101. nt2 = lookup_widget(GTK_WIDGET(togglebutton), "notebook2");
  1102. gtk_notebook_set_page(GTK_NOTEBOOK(nt2), 1);
  1103. gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu), 1);
  1104. gtk_entry_set_text(GTK_ENTRY(opt_value), "86DD");
  1105. gtk_editable_set_editable(GTK_EDITABLE(opt_value), FALSE);
  1106. /* what is next page */
  1107. rb1 = lookup_widget(GTK_WIDGET(togglebutton), "radiobutton67");
  1108. rb2 = lookup_widget(GTK_WIDGET(togglebutton), "radiobutton68");
  1109. rb3 = lookup_widget(GTK_WIDGET(togglebutton), "radiobutton69");
  1110. rb4 = lookup_widget(GTK_WIDGET(togglebutton), "radiobutton71");
  1111. nt4 = lookup_widget(GTK_WIDGET(togglebutton), "notebook4");
  1112. //gtk_editable_set_editable(GTK_EDITABLE(opt_value), FALSE);
  1113. //gtk_editable_set_editable(GTK_EDITABLE(opt_value2), FALSE);
  1114. if (GTK_TOGGLE_BUTTON(rb1)->active)
  1115. gtk_notebook_set_page(GTK_NOTEBOOK(nt4), 0);
  1116. else if (GTK_TOGGLE_BUTTON(rb2)->active)
  1117. gtk_notebook_set_page(GTK_NOTEBOOK(nt4), 1);
  1118. else if (GTK_TOGGLE_BUTTON(rb3)->active)
  1119. gtk_notebook_set_page(GTK_NOTEBOOK(nt4), 5);
  1120. else
  1121. gtk_notebook_set_page(GTK_NOTEBOOK(nt4), 3);
  1122. }
  1123. void
  1124. on_Build_button_clicked (GtkButton *button,
  1125. gpointer user_data)
  1126. {
  1127. GtkWidget *nt1;
  1128. nt1 = lookup_widget(GTK_WIDGET(button), "notebook1");
  1129. gtk_notebook_set_page(GTK_NOTEBOOK(nt1), 0);
  1130. nt1 = lookup_widget(GTK_WIDGET(button), "Load_button");
  1131. gtk_widget_set_sensitive(nt1, TRUE);
  1132. nt1 = lookup_widget(GTK_WIDGET(button), "Save_button");
  1133. gtk_widget_set_sensitive(nt1, TRUE);
  1134. nt1 = lookup_widget(GTK_WIDGET(button), "Reset_button");
  1135. gtk_widget_set_sensitive(nt1, TRUE);
  1136. nt1 = lookup_widget(GTK_WIDGET(button), "button62");
  1137. gtk_widget_set_sensitive(nt1, TRUE);
  1138. nt1 = lookup_widget(GTK_WIDGET(button), "Interface_button");
  1139. gtk_widget_set_sensitive(nt1, TRUE);
  1140. nt1 = lookup_widget(GTK_WIDGET(button), "Send_button");
  1141. gtk_widget_set_sensitive(nt1, TRUE);
  1142. nt1 = lookup_widget(GTK_WIDGET(button), "Stop_button");
  1143. gtk_widget_set_sensitive(nt1, TRUE);
  1144. statusbar_text(button, " Builder window opened");
  1145. }
  1146. void
  1147. on_Gen_button_clicked (GtkButton *button,
  1148. gpointer user_data)
  1149. {
  1150. GtkWidget *ntbk2, *ntbk4, *ntbk7;
  1151. GtkWidget *nt1;
  1152. GtkWidget *text_e;
  1153. GtkWidget *crc_value;
  1154. unsigned long crc32;
  1155. char str_crc32[9];
  1156. char tmp[4600];
  1157. guint i, j, m, page1, page2;
  1158. ntbk2 = lookup_widget (GTK_WIDGET (button), "notebook2");
  1159. ntbk4 = lookup_widget (GTK_WIDGET (button), "notebook4");
  1160. ntbk7 = lookup_widget (GTK_WIDGET (button), "notebook7");
  1161. nt1 = lookup_widget(GTK_WIDGET(button), "notebook1");
  1162. crc_value = lookup_widget(GTK_WIDGET (button), "entry164");
  1163. gtk_notebook_set_page(GTK_NOTEBOOK(nt1), 1);
  1164. nt1 = lookup_widget(GTK_WIDGET(button), "Load_button");
  1165. gtk_widget_set_sensitive(nt1, FALSE);
  1166. nt1 = lookup_widget(GTK_WIDGET(button), "Save_button");
  1167. gtk_widget_set_sensitive(nt1, FALSE);
  1168. nt1 = lookup_widget(GTK_WIDGET(button), "Reset_button");
  1169. gtk_widget_set_sensitive(nt1, FALSE);
  1170. nt1 = lookup_widget(GTK_WIDGET(button), "button62");
  1171. gtk_widget_set_sensitive(nt1, FALSE);
  1172. nt1 = lookup_widget(GTK_WIDGET(button), "Interface_button");
  1173. gtk_widget_set_sensitive(nt1, TRUE);
  1174. nt1 = lookup_widget(GTK_WIDGET(button), "Send_button");
  1175. gtk_widget_set_sensitive(nt1, TRUE);
  1176. nt1 = lookup_widget(GTK_WIDGET(button), "Stop_button");
  1177. gtk_widget_set_sensitive(nt1, TRUE);
  1178. statusbar_text(button, " Gen-b window opened.");
  1179. /* get access to the buffer of text field */
  1180. text_e = lookup_widget(GTK_WIDGET (button), "text5");
  1181. GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_e));
  1182. show_error_dialog = 0;
  1183. if (make_packet(button, user_data) == -1) {
  1184. //error("Packet contents is not ok!\n");
  1185. snprintf(&tmp[0], 200, "\n\n\n\n Packet constructed in Builder is not ok!");
  1186. gtk_entry_set_text(GTK_ENTRY(crc_value), "");
  1187. }
  1188. else {
  1189. /* copy data to tmp field */
  1190. for (i=0, j=0, m=1; j < number; m++, j++) {
  1191. snprintf(&tmp[i], 4600, "%02x", packet[j]);
  1192. i++; i++;
  1193. /* we allow only 16 bytes in each row - looks nicer */
  1194. if ((m % 16) == 0 && (m > 1)) {
  1195. tmp[i]='\n';
  1196. m = 0;
  1197. }
  1198. else
  1199. tmp[i] = ' ';
  1200. i++;
  1201. }
  1202. tmp[i] = '\0';
  1203. crc32 = get_crc32(packet, number);
  1204. snprintf(str_crc32, 9, "%08lX", crc32);
  1205. gtk_entry_set_text(GTK_ENTRY(crc_value), str_crc32);
  1206. }
  1207. /* insert the text in the text field */
  1208. gtk_text_buffer_set_text(buffer,tmp,-1);
  1209. /* we want to set correct options in send built change while sending option menu */
  1210. if (page1 == 3)
  1211. gtk_notebook_set_page(GTK_NOTEBOOK(ntbk7), 2);
  1212. else if (page1 == 1)
  1213. gtk_notebook_set_page(GTK_NOTEBOOK(ntbk7), 0);
  1214. else if (page1 == 2)
  1215. gtk_notebook_set_page(GTK_NOTEBOOK(ntbk7), 0);
  1216. else {
  1217. page2 = gtk_notebook_get_current_page(GTK_NOTEBOOK(ntbk4));
  1218. if (page2 == 0)
  1219. gtk_notebook_set_page(GTK_NOTEBOOK(ntbk7), 4);
  1220. else if (page2 == 1)
  1221. gtk_notebook_set_page(GTK_NOTEBOOK(ntbk7), 3);
  1222. else
  1223. gtk_notebook_set_page(GTK_NOTEBOOK(ntbk7), 1);
  1224. }
  1225. show_error_dialog = 1;
  1226. }
  1227. void
  1228. on_Gen_s_bt_clicked (GtkButton *button,
  1229. gpointer user_data)
  1230. {
  1231. GtkWidget *nt1;
  1232. nt1 = lookup_widget(GTK_WIDGET(button), "notebook1");
  1233. gtk_notebook_set_page(GTK_NOTEBOOK(nt1), 2);
  1234. nt1 = lookup_widget(GTK_WIDGET(button), "Load_button");
  1235. gtk_widget_set_sensitive(nt1, FALSE);
  1236. nt1 = lookup_widget(GTK_WIDGET(button), "Save_button");
  1237. gtk_widget_set_sensitive(nt1, FALSE);
  1238. nt1 = lookup_widget(GTK_WIDGET(button), "Reset_button");
  1239. gtk_widget_set_sensitive(nt1, FALSE);
  1240. nt1 = lookup_widget(GTK_WIDGET(button), "button62");
  1241. gtk_widget_set_sensitive(nt1, FALSE);
  1242. nt1 = lookup_widget(GTK_WIDGET(button), "Interface_button");
  1243. gtk_widget_set_sensitive(nt1, TRUE);
  1244. nt1 = lookup_widget(GTK_WIDGET(button), "Send_button");
  1245. gtk_widget_set_sensitive(nt1, TRUE);
  1246. nt1 = lookup_widget(GTK_WIDGET(button), "Stop_button");
  1247. gtk_widget_set_sensitive(nt1, TRUE);
  1248. statusbar_text(button, " Gen-s window opened");
  1249. //on_button87_clicked(button, user_data);
  1250. }
  1251. void
  1252. on_Gen_k_bt_clicked (GtkButton *b

Large files files are truncated, but you can click here to view the full file