|
|
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.