mirror of
https://github.com/paulusmack/ppp.git
synced 2024-12-11 20:33:39 +08:00
scan command line for tty name before reading options.ttyname;
added %q and %v formats to fmtmsg
This commit is contained in:
parent
0943e83e5a
commit
a24d943c24
180
pppd/main.c
180
pppd/main.c
@ -18,7 +18,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char rcsid[] = "$Id: main.c,v 1.33 1996/05/28 00:49:10 paulus Exp $";
|
||||
static char rcsid[] = "$Id: main.c,v 1.34 1996/07/01 01:17:39 paulus Exp $";
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
@ -81,19 +81,19 @@ static uid_t uid; /* Our real user-id */
|
||||
|
||||
int ttyfd = -1; /* Serial port file descriptor */
|
||||
mode_t tty_mode = -1; /* Original access permissions to tty */
|
||||
int baud_rate; /* Actual bits/second for serial device */
|
||||
int hungup; /* terminal has been hung up */
|
||||
|
||||
int phase; /* where the link is at */
|
||||
int kill_link;
|
||||
int open_ccp_flag;
|
||||
int redirect_stderr; /* Connector's stderr should go to file */
|
||||
|
||||
u_char outpacket_buf[PPP_MRU+PPP_HDRLEN]; /* buffer for outgoing packet */
|
||||
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 */
|
||||
|
||||
int baud_rate; /* Actual bits/second for serial device */
|
||||
|
||||
static int locked; /* lock() has succeeded */
|
||||
|
||||
char *no_ppp_msg = "Sorry - this system lacks PPP kernel support\n";
|
||||
@ -185,18 +185,20 @@ main(argc, argv)
|
||||
|
||||
/*
|
||||
* Initialize to the standard option set, then parse, in order,
|
||||
* the system options file, the user's options file, and the command
|
||||
* line arguments.
|
||||
* the system options file, the user's options file,
|
||||
* the tty's options file, and the command line arguments.
|
||||
*/
|
||||
for (i = 0; (protp = protocols[i]) != NULL; ++i)
|
||||
(*protp->init)(0);
|
||||
|
||||
progname = *argv;
|
||||
|
||||
if (!options_from_file(_PATH_SYSOPTIONS, REQ_SYSOPTIONS, 0) ||
|
||||
!options_for_tty() ||
|
||||
!options_from_user() ||
|
||||
!parse_args(argc-1, argv+1))
|
||||
if (!options_from_file(_PATH_SYSOPTIONS, REQ_SYSOPTIONS, 0)
|
||||
|| !options_from_user())
|
||||
exit(1);
|
||||
scan_args(argc-1, argv+1); /* look for tty name on command line */
|
||||
if (!options_for_tty()
|
||||
|| !parse_args(argc-1, argv+1))
|
||||
exit(1);
|
||||
|
||||
if (!ppp_available()) {
|
||||
@ -224,6 +226,7 @@ main(argc, argv)
|
||||
*/
|
||||
if (!default_device && strcmp(devnam, default_devnam) == 0)
|
||||
default_device = 1;
|
||||
redirect_stderr = !nodetach || default_device;
|
||||
|
||||
/*
|
||||
* Initialize system-dependent stuff and magic number package.
|
||||
@ -497,13 +500,12 @@ main(argc, argv)
|
||||
get_input();
|
||||
if (kill_link) {
|
||||
lcp_close(0, "User request");
|
||||
phase = PHASE_TERMINATE;
|
||||
kill_link = 0;
|
||||
}
|
||||
if (open_ccp_flag) {
|
||||
if (phase == PHASE_NETWORK) {
|
||||
ccp_fsm[0].flags = OPT_RESTART; /* clears OPT_SILENT */
|
||||
ccp_open(0);
|
||||
(*ccp_protent.open)(0);
|
||||
}
|
||||
open_ccp_flag = 0;
|
||||
}
|
||||
@ -516,9 +518,14 @@ main(argc, argv)
|
||||
* real serial device back to its normal mode of operation.
|
||||
*/
|
||||
clean_check();
|
||||
#ifdef _linux_
|
||||
disestablish_ppp(ttyfd);
|
||||
#endif
|
||||
if (demand)
|
||||
restore_loop();
|
||||
#ifndef _linux_
|
||||
disestablish_ppp(ttyfd);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Run disconnector script, if requested.
|
||||
@ -541,7 +548,8 @@ main(argc, argv)
|
||||
}
|
||||
|
||||
if (!demand) {
|
||||
if (unlink(pidfilename) < 0 && errno != ENOENT)
|
||||
if (pidfilename[0] != 0
|
||||
&& unlink(pidfilename) < 0 && errno != ENOENT)
|
||||
syslog(LOG_WARNING, "unable to delete pid file: %m");
|
||||
pidfilename[0] = 0;
|
||||
}
|
||||
@ -677,8 +685,6 @@ connect_time_expired(arg)
|
||||
caddr_t arg;
|
||||
{
|
||||
syslog(LOG_INFO, "Connect time expired");
|
||||
|
||||
phase = PHASE_TERMINATE;
|
||||
lcp_close(0, "Connect time expired"); /* Close connection */
|
||||
}
|
||||
|
||||
@ -971,11 +977,32 @@ device_script(program, in, out)
|
||||
if (pid == 0) {
|
||||
sys_close();
|
||||
closelog();
|
||||
dup2(in, 0);
|
||||
dup2(out, 1);
|
||||
errfd = open(_PATH_CONNERRS, O_WRONLY | O_APPEND | O_CREAT, 0644);
|
||||
if (errfd >= 0)
|
||||
dup2(errfd, 2);
|
||||
if (in == out) {
|
||||
if (in != 0) {
|
||||
dup2(in, 0);
|
||||
close(in);
|
||||
}
|
||||
dup2(0, 1);
|
||||
} else {
|
||||
if (out == 0)
|
||||
out = dup(out);
|
||||
if (in != 0) {
|
||||
dup2(in, 0);
|
||||
close(in);
|
||||
}
|
||||
if (out != 1) {
|
||||
dup2(out, 1);
|
||||
close(out);
|
||||
}
|
||||
}
|
||||
if (redirect_stderr) {
|
||||
close(2);
|
||||
errfd = open(_PATH_CONNERRS, O_WRONLY | O_APPEND | O_CREAT, 0644);
|
||||
if (errfd >= 0 && errfd != 2) {
|
||||
dup2(errfd, 2);
|
||||
close(errfd);
|
||||
}
|
||||
}
|
||||
setuid(getuid());
|
||||
setgid(getgid());
|
||||
execl("/bin/sh", "sh", "-c", program, (char *)0);
|
||||
@ -1152,12 +1179,7 @@ format_packet(p, len, printer, arg)
|
||||
}
|
||||
|
||||
static void
|
||||
#if __STDC__
|
||||
pr_log(void *arg, char *fmt, ...)
|
||||
#else
|
||||
pr_log(va_alist)
|
||||
va_dcl
|
||||
#endif
|
||||
pr_log __V((void *arg, char *fmt, ...))
|
||||
{
|
||||
int n;
|
||||
va_list pvar;
|
||||
@ -1201,10 +1223,25 @@ print_string(p, len, printer, arg)
|
||||
printer(arg, "\"");
|
||||
for (; len > 0; --len) {
|
||||
c = *p++;
|
||||
if (' ' <= c && c <= '~')
|
||||
if (' ' <= c && c <= '~') {
|
||||
if (c == '\\' || c == '"')
|
||||
printer(arg, "\\");
|
||||
printer(arg, "%c", c);
|
||||
else
|
||||
printer(arg, "\\%.3o", c);
|
||||
} else {
|
||||
switch (c) {
|
||||
case '\n':
|
||||
printer(arg, "\\n");
|
||||
break;
|
||||
case '\r':
|
||||
printer(arg, "\\r");
|
||||
break;
|
||||
case '\t':
|
||||
printer(arg, "\\t");
|
||||
break;
|
||||
default:
|
||||
printer(arg, "\\%.3o", c);
|
||||
}
|
||||
}
|
||||
}
|
||||
printer(arg, "\"");
|
||||
}
|
||||
@ -1252,16 +1289,20 @@ fmtmsg __V((char *buf, int buflen, char *fmt, ...))
|
||||
/*
|
||||
* vfmtmsg - like fmtmsg, takes a va_list instead of a list of args.
|
||||
*/
|
||||
#define OUTCHAR(c) (buflen > 0? (--buflen, *buf++ = (c)): 0)
|
||||
|
||||
int
|
||||
vfmtmsg(char *buf, int buflen, char *fmt, va_list args)
|
||||
{
|
||||
int c, i, n;
|
||||
int width, prec;
|
||||
int base, len, neg;
|
||||
int width, prec, fillch;
|
||||
int base, len, neg, quoted;
|
||||
unsigned long val;
|
||||
char *str, *f, *buf0;
|
||||
unsigned char *p;
|
||||
va_list a;
|
||||
char num[32];
|
||||
time_t t;
|
||||
static char hexchars[16] = "0123456789abcdef";
|
||||
|
||||
buf0 = buf;
|
||||
@ -1282,15 +1323,30 @@ vfmtmsg(char *buf, int buflen, char *fmt, va_list args)
|
||||
break;
|
||||
c = *++fmt;
|
||||
width = prec = 0;
|
||||
while (isdigit(c)) {
|
||||
width = width * 10 + c - '0';
|
||||
fillch = ' ';
|
||||
if (c == '0') {
|
||||
fillch = '0';
|
||||
c = *++fmt;
|
||||
}
|
||||
if (c == '*') {
|
||||
width = va_arg(args, int);
|
||||
c = *++fmt;
|
||||
} else {
|
||||
while (isdigit(c)) {
|
||||
width = width * 10 + c - '0';
|
||||
c = *++fmt;
|
||||
}
|
||||
}
|
||||
if (c == '.') {
|
||||
c = *++fmt;
|
||||
while (isdigit(c)) {
|
||||
prec = prec * 10 + c - '0';
|
||||
if (c == '*') {
|
||||
prec = va_arg(args, int);
|
||||
c = *++fmt;
|
||||
} else {
|
||||
while (isdigit(c)) {
|
||||
prec = prec * 10 + c - '0';
|
||||
c = *++fmt;
|
||||
}
|
||||
}
|
||||
}
|
||||
str = 0;
|
||||
@ -1341,6 +1397,58 @@ vfmtmsg(char *buf, int buflen, char *fmt, va_list args)
|
||||
buf += n;
|
||||
buflen -= n;
|
||||
continue;
|
||||
case 't':
|
||||
time(&t);
|
||||
str = ctime(&t);
|
||||
str += 4; /* chop off the day name */
|
||||
str[15] = 0; /* chop off year and newline */
|
||||
break;
|
||||
case 'v': /* "visible" string */
|
||||
case 'q': /* quoted string */
|
||||
quoted = c == 'q';
|
||||
p = va_arg(args, unsigned char *);
|
||||
if (fillch == '0' && prec > 0) {
|
||||
n = prec;
|
||||
} else {
|
||||
n = strlen((char *)p);
|
||||
if (prec > 0 && prec < n)
|
||||
n = prec;
|
||||
}
|
||||
while (n > 0 && buflen > 0) {
|
||||
c = *p++;
|
||||
--n;
|
||||
if (!quoted && c >= 0x80) {
|
||||
OUTCHAR('M');
|
||||
OUTCHAR('-');
|
||||
c -= 0x80;
|
||||
}
|
||||
if (quoted && (c == '"' || c == '\\'))
|
||||
OUTCHAR('\\');
|
||||
if (c < 0x20 || 0x7f <= c && c < 0xa0) {
|
||||
if (quoted) {
|
||||
OUTCHAR('\\');
|
||||
switch (c) {
|
||||
case '\t': OUTCHAR('t'); break;
|
||||
case '\n': OUTCHAR('n'); break;
|
||||
case '\b': OUTCHAR('b'); break;
|
||||
case '\f': OUTCHAR('f'); break;
|
||||
default:
|
||||
OUTCHAR('x');
|
||||
OUTCHAR(hexchars[c >> 4]);
|
||||
OUTCHAR(hexchars[c & 0xf]);
|
||||
}
|
||||
} else {
|
||||
if (c == '\t')
|
||||
OUTCHAR(c);
|
||||
else {
|
||||
OUTCHAR('^');
|
||||
OUTCHAR(c ^ 0x40);
|
||||
}
|
||||
}
|
||||
} else
|
||||
OUTCHAR(c);
|
||||
}
|
||||
continue;
|
||||
default:
|
||||
*buf++ = '%';
|
||||
if (c != '%')
|
||||
@ -1378,7 +1486,7 @@ vfmtmsg(char *buf, int buflen, char *fmt, va_list args)
|
||||
if ((n = width - len) > 0) {
|
||||
buflen -= n;
|
||||
for (; n > 0; --n)
|
||||
*buf++ = ' ';
|
||||
*buf++ = fillch;
|
||||
}
|
||||
}
|
||||
if (len > buflen)
|
||||
|
Loading…
Reference in New Issue
Block a user