X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fsys-aix4.c;h=897d24ace5de561b164684f4f6acb7b0481fb56b;hp=29e2dd3c04f8360c8ddfa1022ed92349dac2694c;hb=928da485167b9c379f451f4a0d81c8b47b629a43;hpb=3fc9490b63f3ebdc0f66b1b945ae9bd1a60f0b5e diff --git a/pppd/sys-aix4.c b/pppd/sys-aix4.c index 29e2dd3..897d24a 100644 --- a/pppd/sys-aix4.c +++ b/pppd/sys-aix4.c @@ -1,6 +1,6 @@ /* - * sys-str.c - System-dependent procedures for setting up - * PPP interfaces on systems which use the STREAMS ppp interface. + * sys-aix4.c - System-dependent procedures for setting up + * PPP interfaces on AIX systems which use the STREAMS ppp interface. * * Copyright (c) 1989 Carnegie Mellon University. * All rights reserved. @@ -19,7 +19,7 @@ */ #ifndef lint -static char rcsid[] = "$Id: sys-aix4.c,v 1.1 1994/11/29 02:36:45 paulus Exp $"; +static char rcsid[] = "$Id: sys-aix4.c,v 1.3 1995/04/24 05:50:43 paulus Exp $"; #endif /* @@ -27,6 +27,9 @@ static char rcsid[] = "$Id: sys-aix4.c,v 1.1 1994/11/29 02:36:45 paulus Exp $"; */ #include +/* +#include +*/ #include #include #include @@ -66,6 +69,8 @@ static int closed_stdio; static int restore_term; /* 1 => we've munged the terminal */ static struct termios inittermios; /* Initial TTY termios */ +int sockfd; /* socket for doing interface ioctls */ + /* * sys_init - System-dependent initialization. */ @@ -76,6 +81,12 @@ sys_init() setlogmask(LOG_UPTO(LOG_INFO)); if (debug) setlogmask(LOG_UPTO(LOG_DEBUG)); + + /* Get an internet socket for doing socket ioctl's on. */ + if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { + syslog(LOG_ERR, "Couldn't create IP socket: %m"); + die(1); + } } /* @@ -191,7 +202,7 @@ establish_ppp() int i; for (i = 0; i <= 2; ++i) - if (i != fd && i != s) + if (i != fd && i != sockfd) close(i); closed_stdio = 1; } @@ -570,7 +581,7 @@ ppp_send_config(unit, mtu, asyncmap, pcomp, accomp) strncpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name)); ifr.ifr_mtu = mtu; - if (ioctl(s, SIOCSIFMTU, (caddr_t) &ifr) < 0) { + if (ioctl(sockfd, SIOCSIFMTU, (caddr_t) &ifr) < 0) { syslog(LOG_ERR, "ioctl(SIOCSIFMTU): %m"); quit(); } @@ -716,12 +727,12 @@ sifup(u) struct npioctl npi; strncpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name)); - if (ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) { + if (ioctl(sockfd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) { syslog(LOG_ERR, "ioctl (SIOCGIFFLAGS): %m"); return 0; } ifr.ifr_flags |= IFF_UP; - if (ioctl(s, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) { + if (ioctl(sockfd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) { syslog(LOG_ERR, "ioctl(SIOCSIFFLAGS): %m"); return 0; } @@ -759,12 +770,12 @@ sifdown(u) } strncpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name)); - if (ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) { + if (ioctl(sockfd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) { syslog(LOG_ERR, "ioctl (SIOCGIFFLAGS): %m"); rv = 0; } else { ifr.ifr_flags &= ~IFF_UP; - if (ioctl(s, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) { + if (ioctl(sockfd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) { syslog(LOG_ERR, "ioctl(SIOCSIFFLAGS): %m"); rv = 0; } @@ -796,26 +807,26 @@ sifaddr(u, o, h, m) if (m != 0) { syslog(LOG_INFO, "Setting interface mask to %s\n", ip_ntoa(m)); ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr.s_addr = m; - if (ioctl(s, SIOCSIFNETMASK, (caddr_t) &ifr) < 0) { + if (ioctl(sockfd, SIOCSIFNETMASK, (caddr_t) &ifr) < 0) { syslog(LOG_ERR, "ioctl(SIOCSIFNETMASK): %m"); ret = 0; } } ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr.s_addr = o; - if (ioctl(s, SIOCSIFADDR, (caddr_t) &ifr) < 0) { + if (ioctl(sockfd, SIOCSIFADDR, (caddr_t) &ifr) < 0) { syslog(LOG_ERR, "ioctl(SIOCSIFADDR): %m"); ret = 0; } SET_SA_FAMILY(ifr.ifr_dstaddr, AF_INET); ((struct sockaddr_in *) &ifr.ifr_dstaddr)->sin_addr.s_addr = h; - if (ioctl(s, SIOCSIFDSTADDR, (caddr_t) &ifr) < 0) { + if (ioctl(sockfd, SIOCSIFDSTADDR, (caddr_t) &ifr) < 0) { syslog(LOG_ERR, "ioctl(SIOCSIFDSTADDR): %m"); ret = 0; } ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr.s_addr = o; - if (ioctl(s, SIOCSIFADDR, (caddr_t) &ifr) < 0) { + if (ioctl(sockfd, SIOCSIFADDR, (caddr_t) &ifr) < 0) { syslog(LOG_ERR, "ioctl(SIOCSIFADDR): %m"); ret = 0; } @@ -838,7 +849,7 @@ cifaddr(u, o, h) SET_SA_FAMILY(rt.rt_gateway, AF_INET); ((struct sockaddr_in *) &rt.rt_gateway)->sin_addr.s_addr = o; rt.rt_flags = RTF_HOST; - if (ioctl(s, SIOCDELRT, (caddr_t) &rt) < 0) { + if (ioctl(sockfd, SIOCDELRT, (caddr_t) &rt) < 0) { syslog(LOG_ERR, "ioctl(SIOCDELRT): %m"); return 0; } @@ -859,7 +870,7 @@ sifdefaultroute(u, g) SET_SA_FAMILY(rt.rt_gateway, AF_INET); ((struct sockaddr_in *) &rt.rt_gateway)->sin_addr.s_addr = g; rt.rt_flags = RTF_GATEWAY; - if (ioctl(s, SIOCADDRT, &rt) < 0) { + if (ioctl(sockfd, SIOCADDRT, &rt) < 0) { syslog(LOG_ERR, "default route ioctl(SIOCADDRT): %m"); return 0; } @@ -880,7 +891,7 @@ cifdefaultroute(u, g) SET_SA_FAMILY(rt.rt_gateway, AF_INET); ((struct sockaddr_in *) &rt.rt_gateway)->sin_addr.s_addr = g; rt.rt_flags = RTF_GATEWAY; - if (ioctl(s, SIOCDELRT, &rt) < 0) { + if (ioctl(sockfd, SIOCDELRT, &rt) < 0) { syslog(LOG_ERR, "default route ioctl(SIOCDELRT): %m"); return 0; } @@ -911,7 +922,7 @@ sifproxyarp(unit, hisaddr) SET_SA_FAMILY(arpreq.arp_pa, AF_INET); ((struct sockaddr_in *) &arpreq.arp_pa)->sin_addr.s_addr = hisaddr; arpreq.arp_flags = ATF_PERM | ATF_PUBL; - if (ioctl(s, SIOCSARP, (caddr_t)&arpreq) < 0) { + if (ioctl(sockfd, SIOCSARP, (caddr_t)&arpreq) < 0) { syslog(LOG_ERR, "ioctl(SIOCSARP): %m"); return 0; } @@ -932,7 +943,7 @@ cifproxyarp(unit, hisaddr) BZERO(&arpreq, sizeof(arpreq)); SET_SA_FAMILY(arpreq.arp_pa, AF_INET); ((struct sockaddr_in *) &arpreq.arp_pa)->sin_addr.s_addr = hisaddr; - if (ioctl(s, SIOCDARP, (caddr_t)&arpreq) < 0) { + if (ioctl(sockfd, SIOCDARP, (caddr_t)&arpreq) < 0) { syslog(LOG_ERR, "ioctl(SIOCDARP): %m"); return 0; } @@ -1117,3 +1128,41 @@ logwtmp(line, name, host) } close(fd); } + +/* + * Code for locking/unlocking the serial device. + */ + +static char *devlocked = (char *) 0; + +int lock(char *device) +{ + char *devname; + int rc; + + if (devname = strrchr(device,'/')) + ++devname; + else + devname = device; + + if ((rc = ttylock(devname)) == 0) { + devlocked = (char *) malloc(strlen(devname) + 1); + sprintf(devlocked,"%s",devname); + } else + devlocked = (char *) 0; + + return(rc); +} + +int unlock() +{ + int rc = 0; + + if (devlocked) { + rc = ttyunlock(devlocked); + free(devlocked); + devlocked = (char *) 0; + } + return(rc); +} +