/* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) Xavier Roche and other contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: ProxyTrack, httrack cache-based proxy */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Standard includes */ #include #include #include #include #include #include "htsbase.h" #include "htsnet.h" #include "htslib.h" #include "store.h" #include "proxytrack.h" #ifndef _WIN32 #include static void sig_brpipe( int code ) { /* ignore */ } #endif static int scanHostPort(const char* str, char *host, int *port) { char* pos = strrchr(str, ':'); if (pos != NULL) { int n = (int) ( pos - str ); if (n < 256) { host[0] = '\0'; strncat(host, str, n); if (sscanf(pos + 1, "%d", port) == 1) { return 1; } } } return 0; } int main(int argc, char* argv[]) { int i; int ret = 0; int proxyPort, icpPort; char proxyAddr[256 + 1], icpAddr[256 + 1]; PT_Indexes index; #ifdef _WIN32 { WORD wVersionRequested; // requested version WinSock API WSADATA wsadata; // Windows Sockets API data int stat; wVersionRequested = 0x0101; stat = WSAStartup( wVersionRequested, &wsadata ); if (stat != 0) { fprintf(stderr, "Winsock not found!\n"); return -1; } else if (LOBYTE(wsadata.wVersion) != 1 && HIBYTE(wsadata.wVersion) != 1) { fprintf(stderr, "WINSOCK.DLL does not support version 1.1\n"); WSACleanup(); return -1; } } #endif /* Args */ printf("ProxyTrack %s, build proxies upon HTTrack Website Copier Archives\n", PROXYTRACK_VERSION); printf("Copyright (C) Xavier Roche and other contributors\n"); printf("\n"); printf("This program is free software; you can redistribute it and/or\n"); printf("modify it under the terms of the GNU General Public License\n"); printf("as published by the Free Software Foundation; either version 2\n"); printf("of the License, or any later version.\n"); printf("\n"); printf("*** This version is a development release ***\n"); printf("\n"); if (argc < 3 || !scanHostPort(argv[1], proxyAddr, &proxyPort) || !scanHostPort(argv[2], icpAddr, &icpPort)) { fprintf(stderr, "usage: %s [ ( | | --list ) ..]\n", argv[0]); fprintf(stderr, "\texample:%s proxy:8080 localhost:3130 /home/archives/www-archive-01.zip /home/old-archives/www-archive-02.ndx\n", argv[0]); return 1; } index = PT_New(); for(i = 3 ; i < argc ; i++) { if (argv[i][0] == '-') { if (strcmp(argv[i], "--list") == 0) { if (i + 1 < argc) { char line[256 + 1]; FILE *fp = fopen(argv[++i], "rb"); if (fp == NULL) { fprintf(stderr, "error: could not process list %s\n", argv[i]); exit(1); } while(linput(fp, line, 256)) { int itemsAdded = PT_AddIndex(index, line); if (itemsAdded > 0) { fprintf(stderr, "processed: %s (%d items added)\n", line, itemsAdded); } else if (itemsAdded == 0) { fprintf(stderr, "processed: %s (no items added)\n", line); } else { fprintf(stderr, "error: could not process %s\n", line); } } fclose(fp); } } else { fprintf(stderr, "* bad arg %s\n", argv[i]); exit(1); } } else { int itemsAdded = PT_AddIndex(index, argv[i]); if (itemsAdded > 0) { fprintf(stderr, "processed: %s (%d items added)\n", argv[i], itemsAdded); } else if (itemsAdded == 0) { fprintf(stderr, "processed: %s (no items added)\n", argv[i]); } else { fprintf(stderr, "error: could not process %s\n", argv[i]); } } } /* sigpipe */ #ifndef _WIN32 signal( SIGPIPE , sig_brpipe ); // broken pipe (write into non-opened socket) #endif /* Go */ ret = proxytrack_main(proxyAddr, proxyPort, icpAddr, icpPort, index); /* Wipe */ PT_Delete(index); #ifdef _WIN32 WSACleanup(); #endif return ret; }