From 1e594f519a113ba624c1b2ef3271eecf437850e7 Mon Sep 17 00:00:00 2001 From: ru Date: Wed, 3 May 2000 15:06:45 +0000 Subject: New option: -redirect_proto. --- sbin/natd/natd.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) (limited to 'sbin/natd/natd.c') diff --git a/sbin/natd/natd.c b/sbin/natd/natd.c index c03a7ae..6bb3584 100644 --- a/sbin/natd/natd.c +++ b/sbin/natd/natd.c @@ -89,6 +89,7 @@ static void RefreshAddr (int); static void ParseOption (const char* option, const char* parms, int cmdLine); static void ReadConfigFile (const char* fileName); static void SetupPortRedirect (const char* parms); +static void SetupProtoRedirect(const char* parms); static void SetupAddressRedirect (const char* parms); static void SetupPptpAlias (const char* parms); static void StrToAddr (const char* str, struct in_addr* addr); @@ -861,6 +862,7 @@ enum Option { AliasAddress, InterfaceName, RedirectPort, + RedirectProto, RedirectAddress, ConfigFile, DynamicMode, @@ -1031,6 +1033,14 @@ static struct OptionInfo optionTable[] = { "redirect_port", NULL }, + { RedirectProto, + 0, + String, + "proto local_addr [public_addr] [remote_addr]", + "redirect packets of a given proto", + "redirect_proto", + NULL }, + { RedirectAddress, 0, String, @@ -1200,6 +1210,10 @@ static void ParseOption (const char* option, const char* parms, int cmdLine) SetupPortRedirect (strValue); break; + case RedirectProto: + SetupProtoRedirect(strValue); + break; + case RedirectAddress: SetupAddressRedirect (strValue); break; @@ -1488,6 +1502,62 @@ void SetupPortRedirect (const char* parms) } } +void +SetupProtoRedirect(const char* parms) +{ + char buf[128]; + char* ptr; + struct in_addr localAddr; + struct in_addr publicAddr; + struct in_addr remoteAddr; + int proto; + char* protoName; + struct protoent *protoent; + + strcpy (buf, parms); +/* + * Extract protocol. + */ + protoName = strtok(buf, " \t"); + if (!protoName) + errx(1, "redirect_proto: missing protocol"); + + protoent = getprotobyname(protoName); + if (protoent == NULL) + errx(1, "redirect_proto: unknown protocol %s", protoName); + else + proto = protoent->p_proto; +/* + * Extract local address. + */ + ptr = strtok(NULL, " \t"); + if (!ptr) + errx(1, "redirect_proto: missing local address"); + else + StrToAddr(ptr, &localAddr); +/* + * Extract optional public address. + */ + ptr = strtok(NULL, " \t"); + if (ptr) + StrToAddr(ptr, &publicAddr); + else + publicAddr.s_addr = INADDR_ANY; +/* + * Extract optional remote address. + */ + ptr = strtok(NULL, " \t"); + if (ptr) + StrToAddr(ptr, &remoteAddr); + else + remoteAddr.s_addr = INADDR_ANY; +/* + * Create aliasing link. + */ + (void)PacketAliasRedirectProto(localAddr, remoteAddr, publicAddr, + proto); +} + void SetupAddressRedirect (const char* parms) { char buf[128]; -- cgit v1.1