diff options
author | Joseph Chang (bizkit) <bizkit@0xlab.org> | 2010-08-18 15:59:24 +0800 |
---|---|---|
committer | Joseph Chang (bizkit) <bizkit@0xlab.org> | 2010-08-18 15:59:24 +0800 |
commit | 7acf99cfe5945bbcacea75baacb2ca5b21509be7 (patch) | |
tree | 66a0d1ddbc00644055f7b0a3b83d880d65ae85ca /native/libMicro-0.4.0/getpeername.c | |
download | 0xbench-7acf99cfe5945bbcacea75baacb2ca5b21509be7.tar.gz |
Initial release (v1.0.1)
Diffstat (limited to 'native/libMicro-0.4.0/getpeername.c')
-rw-r--r-- | native/libMicro-0.4.0/getpeername.c | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/native/libMicro-0.4.0/getpeername.c b/native/libMicro-0.4.0/getpeername.c new file mode 100644 index 0000000..877215d --- /dev/null +++ b/native/libMicro-0.4.0/getpeername.c @@ -0,0 +1,163 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms + * of the Common Development and Distribution License + * (the "License"). You may not use this file except + * in compliance with the License. + * + * You can obtain a copy of the license at + * src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing + * permissions and limitations under the License. + * + * When distributing Covered Code, include this CDDL + * HEADER in each file and include the License file at + * usr/src/OPENSOLARIS.LICENSE. If applicable, + * add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your + * own identifying information: Portions Copyright [yyyy] + * [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright 2005 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* + * getpeername test + */ + + +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <netinet/tcp.h> +#include <arpa/inet.h> +#include <netdb.h> +#include <string.h> +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <fcntl.h> +#include <errno.h> + +#include "libmicro.h" + +#define FIRSTPORT 12345 + +static int sock = -1; + +int +benchmark_init() +{ + (void) sprintf(lm_usage, "notes: measures getpeername()\n"); + lm_tsdsize = 0; + + return (0); +} + +int +benchmark_initrun() +{ + int j; + int opt = 1; + int result; + socklen_t size; + struct hostent *host; + struct sockaddr_in adds; + int sock2, sock3; + + sock2 = socket(AF_INET, SOCK_STREAM, 0); + if (sock2 == -1) { + perror("socket"); + exit(1); + } + + if (setsockopt(sock2, SOL_SOCKET, SO_REUSEADDR, + &opt, sizeof (int)) == -1) { + perror("setsockopt"); + exit(1); + } + + if ((host = gethostbyname("localhost")) == NULL) { + perror("gethostbyname"); + exit(1); + } + + j = FIRSTPORT; + for (;;) { + (void) memset(&adds, 0, sizeof (struct sockaddr_in)); + adds.sin_family = AF_INET; + adds.sin_port = htons(j++); + (void) memcpy(&adds.sin_addr.s_addr, host->h_addr_list[0], + sizeof (struct in_addr)); + + if (bind(sock2, (struct sockaddr *)&adds, + sizeof (struct sockaddr_in)) == 0) { + break; + } + + if (errno != EADDRINUSE) { + perror("bind"); + exit(1); + } + } + + if (listen(sock2, 5) == -1) { + perror("listen"); + exit(1); + } + + sock3 = socket(AF_INET, SOCK_STREAM, 0); + if (sock3 == -1) { + perror("socket"); + exit(1); + } + + if (fcntl(sock3, F_SETFL, O_NDELAY) == -1) { + perror("fcntl"); + exit(1); + } + + result = connect(sock3, (struct sockaddr *)&adds, + sizeof (struct sockaddr_in)); + if ((result == -1) && (errno != EINPROGRESS)) { + perror("connect"); + exit(1); + } + + size = sizeof (struct sockaddr); + sock = accept(sock2, (struct sockaddr *)&adds, &size); + if (sock == -1) { + perror("accept"); + exit(1); + } + + return (0); +} + +/*ARGSUSED*/ +int +benchmark(void *tsd, result_t *res) +{ + int i; + struct sockaddr_in adds; + socklen_t size; + + for (i = 0; i < lm_optB; i++) { + size = sizeof (struct sockaddr_in); + if (getpeername(sock, (struct sockaddr *)&adds, &size) == -1) { + perror("getpeername"); + exit(1); + res->re_errors++; + } + } + res->re_count = i; + + return (0); +} |