예제 #1
0
파일: stripper.c 프로젝트: Ecdosis/calliope
/*
 * Class:     calliope_AeseStripper
 * Method:    strip
 * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLcalliope/json/JSONResponse;Lcalliope/json/JSONResponse;)I
 */
JNIEXPORT jint JNICALL Java_calliope_AeseStripper_strip
  (JNIEnv *env, jobject obj, jstring xml, jstring rules, jstring format, jstring style, jstring language, jstring hexcepts, jboolean html, jobject text, jobject markup)
{
	int res = 1;
    jboolean x_copied,r_copied=JNI_FALSE,f_copied,s_copied,h_copied,l_copied=JNI_FALSE;
    const char *x_str = load_string( env, xml, &x_copied );
    //fprintf(stderr,"x_str=%s r_str\n",x_str);
    const char *r_str = (rules!=NULL)?load_string(env,rules,&r_copied):NULL;
    //fprintf(stderr,"r_str=%s\n",r_str);
    const char *f_str = load_string( env, format, &f_copied );
    //fprintf(stderr,"f_str=%s\n",f_str);
    const char *s_str = load_string( env, style, &s_copied );
    //fprintf(stderr,"s_str=%s\n",s_str);
    const char *l_str = (language==NULL)?"en_GB"
        :load_string( env, language, &l_copied );
    //fprintf(stderr,"l_str=%s\n",l_str);
    const char *h_str = (hexcepts==NULL)?NULL
        :load_string( env, hexcepts, &h_copied );
    //fprintf(stderr,"h_str=%s\n",h_str);
    stripper *s = stripper_create();
    if ( s != NULL )
    {
        recipe *ruleset;
        s->hh_except_string = (h_str==NULL)?NULL:strdup(h_str);
        s->selected_format = lookup_format( f_str );
        // load or initialise rule set
        if ( rules == NULL )
            ruleset = recipe_new();
        else
            ruleset = recipe_load(r_str,strlen(r_str));
        hh_exceptions *hhe = hh_exceptions_create( s->hh_except_string );
        if ( hhe != NULL )
        {
            s->user_data = userdata_create( s->language, s->barefile, 
                ruleset, &formats[s->selected_format], hhe );
            if ( s->user_data != NULL )
            {
                // write header
                int i=0;
                while ( res && userdata_markup_dest(s->user_data,i)!= NULL )
                {
                    res = formats[s->selected_format].hfunc( NULL, 
                        dest_file_dst(
                            userdata_markup_dest(s->user_data,i)), s_str );
                    i++;
                }
                // parse XML
                if ( res )
                {
                    int xlen = strlen( x_str );
                    res = scan_source( x_str, xlen, s );
                    if ( res )
                        userdata_write_files( env, s->user_data, text, markup );
                }
                else
                    tmplog("write header failed\n");
            }
        }
        stripper_dispose( s );
        unload_string( env, xml, x_str, x_copied );
        unload_string( env, rules, r_str, r_copied );
        unload_string( env, format, f_str, f_copied );
        unload_string( env, style, s_str, s_copied );
        unload_string( env, language, l_str, l_copied );
        if ( h_str != NULL )
            unload_string( env, hexcepts, h_str, h_copied );
    }
    return res;
}
예제 #2
0
파일: stripper.c 프로젝트: Ecdosis/calliope
/**
 * The main entry point
 * @param argc number of commandline args+1
 * @param argv array of arguments, first is program name
 * @return 0 to the system
 */
