#include #include #include #include #include #include #include #include #include "buffer.h" #include "net.h" #include "util.h" const char *progname="nc"; const char *command=NULL; /* buffer_t *hexbuf=NULL; */ extern char *optarg; extern int optind, opterr, optopt; int usage(FILE *stream, int retval) { fprintf(stream, "%s [options] hostname port\n" " -h Display command usage\n" " -e command Command to run instead for input/output\n" " -s hostname Use specified source address\n" " -p port Use specified source port\n" " -l Become a network listener\n" , progname); if (fflush(stream) || ferror(stream)) return 1; return retval; } void newconn_accept(listener_t *listener UNUSED, connection_t *conn) { fd_t *infd=fd_stdin, *outfd=fd_stdout; if (command) inout_program(command, &infd, &outfd); conn->tonet=buffer_alloc(); conn->fromnet=buffer_alloc(); buffer_init_passthrough(conn->tonet, infd, conn->fd, 4096, NULL); buffer_init_passthrough(conn->fromnet, conn->fd, outfd, 4096, NULL); fd_set_close_on_exec(conn->fd); fd_set_close_on_exec(infd); fd_set_close_on_exec(outfd); fd_set_nonblock(conn->fd); fd_set_nonblock(infd); fd_set_nonblock(outfd); } void newconn_connected(connection_t *conn) { fd_t *infd=fd_stdin, *outfd=fd_stdout; if (command) inout_program(command, &infd, &outfd); conn->tonet=buffer_alloc(); conn->fromnet=buffer_alloc(); buffer_init_passthrough(conn->tonet, infd, conn->fd, 4096, NULL); buffer_init_passthrough(conn->fromnet, conn->fd, outfd, 4096, NULL); fd_set_close_on_exec(infd); fd_set_close_on_exec(outfd); fd_set_nonblock(conn->fd); fd_set_nonblock(infd); fd_set_nonblock(outfd); } int main(int argc, char *argv[]) { char c; /* char *hexfile=NULL; */ char *shost=NULL, *dhost=NULL; int listener=0; unsigned short sport=0, dport=0; if (argc) setprogname(argv[0]); fd_prog_init(); while ((c=getopt(argc, argv, "e:hp:ls:"))!=-1) switch(c) { case '?': case ':': die("Error parsing command line - try `%s -h'\n", progname); case 'e': command=optarg; break; case 'p': if (getport(optarg, &sport)) die("Error parsing source port: %s\n", strerror(errno)); break; case 'h': return usage(stdout, 0); case 'l': listener=1; break; /* case 'o': */ /* hexfile=optarg; */ /* break; */ case 's': shost=optarg; break; default: die_hard("BUG! getopt returned %i (%c)\n", c, c); } if (optindfd); } else { connection_create(shost, sport, dhost, dport, newconn_connected); } while (1) { int maxfd=-1; fd_set rfds, wfds; FD_ZERO(&rfds); FD_ZERO(&wfds); fd_all_preselect(&maxfd, &rfds, &wfds); if (maxfd==-1) break; select(maxfd+1, &rfds, &wfds, NULL, NULL); fd_all_postselect(&rfds, &wfds); } return 0; }