Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 13 Mar 1997 04:45:40 -0800 (PST)
From:      Brian Somers <brian>
To:        CVS-committers, cvs-all, cvs-usrsbin
Subject:   cvs commit:  src/usr.sbin/ppp sig.c sig.h Makefile chat.c main.c timer.c
Message-ID:  <199703131245.EAA25468@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
brian       97/03/13 04:45:39

  Modified:    usr.sbin/ppp  Makefile chat.c main.c timer.c
  Added:       usr.sbin/ppp  sig.c sig.h
  Log:
  Reviewed by:	ache@freebsd.org
  These changes should fix the signal "problems" in ppp.
  The signal changes should really be put into 2.2 too !
  The following patches should do it.  There were some other
  changes made by Andrey recently that havn't been brought
  into 2.2, it may be worth doing them now.
  
  diff -r -c ppp/chat.c ppp.new/chat.c
  *** ppp/chat.c	Sat Feb 22 17:59:06 1997
  --- ppp.new/chat.c	Thu Mar 13 12:37:50 1997
  ***************
  *** 34,43 ****
    #include <sys/time.h>
    #include <fcntl.h>
    #include <errno.h>
  ! #include "sig.h"
    #include <sys/wait.h>
    #include "timeout.h"
    #include "vars.h"
  
    #define	IBSIZE 200
  
  --- 34,44 ----
    #include <sys/time.h>
    #include <fcntl.h>
    #include <errno.h>
  ! #include <signal.h>
    #include <sys/wait.h>
    #include "timeout.h"
    #include "vars.h"
  + #include "sig.h"
  
    #define	IBSIZE 200
  
  ***************
  *** 402,411 ****
      pipe(fids);
      pid = fork();
      if (pid == 0) {
  !     pending_signal(SIGINT, SIG_DFL);
  !     pending_signal(SIGQUIT, SIG_DFL);
  !     pending_signal(SIGTERM, SIG_DFL);
  !     pending_signal(SIGHUP, SIG_DFL);
        close(fids[0]);
        dup2(fids[1], 1);
        close(fids[1]);
  --- 403,414 ----
      pipe(fids);
      pid = fork();
      if (pid == 0) {
  !     TermTimerService();
  !     signal(SIGINT, SIG_DFL);
  !     signal(SIGQUIT, SIG_DFL);
  !     signal(SIGTERM, SIG_DFL);
  !     signal(SIGHUP, SIG_DFL);
  !     signal(SIGALRM, SIG_DFL);
        close(fids[0]);
        dup2(fids[1], 1);
        close(fids[1]);
  diff -r -c ppp/main.c ppp.new/main.c
  *** ppp/main.c	Sat Feb 22 17:59:08 1997
  --- ppp.new/main.c	Thu Mar 13 12:37:16 1997
  ***************
  *** 28,34 ****
    #include <paths.h>
    #include <sys/time.h>
    #include <termios.h>
  ! #include "sig.h"
    #include <sys/wait.h>
    #include <errno.h>
    #include <netdb.h>
  --- 28,34 ----
    #include <paths.h>
    #include <sys/time.h>
    #include <termios.h>
  ! #include <signal.h>
    #include <sys/wait.h>
    #include <errno.h>
    #include <netdb.h>
  ***************
  *** 49,54 ****
  --- 49,55 ----
    #include "systems.h"
    #include "ip.h"
    #include "alias.h"
  + #include "sig.h"
  
    #define LAUTH_M1 "Warning: No password entry for this host in ppp.secret\n"
    #define LAUTH_M2 "Warning: All manipulation is allowed by anyone in the world\n"
  ***************
  *** 346,360 ****
  
      tcgetattr(0, &oldtio);		/* Save original tty mode */
  
  !   pending_signal(SIGHUP, Hangup);
      pending_signal(SIGTERM, CloseSession);
      pending_signal(SIGINT, CloseSession);
      pending_signal(SIGQUIT, CloseSession);
    #ifdef SIGSEGV
  !   pending_signal(SIGSEGV, Hangup);
    #endif
    #ifdef SIGPIPE
  !   pending_signal(SIGPIPE, Hangup);
    #endif
    #ifdef SIGALRM
      pending_signal(SIGALRM, SIG_IGN);
  --- 347,361 ----
  
      tcgetattr(0, &oldtio);		/* Save original tty mode */
  
  !   signal(SIGHUP, Hangup);
      pending_signal(SIGTERM, CloseSession);
      pending_signal(SIGINT, CloseSession);
      pending_signal(SIGQUIT, CloseSession);
    #ifdef SIGSEGV
  !   signal(SIGSEGV, Hangup);
    #endif
    #ifdef SIGPIPE
  !   signal(SIGPIPE, Hangup);
    #endif
    #ifdef SIGALRM
      pending_signal(SIGALRM, SIG_IGN);
  diff -r -c ppp/sig.c ppp.new/sig.c
  *** ppp/sig.c	Sat Feb 22 16:10:51 1997
  --- ppp.new/sig.c	Thu Mar 13 12:36:53 1997
  ***************
  *** 32,52 ****
     *
     */
  
    #include "sig.h"
    #include <sys/types.h>
    #include "mbuf.h"
    #include "log.h"
  
  ! #define __MAXSIG (32)		/* Sizeof u_long: Make life convenient.... */
  ! static u_long caused;				/* A mask of pending signals */
  ! static __sighandler_t *handler[ __MAXSIG ];	/* all start at SIG_DFL */
  
  ! /* Record a signal in the "caused" mask */
  
    static void signal_recorder(int sig) {
  !     if (sig > 0 && sig <= __MAXSIG)
  !         caused |= (1<<(sig-1));
    }
  
  --- 32,52 ----
     *
     */
  
  + #include <sys/cdefs.h>
    #include "sig.h"
    #include <sys/types.h>
  + #include <signal.h>
    #include "mbuf.h"
    #include "log.h"
  
  ! static caused[NSIG];		/* An array of pending signals */
  ! static sig_type handler[NSIG];	/* all start at SIG_DFL */
  
  ! /* Record a signal in the "caused" array */
  
    static void signal_recorder(int sig) {
  !         caused[sig-1]++;
    }
  
  ***************
  *** 55,64 ****
        call in handle_signal()
    */
  
  ! __sighandler_t *pending_signal(int sig,__sighandler_t *fn) {
  !     __sighandler_t *Result;
  
  !     if (sig <= 0 || sig > __MAXSIG) {
    	/* Oops - we must be a bit out of date (too many sigs ?) */
            logprintf("Eeek! %s:%s: I must be out of date!\n",__FILE__,__LINE__);
            return signal(sig,fn);
  --- 55,64 ----
        call in handle_signal()
    */
  
  ! sig_type pending_signal(int sig,sig_type fn) {
  !     sig_type Result;
  
  !     if (sig <= 0 || sig > NSIG) {
    	/* Oops - we must be a bit out of date (too many sigs ?) */
            logprintf("Eeek! %s:%s: I must be out of date!\n",__FILE__,__LINE__);
            return signal(sig,fn);
  ***************
  *** 66,78 ****
  
        Result = handler[sig-1];
        if (fn == SIG_DFL || fn == SIG_IGN) {
  -         handler[sig-1] = (__sighandler_t *)0;
            signal(sig,fn);
        } else {
            handler[sig-1] = fn;
            signal(sig,signal_recorder);
        }
  !     caused &= ~(1<<(sig-1));
        return Result;
    }
  
  --- 66,78 ----
  
        Result = handler[sig-1];
        if (fn == SIG_DFL || fn == SIG_IGN) {
            signal(sig,fn);
  +         handler[sig-1] = (sig_type)0;
        } else {
            handler[sig-1] = fn;
            signal(sig,signal_recorder);
        }
  !     caused[sig-1] = 0;
        return Result;
    }
  
  ***************
  *** 81,89 ****
  
    void handle_signals() {
        int sig;
  
  !     if (caused)
  !        for (sig=0; sig<__MAXSIG; sig++, caused>>=1)
  !            if (caused&1)
                   (*handler[sig])(sig+1);
    }
  --- 81,95 ----
  
    void handle_signals() {
        int sig;
  +     int got;
  
  !     do {
  !        got = 0;
  !        for (sig = 0; sig < NSIG; sig++)
  !            if (caused[sig]) {
  !                caused[sig]--;
  !                got++;
                   (*handler[sig])(sig+1);
  +            }
  +     } while(got);
    }
  diff -r -c ppp/sig.h ppp.new/sig.h
  *** ppp/sig.h	Sun Feb 23 19:30:15 1997
  --- ppp.new/sig.h	Thu Mar 13 12:36:29 1997
  ***************
  *** 32,41 ****
     *
     */
  
  ! #include <signal.h>
  
    /* Call this instead of signal() */
  ! extern __sighandler_t *pending_signal __P((int, __sighandler_t *));
  
    /* Call this when you want things to *actually* happen */
    extern void handle_signals __P((void));
  --- 32,41 ----
     *
     */
  
  ! typedef void (*sig_type)(int);
  
    /* Call this instead of signal() */
  ! extern sig_type pending_signal __P((int, sig_type));
  
    /* Call this when you want things to *actually* happen */
    extern void handle_signals __P((void));
  diff -r -c ppp/timer.c ppp.new/timer.c
  *** ppp/timer.c	Sat Feb 22 17:59:11 1997
  --- ppp.new/timer.c	Thu Mar 13 12:30:08 1997
  ***************
  *** 25,34 ****
    #include <sys/time.h>
    #include <signal.h>
    #include "timeout.h"
  - #include "sig.h"
    #ifdef SIGALRM
    #include <errno.h>
    #endif
    void StopTimerNoBlock( struct pppTimer *);
    void ShowTimers(void);
  
  --- 25,34 ----
    #include <sys/time.h>
    #include <signal.h>
    #include "timeout.h"
    #ifdef SIGALRM
    #include <errno.h>
    #endif
  + #include "sig.h"
    void StopTimerNoBlock( struct pppTimer *);
    void ShowTimers(void);
  
  Revision  Changes    Path
  1.16      +2 -2      src/usr.sbin/ppp/Makefile
  1.22      +4 -1      src/usr.sbin/ppp/chat.c
  1.38      +17 -13    src/usr.sbin/ppp/main.c
  1.14      +5 -8      src/usr.sbin/ppp/timer.c



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199703131245.EAA25468>