diff --git a/src/sbbs3/filedat.c b/src/sbbs3/filedat.c index 074114f2a0f2756d50f5ac7943193c6cd19c8780..51679e53464e48cb629c9f2d48db79e13f13f693 100644 --- a/src/sbbs3/filedat.c +++ b/src/sbbs3/filedat.c @@ -809,7 +809,7 @@ long create_archive(const char* archive, const char* format } long extract_files_from_archive(const char* archive, const char* outdir, const char* allowed_filename_chars - ,bool with_path, long max_files, str_list_t file_list, char* error, size_t maxerrlen) + ,bool with_path, bool overwrite, long max_files, str_list_t file_list, char* error, size_t maxerrlen) { int result; struct archive *ar; @@ -884,6 +884,8 @@ long extract_files_from_archive(const char* archive, const char* outdir, const c SAFECOPY(fpath, outdir); backslash(fpath); SAFECAT(fpath, pathname); + if(!overwrite && fexist(fpath)) + continue; FILE* fp = fopen(fpath, "wb"); if(fp == NULL) { char err[256]; @@ -945,6 +947,7 @@ bool extract_diz(scfg_t* cfg, file_t* f, str_list_t diz_fnames, char* path, size ,/* outdir: */cfg->temp_dir ,/* allowed_filename_chars: */NULL /* any */ ,/* with_path: */false + ,/* overwrite: */false ,/* max_files: */strListCount(diz_fnames) ,/* file_list: */diz_fnames ,/* error: */NULL, 0) >= 0) { diff --git a/src/sbbs3/filedat.h b/src/sbbs3/filedat.h index b598014706567bb9256d3c38cf95aa2e79f857c8..de68269df56a01b0e9d00ff60cbc3ff71cc1e729 100644 --- a/src/sbbs3/filedat.h +++ b/src/sbbs3/filedat.h @@ -72,7 +72,7 @@ DLLEXPORT long create_archive(const char* archive, const char* format ,bool with_path, str_list_t file_list, char* error, size_t maxerrlen); DLLEXPORT char* cmdstr(scfg_t*, user_t*, const char* instr, const char* fpath, const char* fspec, char* cmd, size_t); DLLEXPORT long extract_files_from_archive(const char* archive, const char* outdir, const char* allowed_filename_chars - ,bool with_path, long max_files, str_list_t file_list, char* error, size_t); + ,bool with_path, bool overwrite, long max_files, str_list_t file_list, char* error, size_t); DLLEXPORT int archive_type(const char* archive, char* str, size_t size); extern const char* supported_archive_formats[]; diff --git a/src/sbbs3/js_archive.c b/src/sbbs3/js_archive.c index 608da5a3aef53c949fc61ee0833cc4c60a7446bc..34e754f8e6259b5e01010fc9fc9dce987fd0317b 100644 --- a/src/sbbs3/js_archive.c +++ b/src/sbbs3/js_archive.c @@ -109,6 +109,7 @@ js_extract(JSContext *cx, uintN argc, jsval *arglist) char* allowed_filename_chars = SAFEST_FILENAME_CHARS; str_list_t file_list = NULL; bool with_path = false; + bool overwrite = true; int32 max_files = 0; char error[256] = ""; jsrefcount rc; @@ -136,6 +137,10 @@ js_extract(JSContext *cx, uintN argc, jsval *arglist) allowed_filename_chars = NULL; // We trust this archive argn++; } + if(argc > argn && JSVAL_IS_BOOLEAN(argv[argn])) { + overwrite = JSVAL_TO_BOOLEAN(argv[argn]); + argn++; + } if(argc > argn && JSVAL_IS_NUMBER(argv[argn])) { if(!JS_ValueToInt32(cx, argv[argn], &max_files)) { free(outdir); @@ -154,7 +159,7 @@ js_extract(JSContext *cx, uintN argc, jsval *arglist) rc = JS_SUSPENDREQUEST(cx); long extracted = extract_files_from_archive(filename, outdir, allowed_filename_chars - ,with_path, (ulong)max_files, file_list, error, sizeof(error)); + ,with_path, overwrite, (ulong)max_files, file_list, error, sizeof(error)); strListFree(&file_list); free(outdir); JS_RESUMEREQUEST(cx, rc); @@ -538,7 +543,7 @@ static jsSyncMethodSpec js_archive_functions[] = { ,31900 }, { "extract", js_extract, 1, JSTYPE_NUMBER - ,JSDOCSTR("output_directory [,boolean with_path = false] [,number max_files = 0] [,string file/pattern [...]]") + ,JSDOCSTR("output_directory [,boolean with_path = false] [,boolean overwrite = true] [,number max_files = 0] [,string file/pattern [...]]") ,JSDOCSTR("Extract files from an archive to specified output directory.<br>" "Returns the number of files extracted.<br>" "Will throw exception upon error.") diff --git a/src/sbbs3/pack_qwk.cpp b/src/sbbs3/pack_qwk.cpp index f680480fa200599ee3c62b3d724b772932795c2b..0727e71969f5a99879467697708e619a55f15b5b 100644 --- a/src/sbbs3/pack_qwk.cpp +++ b/src/sbbs3/pack_qwk.cpp @@ -73,6 +73,7 @@ bool sbbs_t::pack_qwk(char *packet, ulong *msgcnt, bool prepack) ,/* outdir: */cfg.temp_dir ,/* allowed_filename_chars: */NULL /* any */ ,/* with_path: */false + ,/* overwrite: */true ,/* max_files: */0 /* unlimited */ ,/* file_list: */NULL /* all files */ ,error, sizeof(error)); diff --git a/src/sbbs3/pack_rep.cpp b/src/sbbs3/pack_rep.cpp index 190bba9ebbbc6ec16c001f0a2b3502386651d52c..8f70d9069ee860f7ef2edb7f2349a46191e9ae02 100644 --- a/src/sbbs3/pack_rep.cpp +++ b/src/sbbs3/pack_rep.cpp @@ -67,6 +67,7 @@ bool sbbs_t::pack_rep(uint hubnum) ,/* outdir: */cfg.temp_dir ,/* allowed_filename_chars: */NULL /* any */ ,/* with_path: */false + ,/* overwrite: */true ,/* max_files: */0 /* unlimited */ ,/* file_list: */NULL /* all files */ ,error, sizeof(error)); diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c index 982e328aa3393442d34f0b7f557c7b455eab62a4..fcb4a24123b0408d8e22ffa6b6f505210f4fc215 100644 --- a/src/sbbs3/sbbsecho.c +++ b/src/sbbs3/sbbsecho.c @@ -2266,7 +2266,7 @@ int unpack(const char *infile, const char* outdir) long file_count; file_count = extract_files_from_archive(infile, outdir - ,/* allowed_filename_chars: */SAFEST_FILENAME_CHARS, /* with_path */false + ,/* allowed_filename_chars: */SAFEST_FILENAME_CHARS, /* with_path */false, /* overwrite: */true ,/* max_files: */0, /* file_list = ALL */NULL, error, sizeof(error)); if(file_count > 0) { lprintf(LOG_DEBUG, "libarchive extracted %lu files from %s", file_count, infile); diff --git a/src/sbbs3/un_qwk.cpp b/src/sbbs3/un_qwk.cpp index ac05baf2f7003144c0e4db524a0d2573e2d6499c..6f4096015c63a2579fc581d38e1827107f15f12a 100644 --- a/src/sbbs3/un_qwk.cpp +++ b/src/sbbs3/un_qwk.cpp @@ -80,6 +80,7 @@ bool sbbs_t::unpack_qwk(char *packet,uint hubnum) ,/* outdir: */cfg.temp_dir ,/* allowed_filename_chars: */NULL /* any */ ,/* with_path: */false + ,/* overwrite: */true ,/* max_files: */0 /* unlimited */ ,/* file_list: */NULL /* all files */ ,error, sizeof(error)); diff --git a/src/sbbs3/un_rep.cpp b/src/sbbs3/un_rep.cpp index 7db302217e6d818819bff139e6cbc32a43f3ab75..918949d01cc668ddf29db2875e036bebe04c8e54 100644 --- a/src/sbbs3/un_rep.cpp +++ b/src/sbbs3/un_rep.cpp @@ -76,6 +76,7 @@ bool sbbs_t::unpack_rep(char* repfile) ,/* outdir: */cfg.temp_dir ,/* allowed_filename_chars: */SAFEST_FILENAME_CHARS ,/* with_path: */false + ,/* overwrite: */true ,/* max_files */1000 ,/* file_list: */NULL /* all files */ ,error, sizeof(error));