home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume30 / tin / part13 / signal.c < prev   
C/C++ Source or Header  |  1992-05-20  |  8KB  |  557 lines

  1. /*
  2.  *  Project   : tin - a threaded Netnews reader
  3.  *  Module    : signal.c
  4.  *  Author    : I.Lea
  5.  *  Created   : 01-04-91
  6.  *  Updated   : 11-05-92
  7.  *  Notes     : signal handlers for different modes and window resizing
  8.  *  Copyright : (c) Copyright 1991-92 by Iain Lea
  9.  *              You may  freely  copy or  redistribute  this software,
  10.  *              so  long as there is no profit made from its use, sale
  11.  *              trade or  reproduction.  You may not change this copy-
  12.  *              right notice, and it must be included in any copy made
  13.  */
  14.  
  15. #include    "tin.h"
  16.  
  17. extern char *glob_art_group;
  18. extern char *glob_group;
  19. extern char *glob_page_group;
  20. extern int glob_respnum;
  21. extern int reread_active_file;
  22.  
  23. #ifdef SIGTSTP
  24. int do_sigtstp = 0;
  25. #endif
  26.  
  27.  
  28. #ifdef POSIX_JOB_CONTROL
  29.  
  30. /*
  31.  * for POSIX systems we know SIGTYPE  is void 
  32.  */
  33.  
  34. void (*sigdisp(sig, func))()
  35.     int sig;
  36.     void (*func)();
  37. {
  38.     struct sigaction sa, osa;
  39.  
  40.     sa.sa_handler = func;
  41.     sigemptyset (&sa.sa_mask);
  42.     sa.sa_flags = 0;
  43. #ifdef SA_RESTART
  44.     sa.sa_flags |= SA_RESTART;
  45. #endif
  46.     if (sigaction (sig, &sa, &osa) < 0) {
  47.         return ((void (*)(int))(-1));
  48.     }
  49.     return (osa.sa_handler);
  50. }
  51.  
  52. #else
  53.  
  54. sigtype_t (*sigdisp(sig, func))()
  55.     int sig;
  56.     sigtype_t (*func)();
  57. {
  58.     return (signal (sig, func));
  59. }
  60.  
  61. #endif
  62.  
  63. void set_signal_handlers ()
  64. {
  65.     signal (SIGINT, signal_handler);    /* ctrl-C */
  66.     signal (SIGQUIT, signal_handler);    /* ctrl-\ */
  67.     signal (SIGILL, signal_handler);
  68.     signal (SIGBUS, signal_handler);
  69.     signal (SIGSEGV, signal_handler);
  70.     signal (SIGPIPE, SIG_IGN);
  71.  
  72. #ifdef SIGWINCH
  73.     if (debug == 2) {
  74.         wait_message ("SIGWINCH setting signal...");
  75.         sleep (2);
  76.     }
  77.     signal (SIGWINCH, main_resize);
  78. #endif
  79.  
  80. #if defined(SIGTSTP) && ! defined(MINIX)
  81.     {
  82.         sigtype_t (*ptr)();
  83.         ptr = signal (SIGTSTP, SIG_DFL);
  84.         signal (SIGTSTP, ptr);
  85.         if (ptr != SIG_IGN) {
  86.             /*
  87.              *  SIGTSTP is ignored when starting from shells
  88.              *  without job-control
  89.              */
  90.             do_sigtstp = 1; 
  91.             signal (SIGTSTP, main_suspend);
  92.         }
  93.     }
  94. #endif
  95. }
  96.  
  97.  
  98. void set_alarm_signal ()
  99. {
  100. #ifndef NO_RESYNC_ACTIVE_FILE
  101.     /*
  102.      * Only reread active file if news is not static (ie. CD-ROM)
  103.      */
  104.     if (strcmp (spooldir_alias, "news") == 0) {
  105.         signal (SIGALRM, signal_handler);
  106.         alarm (RESYNC_ACTIVE_SECS);
  107.     }    
  108.     reread_active_file = FALSE;
  109. #endif
  110. }
  111.  
  112.  
  113. void signal_handler (sig)
  114.     int sig;
  115. {
  116.     char *sigtext;
  117.  
  118.     switch (sig) {
  119.         case SIGINT:
  120.             if (update) {
  121.                 sigtext = "SIGINT ";
  122.             } else {
  123.                 signal (SIGINT, signal_handler);
  124.                 return;
  125.             }
  126.             break;
  127.         case SIGQUIT:
  128.             sigtext = "SIGQUIT ";
  129.             break;
  130.         case SIGBUS:
  131.             sigtext = "SIGBUS ";
  132.             break;
  133.         case SIGSEGV:
  134.             sigtext = "SIGSEGV ";
  135.             break;
  136. #ifndef NO_RESYNC_ACTIVE_FILE
  137.         case SIGALRM:
  138.             set_alarm_signal ();
  139.             reread_active_file = TRUE;
  140.             return;
  141. #endif
  142.         default:
  143.             sigtext = "";
  144.             break;
  145.     }
  146.     Raw (FALSE);
  147.     EndWin ();
  148.     fprintf (stderr, "\n%s: signal handler caught signal %s(%d).\n",
  149.         progname, sigtext, sig);
  150.     if (sig != SIGINT && sig != SIGQUIT) {
  151.         fprintf (stderr, "%s: send a bug report to %s\n",
  152.             progname, BUG_REPORT_ADDRESS);
  153.     }
  154.     fflush (stderr);
  155.     exit (1);
  156. }
  157.  
  158.  
  159. void set_win_size (num_lines, num_cols)
  160.     int *num_lines;
  161.     int *num_cols;
  162. {
  163. #ifdef TIOCGSIZE
  164.     struct ttysize win;
  165. #else
  166. #  ifdef TIOCGWINSZ
  167.     struct winsize win;
  168. #  endif
  169. #endif
  170.  
  171.     init_screen_array (FALSE);        /* deallocate screen array */
  172.  
  173. #ifdef TIOCGSIZE
  174.     if (ioctl (0, TIOCGSIZE, &win) == 0) {
  175.         if (win.ts_lines != 0) {
  176.             *num_lines = win.ts_lines - 1;
  177.         }
  178.         if (win.ts_cols != 0) {
  179.             *num_cols = win.ts_cols;
  180.         }
  181.     }
  182. #else
  183. #  ifdef TIOCGWINSZ
  184.     if (ioctl (0, TIOCGWINSZ, &win) == 0) {
  185.         if (win.ws_row != 0) {
  186.             *num_lines = win.ws_row - 1;
  187.         }
  188.         if (win.ws_col != 0) {
  189.             *num_cols = win.ws_col;
  190.         }
  191.     }
  192. #  endif
  193. #endif
  194.  
  195.     init_screen_array (TRUE);        /* allocate screen array for resize */
  196.  
  197.     set_subj_from_size (*num_cols);
  198.     
  199.     RIGHT_POS = *num_cols - 20;
  200.     MORE_POS  = *num_cols - 15;
  201.     NOTESLINES = *num_lines - INDEX_TOP - 1;
  202.     if (NOTESLINES <= 0) {
  203.         NOTESLINES = 1;
  204.     }
  205. }
  206.  
  207.  
  208. void set_signals_art ()
  209. {
  210. #ifdef SIGTSTP
  211.     if (do_sigtstp) {
  212.         sigdisp (SIGTSTP, art_suspend);
  213.     }
  214. #endif
  215.  
  216. #ifdef SIGWINCH
  217.     signal (SIGWINCH, art_resize);
  218. #endif
  219. }
  220.  
  221.  
  222. void set_signals_group ()
  223. {
  224. #ifdef SIGTSTP
  225.     if (do_sigtstp) {
  226.         sigdisp (SIGTSTP, group_suspend);
  227.     }
  228. #endif
  229.  
  230. #ifdef SIGWINCH
  231.     signal (SIGWINCH, group_resize);
  232. #endif
  233. }
  234.  
  235.  
  236. void set_signals_page ()
  237. {
  238. #ifdef SIGTSTP
  239.     if (do_sigtstp) {
  240.         sigdisp (SIGTSTP, page_suspend);
  241.     }
  242. #endif
  243.  
  244. #ifdef SIGWINCH
  245.     signal (SIGWINCH, page_resize);
  246. #endif
  247. }
  248.  
  249.  
  250. void set_signals_select ()
  251. {
  252. #ifdef SIGTSTP
  253.     if (do_sigtstp) {
  254.         sigdisp (SIGTSTP, select_suspend);
  255.     }
  256. #endif
  257.  
  258. #ifdef SIGWINCH
  259.     signal (SIGWINCH, select_resize);
  260. #endif
  261. }
  262.  
  263.  
  264. void set_signals_spooldir ()
  265. {
  266. #ifdef SIGTSTP
  267.     if (do_sigtstp) {
  268.         sigdisp (SIGTSTP, spooldir_suspend);
  269.     }
  270. #endif
  271.  
  272. #ifdef SIGWINCH
  273.     signal (SIGWINCH, spooldir_resize);
  274. #endif
  275. }
  276.  
  277.  
  278. void set_signals_thread ()
  279. {
  280. #ifdef SIGTSTP
  281.     if (do_sigtstp) {
  282.         sigdisp (SIGTSTP, thread_suspend);
  283.     }
  284. #endif
  285.  
  286. #ifdef SIGWINCH
  287.     signal (SIGWINCH, thread_resize);
  288. #endif
  289. }
  290.  
  291.  
  292. #ifdef SIGTSTP
  293.  
  294. /* ARGSUSED0 */
  295. void art_suspend (sig)
  296.     int sig;
  297. {
  298.     Raw (FALSE);
  299.     wait_message (txt_suspended_message);
  300.  
  301.     kill (0, SIGSTOP);
  302.  
  303.     sigdisp (SIGTSTP, art_suspend);
  304.  
  305.     if (! update) {
  306.         Raw (TRUE);
  307.         art_resize (0);        
  308.     }
  309. }
  310.  
  311.  
  312. /* ARGSUSED0 */
  313. void main_suspend (sig)
  314.     int sig;
  315. {
  316.     Raw (FALSE);
  317.     wait_message (txt_suspended_message);
  318.  
  319.     kill (0, SIGSTOP);
  320.  
  321.     sigdisp (SIGTSTP, main_suspend);
  322.  
  323.     if (! update) {
  324.         Raw (TRUE);
  325.         main_resize (0);        
  326.     }
  327. }
  328.  
  329.  
  330. /* ARGSUSED0 */
  331. void select_suspend (sig)
  332.     int sig;
  333. {
  334.     Raw (FALSE);
  335.     wait_message (txt_suspended_message);
  336.  
  337.     kill (0, SIGSTOP);
  338.  
  339.     sigdisp (SIGTSTP, select_suspend);
  340.  
  341.     if (! update) {
  342.         Raw (TRUE);
  343.     }
  344.  
  345.     select_resize (0);
  346. }
  347.  
  348.  
  349. /* ARGSUSED0 */
  350. void spooldir_suspend (sig)
  351.     int sig;
  352. {
  353.     Raw (FALSE);
  354.     wait_message (txt_suspended_message);
  355.  
  356.     kill (0, SIGSTOP);
  357.  
  358.     sigdisp (SIGTSTP, spooldir_suspend);
  359.  
  360.     if (! update) {
  361.         Raw (TRUE);
  362.     }
  363.  
  364.     spooldir_resize (0);
  365. }
  366.  
  367.  
  368. /* ARGSUSED0 */
  369. void group_suspend (sig)
  370.     int sig;
  371. {
  372.     Raw (FALSE);
  373.     wait_message (txt_suspended_message);
  374.  
  375.     kill (0, SIGSTOP);
  376.  
  377.     sigdisp (SIGTSTP, group_suspend);
  378.  
  379.     if (! update) {
  380.         Raw (TRUE);
  381.     }
  382.  
  383.     group_resize (0);        
  384. }
  385.  
  386.  
  387. /* ARGSUSED0 */
  388. void page_suspend (sig)
  389.     int sig;
  390. {
  391.  
  392.     Raw (FALSE);
  393.     wait_message (txt_suspended_message);
  394.  
  395.     kill (0, SIGSTOP);
  396.  
  397.     sigdisp (SIGTSTP, page_suspend);
  398.  
  399.     mail_setup ();
  400.  
  401.     if (! update) {
  402.         Raw (TRUE);
  403.     }
  404.  
  405.     page_resize (0);        
  406. }
  407.  
  408.  
  409. /* ARGSUSED0 */
  410. void thread_suspend (sig)
  411.     int sig;
  412. {
  413.     Raw (FALSE);
  414.     wait_message (txt_suspended_message);
  415.  
  416.     kill (0, SIGSTOP);
  417.  
  418.     sigdisp (SIGTSTP, thread_suspend);
  419.  
  420.     if (! update) {
  421.         Raw (TRUE);
  422.     }
  423.     
  424.     thread_resize (0);        
  425. }
  426.  
  427.  
  428. /* ARGSUSED0 */
  429. void rcfile_suspend (sig)
  430.     int sig;
  431. {
  432.     Raw (FALSE);
  433.     wait_message (txt_suspended_message);
  434.  
  435.     kill (0, SIGSTOP);
  436.  
  437.     sigdisp (SIGTSTP, rcfile_suspend);
  438.  
  439.     Raw (TRUE);
  440.     show_rcfile_menu ();    
  441. }
  442.  
  443. #endif /* SIGTSTP */    
  444.  
  445.  
  446. /* ARGSUSED0 */
  447. void art_resize (sig)
  448.     int sig;
  449. {
  450.     char buf[LEN];
  451.  
  452. #ifdef SIGWINCH
  453.     set_win_size (&LINES, &COLS);
  454.     signal (SIGWINCH, art_resize);
  455. #endif
  456.     mail_setup ();
  457.     ClearScreen ();
  458.     sprintf (buf, txt_group, glob_art_group);
  459.     wait_message (buf);
  460. }
  461.  
  462.  
  463. /* ARGSUSED0 */
  464. void main_resize (sig)
  465.     int sig;
  466. {
  467. #ifdef SIGWINCH
  468.     set_win_size (&LINES, &COLS);
  469.     signal (SIGWINCH, main_resize);
  470. #endif
  471.     mail_setup ();
  472. }
  473.  
  474.  
  475. /* ARGSUSED0 */
  476. void select_resize (sig)
  477.     int sig;
  478. {
  479. #ifdef SIGWINCH
  480.     set_win_size (&LINES, &COLS);
  481.     signal (SIGWINCH, select_resize);
  482. #endif
  483.     
  484. #ifndef USE_CLEARSCREEN
  485.     ClearScreen ();
  486. #endif
  487.     mail_setup ();
  488.     group_selection_page ();
  489. }
  490.  
  491.  
  492. /* ARGSUSED0 */
  493. void spooldir_resize (sig)
  494.     int sig;
  495. {
  496. #ifdef SIGWINCH
  497.     set_win_size (&LINES, &COLS);
  498.     signal (SIGWINCH, spooldir_resize);
  499. #endif
  500.     
  501. #ifndef USE_CLEARSCREEN
  502.     ClearScreen ();
  503. #endif
  504.     mail_setup ();
  505.     show_spooldir_page ();
  506. }
  507.  
  508.  
  509. /* ARGSUSED0 */
  510. void group_resize (sig)
  511.     int sig;
  512. {
  513. #ifdef SIGWINCH
  514.     set_win_size (&LINES, &COLS);
  515.     signal (SIGWINCH, group_resize);
  516. #endif
  517.     
  518. #ifndef USE_CLEARSCREEN
  519.     ClearScreen ();
  520. #endif
  521.     mail_setup ();
  522.     show_group_page (glob_group);
  523. }
  524.  
  525.  
  526. /* ARGSUSED0 */
  527. void page_resize (sig)
  528.     int sig;
  529. {
  530. #ifdef SIGWINCH
  531.     set_win_size (&LINES, &COLS);
  532.     signal (SIGWINCH, page_resize);
  533. #endif
  534.     
  535. #ifndef USE_CLEARSCREEN
  536.     ClearScreen ();
  537. #endif
  538.     redraw_page (glob_respnum, glob_page_group);
  539. }
  540.  
  541.  
  542. /* ARGSUSED0 */
  543. void thread_resize (sig)
  544.     int sig;
  545. {
  546. #ifdef SIGWINCH
  547.     set_win_size (&LINES, &COLS);
  548.     signal (SIGWINCH, thread_resize);
  549. #endif
  550.     
  551. #ifndef USE_CLEARSCREEN
  552.     ClearScreen ();
  553. #endif
  554.     mail_setup ();
  555.     show_thread_page ();
  556. }
  557.