void *pthread_body_writer(void *_pi) { struct pthread_info *pi = _pi; LOG("id=%p, from_fd=%d, to_fd=%d, name=%s\r\n", pi->id, pi->from_fd, pi->to_fd, pi->name); pass_data(pi); return NULL; } /* pthread_body_writer */
void* tcp_server_handler(void* arg) { tcp_server_thread_info* pinfo = (tcp_server_thread_info *)arg; int printer_socket = tcp_connect_to_printer(pinfo->printer, pinfo->printer_port); fd_set sockets; timeval tv; int maxfd = pinfo->accepted_socket > printer_socket ? pinfo->accepted_socket : printer_socket; maxfd += 1; int running = 1; int total_bytes = 0; while (running) { FD_ZERO(&sockets); FD_SET(pinfo->accepted_socket, &sockets); FD_SET(printer_socket, &sockets); tv.tv_sec = 3; tv.tv_usec = 0; switch(select(maxfd, &sockets, NULL, NULL, &tv)) { case -1: printf("error in select.\n"); exit(1); case 0: printf("no data.\n"); break; default: int from = pinfo->accepted_socket; int to = printer_socket; if (FD_ISSET(printer_socket, &sockets)) { from = printer_socket; to = pinfo->accepted_socket; } int err = test_socket(from); if (err <= 0 and errno != EAGAIN) { printf("client socket closed.\n"); running = 0; break; } total_bytes += pass_data(from, to); } } printf("thread exit. passed %d bytes in this session.\n", total_bytes); close(printer_socket); delete pinfo; }
void *pthread_body_reader(void *_pi) { struct pthread_info *pi = _pi; LOG("id=%p, from_fd=%d, to_fd=%d, name=%s\r\n", pi->id, pi->from_fd, pi->to_fd, pi->name); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); /* initialize the pty config with the saved one. */ tcsetattr(ptym, TCSAFLUSH, &saved_tty); /* ... and run */ pass_data(pi); return NULL; } /* pthread_body_reader */