diff --git a/src/conn.c b/src/conn.c index ad0091e..13e39f2 100755 --- a/src/conn.c +++ b/src/conn.c @@ -1,35 +1,35 @@ /* - httperf -- a tool for measuring web server performance - Copyright 2000-2007 Hewlett-Packard Company - - This file is part of httperf, a web server performance measurment - tool. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - In addition, as a special exception, the copyright holders give - permission to link the code of this work with the OpenSSL project's - "OpenSSL" library (or with modified versions of it that use the same - license as the "OpenSSL" library), and distribute linked combinations - including the two. You must obey the GNU General Public License in - all respects for all of the code used other than "OpenSSL". If you - modify this file, you may extend this exception to your version of the - file, but you are not obligated to do so. If you do not wish to do - so, delete this exception statement from your version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA -*/ + * httperf -- a tool for measuring web server performance + * Copyright 2000-2007 Hewlett-Packard Company + * + * This file is part of httperf, a web server performance measurment + * tool. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * In addition, as a special exception, the copyright holders give + * permission to link the code of this work with the OpenSSL project's + * "OpenSSL" library (or with modified versions of it that use the same + * license as the "OpenSSL" library), and distribute linked combinations + * including the two. You must obey the GNU General Public License in + * all respects for all of the code used other than "OpenSSL". If you + * modify this file, you may extend this exception to your version of the + * file, but you are not obligated to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA + */ #include "config.h" @@ -56,24 +56,24 @@ static char *srvbase, *srvend, *srvcurrent; void -conn_add_servers (void) +conn_add_servers(void) { struct stat st; int fd, len; - fd = open(param.server, O_RDONLY, 0); + fd = open(param.servers, O_RDONLY, 0); if (fd == -1) - panic("%s: can't open %s\n", prog_name, param.server); + panic("%s: can't open %s\n", prog_name, param.servers); fstat(fd, &st); if (st.st_size == 0) - panic("%s: file %s is empty\n", prog_name, param.server); + panic("%s: file %s is empty\n", prog_name, param.servers); srvbase = (char *)mmap(0, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); if (srvbase == (char *)-1) panic("%s: can't mmap the file: %s\n", prog_name, strerror(errno)); - close (fd); + close(fd); srvend = srvbase + st.st_size; for (srvcurrent = srvbase; srvcurrent < srvend; srvcurrent += len + 1) { @@ -84,24 +84,34 @@ conn_add_servers (void) } void -conn_init (Conn *conn) +conn_init(Conn *conn) { - int len; - - len = strlen(srvcurrent); - conn->hostname = srvcurrent; - conn->hostname_len = len; - - srvcurrent += len + 1; - if (srvcurrent >= srvend) - srvcurrent = srvbase; + if (param.servers) { + int len = strlen(srvcurrent); + conn->hostname = srvcurrent; + conn->hostname_len = len; + conn->fqdname = conn->hostname; + conn->fqdname_len = conn->hostname_len; + + srvcurrent += len + 1; + if (srvcurrent >= srvend) + srvcurrent = srvbase; + } else if (param.server_name) { + conn->hostname = param.server; + conn->hostname_len = strlen(param.server); + conn->fqdname = param.server_name; + conn->fqdname_len = strlen(param.server_name); + } else { + conn->hostname = param.server; + conn->hostname_len = strlen(param.server); + conn->fqdname = conn->hostname; + conn->fqdname_len = conn->hostname_len; + } conn->port = param.port; conn->sd = -1; conn->myport = -1; conn->line.iov_base = conn->line_buf; - conn->fqdname = conn->hostname; - conn->fqdname_len = conn->hostname_len; #ifdef HAVE_SSL if (param.use_ssl) { @@ -112,7 +122,7 @@ conn_init (Conn *conn) } if (param.ssl_cipher_list) { - /* set order of ciphers */ + /* set order of ciphers */ int ssl_err = SSL_set_cipher_list(conn->ssl, param.ssl_cipher_list); if (DBG > 2) @@ -125,16 +135,16 @@ conn_init (Conn *conn) } void -conn_deinit (Conn *conn) +conn_deinit(Conn *conn) { - assert (conn->sd < 0 && conn->state != S_FREE); - assert (!conn->sendq); - assert (!conn->recvq); - assert (!conn->watchdog); - conn->state = S_FREE; + assert(conn->sd < 0 && conn->state != S_FREE); + assert(!conn->sendq); + assert(!conn->recvq); + assert(!conn->watchdog); + conn->state = S_FREE; #ifdef HAVE_SSL - if (param.use_ssl) - SSL_free (conn->ssl); + if (param.use_ssl) + SSL_free(conn->ssl); #endif } diff --git a/src/core.c b/src/core.c index 0993bb9..bb4929e 100755 --- a/src/core.c +++ b/src/core.c @@ -963,8 +963,11 @@ core_init(void) printf("%s: maximum number of open descriptors = %ld\n", prog_name, rlimit.rlim_max); - if (param.server) + if (param.servers) conn_add_servers(); + else if (param.server) + core_addr_intern(param.server, strlen(param.server), param.port); + if (param.runtime) { arg.l = 0; timer_schedule(core_runtime_timer, arg, param.runtime); diff --git a/src/httperf.c b/src/httperf.c index 60d609e..60bd351 100755 --- a/src/httperf.c +++ b/src/httperf.c @@ -137,6 +137,8 @@ static struct option longopts[] = { {"runtime", required_argument, (int *) ¶m.runtime, 0}, {"send-buffer", required_argument, (int *) ¶m.send_buffer_size, 0}, {"server", required_argument, (int *) ¶m.server, 0}, + {"server-name", required_argument, (int *) ¶m.server_name, 0}, + {"servers", required_argument, (int *) ¶m.servers, 0}, {"uri", required_argument, (int *) ¶m.uri, 0}, {"session-cookies", no_argument, (int *) ¶m.session_cookies, 1}, #ifdef HAVE_SSL @@ -175,9 +177,9 @@ usage(void) "\t[--num-calls N] [--num-conns N] [--session-cookies]\n" "\t[--period [d|u|e]T1[,T2]|[v]T1,D1[,T2,D2]...[,Tn,Dn]\n" "\t[--print-reply [header|body]] [--print-request [header|body]]\n" - "\t[--rate X] [--recv-buffer N] [--retry-on-failure] " - "[--send-buffer N]\n" - "\t<--server file> [--port N] [--uri S] [--myaddr S]\n" + "\t[--rate X] [--recv-buffer N] [--retry-on-failure] [--send-buffer N]\n" + "\t[--server S|--servers file] [--server-name S] [--port N] [--uri S] " + "[--myaddr S]\n" #ifdef HAVE_SSL "\t[--ssl] [--ssl-ciphers L] [--ssl-no-reuse]\n" "\t[--ssl-certificate file] [--ssl-key file]\n" @@ -637,6 +639,10 @@ main(int argc, char **argv) } } else if (flag == ¶m.server) param.server = optarg; + else if (flag == ¶m.server_name) + param.server_name = optarg; + else if (flag == ¶m.servers) + param.servers = optarg; #ifdef HAVE_SSL else if (flag == ¶m.ssl_cipher_list) param.ssl_cipher_list = optarg; @@ -974,13 +980,16 @@ main(int argc, char **argv) } } - if (param.server == NULL) { + if (param.server != NULL && param.servers != NULL) { fprintf(stderr, - "%s: must specify --server\n", + "%s: --server S or --servers file\n", prog_name); exit(-1); } + if (param.server == NULL && param.servers == NULL) + param.server = "localhost"; + #ifdef HAVE_SSL if (param.use_ssl) { char buf[1024]; @@ -1133,6 +1142,10 @@ main(int argc, char **argv) printf(" --client=%u/%u", param.client.id, param.client.num_clients); if (param.server) printf(" --server=%s", param.server); + if (param.server_name) + printf(" --server_name=%s", param.server_name); + if (param.servers) + printf(" --servers=%s", param.servers); if (param.port) printf(" --port=%d", param.port); if (param.uri) diff --git a/src/httperf.h b/src/httperf.h index 37567d2..9d40a8a 100755 --- a/src/httperf.h +++ b/src/httperf.h @@ -91,7 +91,9 @@ Rate_Info; typedef struct Cmdline_Params { int http_version; /* (default) HTTP protocol version */ - const char *server; + const char *server; /* (default) hostname */ + const char *server_name; /* fully qualified server name */ + const char *servers; int port; /* (default) server port */ const char *uri; /* (default) uri */ const char *myaddr; @@ -154,7 +156,7 @@ typedef struct Cmdline_Params u_int num_reqs; /* # of user requests per session */ Time think_time; /* user think time between requests */ } - wsesspage; /* XXX Currently broken */ + wsesspage; struct { u_int num_sessions; /* # of user-sessions */