📄 bntrackd.c
字号:
if (ntohs(packet.packet_version)>=TRACK_VERSION) { packet.software[sizeof(packet.software)-1] = '\0'; if (strstr(packet.software,"##")) fixup_str(packet.software); packet.version[sizeof(packet.version)-1] = '\0'; if (strstr(packet.version,"##")) fixup_str(packet.version); packet.platform[sizeof(packet.platform)-1] = '\0'; if (strstr(packet.platform,"##")) fixup_str(packet.platform); packet.server_desc[sizeof(packet.server_desc)-1] = '\0'; if (strstr(packet.server_desc,"##")) fixup_str(packet.server_desc); packet.server_location[sizeof(packet.server_location)-1] = '\0'; if (strstr(packet.server_location,"##")) fixup_str(packet.server_location); packet.server_url[sizeof(packet.server_url)-1] = '\0'; if (strstr(packet.server_url,"##")) fixup_str(packet.server_url); packet.contact_name[sizeof(packet.contact_name)-1] = '\0'; if (strstr(packet.contact_name,"##")) fixup_str(packet.contact_name); packet.contact_email[sizeof(packet.contact_email)-1] = '\0'; if (strstr(packet.contact_email,"##")) fixup_str(packet.contact_email); /* Find this server's slot */ LIST_TRAVERSE(serverlist_head,curr) { server = elem_get_data(curr); if (!memcmp(&server->address,&cliaddr.sin_addr,sizeof(struct in_addr))) { if (ntohl(packet.flags)&TF_SHUTDOWN) { list_remove_elem(serverlist_head,&curr); xfree(server); } else { /* update in place */ server->info = packet; server->updated = time(NULL); } break; } } /* Not found? Make a new slot */ if (!(ntohl(packet.flags)&TF_SHUTDOWN) && !curr) { server = xmalloc(sizeof(t_server)); server->address = cliaddr.sin_addr; server->info = packet; server->updated = time(NULL); list_append_data(serverlist_head,server); } eventlog(eventlog_level_debug,__FUNCTION__, "Packet received from %s:" " packet_version=%u" " flags=0x%08lx" " port=%hu" " software=\"%s\"" " version=\"%s\"" " platform=\"%s\"" " server_desc=\"%s\"" " server_location=\"%s\"" " server_url=\"%s\"" " contact_name=\"%s\"" " contact_email=\"%s\"" " uptime=%lu" " total_games=%lu" " total_logins=%lu", inet_ntoa(cliaddr.sin_addr), ntohs(packet.packet_version), (unsigned long)ntohl(packet.flags), ntohs(packet.port), packet.software, packet.version, packet.platform, packet.server_desc, packet.server_location, packet.server_url, packet.contact_name, packet.contact_email, (unsigned long)ntohl(packet.uptime), (unsigned long)ntohl(packet.total_games), (unsigned long)ntohl(packet.total_logins)); } } } }}static void usage(char const * progname){ fprintf(stderr,"usage: %s [<options>]\n",progname); fprintf(stderr, " -c COMMAND, --command=COMMAND execute COMMAND update\n" " -d, --debug turn on debug mode\n" " -e SECS, --expire SECS forget a list entry after SEC seconds\n"#ifdef DO_DAEMONIZE " -f, --foreground don't daemonize\n"#else " -f, --foreground don't daemonize (default)\n"#endif " -l FILE, --logfile=FILE write event messages to FILE\n" " -o FILE, --outfile=FILE write server list to FILE\n"); fprintf(stderr, " -p PORT, --port=PORT listen for announcments on UDP port PORT\n" " -P FILE, --pidfile=FILE write pid to FILE\n" " -u SECS, --update SECS write output file every SEC seconds\n" " -x, --XML write output file in XML format\n" " -h, --help, --usage show this information and exit\n" " -v, --version print version number and exit\n"); exit(STATUS_FAILURE);}static void getprefs(int argc, char * argv[]){ int a; prefs.foreground = 0; prefs.debug = 0; prefs.expire = 0; prefs.update = 0; prefs.port = 0; prefs.XML_mode = 0; prefs.outfile = NULL; prefs.pidfile = NULL; prefs.process = NULL; prefs.logfile = NULL; for (a=1; a<argc; a++) if (strncmp(argv[a],"--command=",10)==0) { if (prefs.process) { fprintf(stderr,"%s: processing command was already specified as \"%s\"\n",argv[0],prefs.process); usage(argv[0]); } prefs.process = &argv[a][10]; } else if (strcmp(argv[a],"-c")==0) { if (a+1>=argc) { fprintf(stderr,"%s: option \"%s\" requires an argument\n",argv[0],argv[a]); usage(argv[0]); } if (prefs.process) { fprintf(stderr,"%s: processing command was already specified as \"%s\"\n",argv[0],prefs.process); usage(argv[0]); } a++; prefs.process = argv[a]; } else if (strcmp(argv[a],"-d")==0 || strcmp(argv[a],"--debug")==0) prefs.debug = 1; else if (strncmp(argv[a],"--expire=",9)==0) { if (prefs.expire) { fprintf(stderr,"%s: expiration period was already specified as \"%u\"\n",argv[0],prefs.expire); usage(argv[0]); } if (str_to_uint(&argv[a][9],&prefs.expire)<0) { fprintf(stderr,"%s: \"%s\" should be a positive integer\n",argv[0],&argv[a][9]); usage(argv[0]); } } else if (strcmp(argv[a],"-e")==0) { if (a+1>=argc) { fprintf(stderr,"%s: option \"%s\" requires an argument\n",argv[0],argv[a]); usage(argv[0]); } if (prefs.expire) { fprintf(stderr,"%s: expiration period was already specified as \"%u\"\n",argv[0],prefs.expire); usage(argv[0]); } a++; if (str_to_uint(argv[a],&prefs.expire)<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) prefs.foreground = 1; else if (strcmp(argv[a],"-x")==0 || strcmp(argv[a],"--XML")==0) prefs.XML_mode = 1; else if (strncmp(argv[a],"--logfile=",10)==0) { if (prefs.logfile) { fprintf(stderr,"%s: eventlog file was already specified as \"%s\"\n",argv[0],prefs.logfile); usage(argv[0]); } prefs.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 (prefs.logfile) { fprintf(stderr,"%s: eventlog file was already specified as \"%s\"\n",argv[0],prefs.logfile); usage(argv[0]); } a++; prefs.logfile = argv[a]; } else if (strncmp(argv[a],"--outfile=",10)==0) { if (prefs.outfile) { fprintf(stderr,"%s: output file was already specified as \"%s\"\n",argv[0],prefs.outfile); usage(argv[0]); } prefs.outfile = &argv[a][10]; } else if (strcmp(argv[a],"-o")==0) { if (a+1>=argc) { fprintf(stderr,"%s: option \"%s\" requires an argument\n",argv[0],argv[a]); usage(argv[0]); } if (prefs.outfile) { fprintf(stderr,"%s: output file was already specified as \"%s\"\n",argv[0],prefs.outfile); usage(argv[0]); } a++; prefs.outfile = argv[a]; } else if (strncmp(argv[a],"--pidfile=",10)==0) { if (prefs.pidfile) { fprintf(stderr,"%s: pid file was already specified as \"%s\"\n",argv[0],prefs.pidfile); usage(argv[0]); } prefs.pidfile = &argv[a][10]; } else if (strncmp(argv[a],"--port=",7)==0) { if (prefs.port) { fprintf(stderr,"%s: port number was already specified as \"%hu\"\n",argv[0],prefs.port); usage(argv[0]); } if (str_to_ushort(&argv[a][7],&prefs.port)<0) { fprintf(stderr,"%s: \"%s\" should be a positive integer\n",argv[0],&argv[a][7]); 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 (prefs.port) { fprintf(stderr,"%s: port number was already specified as \"%hu\"\n",argv[0],prefs.port); usage(argv[0]); } a++; if (str_to_ushort(argv[a],&prefs.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 (prefs.pidfile) { fprintf(stderr,"%s: pid file was already specified as \"%s\"\n",argv[0],prefs.pidfile); usage(argv[0]); } a++; prefs.pidfile = argv[a]; } else if (strncmp(argv[a],"--update=",9)==0) { if (prefs.update) { fprintf(stderr,"%s: update period was already specified as \"%u\"\n",argv[0],prefs.expire); usage(argv[0]); } if (str_to_uint(&argv[a][9],&prefs.update)<0) { fprintf(stderr,"%s: \"%s\" should be a positive integer\n",argv[0],&argv[a][9]); usage(argv[0]); } } else if (strcmp(argv[a],"-u")==0) { if (a+1>=argc) { fprintf(stderr,"%s: option \"%s\" requires an argument\n",argv[0],argv[a]); usage(argv[0]); } if (prefs.update) { fprintf(stderr,"%s: update period was already specified as \"%u\"\n",argv[0],prefs.expire); usage(argv[0]); } a++; if (str_to_uint(argv[a],&prefs.update)<0) { fprintf(stderr,"%s: \"%s\" should be a positive integer\n",argv[0],argv[a]); usage(argv[0]); } } 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"); exit(0); } else if (strcmp(argv[a],"--command")==0 || strcmp(argv[a],"--expire")==0 || strcmp(argv[a],"--logfile")==0 || strcmp(argv[a],"--outfile")==0 || strcmp(argv[a],"--port")==0 || strcmp(argv[a],"--pidfile")==0 || strcmp(argv[a],"--update")==0) { fprintf(stderr,"%s: option \"%s\" requires and argument.\n",argv[0],argv[a]); usage(argv[0]); } else { fprintf(stderr,"%s: unknown option \"%s\"\n",argv[0],argv[a]); usage(argv[0]); } if (!prefs.process) prefs.process = BNTRACKD_PROCESS; if (prefs.expire==0) prefs.expire = BNTRACKD_EXPIRE; if (!prefs.logfile) prefs.logfile = BNTRACKD_LOGFILE; if (!prefs.outfile) prefs.outfile = BNTRACKD_OUTFILE; if (prefs.port==0) prefs.port = BNTRACKD_SERVER_PORT; if (!prefs.pidfile) prefs.pidfile = BNTRACKD_PIDFILE; if (prefs.expire==0) prefs.update = BNTRACKD_UPDATE; if (prefs.logfile[0]=='\0') prefs.logfile = NULL; if (prefs.pidfile[0]=='\0') prefs.pidfile = NULL;}static void fixup_str(char * str){ char prev; unsigned int i; for (prev='\0',i=0; i<strlen(str); prev=str[i],i++) if (prev=='#' && str[i]=='#') str[i] = '%';}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -