static void start_filter(char *desthost) { int s, c; struct in_addr dest_ip; CatchChild(); /* start listening on port 445 locally */ s = open_socket_in(SOCK_STREAM, 445, 0, 0, True); if (s == -1) { d_printf("bind failed\n"); exit(1); } if (listen(s, 5) == -1) { d_printf("listen failed\n"); } if (!resolve_name(desthost, &dest_ip, 0x20)) { d_printf("Unable to resolve host %s\n", desthost); exit(1); } while (1) { fd_set fds; int num; struct sockaddr addr; socklen_t in_addrlen = sizeof(addr); FD_ZERO(&fds); FD_SET(s, &fds); num = sys_select_intr(s+1,&fds,NULL,NULL,NULL); if (num > 0) { c = accept(s, &addr, &in_addrlen); if (c != -1) { if (fork() == 0) { close(s); filter_child(c, dest_ip); exit(0); } else { close(c); } } } } }
static void start_filter(char *desthost) { int s, c; struct sockaddr_storage dest_ss; struct sockaddr_storage my_ss; CatchChild(); /* start listening on port 445 locally */ zero_sockaddr(&my_ss); s = open_socket_in(SOCK_STREAM, TCP_SMB_PORT, 0, &my_ss, True); if (s == -1) { d_printf("bind failed\n"); exit(1); } if (listen(s, 5) == -1) { d_printf("listen failed\n"); } if (!resolve_name(desthost, &dest_ss, 0x20, false)) { d_printf("Unable to resolve host %s\n", desthost); exit(1); } while (1) { int num, revents; struct sockaddr_storage ss; socklen_t in_addrlen = sizeof(ss); num = poll_intr_one_fd(s, POLLIN|POLLHUP, -1, &revents); if ((num > 0) && (revents & (POLLIN|POLLHUP|POLLERR))) { c = accept(s, (struct sockaddr *)&ss, &in_addrlen); if (c != -1) { if (fork() == 0) { close(s); filter_child(c, &dest_ss); exit(0); } else { close(c); } } } } }