int main(int argc, char* argv[]) { char *pacfile = NULL, *url = NULL, *host = NULL, *urlslist = NULL, *client_ip = NULL; if (argv[1] && (STREQ(argv[1], "--help") || STREQ(argv[1], "--helpshort"))) { usage(argv[0]); } signed char c; while ((c = getopt(argc, argv, "evp:u:h:f:c:")) != -1) switch (c) { case 'v': printf("%s\n", pacparser_version()); return 0; case 'p': pacfile = optarg; break; case 'u': url = optarg; break; case 'h': host = optarg; break; case 'f': urlslist = optarg; break; case 'c': client_ip = optarg; break; case 'e': break; case '?': usage(argv[0]); /* fallthrough */ default: abort (); } if (!pacfile) { fprintf(stderr, "pactester.c: You didn't specify the PAC file\n"); usage(argv[0]); } if (!url && !urlslist) { fprintf(stderr, "pactester.c: You didn't specify the URL\n"); usage(argv[0]); } // Initialize pacparser. if (!pacparser_init()) { fprintf(stderr, "pactester.c: Could not initialize pacparser\n"); return 1; } // Read pacfile from stdin. if (STREQ("-", pacfile)) { char *script; size_t script_size = 1; // for the null terminator char buffer[LINEMAX]; script = (char *) malloc(sizeof(char) * LINEMAX); if (script == NULL) { perror("pactetser.c: Failed to allocate the memory for the script"); return 1; } script[0] = '\0'; // Null terminate to prepare for strcat while (fgets(buffer, LINEMAX, stdin)) { if (strlen(buffer) == 0) break; char *old = script; script_size += strlen(buffer); if (script_size > PACMAX) { fprintf(stderr, "Input file is too big. Maximum allowed size is: %d", PACMAX); free(script); return 1; } script = realloc(script, script_size); if (script == NULL) { perror("pactester.c: Failed to allocate the memory for the script"); free(old); return 1; } strcat(script, buffer); } if (ferror(stdin)) { free(script); perror("pactester.c: Error reading from stdin"); return 1; } if (!pacparser_parse_pac_string(script)) { fprintf(stderr, "pactester.c: Could not parse the pac script: %s\n", script); free(script); pacparser_cleanup(); return 1; } free(script); } else { if (!pacparser_parse_pac_file(pacfile)) { fprintf(stderr, "pactester.c: Could not parse the pac file: %s\n", pacfile); pacparser_cleanup(); return 1; } } if (client_ip) pacparser_setmyip(client_ip); char *proxy; if (url) { // If the host was not explicitly given, get it from the URL. // If that fails, return with error (the get_host_from_url() // function will print a proper error message in that case). host = host ? host: get_host_from_url(url); if (!host) { return 1; } proxy = pacparser_find_proxy(url, host); if (proxy == NULL) { fprintf(stderr, "pactester.c: %s %s.\n", "Problem in finding proxy for", url); pacparser_cleanup(); return 1; } printf("%s\n", proxy); } else if (urlslist) { char line[LINEMAX]; FILE *fp; if (!(fp = fopen(urlslist, "r"))) { fprintf(stderr, "pactester.c: Could not open urlslist: %s", urlslist); pacparser_cleanup(); return 1; } while (fgets(line, sizeof(line), fp)) { char *url = line; // Remove spaces from the beginning. while (*url == ' ' || *url == '\t') url++; // Skip comment lines. if (*url == '#') { printf("%s", url); continue; } char *urlend = url; while (*urlend != '\r' && *urlend != '\n' && *urlend != '\0' && *urlend != ' ' && *urlend != '\t') urlend++; // keep moving till you hit space or end of string *urlend = '\0'; if (!(host = get_host_from_url(url)) ) continue; proxy = NULL; proxy = pacparser_find_proxy(url, host); if (proxy == NULL) { fprintf(stderr, "pactester.c: %s %s.\n", "Problem in finding proxy for", url); pacparser_cleanup(); return 1; } if (proxy) printf("%s : %s\n", url, proxy); } fclose(fp); } pacparser_cleanup(); return 0; }
// Parses PAC file (same as pacparser_parse_pac_file) // // (Deprecated) Use pacparser_parse_pac_file instead. int // 0 (=Failure) or 1 (=Success) pacparser_parse_pac(const char *pacfile) { return pacparser_parse_pac_file(pacfile); }