📄 bnproxy.c
字号:
currsize = virtconn_get_clientout_size(vc); switch (net_send_packet(csocket,queue_peek_packet((t_queue const * const *)virtconn_get_clientout_queue(vc)),&currsize)) /* avoid warning */ { case -1: virtconn_destroy(vc); continue; case 0: /* still working on it */ virtconn_set_clientout_size(vc,currsize); break; case 1: /* done sending */ packet = queue_pull_packet(virtconn_get_clientout_queue(vc)); if (hexstrm) { fprintf(hexstrm,"%d: srv class=%s[0x%04hx] type=%s[0x%04hx] length=%hu\n", csocket, packet_get_class_str(packet),packet_get_class(packet), packet_get_type_str(packet,packet_dir_from_server),packet_get_type(packet), packet_get_size(packet)); hexdump(hexstrm,packet_get_raw_data(packet,0),packet_get_size(packet)); } packet_del_ref(packet); virtconn_set_clientout_size(vc,0); } } eventlog(eventlog_level_debug,__FUNCTION__,"checking %d for server writeability",ssocket); if (ssocket!=-1 && PSOCK_FD_ISSET(ssocket,&wfds)) { if (virtconn_get_state(vc)==virtconn_state_connecting) { int err; psock_t_socklen errlen; err = 0; errlen = sizeof(err); if (psock_getsockopt(ssocket,PSOCK_SOL_SOCKET,PSOCK_SO_ERROR,&err,&errlen)<0) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] unable to read socket error (psock_getsockopt[psock_connect]: %s)",virtconn_get_client_socket(vc),pstrerror(psock_errno())); virtconn_destroy(vc); continue; } if (errlen==0 || err==0) virtconn_set_state(vc,virtconn_state_connected); else { eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not connect to server (psock_getsockopt[psock_connect]: %s)",virtconn_get_client_socket(vc),pstrerror(err)); virtconn_destroy(vc); continue; } } else { currsize = virtconn_get_serverout_size(vc); switch (net_send_packet(ssocket,queue_peek_packet((t_queue const * const *)virtconn_get_serverout_queue(vc)),&currsize)) /* avoid warning */ { case -1: virtconn_destroy(vc); continue; case 0: /* still working on it */ virtconn_set_serverout_size(vc,currsize); break; case 1: /* done sending */ packet = queue_pull_packet(virtconn_get_serverout_queue(vc)); packet_del_ref(packet); virtconn_set_serverout_size(vc,0); } } } } eventlog(eventlog_level_debug,__FUNCTION__,"done checking"); } return 0;}static void usage(char const * progname){ fprintf(stderr, "usage: %s [<options>] <servername> [<TCP portnumber>]\n" " -d FILE, --hexdump=FILE do hex dump of packets into FILE\n" " -l FILE, --logfile=FILE save eventlog lines into FILE\n" " -p PORT, --port=PORT listen for connections on port PORT\n"#ifdef DO_DAEMONIZE " -f, --foreground don't daemonize\n"#else " -f, --foreground don't daemonize (default)\n"#endif " -h, --help, --usage show this information and exit\n" " -v, --version print version number and exit\n", progname); exit(STATUS_FAILURE);}extern int main(int argc, char * argv[]){ int a; char const * logfile=NULL; char const * hexfile=NULL; int foreground=0; unsigned short port=0; char const * servname=NULL; unsigned short servport=0; struct hostent * host; struct sockaddr_in servaddr; if (argc<1 || !argv || !argv[0]) { fprintf(stderr,"bad arguments\n"); return STATUS_FAILURE; } for (a=1; a<argc; a++) if (servname && isdigit((int)argv[a][0]) && a+1>=argc) { if (str_to_ushort(argv[a],&servport)<0) { fprintf(stderr,"%s: \"%s\" should be a positive integer\n",argv[0],argv[a]); usage(argv[0]); } } else if (!servname && argv[a][0]!='-' && a+2>=argc) servname = argv[a]; else if (strncmp(argv[a],"--hexdump=",10)==0) { if (hexfile) { fprintf(stderr,"%s: hexdump file was already specified as \"%s\"\n",argv[0],hexfile); usage(argv[0]); } hexfile = &argv[a][10]; } else if (strcmp(argv[a],"-d")==0) { if (a+1>=argc) { fprintf(stderr,"%s: option \"%s\" requires an argument\n",argv[0],argv[a]); usage(argv[0]); } if (hexfile) { fprintf(stderr,"%s: hexdump file was already specified as \"%s\"\n",argv[0],hexfile); usage(argv[0]); } a++; hexfile = argv[a]; } else if (strncmp(argv[a],"--logfile=",10)==0) { if (logfile) { fprintf(stderr,"%s: eventlog file was already specified as \"%s\"\n",argv[0],logfile); usage(argv[0]); } logfile = &argv[a][10]; } else if (strcmp(argv[a],"-l")==0) { if (a+1>=argc) { fprintf(stderr,"%s: option \"%s\" requires an argument\n",argv[0],argv[a]); usage(argv[0]); } if (logfile) { fprintf(stderr,"%s: eventlog file was already specified as \"%s\"\n",argv[0],logfile); usage(argv[0]); } a++; logfile = argv[a]; } else if (strncmp(argv[a],"--port=",7)==0) { if (port>0) { fprintf(stderr,"%s: listen port was already specified as \"%hu\"\n",argv[0],port); usage(argv[0]); } if (str_to_ushort(&argv[a][7],&port)<0) { fprintf(stderr,"%s: \"%s\" should be a positive integer\n",argv[0],argv[a]); usage(argv[0]); } } else if (strcmp(argv[a],"-p")==0) { if (a+1>=argc) { fprintf(stderr,"%s: option \"%s\" requires an argument\n",argv[0],argv[a]); usage(argv[0]); } if (port>0) { fprintf(stderr,"%s: eventlog file was already specified as \"%hu\"\n",argv[0],port); usage(argv[0]); } a++; if (str_to_ushort(argv[a],&port)<0) { fprintf(stderr,"%s: \"%s\" should be a positive integer\n",argv[0],argv[a]); usage(argv[0]); } } else if (strcmp(argv[a],"-f")==0 || strcmp(argv[a],"--foreground")==0) foreground = 1; else if (strcmp(argv[a],"-h")==0 || strcmp(argv[a],"--help")==0 || strcmp(argv[a],"--usage")==0) usage(argv[0]); else if (strcmp(argv[a],"-v")==0 || strcmp(argv[a],"--version")==0) { printf("version "PVPGN_VERSION"\n"); return STATUS_SUCCESS; } else if (strcmp(argv[a],"--hexdump")==0 || strcmp(argv[a],"--logfile")==0 || strcmp(argv[a],"--port")==0) { fprintf(stderr,"%s: option \"%s\" requires and argument.\n",argv[0],argv[a]); usage(argv[0]); } else { fprintf(stderr,"%s: bad option \"%s\"\n",argv[0],argv[a]); usage(argv[0]); } if (port==0) port = BNETD_SERV_PORT; if (servport==0) servport = BNETD_SERV_PORT; if (!servname) servname = BNETD_DEFAULT_HOST; if (psock_init()<0) { fprintf(stderr,"%s: could not initialize socket functions\n",argv[0]); return STATUS_FAILURE; } if (!(host = gethostbyname(servname))) { fprintf(stderr,"%s: unknown host \"%s\"\n",argv[0],servname); return STATUS_FAILURE; } memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family = PSOCK_AF_INET; servaddr.sin_port = htons(servport); memcpy(&servaddr.sin_addr.s_addr,host->h_addr_list[0],host->h_length); eventlog_set(stderr); /* errors to eventlog from here on... */ if (logfile) { eventlog_clear_level(); eventlog_add_level("error"); eventlog_add_level("warn"); eventlog_add_level("info"); eventlog_add_level("debug"); if (eventlog_open(logfile)<0) { eventlog(eventlog_level_fatal,__FUNCTION__,"could not use file \"%s\" for the eventlog (exiting)",logfile); return STATUS_FAILURE; } } #ifdef DO_DAEMONIZE if (!foreground) { if (chdir("/")<0) { eventlog(eventlog_level_error,__FUNCTION__,"could not change working directory to / (chdir: %s)",pstrerror(errno)); return STATUS_FAILURE; } switch (fork()) { case -1: eventlog(eventlog_level_error,__FUNCTION__,"could not fork (fork: %s)",pstrerror(errno)); return STATUS_FAILURE; case 0: /* child */ break; default: /* parent */ return STATUS_SUCCESS; } close(STDINFD); close(STDOUTFD); close(STDERRFD); # ifdef HAVE_SETPGID if (setpgid(0,0)<0) { eventlog(eventlog_level_error,__FUNCTION__,"could not create new process group (setpgid: %s)",pstrerror(errno)); return STATUS_FAILURE; }# else# ifdef HAVE_SETPGRP# ifdef SETPGRP_VOID if (setpgrp()<0) { eventlog(eventlog_level_error,__FUNCTION__,"could not create new process group (setpgrp: %s)",pstrerror(errno)); return STATUS_FAILURE; }# else if (setpgrp(0,0)<0) { eventlog(eventlog_level_error,__FUNCTION__,"could not create new process group (setpgrp: %s)",pstrerror(errno)); return STATUS_FAILURE; }# endif# else# ifdef HAVE_SETSID if (setsid()<0) { eventlog(eventlog_level_error,__FUNCTION__,"could not create new process group (setsid: %s)",pstrerror(errno)); return STATUS_FAILURE; }# else# error "One of setpgid(), setpgrp(), or setsid() is required"# endif# endif# endif }#endif if (hexfile) if (!(hexstrm = fopen(hexfile,"w"))) eventlog(eventlog_level_error,__FUNCTION__,"could not open file \"%s\" for writing the hexdump (fopen: %s)",hexfile,pstrerror(errno)); if (proxy_process(port,servaddr)<0) { eventlog(eventlog_level_fatal,__FUNCTION__,"failed to initialize network (exiting)"); return STATUS_FAILURE; } if (hexstrm) if (fclose(hexstrm)<0) eventlog(eventlog_level_error,__FUNCTION__,"could not close hexdump file \"%s\" after writing (fclose: %s)",hexfile,pstrerror(errno)); return STATUS_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -