diff options
Diffstat (limited to 'ACE/apps/JAWS/clients/WebSTONE/src/webmaster.c')
-rw-r--r-- | ACE/apps/JAWS/clients/WebSTONE/src/webmaster.c | 1025 |
1 files changed, 512 insertions, 513 deletions
diff --git a/ACE/apps/JAWS/clients/WebSTONE/src/webmaster.c b/ACE/apps/JAWS/clients/WebSTONE/src/webmaster.c index 1bfbcc06b9d..3acc9e28b16 100644 --- a/ACE/apps/JAWS/clients/WebSTONE/src/webmaster.c +++ b/ACE/apps/JAWS/clients/WebSTONE/src/webmaster.c @@ -1,13 +1,13 @@ /* $Id$ */ /************************************************************************** - * * - * Copyright (C) 1995 Silicon Graphics, Inc. * - * * - * These coded instructions, statements, and computer programs were * + * * + * Copyright (C) 1995 Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs were * * developed by SGI for public use. If any changes are made to this code* * please try to get the changes back to the author. Feel free to make * - * modifications and changes to the code and release it. * - * * + * modifications and changes to the code and release it. * + * * **************************************************************************/ /* FUZZ: disable check_for_math_include */ @@ -35,8 +35,8 @@ #include <netinet/in.h> #include <netdb.h> #else -#define FD_SETSIZE 1024 /* max size for select() - keep before <winsock.h> - * and same size as MAXCLIENTS */ +#define FD_SETSIZE 1024 /* max size for select() - keep before <winsock.h> + * and same size as MAXCLIENTS */ #include <windows.h> #include <winsock.h> #include <io.h> @@ -47,38 +47,38 @@ #include "bench.h" /* command line options/data */ -int savefile = 0; -int debug = 0; -int norexec = 0; -int haveproxyserver = 0; -char proxyserver[MAXHOSTNAMELEN]; -char network_mask_str[30] = "255.255.255.0"; +int savefile = 0; +int debug = 0; +int norexec = 0; +int haveproxyserver = 0; +char proxyserver[MAXHOSTNAMELEN]; +char network_mask_str[30] = "255.255.255.0"; unsigned network_mask = 0; -int servaddrin_config = 0; -int dumpall = 0; -int testtime = 0; -int havewebserver = 0; -int numloops = 0; -NETPORT portnum = 0; -int redirect = 0; -int record_all_transactions = 0; -int uil_filelist_f = 0; -int verbose = 0; -char webserver[MAXHOSTNAMELEN]; -char configfile[MAXPATHLEN]; -char uil_filelist[NCCARGS]; - -char filelist[256][MAXPATHLEN]; -fd_set zerofdset; +int servaddrin_config = 0; +int dumpall = 0; +int testtime = 0; +int havewebserver = 0; +int numloops = 0; +NETPORT portnum = 0; +int redirect = 0; +int record_all_transactions = 0; +int uil_filelist_f = 0; +int verbose = 0; +char webserver[MAXHOSTNAMELEN]; +char configfile[MAXPATHLEN]; +char uil_filelist[NCCARGS]; + +char filelist[256][MAXPATHLEN]; +fd_set zerofdset; /* other key data */ long int number_of_pages = 0; -int totalnumclients = 0; -int num_rexecs = 0; -SOCKET socknum[MAXCLIENTS]; -SOCKET sockIO[MAXTOTALPROCS]; -SOCKET sockErr[MAXTOTALPROCS]; -THREAD FILE *debugfile = stderr; +int totalnumclients = 0; +int num_rexecs = 0; +SOCKET socknum[MAXCLIENTS]; +SOCKET sockIO[MAXTOTALPROCS]; +SOCKET sockErr[MAXTOTALPROCS]; +THREAD FILE *debugfile = stderr; struct hostent *master_phe; /* IP addresses for webmaster */ struct timeval sumedh_start, sumedh_end; @@ -88,10 +88,10 @@ static void usage(const char *progname) { - fprintf(stderr, "Usage: %s [-a] [-d] -f config_file [-l numloops]\n", - progname); - fprintf(stderr, " [-p port_num] [-r] [-s] [-t run_time] \n"); - fprintf(stderr, "\n"); + fprintf(stderr, "Usage: %s [-a] [-d] -f config_file [-l numloops]\n", + progname); + fprintf(stderr, " [-p port_num] [-r] [-s] [-t run_time] \n"); + fprintf(stderr, "\n"); fprintf(stderr, "-w webserver URL [URL ...]\n\n"); fprintf(stderr, "-a print timing information for all clients\n"); fprintf(stderr, "-d turn on debug statements\n"); @@ -102,12 +102,12 @@ usage(const char *progname) fprintf(stderr, "-s save client gets to /tmp/webstone.data.*\n"); fprintf(stderr, "-t run_time\tduration of test in minutes\n"); fprintf(stderr, "-w webserver\tname of webserver host to contact\n"); - fprintf(stderr, "-u URL file\tfilelist of URLs\n"); - fprintf(stderr, "-v verbose mode\n"); - fprintf(stderr, "-P servername\tuse proxy server for transactions\n"); - fprintf(stderr, "-W webserver addresses are in the config file\n"); - fprintf(stderr, "-R record all transactions\n"); - errexit("\n"); + fprintf(stderr, "-u URL file\tfilelist of URLs\n"); + fprintf(stderr, "-v verbose mode\n"); + fprintf(stderr, "-P servername\tuse proxy server for transactions\n"); + fprintf(stderr, "-W webserver addresses are in the config file\n"); + fprintf(stderr, "-R record all transactions\n"); + errexit("\n"); } static SOCKET @@ -143,12 +143,12 @@ passivesock(const NETPORT portnum, const char *protocol, const int qlen) if (strcmp(protocol, "udp") == 0) { type = SOCK_DGRAM; - D_PRINTF( "Choosing SOCK_DGRAM\n" ); + D_PRINTF( "Choosing SOCK_DGRAM\n" ); } else { type = SOCK_STREAM; - D_PRINTF( "Choosing SOCK_STREAM, errno %d\n",errno ); + D_PRINTF( "Choosing SOCK_STREAM, errno %d\n",errno ); } /* allocate a socket */ @@ -156,10 +156,10 @@ passivesock(const NETPORT portnum, const char *protocol, const int qlen) if (BADSOCKET(s)) { D_PRINTF( "Socket PF_INET %d %d returned %d with %s\n", - type, ppe->p_proto, s, neterrstr() ); + type, ppe->p_proto, s, neterrstr() ); errexit("Can't create socket: %s\n", neterrstr()); } - D_PRINTF( "Socket %d created with errno %d\n",s,errno ); + D_PRINTF( "Socket %d created with errno %d\n",s,errno ); /* Bind the socket */ if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) @@ -216,48 +216,48 @@ void echo_client(void *stream) timeout.tv_usec = (long)0; if (which_stream) { - sockarr = sockIO; - outfile = stdout; + sockarr = sockIO; + outfile = stdout; } else { - sockarr = sockErr; - outfile = stderr; + sockarr = sockErr; + outfile = stderr; } D_PRINTF( "echo_client running\n" ); signal( SIGINT, SIG_DFL); /* restore default behavior - for SIGINT */ + for SIGINT */ while (1) { - FD_ZERO(&readfds); - for (i = 0; i < num_rexecs; i++) - if (sockarr[i] != BADSOCKET_VALUE) - FD_SET(sockarr[i], &readfds); - rv = select(num_rexecs, &readfds, 0, 0, &timeout); - if ( rv == 0) - continue; - if (rv < 0 && WSAGetLastError() == WSANOTINITIALISED) - return; - if (rv < 0) - errexit("Error in echo_client(): select() returns %d: %s\n", rv, neterrstr()); - - /* loop over the sockets that are ready with data */ - for (i = 0; i < num_rexecs; i++) { - if (sockarr[i] != BADSOCKET_VALUE && FD_ISSET(sockarr[i], &readfds)) { - len = NETREAD(sockarr[i], buf, sizeof(buf)); - if (len <= 0) { - /* mark connection closed */ - sockarr[i] = BADSOCKET_VALUE; - if (len < 0 && WSAGetLastError() == WSANOTINITIALISED) - return; - if (len < 0) - fprintf(stderr, "Error in echo_client() after NETREAD(): %s\n", neterrstr()); - continue; - } + FD_ZERO(&readfds); + for (i = 0; i < num_rexecs; i++) + if (sockarr[i] != BADSOCKET_VALUE) + FD_SET(sockarr[i], &readfds); + rv = select(num_rexecs, &readfds, 0, 0, &timeout); + if ( rv == 0) + continue; + if (rv < 0 && WSAGetLastError() == WSANOTINITIALISED) + return; + if (rv < 0) + errexit("Error in echo_client(): select() returns %d: %s\n", rv, neterrstr()); - /* copy to stdout or stderr */ - fwrite(buf, sizeof(char), len, outfile); - } - } + /* loop over the sockets that are ready with data */ + for (i = 0; i < num_rexecs; i++) { + if (sockarr[i] != BADSOCKET_VALUE && FD_ISSET(sockarr[i], &readfds)) { + len = NETREAD(sockarr[i], buf, sizeof(buf)); + if (len <= 0) { + /* mark connection closed */ + sockarr[i] = BADSOCKET_VALUE; + if (len < 0 && WSAGetLastError() == WSANOTINITIALISED) + return; + if (len < 0) + fprintf(stderr, "Error in echo_client() after NETREAD(): %s\n", neterrstr()); + continue; + } + + /* copy to stdout or stderr */ + fwrite(buf, sizeof(char), len, outfile); + } + } } D_PRINTF( "Exiting echo_client\n" ); } @@ -278,7 +278,7 @@ echo_client(char *hostname, const int fd) cc = NETREAD(fd, buf, sizeof(buf)); if (cc > 0) { - write(STDOUT_FILENO, buf, cc); + write(STDOUT_FILENO, buf, cc); } } D_PRINTF( "Exiting echo_client\n" ); @@ -292,31 +292,31 @@ echo_client(char *hostname, const int fd) * return value is a string with the IP address or hostname (or NULL) */ char *pick_webmaster_IP_address(char *client_hostname, struct hostent *master_phe, - unsigned netmask) { + unsigned netmask) { static char buf[20]; unsigned char addr[4]; int client_addr; int i; if (client_hostname[0] >= '0' && client_hostname[0] <= '9') { - /* we have an IP address */ - client_addr = inet_addr(client_hostname); - if (client_addr == INADDR_NONE) - return 0; + /* we have an IP address */ + client_addr = inet_addr(client_hostname); + if (client_addr == INADDR_NONE) + return 0; } else { - /* we have a hostname, use the webserver hostname */ - return master_phe->h_name; + /* we have a hostname, use the webserver hostname */ + return master_phe->h_name; } for (i = 0; master_phe->h_addr_list[i] != 0; i++) { - if ((*(int *)(master_phe->h_addr_list[i]) & netmask) == - (client_addr & netmask)) - goto gotit; + if ((*(int *)(master_phe->h_addr_list[i]) & netmask) == + (client_addr & netmask)) + goto gotit; } i = 0; /* give up */ gotit: - memcpy((char *)addr, master_phe->h_addr_list[i], sizeof(addr)); /* Internet specific */ + memcpy((char *)addr, master_phe->h_addr_list[i], sizeof(addr)); /* Internet specific */ sprintf(buf, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]); return buf; } @@ -327,10 +327,10 @@ gotit: void ParseCmdLine(int argc, char **argv ) { -char getoptch; -int currarg; -extern char *optarg; -extern int optind; +char getoptch; +int currarg; +extern char *optarg; +extern int optind; /* * PARSE THE COMMAND LINE OPTIONS @@ -338,89 +338,89 @@ extern int optind; while((getoptch = getopt(argc,argv,"P:f:t:l:p:u:R:w:n:M:adrsvWX")) != (const char)EOF) { switch(getoptch) - { - case 'M': - strcpy(network_mask_str, optarg); - break; - case 'P': - haveproxyserver = 1; - strcpy(proxyserver, optarg); - break; - case 'R': - record_all_transactions = 1; - break; - case 'X': - norexec = 1; - break; - case 'W': - servaddrin_config = 1; - break; - case 'a': - dumpall = 1; - break; - case 'd': - debug = 1; - break; - case 'f': - strcpy(configfile, optarg); - break; - case 'l': - numloops = atoi(optarg); - break; - case 'p': - portnum = atoi(optarg); - break; - case 'r': - redirect = 1; - break; - case 's': - savefile = 1; - break; - case 't': - testtime = atoi(optarg); - break; - case 'u': - uil_filelist_f = 1; - strcpy(uil_filelist, optarg); - break; - case 'v': - verbose = 1; - break; - case 'w': - havewebserver = 1; - strcpy(webserver, optarg); - break; - default: - usage(argv[0]); - } /* end switch */ + { + case 'M': + strcpy(network_mask_str, optarg); + break; + case 'P': + haveproxyserver = 1; + strcpy(proxyserver, optarg); + break; + case 'R': + record_all_transactions = 1; + break; + case 'X': + norexec = 1; + break; + case 'W': + servaddrin_config = 1; + break; + case 'a': + dumpall = 1; + break; + case 'd': + debug = 1; + break; + case 'f': + strcpy(configfile, optarg); + break; + case 'l': + numloops = atoi(optarg); + break; + case 'p': + portnum = atoi(optarg); + break; + case 'r': + redirect = 1; + break; + case 's': + savefile = 1; + break; + case 't': + testtime = atoi(optarg); + break; + case 'u': + uil_filelist_f = 1; + strcpy(uil_filelist, optarg); + break; + case 'v': + verbose = 1; + break; + case 'w': + havewebserver = 1; + strcpy(webserver, optarg); + break; + default: + usage(argv[0]); + } /* end switch */ } /* end while */ if (numloops && testtime) - errexit("Can't have both -l and -t\n"); + errexit("Can't have both -l and -t\n"); if(!havewebserver && !servaddrin_config) { /* * THE SERVERS NAME MUST BE SPECIFIED */ - + fprintf(stderr,"No WWW Server specified\n"); usage(argv[0]); } if (havewebserver && servaddrin_config) { - /* - * CAN'T HAVE BOTH -w and -W - */ - fprintf(stderr, "Can't have both -w and -W options\n"); - usage(argv[0]); + /* + * CAN'T HAVE BOTH -w and -W + */ + fprintf(stderr, "Can't have both -w and -W options\n"); + usage(argv[0]); } network_mask = inet_addr(network_mask_str); if (network_mask == INADDR_NONE) { - fprintf(stderr, "Invalid network mask (-M %s)\n", network_mask_str); - usage(argv[0]); + fprintf(stderr, "Invalid network mask (-M %s)\n", network_mask_str); + usage(argv[0]); } if(strlen(configfile) == 0) @@ -436,32 +436,32 @@ extern int optind; */ if (uil_filelist_f == 0) { - currarg = optind; - number_of_pages = 0; - while(currarg != argc) - { - /* - * GET THE UILS TO RETRIEVE. - */ - - sscanf(argv[currarg],"%s",filelist[number_of_pages]); - number_of_pages++; - currarg++; - } + currarg = optind; + number_of_pages = 0; + while(currarg != argc) + { + /* + * GET THE UILS TO RETRIEVE. + */ + + sscanf(argv[currarg],"%s",filelist[number_of_pages]); + number_of_pages++; + currarg++; + } } else { - /* have filelist; take a stab at the number of valid URLs */ - D_PRINTF( "About to parse filelist %s\n", uil_filelist ); - number_of_pages = count_file_list(uil_filelist); + /* have filelist; take a stab at the number of valid URLs */ + D_PRINTF( "About to parse filelist %s\n", uil_filelist ); + number_of_pages = count_file_list(uil_filelist); } if (number_of_pages == 0) { /* - * AT LEAST ONE FILE MUST BE SPECIFIED - */ - fprintf(stderr,"No URL resources specified\n"); - usage(argv[0]); + * AT LEAST ONE FILE MUST BE SPECIFIED + */ + fprintf(stderr,"No URL resources specified\n"); + usage(argv[0]); } } @@ -487,14 +487,14 @@ struct sockaddr_in *serveraddr; { errexit("Couldn't open socket %d: %s\n", sock, neterrstr()); } - D_PRINTF( "The passivesock call succeeded\n" ); + D_PRINTF( "The passivesock call succeeded\n" ); D_PRINTF( "calling getsockname\n" ); len = sizeof(struct sockaddr); if(getsockname(sock, (struct sockaddr *)serveraddr, &len) < 0) { - errexit("Could not get socket informaton\n"); + errexit("Could not get socket informaton\n"); } return( sock ); @@ -520,26 +520,26 @@ char *commandline; if(gethostname(hostname,MAXHOSTNAMELEN) != 0) { - errexit("Could not retrieve local host name"); + errexit("Could not retrieve local host name"); } else { - /* convert hostname to address (to avoid DNS problems for webclients) */ - /* The following lines are add to copy the system - buffer (output of gethostbyname()) into user area. + /* convert hostname to address (to avoid DNS problems for webclients) */ + /* The following lines are add to copy the system + buffer (output of gethostbyname()) into user area. This is because, there are very good chances that later - on system buffer might be overwritten by some calls and - still if your pointer is pointing to same addr. nothing - but only trouble and trouble! Infact this is what + on system buffer might be overwritten by some calls and + still if your pointer is pointing to same addr. nothing + but only trouble and trouble! Infact this is what happening when I tried to run webstone benchmark for more then one clients. It used to over write the webmaster name - with the first client name and so remaining on client(s) - the webclient process(es) were invoked with wrong webmaster - name! This behaviour is observed Solaris 2.4 this bug - can be hit in any OS. - Rajesh Shah 5/18/96 */ - - /* master_phe = gethostbyname(hostname); */ - master_phe_tmp = gethostbyname(hostname); - master_phe = (struct hostent *)malloc(sizeof(struct hostent)); - HostEntCpy(master_phe, master_phe_tmp); + with the first client name and so remaining on client(s) + the webclient process(es) were invoked with wrong webmaster + name! This behaviour is observed Solaris 2.4 this bug + can be hit in any OS. - Rajesh Shah 5/18/96 */ + + /* master_phe = gethostbyname(hostname); */ + master_phe_tmp = gethostbyname(hostname); + master_phe = (struct hostent *)malloc(sizeof(struct hostent)); + HostEntCpy(master_phe, master_phe_tmp); } /* set up executable pathname */ @@ -548,7 +548,7 @@ char *commandline; if ( temp && *temp ) { webclient_path = (char *)mymalloc( strlen(temp) + strlen("/webclient") - + 1); + + 1); strcpy(webclient_path, temp); strcat(webclient_path, "/webclient"); @@ -593,11 +593,11 @@ char *commandline; if (uil_filelist_f) { strcat(commandline," -u "); - strcat(commandline,uil_filelist); + strcat(commandline,uil_filelist); } if (record_all_transactions) { - strcat(commandline," -R"); + strcat(commandline," -R"); } if (testtime != 0) { @@ -613,16 +613,16 @@ char *commandline; if (uil_filelist_f == 0) { - cnt = 0; - while(cnt < number_of_pages) - { - /* - * PUT THE FILES AT THE END OF THE LIST. - */ - strcat(commandline," "); - strcat(commandline,filelist[cnt]); - cnt++; - } + cnt = 0; + while(cnt < number_of_pages) + { + /* + * PUT THE FILES AT THE END OF THE LIST. + */ + strcat(commandline," "); + strcat(commandline,filelist[cnt]); + cnt++; + } } puts(commandline); } @@ -632,21 +632,21 @@ char *commandline; */ int RexecClients( commandline, clienthostname, serveraddr) char *commandline; -char clienthostname[MAXCLIENTS][MAXHOSTNAMELEN]; -struct sockaddr_in *serveraddr; +char clienthostname[MAXCLIENTS][MAXHOSTNAMELEN]; +struct sockaddr_in *serveraddr; { - int tmpfd; - int numclients = 0; - char tmpcommandline[NCCARGS]; + int tmpfd; + int numclients = 0; + char tmpcommandline[NCCARGS]; struct servent *inetport; - int cnt; - char buffer[NCCARGS]; - char login[MAXUSERNAME]; - char password[MAXPASSWD]; - FILE *fp; - int returnval; - char *tmphostname; + int cnt; + char buffer[NCCARGS]; + char login[MAXUSERNAME]; + char password[MAXPASSWD]; + FILE *fp; + int returnval; + char *tmphostname; memset(buffer, 0, sizeof(buffer)); @@ -671,84 +671,84 @@ struct sockaddr_in *serveraddr; D_PRINTF( "rexec loop\n" ); while(1) { - char webserver2[MAXHOSTNAMELEN]; - char linebuf[150]; - int num; - char *primename; - - if (0 == fgets(linebuf, sizeof(linebuf), fp)) - break; - num = sscanf(linebuf,"%s %s %s %d %s",clienthostname[cnt],login,password, - &numclients, webserver2); - if (num < 4) - break; - if (servaddrin_config) { - if (num == 4) { - errexit("No webserver specified in config file for %s\n", clienthostname[cnt]); - } - strcpy(webserver, webserver2); - } - - if (numclients <= 0) - errexit("Number of clients must be >= 0\n"); - if (numclients > MAXPROCSPERNODE) - { - errexit("Number of clients per node can't exceed %d\n", MAXPROCSPERNODE); - } + char webserver2[MAXHOSTNAMELEN]; + char linebuf[150]; + int num; + char *primename; + + if (0 == fgets(linebuf, sizeof(linebuf), fp)) + break; + num = sscanf(linebuf,"%s %s %s %d %s",clienthostname[cnt],login,password, + &numclients, webserver2); + if (num < 4) + break; + if (servaddrin_config) { + if (num == 4) { + errexit("No webserver specified in config file for %s\n", clienthostname[cnt]); + } + strcpy(webserver, webserver2); + } + + if (numclients <= 0) + errexit("Number of clients must be >= 0\n"); + if (numclients > MAXPROCSPERNODE) + { + errexit("Number of clients per node can't exceed %d\n", MAXPROCSPERNODE); + } totalnumclients += numclients; - primename = pick_webmaster_IP_address(clienthostname[cnt], master_phe, network_mask); - if (primename == 0) { - errexit("Bad client address %s for Client %d\n", clienthostname[cnt], cnt); - } + primename = pick_webmaster_IP_address(clienthostname[cnt], master_phe, network_mask); + if (primename == 0) { + errexit("Bad client address %s for Client %d\n", clienthostname[cnt], cnt); + } fprintf(stdout,"Client %d: %s \t# Processes: %d\n Webserver: %s\tWebmaster: %s:%d\n", - cnt, clienthostname[cnt], numclients, webserver, primename, - ntohs(serveraddr->sin_port)); - fflush(stdout); + cnt, clienthostname[cnt], numclients, webserver, primename, + ntohs(serveraddr->sin_port)); + fflush(stdout); sprintf(tmpcommandline, commandline, numclients, webserver, primename, - ntohs(serveraddr->sin_port)); + ntohs(serveraddr->sin_port)); fprintf(stderr, "tmpcommandline: %s\n", tmpcommandline); - D_PRINTF( "%s rexec %s\n",&clienthostname[cnt],tmpcommandline ); - if (norexec) { - sleep(30); /* gives some time to start clients for debugging */ - } else { - - tmphostname = &(clienthostname[cnt][0]); - tmpfd = rexec(&tmphostname, inetport->s_port, login, password, - tmpcommandline, &sockErr[cnt]); - if((sockIO[cnt] = tmpfd) < 0) - { - errexit("Could not rexec: rexec to client %s, cmdline %s failed\n", - clienthostname[cnt],tmpcommandline); - } - } - - - returnval = NETREAD(tmpfd, buffer, OKSTRLEN); - D_PRINTF( "read returns %d, %s\n", returnval, buffer ); - - if (returnval <= 0 || memcmp(buffer, OKSTR, OKSTRLEN) != 0) - { + D_PRINTF( "%s rexec %s\n",&clienthostname[cnt],tmpcommandline ); + if (norexec) { + sleep(30); /* gives some time to start clients for debugging */ + } else { + + tmphostname = &(clienthostname[cnt][0]); + tmpfd = rexec(&tmphostname, inetport->s_port, login, password, + tmpcommandline, &sockErr[cnt]); + if((sockIO[cnt] = tmpfd) < 0) + { + errexit("Could not rexec: rexec to client %s, cmdline %s failed\n", + clienthostname[cnt],tmpcommandline); + } + } + + + returnval = NETREAD(tmpfd, buffer, OKSTRLEN); + D_PRINTF( "read returns %d, %s\n", returnval, buffer ); + + if (returnval <= 0 || memcmp(buffer, OKSTR, OKSTRLEN) != 0) + { errexit("rexec to client %s, cmdline %s received error %s\n", - clienthostname[cnt],tmpcommandline, buffer); - } + clienthostname[cnt],tmpcommandline, buffer); + } - cnt++; - if (cnt > MAXCLIENTS || cnt > FD_SETSIZE) - { - errexit("Number of Clients can't exceed %d\n", MAXCLIENTS); - } + cnt++; + if (cnt > MAXCLIENTS || cnt > FD_SETSIZE) + { + errexit("Number of Clients can't exceed %d\n", MAXCLIENTS); + } } num_rexecs = cnt; if (totalnumclients > MAXTOTALPROCS) { errexit("Total number of processes can't exceed %d\n", - MAXTOTALPROCS); + MAXTOTALPROCS); } #ifndef WIN32 @@ -758,14 +758,14 @@ struct sockaddr_in *serveraddr; */ D_PRINTF( "Forking webclient stderr/stdout processes\n" ); switch (fork()) - { - case -1: /* ERROR */ - errexit("fork: %s\n", strerror(errno)); - case 0: /* CHILD */ - exit(echo_client(clienthostname[cnt], tmpfd)); - default: /* PARENT */ - break; - } + { + case -1: /* ERROR */ + errexit("fork: %s\n", strerror(errno)); + case 0: /* CHILD */ + exit(echo_client(clienthostname[cnt], tmpfd)); + default: /* PARENT */ + break; + } #else /* start threads to echo stdout/stderr from clients */ _beginthread(echo_client, 0, (void *)0); @@ -786,7 +786,7 @@ int sock; { int cnt,len; fd_set tmpfdset, leftfdset; - char buffer[NCCARGS]; + char buffer[NCCARGS]; /* * NOW WE NEED TO ACCEPT ALL THE CONNECTIONS FROM THE CLIENTS, @@ -796,28 +796,28 @@ int sock; D_PRINTF( "Beginning accept loop\n" ); for (cnt = 0; cnt < totalnumclients; cnt++) { - D_PRINTF( "Client %d:\t", cnt ); - - { - fd_set readfds; - struct timeval timeout; - int rv; - - timeout.tv_sec = MAX_ACCEPT_SECS; - timeout.tv_usec = 0; - FD_ZERO(&readfds); - FD_SET(sock, &readfds); - - /* if we're hung, quit */ - D_PRINTF("Before select() on listen() socket\n"); - if (!(rv = select(FD_SETSIZE, &readfds, 0, 0, &timeout))) { - fprintf(stdout, - "Listen timeout after %d seconds (%d clients so far)\n", - MAX_ACCEPT_SECS, cnt); - D_PRINTF("select() timed out after %d seconds\n", MAX_ACCEPT_SECS); - errexit("Webmaster terminating\n"); - } - } + D_PRINTF( "Client %d:\t", cnt ); + + { + fd_set readfds; + struct timeval timeout; + int rv; + + timeout.tv_sec = MAX_ACCEPT_SECS; + timeout.tv_usec = 0; + FD_ZERO(&readfds); + FD_SET(sock, &readfds); + + /* if we're hung, quit */ + D_PRINTF("Before select() on listen() socket\n"); + if (!(rv = select(FD_SETSIZE, &readfds, 0, 0, &timeout))) { + fprintf(stdout, + "Listen timeout after %d seconds (%d clients so far)\n", + MAX_ACCEPT_SECS, cnt); + D_PRINTF("select() timed out after %d seconds\n", MAX_ACCEPT_SECS); + errexit("Webmaster terminating\n"); + } + } if(BADSOCKET(socknum[cnt] = accept(sock, 0, 0))) { @@ -834,7 +834,7 @@ int sock; */ FD_SET(socknum[cnt],fdset); } - D_PRINTF( "on socket %d\n",socknum[cnt] ); + D_PRINTF( "on socket %d\n",socknum[cnt] ); } D_PRINTF( "\n" ); @@ -857,7 +857,7 @@ int sock; */ abort_clients(); errexit("Error accepting from one of the clients: %s\n", - neterrstr()); + neterrstr()); break; } #else @@ -880,17 +880,17 @@ int sock; * GET THE READY FROM THIS GUY. * DON'T FORGET TO CLEAR HIS BIT IN THE tmpfdset */ - len = NETREAD(socknum[cnt],buffer,READYSTRLEN); + len = NETREAD(socknum[cnt],buffer,READYSTRLEN); if(len != READYSTRLEN) { abort_clients(); errexit("Error reading from client #%d\n", cnt); } if(memcmp(buffer, READYSTR, READYSTRLEN)) - { + { abort_clients(); fprintf(stdout,"Received bad READY string: len %d, value %s\n", - len,buffer); + len,buffer); } FD_CLR(socknum[cnt],&leftfdset); } @@ -917,13 +917,13 @@ int *socknum; { if(socknum[cnt] > 0) { - /* - * SEND A GO - */ - if(NETWRITE(socknum[cnt], GOSTR, GOSTRLEN) != GOSTRLEN) + /* + * SEND A GO + */ + if(NETWRITE(socknum[cnt], GOSTR, GOSTRLEN) != GOSTRLEN) { - abort_clients(); - errexit("Error sending GO to client %d: %s\n", cnt, neterrstr()); + abort_clients(); + errexit("Error sending GO to client %d: %s\n", cnt, neterrstr()); } } } @@ -934,7 +934,7 @@ int *socknum; */ void GetResults(fdset, page_stats, endtime, timestr, totalnumclients, - statarray) + statarray) fd_set *fdset; page_stats_t **page_stats; time_t *endtime; @@ -972,17 +972,17 @@ stats_t statarray[MAXCLIENTS]; #ifndef WIN32 while(memcmp(&leftfdset,&zerofdset,sizeof(fd_set))) { - tmpfdset = leftfdset; - sleep(1); - returnval = select(FD_SETSIZE,&tmpfdset,NULL,NULL,NULL); - D_PRINTF( "Call to select returned %d, errno %d\n", - returnval, errno ); + tmpfdset = leftfdset; + sleep(1); + returnval = select(FD_SETSIZE,&tmpfdset,NULL,NULL,NULL); + D_PRINTF( "Call to select returned %d, errno %d\n", + returnval, errno ); if(returnval < 0) { /* * ERROR SELECTING. ABORT ALL. */ - D_PRINTF( "select() error %s\n", neterrstr() ); + D_PRINTF( "select() error %s\n", neterrstr() ); abort_clients(); errexit("Error selecting from one of the clients\n"); } @@ -991,84 +991,84 @@ stats_t statarray[MAXCLIENTS]; tmpfdset = leftfdset; { #endif /* WIN32 */ - for(cnt = 0; cnt < totalnumclients; cnt++) - { - /* - * SEE WHICH SOCKETS HAVE A INPUT ON THEM PENDING AND - * RECEIVE IT. - */ - - /* IS THIS A VALID SOCKET? IS IT READY TO READ? */ - if(!BADSOCKET(socknum[cnt]) && (FD_ISSET(socknum[cnt],&tmpfdset))) - { - int len; - - /* - * GET THE TIMING DATA FROM THIS GUY - * THEN REMOVE HIM FROM THE tmpfdset - */ - /* - * READ TIME STATS - * DOES READ() RETURN THE CORRECT LENGTH? - */ - D_PRINTF( "About to read timestats, count %d, errno %d\n", - cnt, errno ); - len = SIZEOF_STATSTEXTBASE + number_of_pages*SIZEOF_DOUBLETEXT; - returnval = recvdata(socknum[cnt], stats_as_text, - len); - D_PRINTF( "Read time stats %d\n", returnval ); - if (returnval != len) /* <= 0) */ - { - D_PRINTF( "Error reading timing stats: %s\n", - neterrstr() ); - fprintf(stderr, "Error reading timing stats: %s\nSocket number %d\n", - neterrstr(),socknum[cnt]); - abort_clients(); - errexit(""); - } /* end if */ - - /* convert text to stats */ - stats_as_text[returnval] = 0; /* add an end marker */ - statarray[cnt] = *text_to_stats(stats_as_text); - - fputc('.', stdout); /* PROGRESS MARKER */ - fflush(stdout); - - if(uil_filelist_f) /* READ PAGE STATS */ - { - for (i = 0; i < number_of_pages; i++) - { - D_PRINTF( "On page_stats[%d][%d]\n", cnt, i ); - returnval = recvdata(socknum[cnt], page_stats_as_text, - SIZEOF_PAGESTATSTEXT); - D_PRINTF( "Read page stats %d\n", returnval ); - - if (returnval != SIZEOF_PAGESTATSTEXT) /* <= 0) */ - { - D_PRINTF( "Error reading page_stats[%d][%d]: %s\n", - cnt, i, neterrstr() ); - fprintf(stderr, "Error reading page_stats[%d][%d]: %s\n", - cnt, i, neterrstr()); - abort_clients(); - errexit(""); - } - D_PRINTF( "Page stats: read %d bytes\n", - returnval ); - - page_stats_as_text[returnval] = 0; /* add an end marker */ - D_PRINTF("strlen(page_stats_as_text) = %d\n", - strlen(page_stats_as_text)); - page_stats[cnt][i] = - *text_to_page_stats(page_stats_as_text); - - } /* end for */ - } /* end if filelist */ - - FD_CLR(socknum[cnt],&leftfdset); - NETCLOSE(socknum[cnt]); - socknum[cnt] = BADSOCKET_VALUE; - } /* end if socknum */ - } /* end for cnt */ + for(cnt = 0; cnt < totalnumclients; cnt++) + { + /* + * SEE WHICH SOCKETS HAVE A INPUT ON THEM PENDING AND + * RECEIVE IT. + */ + + /* IS THIS A VALID SOCKET? IS IT READY TO READ? */ + if(!BADSOCKET(socknum[cnt]) && (FD_ISSET(socknum[cnt],&tmpfdset))) + { + int len; + + /* + * GET THE TIMING DATA FROM THIS GUY + * THEN REMOVE HIM FROM THE tmpfdset + */ + /* + * READ TIME STATS + * DOES READ() RETURN THE CORRECT LENGTH? + */ + D_PRINTF( "About to read timestats, count %d, errno %d\n", + cnt, errno ); + len = SIZEOF_STATSTEXTBASE + number_of_pages*SIZEOF_DOUBLETEXT; + returnval = recvdata(socknum[cnt], stats_as_text, + len); + D_PRINTF( "Read time stats %d\n", returnval ); + if (returnval != len) /* <= 0) */ + { + D_PRINTF( "Error reading timing stats: %s\n", + neterrstr() ); + fprintf(stderr, "Error reading timing stats: %s\nSocket number %d\n", + neterrstr(),socknum[cnt]); + abort_clients(); + errexit(""); + } /* end if */ + + /* convert text to stats */ + stats_as_text[returnval] = 0; /* add an end marker */ + statarray[cnt] = *text_to_stats(stats_as_text); + + fputc('.', stdout); /* PROGRESS MARKER */ + fflush(stdout); + + if(uil_filelist_f) /* READ PAGE STATS */ + { + for (i = 0; i < number_of_pages; i++) + { + D_PRINTF( "On page_stats[%d][%d]\n", cnt, i ); + returnval = recvdata(socknum[cnt], page_stats_as_text, + SIZEOF_PAGESTATSTEXT); + D_PRINTF( "Read page stats %d\n", returnval ); + + if (returnval != SIZEOF_PAGESTATSTEXT) /* <= 0) */ + { + D_PRINTF( "Error reading page_stats[%d][%d]: %s\n", + cnt, i, neterrstr() ); + fprintf(stderr, "Error reading page_stats[%d][%d]: %s\n", + cnt, i, neterrstr()); + abort_clients(); + errexit(""); + } + D_PRINTF( "Page stats: read %d bytes\n", + returnval ); + + page_stats_as_text[returnval] = 0; /* add an end marker */ + D_PRINTF("strlen(page_stats_as_text) = %d\n", + strlen(page_stats_as_text)); + page_stats[cnt][i] = + *text_to_page_stats(page_stats_as_text); + + } /* end for */ + } /* end if filelist */ + + FD_CLR(socknum[cnt],&leftfdset); + NETCLOSE(socknum[cnt]); + socknum[cnt] = BADSOCKET_VALUE; + } /* end if socknum */ + } /* end for cnt */ } /* end while memcmp fd */ /* @@ -1090,7 +1090,7 @@ stats_t statarray[MAXCLIENTS]; Prints out all the results */ void PrintResults( page_stats, endtime, timestr, totalnumclients, statarray, - page_stats_total) + page_stats_total) page_stats_t **page_stats; time_t endtime; char *timestr; @@ -1098,10 +1098,10 @@ int totalnumclients; stats_t statarray[MAXCLIENTS]; page_stats_t *page_stats_total; { - stats_t masterstat; + stats_t masterstat; int cnt,i,j; - double thruput; - struct timeval dtime; + double thruput; + struct timeval dtime; /* * PRINT EVERYTHING OUT @@ -1114,77 +1114,77 @@ page_stats_t *page_stats_total; fprintf(stdout,"----------------------------------\n"); /* fprintf(stdout,"Test for host: %s\n",statarray[cnt].hostname); */ fprintf(stdout,"Total number of pages retrieved from server: %u\n", - statarray[cnt].totalpages); - - rqstat_fprint(stdout, &(statarray[cnt].rs)); - - thruput = thruputpersec((double)(statarray[cnt].rs.totalbytes), - &(statarray[cnt].rs.totalresponsetime)); - - fprintf(stdout, "Thruput average per connection: %.0f bytes/sec\n", - thruput); + statarray[cnt].totalpages); + + rqstat_fprint(stdout, &(statarray[cnt].rs)); + + thruput = thruputpersec((double)(statarray[cnt].rs.totalbytes), + &(statarray[cnt].rs.totalresponsetime)); + + fprintf(stdout, "Thruput average per connection: %.0f bytes/sec\n", + thruput); } if(statarray[cnt].rs.totalconnects > 0) { - D_PRINTF( "Summing stats for %d, with %ld total connections\n", - cnt, statarray[cnt].rs.totalconnects ); + D_PRINTF( "Summing stats for %d, with %ld total connections\n", + cnt, statarray[cnt].rs.totalconnects ); rqstat_sum(&masterstat.rs, &(statarray[cnt].rs)); } - else - { - masterstat.rs.totalerrs += statarray[cnt].rs.totalerrs; - } + else + { + masterstat.rs.totalerrs += statarray[cnt].rs.totalerrs; + } } for (i=0; i < totalnumclients; i++) { - for (j=0; j < number_of_pages; j++) - { - D_PRINTF( "Summing page stats for %d, page %d, with %d connects\n", - i, j, statarray[i].page_numbers[j] ); + for (j=0; j < number_of_pages; j++) + { + D_PRINTF( "Summing page stats for %d, page %d, with %d connects\n", + i, j, statarray[i].page_numbers[j] ); - if (statarray[i].page_numbers[j] != 0) - { - rqst_stats_t *pst_rs; - rqst_stats_t *ps_rs; + if (statarray[i].page_numbers[j] != 0) + { + rqst_stats_t *pst_rs; + rqst_stats_t *ps_rs; - pst_rs = &(page_stats_total[j].rs); - ps_rs = &(page_stats[i][j].rs); + pst_rs = &(page_stats_total[j].rs); + ps_rs = &(page_stats[i][j].rs); - rqstat_sum(pst_rs, ps_rs); + rqstat_sum(pst_rs, ps_rs); - page_stats_total[j].totalpages += page_stats[i][j].totalpages; - masterstat.totalpages += page_stats[i][j].totalpages; + page_stats_total[j].totalpages += page_stats[i][j].totalpages; + masterstat.totalpages += page_stats[i][j].totalpages; - /* yes, this is assignment, not sum */ - page_stats_total[j].page_size = page_stats[i][j].page_size; + /* yes, this is assignment, not sum */ + page_stats_total[j].page_size = page_stats[i][j].page_size; - page_stats_total[j].page_valid = 1; - } - } + page_stats_total[j].page_valid = 1; + } + } } /* print page statistics */ if (verbose) { - for (i = 0; i < number_of_pages; i++) - { - if (page_stats_total[i].page_valid == 1) - { - page_stats_t *pst; + for (i = 0; i < number_of_pages; i++) + { + if (page_stats_total[i].page_valid == 1) + { + page_stats_t *pst; - pst = &(page_stats_total[i]); + pst = &(page_stats_total[i]); - printf ("===============================================================================\n"); - printf ("Page # %d\n\n", i); - printf ("Total number of times page was hit %u\n", - pst->totalpages); + printf ("===============================================================================\n"); + printf ("Page # %d\n\n", i); + printf ("Total number of times page was hit %u\n", + pst->totalpages); - rqstat_print(&(pst->rs)); + rqstat_print(&(pst->rs)); - printf ("Page size %u \n", pst->page_size); - printf ("===============================================================================\n\n"); - } - } + printf ("Page size %u \n", pst->page_size); + printf ("===============================================================================\n\n"); + } + } } fprintf(stdout,"===============================================================================\n"); @@ -1196,14 +1196,14 @@ page_stats_t *page_stats_total; for (i=1; i < totalnumclients; i++) { if ((statarray[i].rs.totalconnects > 0) && - (statarray[i].total_num_of_files != masterstat.total_num_of_files)) - { - fprintf(stdout,"**********************************************************************\n"); - fprintf(stdout,"**** ERROR: number of files in each test configuration is not the same\n"); - fprintf(stdout,"**** ERROR: Check configuration file %s on each client\n", configfile); - fprintf(stdout,"**********************************************************************\n"); - break; - } + (statarray[i].total_num_of_files != masterstat.total_num_of_files)) + { + fprintf(stdout,"**********************************************************************\n"); + fprintf(stdout,"**** ERROR: number of files in each test configuration is not the same\n"); + fprintf(stdout,"**** ERROR: Check configuration file %s on each client\n", configfile); + fprintf(stdout,"**********************************************************************\n"); + break; + } } @@ -1229,28 +1229,28 @@ page_stats_t *page_stats_total; (double)(masterstat.rs.totalresponsetime.tv_sec) /(testtime)); avgtime(&masterstat.rs.totalresponsetime, - masterstat.rs.totalconnects, &dtime); + masterstat.rs.totalconnects, &dtime); fprintf(stdout, "Average response time: \t\t%4.4f millisec\n", - (double)1000*(dtime.tv_sec + (double)dtime.tv_usec / 1000000)); + (double)1000*(dtime.tv_sec + (double)dtime.tv_usec / 1000000)); fprintf(stdout, "Error Level:\t\t\t%4.4f %%\n", - (double)(100 * masterstat.rs.totalerrs)/(masterstat.rs.totalconnects)); + (double)(100 * masterstat.rs.totalerrs)/(masterstat.rs.totalconnects)); /* so much for the key metrics */ thruput = 8 * thruputpersec((double)(masterstat.rs.totalbytes), - &(masterstat.rs.totalresponsetime)); - + &(masterstat.rs.totalresponsetime)); + fprintf(stdout, "Average client thruput: \t%4.4f Mbit/sec\n", - thruput/(1024*1024)); + thruput/(1024*1024)); fprintf(stdout,"Sum of client response times:\t%u.%u sec\n", - masterstat.rs.totalresponsetime.tv_sec, - masterstat.rs.totalresponsetime.tv_usec); + masterstat.rs.totalresponsetime.tv_sec, + masterstat.rs.totalresponsetime.tv_usec); fprintf(stdout,"Total number of pages read:\t%u\n\n", - masterstat.totalpages); + masterstat.totalpages); /* Remaining stats are the same as usual */ @@ -1271,29 +1271,29 @@ void main(const int argc, char *argv[]) { - int sync_sock; - int i; - int j; - char buffer[NCCARGS]; - char commandline[NCCARGS]; - char *timestr; - time_t starttime; - time_t endtime; - fd_set fdset; + int sync_sock; + int i; + int j; + char buffer[NCCARGS]; + char commandline[NCCARGS]; + char *timestr; + time_t starttime; + time_t endtime; + fd_set fdset; /* make the big arrays static to avoid stack overflow */ - static char clienthostname[MAXCLIENTS][MAXHOSTNAMELEN]; - static stats_t statarray[MAXCLIENTS]; + static char clienthostname[MAXCLIENTS][MAXHOSTNAMELEN]; + static stats_t statarray[MAXCLIENTS]; page_stats_t **page_stats; page_stats_t *page_stats_total; - struct sockaddr_in serveraddr; + struct sockaddr_in serveraddr; #ifdef WIN32 - WSADATA WSAData; - COORD dwSize; + WSADATA WSAData; + COORD dwSize; if ((WSAStartup(MAKEWORD(1,1), &WSAData)) != 0) { - errexit("Error in WSAStartup()\n"); + errexit("Error in WSAStartup()\n"); } atexit(sock_cleanup); @@ -1334,8 +1334,8 @@ main(const int argc, char *argv[]) mymalloc(totalnumclients*sizeof(page_stats_t *)); for (i=0; i < totalnumclients; i++) { - page_stats[i] = (page_stats_t *) - mymalloc(number_of_pages*sizeof(page_stats_t)); + page_stats[i] = (page_stats_t *) + mymalloc(number_of_pages*sizeof(page_stats_t)); } page_stats_total = (page_stats_t *)mymalloc(number_of_pages*sizeof(page_stats_t)); @@ -1346,7 +1346,7 @@ main(const int argc, char *argv[]) for (i=0; i < totalnumclients; i++) { for (j=0; j < number_of_pages; j++) { page_stats_init(&(page_stats[i][j])); - } + } } for (i=0; i < number_of_pages; i++) { page_stats_init(&(page_stats_total[i])); @@ -1387,16 +1387,16 @@ main(const int argc, char *argv[]) } GetResults( &fdset, page_stats, &endtime, timestr, totalnumclients, - statarray); + statarray); gettimeofday (&sumedh_end, 0); PrintResults( page_stats, endtime, timestr, totalnumclients, statarray, - page_stats_total); + page_stats_total); /* free memory */ for (i = 0; i < totalnumclients; i++) { - free(page_stats[i]); + free(page_stats[i]); } free(page_stats); free(page_stats_total); @@ -1408,13 +1408,12 @@ main(const int argc, char *argv[]) void HostEntCpy(struct hostent *dest, struct hostent *src) { - - dest->h_name = (char *)malloc(strlen(src->h_name)+1); - strcpy(dest->h_name, src->h_name); - printf("WebMaster name = %s\n", dest->h_name); - dest->h_aliases = src->h_aliases; - dest->h_addrtype = src->h_addrtype; - dest->h_length = src->h_length; - dest->h_addr_list = src->h_addr_list; + + dest->h_name = (char *)malloc(strlen(src->h_name)+1); + strcpy(dest->h_name, src->h_name); + printf("WebMaster name = %s\n", dest->h_name); + dest->h_aliases = src->h_aliases; + dest->h_addrtype = src->h_addrtype; + dest->h_length = src->h_length; + dest->h_addr_list = src->h_addr_list; } - |