int main(int argc, char * const* argv) { int status = EXIT_SUCCESS; int c; int idx = 0; while ((c = getopt_long(argc, argv, "", compiler_opts, &idx)) != -1) { switch (c) { case 'v': options.glsl_version = strtol(optarg, NULL, 10); break; default: break; } } if (argc <= optind) usage_fail(argv[0]); struct gl_shader_program *whole_program; whole_program = standalone_compile_shader(&options, argc - optind, &argv[optind]); if (!whole_program) usage_fail(argv[0]); standalone_compiler_cleanup(whole_program); return status; }
static void parse_host_and_port(const char *prog, const char *name, char *inp, int wildcard_okay, const char **ip, const char **port) { char buf[150]; char *sp; if (strlen(inp) >= sizeof buf) { snprintf(buf, sizeof buf, "invalid option for %s HOST,PORT\n", name); usage_fail(prog, buf); } sp = strchr(inp, ','); if (!sp) { snprintf(buf, sizeof buf, "invalid option for %s HOST,PORT\n", name); usage_fail(prog, buf); } if (!strncmp(inp, "*", sp - inp)) { if (!wildcard_okay) { snprintf(buf, sizeof buf, "wildcard host specification invalid for %s\n", name); usage_fail(prog, buf); } *ip = NULL; } else { *sp = 0; *ip = inp; } *port = sp + 1; }
/* Handle command line arguments modifying behavior */ static void parse_cli(int argc, char **argv) { const char *prog = argv[0]; static int tls = 0, ssl = 0; int c; struct passwd* passwd; static struct option long_options[] = { {"tls", 0, &tls, 1}, {"ssl", 0, &ssl, 1}, {"write-ip", 0, &OPTIONS.WRITE_IP_OCTET, 1}, {"write-proxy", 0, &OPTIONS.WRITE_PROXY_LINE, 1}, {0, 0, 0, 0} }; while (1) { int option_index = 0; c = getopt_long(argc, argv, "hf:b:n:c:u:r:B:C:q", long_options, &option_index); if (c == -1) break; switch (c) { case 0: break; case 'n': errno = 0; OPTIONS.NCORES = strtol(optarg, NULL, 10); if ((errno == ERANGE && (OPTIONS.NCORES == LONG_MAX || OPTIONS.NCORES == LONG_MIN)) || OPTIONS.NCORES < 1 || OPTIONS.NCORES > 128) { usage_fail(prog, "invalid option for -n CORES; please provide an integer between 1 and 128\n"); } break; case 'b': parse_host_and_port(prog, "-b", optarg, 0, &(OPTIONS.BACK_IP), &(OPTIONS.BACK_PORT)); break; case 'f': parse_host_and_port(prog, "-f", optarg, 1, &(OPTIONS.FRONT_IP), &(OPTIONS.FRONT_PORT)); break; case 'c': OPTIONS.CIPHER_SUITE = optarg; break; case 'u': passwd = getpwnam(optarg); if (!passwd) { if (errno) fail("getpwnam failed"); else ERR("user not found: %s\n", optarg); exit(1); } OPTIONS.UID = passwd->pw_uid; OPTIONS.GID = passwd->pw_gid; break; case 'r': if (optarg && optarg[0] == '/') OPTIONS.CHROOT = optarg; else { ERR("chroot must be absolute path: \"%s\"\n", optarg); exit(1); } break; case 'B': OPTIONS.BACKLOG = atoi(optarg); if ( OPTIONS.BACKLOG <= 0 ) { ERR("listen backlog can not be set to %d\n", OPTIONS.BACKLOG); exit(1); } break; #ifdef USE_SHARED_CACHE case 'C': OPTIONS.SHARED_CACHE = atoi(optarg); if ( OPTIONS.SHARED_CACHE < 0 ) { ERR("shared cache size can not be set to %d\n", OPTIONS.SHARED_CACHE); exit(1); } break; #endif case 'q': OPTIONS.QUIET = 1; break; default: usage_fail(prog, NULL); } } /* Post-processing */ if (tls && ssl) usage_fail(prog, "Cannot specify both --tls and --ssl"); if (ssl) OPTIONS.ETYPE = ENC_SSL; // implied.. else, TLS if (OPTIONS.WRITE_IP_OCTET && OPTIONS.WRITE_PROXY_LINE) usage_fail(prog, "Cannot specify both --write-ip and --write-proxy; pick one!"); argc -= optind; argv += optind; if (argc != 1) usage_fail(prog, "exactly one argument is required: path to PEM file with cert/key"); OPTIONS.CERT_FILE = argv[0]; }
/* Handle command line arguments modifying behavior */ static void parse_cli(int argc, char **argv) { char *prog = argv[0]; OPTIONS.FRONT_IP = NULL; OPTIONS.FRONT_PORT = "8443"; OPTIONS.BACK_IP = "127.0.0.1"; OPTIONS.BACK_PORT = "8000"; OPTIONS.ETYPE = ENC_TLS; OPTIONS.NCORES = 1; OPTIONS.WRITE_IP_OCTET = 0; OPTIONS.CIPHER_SUITE = NULL; static int tls = 0, ssl = 0, writeip = 0; int c; static struct option long_options[] = { {"tls", 0, &tls, 1}, {"ssl", 0, &ssl, 1}, {"write-ip", 0, &writeip, 1}, {0, 0, 0, 0} }; while (1) { int option_index = 0; c = getopt_long(argc, argv, "hf:b:n:c:", long_options, &option_index); if (c == -1) break; switch (c) { case 0: break; case 'n': OPTIONS.NCORES = strtol(optarg, NULL, 10); if (errno || OPTIONS.NCORES < 1 || OPTIONS.NCORES > 128) usage_fail(prog, "invalid option for -n CORES; please provide an integer between 1 and 128\n"); break; case 'b': parse_host_and_port(prog, "-b", optarg, 0, &(OPTIONS.BACK_IP), &(OPTIONS.BACK_PORT)); break; case 'f': parse_host_and_port(prog, "-f", optarg, 1, &(OPTIONS.FRONT_IP), &(OPTIONS.FRONT_PORT)); break; case 'c': OPTIONS.CIPHER_SUITE = optarg; break; default: usage_fail(prog, NULL); } } /* Post-processing */ if (tls && ssl) usage_fail(prog, "Cannot specify both --tls and --ssl"); if (ssl) OPTIONS.ETYPE = ENC_SSL; // implied.. else, TLS if (writeip) OPTIONS.WRITE_IP_OCTET = 1; argc -= optind; argv += optind; if (argc != 1) usage_fail(prog, "exactly one argument is required: path to PEM file with cert/key"); OPTIONS.CERT_FILE = argv[0]; }