summaryrefslogtreecommitdiffstats
path: root/usr.sbin/ppp/alias_cmd.c
diff options
context:
space:
mode:
authorbrian <brian@FreeBSD.org>1997-05-23 05:34:15 +0000
committerbrian <brian@FreeBSD.org>1997-05-23 05:34:15 +0000
commita62138d5f09e17248035b6b0345c3f7dc4beb4a9 (patch)
treef4a1d374797d6f9b30e04f39a16b94ecb098bf8d /usr.sbin/ppp/alias_cmd.c
parent33deb302feea8aae1099d3a563d218206f1841a0 (diff)
downloadFreeBSD-src-a62138d5f09e17248035b6b0345c3f7dc4beb4a9.zip
FreeBSD-src-a62138d5f09e17248035b6b0345c3f7dc4beb4a9.tar.gz
Finish updating for the latest alias code.
Submitted by: Charles Mott <cmott@srv.net>
Diffstat (limited to 'usr.sbin/ppp/alias_cmd.c')
-rw-r--r--usr.sbin/ppp/alias_cmd.c211
1 files changed, 211 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);
+}
+
OpenPOWER on IntegriCloud