summaryrefslogtreecommitdiff
path: root/src/htsalias.c
diff options
context:
space:
mode:
authorXavier Roche <xroche@users.noreply.github.com>2012-03-19 12:36:11 +0000
committerXavier Roche <xroche@users.noreply.github.com>2012-03-19 12:36:11 +0000
commitad5b7acc19290ff91e0f42a0de448a26760fcf99 (patch)
tree2d1867758835fd0c4e443ff3cc7e5c774af85874 /src/htsalias.c
Imported httrack 3.20.2
Diffstat (limited to 'src/htsalias.c')
-rw-r--r--src/htsalias.c520
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);
+ }
+}