|
|
| version 1.1, 2012/02/21 23:32:47 | version 1.1.1.2, 2013/07/22 08:44:29 |
|---|---|
| Line 10 | Line 10 |
| #include "ppp.h" | #include "ppp.h" |
| #include "util.h" | #include "util.h" |
| #include <termios.h> | #include <termios.h> |
| #include <paths.h> | |
| #include <libutil.h> | |
| #include <netdb.h> | #include <netdb.h> |
| #include <tcpd.h> | #include <tcpd.h> |
| #include <sys/wait.h> | #include <sys/wait.h> |
| Line 32 | Line 34 |
| * INTERNAL VARIABLES | * INTERNAL VARIABLES |
| */ | */ |
| #ifndef USE_NG_PRED1 | |
| static const u_int16_t Crc16Table[256] = { | static const u_int16_t Crc16Table[256] = { |
| /* 00 */ 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, | /* 00 */ 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, |
| /* 08 */ 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, | /* 08 */ 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, |
| Line 66 static const u_int16_t Crc16Table[256] = { | Line 69 static const u_int16_t Crc16Table[256] = { |
| /* f0 */ 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, | /* f0 */ 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, |
| /* f8 */ 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 | /* f8 */ 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 |
| }; | }; |
| #endif | |
| static FILE *lockFp = NULL; | static FILE *lockFp = NULL; |
| Line 73 static const u_int16_t Crc16Table[256] = { | Line 77 static const u_int16_t Crc16Table[256] = { |
| * INTERNAL FUNCTIONS | * INTERNAL FUNCTIONS |
| */ | */ |
| static int UuLock(const char *devname); | |
| static int UuUnlock(const char *devname); | |
| static void Escape(char *line); | static void Escape(char *line); |
| static char *ReadLine(FILE *fp, int *lineNum, char *result, int resultsize); | static char *ReadLine(FILE *fp, int *lineNum, char *result, int resultsize); |
| Line 130 ExecCmd(int log, const char *label, const char *fmt, . | Line 131 ExecCmd(int log, const char *label, const char *fmt, . |
| /* Hide any stdout output of command */ | /* Hide any stdout output of command */ |
| snprintf(cmdn + strlen(cmdn), sizeof(cmdn) - strlen(cmdn), " >/dev/null 2>&1"); | snprintf(cmdn + strlen(cmdn), sizeof(cmdn) - strlen(cmdn), " >%s 2>&1", _PATH_DEVNULL); |
| /* Do command */ | /* Do command */ |
| Line 202 ExecCmdNosh(int log, const char *label, const char *fm | Line 203 ExecCmdNosh(int log, const char *label, const char *fm |
| (void)sigaction(SIGQUIT, &quitact, NULL); | (void)sigaction(SIGQUIT, &quitact, NULL); |
| (void)sigprocmask(SIG_SETMASK, &oldsigblock, NULL); | (void)sigprocmask(SIG_SETMASK, &oldsigblock, NULL); |
| close(1); | close(1); |
| open("/dev/null", O_WRONLY); | open(_PATH_DEVNULL, O_WRONLY); |
| close(2); | close(2); |
| open("/dev/null", O_WRONLY); | open(_PATH_DEVNULL, O_WRONLY); |
| execv(argv[0], argv); | execv(argv[0], argv); |
| exit(127); | exit(127); |
| default: /* parent */ | default: /* parent */ |
| Line 666 ReadLine(FILE *fp, int *lineNum, char *result, int res | Line 667 ReadLine(FILE *fp, int *lineNum, char *result, int res |
| return(result); | return(result); |
| } | } |
| #ifdef PHYSTYPE_MODEM | |
| /* | /* |
| * OpenSerialDevice() | * OpenSerialDevice() |
| * | * |
| Line 737 ExclusiveOpenDevice(const char *label, const char *pat | Line 739 ExclusiveOpenDevice(const char *label, const char *pat |
| /* Lock device UUCP style, if it resides in /dev */ | /* Lock device UUCP style, if it resides in /dev */ |
| if (!strncmp(pathname, "/dev/", 5)) | if (!strncmp(pathname, _PATH_DEV, 5)) |
| { | { |
| int res; | |
| ttyname = pathname + 5; | ttyname = pathname + 5; |
| if (UuLock(ttyname) < 0) | if ((res = uu_lock(ttyname)) != UU_LOCK_OK) { |
| { | Log(LG_ERR, ("[%s] uu_lock(%s): %s", label, ttyname, uu_lockerr(res))); |
| Log(LG_ERR, ("[%s] can't lock device %s", label, ttyname)); | |
| return(-1); | return(-1); |
| } | } |
| locked = TRUE; | locked = TRUE; |
| Line 757 ExclusiveOpenDevice(const char *label, const char *pat | Line 759 ExclusiveOpenDevice(const char *label, const char *pat |
| { | { |
| Perror("[%s] can't open %s", label, pathname); | Perror("[%s] can't open %s", label, pathname); |
| if (locked) | if (locked) |
| UuUnlock(ttyname); | uu_unlock(ttyname); |
| return(-1); | return(-1); |
| } | } |
| Line 768 ExclusiveOpenDevice(const char *label, const char *pat | Line 770 ExclusiveOpenDevice(const char *label, const char *pat |
| Log(LG_ERR, ("[%s] can't open %s after %d secs", | Log(LG_ERR, ("[%s] can't open %s after %d secs", |
| label, pathname, MAX_OPEN_DELAY)); | label, pathname, MAX_OPEN_DELAY)); |
| if (locked) | if (locked) |
| UuUnlock(ttyname); | uu_unlock(ttyname); |
| return(-1); | return(-1); |
| } | } |
| (void) fcntl(fd, F_SETFD, 1); | (void) fcntl(fd, F_SETFD, 1); |
| Line 810 ExclusiveCloseDevice(const char *label, int fd, const | Line 812 ExclusiveCloseDevice(const char *label, int fd, const |
| /* Remove lock */ | /* Remove lock */ |
| if (!strncmp(pathname, "/dev/", 5)) | if (!strncmp(pathname, _PATH_DEV, 5)) |
| { | { |
| ttyname = pathname + 5; | ttyname = pathname + 5; |
| if (UuUnlock(ttyname) < 0) | if (uu_unlock(ttyname) < 0) |
| Perror("[%s] can't unlock %s", label, ttyname); | Perror("[%s] can't unlock %s", label, ttyname); |
| } | } |
| } | } |
| #endif /* PHYSTYPE_MODEM */ | |
| /* | |
| * UuLock() | |
| * | |
| * Try to atomically create lockfile. Returns negative if failed. | |
| */ | |
| static int | |
| UuLock(const char *ttyname) | |
| { | |
| int fd, pid; | |
| char tbuf[sizeof(PATH_LOCKFILENAME) + MAX_FILENAME]; | |
| char pid_buf[64]; | |
| snprintf(tbuf, sizeof(tbuf), PATH_LOCKFILENAME, ttyname); | |
| if ((fd = open(tbuf, O_RDWR|O_CREAT|O_EXCL, 0664)) < 0) | |
| { | |
| /* File is already locked; Check to see if the process | |
| * holding the lock still exists */ | |
| if ((fd = open(tbuf, O_RDWR, 0)) < 0) | |
| { | |
| Perror("%s: open(%s)", __FUNCTION__, tbuf); | |
| return(-1); | |
| } | |
| if (read(fd, pid_buf, sizeof(pid_buf)) <= 0) | |
| { | |
| (void)close(fd); | |
| Perror("%s: read", __FUNCTION__); | |
| return(-1); | |
| } | |
| pid = atoi(pid_buf); | |
| if (kill(pid, 0) == 0 || errno != ESRCH) | |
| { | |
| (void)close(fd); /* process is still running */ | |
| return(-1); | |
| } | |
| /* The process that locked the file isn't running, so we'll lock it */ | |
| if (lseek(fd, (off_t) 0, L_SET) < 0) | |
| { | |
| (void)close(fd); | |
| Perror("%s: lseek", __FUNCTION__); | |
| return(-1); | |
| } | |
| } | |
| /* Finish the locking process */ | |
| sprintf(pid_buf, "%10u\n", (int) gPid); | |
| if (write(fd, pid_buf, strlen(pid_buf)) != strlen(pid_buf)) | |
| { | |
| (void)close(fd); | |
| (void)unlink(tbuf); | |
| Perror("%s: write", __FUNCTION__); | |
| return(-1); | |
| } | |
| (void)close(fd); | |
| return(0); | |
| } | |
| /* | /* |
| * UuUnlock() | |
| */ | |
| static int | |
| UuUnlock(const char *ttyname) | |
| { | |
| char tbuf[sizeof(PATH_LOCKFILENAME) + MAX_FILENAME]; | |
| (void) sprintf(tbuf, PATH_LOCKFILENAME, ttyname); | |
| return(unlink(tbuf)); | |
| } | |
| /* | |
| * GenerateMagic() | * GenerateMagic() |
| * | * |
| * Generate random number which will be used as magic number. | * Generate random number which will be used as magic number. |
| Line 1186 Bin2Hex(const unsigned char *bin, size_t len) | Line 1112 Bin2Hex(const unsigned char *bin, size_t len) |
| size_t i, j; | size_t i, j; |
| char *buf; | char *buf; |
| buf = Malloc(MB_UTIL, len * 2 + 1); | if (len > 0) { |
| for (i = j = 0; i < len; i++) { | buf = Malloc(MB_UTIL, len * 2 + 1); |
| buf[j++] = hexconvtab[bin[i] >> 4]; | for (i = j = 0; i < len; i++) { |
| buf[j++] = hexconvtab[bin[i] & 15]; | buf[j++] = hexconvtab[bin[i] >> 4]; |
| buf[j++] = hexconvtab[bin[i] & 15]; | |
| } | |
| buf[j] = 0; | |
| } else { | |
| buf = Malloc(MB_UTIL, 3); | |
| buf[0] = '0'; | |
| buf[1] = '0'; | |
| buf[2] = 0; | |
| } | } |
| buf[j] = 0; | |
| return buf; | return buf; |
| } | } |
| Line 1228 HexVal(char c) | Line 1161 HexVal(char c) |
| } | } |
| } | } |
| #ifndef USE_NG_PRED1 | |
| /* | /* |
| * Crc16() | * Crc16() |
| * | * |
| Line 1242 Crc16(u_short crc, u_char *cp, int len) | Line 1176 Crc16(u_short crc, u_char *cp, int len) |
| crc = (crc >> 8) ^ Crc16Table[(crc ^ *cp++) & 0xff]; | crc = (crc >> 8) ^ Crc16Table[(crc ^ *cp++) & 0xff]; |
| return(crc); | return(crc); |
| } | } |
| #endif | |
| /* | /* |
| * GetAnyIpAddress() | * GetAnyIpAddress() |
| Line 1434 GetEther(struct u_addr *addr, struct sockaddr_dl *hwad | Line 1369 GetEther(struct u_addr *addr, struct sockaddr_dl *hwad |
| ifreq.ifr_addr = ifr->ifr_addr; | ifreq.ifr_addr = ifr->ifr_addr; |
| /* Check that the interface is up, and not point-to-point or loopback */ | /* Check that the interface is up, and not point-to-point or loopback */ |
| if (ioctl(s, SIOCGIFFLAGS, &ifreq) < 0) | if (ioctl(s, SIOCGIFFLAGS, &ifreq) < 0) { |
| Log(LG_IFACE2, ("ioctl(SIOCGIFFLAGS, %s): %d", ifr->ifr_name, errno)); | |
| continue; | continue; |
| } | |
| if ((ifreq.ifr_flags & | if ((ifreq.ifr_flags & |
| (IFF_UP|IFF_BROADCAST|IFF_POINTOPOINT|IFF_LOOPBACK|IFF_NOARP)) | (IFF_UP|IFF_BROADCAST|IFF_POINTOPOINT|IFF_LOOPBACK|IFF_NOARP)) |
| != (IFF_UP|IFF_BROADCAST)) | != (IFF_UP|IFF_BROADCAST)) |
| Line 1514 GetPeerEther(struct u_addr *addr, struct sockaddr_dl * | Line 1451 GetPeerEther(struct u_addr *addr, struct sockaddr_dl * |
| mib[5] = 0; | mib[5] = 0; |
| #endif | #endif |
| if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) { | if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) { |
| Log(LG_ERR, ("route-sysctl-estimate")); | Perror("route-sysctl-estimate"); |
| return (0); | return (0); |
| } | } |
| if (needed == 0) /* empty table */ | if (needed == 0) /* empty table */ |