Module Name:    src
Committed By:   christos
Date:           Tue Dec 15 21:45:21 UTC 2015

Modified Files:
        src/usr.bin/ftp: fetch.c

Log Message:
Factor the proxy handling code out.


To generate a diff of this commit:
cvs rdiff -u -r1.211 -r1.212 src/usr.bin/ftp/fetch.c

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

Modified files:

Index: src/usr.bin/ftp/fetch.c
diff -u src/usr.bin/ftp/fetch.c:1.211 src/usr.bin/ftp/fetch.c:1.212
--- src/usr.bin/ftp/fetch.c:1.211	Tue Dec 15 16:01:27 2015
+++ src/usr.bin/ftp/fetch.c	Tue Dec 15 16:45:21 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: fetch.c,v 1.211 2015/12/15 21:01:27 christos Exp $	*/
+/*	$NetBSD: fetch.c,v 1.212 2015/12/15 21:45:21 christos Exp $	*/
 
 /*-
  * Copyright (c) 1997-2015 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: fetch.c,v 1.211 2015/12/15 21:01:27 christos Exp $");
+__RCSID("$NetBSD: fetch.c,v 1.212 2015/12/15 21:45:21 christos Exp $");
 #endif /* not lint */
 
 /*
@@ -605,6 +605,46 @@ handle_noproxy(const char *host, in_port
 	return isproxy;
 }
 
+static int
+handle_proxy(const char *penv, char **host, char **port, char **puser,
+    char **ppass, url_t *urltype)
+{
+	url_t purltype;
+	char *phost, *ppath;
+	char *pport;
+	in_port_t pportnum;
+
+	if (isipv6addr(*host) && strchr(*host, '%') != NULL) {
+		warnx("Scoped address notation `%s' disallowed via web proxy",
+		    *host);
+		return -1;
+	}
+
+	if (parse_url(penv, "proxy URL", &purltype, puser, ppass, &phost,
+	    &pport, &pportnum, &ppath) == -1)
+		return -1;
+
+	if ((!IS_HTTP_TYPE(purltype) && purltype != FTP_URL_T) ||
+	    EMPTYSTRING(phost) ||
+	    (! EMPTYSTRING(ppath) && strcmp(ppath, "/") != 0)) {
+		warnx("Malformed proxy URL `%s'", penv);
+		FREEPTR(phost);
+		FREEPTR(pport);
+		FREEPTR(ppath);
+		return -1;
+	}
+	FREEPTR(ppath);
+
+	FREEPTR(*host);
+	*host = phost;
+	FREEPTR(*port);
+	*port = pport;
+
+	*urltype = purltype;
+
+	return 0;
+}
+
 /*
  * Retrieve URL, via a proxy if necessary, using HTTP.
  * If proxyenv is set, use that for the proxy, otherwise try ftp_proxy or
@@ -763,10 +803,6 @@ fetch_url(const char *url, const char *p
 		}
 		direction = "retrieved";
 		if (! EMPTYSTRING(penv)) {			/* use proxy */
-			url_t purltype;
-			char *phost, *ppath;
-			char *pport;
-			in_port_t pportnum;
 
 			isproxy = handle_noproxy(host, portnum);
 
@@ -777,45 +813,18 @@ fetch_url(const char *url, const char *p
 
 			if (isproxy) {
 				if (restart_point) {
-					warnx("Can't restart via proxy URL `%s'",
+					warnx(
+					    "Can't restart via proxy URL `%s'",
 					    penv);
 					goto cleanup_fetch_url;
 				}
-				if (parse_url(penv, "proxy URL", &purltype,
-				    &puser, &ppass, &phost, &pport, &pportnum,
-				    &ppath) == -1)
-					goto cleanup_fetch_url;
-
-				if ((!IS_HTTP_TYPE(purltype)
-				     && purltype != FTP_URL_T) ||
-				    EMPTYSTRING(phost) ||
-				    (! EMPTYSTRING(ppath)
-				     && strcmp(ppath, "/") != 0)) {
-					warnx("Malformed proxy URL `%s'", penv);
-					FREEPTR(phost);
-					FREEPTR(pport);
-					FREEPTR(ppath);
-					goto cleanup_fetch_url;
-				}
-				if (isipv6addr(host) &&
-				    strchr(host, '%') != NULL) {
-					warnx(
-"Scoped address notation `%s' disallowed via web proxy",
-					    host);
-					FREEPTR(phost);
-					FREEPTR(pport);
-					FREEPTR(ppath);
+				if (handle_proxy(penv, &host, &port,
+				    &puser, &ppass, &urltype) < 0) {
 					goto cleanup_fetch_url;
+				} else {
+				    FREEPTR(path);
+				    path = ftp_strdup(url);
 				}
-
-				FREEPTR(host);
-				host = phost;
-				FREEPTR(port);
-				port = pport;
-				FREEPTR(path);
-				path = ftp_strdup(url);
-				FREEPTR(ppath);
-				urltype = purltype;
 			}
 		} /* ! EMPTYSTRING(penv) */
 

Reply via email to