📄 arj_user.c
字号:
strcpy(nptr, name); sflist[sflist_args++]=nptr; }}#endif#if SFX_LEVEL>=ARJ/* Checks if an archived file can be processed, returns 1 if yes. */static int processing_validation(){ int rc; int entry; if(filter_attrs) { rc=0; if(file_attr_mask&TAG_WINLFN&&(host_os==OS_WIN95||host_os==OS_WINNT)&& (file_type==ARJT_DIR||file_type==ARJT_UXSPECIAL||file_type==ARJT_BINARY||file_type==ARJT_TEXT)) rc=1; if(file_attr_mask&TAG_LABEL&&file_type==ARJT_LABEL) rc=1; if(file_attr_mask&TAG_CHAPTER&&file_type==ARJT_CHAPTER) rc=1; if(file_attr_mask&TAG_DIREC&&file_type==ARJT_DIR) rc=1; if(file_attr_mask&TAG_UXSPECIAL&&file_type==ARJT_UXSPECIAL) rc=1; if(file_attr_mask&TAG_NORMAL&&(file_type==ARJT_BINARY||file_type==ARJT_TEXT)) { if(file_mode.dos&FATTR_DIREC!=FATTR_DIREC&& file_mode.dos&FATTR_RDONLY!=FATTR_RDONLY&& file_mode.dos&FATTR_SYSTEM!=FATTR_SYSTEM&& file_mode.dos&FATTR_HIDDEN!=FATTR_HIDDEN&& file_type!=ARJT_UXSPECIAL) rc=1; } if(file_attr_mask&TAG_RDONLY&&file_mode.dos&FATTR_RDONLY) rc=1; if(file_attr_mask&TAG_HIDDEN&&file_mode.dos&FATTR_HIDDEN) rc=1; if(file_attr_mask&TAG_SYSTEM&&file_mode.dos&FATTR_SYSTEM) rc=1; if(file_attr_mask&TAG_ARCH&&(file_mode.dos&FATTR_ARCH!=FATTR_ARCH)) return(0); if(file_attr_mask&TAG_NOT_ARCH&&file_mode.dos&FATTR_ARCH) return(0); if(!rc) return(0); } if(ts_valid(tested_ftime_newer)&&(filter_same_or_newer==TCHECK_FTIME||filter_same_or_newer==TCHECK_NDAYS)) { if(ts_cmp(&ftime_stamp, &tested_ftime_newer)<0) return(0); } if(ts_valid(tested_ftime_older)&&(filter_older==TCHECK_FTIME||filter_older==TCHECK_NDAYS)) { if(ts_cmp(&ftime_stamp, &tested_ftime_older)>=0) return(0); } /* ctime */ if(ts_valid(tested_ftime_newer)&&filter_same_or_newer==TCHECK_CTIME) { if(ts_cmp(&ctime_stamp, &tested_ftime_newer)<0) return(0); } if(ts_valid(tested_ftime_older)&&filter_older==TCHECK_CTIME) { if(ts_cmp(&ctime_stamp, &tested_ftime_older)>=0) return(0); } /* atime */ if(ts_valid(tested_ftime_newer)&&filter_same_or_newer==TCHECK_ATIME) { if(ts_cmp(&atime_stamp, &tested_ftime_newer)<0) return(0); } if(ts_valid(tested_ftime_older)&&filter_older==TCHECK_ATIME) { if(ts_cmp(&atime_stamp, &tested_ftime_older)>=0) return(0); } entry=(add_command&&exclude_paths==EP_BASEDIR)?strlen(target_dir):0; return(!flist_find(&flist_exclusion, filename+entry));}/* Retrieves total statistics for the archive */static void get_totals(){ FILE_COUNT cur_file; if(add_command) { total_size=0L; total_written=0L; display_totals=1; for(cur_file=0; cur_file<flist_main.files; cur_file++) { flist_retrieve(filename, &properties, &flist_main, cur_file); if(match_attrib(&properties)) total_size+=properties.fsize; } }}/* Basic archive processing routine */static void process_archive(int cmd, int no_in_arch){ FILE_COUNT pf_num; FILE_COUNT cur_file; int val_result; int update_perm; /* Update permission */ int pack_rc; int sp_action; ts_store(&ftime_stamp, OS_SPECIAL, 0L); force_volume_flag=0; if(modify_command) ext_hdr_capacity=LONG_MAX; /* ASR fix 15/05/2003 */ while(!no_in_arch&&read_header(0, aistream, archive_name)) { if(!modify_command&&exit_after_count&&total_processed+comment_entries+total_files-split_files>=exit_count) break; pf_num=flist_lookup(++cf_num); val_result=processing_validation(); switch(cmd) { case ARJ_CMD_ADD: if(pf_num!=0&&file_type!=ARJT_LABEL) { flist_retrieve(filename, &properties, &flist_main, pf_num-1); update_perm=1; if(serialize_exts) { msg_sprintf(misc_buf, M_QUERY_UPDATE, filename); update_perm=query_action(REPLY_YES, QUERY_UPDATE, (FMSG *)misc_buf); } if(update_perm) { if(!new_files_only) { pack_rc=pack_file_stub(0, 1); if(pack_rc!=0) { if(volume_flag_set) { vol_file_num=pf_num; break; } if(pack_rc!=1) break; cfa_store(pf_num-1, FLFLAG_PROCESSED); break; } } } cfa_store(pf_num-1, FLFLAG_SKIPPED); } special_processing(CFA_NONE, aistream); break; case ARJ_CMD_COMMENT: if(pf_num&&val_result&&(!use_comment||supply_comment_file)&&!(arj_flags&EXTFILE_FLAG)) { update_perm=1; if(query_for_each_file) { msg_sprintf(misc_buf, M_QUERY_COMMENT, filename); update_perm=query_action(REPLY_YES, QUERY_ARCH_OP, (FMSG *)misc_buf); } if(update_perm) { if(supply_comment(comment_file, filename)) comment_entries++; } } special_processing(CFA_NONE, aistream); break; case ARJ_CMD_DELETE: if(pf_num&&val_result) { if(arcv_delete(cf_num)) break; } special_processing(CFA_NONE, aistream); break; case ARJ_CMD_FRESHEN: case ARJ_CMD_UPDATE: if(pf_num&&file_type!=ARJT_LABEL) { flist_retrieve(filename, &properties, &flist_main, pf_num-1); pack_rc=pack_file_stub(1, 1); if(pack_rc!=0) { if(vol_file_num==pf_num) { if(volume_flag_set) break; if(pack_rc==1) cfa_store(vol_file_num-1, FLFLAG_PROCESSED); vol_file_num=0; break; } if(volume_flag_set) vol_file_num=pf_num; else if(pack_rc==1) cfa_store(pf_num-1, FLFLAG_PROCESSED); break; } special_processing(CFA_NONE, aistream); cfa_store(pf_num-1, FLFLAG_SKIPPED); break; } special_processing(CFA_NONE, aistream); break; case ARJ_CMD_GARBLE: sp_action=CFA_NONE; if(pf_num!=0&&val_result) { update_perm=1; if(query_for_each_file) { msg_sprintf(misc_buf, M_QUERY_GARBLE, filename); update_perm=query_action(REPLY_YES, QUERY_ARCH_OP, (FMSG *)misc_buf); } if(update_perm) sp_action=CFA_GARBLE; } special_processing(sp_action, aistream); break; case ARJ_CMD_RENAME: if(pf_num!=0&&val_result) { if(rename_file()) total_files++; } special_processing(CFA_NONE, aistream); break; case ARJ_CMD_ORDER: if(arj_flags&VOLUME_FLAG||arj_flags&EXTFILE_FLAG) error(M_CANT_ORDER_MV); if(order_fcount>=order_fcap) { if(order_fcap==0) order_fcap=flist_main.files; order_fcap+=FILELIST_INCREMENT; if((order_list=(unsigned long FAR *)farrealloc(order_list, order_fcap*sizeof(unsigned long)))==NULL) error(M_OUT_OF_MEMORY); } if(pf_num!=0) { arch_hdr_index[pf_num-1]=cur_header_pos; cfa_store(pf_num-1, FLFLAG_PROCESSED); order_list[order_fcount++]=0L; } else order_list[order_fcount++]=cur_header_pos; total_files++; skip_compdata(); break; case ARJ_CMD_REMPATH: sp_action=CFA_NONE; if(pf_num!=0&&val_result) { update_perm=1; if(query_for_each_file) { msg_sprintf(misc_buf, M_QUERY_GARBLE, filename); update_perm=query_action(REPLY_YES, QUERY_ARCH_OP, (FMSG *)misc_buf); } if(update_perm) sp_action=CFA_REMPATH; } special_processing(sp_action, aistream); break; case ARJ_CMD_JOIN: case ARJ_CMD_SECURE: special_processing(CFA_NONE, aistream); total_files++; break; case ARJ_CMD_COPY: sp_action=CFA_NONE; if(pf_num!=0&&val_result) { if(chapter_mode==CHAP_USE) sp_action=CFA_MARK_EXT; else if(chapter_mode==CHAP_REMOVE) sp_action=CFA_UNMARK_EXT; else if(garble_enabled) sp_action=CFA_UNGARBLE; } special_processing(sp_action, aistream); break; case ARJ_CMD_EXTR_NP: case ARJ_CMD_PRINT: if(pf_num!=0&&val_result) { update_perm=1; if(query_for_each_file) { if(!first_vol_passed||!continued_prevvolume) { msg_sprintf(misc_buf, M_QUERY_EXTRACT, filename); update_perm=query_action(REPLY_YES, QUERY_ARCH_OP, (FMSG *)misc_buf); } else { if(ofstream==NULL) update_perm=0; } } if(update_perm) { if(unpack_file_proc(cmd==ARJ_CMD_PRINT, cf_num)) { total_files++; if(volume_flag_set) split_files++; } tmp_tmp_filename[0]='\0'; } else skip_compdata(); } else skip_compdata(); break; case ARJ_CMD_LIST: if(pf_num!=0&&val_result) { if(list_cmd(total_files, cf_num)) total_files++; } skip_compdata(); break; case ARJ_CMD_TEST: if(pf_num!=0&&val_result) { if(test_archive_crc==TC_CRC_AND_CONTENTS) add_base_dir(filename); if(unpack_validation(cmd)) total_files++; } else skip_compdata(); break; case ARJ_CMD_WHERE: if(pf_num!=0&&val_result) { if(unpack_validation(cmd)) total_files++; } else skip_compdata(); break; } } if((cmd==ARJ_CMD_ADD||cmd==ARJ_CMD_UPDATE)&&multivolume_option&&continued_nextvolume&&!no_inarch) volume_flag_set=1; if(multivolume_option&&add_command) continued_nextvolume=1; ext_voldata=0; /* ASR fix for v 2.76.04 - prevent phantom EAs at archive joints */ if(!continued_nextvolume) { if(eh!=NULL) { eh_release(eh); eh=NULL; } } if(cmd==ARJ_CMD_ADD||cmd==ARJ_CMD_UPDATE) { if(cf_num!=0) { resume_position=0L; continued_prevvolume=0; } if(multivolume_option&&check_multivolume(MULTIVOLUME_INCREMENT)<MULTIVOLUME_INCREMENT) volume_flag_set=1; if(!volume_flag_set&&vol_file_num!=0) { flist_retrieve(filename, &properties, &flist_main, vol_file_num-1); if(pack_file_stub(0, 0)&&!volume_flag_set) { cfa_store(vol_file_num-1, FLFLAG_PROCESSED); vol_file_num=0; } } for(cur_file=0; !volume_flag_set&&cur_file<flist_main.files; cur_file++) { if(cfa_get(cur_file)==FLFLAG_TO_PROCESS) { flist_retrieve(filename, &properties, &flist_main, cur_file); if(pack_file_stub(0, 0)) { if(volume_flag_set) vol_file_num=cur_file+1; else cfa_store(cur_file, FLFLAG_PROCESSED); } else cfa_store(cur_file, FLFLAG_SKIPPED); if(multivolume_option&&check_multivolume(MULTIVOLUME_INCREMENT)<MULTIVOLUME_INCREMENT&&(cur_file+1)<flist_main.files) volume_flag_set=1; } } if(multivolume_option&&check_multivolume(MULTIVOLUME_INCREMENT)<MULTIVOLUME_INCREMENT&&cur_file<flist_main.files) volume_flag_set=1;#ifdef HAVE_VOL_LABELS if(handle_labels&&!volume_flag_set) store_label();#endif if(multivolume_option&&check_multivolume(MULTIVOLUME_INCREMENT)<MULTIVOLUME_INCREMENT&&cur_file<flist_main.files) volume_flag_set=1; if(total_chapters!=0&&!volume_flag_set&¤t_chapter<=CHAPTERS_MAX&&total_chapters>recent_chapter) create_chapter_mark(); } else if(cmd==ARJ_CMD_JOIN) total_files+=copy_archive(); else if(cmd==ARJ_CMD_ORDER) { pf_num=0; for(cur_file=0; cur_file<flist_main.files; cur_file++) { /* has been previously selected? Otherwise its "default" value is FLFLAG_TO_PROCESS :-o */ if(cfa_get(cur_file)==FLFLAG_PROCESSED) { fseek(aistream, arch_hdr_index[cur_file], SEEK_SET); read_header(0, aistream, archive_name); special_processing(CFA_NONE, aistream); pf_num++; } } for(cur_file=0; cur_file<order_fcount; cur_file++) { if(order_list[cur_file]>0L) { fseek(aistream, order_list[cur_file], SEEK_SET); read_header(0, aistream, archive_name); special_processing(CFA_NONE, aistream); pf_num++; } } if(total_files!=pf_num) error(M_ORDER_CNT_MISMATCH); msg_cprintf(0, M_FILES_REORDERED); } if(cmd==ARJ_CMD_COPY&&total_chapters!=0&&!volume_flag_set&&total_files!=0&&total_chapters>recent_chapter) create_chapter_mark();}/* Some post-processing actions */static void finish_processing(int cmd){ int skip_query; unsigned long cur_pos, eof_pos; int entry; char *ext_ptr; char *bak_name; FILE_COUNT cur_file; int vol_code; char *msg_ptr; int ratio; unsigned long free_space; int protected=0; int is_prot; if(modify_command) { if(cmd==ARJ_CMD_DELETE&&total_files!=0&&file_args==1&&!strcmp_os(f_arg_array[0], all_wildcard)) { skip_query=yes_on_all_queries||query_delete; if(!skip_query) { msg_sprintf(misc_buf, M_QUERY_DELETE_N_FILES, total_files); if(!query_action(REPLY_YES, QUERY_DELETE_N_FILES, (FMSG *)misc_buf)) { errors++; tmp_archive_cleanup(); longjmp(main_proc, 1); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -