diff options
author | Xavier Roche <xroche@users.noreply.github.com> | 2012-03-19 12:36:11 +0000 |
---|---|---|
committer | Xavier Roche <xroche@users.noreply.github.com> | 2012-03-19 12:36:11 +0000 |
commit | ad5b7acc19290ff91e0f42a0de448a26760fcf99 (patch) | |
tree | 2d1867758835fd0c4e443ff3cc7e5c774af85874 /src/htsalias.c |
Imported httrack 3.20.2
Diffstat (limited to 'src/htsalias.c')
-rw-r--r-- | src/htsalias.c | 520 |
1 files changed, 520 insertions, 0 deletions
diff --git a/src/htsalias.c b/src/htsalias.c new file mode 100644 index 0000000..65a34e3 --- /dev/null +++ b/src/htsalias.c @@ -0,0 +1,520 @@ +/* ------------------------------------------------------------ */ +/* +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. + + +Important notes: + +- We hereby ask people using this source NOT to use it in purpose of grabbing +emails addresses, or collecting any other private information on persons. +This would disgrace our work, and spoil the many hours we spent on it. + + +Please visit our Website: http://www.httrack.com +*/ + + +/* ------------------------------------------------------------ */ +/* File: htsalias.c subroutines: */ +/* alias for command-line options and config files */ +/* Author: Xavier Roche */ +/* ------------------------------------------------------------ */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "htsalias.h" +#include "htsglobal.h" +void linput(FILE* fp,char* s,int max); +void hts_lowcase(char* s); + +#define _NOT_NULL(a) ( (a!=NULL) ? (a) : "" ) +#define is_realspace(c) (strchr(" \x0d\x0a\x09\x0c",(c))!=NULL) + +// COPY OF cmdl_ins in htsmain.c +// Insert a command in the argc/argv +#define cmdl_ins(token,argc,argv,buff,ptr) \ + { \ + int i; \ + for(i=argc;i>0;i--)\ + argv[i]=argv[i-1];\ + } \ + argv[0]=(buff+ptr); \ + strcpy(argv[0],token); \ + ptr += (strlen(argv[0])+1); \ + argc++ +// END OF COPY OF cmdl_ins in htsmain.c + + +/* + Aliases for command-line and config file definitions + These definitions can be used: + in command line: + --sockets=8 --cache=0 + --sockets 8 --cache off + --nocache + -c8 -C0 + in config file: + sockets=8 cache=0 + set sockets 8 cache off + +*/ +/* + single : no options + param : this option allows a number parameter (1, for example) and can be mixed with other options (R1C1c8) + param1 : this option must be alone, and needs one distinct parameter (-P <path>) + param0 : this option must be alone, but the parameter should be put together (+*.gif) +*/ +const char hts_optalias[][4][64] = { + /* {"","","",""}, */ + {"path","-O","param1","output path"}, + {"chroot","-%O","param1","default top path"}, + {"mirror","-w","single",""}, + {"mirror-wizard","-W","single",""}, + {"get-files","-g","single",""}, + {"quiet","-q","single",""}, + {"mirrorlinks","-Y","single",""}, + {"proxy","-P","param1","proxy name:port"}, + {"httpproxy-ftp","-%f","param",""}, + {"depth","-r","param",""},{"recurse-levels","-r","param",""}, + {"ext-depth","-%e","param",""}, + {"max-files","-m","param",""}, + {"max-size","-M","param",""}, + {"max-time","-E","param",""}, + {"max-rate","-A","param",""}, + {"max-pause","-G","param",""}, + {"sockets","-c","param","number of simultaneous connections allowed"},{"socket","-c","param","number of simultaneous connections allowed"},{"connection","-c","param","number of simultaneous connections allowed"}, + {"connection-per-second","-%c","param","number of connection per second allowed"}, + {"timeout","-T","",""}, + {"retries","-R","param","number of retries for non-fatal errors"}, + {"min-rate","-J","param",""}, + {"host-control","-H","param",""}, + {"extended-parsing","-%P","param",""}, + {"near","-n","single",""}, + {"test","-t","single",""}, + {"list","-%L","param1",""}, + {"language","-%l","param1",""}, {"lang","-%l","param1",""}, + {"structure","-N","param",""}, {"user-structure","-N","param1",""}, + {"long-names","-L","param",""}, + {"keep-links","-K","param",""}, + {"replace-external","-x","single",""}, + {"no-passwords","-%x","single",""},{"no-password","-%x","single",""}, + {"include-query-string","-%q","single",""}, + {"generate-errors","-o","single",""}, + {"purge-old","-X","param",""}, + {"cookies","-b","param",""}, + {"check-type","-u","param",""}, + {"assume","-%A","param1",""}, {"mimetype","-%A","param1",""}, + {"parse-java","-j","param",""}, + {"protocol","-@i","param",""}, + {"robots","-s","param",""}, + {"http-10","-%h","single",""},{"http-1.0","-%h","single",""}, + {"no-compression","-%z","single",""}, + {"tolerant","-%B","single",""}, + {"updatehack","-%s","single",""}, {"sizehack","-%s","single",""}, + {"user-agent","-F","param1","user-agent identity"}, + {"footer","-%F","param1",""}, + {"cache","-C","param","number of retries for non-fatal errors"}, + {"store-all-in-cache","-k","single",""}, + {"do-not-recatch","-%n","single",""}, + {"do-not-log","-Q","single",""}, + {"extra-log","-z","single",""}, + {"debug-log","-Z","single",""}, + {"verbose","-v","single",""}, + {"file-log","-f","single",""}, + {"single-log","-f2","single",""}, + {"index","-I","single",""}, + {"search-index","-%I","single",""}, + {"priority","-p","param",""}, + {"debug-headers","-%H","single",""}, + {"userdef-cmd","-V","param1",""}, + {"structure","-N","param1","user-defined structure"}, + {"usercommand","-V","param1","user-defined command"}, + {"display","-%v","single","show files transfered and other funny realtime information"}, + {"dos83","-L0","single",""}, + {"iso9660","-L2","single",""}, + /* */ + + /* DEPRECATED */ + {"stay-on-same-dir","-S","single","stay on the same directory - DEPRECATED"}, + {"can-go-down","-D","single","can only go down into subdirs - DEPRECATED"}, + {"can-go-up","-U","single","can only go to upper directories- DEPRECATED"}, + {"can-go-up-and-down","-B","single","can both go up&down into the directory structure - DEPRECATED"}, + {"stay-on-same-address","-a","single","stay on the same address - DEPRECATED"}, + {"stay-on-same-domain","-d","single","stay on the same principal domain - DEPRECATED"}, + {"stay-on-same-tld","-l","single","stay on the same TLD (eg: .com) - DEPRECATED"}, + {"go-everywhere","-e","single","go everywhere on the web - DEPRECATED"}, + + /* Badly documented */ + {"debug-testfilters","-#0","param1","debug: test filters"}, + {"advanced-flushlogs","-#f","single",""}, + {"advanced-maxfilters","-#F","param",""}, + {"version","-#h","single",""}, + {"debug-scanstdin","-#K","single",""}, + {"advanced-maxlinks","-#L","single",""}, + {"advanced-progressinfo","-#p","single",""}, + {"catch-url","-#P","single","catch complex URL through proxy"}, + {"debug-oldftp","-#R","single",""}, + {"debug-xfrstats","-#T","single",""}, + {"advanced-wait","-#u","single",""}, + {"debug-ratestats","-#Z","single",""}, + {"exec","-#!","param1",""}, + + /* STANDARD ALIASES */ + {"spider","-p0C0I0t","single",""}, + {"testsite","-p0C0I0t","single",""}, + {"testlinks","-r1p0C0I0t","single",""}, {"test","-r1p0C0I0t","single",""}, {"bookmark","-r1p0C0I0t","single",""}, + {"mirror","-w","single",""}, + {"testscan","-p0C0I0Q","single",""}, {"scan","-p0C0I0Q","single",""}, {"check","-p0C0I0Q","single",""}, + {"skeleton","-p1","single",""}, + {"preserve","-%p","single",""}, + {"get","-qg","single",""}, + {"update","-iC2","single",""}, + {"continue","-iC1","single",""}, {"restart","-iC1","single",""}, + {"continue","-i","single",""}, /* for help alias */ + {"sucker","-r999","single",""}, + {"help","-h","single",""}, {"documentation","-h","single",""}, {"doc","-h","single",""}, + {"wide","-c32","single",""}, + {"tiny","-c1","single",""}, + {"ultrawide","-c48","single",""}, + {"http10","-%h","single",""}, + {"filelist","-%L","single",""}, {"list","-%L","single",""}, + /* END OF ALIASES */ + + /* Filters */ + {"allow","+","param0","allow filter"}, + {"deny","-","param0","deny filter"}, + /* */ + + /* URLs */ + {"add","","param0","add URLs"}, + /* */ + + /* Specific */ + {"user","-%U","param1","output path"}, + /* */ + + /* Internal */ + {"catchurl","--catchurl","single","catch complex URL through proxy"}, + {"updatehttrack","--updatehttrack","single","update HTTrack Website Copier"}, + {"clean","--clean","single","clean up log files and cache"}, + {"tide","--clean","single","clean up log files and cache"}, + /* */ + + {"","","",""} +}; + + +/* + Check for alias in command-line + argc,argv as in main() + n_arg argument position + return_argv a char[2][] where to put result + return_error buffer in case of syntax error + + return value: number of arguments treated (0 if error) +*/ +int optalias_check(int argc,const char * const * argv,int n_arg, + int* return_argc,char** return_argv, + char* return_error) { + return_error[0]='\0'; + *return_argc=1; + if (argv[n_arg][0]=='-') + if (argv[n_arg][1]=='-') { + char command[1000]; + char param[1000]; + char addcommand[256]; + /* */ + char* position; + int need_param=1; + //int return_param=0; + int pos; + command[0]=param[0]=addcommand[0]='\0'; + + /* --sockets=8 */ + if ( (position=strchr(argv[n_arg],'=')) ) { + /* Copy command */ + strncat(command,argv[n_arg]+2,(int) (position - (argv[n_arg]+2)) ); + /* Copy parameter */ + strcpy(param,position+1); + } + /* --nocache */ + else if (strncmp(argv[n_arg]+2,"no",2)==0) { + strcpy(command,argv[n_arg]+4); + strcpy(param,"0"); + } + /* --sockets 8 */ + else { + if (strncmp(argv[n_arg]+2,"wide-",5)==0) { + strcpy(addcommand,"c32"); + strcpy(command,strchr(argv[n_arg]+2,'-')+1); + } else if (strncmp(argv[n_arg]+2,"tiny-",5)==0) { + strcpy(addcommand,"c1"); + strcpy(command,strchr(argv[n_arg]+2,'-')+1); + } else + strcpy(command,argv[n_arg]+2); + need_param=2; + } + + /* Now solve the alias */ + pos=optalias_find(command); + if (pos>=0) { + /* Copy real name */ + strcpy(command,hts_optalias[pos][1]); + /* With parameters? */ + if (strncmp(hts_optalias[pos][2],"param",5)==0) { + /* Copy parameters? */ + if (need_param == 2) { + if ((n_arg+1>=argc) || (argv[n_arg+1][0]=='-')) { /* no supplemental parameter */ + sprintf(return_error, + "Syntax error:\n\tOption %s needs to be followed by a parameter: %s <param>\n\t%s\n", + command,command,_NOT_NULL(optalias_help(command))); + return 0; + } + strcpy(param,argv[n_arg+1]); + need_param=2; + } + } else + need_param=1; + + /* Final result */ + + /* Must be alone (-P /tmp) */ + if (strcmp(hts_optalias[pos][2],"param1")==0) { + strcpy(return_argv[0],command); + strcpy(return_argv[1],param); + *return_argc=2; /* 2 parameters returned */ + } + /* Alone with parameter (+*.gif) */ + else if (strcmp(hts_optalias[pos][2],"param0")==0) { + /* Command */ + strcpy(return_argv[0],command); + strcat(return_argv[0],param); + } + /* Together (-c8) */ + else { + /* Command */ + strcpy(return_argv[0],command); + /* Parameters accepted */ + if (strncmp(hts_optalias[pos][2],"param",5)==0) { + /* --cache=off or --index=on */ + if (strcmp(param,"off")==0) + strcat(return_argv[0],"0"); + else if (strcmp(param,"on")==0) { + // on is the default + // strcat(return_argv[0],"1"); + } else + strcat(return_argv[0],param); + } + *return_argc=1; /* 1 parameter returned */ + } + } else { + sprintf(return_error,"Unknown option: %s\n",command); + return 0; + } + return need_param; + } + + /* Check -P <path> */ + { + int pos; + if ((pos=optreal_find(argv[n_arg]))>=0) { + if ( (strcmp(hts_optalias[pos][2],"param1")==0) || (strcmp(hts_optalias[pos][2],"param0")==0)) { + if ((n_arg+1>=argc) || (argv[n_arg+1][0]=='-')) { /* no supplemental parameter */ + sprintf(return_error, + "Syntax error:\n\tOption %s needs to be followed by a parameter: %s <param>\n\t%s\n", + argv[n_arg],argv[n_arg],_NOT_NULL(optalias_help(argv[n_arg]))); + return 0; + } + /* Copy parameters */ + strcpy(return_argv[0],argv[n_arg]); + strcpy(return_argv[1],argv[n_arg+1]); + /* And return */ + *return_argc=2; /* 2 parameters returned */ + return 2; /* 2 parameters used */ + } + } + } + + /* Copy and return other unknown option */ + strcpy(return_argv[0],argv[n_arg]); + return 1; +} + +/* Finds the <token> option alias and returns the index, or -1 if failed */ +int optalias_find(const char* token) { + if (token[0] != '\0') { + int i=0; + while(hts_optalias[i][0][0] != '\0') { + if (strcmp(token,hts_optalias[i][0])==0) { + return i; + } + i++; + } + } + return -1; +} + +/* Finds the <token> real option and returns the index, or -1 if failed */ +int optreal_find(const char* token) { + if (token[0] != '\0') { + int i=0; + while(hts_optalias[i][0][0] != '\0') { + if (strcmp(token,hts_optalias[i][1])==0) { + return i; + } + i++; + } + } + return -1; +} + +const char* optreal_value(int p) { + return hts_optalias[p][1]; +} +const char* optalias_value(int p) { + return hts_optalias[p][0]; +} +const char* opttype_value(int p) { + return hts_optalias[p][2]; +} +const char* opthelp_value(int p) { + return hts_optalias[p][3]; +} + +/* Help for option <token>, empty if not available, or NULL if unknown <token> */ +const char* optalias_help(const char* token) { + int pos=optalias_find(token); + if (pos>=0) + return hts_optalias[pos][3]; + else + return NULL; +} + +/* Include a file to the current command line */ +/* example: + set sockets 8 + index on + allow *.gif + deny ad.* +*/ +int optinclude_file(const char* name, + int* argc,char** argv,char* x_argvblk,int* x_ptr) { + FILE* fp; + fp=fopen(name,"rb"); + if (fp) { + char line[256]; + int insert_after=1; /* first, insert after program filename */ + while(!feof(fp)) { + char *a,*b; + int result; + + /* read line */ + linput(fp,line,250); + hts_lowcase(line); + if (strnotempty(line)) { + /* no comment line: # // ; */ + if (strchr("#/;",line[0])==NULL) { + /* right trim */ + a=line+strlen(line)-1; + while(is_realspace(*a)) *(a--) = '\0'; + /* jump "set " and spaces */ + a=line; + while(is_realspace(*a)) a++; + if (strncmp(a,"set",3)==0) { + if (is_realspace(*(a+3))) { + a+=4; + } + } + while(is_realspace(*a)) a++; + /* delete = ("sockets=8") */ + if ( (b=strchr(a,'=')) ) + *b=' '; + + /* isolate option and parameter */ + b=a; + while( (!is_realspace(*b)) && (*b) ) b++; + if (*b) { + *b='\0'; + b++; + } + /* a is now the option, b the parameter */ + + { + int return_argc; + char return_error[256]; + char _tmp_argv[4][HTS_CDLMAXSIZE]; + char* tmp_argv[4]; + tmp_argv[0]=_tmp_argv[0]; tmp_argv[1]=_tmp_argv[1]; tmp_argv[2]=_tmp_argv[2]; tmp_argv[3]=_tmp_argv[3]; + strcpy(tmp_argv[0],"--"); + strcat(tmp_argv[0],a); + strcpy(tmp_argv[1],b); + + result=optalias_check(2,(const char * const *)tmp_argv,0, + &return_argc,(tmp_argv+2), + return_error); + if (!result) { + printf("%s\n",return_error); + } else { + int insert_after_argc; + /* Insert parameters BUT so that they can be in the same order */ + /* temporary argc: Number of parameters after minus insert_after_argc */ + insert_after_argc=(*argc)-insert_after; + cmdl_ins((tmp_argv[2]),insert_after_argc,(argv+insert_after),x_argvblk,(*x_ptr)); + *argc=insert_after_argc+insert_after; + insert_after++; + /* Second one */ + if (return_argc>1) { + insert_after_argc=(*argc)-insert_after; + cmdl_ins((tmp_argv[3]),insert_after_argc,(argv+insert_after),x_argvblk,(*x_ptr)); + *argc=insert_after_argc+insert_after; + insert_after++; + } + /* increment to nbr of used parameters */ + /* insert_after+=result; */ + } + } + } + + } + } + fclose(fp); + return 1; + } + return 0; +} + +/* Get home directory, '.' if failed */ +/* example: /home/smith */ +char* hts_gethome(void) { + char* home = getenv( "HOME" ); + if (home) + return home; + else + return "."; +} + +/* Convert ~/foo into /home/smith/foo */ +void expand_home(char* str) { + if (str[0] == '~') { + char tempo[HTS_URLMAXSIZE*2]; + strcpy(tempo,hts_gethome()); + strcat(tempo,str+1); + strcpy(str,tempo); + } +} |