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); }
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; }