Ejemplo n.º 1
0
static int
icapstartlines_bad(const char **slines){
	struct sockaddr_in sina;
	const char **cur;
	int ret = -1,sd;

	if(common_start()){
		goto done;
	}
	memset(&sina,0,sizeof(sina));
	sina.sin_port = htons(ICAP_DEFAULT_PORT);
	sina.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
	sina.sin_family = AF_INET;
	for(cur = slines ; *cur ; ++cur){
		if((sd = make_tcp_socket(PF_INET)) >= 0){
			if(Connect(sd,(struct sockaddr *)&sina,sizeof(sina)) == 0){
				printf(" Sending %s",*cur);
				if((strlen(*cur) == 0 || Writen(sd,*cur,strlen(*cur)) == 0)){
					int i,v = 0;
					char c;

					while((i = read(sd,&c,sizeof(c))) == sizeof(c)){
						if(!v){
							printf("  ");
							v = 1;
						}
						putc(c,stdout);
						if(c == '\n'){
							v = 0;
						}
					}
					if(i == 0){
						if(Close(sd)){
							goto done;
						}
						continue; // mmm, spaghetti
					}else{
						if(i < 0){
							moan("Couldn't read reply on %d\n",sd);
						}else{
							bitch("Got %d reading on %d\n",i,sd);
						}
					}
				}
			}
			Close(sd);
		}
		goto done;
	}
	ret = 0;

done:
	ret |= close_icap_servers();
	ret |= reap_poller_thread(snarepoller);
	ret |= destroy_poller(snarepoller);
	ret |= stop_config();
	ret |= stop_fileconf();
	return ret;
}
static int
do_server(int port)
{
	int sockfd, clientfd;
	struct sockaddr_in addr;
	struct sockaddr_in client;
	int clientlen = sizeof (client);

	log_time();
	(void) printf("starting as server on port %d\n", ct_port);

	sockfd = make_tcp_socket();
	if (sockfd < 0) {
		return (-1);
	}

	bzero(&addr, sizeof (addr));
	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = INADDR_ANY;
	addr.sin_port = htons(port);

	if (bind(sockfd, (struct sockaddr *)&addr, sizeof (addr)) < 0) {
		warn("bind");
		(void) close(sockfd);
		return (-1);
	}

	if (listen(sockfd, 128) < 0) {
		warn("listen");
		(void) close(sockfd);
		return (-1);
	}

	if ((clientfd = accept(sockfd, (struct sockaddr *)&client,
	    &clientlen)) < 0) {
		warn("accept");
		(void) close(sockfd);
		return (-1);
	}

	log_time();
	(void) printf("accepted connection\n");
	(void) usleep(5000000);

	log_time();
	(void) printf("closing client connection\n");
	(void) close(clientfd);
	(void) usleep(5000000);

	log_time();
	(void) printf("teardown\n");
	(void) close(sockfd);
	return (0);
}
static int
do_client(int port, const char *ipaddrz)
{
	int sockfd;
	struct sockaddr_in addr;
	struct sigaction sigact;
	int i, nwritten;
	char databuf[512];

	bzero(databuf, sizeof (databuf));

	if (parse_ipv4(ipaddrz, &addr) != 0) {
		warnx("failed to parse IP address: %s\n", ipaddrz);
		return (-1);
	}
	addr.sin_port = htons(port);

	bzero(&sigact, sizeof (sigact));
	sigact.sa_sigaction = on_sigpipe;
	if (sigaction(SIGPIPE, &sigact, NULL) != 0) {
		warn("sigaction");
		return (-1);
	}

	log_time();
	(void) printf("connecting to %s port %d\n", ipaddrz, port);

	sockfd = make_tcp_socket();
	if (sockfd < 0) {
		return (-1);
	}

	if (connect(sockfd, (struct sockaddr *)&addr, sizeof (addr)) != 0) {
		warn("connect");
		(void) close(sockfd);
		return (-1);
	}

	log_time();
	(void) printf("connected\n");

	for (i = 0; i < 20; i++) {
		log_time();
		(void) printf("write (%d)\n", i);
		nwritten = write(sockfd, databuf, sizeof (databuf));
		if (nwritten != sizeof (databuf)) {
			log_time();
			if (nwritten < 0) {
				(void) printf(
				    "write returned %d (error %d: %s)\n",
				    nwritten, errno, strerror(errno));
			} else {
				(void) printf("write returned %d\n",
				    nwritten);
			}

			break;
		}

		usleep(500000);
	}

	log_time();
	(void) printf("teardown\n");
	(void) close(sockfd);
	return (0);
}
Ejemplo n.º 4
0
static int
test_icapconnect(void){
	struct sockaddr_in6 sina;
	struct sockaddr_in tina;
	int ret = -1,sd,z = 0;

	if(common_start()){
		goto done;
	}
	memset(&sina,0,sizeof(sina));
	sina.sin6_port = htons(ICAP_DEFAULT_PORT);
	memcpy(&sina.sin6_addr,&in6addr_loopback,sizeof(in6addr_loopback));
	sina.sin6_family = AF_INET6;
	memset(&tina,0,sizeof(tina));
	tina.sin_port = htons(ICAP_DEFAULT_PORT);
	tina.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
	tina.sin_family = AF_INET;
#define CONNECT_COUNT 0x10
	printf(" Connecting to IPv4 ICAP server at loopback:%hu %d times.\n",
			ICAP_DEFAULT_PORT,CONNECT_COUNT);
	for(z = 0 ; z < CONNECT_COUNT ; ++z){
		if((sd = make_tcp_socket(PF_INET)) < 0){
			goto done;
		}
		if(Connect(sd,(struct sockaddr *)&tina,sizeof(tina))){
			Close(sd);
			goto done;
		}
		if(Close(sd)){
			goto done;
		}
	}
	printf(" Connecting to IPv6 ICAP server at loopback:%hu %d times.\n",
			ICAP_DEFAULT_PORT,CONNECT_COUNT);
	for(z = 0 ; z < CONNECT_COUNT ; ++z){
		if((sd = make_tcp_socket(PF_INET6)) < 0){
			if(errno == EAFNOSUPPORT){
				fprintf(stderr, "No local IPv6 support!\n");
				break;
			}
			goto done;
		}
		if(Connect(sd,(struct sockaddr *)&sina,sizeof(sina))){
			Close(sd);
			goto done;
		}
		if(Close(sd)){
			goto done;
		}
	}
#undef CONNECT_COUNT
	ret = 0;

done:
	printf(" Connected %d times, closing servers.\n",z);
	ret |= close_icap_servers();
	ret |= reap_poller_thread(snarepoller);
	ret |= destroy_poller(snarepoller);
	ret |= stop_config();
	ret |= stop_fileconf();
	return ret;
}