// This is a personal academic project. Dear PVS-Studio, please check it. // PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com #include #include #include #include #include #include #include "args.h" static unsigned short port(const char *s) { char *end = 0; const long sl = strtol(s, &end, 10); if (end == s || '\0' != *end || ((LONG_MIN == sl || LONG_MAX == sl) && ERANGE == errno) || sl < 0 || sl > USHRT_MAX) { fprintf(stderr, "Port should be in the range of 1-65536: %s\n", s); exit(1); return 1; } return (unsigned short) sl; } static void user(char *s, struct users *user) { char *p = strchr(s, ':'); if (p == NULL) { fprintf(stderr, "Password not found\n"); exit(1); } else { *p = 0; p++; user->name = s; user->pass = p; } } static void version(void) { fprintf(stderr, "BProxy v0.0\nITBA Protocolos de Comunicación 2021/1 -- Grupo 7\nVer LICENSE.md\n"); } static void usage(const char *progname) { fprintf(stderr, "Usage: %s [OPTION]\n\n" " -h Imprime la ayuda y termina.\n" " -l Dirección donde servirá el proxy SOCKS.\n" " -L Dirección donde servirá el servicio de management.\n" " -p Puerto entrante conexiones SOCKS.\n" " -P Puerto entrante conexiones configuracion.\n" " -u : Usuario y contraseña de usuario que puede usar el proxy. Hasta 500.\n" " -v Imprime información sobre la versión y termina.\n\n", progname); exit(1); } void parse_args(const int argc, char **argv, struct socks5args *args) { memset(args, 0, sizeof(*args)); args->socks_addr = "0.0.0.0"; args->socks_port = 1080; args->mng_addr = "127.0.0.1"; args->mng_port = 8080; args->disectors_enabled = true; int c; int nusers = 0; while (true) { c = getopt(argc, argv, "hl:L:Np:P:u:v"); if (c == -1) break; switch (c) { case 'h': usage(argv[0]); break; case 'l': args->socks_addr = optarg; break; case 'L': args->mng_addr = optarg; break; case 'N': args->disectors_enabled = false; break; case 'p': args->socks_port = port(optarg); break; case 'P': args->mng_port = port(optarg); break; case 'u': if (nusers >= MAX_USERS) { fprintf(stderr, "Maximun number of command line users reached: %d.\n", MAX_USERS); exit(1); } else { user(optarg, args->users + nusers); nusers++; } break; case 'v': version(); exit(0); break; default: fprintf(stderr, "unknown argument %d.\n", c); exit(1); } } if (optind < argc) { fprintf(stderr, "Argument not accepted: "); while (optind < argc) { fprintf(stderr, "%s ", argv[optind++]); } fprintf(stderr, "\n"); exit(1); } }