diff options
author | brian <brian@FreeBSD.org> | 1997-05-23 05:34:15 +0000 |
---|---|---|
committer | brian <brian@FreeBSD.org> | 1997-05-23 05:34:15 +0000 |
commit | a62138d5f09e17248035b6b0345c3f7dc4beb4a9 (patch) | |
tree | f4a1d374797d6f9b30e04f39a16b94ecb098bf8d | |
parent | 33deb302feea8aae1099d3a563d218206f1841a0 (diff) | |
download | FreeBSD-src-a62138d5f09e17248035b6b0345c3f7dc4beb4a9.zip FreeBSD-src-a62138d5f09e17248035b6b0345c3f7dc4beb4a9.tar.gz |
Finish updating for the latest alias code.
Submitted by: Charles Mott <cmott@srv.net>
-rw-r--r-- | usr.sbin/ppp/alias_cmd.c | 211 | ||||
-rw-r--r-- | usr.sbin/ppp/alias_cmd.h | 5 | ||||
-rw-r--r-- | usr.sbin/ppp/nat_cmd.c | 211 | ||||
-rw-r--r-- | usr.sbin/ppp/nat_cmd.h | 5 |
4 files changed, 432 insertions, 0 deletions
diff --git a/usr.sbin/ppp/alias_cmd.c b/usr.sbin/ppp/alias_cmd.c new file mode 100644 index 0000000..999b5a7 --- /dev/null +++ b/usr.sbin/ppp/alias_cmd.c @@ -0,0 +1,211 @@ +#include <limits.h> +#include <netdb.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> + +#include "command.h" +#include "vars.h" + +#include "alias.h" + +static int +StrToAddr (char *, struct in_addr* addr); + +static int +StrToPort (char *, u_short *port, char *proto); + +static int +StrToAddrAndPort (char *, struct in_addr *addr, u_short *port, char *proto); + + +int +AliasRedirectPort (struct cmdtab *list, + int argc, + char **argv, + void *param) +{ + if (argc == 3) + { + char proto_constant; + char *proto; + u_short local_port; + u_short alias_port; + int error; + struct in_addr local_addr; + struct in_addr null_addr; + struct alias_link *link; + + proto = argv[0]; + if (strcmp(proto, "tcp") == 0) + { + proto_constant = IPPROTO_TCP; + } + else if (strcmp(proto, "udp") == 0) + { + proto_constant = IPPROTO_UDP; + } + else + { + printf("port redirect: protocol must be tcp or udp\n"); + printf("Usage: alias %s %s\n", list->name, list->syntax); + return 1; + } + + error = StrToAddrAndPort(argv[1], &local_addr, &local_port, proto); + if (error) + { + printf("port redirect: error reading local addr:port\n"); + printf("Usage: alias %s %s\n", list->name, list->syntax); + return 1; + } + + error = StrToPort(argv[2], &alias_port, proto); + if (error) + { + printf("port redirect: error reading alias port\n"); + printf("Usage: alias %s %s\n", list->name, list->syntax); + return 1; + } + + null_addr.s_addr = 0; + + link = PacketAliasRedirectPort(local_addr, local_port, + null_addr, 0, + null_addr, alias_port, + proto_constant); + + if (link == NULL) + printf("port redirect: error returned by packed aliasing engine" + "(code=%d)\n", error); + + return 1; + } + + printf("Usage: alias %s %s\n", list->name, list->syntax); + return 1; +} + + +int +AliasRedirectAddr(struct cmdtab *list, + int argc, + char **argv, + void *param) +{ + if (argc == 2) + { + int error; + struct in_addr local_addr; + struct in_addr alias_addr; + struct alias_link *link; + + error = StrToAddr(argv[0], &local_addr); + if (error) + { + printf("address redirect: invalid local address\n"); + return 1; + } + + error = StrToAddr(argv[1], &alias_addr); + if (error) + { + printf("address redirect: invalid alias address\n"); + printf("Usage: alias %s %s\n", list->name, list->syntax); + return 1; + } + + link = PacketAliasRedirectAddr(local_addr, alias_addr); + if (link == NULL) + { + printf("address redirect: packet aliasing engine error\n"); + printf("Usage: alias %s %s\n", list->name, list->syntax); + } + + return 1; + } + + printf("Usage: alias %s %s\n", list->name, list->syntax); + return 1; +} + + +static int +StrToAddr (char* str, + struct in_addr* addr) +{ + struct hostent* hp; + + if (inet_aton (str, addr)) + return 0; + + hp = gethostbyname (str); + if (!hp) + { + fprintf (stderr, "Unknown host %s.\n", str); + return -1; + } + + *addr = *((struct in_addr *) hp->h_addr); + return 0; +} + + +static int +StrToPort (char *str, + u_short *port, + char *proto) +{ + int iport; + struct servent* sp; + char* end; + + iport = strtol (str, &end, 10); + if (end != str) + { + *port = htons(iport); + return 0; + } + + sp = getservbyname (str, proto); + if (!sp) + { + fprintf (stderr, "Unknown port or service %s/%s.\n", + str, proto); + return -1; + } + + *port = sp->s_port; + return 0; +} + + +int +StrToAddrAndPort (char* str, + struct in_addr* addr, + u_short *port, + char *proto) +{ + char *ptr; + + ptr = strchr (str, ':'); + if (!ptr) + { + fprintf (stderr, "%s is missing port number.\n", str); + return -1; + } + + *ptr = '\0'; + ++ptr; + + if (StrToAddr (str, addr) != 0) + return -1; + + return StrToPort (ptr, port, proto); +} + diff --git a/usr.sbin/ppp/alias_cmd.h b/usr.sbin/ppp/alias_cmd.h new file mode 100644 index 0000000..1063bb9 --- /dev/null +++ b/usr.sbin/ppp/alias_cmd.h @@ -0,0 +1,5 @@ +extern int +AliasRedirectPort (struct cmdtab *, int, char **, void *); + +extern int +AliasRedirectAddr (struct cmdtab *, int, char **, void *); diff --git a/usr.sbin/ppp/nat_cmd.c b/usr.sbin/ppp/nat_cmd.c new file mode 100644 index 0000000..999b5a7 --- /dev/null +++ b/usr.sbin/ppp/nat_cmd.c @@ -0,0 +1,211 @@ +#include <limits.h> +#include <netdb.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> + +#include "command.h" +#include "vars.h" + +#include "alias.h" + +static int +StrToAddr (char *, struct in_addr* addr); + +static int +StrToPort (char *, u_short *port, char *proto); + +static int +StrToAddrAndPort (char *, struct in_addr *addr, u_short *port, char *proto); + + +int +AliasRedirectPort (struct cmdtab *list, + int argc, + char **argv, + void *param) +{ + if (argc == 3) + { + char proto_constant; + char *proto; + u_short local_port; + u_short alias_port; + int error; + struct in_addr local_addr; + struct in_addr null_addr; + struct alias_link *link; + + proto = argv[0]; + if (strcmp(proto, "tcp") == 0) + { + proto_constant = IPPROTO_TCP; + } + else if (strcmp(proto, "udp") == 0) + { + proto_constant = IPPROTO_UDP; + } + else + { + printf("port redirect: protocol must be tcp or udp\n"); + printf("Usage: alias %s %s\n", list->name, list->syntax); + return 1; + } + + error = StrToAddrAndPort(argv[1], &local_addr, &local_port, proto); + if (error) + { + printf("port redirect: error reading local addr:port\n"); + printf("Usage: alias %s %s\n", list->name, list->syntax); + return 1; + } + + error = StrToPort(argv[2], &alias_port, proto); + if (error) + { + printf("port redirect: error reading alias port\n"); + printf("Usage: alias %s %s\n", list->name, list->syntax); + return 1; + } + + null_addr.s_addr = 0; + + link = PacketAliasRedirectPort(local_addr, local_port, + null_addr, 0, + null_addr, alias_port, + proto_constant); + + if (link == NULL) + printf("port redirect: error returned by packed aliasing engine" + "(code=%d)\n", error); + + return 1; + } + + printf("Usage: alias %s %s\n", list->name, list->syntax); + return 1; +} + + +int +AliasRedirectAddr(struct cmdtab *list, + int argc, + char **argv, + void *param) +{ + if (argc == 2) + { + int error; + struct in_addr local_addr; + struct in_addr alias_addr; + struct alias_link *link; + + error = StrToAddr(argv[0], &local_addr); + if (error) + { + printf("address redirect: invalid local address\n"); + return 1; + } + + error = StrToAddr(argv[1], &alias_addr); + if (error) + { + printf("address redirect: invalid alias address\n"); + printf("Usage: alias %s %s\n", list->name, list->syntax); + return 1; + } + + link = PacketAliasRedirectAddr(local_addr, alias_addr); + if (link == NULL) + { + printf("address redirect: packet aliasing engine error\n"); + printf("Usage: alias %s %s\n", list->name, list->syntax); + } + + return 1; + } + + printf("Usage: alias %s %s\n", list->name, list->syntax); + return 1; +} + + +static int +StrToAddr (char* str, + struct in_addr* addr) +{ + struct hostent* hp; + + if (inet_aton (str, addr)) + return 0; + + hp = gethostbyname (str); + if (!hp) + { + fprintf (stderr, "Unknown host %s.\n", str); + return -1; + } + + *addr = *((struct in_addr *) hp->h_addr); + return 0; +} + + +static int +StrToPort (char *str, + u_short *port, + char *proto) +{ + int iport; + struct servent* sp; + char* end; + + iport = strtol (str, &end, 10); + if (end != str) + { + *port = htons(iport); + return 0; + } + + sp = getservbyname (str, proto); + if (!sp) + { + fprintf (stderr, "Unknown port or service %s/%s.\n", + str, proto); + return -1; + } + + *port = sp->s_port; + return 0; +} + + +int +StrToAddrAndPort (char* str, + struct in_addr* addr, + u_short *port, + char *proto) +{ + char *ptr; + + ptr = strchr (str, ':'); + if (!ptr) + { + fprintf (stderr, "%s is missing port number.\n", str); + return -1; + } + + *ptr = '\0'; + ++ptr; + + if (StrToAddr (str, addr) != 0) + return -1; + + return StrToPort (ptr, port, proto); +} + diff --git a/usr.sbin/ppp/nat_cmd.h b/usr.sbin/ppp/nat_cmd.h new file mode 100644 index 0000000..1063bb9 --- /dev/null +++ b/usr.sbin/ppp/nat_cmd.h @@ -0,0 +1,5 @@ +extern int +AliasRedirectPort (struct cmdtab *, int, char **, void *); + +extern int +AliasRedirectAddr (struct cmdtab *, int, char **, void *); |