Module Name:    src
Committed By:   darrenr
Date:           Mon Jan 30 16:14:27 UTC 2012

Modified Files:
        src/dist/pf/usr.sbin/ftp-proxy: ipf.c

Log Message:
Update ftp-proxy for changes to ipnat_t


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/dist/pf/usr.sbin/ftp-proxy/ipf.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/dist/pf/usr.sbin/ftp-proxy/ipf.c
diff -u src/dist/pf/usr.sbin/ftp-proxy/ipf.c:1.3 src/dist/pf/usr.sbin/ftp-proxy/ipf.c:1.4
--- src/dist/pf/usr.sbin/ftp-proxy/ipf.c:1.3	Wed Feb  2 02:20:26 2011
+++ src/dist/pf/usr.sbin/ftp-proxy/ipf.c	Mon Jan 30 16:14:27 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: ipf.c,v 1.3 2011/02/02 02:20:26 rmind Exp $	*/
+/*	$NetBSD: ipf.c,v 1.4 2012/01/30 16:14:27 darrenr Exp $	*/
 
 /*
  * Copyright (c) 2004, 2008 The NetBSD Foundation, Inc.
@@ -151,7 +151,7 @@ ftp_proxy_entry_find(u_int32_t id)
 }
 
 static int
-ftp_proxy_entry_add_nat(struct ftp_proxy_entry *fpe, ipnat_t ipn)
+ftp_proxy_entry_add_nat(struct ftp_proxy_entry *fpe, ipnat_t *ipn)
 {
 	struct ftp_proxy_nat *fpn;
 
@@ -159,22 +159,22 @@ ftp_proxy_entry_add_nat(struct ftp_proxy
 	if (fpn == NULL)
 		return (-1);
 
-	memcpy(&fpn->ipn, &ipn, sizeof(fpn->ipn));
+	memcpy(&fpn->ipn, ipn, sizeof(fpn->ipn));
 	LIST_INSERT_HEAD(&fpe->nat_entries, fpn, link);
 
 	return (0);
 }
 
 static int
-ipfilter_add_nat(ipnat_t ipn)
+ipfilter_add_nat(ipnat_t *ipn)
 {
 	ipfobj_t obj;
 
 	memset(&obj, 0, sizeof(obj));
 	obj.ipfo_rev = IPFILTER_VERSION;
-	obj.ipfo_size = sizeof(ipn);
+	obj.ipfo_size = ipn->in_size;
 	obj.ipfo_type = IPFOBJ_IPNAT;
-	obj.ipfo_ptr = &ipn;
+	obj.ipfo_ptr = ipn;
 
 	return ioctl(natfd, SIOCADNAT, &obj);
 }
@@ -224,7 +224,7 @@ ipf_add_rdr(u_int32_t id, struct sockadd
     u_int16_t d_port, struct sockaddr *rdr, u_int16_t rdr_port)
 {
 	struct ftp_proxy_entry *fpe = ftp_proxy_entry_find(id);
-	ipnat_t ipn;
+	ipnat_t *ipn;
 
 	if (fpe == NULL) {
 		errno = ENOENT;
@@ -237,98 +237,48 @@ ipf_add_rdr(u_int32_t id, struct sockadd
 		return (-1);
 	}
 
-	memset(&ipn, 0, sizeof(ipn));
-	ipn.in_redir = NAT_REDIRECT;
-	ipn.in_v = 4;
-	ipn.in_outip = satosin(dst)->sin_addr.s_addr;
-	ipn.in_outmsk = 0xffffffff;
-	strlcpy(ipn.in_ifnames[0], netif, sizeof(ipn.in_ifnames[0]));
-	strlcpy(ipn.in_ifnames[1], netif, sizeof(ipn.in_ifnames[1]));
-	ipn.in_pmin = htons(d_port);
-	ipn.in_pmax = htons(d_port);
-	ipn.in_inip = satosin(rdr)->sin_addr.s_addr;
-	ipn.in_inmsk  = 0xffffffff;
-	ipn.in_pnext = htons(rdr_port);
-	ipn.in_flags = IPN_FIXEDDPORT | IPN_TCP;
-	strlcpy(ipn.in_tag.ipt_tag, fpe->proxy_tag, sizeof(ipn.in_tag.ipt_tag));
-
-	if (ipfilter_add_nat(ipn) == -1)
+	ipn = calloc(1, sizeof(*ipn) + 2 * IF_NAMESIZE + 2);
+	if (ipn == NULL) {
+		errno = ENOMEM;
 		return (-1);
+	}
+	ipn->in_redir = NAT_REDIRECT;
+	ipn->in_v[0] = 4;
+	ipn->in_v[1] = 4;
+	ipn->in_odstaddr = satosin(dst)->sin_addr.s_addr;
+	ipn->in_odstmsk = 0xffffffff;
+	ipn->in_odport = htons(d_port);
+	ipn->in_dtop = htons(d_port);
+	ipn->in_ndstaddr = satosin(rdr)->sin_addr.s_addr;
+	ipn->in_ndstmsk  = 0xffffffff;
+	ipn->in_dpnext = htons(rdr_port);
+	ipn->in_flags = IPN_FIXEDDPORT | IPN_TCP;
+	strlcpy(ipn->in_tag.ipt_tag, fpe->proxy_tag,
+	    sizeof(ipn->in_tag.ipt_tag));
+
+	ipn->in_ifnames[0] = 0;
+	(void) strlcpy(ipn->in_names, netif, IF_NAMESIZE);
+	ipn->in_namelen = strlen(ipn->in_names) + 1;
+	ipn->in_ifnames[1] = ipn->in_namelen;
+	(void) strlcpy(ipn->in_names + ipn->in_namelen, netif, IF_NAMESIZE);
+	ipn->in_namelen += strlen(ipn->in_names + ipn->in_ifnames[1]) + 1;
+	ipn->in_size = sizeof(*ipn) + ipn->in_namelen;
 
-	if (ftp_proxy_entry_add_nat(fpe, ipn) == -1)
+	if (ipfilter_add_nat(ipn) == -1) {
+		free(ipn);
 		return (-1);
+	}
 
-	fpe->status = 1;
-
-	return (0);
-}
-
-#if 0
-int
-ipf_add_rdr(u_int32_t id, struct sockaddr *src, struct sockaddr *dst,
-    u_int16_t d_port, struct sockaddr *rdr, u_int16_t rdr_port)
-{
-	u_32_t sum1, sum2, sumd;
-	int onoff, error;
-	nat_save_t ns;
-	ipfobj_t obj;
-	nat_t *nat;
-
-	if (!src || !dst || !d_port || !rdr || !rdr_port ||
-	    (src->sa_family != rdr->sa_family)) {
-		errno = EINVAL;
+	if (ftp_proxy_entry_add_nat(fpe, ipn) == -1) {
+		free(ipn);
 		return (-1);
 	}
 
-	memset(&ns, 0, sizeof(ns));
-
-	nat = &ns.ipn_nat;
-	nat->nat_p = IPPROTO_TCP;
-	nat->nat_dir = NAT_OUTBOUND;
-	nat->nat_redir = NAT_REDIRECT;
-	strlcpy(nat->nat_ifnames[0], netif, sizeof(nat->nat_ifnames[0]));
-	strlcpy(nat->nat_ifnames[1], netif, sizeof(nat->nat_ifnames[1]));
-
-	nat->nat_inip = satosin(rdr)->sin_addr;
-	nat->nat_outip = satosin(dst)->sin_addr;
-	nat->nat_oip = satosin(src)->sin_addr;
-
-	sum1 = LONG_SUM(ntohl(nat->nat_inip.s_addr)) + rdr_port;
-	sum2 = LONG_SUM(ntohl(nat->nat_outip.s_addr)) + d_port;
-	CALC_SUMD(sum1, sum2, sumd);
-	nat->nat_sumd[0] = (sumd & 0xffff) + (sumd >> 16);
-	nat->nat_sumd[1] = nat->nat_sumd[0];
-
-	sum1 = LONG_SUM(ntohl(nat->nat_inip.s_addr));
-	sum2 = LONG_SUM(ntohl(nat->nat_outip.s_addr));
-	CALC_SUMD(sum1, sum2, sumd);
-	nat->nat_ipsumd = (sumd & 0xffff) + (sumd >> 16);
-
-	nat->nat_inport = htons(rdr_port);
-	nat->nat_outport = htons(d_port);
-	nat->nat_oport = satosin(src)->sin_port;
-
-	nat->nat_flags = IPN_TCPUDP;
-
-	memset(&obj, 0, sizeof(obj));
-	obj.ipfo_rev = IPFILTER_VERSION;
-	obj.ipfo_size = sizeof(ns);
-	obj.ipfo_ptr = &ns;
-	obj.ipfo_type = IPFOBJ_NATSAVE;
-
-	error = 0;
-	onoff = 1;
-	if (ioctl(natfd, SIOCSTLCK, &onoff) == -1)
-		return (-1);
-	if (ioctl(natfd, SIOCSTPUT, &obj) == -1)
-		error = -1;
-	onoff = 0;
-	if (ioctl(natfd, SIOCSTLCK, &onoff) == -1)
-		error = -1;
+	fpe->status = 1;
+	free(ipn);
 
-	return (error);
+	return (0);
 }
-#endif
 
 int
 ipf_do_commit(void)

Reply via email to