diff options
author | Xavier Roche <xroche@users.noreply.github.com> | 2012-03-19 12:59:03 +0000 |
---|---|---|
committer | Xavier Roche <xroche@users.noreply.github.com> | 2012-03-19 12:59:03 +0000 |
commit | 660b569b0980fc8f71b03ed666dd02eec8388b4c (patch) | |
tree | 8ad02b5f0bebdd4cd1d2ba01005d6f3f71a0a7fb /src/htsjava.c | |
parent | 64cc4a88da8887ef1f7f4d90be0158d2cc76222d (diff) |
httrack 3.41.2
Diffstat (limited to 'src/htsjava.c')
-rw-r--r-- | src/htsjava.c | 359 |
1 files changed, 222 insertions, 137 deletions
diff --git a/src/htsjava.c b/src/htsjava.c index 3536b9b..a52aea2 100644 --- a/src/htsjava.c +++ b/src/htsjava.c @@ -35,23 +35,37 @@ Please visit our Website: http://www.httrack.com /* ------------------------------------------------------------ */ -/* Internal engine bytecode */ -#define HTS_INTERNAL_BYTECODE - /* Version: Oct/2000 */ /* Fixed: problems with class structure (10/2000) */ // htsjava.c - Parseur de classes java -#include "stdio.h" -#include "htsglobal.h" -#include "htscore.h" +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#if ( defined(_WIN32) ||defined(HAVE_SYS_TYPES_H) ) +#include <sys/types.h> +#endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif -#include "htsjava.h" +/* Standard httrack module includes */ +#include "httrack-library.h" +#include "htsopt.h" +#include "htsdefines.h" -#include "htsnostatic.h" +/* Module structures */ +#include "htsmodules.h" -//#include <math.h> +/* We link to libhttrack, we can use its functions */ +#include "httrack-library.h" + +/* This file */ +#include "htsjava.h" static int reverse_endian(void) { int endian = 1; @@ -62,6 +76,11 @@ static int reverse_endian(void) { #define hts_swap16(A) ( (((A) & 0xFF)<<8) | (((A) & 0xFF00)>>8) ) #define hts_swap32(A) ( (( (hts_swap16(A)) & 0xFFFF)<<16) | (( (hts_swap16(A>>16)) & 0xFFFF)) ) +/* Static definitions */ +static RESP_STRUCT readtable(htsmoduleStruct* str,FILE *fp,RESP_STRUCT,int*); +static unsigned short int readshort(FILE *fp); +static int tris(httrackp *opt,char*); +static char * printname(char [1024],char [1024]); // ** HTS_xx sinon pas pris par VC++ #define HTS_CLASS 7 @@ -79,148 +98,217 @@ static int reverse_endian(void) { #define JAVADEBUG 0 -int hts_detect_java(htsmoduleStruct* str) { - char* savename = str->filename; +static const char *libName = "htsjava"; + +#ifdef _WIN32 +#define strcasecmp(a,b) stricmp(a,b) +#define strncasecmp(a,b,n) strnicmp(a,b,n) +#endif + +static int detect_mime(htsmoduleStruct* str) { + const char* savename = str->filename; if (savename) { int len = (int) strlen(savename); - if (len > 6 && strfield(savename + len - 6,".class")) { + if (len > 6 && strcasecmp(savename + len - 6,".class") == 0) { return 1; } } return 0; } -int hts_parse_java(htsmoduleStruct* str) +static int hts_detect_java(t_hts_callbackarg *carg, httrackp *opt, + htsmoduleStruct* str) { - FILE *fpout; - JAVA_HEADER header; - RESP_STRUCT *tab; - char* file = str->filename; - - str->relativeToHtmlLink = 1; + /* Call parent functions if multiple callbacks are chained. */ + if (CALLBACKARG_PREV_FUN(carg, detect) != NULL) { + if (CALLBACKARG_PREV_FUN(carg, detect)(CALLBACKARG_PREV_CARG(carg), opt, str)) { + return 1; /* Found before us, let them have the priority */ + } + } -#if JAVADEBUG - printf("fopen\n"); -#endif - if ((fpout = fopen(fconv(file), "r+b")) == NULL) - { - //fprintf(stderr, "Cannot open input file.\n"); - sprintf(str->err_msg,"Unable to open file %s",file); - return 0; // une erreur.. + /* Check MIME */ + if (detect_mime(str)) { + str->wrapper_name = libName; /* Our ID */ + return 1; /* Known format, we take it */ } - + + return 0; /* Unknown format */ +} + +static off_t fsize(const char* s) { + FILE* fp; + fp=fopen(s,"rb"); + if (fp!=NULL) { + off_t i; + fseek(fp,0,SEEK_END); + i = ftell(fp); + fclose(fp); + return i; + } else + return -1; +} + +static int hts_parse_java(t_hts_callbackarg *carg, httrackp *opt, + htsmoduleStruct* str) +{ + /* The wrapper_name memebr has changed: not for us anymore */ + if (str->wrapper_name == NULL || strcmp(str->wrapper_name, libName) != 0) { + /* Call parent functions if multiple callbacks are chained. */ + if (CALLBACKARG_PREV_FUN(carg, parse) != NULL) { + return CALLBACKARG_PREV_FUN(carg, parse)(CALLBACKARG_PREV_CARG(carg), opt, str); + } + strcpy(str->err_msg, "unexpected error: bad wrapper_name and no previous wrapper"); + return 0; /* Unexpected error */ + } else { + if (detect_mime(str)) { + + /* (Legacy code) */ + char catbuff[CATBUFF_SIZE]; + FILE *fpout; + JAVA_HEADER header; + RESP_STRUCT *tab; + const char* file = str->filename; + + str->relativeToHtmlLink = 1; + #if JAVADEBUG - printf("fread\n"); + printf("fopen\n"); #endif - //if (fread(&header,1,sizeof(JAVA_HEADER),fpout) != sizeof(JAVA_HEADER)) { // pas complet.. - if (fread(&header,1,10,fpout) != 10) { // pas complet.. - fclose(fpout); - sprintf(str->err_msg,"File header too small (file len = "LLintP")",(LLint)fsize(file)); - return 0; - } + if ((fpout = fopen(fconv(catbuff, file), "r+b")) == NULL) + { + //fprintf(stderr, "Cannot open input file.\n"); + sprintf(str->err_msg,"Unable to open file %s",file); + return 0; // une erreur.. + } #if JAVADEBUG - printf("header\n"); + printf("fread\n"); #endif - // tester en tête - if (reverse_endian()) { - header.magic = hts_swap32(header.magic); - header.count = hts_swap16(header.count); - } - if(header.magic!=0xCAFEBABE) { - sprintf(str->err_msg,"non java file"); - if (fpout) { fclose(fpout); fpout=NULL; } - return 0; - } - - tab =(RESP_STRUCT*)calloct(header.count,sizeof(RESP_STRUCT)); - if (!tab) { - sprintf(str->err_msg,"Unable to alloc %d bytes",(int)sizeof(RESP_STRUCT)); - if (fpout) { fclose(fpout); fpout=NULL; } - return 0; // erreur.. - } + //if (fread(&header,1,sizeof(JAVA_HEADER),fpout) != sizeof(JAVA_HEADER)) { // pas complet.. + if (fread(&header,1,10,fpout) != 10) { // pas complet.. + fclose(fpout); + sprintf(str->err_msg,"File header too small (file len = "LLintP")",(LLint)fsize(file)); + return 0; + } #if JAVADEBUG - printf("calchead\n"); + printf("header\n"); #endif - { - int i; - - for (i = 1; i < header.count; i++) { - int err=0; // ++ - tab[i]=readtable(str,fpout,tab[i],&err); - if (!err) { - if ((tab[i].type == HTS_LONG) ||(tab[i].type == HTS_DOUBLE)) i++; //2 element si double ou float - } else { // ++ une erreur est survenue! - if (strnotempty(str->err_msg)==0) - strcpybuff(str->err_msg,"Internal readtable error"); - freet(tab); + // tester en tête + if (reverse_endian()) { + header.magic = hts_swap32(header.magic); + header.count = hts_swap16(header.count); + } + if(header.magic!=0xCAFEBABE) { + sprintf(str->err_msg,"non java file"); if (fpout) { fclose(fpout); fpout=NULL; } return 0; } - } - - } - + tab =(RESP_STRUCT*)calloc(header.count,sizeof(RESP_STRUCT)); + if (!tab) { + sprintf(str->err_msg,"Unable to alloc %d bytes",(int)sizeof(RESP_STRUCT)); + if (fpout) { fclose(fpout); fpout=NULL; } + return 0; // erreur.. + } + #if JAVADEBUG - printf("addfiles\n"); + printf("calchead\n"); #endif - { - unsigned int acess; - unsigned int Class; - unsigned int SClass; - int i; - acess = readshort(fpout); - Class = readshort(fpout); - SClass = readshort(fpout); - - for (i = 1; i <header.count; i++) { - - if (tab[i].type == HTS_CLASS) { - - if ((tab[i].index1<header.count) && (tab[i].index1>=0)) { - - - if((tab[i].index1!=SClass) && (tab[i].index1!=Class) && (tab[tab[i].index1].name[0]!='[')) { - - if(!strstr(tab[tab[i].index1].name,"java/")) { - char BIGSTK tempo[1024]; - tempo[0]='\0'; - - sprintf(tempo,"%s.class",tab[tab[i].index1].name); + { + int i; + + for (i = 1; i < header.count; i++) { + int err=0; // ++ + tab[i]=readtable(str,fpout,tab[i],&err); + if (!err) { + if ((tab[i].type == HTS_LONG) ||(tab[i].type == HTS_DOUBLE)) i++; //2 element si double ou float + } else { // ++ une erreur est survenue! + if (strnotempty(str->err_msg)==0) + strcpy(str->err_msg,"Internal readtable error"); + free(tab); + if (fpout) { fclose(fpout); fpout=NULL; } + return 0; + } + } + + } + + +#if JAVADEBUG + printf("addfiles\n"); +#endif + { + unsigned int acess; + unsigned int Class; + unsigned int SClass; + int i; + acess = readshort(fpout); + Class = readshort(fpout); + SClass = readshort(fpout); + + for (i = 1; i <header.count; i++) { + + if (tab[i].type == HTS_CLASS) { + + if ((tab[i].index1<header.count) && (tab[i].index1>=0)) { + + + if((tab[i].index1!=SClass) && (tab[i].index1!=Class) && (tab[tab[i].index1].name[0]!='[')) { + + if(!strstr(tab[tab[i].index1].name,"java/")) { + char BIGSTK tempo[1024]; + tempo[0]='\0'; + + sprintf(tempo,"%s.class",tab[tab[i].index1].name); #if JAVADEBUG - printf("add %s\n",tempo); + printf("add %s\n",tempo); #endif - if (tab[tab[i].index1].file_position >= 0) - str->addLink(str,tempo); /* tab[tab[i].index1].file_position */ + if (tab[tab[i].index1].file_position >= 0) + str->addLink(str,tempo); /* tab[tab[i].index1].file_position */ + } + + } + } else { + i=header.count; // exit } - } - } else { - i=header.count; // exit + } } - - } - } - - + + #if JAVADEBUG - printf("end\n"); + printf("end\n"); #endif - freet(tab); - if (fpout) { fclose(fpout); fpout=NULL; } - return 1; -} + free(tab); + if (fpout) { fclose(fpout); fpout=NULL; } + return 1; + } else { + strcpy(str->err_msg, "bad MIME type"); + } + } + return 0; /* Error */ +} +/* +module entry point +*/ +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv); +EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv) { + /* Plug callback functions */ + CHAIN_FUNCTION(opt, detect, hts_detect_java, NULL); + CHAIN_FUNCTION(opt, parse, hts_parse_java, NULL); + return 1; /* success */ +} // error: !=0 si erreur fatale -RESP_STRUCT readtable(htsmoduleStruct* str, - FILE *fp, RESP_STRUCT trans, int* error) +static RESP_STRUCT readtable(htsmoduleStruct* str, + FILE *fp, RESP_STRUCT trans, int* error) { + char rname[1024]; unsigned short int length; int j; *error = 0; // pas d'erreur @@ -228,54 +316,54 @@ RESP_STRUCT readtable(htsmoduleStruct* str, trans.type = (int)(unsigned char)fgetc(fp); switch (trans.type) { case HTS_CLASS: - strcpybuff(trans.name,"Class"); + strcpy(trans.name,"Class"); trans.index1 = readshort(fp); break; case HTS_FIELDREF: - strcpybuff(trans.name,"Field Reference"); + strcpy(trans.name,"Field Reference"); trans.index1 = readshort(fp); readshort(fp); break; case HTS_METHODREF: - strcpybuff(trans.name,"Method Reference"); + strcpy(trans.name,"Method Reference"); trans.index1 = readshort(fp); readshort(fp); break; case HTS_INTERFACE: - strcpybuff(trans.name,"Interface Method Reference"); + strcpy(trans.name,"Interface Method Reference"); trans.index1 =readshort(fp); readshort(fp); break; case HTS_NAMEANDTYPE: - strcpybuff(trans.name,"Name and Type"); + strcpy(trans.name,"Name and Type"); trans.index1 = readshort(fp); readshort(fp); break; case HTS_STRING: // CONSTANT_String - strcpybuff(trans.name,"String"); + strcpy(trans.name,"String"); trans.index1 = readshort(fp); break; case HTS_INTEGER: - strcpybuff(trans.name,"Integer"); + strcpy(trans.name,"Integer"); for(j=0;j<4;j++) fgetc(fp); break; case HTS_FLOAT: - strcpybuff(trans.name,"Float"); + strcpy(trans.name,"Float"); for(j=0;j<4;j++) fgetc(fp); break; case HTS_LONG: - strcpybuff(trans.name,"Long"); + strcpy(trans.name,"Long"); for(j=0;j<8;j++) fgetc(fp); break; case HTS_DOUBLE: - strcpybuff(trans.name,"Double"); + strcpy(trans.name,"Double"); for(j=0;j<8;j++) fgetc(fp); break; @@ -283,9 +371,9 @@ RESP_STRUCT readtable(htsmoduleStruct* str, case HTS_UNICODE: if (trans.type == HTS_ASCIZ) - strcpybuff(trans.name,"HTS_ASCIZ"); + strcpy(trans.name,"HTS_ASCIZ"); else - strcpybuff(trans.name,"HTS_UNICODE"); + strcpy(trans.name,"HTS_UNICODE"); { char BIGSTK buffer[1024]; @@ -309,10 +397,10 @@ RESP_STRUCT readtable(htsmoduleStruct* str, // if(tris(buffer)==1) printf("%s\n ",buffer); // if(tris(buffer)==2) printf("%s\n ",printname(buffer)); //#endif - if(tris(buffer)==1) str->addLink(str, buffer); /* trans.file_position */ - else if(tris(buffer)==2) str->addLink(str, printname(buffer)); + if(tris(str->opt,buffer)==1) str->addLink(str, buffer); /* trans.file_position */ + else if(tris(str->opt,buffer)==2) str->addLink(str, printname(rname,buffer)); - strcpybuff(trans.name,buffer); + strcpy(trans.name,buffer); } else { // gros pb while ( (length > 0) && (!feof(fp))) { fgetc(fp); @@ -340,7 +428,7 @@ RESP_STRUCT readtable(htsmoduleStruct* str, } -unsigned short int readshort(FILE *fp) +static unsigned short int readshort(FILE *fp) { unsigned short int valint; fread(&valint,sizeof(valint),1,fp); @@ -352,8 +440,9 @@ unsigned short int readshort(FILE *fp) } -int tris(char * buffer) +static int tris(httrackp *opt,char * buffer) { + char catbuff[CATBUFF_SIZE]; // // Java if((buffer[0]=='[') && buffer[1]=='L' && (!strstr(buffer,"java/")) ) @@ -365,25 +454,21 @@ int tris(char * buffer) { char type[256]; type[0]='\0'; - get_httptype(type,buffer,0); + get_httptype(opt,type,buffer,0); if (strnotempty(type)) // type reconnu! return 1; // ajout RX 05/2001 - else if (is_dyntype(get_ext(buffer))) // asp,cgi... + else if (is_dyntype(get_ext(catbuff, buffer))) // asp,cgi... return 1; } return 0; } - -char * printname(char name[1024]) +static char * printname(char rname[1024], char name[1024]) { - char* rname; - //char *rname; char *p; char *p1; int j; - NOSTATIC_RESERVE(rname, char, 1024); rname[0]='\0'; // @@ -396,7 +481,7 @@ char * printname(char name[1024]) for (j = 0; j < (int) strlen(name); j++,p++) { if (*p == '/') *p1='.'; if (*p==';'){*p1='\0'; - strcatbuff(rname,".class"); + strcat(rname,".class"); return (rname);} else *p1=*p; p1++; |