|
version 1.1.1.3, 2016/11/01 09:56:12
|
version 1.1.1.4.2.1, 2023/09/27 11:08:01
|
|
Line 15
|
Line 15
|
| #include <libutil.h> |
#include <libutil.h> |
| #include <netdb.h> |
#include <netdb.h> |
| #include <tcpd.h> |
#include <tcpd.h> |
| #include <sys/wait.h> | #include <sys/limits.h> |
| | #include <sys/socket.h> |
| #include <sys/sysctl.h> |
#include <sys/sysctl.h> |
| |
#include <sys/wait.h> |
| #include <net/route.h> |
#include <net/route.h> |
| #include <netinet/if_ether.h> |
#include <netinet/if_ether.h> |
| #include <net/ethernet.h> |
#include <net/ethernet.h> |
|
Line 80 static const u_int16_t Crc16Table[256] = {
|
Line 82 static const u_int16_t Crc16Table[256] = {
|
| */ |
*/ |
| |
|
| 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, size_t resultsize); |
| |
|
| static char HexVal(char c); |
static char HexVal(char c); |
| |
|
| static void IndexConfFile(FILE *fp, struct configfile **cf); |
static void IndexConfFile(FILE *fp, struct configfile **cf); |
| |
|
| struct configfiles *ConfigFilesIndex=NULL; | static struct configfiles *ConfigFilesIndex=NULL; |
| |
|
| #undef isspace |
#undef isspace |
| #define isspace(c) (((c)==' '||(c)=='\t'||(c)=='\n'||(c)=='\r')?1:0) |
#define isspace(c) (((c)==' '||(c)=='\t'||(c)=='\n'||(c)=='\r')?1:0) |
|
Line 118 int
|
Line 120 int
|
| ExecCmd(int log, const char *label, const char *fmt, ...) |
ExecCmd(int log, const char *label, const char *fmt, ...) |
| { |
{ |
| int rtn; |
int rtn; |
| char cmd[BIG_LINE_SIZE]; | char cmd[LINE_MAX]; |
| char cmdn[BIG_LINE_SIZE]; | char cmdn[LINE_MAX]; |
| va_list ap; |
va_list ap; |
| |
|
| va_start(ap, fmt); |
va_start(ap, fmt); |
|
Line 153 int
|
Line 155 int
|
| ExecCmdNosh(int log, const char *label, const char *fmt, ...) |
ExecCmdNosh(int log, const char *label, const char *fmt, ...) |
| { |
{ |
| int rtn; |
int rtn; |
| char cmd[BIG_LINE_SIZE]; | char cmd[LINE_MAX]; |
| char *cmdp = &(cmd[0]); |
char *cmdp = &(cmd[0]); |
| char *argv[256]; |
char *argv[256]; |
| char **arg; |
char **arg; |
|
Line 378 Escape(char *line)
|
Line 380 Escape(char *line)
|
| |
|
| int |
int |
| ReadFile(const char *filename, const char *target, |
ReadFile(const char *filename, const char *target, |
| int (*func)(Context ctx, int ac, char *av[], const char *file, int line), Context ctx) | int (*func)(Context ctx, int ac, const char *const av[], const char *file, int line), Context ctx) |
| { |
{ |
| FILE *fp; |
FILE *fp; |
| int ac; |
int ac; |
|
Line 409 ReadFile(const char *filename, const char *target,
|
Line 411 ReadFile(const char *filename, const char *target,
|
| break; |
break; |
| } |
} |
| ac = ParseLine(line, av, sizeof(av) / sizeof(*av), 0); |
ac = ParseLine(line, av, sizeof(av) / sizeof(*av), 0); |
| (*func)(ctx, ac, av, filename, lineNum); | (*func)(ctx, ac, (const char *const *)av, filename, lineNum); |
| } |
} |
| |
|
| /* Done */ |
/* Done */ |
|
Line 558 OpenConfFile(const char *name, struct configfile **cf)
|
Line 560 OpenConfFile(const char *name, struct configfile **cf)
|
| char * |
char * |
| ReadFullLine(FILE *fp, int *lineNum, char *result, int resultsize) |
ReadFullLine(FILE *fp, int *lineNum, char *result, int resultsize) |
| { |
{ |
| int len, linelen, resultlinesize, continuation; | int len, resultlinesize, continuation; |
| | unsigned linelen; |
| char line[BIG_LINE_SIZE]; |
char line[BIG_LINE_SIZE]; |
| char real_line[BIG_LINE_SIZE]; |
char real_line[BIG_LINE_SIZE]; |
| char *resultline; |
char *resultline; |
|
Line 626 ReadFullLine(FILE *fp, int *lineNum, char *result, int
|
Line 629 ReadFullLine(FILE *fp, int *lineNum, char *result, int
|
| */ |
*/ |
| |
|
| static char * |
static char * |
| ReadLine(FILE *fp, int *lineNum, char *result, int resultsize) | ReadLine(FILE *fp, int *lineNum, char *result, size_t resultsize) |
| { |
{ |
| int empty; |
int empty; |
| char *s; |
char *s; |
|
Line 919 GetInetSocket(int type, struct u_addr *addr, in_port_t
|
Line 922 GetInetSocket(int type, struct u_addr *addr, in_port_t
|
| |
|
| /* Get and bind non-blocking socket */ |
/* Get and bind non-blocking socket */ |
| |
|
| if ((sock = socket(sa.ss_family, type, type == SOCK_STREAM ? IPPROTO_TCP : 0)) < 0) | if ((sock = socket(sa.ss_family, socktype(type), type == SOCK_STREAM ? IPPROTO_TCP : 0)) < 0) |
| { |
{ |
| snprintf(ebuf, len, "socket: %s", strerror(errno)); |
snprintf(ebuf, len, "socket: %s", strerror(errno)); |
| return(-1); |
return(-1); |
|
Line 977 TcpGetListenPort(struct u_addr *addr, in_port_t port,
|
Line 980 TcpGetListenPort(struct u_addr *addr, in_port_t port,
|
| |
|
| /* Make socket available for connections */ |
/* Make socket available for connections */ |
| |
|
| if (listen(sock, -1) < 0) | if (listen(sock, INT_MAX) < 0) |
| { |
{ |
| Perror("%s: listen", __FUNCTION__); |
Perror("%s: listen", __FUNCTION__); |
| (void) close(sock); |
(void) close(sock); |
|
Line 1050 ShowMesg(int log, const char *pref, const char *buf, i
|
Line 1053 ShowMesg(int log, const char *pref, const char *buf, i
|
| |
|
| if (len > 0) |
if (len > 0) |
| { |
{ |
| if (len > sizeof(mesg) - 1) | if (len > (int)(sizeof(mesg) - 1)) |
| len = sizeof(mesg) - 1; |
len = sizeof(mesg) - 1; |
| memcpy(mesg, buf, len); |
memcpy(mesg, buf, len); |
| mesg[len] = 0; |
mesg[len] = 0; |
|
Line 1093 Bin2Hex(const unsigned char *bin, size_t len)
|
Line 1096 Bin2Hex(const unsigned char *bin, size_t len)
|
| u_char * |
u_char * |
| Hex2Bin(char *hexstr) |
Hex2Bin(char *hexstr) |
| { |
{ |
| int i; | unsigned i; |
| u_char *binval; |
u_char *binval; |
| |
|
| binval = Malloc(MB_UTIL, strlen(hexstr) / 2); |
binval = Malloc(MB_UTIL, strlen(hexstr) / 2); |
|
Line 1176 GetAnyIpAddress(struct u_addr *ipaddr, const char *ifn
|
Line 1179 GetAnyIpAddress(struct u_addr *ipaddr, const char *ifn
|
| close(s); |
close(s); |
| return(-1); |
return(-1); |
| } |
} |
| ipa = ((struct sockaddr_in *)&ifreq.ifr_ifru.ifru_addr)->sin_addr; | ipa = ((struct sockaddr_in *)(void *)&ifreq.ifr_ifru.ifru_addr)->sin_addr; |
| if ((ntohl(ipa.s_addr)>>24) == 127) |
if ((ntohl(ipa.s_addr)>>24) == 127) |
| ipa.s_addr = 0; /* We don't like 127.0.0.1 */ |
ipa.s_addr = 0; /* We don't like 127.0.0.1 */ |
| } |
} |
|
Line 1196 GetAnyIpAddress(struct u_addr *ipaddr, const char *ifn
|
Line 1199 GetAnyIpAddress(struct u_addr *ipaddr, const char *ifn
|
| } |
} |
| |
|
| /* if used size is too close to allocated size retry with a larger buffer */ |
/* if used size is too close to allocated size retry with a larger buffer */ |
| if (ifc.ifc_len + 128 < buffsize) | if ((unsigned)ifc.ifc_len + 128 < buffsize) |
| break; |
break; |
| |
|
| Freee(ifs); |
Freee(ifs); |
|
Line 1296 GetEther(struct u_addr *addr, struct sockaddr_dl *hwad
|
Line 1299 GetEther(struct u_addr *addr, struct sockaddr_dl *hwad
|
| } |
} |
| |
|
| /* if used size is too close to allocated size retry with a larger buffer */ |
/* if used size is too close to allocated size retry with a larger buffer */ |
| if (ifc.ifc_len + 128 < buffsize) | if ((unsigned)ifc.ifc_len + 128 < buffsize) |
| break; |
break; |
| |
|
| Freee(ifs); |
Freee(ifs); |
|
Line 1431 GetPeerEther(struct u_addr *addr, struct sockaddr_dl *
|
Line 1434 GetPeerEther(struct u_addr *addr, struct sockaddr_dl *
|
| } |
} |
| lim = buf + needed; |
lim = buf + needed; |
| for (next = buf; next < lim; next += rtm->rtm_msglen) { |
for (next = buf; next < lim; next += rtm->rtm_msglen) { |
| rtm = (struct rt_msghdr *)next; | rtm = (struct rt_msghdr *)(void *)next; |
| sin2 = (struct sockaddr_inarp *)(rtm + 1); |
sin2 = (struct sockaddr_inarp *)(rtm + 1); |
| if (addr->u.ip4.s_addr == sin2->sin_addr.s_addr) { |
if (addr->u.ip4.s_addr == sin2->sin_addr.s_addr) { |
| sdl = (struct sockaddr_dl *)((char *)sin2 + SA_SIZE(sin2)); | sdl = (struct sockaddr_dl *)(void *)((char *)sin2 + SA_SIZE(sin2)); |
| memcpy(hwaddr, sdl, sdl->sdl_len); |
memcpy(hwaddr, sdl, sdl->sdl_len); |
| found_entry = 1; |
found_entry = 1; |
| break; |
break; |
|
Line 1451 void
|
Line 1454 void
|
| ppp_util_ascify(char *buf, size_t bsiz, const char *data, size_t len) |
ppp_util_ascify(char *buf, size_t bsiz, const char *data, size_t len) |
| { |
{ |
| char *bp; |
char *bp; |
| int i; | unsigned i; |
| |
|
| for (bp = buf, i = 0; i < len; i++) { |
for (bp = buf, i = 0; i < len; i++) { |
| const char ch = (char)data[i]; |
const char ch = (char)data[i]; |
|
Line 1505 ether_ntoa_r(const struct ether_addr *n, char *a)
|
Line 1508 ether_ntoa_r(const struct ether_addr *n, char *a)
|
| return (a); |
return (a); |
| } |
} |
| #endif |
#endif |
| |
|
| |
int |
| |
IfaceSetFlag(const char *ifname, int value) |
| |
{ |
| |
struct ifreq my_ifr; |
| |
int s; |
| |
int flags; |
| |
|
| |
/* Get socket */ |
| |
if ((s = socket(PF_LOCAL, SOCK_DGRAM, 0)) < 0) { |
| |
Perror("Can't get socket to set flags"); |
| |
return(-1); |
| |
} |
| |
|
| |
memset(&my_ifr, 0, sizeof(my_ifr)); |
| |
(void) strlcpy(my_ifr.ifr_name, ifname, sizeof(my_ifr.ifr_name)); |
| |
|
| |
if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&my_ifr) < 0) { |
| |
Perror("ioctl (SIOCGIFFLAGS)"); |
| |
close(s); |
| |
return (-1); |
| |
} |
| |
flags = (my_ifr.ifr_flags & 0xffff) | (my_ifr.ifr_flagshigh << 16); |
| |
|
| |
if (value < 0) { |
| |
value = -value; |
| |
flags &= ~value; |
| |
} else |
| |
flags |= value; |
| |
my_ifr.ifr_flags = flags & 0xffff; |
| |
my_ifr.ifr_flagshigh = flags >> 16; |
| |
if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&my_ifr) < 0) { |
| |
Perror("ioctl (SIOCSIFFLAGS)"); |
| |
close(s); |
| |
return (-1); |
| |
} |
| |
close(s); |
| |
return (0); |
| |
} |
| |
|
| |
/* |
| |
* Obtain some data, peer (source) and destination addresses of SOCK_DGRAM IPv4 UDP request. |
| |
*/ |
| |
ssize_t GetDataAddrs(int sock, void *dbuf, size_t dbufsize, |
| |
struct sockaddr_storage *peer, socklen_t peer_len, |
| |
struct u_addr *addr) |
| |
{ |
| |
struct { |
| |
struct msghdr msg; |
| |
struct iovec iov; |
| |
} b; |
| |
union { /* ensure correct alignment for space */ |
| |
struct cmsghdr cm; |
| |
char space[CMSG_SPACE(sizeof(struct in_addr))]; |
| |
} buf; |
| |
|
| |
struct cmsghdr *p; |
| |
ssize_t size; |
| |
|
| |
/* Sanity check */ |
| |
if (addr->family != AF_INET) { |
| |
errno = EAFNOSUPPORT; |
| |
return (-1); |
| |
} |
| |
|
| |
b.msg.msg_name = peer; |
| |
b.msg.msg_namelen = peer_len; |
| |
b.msg.msg_iov = &b.iov; |
| |
b.msg.msg_iovlen = 1; |
| |
b.msg.msg_control = &buf; |
| |
b.msg.msg_controllen = sizeof(buf); |
| |
b.msg.msg_flags = 0; |
| |
|
| |
b.iov.iov_base = dbuf; |
| |
b.iov.iov_len = dbufsize; |
| |
|
| |
if ((size = recvmsg(sock, &b.msg, 0)) < 0) { |
| |
Perror("%s: recvmsg: %s", __FUNCTION__, strerror(errno)); |
| |
return (size); |
| |
} |
| |
|
| |
p = CMSG_FIRSTHDR(&b.msg); |
| |
if (p && p->cmsg_level == IPPROTO_IP && p->cmsg_type == IP_RECVDSTADDR) |
| |
memcpy(&addr->u.ip4, CMSG_DATA(p), sizeof(addr->u.ip4)); |
| |
|
| |
return (size); |
| |
} |
| |
|
| |
uint16_t GetSystemIfaceMTU(const char *ifname) |
| |
{ |
| |
struct ifreq ifr; |
| |
static int sock = -1; |
| |
|
| |
if (sock == -1 && |
| |
(sock = socket(PF_INET, socktype(SOCK_DGRAM), 0)) == -1) { |
| |
Perror("[%s] %s: Socket creation error", ifname, __FUNCTION__); |
| |
return (0); |
| |
} |
| |
|
| |
memset(&ifr, 0, sizeof(ifr)); |
| |
strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); |
| |
|
| |
if (ioctl(sock, SIOCGIFMTU, (caddr_t)&ifr) == -1) { |
| |
Perror("[%s] %s: SIOCGIFMTU failed", ifname, __FUNCTION__); |
| |
return (0); |
| |
} |
| |
/* Let _exit() close sock */ |
| |
return (ifr.ifr_mtu); |
| |
} |