int main( int argc, char **argv )
{
    stripper *s = stripper_create();
    if ( s != NULL )
    {
        int res = 1;
        if ( check_args(argc,argv,s) )
		{
            recipe *rules;
            if ( s->recipe_file == NULL )
                rules = recipe_new();
            else
            {
                int rlen;
                const char *rdata = read_file( s->recipe_file, &rlen );
                if ( rdata != NULL )
                {
                    rules = recipe_load(rdata, rlen);
                    free( (char*)rdata );
                }
            }
            if ( rules != NULL )
            {
                hh_exceptions *hhe = hh_exceptions_create( s->hh_except_string );
                s->user_data = userdata_create( s->language, s->barefile, 
                    rules, &formats[s->selected_format], hhe );
                if ( s->user_data == NULL )
                {
                    fprintf(stderr,"stripper: failed to initialise userdata\n");
                    res = 0;
                }
                if ( res && !s->doing_help )
                {
                    int i=0;
                    userdata *u = s->user_data;
                    while ( userdata_markup_dest(u,i) )
                    {
                        res = formats[s->selected_format].hfunc( NULL, 
                            dest_file_dst(userdata_markup_dest(u,i)), s->style );
                        i++;
                    }
                    // parse XML, prepare body for writing
                    if ( res )
                    {
                        int len;
                        const char *data = read_file( s->src, &len );
                        if ( data != NULL )
                        {
                            res = scan_source( data, len, s );
                            free( (char*)data );
                        }
                    }
                }
                // save the files in a separate step
                userdata_write_files( s->user_data );
            }
        }
        else
            usage();
        stripper_dispose( s );
    }
	return 0;
}
예제 #3
0
void backup_formal(int fd,char *msg){
	JCR *jcr=NULL;
	char fileset[256]={0};
	char *buf=(char *)calloc(1,SOCKET_BUF_SIZE+21);
	int len;

	int index=1;
	char vol_name[FILE_NAME_LEN];
	int vol_fd;
	Recipe *rp=NULL;
	FingerChunk *fc=NULL;
	char *p=NULL;
	int64_t rwlen=0;
	
	jobcount_init();
	jcr=jcr_new();
	jcr->dataSocket=fd;

	memset(vol_name,0,FILE_NAME_LEN);
	strcpy(vol_name,BackupVolPath);
	strcat(vol_name,"data_vol");
	vol_fd=open(vol_name,O_RDWR| O_CREAT,00644);
	if(vol_fd<0){
		err_msg1("can't open file");
		goto FAIL;
	}
	printf("%s %d vol_name:%s\n",__FILE__,__LINE__,vol_name);
        rwlen=lseek(vol_fd,0,SEEK_END);
	
	TIMER_DECLARE(gstart,gend);
	TIMER_DECLARE(wstart,wend);
	
	TIMER_START(gstart);
	if(sscanf(msg,backup_cmd,fileset)!=1){ // backup cmd
		goto FAIL;
	}
	jcr->jobv=jobv_new(fileset);
	jcr->nJobId=jcr->jobv->nJobId;
	
	printf("===========backup start==============\n");
	printf("%s,%d pathname:%s \n", __FILE__,__LINE__,fileset);

	
	while(bnet_recv(jcr->dataSocket,buf,&len)!=ERROR){ //文件名
		if(len==STREAM_END){
			printf("%s %d backup is over\n",__FILE__,__LINE__);
			break;
		}
		
		//printf("\033[40;32m recv file: %s (%d) \033[0m\n",buf,len);
		rp=recipe_new();
		memcpy(rp->filename,buf,len);
		rp->fileindex=index++;	
		
		while(bnet_recv(jcr->dataSocket,buf,&len)>0){ /*format: fingerprintf data data dta..*/
					//printf("\033[40;32m recv: file data (%d) \033[0m\n",len);	
			fc=fingerchunk_new(buf,0);
			fc->offset=rwlen;
			fc->length=len-sizeof(Fingerprint);

			check_data(fc->fingerprint,buf+sizeof(Fingerprint),fc->length);
					
			TIMER_START(wstart);
			 if(writen(vol_fd,buf+sizeof(Fingerprint),fc->length)!=fc->length)
					err_msg1("wrintn wrong");		 
			TIMER_END(wend);
			TIMER_DIFF(jcr->writeDataTime,wstart,wend);
			
			rwlen+=fc->length;		
			jcr->nChunkCount++;
			jcr->nSize+=fc->length;
			recipe_append_fingerchunk(rp,fc);
		}
				
		jcr->nFileCount++;
		if(G_VERBOSE)
			printf("receive file %s OK, total: %d\n",rp->filename,jcr->nFileCount);
		jobv_insert_recipe(jcr->jobv, rp);
		rp=NULL;	
	}
FAIL:	
	bnet_send(fd,"OK",2);  // 发送备份成功信息
	
	TIMER_END(gend);
	TIMER_DIFF(jcr->recvTime,gstart,gend);
	
	
	printf("============back over===============\n");
	printf("total time:%.4f   %.4f MB/s\n",jcr->recvTime,jcr->nSize*1.0/jcr->recvTime/1036288.0);
	printf("write time:%.4f  %.4f MB/s\n",jcr->writeDataTime,jcr->nSize*1.0/jcr->writeDataTime/1036288.0);
	printf("chunk count:%d\n",jcr->nChunkCount);
	printf("file count:%d\n",jcr->nFileCount);
	
	if(rp){
		recipe_free(rp);
	}
	
	jobv_destroy(jcr->jobv);
	jcr_free(jcr);
	jobcount_close();
	
	close(vol_fd);
}