📄 rearj.c
字号:
#endif if(truename(full_name, name)) { msg_cprintf(H_HL|H_NFMT, M_SKIP_CANT_FIND, name); return(REARJ_ERL_WARNING); } entry=split_name(full_name, NULL, filespec); #if TARGET==UNIX fspec_len=strlen(filespec); #endif dot_pos=strrchr(filespec, '.'); if(dot_pos==NULL) { #if TARGET!=UNIX extension[0]='\0'; #endif strcpy(target_name, full_name); strcat(target_name, dot); strcat(target_name, archivers[target_type].suffix); strcpy(bak_name, full_name); } else { #if TARGET!=UNIX *dot_pos++='\0'; strcpy(extension, dot_pos); #endif strncpy(target_name, full_name, entry); target_name[entry]='\0'; strcpy(bak_name, target_name); #if TARGET!=UNIX strcat(target_name, filespec); strcat(target_name, dot); strcat(target_name, archivers[target_type].suffix); #endif strcat(bak_name, filespec); } strcat(bak_name, dot); strcat(bak_name, backup_extension); strcpy(cnv_name, work_dir); strcat(cnv_name, pathsep_str); strcat(cnv_name, filespec); strcat(cnv_name, dot); strcat(cnv_name, archivers[target_type].suffix); repack=!strcmp_os(target_name, full_name); tmp_name=cnv_diskette_archives?cnv_name:target_name; src_type=-1; for(i=0; i<total_suffixes; i++) { #if TARGET==UNIX match=0; if(dot_pos==NULL) { if(archivers[i].suffix[0]=='\0') match=1; } else { pattern_len=strlen(archivers[i].suffix); if(fspec_len>pattern_len&& filespec[fspec_len-pattern_len-1]=='.'&& !strcmp_os(filespec+fspec_len-pattern_len, archivers[i].suffix)) { match=1; strcat(target_name, filespec); target_name[strlen(target_name)-pattern_len]='\0'; strcat(target_name, archivers[target_type].suffix); } } if(match) src_type=i; #else if(!strcmp_os(extension, archivers[i].suffix)) src_type=i; #endif } if(src_type==-1) src_type=default_suffix; if(src_type==-1) { msg_cprintf(H_HL|H_NFMT, M_SKIP_UNKNOWN_TYPE, full_name); return(REARJ_ERL_UNCONFIGURED); } old_fsize=file_getfsize(full_name); if((!overwrite_existing&&!repack&&file_exists(target_name))|| (cnv_diskette_archives&&!overwrite_existing&&file_exists(cnv_name))) { msg_cprintf(H_HL|H_NFMT, M_SKIP_TGT_EXISTS, full_name); return(REARJ_ERL_TGT_EXISTS); } if(!update_with_backups&&repack) { msg_cprintf(H_HL|H_NFMT, M_SKIP_REPACK, full_name); return(REARJ_ERL_UPD_SKIPPED); } msg_cprintf(H_HL|H_NFMT, M_CONVERTING_ARCHIVE, full_name, archivers[src_type].suffix, archivers[target_type].suffix); if(conversion_query) { msg_cprintf(0, M_QUERY_CONVERT); if(!query_action()) { msg_cprintf(H_HL|H_NFMT, M_SKIPPING, full_name); return(REARJ_ERL_UPD_SKIPPED); } } if(overwrite_existing&&!repack&&file_exists(target_name)&&!no_file_activity) if(file_unlink(target_name)) error(M_CANT_UNLINK, target_name); if(cnv_diskette_archives&&overwrite_existing&&file_exists(cnv_name)&&!no_file_activity) if(file_unlink(cnv_name)) error(M_CANT_UNLINK, cnv_name); ts_store(&old_ftime, OS, file_getftime(full_name)); unlink_all(tmp_dir); if(file_chdir(tmp_dir)) error(M_CANT_CHDIR, tmp_dir); if(run_preunpack_cmd) { sprintf(cmd_buffer, "%s %s", preunpack_cmd_text, full_name); msg_cprintf(H_HL|H_NFMT, M_EXECUTING_PRE, cmd_buffer); exec_cmd(cmd_buffer); } sprintf(cmd_buffer, archivers[src_type].unpack_cmd, full_name); msg_cprintf(H_HL|H_NFMT, M_EXECUTING, cmd_buffer); exec_rc=exec_exe(cmd_buffer); if(exec_rc!=0) { if(exec_rc==-1) msg_cprintf(H_HL|H_NFMT, M_SKIP_EXE_MISSING, full_name); else msg_cprintf(H_HL|H_NFMT, M_SKIP_UNPACK_ERR, full_name, exec_rc); return(REARJ_ERL_UNPACK); } if(!archivers[target_type].subdirs_supported&&check_for_dirs()) { msg_cprintf(H_HL|H_NFMT, M_SKIP_UNSUPP_DIR, full_name); return(REARJ_ERL_DIRECTORIES); } if(!check_for_entries()) { msg_cprintf(H_HL|H_NFMT, M_SKIP_NO_FILES, full_name); return(REARJ_ERL_UNPACK); } if(run_precount_cmd) { sprintf(cmd_buffer, "%s %s", precount_cmd_text, full_name); msg_cprintf(H_HL|H_NFMT, M_EXECUTING_CNT, cmd_buffer); exec_cmd(cmd_buffer); } if(!skip_size_check) old_count=count_files(); if(run_extract_cmd) { msg_cprintf(H_HL|H_NFMT, M_EXECUTING_EXTR, extract_cmd_text); exec_rc=exec_exe(extract_cmd_text); if(exec_rc!=0) { if(exec_rc==-1) msg_cprintf(H_HL|H_NFMT, M_SKIP_V_EXE_MISSING, full_name); else msg_cprintf(H_HL|H_NFMT, M_SKIP_V_ERR, full_name, exec_rc); return(REARJ_ERL_VIRUS); } } if(convert_nested_archives) { nst_suf_wildcard=(acc_nested_suffixes!=NULL)?acc_nested_suffixes:archivers[src_type].suffix; /* ASR FIX 30/12/1999: only 6 additional (%s) params in original REARJ v 2.42 */ sprintf(cmd_buffer, "%s *.%s " REARJ_SWITCHAR "t%s " REARJ_SWITCHAR "d " REARJ_SWITCHAR "r " REARJ_SWITCHAR "a%s " REARJ_SWITCHAR "e%s%s%s%s%s%s%s", exe_name, nst_suf_wildcard, archivers[target_type].suffix, nst_suf_wildcard, skip_size_check?" " REARJ_SWITCHAR "s":nullstr, no_file_activity?" " REARJ_SWITCHAR "z":nullstr, update_with_backups?" " REARJ_SWITCHAR "u":nullstr, overwrite_existing?" " REARJ_SWITCHAR "o":nullstr, run_extract_cmd?" " REARJ_SWITCHAR "v":nullstr, skip_rearj_sw?" " REARJ_SWITCHAR "+":nullstr, skip_packing?" " REARJ_SWITCHAR "g":nullstr); msg_cprintf(H_HL|H_NFMT, M_EXECUTING, cmd_buffer); exec_rc=exec_exe(cmd_buffer); if(exec_rc!=0) { if(exec_rc==-1) msg_cprintf(H_HL|H_NFMT, M_SKIP_REARJ_MISSING, full_name); else msg_cprintf(H_HL|H_NFMT, M_SKIP_REARJ_FAILED, full_name, exec_rc); return(REARJ_ERL_INTERNAL); } } if(skip_packing) { if(logging_enabled) { arj_gettime(&log_ts); if(fprintf(logstream, M_LOGENTRY_CONV, timeseq, archivers[target_type].suffix, old_fsize, 0L, 0L, full_name)<=0) error(M_CANT_WRITE_LOG); } return(0); } if(!skip_size_check) old_size=count_total_size(); if(!archivers[target_type].hidden_supported) reset_attrs(); if(update_with_backups&&repack) { if(file_exists(bak_name)&&!no_file_activity) if(file_unlink(bak_name)) error(M_CANT_UNLINK, bak_name); if(!no_file_activity) if(rename_with_check(full_name, bak_name)) { msg_cprintf(H_HL|H_NFMT, M_SKIP_CANT_RENAME, full_name, bak_name); return(REARJ_ERL_RENAME); } if(!no_file_activity) msg_cprintf(H_HL|H_NFMT, M_BACKED_UP, full_name, bak_name); } sprintf(cmd_buffer, archivers[target_type].pack_cmd, tmp_name); msg_cprintf(H_HL|H_NFMT, M_EXECUTING, cmd_buffer); exec_rc=exec_exe(cmd_buffer); if(exec_rc!=0) { if(update_with_backups&&repack) { if(file_exists(full_name)&&!no_file_activity) if(file_unlink(full_name)) error(M_CANT_UNLINK, full_name); if(!no_file_activity) if(rename_with_check(bak_name, full_name)) error(M_CANTRENAME, bak_name, full_name); } if(exec_rc==-1) msg_cprintf(H_HL|H_NFMT, M_SKIP_P_EXE_MISSING, full_name); else { /* ASR fix for 2.42.05 -- unlink empty .tar.gz archives */ if(archivers[target_type].manual_deletion) unlink(tmp_name); msg_cprintf(H_HL|H_NFMT, M_SKIP_PACK_ERR, full_name, exec_rc); } return(REARJ_ERL_PACK); } if(file_chdir(work_dir)) error(M_CANT_CHDIR, work_dir); if(!file_exists(tmp_name)) { if(update_with_backups&&repack) { if(file_exists(full_name)&&!no_file_activity) if(file_unlink(full_name)) error(M_CANT_UNLINK, full_name); if(!no_file_activity) if(rename_with_check(bak_name, full_name)) error(M_CANTRENAME, bak_name, full_name); } msg_cprintf(H_HL|H_NFMT, M_SKIP_NOT_PACKED, full_name); return(REARJ_ERL_PACK); } new_fsize=file_getfsize(tmp_name); if(skip_larger_output&&old_fsize<new_fsize) { msg_cprintf(H_HL|H_NFMT, M_SKIP_LARGER, full_name); if(!no_file_activity) if(file_unlink(tmp_name)) error(M_CANT_UNLINK, tmp_name); if(update_with_backups||!repack||no_file_activity) return(REARJ_ERL_OVERGROW); else { if(rename_with_check(bak_name, full_name)) return(REARJ_ERL_OVERGROW); else error(M_CANTRENAME, bak_name, full_name); } } if(!skip_size_check) { msg_cprintf(H_HL|H_NFMT, M_VERIFYING_SIZE, old_count, old_size); unlink_all(tmp_dir); if(file_chdir(tmp_dir)) error(M_CANT_CHDIR, tmp_dir); sprintf(cmd_buffer, archivers[target_type].unpack_cmd, tmp_name); msg_cprintf(H_HL|H_NFMT, M_EXECUTING, cmd_buffer); exec_exe(cmd_buffer); new_count=count_files(); new_size=count_total_size(); msg_cprintf(H_HL|H_NFMT, M_FOUND_SIZE, new_count, new_size); if(old_count!=new_count) { msg_cprintf(H_HL|H_NFMT, M_SKIP_COUNT_MISMATCH, full_name); if(!no_file_activity) if(file_unlink(tmp_name)) error(M_CANT_UNLINK, tmp_name); if(update_with_backups&&repack&&!no_file_activity) if(rename_with_check(bak_name, full_name)) error(M_CANTRENAME, bak_name, full_name); return(REARJ_ERL_COUNT); } if(old_size!=new_size) { msg_cprintf(H_HL|H_NFMT, M_SKIP_SIZE_MISMATCH, full_name); if(!no_file_activity) if(file_unlink(tmp_name)) error(M_CANT_UNLINK, tmp_name); if(update_with_backups&&repack&&!no_file_activity) if(rename_with_check(bak_name, full_name)) error(M_CANTRENAME, bak_name, full_name); return(REARJ_ERL_SIZE); } msg_cprintf(H_HL, M_SIZE_VERIFIED); if(file_chdir(work_dir)) error(M_CANT_CHDIR, work_dir); } if(cnv_diskette_archives) { if(file_getfree(full_name)+old_fsize<new_fsize) { msg_cprintf(H_HL|H_NFMT, M_SKIP_DISK_FULL, full_name); if(!no_file_activity) if(file_unlink(tmp_name)) error(M_CANT_UNLINK, tmp_name); if(update_with_backups&&repack&&!no_file_activity) if(rename_with_check(bak_name, full_name)) error(M_CANTRENAME, bak_name, full_name); return(REARJ_ERL_DISK_FULL); } } if(delete_original_archives) { if(!repack) { msg_cprintf(H_HL|H_NFMT, M_DELETING_2, full_name); if(!no_file_activity) if(file_unlink(full_name)) error(M_CANT_UNLINK, full_name); } else if(cnv_diskette_archives&&update_with_backups) { msg_cprintf(H_HL|H_NFMT, M_DELETING_2, bak_name); if(!no_file_activity) if(file_unlink(bak_name)) error(M_CANT_UNLINK, bak_name); } } if(cnv_diskette_archives) { if(!no_file_activity) { if(file_copy_v(cnv_name, target_name)) error(M_CANT_COPY, cnv_name, target_name); } if(!no_file_activity) if(file_unlink(cnv_name)) error(M_CANT_UNLINK, cnv_name); } if(delete_original_archives&&!cnv_diskette_archives&&update_with_backups&&repack) { msg_cprintf(H_HL|H_NFMT, M_DELETING_2, bak_name); if(!no_file_activity) if(file_unlink(bak_name)) error(M_CANT_UNLINK, bak_name); } if(!skip_timestamping) file_setftime(target_name, ts_native(&old_ftime, OS)); if(testing_mode&&!delete_original_archives) { if(update_with_backups&&repack) { if(file_exists(full_name)) if(file_unlink(full_name)) error(M_CANT_UNLINK, full_name); msg_cprintf(H_HL|H_NFMT, M_RENAMING, bak_name, full_name); if(!no_file_activity) { if(rename_with_check(bak_name, full_name)) error(M_CANTRENAME, bak_name, full_name); } } else if(!repack) { msg_cprintf(H_HL|H_NFMT, M_DELETING_2, target_name); if(!no_file_activity) if(file_unlink(target_name)) error(M_CANT_UNLINK, target_name); } } gain=(long)(old_fsize-new_fsize); msg_cprintf(H_HL|H_NFMT, M_OLD_SIZE, old_fsize); msg_cprintf(H_HL|H_NFMT, M_NEW_SIZE, new_fsize); msg_cprintf(H_HL|H_NFMT, M_SAVINGS_SIZE, gain); printf(lf); total_old_fsize+=old_fsize; total_new_fsize+=new_fsize; total_files++; if(logging_enabled) { arj_gettime(&log_ts); if(fprintf(logstream, M_LOGENTRY_CONV, timeseq, archivers[target_type].suffix, old_fsize, new_fsize, gain, full_name)<=0) error(M_CANT_WRITE_LOG); } return(0);}/* Adds a new file to the exclusion filelist */static void submit_exclusion(char *name){ char tmp_name[CCHMAXPATH]; FILE *stream; if(name[0]=='!') { name++; if(name[0]=='\0') error(M_LISTFILE_MISSING); if((stream=file_open(name, m_r))==NULL) error(M_CANTOPEN, stream); while(fgets(tmp_name, sizeof(tmp_name), stream)!=NULL) { tokenize_lf(tmp_name); alltrim(tmp_name); if(tmp_name[0]!='\0') { if(wild_list(&flist_exclusion, tmp_name, 0, 0, 0, NULL)) break; } } fclose(stream); } else wild_list(&flist_exclusion, name, 0, 0, 0, NULL);}/* Sets up REARJ */static void analyze_rearj_sw(char *arg){ char sw; char *swptr; swptr=arg+1; sw=toupper(*swptr); swptr++; if(sw=='D'&&*swptr=='\0') delete_original_archives=1; else if(sw=='E'&&*swptr=='\0') internal_archives_only=1; else if(sw=='F'&&*swptr=='\0') cnv_diskette_archives=1; else if(sw=='H'&&*swptr=='\0') help_issued=1; else if(sw=='O'&&*swptr=='\0') overwrite_existing=1; else if(sw=='P'&&*swptr=='\0') skip_lfn=1; else if(sw=='Q'&&*swptr=='\0') conversion_query=1; else if(sw=='R'&&*swptr=='\0') recurse_subdirs=1; else if(sw=='S'&&*swptr=='\0') skip_size_check=1; else if(sw=='V'&&*swptr=='\0') run_extract_cmd=1; else if(sw=='Z'&&*swptr=='\0') no_file_activity=1; else if(sw=='A') { if(*swptr!='\0') { case_path(swptr); acc_nested_suffixes=swptr; } convert_nested_archives=1; } else if(sw=='B'&&*swptr!='\0') { run_preunpack_cmd=1; preunpack_cmd_text=swptr; } else if(sw=='C'&&*swptr!='\0') { run_precount_cmd=1; precount_cmd_text=swptr; } else if(sw=='I') { if(*swptr!='\0') { case_path(swptr); exe_name=swptr; } chk_integrity=1; } else if(sw=='F'&&*swptr!='\0') { default_suffix=-1; case_path(swptr); suffix_override=swptr; } else if(sw=='L') { if(*swptr!='\0') { case_path(swptr); log_name=swptr; } logging_enabled=1; } else if(sw=='T'&&*swptr!='\0') { target_type=-1; case_path(swptr); target_suffix=swptr; } else if(sw=='U') { if(*swptr!='\0') { case_path(swptr); backup_extension=swptr; } update_with_backups=1; } else if(sw=='W'&&*swptr!='\0') { case_path(swptr); tmp_dir=swptr; work_directory_assigned=1; } else if(sw=='X'&&*swptr!='\0') submit_exclusion(swptr); else if(sw=='G'&&*swptr=='\0') skip_packing=1; else if(sw=='J'&&*swptr=='\0') skip_larger_output=1; else if(sw=='K'&&*swptr=='\0') skip_timestamping=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -