📄 arj.c
字号:
sprintf(archive_name, "%s/.%s", getenv("HOME"), misc_buf); if(!file_exists(archive_name)) sprintf(archive_name, "/etc/%s", misc_buf); if(file_exists(archive_name)) parse_arj_sw(cmd, archive_name, header); #endif archive_name[0]='\0'; /* ASR fix */ } } if(install_errhdl) ignore_errors=1; if(force_lfn) lfn_supported=LFN_SUPPORTED; if(use_ansi_cp==ANSICP_CONVERT) ansi_cpf=1; set_file_apis(use_ansi_cp); #ifndef NO_FATAL_ERROR_HDL if(win32_platform) install_smart_handler(); #endif if(lfn_mode==LFN_NONE||lfn_mode==LFN_IGNORE) lfn_supported=LFN_NOT_SUPPORTED; if(lfn_supported!=LFN_NOT_SUPPORTED&&lfn_mode==LFN_DUAL) lfn_supported=LFN_COMP; is_registered=!is_registered; if(!is_registered&®data[REG_NAME_SHIFT]!='\0') wait_error(M_CRC_ERROR); cmd=0; if(rsp_name[0]=='\0') { for(cur_arg=1; cur_arg<argc; cur_arg++) cmd=parse_cmdline(argv[cur_arg], cmd); } else { stream=file_open_noarch(rsp_name, m_r); while(fgets(header, FILENAME_MAX, stream)!=NULL) { tmp_ptr=malloc_str(header); got_str=1; for(tptr=tmp_ptr; *tptr!='\0'; tptr++) { if(rsp_per_line) { if(*tptr==LF) *tptr='\0'; } else if(*tptr==LF||*tptr==' ') *tptr='\0'; } endptr=tptr; tptr=tmp_ptr; while((endptr-tptr)>0) { /* ASR fix: check for overrun -- 25/08/2001 */ while(*tptr=='\0'&&((endptr-tptr)>0)) tptr++; if((endptr-tptr)>0) { cmd=parse_cmdline(tptr, cmd); while(*tptr!='\0'&&((endptr-tptr)>0)) tptr++; } } } fclose(stream); if(!got_str) error(M_CANTREAD); } if(install_errhdl) ignore_errors=1; if(force_lfn) lfn_supported=LFN_SUPPORTED; set_file_apis(use_ansi_cp); #ifndef NO_FATAL_ERROR_HDL if(win32_platform) install_smart_handler(); #endif if(file_args>=0) { case_path(archive_name); finish_archive_name(archive_name); } for(j=0; j<file_args; j++) { tptr=f_arg_array[j]; if(strcmp_os(tptr, nonexist_name)) { if(is_directory(tptr)) tptr=malloc_subdir_wc(tptr); f_arg_array[j]=tptr; } } if(lfn_mode==LFN_NONE||lfn_mode==LFN_IGNORE) lfn_supported=LFN_NOT_SUPPORTED; if(lfn_supported!=LFN_NOT_SUPPORTED&&lfn_mode==LFN_DUAL) lfn_supported=LFN_COMP; if(limit!=0) wait_error(M_CRC_ERROR); if(cmd==ARJ_CMD_CHK_INT) { if(archive_name[0]=='\0') { far_strcpyn((char FAR *)archive_name, (char FAR *)exe_name, FILENAME_MAX); if(!ansi_cpf) fix_ansi_name(archive_name); } use_ansi_cp=1; set_file_apis(use_ansi_cp); if(check_integrity(archive_name)) msg_cprintf(0, M_OK); else { arj_delay(BAD_CRC_DELAY); error(M_CRC_ERROR); } exit(ARJ_ERL_SUCCESS); } if(cmd==ARJ_CMD_RECOVER) { if(archive_name[0]=='\0') far_strcpyn((char FAR *)archive_name, (char FAR *)exe_name, FILENAME_MAX); use_ansi_cp=1; set_file_apis(use_ansi_cp); name=(char *)malloc_msg(FILENAME_MAX); msg_strcpy(name, M_ARJFIXED_NAME); stream=file_create(name, m_wb); if(stream!=NULL) fclose(stream); free(name); msg_strcpy(tmp_tmp_filename, M_ARJFIXED_NAME); name=form_prot_name(); if(!protfile_option) name[0]='\0'; if(recover_file(archive_name, name, tmp_tmp_filename, 0, 0L)) { tmp_tmp_filename[0]='\0'; error(M_CANT_FIND_DAMAGE, archive_name); } msg_cprintf(H_HL|H_NFMT, M_REPAIRED_FILE, tmp_tmp_filename); tmp_tmp_filename[0]='\0'; free(name); exit(ARJ_ERL_SUCCESS); } if(argc<2||help_issued||limit!=0) { check_fmsg(CHKMSG_NOSKIP); help_issued=1; use_ansi_cp=1; #if TARGET==UNIX allow_any_attrs=FETCH_FILES; #endif set_file_apis(use_ansi_cp); strcpy(archive_name, exe_name); if(is_tty(stdout)) prompt_for_more=!prompt_for_more; else prompt_for_more=0; indicator_style=IND_NONE; cmd=ARJ_CMD_PRINT; file_args=1; f_arg_array[0]=(argc<2)?brief_help:full_help; } #if TARGET==DOS if(lfn_supported!=LFN_NOT_SUPPORTED) msg_cprintf(H_HL, M_LFN_ENABLED); #endif #if defined(HAVE_EAS) if(ea_supported) msg_cprintf(H_HL, M_EA_ENABLED); #endif case_path(archive_suffixes); case_path(swptr_t); case_path(archive_ext_list); case_path(target_dir); case_path(index_name); case_path(arjsec_env_name); case_path(list_file); case_path(swptr_hm); case_path(nonexist_name); case_path(arjcrypt_name); case_path(arjdisp_ptr); case_path(filename_to_restart); case_path(work_directory); case_path(extraction_filename); case_path(archive_cmt_name); case_path(comment_file); unix_path_to_dos(target_dir); unix_path_to_dos(index_name); unix_path_to_dos(arjsec_env_name); unix_path_to_dos(list_file); unix_path_to_dos(swptr_hm); unix_path_to_dos(nonexist_name); unix_path_to_dos(arjcrypt_name); unix_path_to_dos(arjdisp_ptr); unix_path_to_dos(filename_to_restart); unix_path_to_dos(work_directory); unix_path_to_dos(extraction_filename); unix_path_to_dos(archive_cmt_name); unix_path_to_dos(comment_file); cmd_setup(&cmd, &is_add_cmd); /* ASR fix: in the open-source release, there is no longer any distinction between commercial and shareware versions. Therefore, the code which checks for M_EXT_LIC has been removed. */ #if TARGET!=DOS if(priority.class>0) set_priority(&priority); #endif if(run_cmd_at_start&&start_cmd[0]!='\0') exec_cmd(start_cmd); if(!exclude_files) { flist_cleanup(&flist_exclusion); flist_init(&flist_exclusion, FCLIM_EXCLUSION, FL_STANDARD); } flist_add_files(&flist_exclusion, NULL, arjtemp_wildcard, 0, 0, 0, NULL); if(filter_same_or_newer||filter_older) convert_time_limits(); if(cmd==ARJ_CMD_WHERE||extm_mode) search_setup(); else if(execute_cmd) get_exec_cmd(); if(garble_enabled) { if(!strcmp(garble_password, "?")) { tptr=(char *)malloc_msg(INPUT_LENGTH+1); msg_cprintf(0, M_ENTER_PWD); read_line_noecho(tptr, INPUT_LENGTH); garble_password=malloc_str(tptr); if(is_add_cmd||cmd=='G') { msg_cprintf(0, M_VERIFY_PWD); read_line_noecho(tptr, INPUT_LENGTH); if(strcmp(tptr, garble_password)) error(M_PWD_MISMATCH); } free(tptr); } } if(garble_password[0]=='\0'&&(cmd==ARJ_CMD_GARBLE||garble_enabled)) error(M_NO_PWD_OPTION); limit=20; if(append_curtime) append_curtime_proc(); if(is_add_cmd&&file_exists(archive_name)) { tmp_archive_exists=1; if(tmp_archive_name==NULL) { tmp_archive_used=-1; tmp_archive_name=malloc_msg(FILENAME_MAX); tmp_archive_name[0]='\0'; tmp_archive_used=0; } split_name(archive_name, tmp_archive_name, NULL); strcat(tmp_archive_name, arjtemp_spec); find_tmp_filename(tmp_archive_name); if(!stricmp(archive_name, tmp_archive_name)) error(M_CANTRENAME, archive_name, tmp_archive_name); file_unlink(tmp_archive_name); tmp_archive_removed=1; rename_with_check(archive_name, tmp_archive_name); } set_file_apis(1); arj_exec_validation(); set_file_apis(use_ansi_cp); #if TARGET!=UNIX if(cmd!=ARJ_CMD_ORDER) flist_type=find_dupl_drivespecs(f_arg_array, file_args)?FL_HASH:FL_STANDARD; else flist_type=FL_STANDARD; #else flist_type=FL_STANDARD; #endif numfiles=default_capacity; if((tptr=strchr(debug_opt, 'i'))!=NULL) { tptr++; numfiles=(FILE_COUNT)strtol(tptr, &tptr, 10); } if(strchr(debug_opt, 'q')!=NULL) flist_type=FL_STANDARD; flist_init(&flist_main, numfiles, (char)flist_type); flist_init(&flist_order, FILELIST_CAPACITY, (char)FL_STANDARD); if(is_add_cmd) { arch_wildcard_allowed=1; expand_wildcards=1; } else expand_wildcards=0; name=malloc_msg(FILENAME_MAX); for(j=limit; j<file_args; j++) { tptr=f_arg_array[j]; if(listchars_allowed&&tptr[0]==listchar) { if(*++tptr=='\0') error(M_MISSING_FILENAME_ARG, f_arg_array[j]); sort_f=0; entry=split_name(tptr, NULL, NULL); if(cmd==ARJ_CMD_ORDER&&!stricmp(tptr+entry, sort_filename)) sort_f=1; stream=file_open_noarch(tptr, m_r); tmp_ptr=header; order[j]=1; while(fgets(tmp_ptr, FILENAME_MAX, stream)!=NULL) { if(sort_f) { if(strlen(tmp_ptr)<=121) tmp_ptr[0]='\0'; else if(tmp_ptr[120]==' ') strcpy(tmp_ptr, tmp_ptr+121); } if(cmd==ARJ_CMD_ORDER&&strpbrk(tmp_ptr, wildcard_pattern)!=NULL) error(M_ORDER_WILDCARD); cnv_cmdline_fnm(tmp_ptr); if(tmp_ptr[0]!='\0') { name[0]='\0'; if(is_add_cmd) strcat(name, target_dir); strcat(name, tmp_ptr); count=0; if(flist_add_files(&flist_main, &flist_exclusion, name, expand_wildcards, recurse_subdirs, allow_any_attrs, &count)) { j=file_args; break; } if(listfile_err_opt&&count!=0) { if(flist_add(&flist_order, NULL, name, NULL, NULL)) { j=file_args; break; } } } } fclose(stream); } else { if(cmd==ARJ_CMD_ORDER&&strpbrk(f_arg_array[j], wildcard_pattern)) error(M_ORDER_WILDCARD); name[0]='\0'; if(is_add_cmd) strcat(name, target_dir); strcat(name, f_arg_array[j]); count=0; if(flist_add_files(&flist_main, &flist_exclusion, name, expand_wildcards, recurse_subdirs, allow_any_attrs, &count)) { if(strchr(debug_opt, 'i')!=NULL) order[j]=count; break; } order[j]=count; } } if(tmp_archive_removed) { rename_with_check(tmp_archive_name, archive_name); tmp_archive_name[0]='\0'; tmp_archive_removed=0; } if(create_list_file) { stream=file_create(list_file, m_w); for(cur_file=0; cur_file<flist_main.files; cur_file++) { flist_retrieve(name, NULL, &flist_main, cur_file); strcat(name, lf); if(fputs(name, stream)==EOF) error(M_DISK_FULL); } fclose(stream); } cfa_init(flist_main.files+1); if(restart_at_filename) restart_proc(tmp_ptr=header); free(name); if(create_index) { idxstream=file_open(index_name, m_a); if(msg_fprintf(idxstream, M_INDEX_HDR)<0) error(M_DISK_FULL); } if(cmd==ARJ_CMD_ORDER) { fnm_matching=FMM_FULL_PATH; arch_hdr_index=farmalloc_msg(((unsigned long)flist_main.files+1L)*sizeof(unsigned long)); for(cur_file=0; cur_file<flist_main.files; cur_file++) arch_hdr_index[cur_file]=0L; } if(!reg_validation(single_spc, single_spc, single_spc, regdata+REG_HDR_SHIFT)) limit=20; flist_init(&flist_archive, FCLIM_ARCHIVE, FL_STANDARD); flist_add_files(&flist_archive, NULL, archive_name, !is_add_cmd, is_add_cmd?0:recurse_subdirs, allow_any_attrs, NULL); if(flist_archive.files==0) { msg_cprintf(H_ERR, M_CANT_FIND, archive_name); errorlevel=ARJ_ERL_CANTOPEN; errors++; } if(debug_enabled&&strchr(debug_opt, 't')!=NULL) msg_cprintf(H_HL|H_NFMT, M_N_TICKS, get_ticks()-ticks); check_fmsg(CHKMSG_SKIP); if(quiet_mode==ARJ_QUIET2) new_stdout=new_stderr; /* The main processing loop */ for(cur_file=limit; cur_file<flist_archive.files; cur_file++) { if(quiet_mode==ARJ_QUIET2) new_stdout=new_stderr; flist_retrieve(archive_name, NULL, &flist_archive, cur_file); perform_cmd(cmd); if(cur_file+1<flist_archive.files) nputlf(); } file_arg_cleanup(&flist_order); errno=0; if(errors>0) error(M_FOUND_N_ERRORS, errors); return(errorlevel);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -