]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Add an option to specify a source address.
authorGraham Leggett <minfrin@apache.org>
Wed, 22 Nov 2023 17:19:49 +0000 (17:19 +0000)
committerGraham Leggett <minfrin@apache.org>
Wed, 22 Nov 2023 17:19:49 +0000 (17:19 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1914045 13f79535-47bb-0310-9956-ffa450edef68

changes-entries/ab-source-address.txt [new file with mode: 0644]
docs/man/ab.1
support/ab.c

diff --git a/changes-entries/ab-source-address.txt b/changes-entries/ab-source-address.txt
new file mode 100644 (file)
index 0000000..7ddbeea
--- /dev/null
@@ -0,0 +1,4 @@
+
+  *) Add an option to specify a source address. PR32524
+     [Daniel Rench <gauze omnimental tmetic com>]
+
index e64e02503f2f1518c643b2cab3d5ce41f28c03f3..64d5865fc3ae529ddf934674a11c4d15c9fc9209 100644 (file)
@@ -136,6 +136,9 @@ String to use as attributes for \fB<table>\fR\&. Attributes are inserted \fB<tab
 \fB-X \fIproxy\fR[:\fIport\fR]\fR
 Use a proxy server for the requests\&.  
 .TP
+\fB-o \fIsrc_address\fR\fR
+Set the local source address\&.  
+.TP
 \fB-y \fI<tr>-attributes\fR\fR
 String to use as attributes for \fB<tr>\fR\&.  
 .TP
index dfca869710aa049a8471d271d561df7271194fc9..664c4f8bb1d66d6a8354158594c9672f462eca29 100644 (file)
@@ -435,6 +435,7 @@ int bind_count = 0;
 const char **bind_hosts;
 apr_sockaddr_t **bind_addrs;
 apr_port_t connectport;
+char *src_address;
 const char *gnuplot;          /* GNUplot file */
 const char *csvperc;          /* CSV Percentile file */
 const char *fullurl;
@@ -1613,6 +1614,7 @@ static void start_connection(struct connection * c)
 {
     struct worker *worker = c->worker;
     apr_status_t rv;
+    apr_sockaddr_t *from;
 
     if (!worker_can_connect(worker)) {
         return;
@@ -1678,6 +1680,14 @@ static void start_connection(struct connection * c)
         }
     }
 
+    if (src_address) {
+        if ((rv = apr_sockaddr_info_get(&from, src_address, destsa->family,
+                0, 0, c->ctx)) != APR_SUCCESS)
+                graceful_strerror("src_address get", rv);
+        if ((rv = apr_socket_bind(c->aprsock, from)) != APR_SUCCESS)
+            graceful_strerror("src_address bind", rv);
+    }
+
     c->read = 0;
     c->bread = 0;
     c->length = 0;
@@ -2790,6 +2800,7 @@ static void usage(const char *progname)
     fprintf(stderr, "    -P attribute    Add Basic Proxy Authentication, the attributes\n");
     fprintf(stderr, "                    are a colon separated username and password.\n");
     fprintf(stderr, "    -X proxy:port   Proxyserver and port number to use\n");
+    fprintf(stderr, "    -o src_address  Set the local source address\n");
     fprintf(stderr, "    -V              Print version number and exit\n");
     fprintf(stderr, "    -k              Use HTTP KeepAlive feature\n");
     fprintf(stderr, "    -d              Do not show percentiles served table.\n");
@@ -3030,7 +3041,7 @@ int main(int argc, const char * const argv[])
 #endif
 
     apr_getopt_init(&opt, cntxt, argc, argv);
-    while ((status = apr_getopt(opt, "n:c:t:s:b:T:p:u:v:lrkVhwiIx:y:z:C:H:P:A:g:X:de:SqQDB:m:R:"
+    while ((status = apr_getopt(opt, "n:c:t:s:b:T:p:u:v:lrkVhwiIx:y:z:C:H:P:A:g:X:de:SqQDB:m:R:o:"
 #if APR_HAS_THREADS
             "W:"
 #endif
@@ -3056,6 +3067,9 @@ int main(int argc, const char * const argv[])
             case 'k':
                 keepalive = 1;
                 break;
+            case 'o':
+                src_address = strdup(optarg);
+                break;
             case 'q':
                 heartbeatres = 0;
                 break;