natparse.c revision ab25eeb551a4be927a4b6ae2cf8aff7ed17decb4
/*
* Copyright (C) 1993-2001 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*/
#if !defined(lint)
static const char rcsid[] = "@(#)$Id: natparse.c,v 1.8.2.1 2004/12/09 19:41:21 darrenr Exp $";
#endif
#include <errno.h>
#include <ctype.h>
#include "ipf.h"
#include "opts.h"
void nat_setgroupmap(n)
ipnat_t *n;
{
n->in_ippip = 1;
else if (n->in_flags & IPN_AUTOPORTMAP) {
if (n->in_outmsk != 0xffffffff)
n->in_ippip++;
if (n->in_ippip == 0)
n->in_ippip = 1;
} else {
n->in_nip = 0;
n->in_ppip = 1;
}
}
char *line;
int linenum;
{
int i, cnt;
*s = '\0';
*s = '\0';
line++;
if (!*line)
return NULL;
cnt = 0;
if (cnt < 3) {
return NULL;
}
else {
return NULL;
}
cpp++;
cpp++;
cpp++;
return NULL;
}
} else if (**cpp == '!') {
return NULL;
}
}
return NULL;
}
cpp++;
return NULL;
return NULL;
} else {
return NULL;
return NULL;
}
cpp++;
} else if (**cpp == '!') {
(*cpp)++;
}
return NULL;
}
return NULL;
}
if (!*++cpp) {
return NULL;
}
return NULL;
return NULL;
} else {
return NULL;
return NULL;
}
} else {
s = *cpp;
if (!s)
return NULL;
t = strchr(s, '/');
if (!t)
return NULL;
*t++ = '\0';
return NULL;
return NULL;
}
} else {
return NULL;
return NULL;
}
}
cpp++;
if (!*cpp)
return NULL;
}
linenum);
return NULL;
}
cpp++;
if (!*cpp) {
"%d: missing fields (destination port)\n",
linenum);
return NULL;
}
*s++ = '\0';
else
s = NULL;
return NULL;
cpp++;
cpp++;
s = *cpp++;
}
if (s) {
return NULL;
} else
}
if (!*cpp) {
return NULL;
}
return NULL;
}
cpp++;
if (!*cpp) {
return NULL;
}
cpp++;
if (!*cpp) {
return NULL;
}
}
}
cpp++;
} else
*dnetm++ = '\0';
"%d: desination range not specified\n",
linenum);
return NULL;
}
cpp++;
}
"%d: missing fields (dest netmask)\n",
linenum);
return NULL;
}
if (*dnetm == '/')
*dnetm++ = '\0';
}
*dnetm++ = '\0';
}
return NULL;
} else {
return NULL;
}
cpp++;
"%d: expected \"ports\" - got \"%s\"\n",
return NULL;
}
cpp++;
if (*cpp) {
cpp++;
} else
linenum, "destination host for redirect");
return NULL;
}
/* If it's a in_redir, expect target port */
return NULL;
}
cpp++;
if (!*cpp) {
"%d: missing fields (destination port)\n",
linenum);
return NULL;
}
return NULL;
cpp++;
}
*dnetm++ = '\0';
return NULL;
return NULL;
} else {
return NULL;
return NULL;
if (!*cpp) {
proto = "tcp";
} else {
else {
}
cpp++;
cpp++;
}
cpp++;
}
cpp++;
if (!*cpp) {
"%d: age with no parameters\n",
linenum);
return NULL;
}
if (s != NULL)
else
cpp++;
}
cpp++;
if (*cpp) {
cpp++;
} else {
"%d: mssclamp with no parameters\n",
linenum);
return NULL;
}
}
if (*cpp) {
"%d: extra junk at the end of rdr: %s\n",
return NULL;
}
}
}
cpp++;
}
if (!*cpp)
return &ipn;
linenum);
return NULL;
}
cpp++;
if (!*cpp) {
"%d: missing parameter for \"proxy\"\n",
linenum);
return NULL;
}
cpp++;
if (!*cpp) {
"%d: missing parameter for \"port\"\n",
linenum);
return NULL;
}
cpp++;
if (!*cpp) {
"%d: missing parameter for \"proxy\"\n",
linenum);
return NULL;
}
} else {
"%d: missing keyword \"port\"\n", linenum);
return NULL;
}
*proto++ = '\0';
} else
return NULL;
cpp++;
if (*cpp) {
"%d: too many parameters for \"proxy\"\n",
linenum);
return NULL;
}
return &ipn;
}
cpp++;
if (!*cpp) {
"%d: icmpidmap misses protocol and range\n",
linenum);
return NULL;
};
else {
linenum);
return NULL;
}
cpp++;
if (!*cpp) {
linenum);
return NULL;
}
"%d: no icmp id range detected in \"%s\"\n",
return NULL;
}
*t++ = '\0';
return NULL;
linenum);
return NULL;
}
cpp++;
if (!*cpp) {
"%d: missing expression following portmap\n",
linenum);
return NULL;
}
else {
"%d: expected protocol name - got \"%s\"\n",
return NULL;
}
cpp++;
if (!*cpp) {
return NULL;
}
} else {
"%d: no port range in \"%s\"\n",
return NULL;
}
*t++ = '\0';
return NULL;
}
cpp++;
}
cpp++;
}
cpp++;
if (!*cpp) {
linenum);
return NULL;
}
if (s != NULL)
else
cpp++;
}
cpp++;
if (*cpp) {
cpp++;
} else {
linenum);
return NULL;
}
}
if (*cpp) {
return NULL;
}
return &ipn;
}
int fd;
char *file;
int opts;
{
char line[512], *s;
int linenum = 0;
exit(1);
}
} else
*s = '\0';
if (*line)
} else {
if (!(opts & OPT_DONOTHING)) {
if (!(opts & OPT_REMOVE)) {
perror("ioctl(SIOCADNAT)");
perror("ioctl(SIOCRMNAT)");
}
}
}
}
char *str;
int linenum;
{
int i;
if ((i<0) || (i>65535)) {
return 0;
}
return 1;
}