X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fmain.c;h=76c7b31f732b2945e8d52dfdeaf07a80f5baf266;hp=37aeaeca9629e79d617ad29f2b1c9bb6ae713821;hb=1799a5c14d883772c63fa1475a89f97309db3dc8;hpb=a115760c2c03a34dd5aa1ed7274ac49810d7dd45 diff --git a/pppd/main.c b/pppd/main.c index 37aeaec..76c7b31 100644 --- a/pppd/main.c +++ b/pppd/main.c @@ -18,10 +18,11 @@ */ #ifndef lint -static char rcsid[] = "$Id: main.c,v 1.17 1994/09/01 00:28:14 paulus Exp $"; +static char rcsid[] = "$Id: main.c,v 1.20 1994/10/22 11:49:46 paulus Exp $"; #endif #include +#include #include #include #include @@ -39,7 +40,6 @@ static char rcsid[] = "$Id: main.c,v 1.17 1994/09/01 00:28:14 paulus Exp $"; #include #include -#include "ppp.h" #include "pppd.h" #include "magic.h" #include "fsm.h" @@ -59,8 +59,6 @@ static char rcsid[] = "$Id: main.c,v 1.17 1994/09/01 00:28:14 paulus Exp $"; #define REQ_SYSOPTIONS 1 #endif -static char *pidpath = _PATH_PIDFILE; - /* interface vars */ char ifname[IFNAMSIZ]; /* Interface name */ int ifunit; /* Interface unit number */ @@ -82,8 +80,8 @@ int open_ccp_flag; static int initfdflags = -1; /* Initial file descriptor flags */ -u_char outpacket_buf[MTU+DLLHEADERLEN]; /* buffer for outgoing packet */ -static u_char inpacket_buf[MTU+DLLHEADERLEN]; /* buffer for incoming packet */ +u_char outpacket_buf[PPP_MRU+PPP_HDRLEN]; /* buffer for outgoing packet */ +static u_char inpacket_buf[PPP_MRU+PPP_HDRLEN]; /* buffer for incoming packet */ int hungup; /* terminal has been hung up */ static int n_children; /* # child processes still running */ @@ -91,29 +89,29 @@ static int n_children; /* # child processes still running */ int baud_rate; /* prototypes */ -static void hup __ARGS((int)); -static void term __ARGS((int)); -static void chld __ARGS((int)); -static void toggle_debug __ARGS((int)); -static void open_ccp __ARGS((int)); - -static void get_input __ARGS((void)); -void establish_ppp __ARGS((void)); -void calltimeout __ARGS((void)); -struct timeval *timeleft __ARGS((struct timeval *)); -void reap_kids __ARGS((void)); -void cleanup __ARGS((int, caddr_t)); -void close_fd __ARGS((void)); -void die __ARGS((int)); -void novm __ARGS((char *)); - -void log_packet __ARGS((u_char *, int, char *)); -void format_packet __ARGS((u_char *, int, +static void hup __P((int)); +static void term __P((int)); +static void chld __P((int)); +static void toggle_debug __P((int)); +static void open_ccp __P((int)); + +static void get_input __P((void)); +void establish_ppp __P((void)); +void calltimeout __P((void)); +struct timeval *timeleft __P((struct timeval *)); +void reap_kids __P((void)); +void cleanup __P((int, caddr_t)); +void close_fd __P((void)); +void die __P((int)); +void novm __P((char *)); + +void log_packet __P((u_char *, int, char *)); +void format_packet __P((u_char *, int, void (*) (void *, char *, ...), void *)); -void pr_log __ARGS((void *, char *, ...)); +void pr_log __P((void *, char *, ...)); -extern char *ttyname __ARGS((int)); -extern char *getlogin __ARGS((void)); +extern char *ttyname __P((int)); +extern char *getlogin __P((void)); /* * PPP Data Link Layer "protocol" table. @@ -128,11 +126,16 @@ static struct protent { void (*datainput)(); char *name; } prottbl[] = { - { LCP, lcp_init, lcp_input, lcp_protrej, lcp_printpkt, NULL, "LCP" }, - { IPCP, ipcp_init, ipcp_input, ipcp_protrej, ipcp_printpkt, NULL, "IPCP" }, - { UPAP, upap_init, upap_input, upap_protrej, upap_printpkt, NULL, "PAP" }, - { CHAP, ChapInit, ChapInput, ChapProtocolReject, ChapPrintPkt, NULL, "CHAP" }, - { CCP, ccp_init, ccp_input, ccp_protrej, ccp_printpkt, ccp_datainput, "CCP" }, + { PPP_LCP, lcp_init, lcp_input, lcp_protrej, + lcp_printpkt, NULL, "LCP" }, + { PPP_IPCP, ipcp_init, ipcp_input, ipcp_protrej, + ipcp_printpkt, NULL, "IPCP" }, + { PPP_PAP, upap_init, upap_input, upap_protrej, + upap_printpkt, NULL, "PAP" }, + { PPP_CHAP, ChapInit, ChapInput, ChapProtocolReject, + ChapPrintPkt, NULL, "CHAP" }, + { PPP_CCP, ccp_init, ccp_input, ccp_protrej, + ccp_printpkt, ccp_datainput, "CCP" }, }; #define N_PROTO (sizeof(prottbl) / sizeof(prottbl[0])) @@ -311,7 +314,7 @@ main(argc, argv) (void) sprintf(ifname, "ppp%d", ifunit); /* write pid to file */ - (void) sprintf(pidfilename, "%s/%s.pid", pidpath, ifname); + (void) sprintf(pidfilename, "%s%s.pid", _PATH_VARRUN, ifname); if ((pidfile = fopen(pidfilename, "w")) != NULL) { fprintf(pidfile, "%d\n", pid); (void) fclose(pidfile); @@ -354,9 +357,14 @@ main(argc, argv) } /* - * Run disconnector script, if requested + * Run disconnector script, if requested. + * First we need to reset non-blocking mode. */ + if (initfdflags != -1 && fcntl(fd, F_SETFL, initfdflags) >= 0) + initfdflags = -1; + disestablish_ppp(); if (disconnector) { + set_up_tty(fd, 1); if (device_script(disconnector, fd, fd) < 0) { syslog(LOG_WARNING, "disconnect script failed"); die(1); @@ -389,61 +397,58 @@ get_input() u_char *p; u_short protocol; - for (;;) { /* Read all available packets */ - p = inpacket_buf; /* point to beginning of packet buffer */ + p = inpacket_buf; /* point to beginning of packet buffer */ - len = read_packet(inpacket_buf); - if (len < 0) - return; + len = read_packet(inpacket_buf); + if (len < 0) + return; - if (len == 0) { - MAINDEBUG((LOG_DEBUG, "End of file on fd!")); - hungup = 1; - lcp_lowerdown(0); /* serial link is no longer available */ - phase = PHASE_DEAD; - return; - } + if (len == 0) { + MAINDEBUG((LOG_DEBUG, "End of file on fd!")); + hungup = 1; + lcp_lowerdown(0); /* serial link is no longer available */ + phase = PHASE_DEAD; + return; + } - if (debug /*&& (debugflags & DBG_INPACKET)*/) - log_packet(p, len, "rcvd "); + if (debug /*&& (debugflags & DBG_INPACKET)*/) + log_packet(p, len, "rcvd "); - if (len < DLLHEADERLEN) { - MAINDEBUG((LOG_INFO, "io(): Received short packet.")); - return; - } - - p += 2; /* Skip address and control */ - GETSHORT(protocol, p); - len -= DLLHEADERLEN; + if (len < PPP_HDRLEN) { + MAINDEBUG((LOG_INFO, "io(): Received short packet.")); + return; + } - /* - * Toss all non-LCP packets unless LCP is OPEN. - */ - if (protocol != LCP && lcp_fsm[0].state != OPENED) { - MAINDEBUG((LOG_INFO, - "io(): Received non-LCP packet when LCP not open.")); - return; - } + p += 2; /* Skip address and control */ + GETSHORT(protocol, p); + len -= PPP_HDRLEN; - /* - * Upcall the proper protocol input routine. - */ - for (i = 0; i < sizeof (prottbl) / sizeof (struct protent); i++) - if (prottbl[i].protocol == protocol) { - (*prottbl[i].input)(0, p, len); - break; - } else if (protocol == (prottbl[i].protocol & ~0x8000) - && prottbl[i].datainput != NULL) { - (*prottbl[i].datainput)(0, p, len); - break; - } + /* + * Toss all non-LCP packets unless LCP is OPEN. + */ + if (protocol != PPP_LCP && lcp_fsm[0].state != OPENED) { + MAINDEBUG((LOG_INFO, + "io(): Received non-LCP packet when LCP not open.")); + return; + } - if (i == sizeof (prottbl) / sizeof (struct protent)) { - if (debug) - syslog(LOG_WARNING, "Unknown protocol (0x%x) received", - protocol); - lcp_sprotrej(0, p - DLLHEADERLEN, len + DLLHEADERLEN); + /* + * Upcall the proper protocol input routine. + */ + for (i = 0; i < sizeof (prottbl) / sizeof (struct protent); i++) + if (prottbl[i].protocol == protocol) { + (*prottbl[i].input)(0, p, len); + break; + } else if (protocol == (prottbl[i].protocol & ~0x8000) + && prottbl[i].datainput != NULL) { + (*prottbl[i].datainput)(0, p, len); + break; } + + if (i == sizeof (prottbl) / sizeof (struct protent)) { + if (debug) + syslog(LOG_WARNING, "Unknown protocol (0x%x) received", protocol); + lcp_sprotrej(0, p - PPP_HDRLEN, len + PPP_HDRLEN); } } @@ -907,17 +912,17 @@ void format_packet(p, len, printer, arg) u_char *p; int len; - void (*printer) __ARGS((void *, char *, ...)); + void (*printer) __P((void *, char *, ...)); void *arg; { int i, n; u_short proto; u_char x; - if (len >= DLLHEADERLEN && p[0] == ALLSTATIONS && p[1] == UI) { + if (len >= PPP_HDRLEN && p[0] == PPP_ALLSTATIONS && p[1] == PPP_UI) { p += 2; GETSHORT(proto, p); - len -= DLLHEADERLEN; + len -= PPP_HDRLEN; for (i = 0; i < N_PROTO; ++i) if (proto == prottbl[i].protocol) break; @@ -996,7 +1001,7 @@ void print_string(p, len, printer, arg) char *p; int len; - void (*printer) __ARGS((void *, char *, ...)); + void (*printer) __P((void *, char *, ...)); void *arg; { int c;