Lines Matching defs:pair
53 * Each new connection generates a pair of sockets. The data transfer algorithm
304 struct proxy_pair *pair;
306 pair = malloc(sizeof (struct proxy_pair));
307 if (pair == NULL) {
311 (void) memset(pair, 0, sizeof (struct proxy_pair));
312 pair->pp_type = PROXY_USER_PAIR;
313 pair->pp_callback = proxy_func;
314 pair->pp_readfd = -1;
315 pair->pp_writefd = -1;
317 return (pair);
348 free_proxy_pair(struct proxy_pair *pair)
350 if (pair->pp_readfd > -1) {
351 if (close(pair->pp_readfd) < 0) {
356 if (pair->pp_writefd > -1) {
357 if (close(pair->pp_writefd) < 0) {
362 pair->pp_state = PROXY_STATE_FREED;
363 free(pair);
367 * Once a pair has been connected, dup the file descriptors, switching read and
368 * write, so that both pair can be seperately queued for events.
371 clone_and_register(struct proxy_pair *pair)
383 op_pair->pp_state = pair->pp_state;
386 if ((fd = dup(pair->pp_readfd)) < 0) {
394 if ((fd = dup(pair->pp_writefd)) < 0) {
402 /* Register each pair to wait for input */
410 if (port_associate(g_port, PORT_SOURCE_FD, pair->pp_readfd,
411 POLLIN, pair) < 0) {
417 * Increment the proxy count by two, since there are two proxy-pair
437 shutdown_proxypair(struct proxy_pair *pair)
439 (void) port_dissociate(g_port, PORT_SOURCE_FD, pair->pp_readfd);
440 (void) port_dissociate(g_port, PORT_SOURCE_FD, pair->pp_writefd);
442 if (pair->pp_fbcnt > 0)
443 (void) write(pair->pp_writefd, pair->pp_buffer, pair->pp_fbcnt);
445 (void) shutdown(pair->pp_readfd, SHUT_RD);
446 (void) shutdown(pair->pp_writefd, SHUT_WR);
447 free_proxy_pair(pair);
452 send_recv_data(struct proxy_pair *pair)
459 if (pair->pp_fbcnt == 0) /* need to read */ {
460 b_rd = read(pair->pp_readfd, pair->pp_buffer, BUFFER_SIZ);
468 pair->pp_fbcnt = b_rd;
471 if (pair->pp_fbcnt > 0) {
472 b_wr = write(pair->pp_writefd, pair->pp_buffer, pair->pp_fbcnt);
481 if (b_wr < pair->pp_fbcnt) {
483 (void) memmove(pair->pp_buffer,
484 pair->pp_buffer + b_wr,
485 pair->pp_fbcnt - b_wr);
486 pair->pp_fbcnt -= b_wr;
492 pair->pp_fbcnt = 0;
498 if (port_associate(g_port, PORT_SOURCE_FD, pair->pp_readfd,
499 POLLIN, pair) < 0) {
506 if (port_associate(g_port, PORT_SOURCE_FD, pair->pp_writefd,
507 POLLOUT, pair) < 0) {
608 check_connect(struct proxy_pair *pair)
615 if (getsockopt(pair->pp_writefd, SOL_SOCKET, SO_ERROR, &error,
629 proxy_func(struct proxy_pair *pair, port_event_t *ev)
634 pair->pp_state = PROXY_STATE_CLOSING;
635 shutdown_proxypair(pair);
639 switch (pair->pp_state) {
641 rc = check_connect(pair);
646 pair->pp_state = PROXY_STATE_WAIT_DATA;
647 rc = clone_and_register(pair);
650 rc = send_recv_data(pair);
655 pair->pp_state = PROXY_STATE_CLOSING;
656 shutdown_proxypair(pair);
664 struct proxy_pair *pair;
708 pair = alloc_proxy_pair();
709 if (pair == NULL) {
712 pair->pp_readfd = newffd;
716 free_proxy_pair(pair);
748 free_proxy_pair(pair);
754 free_proxy_pair(pair);
764 free_proxy_pair(pair);
771 pair->pp_state = PROXY_STATE_WAIT_CONNECT;
772 pair->pp_writefd = newbfd;
774 if (port_associate(g_port, PORT_SOURCE_FD, pair->pp_writefd,
775 POLLOUT, pair) < 0) {
781 free_proxy_pair(pair);
790 free_proxy_pair(pair);
794 pair->pp_state = PROXY_STATE_WAIT_DATA;
795 pair->pp_writefd = newbfd;
797 if (clone_and_register(pair) < 0) {
798 pair->pp_state = PROXY_STATE_CLOSING;
799 shutdown_proxypair(pair);