ALT Linux repos
S: | 2.5.0-alt1 |
5.0: | 2.4.4-alt11 |
4.1: | 2.4.4-alt10.M41.1 |
4.0: | 2.4.4-alt10 |
+updates: | 2.4.4-alt10 |
3.0: | 2.4.2-alt6 |
+updates: | 2.4.2-alt6.M30.1 |
Group :: Networking/Other
RPM: ppp
Main Changelog Spec Patches Sources Download Gear Bugs and FR Repocop
Patch: ppp-2.4.5-alt-fix.patch
Download
Download
chat/Makefile.linux | 6 +-
chat/chat.8 | 2 +-
etc.ppp/options | 3 +
linux/Makefile.top | 8 ++-
pppd/Makefile.linux | 17 ++---
pppd/auth.c | 6 ++-
pppd/chap-new.c | 8 ++
pppd/demand.c | 102 ++++++++++++++++++++++++++++-
pppd/ipcp.c | 9 ++-
pppd/ipv6cp.c | 7 ++-
pppd/ipv6cp.h | 3 +-
pppd/main.c | 89 ++++++++++++++-----------
pppd/options.c | 21 ++++++
pppd/pathnames.h | 14 +++--
pppd/plugins/Makefile.linux | 7 +-
pppd/plugins/pppoatm/Makefile.linux | 6 +-
pppd/plugins/pppol2tp/Makefile.linux | 2 +-
pppd/plugins/radius/Makefile.linux | 17 ++---
pppd/plugins/radius/clientid.c | 4 +-
pppd/plugins/rp-pppoe/Makefile.linux | 13 ++--
pppd/plugins/rp-pppoe/plugin.c | 6 ++
pppd/plugins/rp-pppoe/pppoe-discovery.8 | 86 ++++++++++++++++++++++++
pppd/plugins/winbind.c | 11 +++-
pppd/pppd.8 | 13 ++++-
pppd/pppd.h | 24 ++++++-
pppd/sha1.c | 1 +
pppd/sys-linux.c | 109 +++++++++----------------------
pppd/utils.c | 4 +-
pppdump/Makefile.linux | 4 +-
pppstats/Makefile.linux | 6 +-
30 files changed, 427 insertions(+), 181 deletions(-)
diff --git a/chat/Makefile.linux b/chat/Makefile.linux
index 1065ac5..011ced6 100644
--- a/chat/Makefile.linux
+++ b/chat/Makefile.linux
@@ -18,15 +18,15 @@ INSTALL= install
all: chat
chat: chat.o
- $(CC) -o chat chat.o
+ $(CC) -pie -o chat chat.o
chat.o: chat.c
$(CC) -c $(CFLAGS) -o chat.o chat.c
install: chat
mkdir -p $(BINDIR) $(MANDIR)
- $(INSTALL) -s -c chat $(BINDIR)
- $(INSTALL) -c -m 644 chat.8 $(MANDIR)
+ $(INSTALL) -m 755 chat $(BINDIR)
+ $(INSTALL) -m 644 chat.8 $(MANDIR)
clean:
rm -f chat.o chat *~
diff --git a/chat/chat.8 b/chat/chat.8
index b532292..03f6507 100644
--- a/chat/chat.8
+++ b/chat/chat.8
@@ -200,7 +200,7 @@ The \fBSAY\fR directive allows the script to send strings to the user
at the terminal via standard error. If \fBchat\fR is being run by
pppd, and pppd is running as a daemon (detached from its controlling
terminal), standard error will normally be redirected to the file
-/etc/ppp/connect\-errors.
+/var/log/ppp/connect\-errors.
.LP
\fBSAY\fR strings must be enclosed in single or double quotes. If
carriage return and line feed are needed in the string to be output,
diff --git a/etc.ppp/options b/etc.ppp/options
index 4b67b6a..b1671cc 100644
--- a/etc.ppp/options
+++ b/etc.ppp/options
@@ -1 +1,4 @@
lock
+noipdefault
+noauth
+replacedefaultroute
diff --git a/linux/Makefile.top b/linux/Makefile.top
index f63d45e..f42efd5 100644
--- a/linux/Makefile.top
+++ b/linux/Makefile.top
@@ -5,6 +5,8 @@ BINDIR = $(DESTDIR)/sbin
INCDIR = $(DESTDIR)/include
MANDIR = $(DESTDIR)/share/man
ETCDIR = $(INSTROOT)@SYSCONF@/ppp
+RUNDIR = $(DESTDIR)/var/run/ppp
+LOGDIR = $(DESTDIR)/var/log/ppp
# uid 0 = root
INSTALL= install
@@ -16,7 +18,7 @@ all:
cd pppstats; $(MAKE) $(MFLAGS) all
cd pppdump; $(MAKE) $(MFLAGS) all
-install: $(BINDIR) $(MANDIR)/man8 install-progs install-devel
+install: $(BINDIR) $(RUNDIR) $(LOGDIR) $(MANDIR)/man8 install-progs install-devel
install-progs:
cd chat; $(MAKE) $(MFLAGS) install
@@ -44,6 +46,10 @@ $(MANDIR)/man8:
$(INSTALL) -d -m 755 $@
$(ETCDIR):
$(INSTALL) -d -m 755 $@
+$(RUNDIR):
+ $(INSTALL) -d -m 755 $@
+$(LOGDIR):
+ $(INSTALL) -d -m 755 $@
clean:
rm -f `find . -name '*.[oas]' -print`
diff --git a/pppd/Makefile.linux b/pppd/Makefile.linux
index 060db6a..3a43820 100644
--- a/pppd/Makefile.linux
+++ b/pppd/Makefile.linux
@@ -8,6 +8,7 @@ DESTDIR = $(INSTROOT)@DESTDIR@
BINDIR = $(DESTDIR)/sbin
MANDIR = $(DESTDIR)/share/man/man8
INCDIR = $(DESTDIR)/include
+LIBDIR = $(DESTDIR)/$(libdir)
TARGETS = pppd
@@ -33,7 +34,7 @@ endif
# CC = gcc
#
COPTS = -O2 -pipe -Wall -g
-LIBS =
+LIBS = -lutil
# Uncomment the next 2 lines to include support for Microsoft's
# MS-CHAP authentication protocol. Also, edit plugins/radius/Makefile.linux.
@@ -79,7 +80,7 @@ INCLUDE_DIRS= -I../include
COMPILE_FLAGS= -DHAVE_PATHS_H -DIPX_CHANGE -DHAVE_MMAP
-CFLAGS= $(COPTS) $(COMPILE_FLAGS) $(INCLUDE_DIRS) '-DDESTDIR="@DESTDIR@"'
+CFLAGS= $(COPTS) $(COMPILE_FLAGS) $(INCLUDE_DIRS) '-DDESTDIR="@DESTDIR@"' '-DLIBDIR="$(libdir)"'
ifdef CHAPMS
CFLAGS += -DCHAPMS=1
@@ -135,7 +136,7 @@ endif
# For "Pluggable Authentication Modules", see ftp.redhat.com:/pub/pam/.
ifdef USE_PAM
CFLAGS += -DUSE_PAM
-LIBS += -lpam -ldl
+LIBS += -lpam
endif
# Multi-linnk
@@ -200,20 +201,18 @@ all: $(TARGETS)
install: pppd
mkdir -p $(BINDIR) $(MANDIR)
$(EXTRAINSTALL)
- $(INSTALL) -s -c -m 555 pppd $(BINDIR)/pppd
- if chgrp pppusers $(BINDIR)/pppd 2>/dev/null; then \
- chmod o-rx,u+s $(BINDIR)/pppd; fi
- $(INSTALL) -c -m 444 pppd.8 $(MANDIR)
+ $(INSTALL) -m 755 pppd $(BINDIR)/pppd
+ $(INSTALL) -m 644 pppd.8 $(MANDIR)
pppd: $(PPPDOBJS)
- $(CC) $(CFLAGS) $(LDFLAGS) -o pppd $(PPPDOBJS) $(LIBS)
+ $(CC) $(CFLAGS) -pie $(LDFLAGS) -o pppd $(PPPDOBJS) $(LIBS)
srp-entry: srp-entry.c
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ srp-entry.c $(LIBS)
install-devel:
mkdir -p $(INCDIR)/pppd
- $(INSTALL) -c -m 644 $(HEADERS) $(INCDIR)/pppd
+ $(INSTALL) -m 644 $(HEADERS) $(INCDIR)/pppd
clean:
rm -f $(PPPDOBJS) $(EXTRACLEAN) $(TARGETS) *~ #* core
diff --git a/pppd/auth.c b/pppd/auth.c
index fb71944..c0bdc50 100644
--- a/pppd/auth.c
+++ b/pppd/auth.c
@@ -227,6 +227,7 @@ bool refuse_eap = 0; /* Don't wanna auth. ourselves with EAP */
#ifdef CHAPMS
bool refuse_mschap = 0; /* Don't wanna auth. ourselves with MS-CHAP */
bool refuse_mschap_v2 = 0; /* Don't wanna auth. ourselves with MS-CHAPv2 */
+bool ms_ignore_domain = 0; /* Ignore any MS domain prefix */
#else
bool refuse_mschap = 1; /* Don't wanna auth. ourselves with MS-CHAP */
bool refuse_mschap_v2 = 1; /* Don't wanna auth. ourselves with MS-CHAPv2 */
@@ -314,6 +315,8 @@ option_t auth_options[] = {
"Require MS-CHAPv2 authentication from peer",
OPT_ALIAS | OPT_PRIOSUB | OPT_A2OR | MDTYPE_MICROSOFT_V2,
&lcp_wantoptions[0].chap_mdtype },
+ { "ms-ignore-domain", o_bool, &ms_ignore_domain,
+ "Ignore any MS domain prefix in the username", 1 },
#endif
{ "refuse-pap", o_bool, &refuse_pap,
@@ -2354,7 +2357,8 @@ auth_script(script)
argv[3] = user_name;
argv[4] = devnam;
argv[5] = strspeed;
- argv[6] = NULL;
+ argv[6] = ipparam;
+ argv[7] = NULL;
auth_script_pid = run_program(script, argv, 0, auth_script_done, NULL, 0);
}
diff --git a/pppd/chap-new.c b/pppd/chap-new.c
index 1386486..2b97a67 100644
--- a/pppd/chap-new.c
+++ b/pppd/chap-new.c
@@ -414,6 +414,14 @@ chap_verify_response(char *name, char *ourname, int id,
int ok;
unsigned char secret[MAXSECRETLEN];
int secret_len;
+#ifdef CHAPMS
+ char nametmp[MAXNAMELEN];
+
+ if (ms_ignore_domain && strrchr(name, '\\')) {
+ strcpy(nametmp, strrchr(name, '\\') + 1);
+ strcpy(name, nametmp);
+ }
+#endif
/* Get the secret that the peer is supposed to know */
if (!get_secret(0, name, ourname, (char *)secret, &secret_len, 1)) {
diff --git a/pppd/demand.c b/pppd/demand.c
index 5e57658..4490677 100644
--- a/pppd/demand.c
+++ b/pppd/demand.c
@@ -36,6 +36,8 @@
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
+#include <unistd.h>
+#include <syslog.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/wait.h>
@@ -43,8 +45,11 @@
#include <sys/resource.h>
#include <sys/stat.h>
#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
#ifdef PPP_FILTER
#include <pcap-bpf.h>
+#include <linux/if_ether.h>
#endif
#include "pppd.h"
@@ -221,6 +226,14 @@ loop_chars(p, n)
int c, rv;
rv = 0;
+
+/* check for synchronous connection... */
+
+ if ( (p[0] == 0xFF) && (p[1] == 0x03) ) {
+ rv = loop_frame(p,n);
+ return rv;
+ }
+
for (; n > 0; --n) {
c = *p++;
if (c == PPP_FLAG) {
@@ -299,17 +312,102 @@ loop_frame(frame, len)
* loopback, now that the real serial link is up.
*/
void
-demand_rexmit(proto)
+demand_rexmit(proto, newip)
int proto;
+ u_int32_t newip;
{
struct packet *pkt, *prev, *nextpkt;
+ unsigned short checksum;
+ unsigned short pkt_checksum = 0;
+ unsigned iphdr;
+ struct timeval tv;
+ char cv = 0;
+ char ipstr[16];
prev = NULL;
pkt = pend_q;
pend_q = NULL;
+ tv.tv_sec = 1;
+ tv.tv_usec = 0;
+ select(0,NULL,NULL,NULL,&tv); /* Sleep for 1 Seconds */
for (; pkt != NULL; pkt = nextpkt) {
nextpkt = pkt->next;
if (PPP_PROTOCOL(pkt->data) == proto) {
+ if ( (proto == PPP_IP) && newip ) {
+ /* Get old checksum */
+
+ iphdr = (pkt->data[4] & 15) << 2;
+ checksum = *((unsigned short *) (pkt->data+14));
+ if (checksum == 0xFFFF) {
+ checksum = 0;
+ }
+
+
+ if (pkt->data[13] == 17) {
+ pkt_checksum = *((unsigned short *) (pkt->data+10+iphdr));
+ if (pkt_checksum) {
+ cv = 1;
+ if (pkt_checksum == 0xFFFF) {
+ pkt_checksum = 0;
+ }
+ }
+ else {
+ cv = 0;
+ }
+ }
+
+ if (pkt->data[13] == 6) {
+ pkt_checksum = *((unsigned short *) (pkt->data+20+iphdr));
+ cv = 1;
+ if (pkt_checksum == 0xFFFF) {
+ pkt_checksum = 0;
+ }
+ }
+
+ /* Delete old Source-IP-Address */
+ checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
+ checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
+
+ pkt_checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
+ pkt_checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
+
+ /* Change Source-IP-Address */
+ * ((u_int32_t *) (pkt->data + 16)) = newip;
+
+ /* Add new Source-IP-Address */
+ checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
+ checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
+
+ pkt_checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
+ pkt_checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
+
+ /* Write new checksum */
+ if (!checksum) {
+ checksum = 0xFFFF;
+ }
+ *((unsigned short *) (pkt->data+14)) = checksum;
+ if (pkt->data[13] == 6) {
+ *((unsigned short *) (pkt->data+20+iphdr)) = pkt_checksum;
+ }
+ if (cv && (pkt->data[13] == 17) ) {
+ *((unsigned short *) (pkt->data+10+iphdr)) = pkt_checksum;
+ }
+
+ /* Log Packet */
+ strcpy(ipstr,inet_ntoa(*( (struct in_addr *) (pkt->data+16))));
+ if (pkt->data[13] == 1) {
+ syslog(LOG_INFO,"Open ICMP %s -> %s\n",
+ ipstr,
+ inet_ntoa(*( (struct in_addr *) (pkt->data+20))));
+ } else {
+ syslog(LOG_INFO,"Open %s %s:%d -> %s:%d\n",
+ pkt->data[13] == 6 ? "TCP" : "UDP",
+ ipstr,
+ ntohs(*( (short *) (pkt->data+iphdr+4))),
+ inet_ntoa(*( (struct in_addr *) (pkt->data+20))),
+ ntohs(*( (short *) (pkt->data+iphdr+6))));
+ }
+ }
output(0, pkt->data, pkt->length);
free(pkt);
} else {
@@ -341,6 +439,7 @@ active_packet(p, len)
return 0;
proto = PPP_PROTOCOL(p);
#ifdef PPP_FILTER
+ *p = 1; /* set outbound for the filter rule */
p[0] = 1; /* outbound packet indicator */
if ((pass_filter.bf_len != 0
&& bpf_filter(pass_filter.bf_insns, p, len, len) == 0)
@@ -350,6 +449,7 @@ active_packet(p, len)
return 0;
}
p[0] = 0xff;
+ *p = 0xff; /* restore original ppp header */
#endif
for (i = 0; (protp = protocols[i]) != NULL; ++i) {
if (protp->protocol < 0xC000 && (protp->protocol & ~0x8000) == proto) {
diff --git a/pppd/ipcp.c b/pppd/ipcp.c
index 12bcc61..46121ff 100644
--- a/pppd/ipcp.c
+++ b/pppd/ipcp.c
@@ -91,6 +91,7 @@ struct notifier *ip_down_notifier = NULL;
static int default_route_set[NUM_PPP]; /* Have set up a default route */
static int proxy_arp_set[NUM_PPP]; /* Have created proxy arp entry */
static bool usepeerdns; /* Ask peer for DNS addrs */
+static bool noresolvconf; /* Don't modify /etc/resolv.conf */
static int ipcp_is_up; /* have called np_up() */
static int ipcp_is_open; /* haven't called np_finished() */
static bool ask_for_local; /* request our address from peer */
@@ -207,6 +208,9 @@ static option_t ipcp_option_list[] = {
"disable proxyarp option", OPT_ALIAS | OPT_A2CLR,
&ipcp_wantoptions[0].proxy_arp },
+ { "noresolvconf", o_bool, &noresolvconf,
+ "Don't modify /etc/resolv.conf when ask peer for DNS address(es)", 1 },
+
{ "usepeerdns", o_bool, &usepeerdns,
"Ask peer for DNS address(es)", 1 },
@@ -1808,7 +1812,8 @@ ipcp_up(f)
script_setenv("DNS2", ip_ntoa(go->dnsaddr[1]), 0);
if (usepeerdns && (go->dnsaddr[0] || go->dnsaddr[1])) {
script_setenv("USEPEERDNS", "1", 0);
- create_resolv(go->dnsaddr[0], go->dnsaddr[1]);
+ if (!noresolvconf)
+ create_resolv(go->dnsaddr[0], go->dnsaddr[1]);
}
/*
@@ -1864,7 +1869,7 @@ ipcp_up(f)
proxy_arp_set[f->unit] = 1;
}
- demand_rexmit(PPP_IP);
+ demand_rexmit(PPP_IP,go->ouraddr);
sifnpmode(f->unit, PPP_IP, NPMODE_PASS);
} else {
diff --git a/pppd/ipv6cp.c b/pppd/ipv6cp.c
index 4a09c9a..0d615d4 100644
--- a/pppd/ipv6cp.c
+++ b/pppd/ipv6cp.c
@@ -234,6 +234,8 @@ static option_t ipv6cp_option_list[] = {
{ "ipv6cp-accept-local", o_bool, &ipv6cp_allowoptions[0].accept_local,
"Accept peer's interface identifier for us", 1 },
+ { "ipv6cp-accept-remote", o_bool, &ipv6cp_allowoptions[0].accept_remote,
+ "Accept peer's interface identifier for itself", 1 },
{ "ipv6cp-use-ipaddr", o_bool, &ipv6cp_allowoptions[0].use_ip,
"Use (default) IPv4 address as interface identifier", 1 },
@@ -426,6 +428,7 @@ ipv6cp_init(unit)
memset(ao, 0, sizeof(*ao));
wo->accept_local = 1;
+ wo->accept_remote = 1;
wo->neg_ifaceid = 1;
ao->neg_ifaceid = 1;
@@ -951,7 +954,7 @@ ipv6cp_reqci(f, inp, len, reject_if_disagree)
orc = CONFREJ; /* Reject CI */
break;
}
- if (!eui64_iszero(wo->hisid) &&
+ if (!eui64_iszero(wo->hisid) && !wo->accept_remote &&
!eui64_equals(ifaceid, wo->hisid) &&
eui64_iszero(go->hisid)) {
@@ -1232,7 +1235,7 @@ ipv6cp_up(f)
}
}
- demand_rexmit(PPP_IPV6);
+ demand_rexmit(PPP_IPV6,0);
sifnpmode(f->unit, PPP_IPV6, NPMODE_PASS);
} else {
diff --git a/pppd/ipv6cp.h b/pppd/ipv6cp.h
index cc4568d..8c7552e 100644
--- a/pppd/ipv6cp.h
+++ b/pppd/ipv6cp.h
@@ -150,7 +150,8 @@
typedef struct ipv6cp_options {
int neg_ifaceid; /* Negotiate interface identifier? */
int req_ifaceid; /* Ask peer to send interface identifier? */
- int accept_local; /* accept peer's value for iface id? */
+ int accept_local; /* accept peer's value for our iface id? */
+ int accept_remote; /* accept peer's value for his iface id? */
int opt_local; /* ourtoken set by option */
int opt_remote; /* histoken set by option */
int use_ip; /* use IP as interface identifier */
diff --git a/pppd/main.c b/pppd/main.c
index 014d614..9cdb2b6 100644
--- a/pppd/main.c
+++ b/pppd/main.c
@@ -124,7 +124,7 @@
static const char rcsid[] = RCSID;
/* interface vars */
-char ifname[32]; /* Interface name */
+char ifname[MAXIFNAMELEN]; /* Interface name */
int ifunit; /* Interface unit number */
struct channel *the_channel;
@@ -298,13 +298,6 @@ struct protent *protocols[] = {
NULL
};
-/*
- * If PPP_DRV_NAME is not defined, use the default "ppp" as the device name.
- */
-#if !defined(PPP_DRV_NAME)
-#define PPP_DRV_NAME "ppp"
-#endif /* !defined(PPP_DRV_NAME) */
-
int
main(argc, argv)
int argc;
@@ -737,8 +730,11 @@ void
set_ifunit(iskey)
int iskey;
{
- info("Using interface %s%d", PPP_DRV_NAME, ifunit);
+ if (req_ifname[0] != '\0')
+ slprintf(ifname, sizeof(ifname), req_ifname);
+ else
slprintf(ifname, sizeof(ifname), "%s%d", PPP_DRV_NAME, ifunit);
+ info("Using interface %s", ifname);
script_setenv("IFNAME", ifname, iskey);
if (iskey) {
create_pidfile(getpid()); /* write pid to file */
@@ -815,6 +811,11 @@ create_pidfile(pid)
if ((pidfile = fopen(pidfilename, "w")) != NULL) {
fprintf(pidfile, "%d\n", pid);
(void) fclose(pidfile);
+ if (getuid() != geteuid()) {
+ if ((chown(pidfilename, getuid(), -1)) < 0) {
+ error("Failed to chown pid file %s: %m", pidfilename);
+ }
+ }
} else {
error("Failed to create pid file %s: %m", pidfilename);
pidfilename[0] = 0;
@@ -837,6 +838,11 @@ create_linkpidfile(pid)
if (ifname[0])
fprintf(pidfile, "%s\n", ifname);
(void) fclose(pidfile);
+ if (getuid() != geteuid()) {
+ if ((chown(linkpidfile, getuid(), -1)) < 0) {
+ error("Failed to chown pid file %s: %m", linkpidfile);
+ }
+ }
} else {
error("Failed to create pid file %s: %m", linkpidfile);
linkpidfile[0] = 0;
@@ -1544,14 +1550,6 @@ safe_fork(int infd, int outfd, int errfd)
int fd, pipefd[2];
char buf[1];
- /* make sure fds 0, 1, 2 are occupied (probably not necessary) */
- while ((fd = dup(fd_devnull)) >= 0) {
- if (fd > 2) {
- close(fd);
- break;
- }
- }
-
if (pipe(pipefd) == -1)
pipefd[0] = pipefd[1] = -1;
pid = fork();
@@ -1574,25 +1572,32 @@ safe_fork(int infd, int outfd, int errfd)
tdb_close(pppdb);
#endif
- /* make sure infd, outfd and errfd won't get tromped on below */
- if (infd == 1 || infd == 2)
+ /* make sure fds 0, 1, 2 are occupied, so the duplicated fds always > 2 */
+ while ((fd = dup(fd_devnull)) >= 0) {
+ if (fd > 2) {
+ close(fd);
+ break;
+ }
+ }
+
+ /* always copy fd's to avoid to use a already closed fd later */
+ {
+ int fdi = infd, fdo = outfd;
+
infd = dup(infd);
- if (outfd == 0 || outfd == 2)
outfd = dup(outfd);
- if (errfd == 0 || errfd == 1)
- errfd = dup(errfd);
+ if (errfd >= 0) {
+ fd = errfd;
+ errfd = dup(errfd);
+ close(fd);
+ }
+ close(fdi);
+ close(fdo);
+ }
closelog();
- /* dup the in, out, err fds to 0, 1, 2 */
- if (infd != 0)
- dup2(infd, 0);
- if (outfd != 1)
- dup2(outfd, 1);
- if (errfd != 2)
- dup2(errfd, 2);
-
- if (log_to_fd > 2)
+ if (log_to_fd >= 0)
close(log_to_fd);
if (the_channel->close)
(*the_channel->close)();
@@ -1600,12 +1605,18 @@ safe_fork(int infd, int outfd, int errfd)
close(devfd); /* some plugins don't have a close function */
close(fd_ppp);
close(fd_devnull);
- if (infd != 0)
- close(infd);
- if (outfd != 1)
- close(outfd);
- if (errfd != 2)
+
+ close(0);
+ dup2(infd, 0);
+ close(infd);
+ close(1);
+ dup2(outfd, 1);
+ close(outfd);
+ if (errfd >= 0) {
+ close(2);
+ dup2(errfd, 2);
close(errfd);
+ }
notify(fork_notifier, 0);
close(pipefd[0]);
@@ -1633,7 +1644,7 @@ device_script(program, in, out, dont_wait)
if (log_to_fd >= 0)
errfd = log_to_fd;
else
- errfd = open(_PATH_CONNERRS, O_WRONLY | O_APPEND | O_CREAT, 0600);
+ errfd = open(_PATH_CONNERRS, O_WRONLY | O_APPEND | O_CREAT, 0644);
++conn_running;
pid = safe_fork(in, out, errfd);
@@ -1826,8 +1837,8 @@ forget_child(pid, status)
if (WIFSIGNALED(status)) {
warn("Child process %s (pid %d) terminated with signal %d",
(chp? chp->prog: "??"), pid, WTERMSIG(status));
- } else if (debug)
- dbglog("Script %s finished (pid %d), status = 0x%x",
+ } else
+ info("Script %s finished (pid %d), status = 0x%x",
(chp? chp->prog: "??"), pid,
WIFEXITED(status) ? WEXITSTATUS(status) : status);
if (chp && chp->done)
diff --git a/pppd/options.c b/pppd/options.c
index 482eab9..3da9eea 100644
--- a/pppd/options.c
+++ b/pppd/options.c
@@ -113,6 +113,8 @@ char linkname[MAXPATHLEN]; /* logical name for link */
bool tune_kernel; /* may alter kernel settings */
int connect_delay = 1000; /* wait this many ms after connect script */
int req_unit = -1; /* requested interface unit */
+int req_minunit = -1; /* requested minimal interface unit */
+char req_ifname[MAXIFNAMELEN]; /* requested interface name */
bool multilink = 0; /* Enable multilink operation */
char *bundle_name = NULL; /* bundle name for multilink */
bool dump_options; /* print out option values */
@@ -271,6 +273,13 @@ option_t general_options[] = {
{ "unit", o_int, &req_unit,
"PPP interface unit number to use if possible",
OPT_PRIO | OPT_LLIMIT, 0, 0 },
+ { "minunit", o_int, &req_minunit,
+ "PPP interface minimal unit number",
+ OPT_PRIO | OPT_LLIMIT, 0, 0 },
+
+ { "ifname", o_string, req_ifname,
+ "Set PPP interface name",
+ OPT_PRIO | OPT_PRIV | OPT_STATIC, NULL, MAXIFNAMELEN },
{ "dump", o_bool, &dump_options,
"Print out option values after parsing all options", 1 },
@@ -735,6 +744,7 @@ process_option(opt, cmd, argv)
return 0;
}
}
+ if(!strcmp(opt->name, "holdoff")) holdoff_specified = 1;
*(int *)(opt->addr) = iv;
if (opt->addr2 && (opt->flags & OPT_A2COPY))
*(int *)(opt->addr2) = iv;
@@ -989,6 +999,8 @@ print_option_list(opt, printer, arg)
void (*printer) __P((void *, char *, ...));
void *arg;
{
+ if(!opt) return;
+
while (opt->name != NULL) {
if (opt->priority != OPRIO_DEFAULT
&& opt->winner != (short int) -1)
@@ -1466,6 +1478,10 @@ setpassfilter(argv)
int ret = 1;
pc = pcap_open_dead(DLT_PPP_PPPD, 65535);
+ if (!pc) {
+ option_error("error in pass-filter expression: pcap_open_dead failed\n");
+ return 0;
+ }
if (pcap_compile(pc, &pass_filter, *argv, 1, netmask) == -1) {
option_error("error in pass-filter expression: %s\n",
pcap_geterr(pc));
@@ -1487,6 +1503,11 @@ setactivefilter(argv)
int ret = 1;
pc = pcap_open_dead(DLT_PPP_PPPD, 65535);
+ if (!pc) {
+ option_error("error in active-filter expression: pcap_open_dead failed\n");
+ return 0;
+ }
+
if (pcap_compile(pc, &active_filter, *argv, 1, netmask) == -1) {
option_error("error in active-filter expression: %s\n",
pcap_geterr(pc));
diff --git a/pppd/pathnames.h b/pppd/pathnames.h
index a33f046..2d2cb44 100644
--- a/pppd/pathnames.h
+++ b/pppd/pathnames.h
@@ -7,9 +7,13 @@
#ifdef HAVE_PATHS_H
#include <paths.h>
+#define _SUBPATH_PPP "ppp/"
#else /* HAVE_PATHS_H */
#ifndef _PATH_VARRUN
#define _PATH_VARRUN "/etc/ppp/"
+#define _SUBPATH_PPP
+#else
+#define _SUBPATH_PPP "ppp/"
#endif
#define _PATH_DEVNULL "/dev/null"
#endif /* HAVE_PATHS_H */
@@ -28,9 +32,9 @@
#define _PATH_AUTHUP _ROOT_PATH "/etc/ppp/auth-up"
#define _PATH_AUTHDOWN _ROOT_PATH "/etc/ppp/auth-down"
#define _PATH_TTYOPT _ROOT_PATH "/etc/ppp/options."
-#define _PATH_CONNERRS _ROOT_PATH "/etc/ppp/connect-errors"
+#define _PATH_CONNERRS _ROOT_PATH "/var/log/ppp/connect-errors"
#define _PATH_PEERFILES _ROOT_PATH "/etc/ppp/peers/"
-#define _PATH_RESOLV _ROOT_PATH "/etc/ppp/resolv.conf"
+#define _PATH_RESOLV _ROOT_PATH "/var/run/ppp/resolv.conf"
#define _PATH_USEROPT ".ppprc"
#define _PATH_PSEUDONYM ".ppp_pseudonym"
@@ -46,10 +50,10 @@
#endif /* IPX_CHANGE */
#ifdef __STDC__
-#define _PATH_PPPDB _ROOT_PATH _PATH_VARRUN "pppd2.tdb"
+#define _PATH_PPPDB _ROOT_PATH _PATH_VARRUN _SUBPATH_PPP "pppd2.tdb"
#else /* __STDC__ */
#ifdef HAVE_PATHS_H
-#define _PATH_PPPDB "/var/run/pppd2.tdb"
+#define _PATH_PPPDB "/var/run/ppp/pppd2.tdb"
#else
#define _PATH_PPPDB "/etc/ppp/pppd2.tdb"
#endif
@@ -57,7 +61,7 @@
#ifdef PLUGIN
#ifdef __STDC__
-#define _PATH_PLUGIN DESTDIR "/lib/pppd/" VERSION
+#define _PATH_PLUGIN LIBDIR "/pppd/" VERSION
#else /* __STDC__ */
#define _PATH_PLUGIN "/usr/lib/pppd"
#endif /* __STDC__ */
diff --git a/pppd/plugins/Makefile.linux b/pppd/plugins/Makefile.linux
index 0a7ec7b..da3aa05 100644
--- a/pppd/plugins/Makefile.linux
+++ b/pppd/plugins/Makefile.linux
@@ -7,7 +7,8 @@ INSTALL = install
DESTDIR = $(INSTROOT)@DESTDIR@
BINDIR = $(DESTDIR)/sbin
MANDIR = $(DESTDIR)/share/man/man8
-LIBDIR = $(DESTDIR)/lib/pppd/$(VERSION)
+VERSION = $(shell awk -F '"' '/VERSION/ { print $$2; }' ../patchlevel.h)
+LIBDIR = $(DESTDIR)/$(libdir)/pppd/$(VERSION)
SUBDIRS := rp-pppoe pppoatm pppol2tp
# Uncomment the next line to include the radius authentication plugin
@@ -25,10 +26,8 @@ all: $(PLUGINS)
%.so: %.c
$(CC) -o $@ $(LDFLAGS) $(CFLAGS) $^
-VERSION = $(shell awk -F '"' '/VERSION/ { print $$2; }' ../patchlevel.h)
-
install: $(PLUGINS)
- $(INSTALL) -d $(LIBDIR)
+ mkdir -p $(LIBDIR)
$(INSTALL) $? $(LIBDIR)
for d in $(SUBDIRS); do $(MAKE) $(MFLAGS) -C $$d install; done
diff --git a/pppd/plugins/pppoatm/Makefile.linux b/pppd/plugins/pppoatm/Makefile.linux
index 20f62e6..b052d2f 100644
--- a/pppd/plugins/pppoatm/Makefile.linux
+++ b/pppd/plugins/pppoatm/Makefile.linux
@@ -7,7 +7,7 @@ INSTALL = install
#***********************************************************************
DESTDIR = $(INSTROOT)@DESTDIR@
-LIBDIR = $(DESTDIR)/lib/pppd/$(VERSION)
+LIBDIR = $(DESTDIR)/$(libdir)/pppd/$(VERSION)
VERSION = $(shell awk -F '"' '/VERSION/ { print $$2; }' ../../patchlevel.h)
@@ -36,8 +36,8 @@ $(PLUGIN): $(PLUGIN_OBJS)
$(CC) $(CFLAGS) -o $@ -shared $^ $(LIBS)
install: all
- $(INSTALL) -d -m 755 $(LIBDIR)
- $(INSTALL) -c -m 4550 $(PLUGIN) $(LIBDIR)
+ mkdir -p $(LIBDIR)
+ $(INSTALL) -m 755 $(PLUGIN) $(LIBDIR)
clean:
rm -f *.o *.so
diff --git a/pppd/plugins/pppol2tp/Makefile.linux b/pppd/plugins/pppol2tp/Makefile.linux
index 19eff67..d8a8f5a 100644
--- a/pppd/plugins/pppol2tp/Makefile.linux
+++ b/pppd/plugins/pppol2tp/Makefile.linux
@@ -7,9 +7,9 @@ INSTALL = install
#***********************************************************************
DESTDIR = @DESTDIR@
-LIBDIR = $(DESTDIR)/lib/pppd/$(VERSION)
VERSION = $(shell awk -F '"' '/VERSION/ { print $$2; }' ../../patchlevel.h)
+LIBDIR = $(DESTDIR)/$(libdir)/pppd/$(VERSION)
PLUGINS := pppol2tp.so openl2tp.so
diff --git a/pppd/plugins/radius/Makefile.linux b/pppd/plugins/radius/Makefile.linux
index 24ed3e5..e7e3f0c 100644
--- a/pppd/plugins/radius/Makefile.linux
+++ b/pppd/plugins/radius/Makefile.linux
@@ -5,14 +5,13 @@
DESTDIR = $(INSTROOT)@DESTDIR@
MANDIR = $(DESTDIR)/share/man/man8
-LIBDIR = $(DESTDIR)/lib/pppd/$(VERSION)
-
VERSION = $(shell awk -F '"' '/VERSION/ { print $$2; }' ../../patchlevel.h)
+LIBDIR = $(DESTDIR)/$(libdir)/pppd/$(VERSION)
INSTALL = install
PLUGIN=radius.so radattr.so radrealms.so
-CFLAGS=-I. -I../.. -I../../../include -O2 -fPIC -DRC_LOG_FACILITY=LOG_DAEMON
+CFLAGS= $(COPTS) -I. -I../.. -I../../../include -DRC_LOG_FACILITY=LOG_DAEMON
# Uncomment the next line to include support for Microsoft's
# MS-CHAP authentication protocol.
@@ -35,12 +34,12 @@ endif
all: $(PLUGIN)
install: all
- $(INSTALL) -d -m 755 $(LIBDIR)
- $(INSTALL) -s -c -m 755 radius.so $(LIBDIR)
- $(INSTALL) -s -c -m 755 radattr.so $(LIBDIR)
- $(INSTALL) -s -c -m 755 radrealms.so $(LIBDIR)
- $(INSTALL) -c -m 444 pppd-radius.8 $(MANDIR)
- $(INSTALL) -c -m 444 pppd-radattr.8 $(MANDIR)
+ mkdir -p $(LIBDIR)
+ $(INSTALL) -m 755 radius.so $(LIBDIR)
+ $(INSTALL) -m 755 radattr.so $(LIBDIR)
+ $(INSTALL) -m 755 radrealms.so $(LIBDIR)
+ $(INSTALL) -m 644 pppd-radius.8 $(MANDIR)
+ $(INSTALL) -m 644 pppd-radattr.8 $(MANDIR)
radius.so: radius.o libradiusclient.a
$(CC) -o radius.so -shared radius.o libradiusclient.a
diff --git a/pppd/plugins/radius/clientid.c b/pppd/plugins/radius/clientid.c
index d49579c..91201b0 100644
--- a/pppd/plugins/radius/clientid.c
+++ b/pppd/plugins/radius/clientid.c
@@ -104,13 +104,13 @@ int rc_read_mapfile(char *filename)
UINT4 rc_map2id(char *name)
{
struct map2id_s *p;
- char ttyname[PATH_MAX];
+ char ttyname[PATH_MAX + 1];
*ttyname = '\0';
if (*name != '/')
strcpy(ttyname, "/dev/");
- strncat(ttyname, name, sizeof(ttyname));
+ strlcat(ttyname, name, sizeof(ttyname));
for(p = map2id_list; p; p = p->next)
if (!strcmp(ttyname, p->name)) return p->id;
diff --git a/pppd/plugins/rp-pppoe/Makefile.linux b/pppd/plugins/rp-pppoe/Makefile.linux
index 5d7a271..0364011 100644
--- a/pppd/plugins/rp-pppoe/Makefile.linux
+++ b/pppd/plugins/rp-pppoe/Makefile.linux
@@ -16,9 +16,9 @@
DESTDIR = $(INSTROOT)@DESTDIR@
BINDIR = $(DESTDIR)/sbin
-LIBDIR = $(DESTDIR)/lib/pppd/$(PPPDVERSION)
-
+MANDIR = $(DESTDIR)/share/man/man8
PPPDVERSION = $(shell awk -F '"' '/VERSION/ { print $$2; }' ../../patchlevel.h)
+LIBDIR = $(DESTDIR)/$(libdir)/pppd/$(PPPDVERSION)
INSTALL = install
@@ -42,10 +42,11 @@ rp-pppoe.so: plugin.o discovery.o if.o common.o
$(CC) -o rp-pppoe.so -shared plugin.o discovery.o if.o common.o
install: all
- $(INSTALL) -d -m 755 $(LIBDIR)
- $(INSTALL) -s -c -m 4550 rp-pppoe.so $(LIBDIR)
- $(INSTALL) -d -m 755 $(BINDIR)
- $(INSTALL) -s -c -m 555 pppoe-discovery $(BINDIR)
+ mkdir -p $(LIBDIR)
+ $(INSTALL) -m 755 rp-pppoe.so $(LIBDIR)
+ mkdir -p $(BINDIR)
+ $(INSTALL) -m 755 pppoe-discovery $(BINDIR)
+ $(INSTALL) -c -m 644 pppoe-discovery.8 $(MANDIR)
clean:
rm -f *.o *.so pppoe-discovery
diff --git a/pppd/plugins/rp-pppoe/plugin.c b/pppd/plugins/rp-pppoe/plugin.c
index e94494b..3263f41 100644
--- a/pppd/plugins/rp-pppoe/plugin.c
+++ b/pppd/plugins/rp-pppoe/plugin.c
@@ -49,6 +49,12 @@ static char const RCSID[] =
#include <net/ethernet.h>
#include <net/if_arp.h>
#include <linux/ppp_defs.h>
+
+#ifndef aligned_u64
+#warning ugly hack: aligned_u64 must be defined in linux/types.h
+#define aligned_u64 __u64 __attribute__((aligned(8)))
+#endif
+
#include <linux/if_ppp.h>
#include <linux/if_pppox.h>
diff --git a/pppd/plugins/rp-pppoe/pppoe-discovery.8 b/pppd/plugins/rp-pppoe/pppoe-discovery.8
new file mode 100644
index 0000000..d0a93db
--- /dev/null
+++ b/pppd/plugins/rp-pppoe/pppoe-discovery.8
@@ -0,0 +1,86 @@
+.\" pppoe-discovery.8 written by
+.\" Ben Hutchings <ben@decadentplace.org.uk>, based on pppoe.8.
+.\" Licenced under the GPL version 2 or later.
+.TH PPPOE-DISCOVERY 8
+.SH NAME
+pppoe\-discovery \- perform PPPoE discovery
+.SH SYNOPSIS
+.B pppoe\-discovery
+[
+.I options
+]
+.br
+.BR pppoe\-discovery " { " \-V " | " \-h " }"
+.SH DESCRIPTION
+.LP
+\fBpppoe\-discovery\fR performs the same discovery process as
+\fBpppoe\fR, but does not initiate a session.
+It sends a PADI packet and then prints the names of access
+concentrators in each PADO packet it receives.
+.SH OPTIONS
+.TP
+.BI \-I " interface"
+.RS
+The \fB\-I\fR option specifies the Ethernet interface to use.
+Under Linux, it is typically eth0 or eth1.
+The interface should be \(lqup\(rq before you start
+\fBpppoe\-discovery\fR, but should \fInot\fR be configured to have an
+IP address.
+The default interface is eth0.
+.RE
+.TP
+.BI \-D " file_name"
+.RS
+The \fB\-D\fR option causes every packet to be dumped to the specified
+\fIfile_name\fR.
+This is intended for debugging only.
+.RE
+.TP
+.B \-U
+.RS
+Causes \fBpppoe\-discovery\fR to use the Host-Uniq tag in its discovery
+packets.
+This lets you run multiple instances of \fBpppoe\-discovery\fR and/or
+\fBpppoe\fR without having their discovery packets interfere with one
+another.
+You must supply this option to \fIall\fR instances that you intend to
+run simultaneously.
+.RE
+.TP
+.BI \-S " service_name"
+.RS
+Specifies the desired service name.
+\fBpppoe\-discovery\fR will only accept access concentrators which can
+provide the specified service.
+In most cases, you should \fInot\fR specify this option.
+Use it only if you know that there are multiple access concentrators
+or know that you need a specific service name.
+.RE
+.TP
+.BI \-C " ac_name"
+.RS
+Specifies the desired access concentrator name.
+\fBpppoe\-discovery\fR will only accept the specified access
+concentrator.
+In most cases, you should \fInot\fR specify this option.
+Use it only if you know that there are multiple access concentrators.
+If both the \fB\-S\fR and \fB\-C\fR options are specified, they must
+\fIboth\fR match.
+.RE
+.TP
+.B \-A
+.RS
+This option is accepted for compatibility with \fBpppoe\fR, but has no
+effect.
+.RE
+.TP
+.BR \-V " | " \-h
+.RS
+Either of these options causes \fBpppoe\-discovery\fR to print its
+version number and usage information, then exit.
+.RE
+.SH AUTHORS
+\fBpppoe\-discovery\fR was written by Marco d'Itri <md@linux.it>,
+based on \fBpppoe\fR by David F. Skoll <dfs@roaringpenguin.com>.
+.SH SEE ALSO
+pppoe(8), pppoe-sniff(8)
diff --git a/pppd/plugins/winbind.c b/pppd/plugins/winbind.c
index bb05acd..597394e 100644
--- a/pppd/plugins/winbind.c
+++ b/pppd/plugins/winbind.c
@@ -296,16 +296,23 @@ unsigned int run_ntlm_auth(const char *username,
if (forkret == 0) {
/* child process */
- uid_t uid;
+ uid_t uid = getuid();
close(child_out[0]);
close(child_in[1]);
/* run winbind as the user that invoked pppd */
setgid(getgid());
- uid = getuid();
if (setuid(uid) == -1 || getuid() != uid)
+ {
fatal("pppd/winbind: could not setuid to %d: %m", uid);
+ exit(1);
+ }
+ if (getuid() != uid) {
+ perror("pppd/winbind: could not setuid to orig uid");
+ exit(1);
+ }
+
execl("/bin/sh", "sh", "-c", ntlm_auth, NULL);
fatal("pppd/winbind: could not exec /bin/sh: %m");
}
diff --git a/pppd/pppd.8 b/pppd/pppd.8
index 8ea8200..cbe83bb 100644
--- a/pppd/pppd.8
+++ b/pppd/pppd.8
@@ -1048,7 +1048,18 @@ under Linux and FreeBSD 2.2.8 and later.
.TP
.B unit \fInum
Sets the ppp unit number (for a ppp0 or ppp1 etc interface name) for outbound
-connections.
+connections. If the unit is already in use a dynamically allocated will be
+used.
+.TP
+.B ifname \fIstring
+Set the ppp interface name for outbound connections. A failure to set the
+name will terminate the pppd.
+.TP
+.B minunit \fInum
+Such as unit, but always select bigger interface
+.TP
+.B minunit \fInum
+PPP interface minimal unit number. Such as unit, but always select bigger interface
.TP
.B updetach
With this option, pppd will detach from its controlling terminal once
diff --git a/pppd/pppd.h b/pppd/pppd.h
index cf9840a..743f7a6 100644
--- a/pppd/pppd.h
+++ b/pppd/pppd.h
@@ -57,14 +57,17 @@
#include <net/ppp_defs.h>
#include "patchlevel.h"
+#undef __P
#if defined(__STDC__)
#include <stdarg.h>
#define __V(x) x
+#define __P(args) args
#else
#include <varargs.h>
#define __V(x) (va_alist) va_dcl
#define const
#define volatile
+#define __P(args)
#endif
#ifdef INET6
@@ -80,6 +83,17 @@
#define MAXARGS 1 /* max # args to a command */
#define MAXNAMELEN 256 /* max length of hostname or name for auth */
#define MAXSECRETLEN 256 /* max length of password or secret */
+#define MAXUNIT 255 /* max ppp interface */
+#define MAXIFNAMELEN 32 /* max length of interface name; or use IFNAMSIZ, can we
+ always include net/if.h? */
+
+/*
+ * If PPP_DRV_NAME is not defined, use the default "ppp" as the device name.
+ * Where should PPP_DRV_NAME come from? Do we include it here?
+ */
+#if !defined(PPP_DRV_NAME)
+#define PPP_DRV_NAME "ppp"
+#endif /* !defined(PPP_DRV_NAME) */
/*
* Option descriptor structure.
@@ -313,6 +327,8 @@ extern bool tune_kernel; /* May alter kernel settings as necessary */
extern int connect_delay; /* Time to delay after connect script */
extern int max_data_rate; /* max bytes/sec through charshunt */
extern int req_unit; /* interface unit number to use */
+extern int req_minunit; /* interface minimal unit number to use */
+extern char req_ifname[MAXIFNAMELEN]; /* interface name to use */
extern bool multilink; /* enable multilink operation */
extern bool noendpoint; /* don't send or accept endpt. discrim. */
extern char *bundle_name; /* bundle name for multilink */
@@ -320,6 +336,10 @@ extern bool dump_options; /* print out option values */
extern bool dryrun; /* check everything, print options, exit */
extern int child_wait; /* # seconds to wait for children at end */
+#ifdef CHAPMS
+extern bool ms_ignore_domain; /* Ignore any MS domain prefix */
+#endif
+
#ifdef MAXOCTETS
extern unsigned int maxoctets; /* Maximum octetes per session (in bytes) */
extern int maxoctets_dir; /* Direction :
@@ -564,7 +584,7 @@ void demand_conf __P((void)); /* config interface(s) for demand-dial */
void demand_block __P((void)); /* set all NPs to queue up packets */
void demand_unblock __P((void)); /* set all NPs to pass packets */
void demand_discard __P((void)); /* set all NPs to discard packets */
-void demand_rexmit __P((int)); /* retransmit saved frames for an NP */
+void demand_rexmit __P((int, u_int32_t)); /* retransmit saved frames for an NP*/
int loop_chars __P((unsigned char *, int)); /* process chars from loopback */
int loop_frame __P((unsigned char *, int)); /* should we bring link up? */
@@ -655,8 +675,6 @@ u_int32_t GetMask __P((u_int32_t)); /* Get appropriate netmask for address */
int lock __P((char *)); /* Create lock file for device */
int relock __P((int)); /* Rewrite lock file with new pid */
void unlock __P((void)); /* Delete previously-created lock file */
-void logwtmp __P((const char *, const char *, const char *));
- /* Write entry to wtmp file */
int get_host_seed __P((void)); /* Get host-dependent random number seed */
int have_route_to __P((u_int32_t)); /* Check if route to addr exists */
#ifdef PPP_FILTER
diff --git a/pppd/sha1.c b/pppd/sha1.c
index f4f975c..a11ae1b 100644
--- a/pppd/sha1.c
+++ b/pppd/sha1.c
@@ -18,6 +18,7 @@
#include <string.h>
#include <netinet/in.h> /* htonl() */
+#include <sys/types.h> /* u_int32_t */
#include <net/ppp_defs.h>
#include "sha1.h"
diff --git a/pppd/sys-linux.c b/pppd/sys-linux.c
index b675c97..876863c 100644
--- a/pppd/sys-linux.c
+++ b/pppd/sys-linux.c
@@ -627,15 +627,43 @@ static int make_ppp_unit()
|| fcntl(ppp_dev_fd, F_SETFL, flags | O_NONBLOCK) == -1)
warn("Couldn't set /dev/ppp to nonblock: %m");
- ifunit = req_unit;
- x = ioctl(ppp_dev_fd, PPPIOCNEWUNIT, &ifunit);
- if (x < 0 && req_unit >= 0 && errno == EEXIST) {
+ if (req_minunit > -1) {
+ for(ifunit = req_minunit;req_minunit < MAXUNIT; ifunit = ++req_minunit) {
+ x = ioctl(ppp_dev_fd, PPPIOCNEWUNIT, &ifunit);
+ if (x < 0 && errno == EEXIST) {
+ warn("Couldn't allocate PPP unit %d as it is already in use try to attempt next", req_minunit);
+ }
+ if (x >= 0)
+ break;
+ }
+ }
+ if ((x < 0) || (req_minunit == -1)) {
+ ifunit = req_unit;
+ x = ioctl(ppp_dev_fd, PPPIOCNEWUNIT, &ifunit);
+ if (x < 0 && req_unit >= 0 && errno == EEXIST) {
warn("Couldn't allocate PPP unit %d as it is already in use", req_unit);
ifunit = -1;
x = ioctl(ppp_dev_fd, PPPIOCNEWUNIT, &ifunit);
+ }
}
+
if (x < 0)
error("Couldn't create new ppp unit: %m");
+
+ if (x == 0 && req_ifname[0] != '\0') {
+ struct ifreq ifr;
+ char t[MAXIFNAMELEN];
+ memset(&ifr, 0, sizeof(struct ifreq));
+ slprintf(t, sizeof(t), "%s%d", PPP_DRV_NAME, ifunit);
+ strncpy(ifr.ifr_name, t, IF_NAMESIZE);
+ strncpy(ifr.ifr_newname, req_ifname, IF_NAMESIZE);
+ x = ioctl(sock_fd, SIOCSIFNAME, &ifr);
+ if (x < 0)
+ error("Couldn't rename interface %s to %s: %m", t, req_ifname);
+ else
+ info("Renamed interface %s to %s", t, req_ifname);
+ }
+
return x;
}
@@ -2150,81 +2178,6 @@ int ppp_available(void)
/********************************************************************
*
- * Update the wtmp file with the appropriate user name and tty device.
- */
-
-void logwtmp (const char *line, const char *name, const char *host)
-{
- struct utmp ut, *utp;
- pid_t mypid = getpid();
-#if __GLIBC__ < 2
- int wtmp;
-#endif
-
-/*
- * Update the signon database for users.
- * Christoph Lameter: Copied from poeigl-1.36 Jan 3, 1996
- */
- utmpname(_PATH_UTMP);
- setutent();
- while ((utp = getutent()) && (utp->ut_pid != mypid))
- /* nothing */;
-
- if (utp)
- memcpy(&ut, utp, sizeof(ut));
- else
- /* some gettys/telnetds don't initialize utmp... */
- memset(&ut, 0, sizeof(ut));
-
- if (ut.ut_id[0] == 0)
- strncpy(ut.ut_id, line + 3, sizeof(ut.ut_id));
-
- strncpy(ut.ut_user, name, sizeof(ut.ut_user));
- strncpy(ut.ut_line, line, sizeof(ut.ut_line));
-
- time(&ut.ut_time);
-
- ut.ut_type = USER_PROCESS;
- ut.ut_pid = mypid;
-
- /* Insert the host name if one is supplied */
- if (*host)
- strncpy (ut.ut_host, host, sizeof(ut.ut_host));
-
- /* Insert the IP address of the remote system if IP is enabled */
- if (ipcp_protent.enabled_flag && ipcp_hisoptions[0].neg_addr)
- memcpy(&ut.ut_addr, (char *) &ipcp_hisoptions[0].hisaddr,
- sizeof(ut.ut_addr));
-
- /* CL: Makes sure that the logout works */
- if (*host == 0 && *name==0)
- ut.ut_host[0]=0;
-
- pututline(&ut);
- endutent();
-/*
- * Update the wtmp file.
- */
-#if __GLIBC__ >= 2
- updwtmp(_PATH_WTMP, &ut);
-#else
- wtmp = open(_PATH_WTMP, O_APPEND|O_WRONLY);
- if (wtmp >= 0) {
- flock(wtmp, LOCK_EX);
-
- if (write (wtmp, (char *)&ut, sizeof(ut)) != sizeof(ut))
- warn("error writing %s: %m", _PATH_WTMP);
-
- flock(wtmp, LOCK_UN);
-
- close (wtmp);
- }
-#endif
-}
-
-
-/********************************************************************
- *
* sifvjcomp - config tcp header compression
*/
diff --git a/pppd/utils.c b/pppd/utils.c
index 062b17e..6356bb5 100644
--- a/pppd/utils.c
+++ b/pppd/utils.c
@@ -290,7 +290,7 @@ vslprintf(buf, buflen, fmt, args)
#if 0 /* not used, and breaks on S/390, apparently */
case 'r':
f = va_arg(args, char *);
-#ifndef __powerpc__
+#if !defined(__powerpc__) && !defined(__s390__) && !defined(__s390x__) && !defined(__x86_64__)
n = vslprintf(buf, buflen + 1, f, va_arg(args, va_list));
#else
/* On the powerpc, a va_list is an array of 1 structure */
@@ -859,7 +859,7 @@ complete_read(int fd, void *buf, size_t count)
/* Procedures for locking the serial device using a lock file. */
#ifndef LOCK_DIR
#ifdef __linux__
-#define LOCK_DIR "/var/lock"
+#define LOCK_DIR "/var/lock/serial"
#else
#ifdef SVR4
#define LOCK_DIR "/var/spool/locks"
diff --git a/pppdump/Makefile.linux b/pppdump/Makefile.linux
index ac028f6..867891d 100644
--- a/pppdump/Makefile.linux
+++ b/pppdump/Makefile.linux
@@ -17,5 +17,5 @@ clean:
install:
mkdir -p $(BINDIR) $(MANDIR)
- $(INSTALL) -s -c pppdump $(BINDIR)
- $(INSTALL) -c -m 444 pppdump.8 $(MANDIR)
+ $(INSTALL) -m 755 pppdump $(BINDIR)
+ $(INSTALL) -m 644 pppdump.8 $(MANDIR)
diff --git a/pppstats/Makefile.linux b/pppstats/Makefile.linux
index cca6f0f..c075857 100644
--- a/pppstats/Makefile.linux
+++ b/pppstats/Makefile.linux
@@ -21,9 +21,9 @@ CFLAGS = $(COPTS) $(COMPILE_FLAGS)
all: pppstats
install: pppstats
- -mkdir -p $(MANDIR)
- $(INSTALL) -s -c pppstats $(BINDIR)
- $(INSTALL) -c -m 444 pppstats.8 $(MANDIR)
+ mkdir -p $(MANDIR)
+ $(INSTALL) -m 755 pppstats $(BINDIR)
+ $(INSTALL) -m 644 pppstats.8 $(MANDIR)
pppstats: $(PPPSTATSRCS)
$(CC) $(CFLAGS) -o pppstats pppstats.c $(LIBS)