From 5d18065463d00e184ff9bd1aaa17936d5da8ca32 Mon Sep 17 00:00:00 2001 From: brian Date: Wed, 11 Jun 1997 03:57:51 +0000 Subject: Sort out ppp over tcp: o Allow "set var" with no args to blank var (don't req ""). o Zero VarTerm ASAP if not in interactive mode. o Never print anything to stdout in -direct mode. o Count redial when failing to open modem. o Increase device size to 40 characters (for host:port). o Remove missed "if (fd == 0) fd = 1;". o Don't give up on incoming non-terminal connections. --- usr.sbin/ppp/command.c | 26 +++++++++++++++----------- usr.sbin/ppp/main.c | 44 +++++++++++++++++++++++++++++++------------- usr.sbin/ppp/modem.c | 16 ++++++++++------ usr.sbin/ppp/vars.h | 4 ++-- 4 files changed, 58 insertions(+), 32 deletions(-) (limited to 'usr.sbin') diff --git a/usr.sbin/ppp/command.c b/usr.sbin/ppp/command.c index e314d57..2d3b623 100644 --- a/usr.sbin/ppp/command.c +++ b/usr.sbin/ppp/command.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: command.c,v 1.53 1997/06/01 01:13:00 brian Exp $ + * $Id: command.c,v 1.54 1997/06/09 03:27:16 brian Exp $ * */ #include @@ -1128,43 +1128,47 @@ char **argv; int param; { u_long map; + char *arg; - if (argc > 0) { - switch (param) { + if (argc > 0) + arg = *argv; + else + arg = ""; + + switch (param) { case VAR_AUTHKEY: - strncpy(VarAuthKey, *argv, sizeof(VarAuthKey)-1); + strncpy(VarAuthKey, arg, sizeof(VarAuthKey)-1); VarAuthKey[sizeof(VarAuthKey)-1] = '\0'; break; case VAR_AUTHNAME: - strncpy(VarAuthName, *argv, sizeof(VarAuthName)-1); + strncpy(VarAuthName, arg, sizeof(VarAuthName)-1); VarAuthName[sizeof(VarAuthName)-1] = '\0'; break; case VAR_DIAL: - strncpy(VarDialScript, *argv, sizeof(VarDialScript)-1); + strncpy(VarDialScript, arg, sizeof(VarDialScript)-1); VarDialScript[sizeof(VarDialScript)-1] = '\0'; break; case VAR_LOGIN: - strncpy(VarLoginScript, *argv, sizeof(VarLoginScript)-1); + strncpy(VarLoginScript, arg, sizeof(VarLoginScript)-1); VarLoginScript[sizeof(VarLoginScript)-1] = '\0'; break; case VAR_DEVICE: CloseModem(); - strncpy(VarDevice, *argv, sizeof(VarDevice)-1); + strncpy(VarDevice, arg, sizeof(VarDevice)-1); VarDevice[sizeof(VarDevice)-1] = '\0'; VarBaseDevice = rindex(VarDevice, '/'); VarBaseDevice = VarBaseDevice ? VarBaseDevice + 1 : ""; break; case VAR_ACCMAP: - sscanf(*argv, "%lx", &map); + sscanf(arg, "%lx", &map); VarAccmap = map; break; case VAR_PHONE: - strncpy(VarPhoneList, *argv, sizeof(VarPhoneList)-1); + strncpy(VarPhoneList, arg, sizeof(VarPhoneList)-1); VarPhoneList[sizeof(VarPhoneList)-1] = '\0'; strcpy(VarPhoneCopy, VarPhoneList); VarNextPhone = VarPhoneCopy; break; - } } return 0; } diff --git a/usr.sbin/ppp/main.c b/usr.sbin/ppp/main.c index ad423a5..e557ddd 100644 --- a/usr.sbin/ppp/main.c +++ b/usr.sbin/ppp/main.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: main.c,v 1.59 1997/06/01 03:43:25 brian Exp $ + * $Id: main.c,v 1.60 1997/06/09 03:27:28 brian Exp $ * * TODO: * o Add commands for traffic summary, version display, etc. @@ -329,7 +329,7 @@ char **argv; FILE *lockfile; char *name; - VarTerm = stdout; + VarTerm = 0; name = rindex(argv[0], '/'); LogOpen(name ? name+1 : argv[0]); @@ -338,7 +338,8 @@ char **argv; netfd = server = modem = tun_in = -1; ProcessArgs(argc, argv); if (!(mode & MODE_DIRECT)) - Greetings(); + VarTerm = stdout; + Greetings(); GetUid(); IpcpDefAddress(); @@ -350,6 +351,7 @@ char **argv; if (VarTerm) { fprintf(VarTerm,LAUTH_M1); fprintf(VarTerm,LAUTH_M2); + fflush(VarTerm); } /* Fall down */ case VALID: @@ -409,19 +411,15 @@ char **argv; if (dstsystem) { if (SelectSystem(dstsystem, CONFFILE) < 0) { - if (VarTerm) - fprintf(VarTerm, "Destination system not found in conf file.\n"); + LogPrintf(LogWARN, "Destination system not found in conf file.\n"); Cleanup(EX_START); } if ((mode & MODE_AUTO) && DefHisAddress.ipaddr.s_addr == INADDR_ANY) { - if (VarTerm) - fprintf(VarTerm, "Must specify dstaddr with" + LogPrintf(LogWARN, "Must specify dstaddr with" " auto, background or ddial mode.\n"); Cleanup(EX_START); } } - if (mode & MODE_DIRECT) - fprintf(VarTerm, "Packet mode enabled.\n"); if (!(mode & MODE_INTER)) { int port = SERVER_PORT + tunno; @@ -511,13 +509,17 @@ char **argv; if (server >= 0) LogPrintf(LogPHASE, "Listening at %d.\n", port); + + VarTerm = 0; /* We know it's currently stdin */ + #ifdef DOTTYINIT - if (mode & (MODE_DIRECT|MODE_DEDICATED)) + if (mode & (MODE_DIRECT|MODE_DEDICATED)) { /* } */ #else - if (mode & MODE_DIRECT) + if (mode & MODE_DIRECT) { #endif + chdir("/"); /* Be consistent with daemon() */ TtyInit(); - else + } else daemon(0,0); } else { TtyInit(); @@ -743,6 +745,7 @@ DoLoop() pgroup = getpgrp(); if (mode & MODE_DIRECT) { + LogPrintf(LogDEBUG, "Opening modem\n"); modem = OpenModem(mode); LogPrintf(LogPHASE, "Packet mode enabled\n"); PacketMode(); @@ -805,7 +808,22 @@ DoLoop() LogPrintf(LogDEBUG, "going to dial: modem = %d\n", modem); modem = OpenModem(mode); if (modem < 0) { - StartRedialTimer(VarRedialTimeout); + tries++; + if (VarDialTries) + LogPrintf(LogCHAT, "Failed to open modem (attempt %u of %d)\n", + tries, VarDialTries); + else + LogPrintf(LogCHAT, "Failed to open modem (attempt %u)\n", tries); + + if (VarDialTries && tries >= VarDialTries) { + if (mode & MODE_BACKGROUND) + Cleanup(EX_DIAL); /* Can't get the modem */ + dial_up = FALSE; + reconnectState = RECON_UNKNOWN; + reconnectCount = 0; + tries = 0; + } else + StartRedialTimer(VarRedialTimeout); } else { tries++; /* Tries are per number, not per list of numbers. */ if (VarDialTries) diff --git a/usr.sbin/ppp/modem.c b/usr.sbin/ppp/modem.c index d5dc70f..b34545e 100644 --- a/usr.sbin/ppp/modem.c +++ b/usr.sbin/ppp/modem.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: modem.c,v 1.41 1997/05/29 02:29:13 brian Exp $ + * $Id: modem.c,v 1.42 1997/06/09 03:27:30 brian Exp $ * * TODO: */ @@ -359,6 +359,7 @@ char *host, *port; LogPrintf(LogWARN, "OpenConnection: connection failed.\n"); return(-1); } + LogPrintf(LogDEBUG, "OpenConnection: modem fd is %d.\n", sock); return(sock); } @@ -381,8 +382,9 @@ int mode; LogPrintf(LogPHASE, "Open Failed %s\n", ctermid(NULL)); return(modem); } - } else if (modem < 0) - return(modem); + } else + /* must be a tcp connection */ + return modem = dup(1); } else if (modem < 0) { if (strncmp(VarDevice, "/dev/", 5) == 0) { if ((res = uu_lock(VarBaseDevice)) != UU_LOCK_OK) { @@ -680,7 +682,6 @@ int fd; if (modemout) { nb = modemout->cnt; if (nb > 1600) nb = 1600; - if (fd == 0) fd = 1; /* XXX WTFO! This is bogus */ nw = write(fd, MBUF_CTOP(modemout), nb); LogPrintf(LogDEBUG, "ModemStartOutput: wrote: %d(%d)\n", nw, nb); LogDumpBuff(LogDEBUG, "ModemStartOutput: modem write", @@ -693,8 +694,11 @@ int fd; LogPrintf(LogDEBUG, "ModemStartOutput: mbfree\n"); } } else if (nw < 0) { - if (errno != EAGAIN) - LogPrintf(LogERROR, "modem write: %s", strerror(errno)); + if (errno != EAGAIN) { + LogPrintf(LogERROR, "modem write (%d): %s", modem, strerror(errno)); + reconnect(RECON_TRUE); + DownConnection(); + } } } } diff --git a/usr.sbin/ppp/vars.h b/usr.sbin/ppp/vars.h index 2f5b87a..64f9b81 100644 --- a/usr.sbin/ppp/vars.h +++ b/usr.sbin/ppp/vars.h @@ -15,7 +15,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: vars.h,v 1.17 1997/06/01 01:13:04 brian Exp $ + * $Id: vars.h,v 1.18 1997/06/09 03:27:42 brian Exp $ * * TODO: */ @@ -68,7 +68,7 @@ struct pppvars { int redial_timeout; /* Redial timeout value */ int redial_next_timeout; /* Redial next timeout value */ int dial_tries; /* Dial attempts before giving up, 0 == inf */ - char modem_dev[20]; /* Name of device */ + char modem_dev[40]; /* Name of device / host:port */ char *base_modem_dev; /* Pointer to base of modem_dev */ int open_mode; /* LCP open mode */ #define LOCAL_AUTH 0x01 -- cgit v1.1