* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
-#define RCSID "$Id: main.c,v 1.102 2001/02/22 03:10:57 paulus Exp $"
+#define RCSID "$Id: main.c,v 1.107 2001/05/23 03:39:13 paulus Exp $"
#include <stdio.h>
#include <ctype.h>
#include "chap.h"
#include "ccp.h"
#include "pathnames.h"
-#include "patchlevel.h"
#include "tdb.h"
#ifdef CBCP_SUPPORT
char ifname[32]; /* Interface name */
int ifunit; /* Interface unit number */
+struct channel *the_channel;
+
char *progname; /* Name of this program */
char hostname[MAXNAMELEN]; /* Our hostname */
static char pidfilename[MAXPATHLEN]; /* name of pid file */
*/
for (i = 0; (protp = protocols[i]) != NULL; ++i)
(*protp->init)(0);
+
+ /*
+ * Initialize the default channel.
+ */
tty_init();
progname = *argv;
* Work out the device name, if it hasn't already been specified,
* and parse the tty's options file.
*/
- tty_device_check();
+ if (the_channel->process_extra_options)
+ (*the_channel->process_extra_options)();
+
+ if (debug)
+ setlogmask(LOG_UPTO(LOG_DEBUG));
/*
* Check that we are running as root.
/*
* Check that the options given are valid and consistent.
*/
+ check_options();
if (!sys_check_options())
exit(EXIT_OPTION_ERROR);
auth_check_options();
for (i = 0; (protp = protocols[i]) != NULL; ++i)
if (protp->check_options != NULL)
(*protp->check_options)();
- tty_check_options();
+ if (the_channel->check_options)
+ (*the_channel->check_options)();
+
+
+ if (dump_options || dryrun) {
+ init_pr_log(NULL, LOG_INFO);
+ print_options(pr_log, NULL);
+ end_pr_log();
+ if (dryrun)
+ die(0);
+ }
/*
* Initialize system-dependent stuff.
*/
sys_init();
- if (debug)
- setlogmask(LOG_UPTO(LOG_DEBUG));
pppdb = tdb_open(_PATH_PPPDB, 0, 0, O_RDWR|O_CREAT, 0644);
if (pppdb != NULL) {
else
p = "(unknown)";
}
- syslog(LOG_NOTICE, "pppd %s.%d%s started by %s, uid %d",
- VERSION, PATCHLEVEL, IMPLEMENTATION, p, uid);
+ syslog(LOG_NOTICE, "pppd %s started by %s, uid %d", VERSION, p, uid);
script_setenv("PPPLOGNAME", p, 0);
if (devnam[0])
new_phase(PHASE_SERIALCONN);
- devfd = connect_tty();
+ devfd = the_channel->connect();
if (devfd < 0)
goto fail;
/* set up the serial device as a ppp interface */
tdb_writelock(pppdb);
- fd_ppp = establish_ppp(devfd);
+ fd_ppp = the_channel->establish_ppp(devfd);
if (fd_ppp < 0) {
tdb_writeunlock(pppdb);
status = EXIT_FATAL_ERROR;
* Start opening the connection and wait for
* incoming events (reply, timeout, etc.).
*/
- notice("Connect: %s <--> %s", ifname, ppp_devnam);
+ if (ifunit >= 0)
+ notice("Connect: %s <--> %s", ifname, ppp_devnam);
+ else
+ notice("Starting negotiation on %s", ppp_devnam);
gettimeofday(&start_time, NULL);
link_stats_valid = 0;
script_unsetenv("CONNECT_TIME");
if (link_stats_valid) {
int t = (link_connect_time + 5) / 6; /* 1/10ths of minutes */
info("Connect time %d.%d minutes.", t/10, t%10);
- info("Sent %d bytes, received %d bytes.",
+ info("Sent %u bytes, received %u bytes.",
link_stats.bytes_out, link_stats.bytes_in);
}
*/
remove_fd(fd_ppp);
clean_check();
- if (demand)
- restore_loop();
- disestablish_ppp(devfd);
+ the_channel->disestablish_ppp(devfd);
fd_ppp = -1;
if (!hungup)
lcp_lowerdown(0);
*/
disconnect:
new_phase(PHASE_DISCONNECT);
- disconnect_tty();
+ the_channel->disconnect();
fail:
- cleanup_tty();
+ if (the_channel->cleanup)
+ (*the_channel->cleanup)();
if (!demand) {
if (pidfilename[0] != 0
close(1);
close(2);
detached = 1;
- if (!log_to_file && !log_to_specific_fd)
+ if (log_default)
log_to_fd = -1;
/* update pid files if they have been written already */
if (pidfilename[0])
return;
}
- if (debug /*&& (debugflags & DBG_INPACKET)*/)
- dbglog("rcvd %P", p, len);
-
if (len < PPP_HDRLEN) {
- MAINDEBUG(("io(): Received short packet."));
+ dbglog("received short packet:%.*B", len, p);
return;
}
+ dump_packet("rcvd", p, len);
+
p += 2; /* Skip address and control */
GETSHORT(protocol, p);
len -= PPP_HDRLEN;
sys_cleanup();
if (fd_ppp >= 0)
- disestablish_ppp(devfd);
- cleanup_tty();
+ the_channel->disestablish_ppp(devfd);
+ if (the_channel->cleanup)
+ (*the_channel->cleanup)();
if (pidfilename[0] != 0 && unlink(pidfilename) < 0 && errno != ENOENT)
warn("unable to delete pid file %s: %m", pidfilename);
/*
* timeout - Schedule a timeout.
- *
- * Note that this timeout takes the number of milliseconds, NOT hz (as in
- * the kernel).
*/
void
timeout(func, arg, secs, usecs)
int secs, usecs;
{
struct callout *newp, *p, **pp;
-
+
MAINDEBUG(("Timeout %p:%p in %d.%03d seconds.", func, arg,
- time / 1000, time % 1000));
-
+ secs, usecs/1000));
+
/*
* Allocate timeout.
*/
close(1);
close(2);
sys_close();
- tty_close_fds();
+ if (the_channel->close)
+ (*the_channel->close)();
closelog();
/* dup the in, out, err fds to 0, 1, 2 */
close (0);
close (1);
close (2);
- tty_close_fds();
+ if (the_channel->close)
+ (*the_channel->close)();
/* Don't pass handles to the PPP device, even by accident. */
new_fd = open (_PATH_DEVNULL, O_RDWR);