/* * sic.c: testing... * * Copyright(c) 1997-2001 - All Rights Reserved * * See the COPYRIGHT file. */ #ifndef lint static char rcsid[] = "@(#)$Id: sic.c,v 1.26 2001/03/04 01:44:24 kalt Exp $"; #endif #include "os.h" #include "struct.h" #include "window.h" #include "server.h" #include "input.h" #include "term.h" #include "option.h" #include "config.h" #include "counter.h" #include "adns.h" extern void yow_init(); extern const char version[]; static int do_resize = 0, do_reinit = 0, do_intr = 0, cnt_intr = 0; /* sic_sigwinch: shared SIGWINCH/SIGCONT handler */ static void sic_sigwinch(sig) int sig; { do_resize += 1; if (sig == SIGCONT) do_reinit += 1; } /* sic_sigint: SIGINT handler */ static void sic_sigint(sig) int sig; { static time_t last = 0; if (time(NULL) - last > 5) cnt_intr = 0; cnt_intr += 1; do_intr = 1; last = time(NULL); } /* sic_sigign: SIG_IGN to allow SA_INTERRUPT to work */ static void sic_sigign(sig) int sig; {} /* sic_signals: setup our own signal handlers */ static void sic_signals() { struct sigaction sa; sigemptyset(&sa.sa_mask); #if defined(SA_INTERRUPT) sa.sa_flags = SA_INTERRUPT; #else sa.sa_flags = 0; #endif sa.sa_handler = sic_sigwinch; sigaction(SIGWINCH, &sa, NULL); sigaction(SIGCONT, &sa, NULL); sa.sa_handler = sic_sigint; sigaction(SIGINT, &sa, NULL); sa.sa_handler = sic_sigign; sigaction(SIGUSR1, &sa, NULL); sa.sa_flags = 0; sigaction(SIGPIPE, &sa, NULL); } /* main: you know, main! */ int main (argc, argv) int argc; char *argv[]; { int o; char doconn = 1, err = 0, newenv[256], *startup = NULL; time_t now, next_counter = time(NULL) + 60; extern char *optarg; extern int opterr; opterr = 0; while ((o = getopt(argc, argv, "c:i:l:nr:v")) != EOF) switch (o) { case 'c': sprintf(newenv, "SICDIR=%s", optarg); putenv(newenv); break; case 'i': sprintf(newenv, "SICIP=%s", optarg); putenv(newenv); break; case 'l': sprintf(newenv, "SICLOG=%s", optarg); putenv(newenv); break; case 'n': doconn = 0; break; case 'r': startup = strdup(optarg); /* is strdup needed? */ break; case 'v': printf("sic %s, Copyright (C) 1997-2001 Christophe Kalt \n", version); #if defined(USE_GNU_RX) printf("\tLinked with %s\n", rx_version_string); #endif exit(0); default: err++; break; } if (err) { printf("sic [-c ] [-i ] [-l ] [-n] [-r ] [-v]\n"); printf("\t-c\tDefine the directory where configuration files live\n"); printf("\t-i\tUse a specific IP address for connections\n"); printf("\t-l\tDefine the directory where log files go\n"); printf("\t-n\tDon't auto-connect upon start.\n"); printf("\t-r\tRun this file upon start.\n"); printf("\t-v\tPrint version and exits\n\n"); exit(0); } /* no window/lastlog ability */ dns_init(); /* initialize the resolver thread */ opt_init(); /* initialize global options */ counter_init(); /* init counters */ sic_signals(); /* setup signals */ term_init(); /* initialize window/lastlog */ sic_newwin(); /* create a window */ /* window/lastlog initialized */ cfg_init(); /* error messages will be in the lastlog */ opt_cfg(); /* read options files */ yow_init(); if (doconn) cmd_server("0"); /* connect! */ if (startup) cmd_run(startup); else if (doconn) cmd_run("startup"); while (1) { select_active(NULL, 2); if (do_reinit) { term_reinit(); vsic_slog(LOG_DEBUG, "--- term_reinit() called"); do_reinit = 0; } if (do_resize) { switch (term_size()) { case -2: sic_slog(LOG_CLIENT, "--- Window size unknown."); break; case -1: vsic_slog(LOG_CLIENT, "--- ioctl(\"/dev/tty\", TIOCGWINSZ) failed: %s", strerror(errno)); break; case 0: sic_slog(LOG_DEBUG, "--- Got SIGWINCH, but same size."); break; case 1: vsic_slog(LOG_DEBUG, "--- New window size: %dx%d", CO, LI); sic_redowin(1); /* clear window and redraw lastlog */ display_status(); /* redraw status line */ display_input(); /* redraw input line */ break; default: abort(); } do_resize = 0; } if (do_intr) { switch (cnt_intr) { case 1: sic_slog(LOG_CLIENT, "--- Ouch! Are you sure?"); break; case 2: sic_slog(LOG_CLIENT, "--- Aiiie.. Really?"); break; case 3: sic_slog(LOG_CLIENT, "--- Okay, okay.."); term_end(); exit(0); default: abort(); } do_intr = 0; } if (sic_select() > 0) sic_getch(); dns_process(); now = time(NULL); #if defined(HAVE_REGEXP) if (now > next_counter) { next_counter = now + 60; counter_expire(-1); } #endif } /* we can never get here anymore.. */ term_end(); exit(0); }