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); } } } } }
NTSTATUS read_fd_with_timeout(int fd, char *buf, size_t mincnt, size_t maxcnt, unsigned int time_out, size_t *size_ret) { int pollrtn; ssize_t readret; size_t nread = 0; /* just checking .... */ if (maxcnt <= 0) return NT_STATUS_OK; /* Blocking read */ if (time_out == 0) { if (mincnt == 0) { mincnt = maxcnt; } while (nread < mincnt) { readret = sys_read(fd, buf + nread, maxcnt - nread); if (readret == 0) { DEBUG(5,("read_fd_with_timeout: " "blocking read. EOF from client.\n")); return NT_STATUS_END_OF_FILE; } if (readret == -1) { return map_nt_error_from_unix(errno); } nread += readret; } goto done; } /* Most difficult - timeout read */ /* If this is ever called on a disk file and mincnt is greater then the filesize then system performance will suffer severely as select always returns true on disk files */ for (nread=0; nread < mincnt; ) { int revents; pollrtn = poll_intr_one_fd(fd, POLLIN|POLLHUP, time_out, &revents); /* Check if error */ if (pollrtn == -1) { return map_nt_error_from_unix(errno); } /* Did we timeout ? */ if ((pollrtn == 0) || ((revents & (POLLIN|POLLHUP|POLLERR)) == 0)) { DEBUG(10,("read_fd_with_timeout: timeout read. " "select timed out.\n")); return NT_STATUS_IO_TIMEOUT; } readret = sys_read(fd, buf+nread, maxcnt-nread); if (readret == 0) { /* we got EOF on the file descriptor */ DEBUG(5,("read_fd_with_timeout: timeout read. " "EOF from client.\n")); return NT_STATUS_END_OF_FILE; } if (readret == -1) { return map_nt_error_from_unix(errno); } nread += readret; } done: /* Return the number we got */ if (size_ret) { *size_ret = nread; } return NT_STATUS_OK; }