--- iptables-1.2.9/extensions/libipt_REDIRECT.c.vns 2003-03-02 19:16:45 +0300 +++ iptables-1.2.9/extensions/libipt_REDIRECT.c 2004-03-23 16:02:35 +0300 @@ -37,9 +37,38 @@ *nfcache |= NFC_UNKNOWN; } +/* Convert service name to port number */ +static int +port_from_service(const char *arg, u_int16_t proto) +{ + const char *dash; + struct servent *se; + const char *proto_s; + + proto_s = proto == IPPROTO_TCP ? "tcp" : "udp"; + + dash = strchr(arg, '-'); + if (!dash) { + se = getservbyname(arg, proto_s); + if(se != NULL) + return ntohs(se->s_port); + } else { + char *name; + name = malloc(dash - arg + 1); + if(name != NULL) { + strncpy(name, arg, dash - arg); + name[dash - arg] = '\0'; + se = getservbyname(name, proto_s); + if(se != NULL) + return ntohs(se->s_port); + } + } + return 0; +} + /* Parses ports */ static void -parse_ports(const char *arg, struct ip_nat_multi_range *mr) +parse_ports(const char *arg, struct ip_nat_multi_range *mr, u_int16_t proto) { const char *dash; int port; @@ -47,6 +76,8 @@ mr->range[0].flags |= IP_NAT_RANGE_PROTO_SPECIFIED; port = atoi(arg); + if (port == 0) + port = port_from_service(arg, proto); if (port == 0 || port > 65535) exit_error(PARAMETER_PROBLEM, "Port `%s' not valid\n", arg); @@ -59,6 +90,8 @@ int maxport; maxport = atoi(dash + 1); + if (maxport == 0) + maxport = port_from_service(arg, proto); if (maxport == 0 || maxport > 65535) exit_error(PARAMETER_PROBLEM, "Port `%s' not valid\n", dash+1); @@ -98,7 +131,7 @@ exit_error(PARAMETER_PROBLEM, "Unexpected `!' after --to-ports"); - parse_ports(optarg, mr); + parse_ports(optarg, mr, entry->ip.proto); return 1; default: --- iptables-1.2.9/extensions/libipt_MASQUERADE.c.vns 2003-11-01 21:32:28 +0300 +++ iptables-1.2.9/extensions/libipt_MASQUERADE.c 2004-03-23 16:16:35 +0300 @@ -37,9 +37,38 @@ *nfcache |= NFC_UNKNOWN; } +/* Convert service name to port number */ +static int +port_from_service(const char *arg, u_int16_t proto) +{ + const char *dash; + struct servent *se; + const char *proto_s; + + proto_s = proto == IPPROTO_TCP ? "tcp" : "udp"; + + dash = strchr(arg, '-'); + if (!dash) { + se = getservbyname(arg, proto_s); + if(se != NULL) + return ntohs(se->s_port); + } else { + char *name; + name = malloc(dash - arg + 1); + if(name != NULL) { + strncpy(name, arg, dash - arg); + name[dash - arg] = '\0'; + se = getservbyname(name, proto_s); + if(se != NULL) + return ntohs(se->s_port); + } + } + return 0; +} + /* Parses ports */ static void -parse_ports(const char *arg, struct ip_nat_multi_range *mr) +parse_ports(const char *arg, struct ip_nat_multi_range *mr, u_int16_t proto) { const char *dash; int port; @@ -47,6 +76,8 @@ mr->range[0].flags |= IP_NAT_RANGE_PROTO_SPECIFIED; port = atoi(arg); + if (port == 0) + port = port_from_service(arg, proto); if (port <= 0 || port > 65535) exit_error(PARAMETER_PROBLEM, "Port `%s' not valid\n", arg); @@ -59,6 +90,8 @@ int maxport; maxport = atoi(dash + 1); + if (maxport == 0) + maxport = port_from_service(arg, proto); if (maxport == 0 || maxport > 65535) exit_error(PARAMETER_PROBLEM, "Port `%s' not valid\n", dash+1); @@ -98,7 +131,7 @@ exit_error(PARAMETER_PROBLEM, "Unexpected `!' after --to-ports"); - parse_ports(optarg, mr); + parse_ports(optarg, mr, entry->ip.proto); return 1; default: