|
|
1.1 ! root 1: #include <sys/types.h> ! 2: #include <sys/uio.h> ! 3: #include <fcntl.h> ! 4: #include <string.h> ! 5: #include <utime.h> ! 6: #include <unistd.h> ! 7: ! 8: #include "gtkmonitor.h" ! 9: #include "util_funcs.h" ! 10: #include "datewrap.h" ! 11: ! 12: int got_date=0; ! 13: ! 14: void destroy_calendar_window(GtkWidget *t, gpointer data) ! 15: { ! 16: if(!got_date) ! 17: gtk_main_quit(); ! 18: } ! 19: ! 20: void changed_day(GtkWidget *t, gpointer data) ! 21: { ! 22: got_date=1; ! 23: gtk_main_quit(); ! 24: } ! 25: ! 26: int get_date(GtkWidget *t, isoDate_t *date) ! 27: { ! 28: GladeXML *cxml; ! 29: GtkWidget *w; ! 30: GtkWidget *win; ! 31: GtkWidget *thiswin; ! 32: gint x,x_off; ! 33: gint y,y_off; ! 34: guint year; ! 35: guint month; ! 36: guint day; ! 37: isoDate_t odate=*date; ! 38: ! 39: got_date=0; ! 40: cxml = glade_xml_new(glade_path, "CalendarWindow", NULL); ! 41: if(cxml==NULL) { ! 42: fprintf(stderr,"Could not locate Calendar Window XML\n"); ! 43: return(-1); ! 44: } ! 45: /* connect the signals in the interface */ ! 46: glade_xml_signal_autoconnect(cxml); ! 47: win=glade_xml_get_widget(cxml, "CalendarWindow"); ! 48: if(win==NULL) { ! 49: fprintf(stderr,"Could not locate Calendar window\n"); ! 50: return(-1); ! 51: } ! 52: ! 53: thiswin = gtk_widget_get_toplevel(t); ! 54: if(thiswin==NULL) { ! 55: fprintf(stderr,"Could not locate main window\n"); ! 56: return(-1); ! 57: } ! 58: if(!(gtk_widget_translate_coordinates(GTK_WIDGET(t) ! 59: ,GTK_WIDGET(thiswin), 0, 0, &x_off, &y_off))) { ! 60: fprintf(stderr,"Could not get position of button in window"); ! 61: } ! 62: gtk_window_get_position(GTK_WINDOW(thiswin), &x, &y); ! 63: ! 64: gtk_window_move(GTK_WINDOW(win), x+x_off, y+y_off); ! 65: ! 66: w=glade_xml_get_widget(cxml, "Calendar"); ! 67: if(w==NULL) { ! 68: fprintf(stderr,"Could not locate Calendar widget\n"); ! 69: return(-1); ! 70: } ! 71: gtk_calendar_select_month(GTK_CALENDAR(w), isoDate_month(*date)-1, isoDate_year(*date)); ! 72: gtk_calendar_select_day(GTK_CALENDAR(w), isoDate_day(*date)); ! 73: gtk_window_present(GTK_WINDOW(win)); ! 74: /* Wait for window to close... */ ! 75: gtk_main(); ! 76: w=glade_xml_get_widget(cxml, "Calendar"); ! 77: if(w==NULL) ! 78: return(-1); ! 79: gtk_calendar_get_date(GTK_CALENDAR(w), &year, &month, &day); ! 80: gtk_widget_destroy(GTK_WIDGET(gtk_widget_get_toplevel(GTK_WIDGET(w)))); ! 81: *date=isoDate_create(year, month+1, day); ! 82: return(odate!=*date); ! 83: } ! 84: ! 85: void update_stats_callback(GtkWidget *wiggy, gpointer data) ! 86: { ! 87: refresh_data(NULL); ! 88: } ! 89: ! 90: void on_guru_brain1_activate(GtkWidget *wiggy, gpointer data) { ! 91: exec_cmdstr(gtkm_conf.edit_text_file,cfg.ctrl_dir,"guru.dat"); ! 92: } ! 93: ! 94: void on_text_strings1_activate(GtkWidget *wiggy, gpointer data) { ! 95: exec_cmdstr(gtkm_conf.edit_text_file,cfg.ctrl_dir,"text.dat"); ! 96: } ! 97: ! 98: void on_default_colours1_activate(GtkWidget *wiggy, gpointer data) { ! 99: exec_cmdstr(gtkm_conf.edit_text_file,cfg.ctrl_dir,"attr.cfg"); ! 100: } ! 101: ! 102: void on_nodes_full_message1_activate(GtkWidget *wiggy, gpointer data) { ! 103: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"nonodes.txt"); ! 104: } ! 105: ! 106: void on_answer_screen1_activate(GtkWidget *wiggy, gpointer data) { ! 107: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"answer.asc"); ! 108: } ! 109: ! 110: void on_logon_message1_activate(GtkWidget *wiggy, gpointer data) { ! 111: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"menu/logon.asc"); ! 112: } ! 113: ! 114: void on_auto_message1_activate(GtkWidget *wiggy, gpointer data) { ! 115: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"menu/auto.msg"); ! 116: } ! 117: ! 118: void on_zip_file_comment1_activate(GtkWidget *wiggy, gpointer data) { ! 119: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"zipmsg.txt"); ! 120: } ! 121: ! 122: void on_system_information1_activate(GtkWidget *wiggy, gpointer data) { ! 123: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"system.msg"); ! 124: } ! 125: ! 126: void on_new_user_message1_activate(GtkWidget *wiggy, gpointer data) { ! 127: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"newuser.msg"); ! 128: } ! 129: ! 130: void on_new_user_welcome_email1_activate(GtkWidget *wiggy, gpointer data) { ! 131: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"welcome.msg"); ! 132: } ! 133: ! 134: void on_new_user_password_failure1_activate(GtkWidget *wiggy, gpointer data) { ! 135: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"nupguess.msg"); ! 136: } ! 137: ! 138: void on_new_user_feedbakc_instructions1_activate(GtkWidget *wiggy, gpointer data) ! 139: { ! 140: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"feedback.msg"); ! 141: } ! 142: ! 143: void on_allowed_rlogin_list1_activate(GtkWidget *wiggy, gpointer data) ! 144: { ! 145: exec_cmdstr(gtkm_conf.edit_text_file,cfg.ctrl_dir,"rlogin.cfg"); ! 146: } ! 147: ! 148: void on_alias_list1_activate(GtkWidget *wiggy, gpointer data) ! 149: { ! 150: exec_cmdstr(gtkm_conf.edit_text_file,cfg.ctrl_dir,"alias.cfg"); ! 151: } ! 152: ! 153: void on_domain_list1_activate(GtkWidget *wiggy, gpointer data) ! 154: { ! 155: exec_cmdstr(gtkm_conf.edit_text_file,cfg.ctrl_dir,"domains.cfg"); ! 156: } ! 157: ! 158: void on_spam_bait_list1_activate(GtkWidget *wiggy, gpointer data) ! 159: { ! 160: exec_cmdstr(gtkm_conf.edit_text_file,cfg.ctrl_dir,"spambait.cfg"); ! 161: } ! 162: ! 163: void on_spam_block_list1_activate(GtkWidget *wiggy, gpointer data) ! 164: { ! 165: exec_cmdstr(gtkm_conf.edit_text_file,cfg.ctrl_dir,"spamblock.cfg"); ! 166: } ! 167: ! 168: void on_allowed_relay_list1_activate(GtkWidget *wiggy, gpointer data) ! 169: { ! 170: exec_cmdstr(gtkm_conf.edit_text_file,cfg.ctrl_dir,"relay.cfg"); ! 171: } ! 172: ! 173: void on_dnsbased_blacklists1_activate(GtkWidget *wiggy, gpointer data) ! 174: { ! 175: exec_cmdstr(gtkm_conf.edit_text_file,cfg.ctrl_dir,"dns_blacklist.cfg"); ! 176: } ! 177: ! 178: void on_dnsblacklist_exempt_ips1_activate(GtkWidget *wiggy, gpointer data) ! 179: { ! 180: exec_cmdstr(gtkm_conf.edit_text_file,cfg.ctrl_dir,"dnsbl_exempt.cfg.cfg"); ! 181: } ! 182: ! 183: void on_external_mail_processing1_activate(GtkWidget *wiggy, gpointer data) ! 184: { ! 185: exec_cmdstr(gtkm_conf.edit_text_file,cfg.ctrl_dir,"mailproc.ini"); ! 186: } ! 187: ! 188: void on_login_message1_activate(GtkWidget *wiggy, gpointer data) ! 189: { ! 190: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"ftplogin.txt"); ! 191: } ! 192: ! 193: void on_failed_login_mesage1_activate(GtkWidget *wiggy, gpointer data) ! 194: { ! 195: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"ftpbadlogin.txt"); ! 196: } ! 197: ! 198: void on_hello_message1_activate(GtkWidget *wiggy, gpointer data) ! 199: { ! 200: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"ftphello.txt"); ! 201: } ! 202: ! 203: void on_goodbye_message1_activate(GtkWidget *wiggy, gpointer data) ! 204: { ! 205: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"ftpbye.txt"); ! 206: } ! 207: ! 208: void on_filename_aliases1_activate(GtkWidget *wiggy, gpointer data) ! 209: { ! 210: exec_cmdstr(gtkm_conf.edit_text_file,cfg.ctrl_dir,"ftpalias.cfg"); ! 211: } ! 212: ! 213: void on_mime_types1_activate(GtkWidget *wiggy, gpointer data) ! 214: { ! 215: exec_cmdstr(gtkm_conf.edit_text_file,cfg.ctrl_dir,"mime_types.ini"); ! 216: } ! 217: ! 218: void on_cgi_environment_variables1_activate(GtkWidget *wiggy, gpointer data) ! 219: { ! 220: exec_cmdstr(gtkm_conf.edit_text_file,cfg.ctrl_dir,"cgi_env.ini"); ! 221: } ! 222: ! 223: void on_external_content_handlers1_activate(GtkWidget *wiggy, gpointer data) ! 224: { ! 225: exec_cmdstr(gtkm_conf.edit_text_file,cfg.ctrl_dir,"web_handler.ini"); ! 226: } ! 227: ! 228: void on_servicesini1_activate(GtkWidget *wiggy, gpointer data) ! 229: { ! 230: exec_cmdstr(gtkm_conf.edit_text_file,cfg.ctrl_dir,"services.ini"); ! 231: } ! 232: ! 233: void on_error_log1_activate(GtkWidget *wiggy, gpointer data) ! 234: { ! 235: exec_cmdstr(gtkm_conf.view_text_file ,cfg.logs_dir,"error.log"); ! 236: } ! 237: ! 238: void on_statistics_log1_activate(GtkWidget *wiggy, gpointer data) ! 239: { ! 240: exec_cmdstr(gtkm_conf.view_stdout ,cfg.exec_dir,"slog"); ! 241: } ! 242: ! 243: void on_todays_log1_activate(GtkWidget *wiggy, gpointer data) ! 244: { ! 245: time_t t; ! 246: struct tm *tm; ! 247: char fn[20]; ! 248: ! 249: t=time(NULL); ! 250: tm=localtime(&t); ! 251: sprintf(fn,"logs/%02d%02d%02d.log",tm->tm_mon+1,tm->tm_mday,tm->tm_year%100); ! 252: exec_cmdstr(gtkm_conf.view_text_file, cfg.logs_dir,fn); ! 253: } ! 254: ! 255: void on_yesterdays_log1_activate(GtkWidget *wiggy, gpointer data) ! 256: { ! 257: time_t t; ! 258: struct tm *tm; ! 259: char fn[20]; ! 260: ! 261: t=time(NULL); ! 262: t-=24*60*60; ! 263: tm=localtime(&t); ! 264: sprintf(fn,"logs/%02d%02d%02d.log",tm->tm_mon+1,tm->tm_mday,tm->tm_year%100); ! 265: exec_cmdstr(gtkm_conf.view_text_file, cfg.logs_dir,fn); ! 266: } ! 267: ! 268: void on_another_days_log1_activate(GtkWidget *wiggy, gpointer data) { ! 269: isoDate_t date; ! 270: char fn[20]; ! 271: GtkWidget *w; ! 272: ! 273: date=time_to_isoDate(time(NULL)); ! 274: get_date(wiggy, &date); ! 275: sprintf(fn,"logs/%02d%02d%02d.log",isoDate_month(date),isoDate_day(date),isoDate_year(date)%100); ! 276: exec_cmdstr(gtkm_conf.view_text_file, cfg.logs_dir, fn); ! 277: } ! 278: ! 279: void on_spam_log1_activate(GtkWidget *wiggy, gpointer data) ! 280: { ! 281: exec_cmdstr(gtkm_conf.view_text_file, cfg.logs_dir,"spam.log"); ! 282: } ! 283: ! 284: void on_ip_address_filter1_activate(GtkWidget *wiggy, gpointer data) ! 285: { ! 286: exec_cmdstr(gtkm_conf.edit_text_file, cfg.text_dir,"ip.can"); ! 287: } ! 288: ! 289: void on_ip_address_filter_silent1_activate(GtkWidget *wiggy, gpointer data) ! 290: { ! 291: exec_cmdstr(gtkm_conf.edit_text_file, cfg.text_dir,"ip-silent.can"); ! 292: } ! 293: ! 294: void on_ip_address_filter_message1_activate(GtkWidget *wiggy, gpointer data) ! 295: { ! 296: exec_cmdstr(gtkm_conf.edit_text_file, cfg.text_dir,"badip.msg"); ! 297: } ! 298: ! 299: void on_host_name_filter1_activate(GtkWidget *wiggy, gpointer data) ! 300: { ! 301: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"host.can"); ! 302: } ! 303: ! 304: void on_host_name_filter_message1_activate(GtkWidget *wiggy, gpointer data) ! 305: { ! 306: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"badhost.msg"); ! 307: } ! 308: ! 309: void on_user_name_filter1_activate(GtkWidget *wiggy, gpointer data) ! 310: { ! 311: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"name.can"); ! 312: } ! 313: ! 314: void on_user_name_filter_message1_activate(GtkWidget *wiggy, gpointer data) ! 315: { ! 316: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"badname.msg"); ! 317: } ! 318: ! 319: void on_email_address_filter1_activate(GtkWidget *wiggy, gpointer data) ! 320: { ! 321: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"email.can"); ! 322: } ! 323: ! 324: void on_email_address_filter_message1_activate(GtkWidget *wiggy, gpointer data) ! 325: { ! 326: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"bademail.msg"); ! 327: } ! 328: ! 329: void on_email_subject_filter1_activate(GtkWidget *wiggy, gpointer data) ! 330: { ! 331: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"subject.can"); ! 332: } ! 333: ! 334: void on_file_name_filter1_activate(GtkWidget *wiggy, gpointer data) ! 335: { ! 336: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"file.can"); ! 337: } ! 338: ! 339: void on_file_name_filter_message1_activate(GtkWidget *wiggy, gpointer data) ! 340: { ! 341: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"badfile.msg"); ! 342: } ! 343: ! 344: void on_phone_number_filter1_activate(GtkWidget *wiggy, gpointer data) ! 345: { ! 346: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"phone.can"); ! 347: } ! 348: ! 349: void on_phone_number_filter_message1_activate(GtkWidget *wiggy, gpointer data) ! 350: { ! 351: exec_cmdstr(gtkm_conf.edit_text_file,cfg.text_dir,"badphone.msg"); ! 352: } ! 353: ! 354: void on_twit_list1_activate(GtkWidget *wiggy, gpointer data) ! 355: { ! 356: exec_cmdstr(gtkm_conf.edit_text_file,cfg.ctrl_dir,"twitlist.cfg"); ! 357: } ! 358: ! 359: void on_hack_attempt_log1_activate(GtkWidget *wiggy, gpointer data) ! 360: { ! 361: exec_cmdstr(gtkm_conf.view_text_file,cfg.logs_dir,"hack.log"); ! 362: } ! 363: ! 364: void on_configure1_activate(GtkWidget *wiggy, gpointer data) ! 365: { ! 366: run_external(cfg.exec_dir,"scfg"); ! 367: } ! 368: ! 369: void on_edit3_activate(GtkWidget *wiggy, gpointer data) ! 370: { ! 371: run_external(cfg.exec_dir,"gtkuseredit"); ! 372: } ! 373: ! 374: void on_truncate_deleted_users1_activate(GtkWidget *wiggy, gpointer data) ! 375: { ! 376: int usernumber; ! 377: int deleted=0; ! 378: user_t user; ! 379: char str[128]; ! 380: ! 381: while((user.number=lastuser(&cfg))!=0) { ! 382: if(getuserdat(&cfg,&user)!=0) ! 383: break; ! 384: if(!(user.misc&DELETED)) ! 385: break; ! 386: if(!del_lastuser(&cfg)) ! 387: break; ! 388: deleted++; ! 389: } ! 390: sprintf(str,"%u Deleted User Records Removed",deleted); ! 391: display_message("Users Truncated", str, NULL); ! 392: } ! 393: ! 394: void on_stop6_activate(GtkWidget *wiggy, gpointer data) ! 395: { ! 396: touch_sem(cfg.ctrl_dir, "shutdown"); ! 397: } ! 398: ! 399: void on_recycle6_activate(GtkWidget *wiggy, gpointer data) ! 400: { ! 401: touch_sem(cfg.ctrl_dir, "recycle"); ! 402: } ! 403: ! 404: void on_stop1_activate(GtkWidget *wiggy, gpointer data) ! 405: { ! 406: touch_sem(cfg.ctrl_dir, "shutdown.telnet"); ! 407: } ! 408: ! 409: void on_recycle5_activate(GtkWidget *wiggy, gpointer data) ! 410: { ! 411: touch_sem(cfg.ctrl_dir, "recycle.telnet"); ! 412: } ! 413: ! 414: void on_stop2_activate(GtkWidget *wiggy, gpointer data) ! 415: { ! 416: touch_sem(cfg.ctrl_dir, "shutdown.mail"); ! 417: } ! 418: ! 419: void on_recycle1_activate(GtkWidget *wiggy, gpointer data) ! 420: { ! 421: touch_sem(cfg.ctrl_dir, "recycle.mail"); ! 422: } ! 423: ! 424: void on_stop3_activate(GtkWidget *wiggy, gpointer data) ! 425: { ! 426: touch_sem(cfg.ctrl_dir, "shutdown.ftp"); ! 427: } ! 428: ! 429: void on_recycle2_activate(GtkWidget *wiggy, gpointer data) ! 430: { ! 431: touch_sem(cfg.ctrl_dir, "recycle.ftp"); ! 432: } ! 433: ! 434: void on_stop4_activate(GtkWidget *wiggy, gpointer data) ! 435: { ! 436: touch_sem(cfg.ctrl_dir, "shutdown.web"); ! 437: } ! 438: ! 439: void on_recycle3_activate(GtkWidget *wiggy, gpointer data) ! 440: { ! 441: touch_sem(cfg.ctrl_dir, "recycle.web"); ! 442: } ! 443: ! 444: void on_stop5_activate(GtkWidget *wiggy, gpointer data) ! 445: { ! 446: touch_sem(cfg.ctrl_dir, "shutdown.services"); ! 447: } ! 448: ! 449: void on_recycle4_activate(GtkWidget *wiggy, gpointer data) ! 450: { ! 451: touch_sem(cfg.ctrl_dir, "recycle.services"); ! 452: } ! 453: ! 454: void on_statistics_pane1_activate(GtkWidget *wiggy, gpointer data) ! 455: { ! 456: GtkWidget *w; ! 457: ! 458: w=glade_xml_get_widget(xml, "StatisticsPane"); ! 459: if(w==NULL) ! 460: fprintf(stderr,"Cannot get the statistics pane.\n"); ! 461: else { ! 462: switch(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(wiggy))) { ! 463: case 0: ! 464: gtk_widget_hide(w); ! 465: break; ! 466: default: ! 467: gtk_widget_show(w); ! 468: } ! 469: } ! 470: } ! 471: ! 472: void create_force_sem(GtkWidget *wiggy, gpointer data) ! 473: { ! 474: gchar *label; ! 475: char fn[MAX_PATH+1]; ! 476: ! 477: label=(gchar *)gtk_label_get_text(GTK_LABEL(wiggy)); ! 478: if(label != NULL) { ! 479: sprintf(fn,"%s%s.now",(gchar *)data, label); ! 480: touch_sem(cfg.data_dir, fn); ! 481: } ! 482: } ! 483: ! 484: void on_force_event(GtkWidget *wiggy, gpointer data) ! 485: { ! 486: /* There's only one child... so this is a bit of a cheat */ ! 487: gtk_container_foreach(GTK_CONTAINER(wiggy), create_force_sem, ""); ! 488: } ! 489: ! 490: void on_force_qnet(GtkWidget *wiggy, gpointer data) ! 491: { ! 492: /* There's only one child... so this is a bit of a cheat */ ! 493: gtk_container_foreach(GTK_CONTAINER(wiggy), create_force_sem, "qnet/"); ! 494: } ! 495: ! 496: void on_reload_configuration1_activate(GtkWidget *wiggy, gpointer data) ! 497: { ! 498: refresh_events(); ! 499: } ! 500: ! 501: void toggle_node_bits(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) ! 502: { ! 503: int *bit=data; ! 504: int fd; ! 505: char *node_str; ! 506: int n,i; ! 507: node_t node; ! 508: char str[128]; ! 509: ! 510: gtk_tree_model_get(model, iter, 0, &node_str, -1); ! 511: n=atoi(node_str); ! 512: ! 513: if((i=getnodedat(&cfg,n,&node,&fd))) { ! 514: sprintf(str,"Error reading node %d data (%d)!",n,i); ! 515: display_message("Read Error", str, "gtk-dialog-error"); ! 516: } ! 517: else { ! 518: node.misc ^= *bit; ! 519: putnodedat(&cfg, n, &node, fd); ! 520: } ! 521: } ! 522: ! 523: void lock_nodes(GtkWidget *wiggy, gpointer data) ! 524: { ! 525: int bit=NODE_LOCK; ! 526: ! 527: gtk_tree_selection_selected_foreach(sel ! 528: ,toggle_node_bits ! 529: ,&bit); ! 530: refresh_data(NULL); ! 531: } ! 532: ! 533: void down_nodes(GtkWidget *wiggy, gpointer data) ! 534: { ! 535: int bit=NODE_DOWN; ! 536: ! 537: gtk_tree_selection_selected_foreach(sel ! 538: ,toggle_node_bits ! 539: ,&bit); ! 540: refresh_data(NULL); ! 541: } ! 542: ! 543: void interrupt_nodes(GtkWidget *wiggy, gpointer data) ! 544: { ! 545: int bit=NODE_INTR; ! 546: ! 547: gtk_tree_selection_selected_foreach(sel ! 548: ,toggle_node_bits ! 549: ,&bit); ! 550: refresh_data(NULL); ! 551: } ! 552: ! 553: void rerun_nodes(GtkWidget *wiggy, gpointer data) ! 554: { ! 555: int bit=NODE_RRUN; ! 556: ! 557: gtk_tree_selection_selected_foreach(sel ! 558: ,toggle_node_bits ! 559: ,&bit); ! 560: refresh_data(NULL); ! 561: } ! 562: ! 563: void do_clear_errors(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) ! 564: { ! 565: int *bit=data; ! 566: int fd; ! 567: char *node_str; ! 568: int n,i; ! 569: node_t node; ! 570: char str[128]; ! 571: ! 572: gtk_tree_model_get(model, iter, 0, &node_str, -1); ! 573: n=atoi(node_str); ! 574: ! 575: if((i=getnodedat(&cfg,n,&node,&fd))) { ! 576: sprintf(str,"Error reading node %d data (%d)!",n,i); ! 577: display_message("Read Error",str,"gtk-dialog-error"); ! 578: } ! 579: else { ! 580: node.errors = 0; ! 581: putnodedat(&cfg, n, &node, fd); ! 582: } ! 583: } ! 584: ! 585: void clear_errors(GtkWidget *wiggy, gpointer data) ! 586: { ! 587: gtk_tree_selection_selected_foreach(sel ! 588: ,do_clear_errors ! 589: ,NULL); ! 590: refresh_data(NULL); ! 591: } ! 592: ! 593: void on_about1_activate(GtkWidget *wiggy, gpointer data) ! 594: { ! 595: GladeXML *axml; ! 596: ! 597: axml = glade_xml_new(glade_path, "AboutWindow", NULL); ! 598: if(axml==NULL) { ! 599: fprintf(stderr,"Could not locate AboutWindow widget\n"); ! 600: return; ! 601: } ! 602: /* connect the signals in the interface */ ! 603: glade_xml_signal_autoconnect(axml); ! 604: gtk_window_present(GTK_WINDOW(glade_xml_get_widget(axml, "AboutWindow"))); ! 605: } ! 606: ! 607: void get_lastselected_node(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) ! 608: { ! 609: int *i=data; ! 610: gchar *node; ! 611: ! 612: gtk_tree_model_get(model, iter, 0, &node, -1); ! 613: *i=atoi(node); ! 614: } ! 615: ! 616: void chatwith_node(GtkWidget *wiggy, gpointer data) ! 617: { ! 618: char str[MAX_PATH+1]; ! 619: int i; ! 620: ! 621: gtk_tree_selection_selected_foreach(sel ! 622: ,get_lastselected_node ! 623: ,&i); ! 624: sprintf(str,"gtkchat %d",i); ! 625: run_external(cfg.exec_dir,str); ! 626: } ! 627: ! 628: void edituseron_node(GtkWidget *wiggy, gpointer data) ! 629: { ! 630: char str[MAX_PATH+1]; ! 631: int i; ! 632: node_t node; ! 633: ! 634: gtk_tree_selection_selected_foreach(sel ! 635: ,get_lastselected_node ! 636: ,&i); ! 637: ! 638: if((i=getnodedat(&cfg,i,&node,NULL))) { ! 639: sprintf(str,"Error reading node data (%d)!",i); ! 640: display_message("Read Error",str,"gtk-dialog-error"); ! 641: } ! 642: else { ! 643: sprintf(str,"gtkuseredit %d",node.useron); ! 644: run_external(cfg.exec_dir,str); ! 645: } ! 646: } ! 647: ! 648: void close_this_window(GtkWidget *wiggy, gpointer data) ! 649: { ! 650: gtk_widget_destroy(GTK_WIDGET(gtk_widget_get_toplevel(wiggy))); ! 651: } ! 652: ! 653: void quick_validate(int usernum, int set) ! 654: { ! 655: user_t user; ! 656: int res; ! 657: char str[1024]; ! 658: ! 659: user.number=usernum; ! 660: if((res=getuserdat(&cfg,&user))) { ! 661: sprintf(str,"Error loading user %d.\n",usernum); ! 662: display_message("Load Error",str,"gtk-dialog-error"); ! 663: return; ! 664: } ! 665: user.flags1=cfg.val_flags1[set]; ! 666: user.flags2=cfg.val_flags2[set]; ! 667: user.flags3=cfg.val_flags3[set]; ! 668: user.flags4=cfg.val_flags4[set]; ! 669: user.exempt=cfg.val_exempt[set]; ! 670: user.rest=cfg.val_rest[set]; ! 671: if(cfg.val_expire[set]) { ! 672: user.expire=time(NULL) ! 673: +(cfg.val_expire[set]*24*60*60); ! 674: } ! 675: else ! 676: user.expire=0; ! 677: user.level=cfg.val_level[set]; ! 678: if((res=putuserdat(&cfg,&user))) { ! 679: sprintf(str,"Error saving user %d.\n",usernum); ! 680: display_message("Save Error",str,"gtk=dialog-error"); ! 681: } ! 682: } ! 683: ! 684: /* Show user list */ ! 685: on_list1_activate(GtkWidget *wiggy, gpointer data) ! 686: { ! 687: run_external(cfg.exec_dir,"gtkuserlist"); ! 688: } ! 689: ! 690: void quickvalidate_useron_node(GtkWidget *wiggy, gpointer data) ! 691: { ! 692: char str[MAX_PATH+1]; ! 693: int i; ! 694: int set; ! 695: node_t node; ! 696: GtkWidget *w; ! 697: ! 698: set=gtk_combo_box_get_active(GTK_COMBO_BOX(wiggy))-1; ! 699: if(set>=0) { ! 700: gtk_tree_selection_selected_foreach(sel ! 701: ,get_lastselected_node ! 702: ,&i); ! 703: ! 704: if((i=getnodedat(&cfg,i,&node,NULL))) { ! 705: sprintf(str,"Error reading node data (%d)!",i); ! 706: display_message("Read Error",str,"gtk-dialog-error"); ! 707: } ! 708: else { ! 709: quick_validate(node.useron, set); ! 710: } ! 711: gtk_combo_box_set_active(GTK_COMBO_BOX(wiggy), 0); ! 712: } ! 713: } ! 714: ! 715: char *select_filename(GtkWidget *wiggy, char *title, char *name, char *in_pattern, char *dir, char *fn) ! 716: { ! 717: GtkWidget *chooser; ! 718: GtkFileFilter *filter; ! 719: char *search; ! 720: char *next; ! 721: char *p1,*p2; ! 722: char *pattern; ! 723: char pat[MAX_PATH+1]; ! 724: ! 725: chooser=gtk_file_chooser_dialog_new(title ! 726: ,GTK_WINDOW(gtk_widget_get_toplevel(wiggy)) ! 727: ,GTK_FILE_CHOOSER_ACTION_OPEN ! 728: ,GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL ! 729: ,GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT ! 730: ,NULL); ! 731: gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(chooser), TRUE); ! 732: gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(chooser) ,dir); ! 733: filter=gtk_file_filter_new(); ! 734: gtk_file_filter_set_name(filter, name); ! 735: pattern=strdup(in_pattern); ! 736: search=pattern; ! 737: while((next=strtok(search, ";"))!=NULL) { ! 738: search=NULL; ! 739: pat[0]=0; ! 740: p2=pat; ! 741: for(p1=next;*p1;p1++) { ! 742: if(toupper(*p1)!=tolower(*p1)) { ! 743: *(p2++)='['; ! 744: *(p2++)=toupper(*p1); ! 745: *(p2++)=tolower(*p1); ! 746: *(p2++)=']'; ! 747: } ! 748: else ! 749: *(p2++)=*p1; ! 750: *p2=0; ! 751: } ! 752: gtk_file_filter_add_pattern(filter, pat); ! 753: } ! 754: free(pattern); ! 755: gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter); ! 756: filter=gtk_file_filter_new(); ! 757: gtk_file_filter_set_name(filter, "All Files"); ! 758: gtk_file_filter_add_pattern(filter, "*"); ! 759: gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter); ! 760: ! 761: switch(gtk_dialog_run(GTK_DIALOG(chooser))) { ! 762: case GTK_RESPONSE_ACCEPT: ! 763: strcpy(fn, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser))); ! 764: break; ! 765: default: ! 766: fn[0]=0; ! 767: } ! 768: gtk_widget_destroy(chooser); ! 769: return(fn); ! 770: } ! 771: ! 772: void on_text_file1_activate(GtkWidget *wiggy, gpointer data) ! 773: { ! 774: char fn[MAX_PATH+1]; ! 775: select_filename(wiggy, "Edit Text File", "Text Files", "*.txt", cfg.text_dir, fn); ! 776: if(fn[0]) ! 777: exec_cmdstr(gtkm_conf.edit_text_file, NULL, fn); ! 778: } ! 779: ! 780: void on_javascript_file1_activate(GtkWidget *wiggy, gpointer data) ! 781: { ! 782: char fn[MAX_PATH+1]; ! 783: select_filename(wiggy, "Edit Javascript File", "Javascript Files", "*.js", cfg.exec_dir, fn); ! 784: if(fn[0]) ! 785: exec_cmdstr(gtkm_conf.edit_text_file, NULL, fn); ! 786: } ! 787: ! 788: void on_configuration_file1_activate(GtkWidget *wiggy, gpointer data) ! 789: { ! 790: char fn[MAX_PATH+1]; ! 791: ! 792: select_filename(wiggy, "Edit Configuration File", "Configuration Files", "*.cfg;*.ini;*.conf", cfg.ctrl_dir, fn); ! 793: if(fn[0]) ! 794: exec_cmdstr(gtkm_conf.edit_text_file, NULL, fn); ! 795: } ! 796: ! 797: void on_edit_and_compile_baja_script1_activate(GtkWidget *wiggy, gpointer data) ! 798: { ! 799: char fn[MAX_PATH+1]; ! 800: char compile[MAX_PATH*2+1]; ! 801: ! 802: select_filename(wiggy, "Edit/Compile Baja Script", "BAJA Files", "*.src", cfg.exec_dir, fn); ! 803: if(!run_cmd_mutex_initalized) { ! 804: pthread_mutex_init(&run_cmd_mutex, NULL); ! 805: run_cmd_mutex_initalized=1; ! 806: } ! 807: if(fn[0]) { ! 808: exec_cmdstr(gtkm_conf.edit_text_file, NULL, fn); ! 809: /* Spin on the lock waiting for the edit command to start */ ! 810: while(!pthread_mutex_trylock(&run_cmd_mutex)) ! 811: pthread_mutex_unlock(&run_cmd_mutex); ! 812: sprintf(compile, "baja %s", fn); ! 813: exec_cmdstr(gtkm_conf.view_stdout,cfg.exec_dir,compile); ! 814: } ! 815: } ! 816: ! 817: void on_index1_activate(GtkWidget *wiggy, gpointer data) ! 818: { ! 819: exec_cmdstr(gtkm_conf.view_html_file,cfg.ctrl_dir,"../docs/index.htm"); ! 820: } ! 821: ! 822: void on_sysop_manual1_activate(GtkWidget *wiggy, gpointer data) ! 823: { ! 824: exec_cmdstr(gtkm_conf.view_html_file,cfg.ctrl_dir,"../docs/sysop.html"); ! 825: } ! 826: ! 827: void on_frequently_asked_questions_faq1_activate(GtkWidget *wiggy, gpointer data) ! 828: { ! 829: exec_cmdstr(gtkm_conf.view_text_file,cfg.ctrl_dir,"../docs/v3cfgfaq.txt"); ! 830: } ! 831: ! 832: void on_preview_file1_activate(GtkWidget *wiggy, gpointer data) ! 833: { ! 834: char fn[MAX_PATH+1]; ! 835: ! 836: select_filename(wiggy, "Preview File", "ANSI/Ctrl-A Files", "*.ans;*.asc;*.msg", cfg.text_dir, fn); ! 837: if(fn[0]) ! 838: exec_cmdstr(gtkm_conf.view_ctrla_file,NULL, fn); ! 839: } ! 840: ! 841: void on_edit_and_preview_file1_activate(GtkWidget *wiggy, gpointer data) ! 842: { ! 843: char fn[MAX_PATH+1]; ! 844: ! 845: select_filename(wiggy, "Edit and Preview File", "ANSI/Ctrl-A Files", "*.ans;*.asc;*.msg", cfg.text_dir, fn); ! 846: if(!run_cmd_mutex_initalized) { ! 847: pthread_mutex_init(&run_cmd_mutex, NULL); ! 848: run_cmd_mutex_initalized=1; ! 849: } ! 850: if(fn[0]) { ! 851: exec_cmdstr(gtkm_conf.edit_text_file, NULL, fn); ! 852: /* Spin on the lock waiting for the edit command to start */ ! 853: while(!pthread_mutex_trylock(&run_cmd_mutex)) ! 854: pthread_mutex_unlock(&run_cmd_mutex); ! 855: exec_cmdstr(gtkm_conf.view_ctrla_file, NULL, fn); ! 856: } ! 857: } ! 858: ! 859: void sendmessageto_node(GtkWidget *wiggy, gpointer data) ! 860: { ! 861: char fn[MAX_PATH+1]; ! 862: char str[MAX_PATH+1]; ! 863: int i; ! 864: int tmp; ! 865: node_t node; ! 866: time_t edited; ! 867: struct utimbuf tb; ! 868: char *msg; ! 869: ! 870: gtk_tree_selection_selected_foreach(sel ! 871: ,get_lastselected_node ! 872: ,&i); ! 873: ! 874: if((i=getnodedat(&cfg,i,&node,NULL))) { ! 875: sprintf(str,"Error reading node data (%d)!",i); ! 876: display_message("Read Error",str,"gtk-dialog-error"); ! 877: } ! 878: else { ! 879: strcpy(fn,"/tmp/gtkmonitor-msg-XXXXXXXX"); ! 880: tmp=mkstemp(fn); ! 881: if(tmp!=-1) { ! 882: write(tmp,"\1n\1y\1hMessage From Sysop:\1w \n\n",30); ! 883: close(tmp); ! 884: /* Set modified time back one second so we can tell if the sysop ! 885: saved the file or not */ ! 886: edited=fdate(fn); ! 887: edited--; ! 888: tb.actime=edited; ! 889: tb.modtime=edited; ! 890: utime(fn, &tb); ! 891: /* If utime() failed for some reason, sleep for a second */ ! 892: if(fdate(fn)!=edited) ! 893: SLEEP(1000); ! 894: if(!run_cmd_mutex_initalized) { ! 895: pthread_mutex_init(&run_cmd_mutex, NULL); ! 896: run_cmd_mutex_initalized=1; ! 897: } ! 898: exec_cmdstr(gtkm_conf.edit_text_file, NULL, fn); ! 899: /* Spin on the lock waiting for the edit command to start */ ! 900: while(!pthread_mutex_trylock(&run_cmd_mutex)) ! 901: pthread_mutex_unlock(&run_cmd_mutex); ! 902: /* Now, spin on the lock waiting for it to *exit* */ ! 903: while(pthread_mutex_trylock(&run_cmd_mutex)) { ! 904: /* Allow events to happen as normal */ ! 905: while(gtk_events_pending()) { ! 906: if(gtk_main_iteration()) ! 907: gtk_main_quit(); ! 908: } ! 909: SLEEP(1); ! 910: } ! 911: pthread_mutex_unlock(&run_cmd_mutex); ! 912: /* Now, read the message back in and send to the user */ ! 913: if(fdate(fn)!=edited) { ! 914: i=flength(fn); ! 915: if((msg=(char *)malloc(i))==NULL) ! 916: display_message("malloc() Error", "Cannot allocate enough memory for the message", "gtk-dialog-error"); ! 917: else { ! 918: tmp=open(fn, O_RDONLY); ! 919: if(tmp==-1) ! 920: display_message("open() Error", "Cannot open temp message file", "gtk-dialog-error"); ! 921: else { ! 922: if(read(tmp, msg, i)!=i) ! 923: display_message("read() Error", "Problem reading message file", "gtk-dialog-error"); ! 924: else { ! 925: putsmsg(&cfg, node.useron, msg); ! 926: } ! 927: } ! 928: free(msg); ! 929: } ! 930: } ! 931: } ! 932: } ! 933: } ! 934: ! 935: void on_properties1_activate(GtkWidget *wiggy, gpointer data) ! 936: { ! 937: GladeXML *pxml; ! 938: GtkWidget *dialog; ! 939: GtkWidget *w; ! 940: ! 941: pxml = glade_xml_new(glade_path, "PreferencesDialog", NULL); ! 942: if(pxml==NULL) { ! 943: fprintf(stderr,"Could not locate PreferencesDialog widget\n"); ! 944: return; ! 945: } ! 946: /* connect the signals in the interface */ ! 947: glade_xml_signal_autoconnect(pxml); ! 948: dialog=glade_xml_get_widget(pxml, "PreferencesDialog"); ! 949: ! 950: /* Put in the current values */ ! 951: w=glade_xml_get_widget(pxml,"eEditTextFile"); ! 952: gtk_entry_set_text(GTK_ENTRY(w),gtkm_conf.edit_text_file); ! 953: w=glade_xml_get_widget(pxml,"eViewTextFile"); ! 954: gtk_entry_set_text(GTK_ENTRY(w),gtkm_conf.view_text_file); ! 955: w=glade_xml_get_widget(pxml,"eViewStdout"); ! 956: gtk_entry_set_text(GTK_ENTRY(w),gtkm_conf.view_stdout); ! 957: w=glade_xml_get_widget(pxml,"eViewCtrlAFile"); ! 958: gtk_entry_set_text(GTK_ENTRY(w),gtkm_conf.view_ctrla_file); ! 959: w=glade_xml_get_widget(pxml,"eViewHTMLFile"); ! 960: gtk_entry_set_text(GTK_ENTRY(w),gtkm_conf.view_html_file); ! 961: ! 962: switch(gtk_dialog_run(GTK_DIALOG(dialog))) { ! 963: case GTK_RESPONSE_OK: ! 964: /* Read out the new values */ ! 965: w=glade_xml_get_widget(pxml,"eEditTextFile"); ! 966: strcpy(gtkm_conf.edit_text_file,gtk_entry_get_text(GTK_ENTRY(w))); ! 967: w=glade_xml_get_widget(pxml,"eViewTextFile"); ! 968: strcpy(gtkm_conf.view_text_file,gtk_entry_get_text(GTK_ENTRY(w))); ! 969: w=glade_xml_get_widget(pxml,"eViewStdout"); ! 970: strcpy(gtkm_conf.view_stdout,gtk_entry_get_text(GTK_ENTRY(w))); ! 971: w=glade_xml_get_widget(pxml,"eViewCtrlAFile"); ! 972: strcpy(gtkm_conf.view_ctrla_file,gtk_entry_get_text(GTK_ENTRY(w))); ! 973: w=glade_xml_get_widget(pxml,"eViewHTMLFile"); ! 974: strcpy(gtkm_conf.view_html_file,gtk_entry_get_text(GTK_ENTRY(w))); ! 975: write_ini(); ! 976: } ! 977: gtk_widget_destroy(dialog); ! 978: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.