diff --git a/README.md b/README.md index 8309158..0f47c1a 100755 --- a/README.md +++ b/README.md @@ -6,20 +6,20 @@ It offers a lot of options. I will place these below. But first let me talk abou #### Presented arguments (options) ``` -Usage: pmt [OPTIONS] backup PARTITION [OUTPUT] [OPTIONS]... - or: pmt [OPTIONS] flash FILE PARTITION [OPTIONS]... - or: pmt [OPTIONS] format FILE_SYSTEM[ext/2/3/4] PARTITION [OPTIONS]... +Usage: + pmt backup PARTITION [OUTPUT] [OPTIONS]... + pmt flash FILE PARTITION [OPTIONS]... + pmt format FILE_SYSTEM[ext/2/3/4] PARTITION [OPTIONS]... Options: - -l, --logical It is meant to determine whether the target partition is logical. - -c, --context It is meant to specify a custom /dev context. Only classic partitions (default: /dev/block/by-name). - -p, --list List partitions. - -s, --silent Information and warning messages are silenced in normal work. - -f, --force Force mode. Some things are ignored. - -S, --set-lang Set current language. - -v, --version See version. - --help See this help message. - -L, --license See license. + -l | --logical it is meant to determine whether the target partition is logical + -c | --context it is meant to specify a custom /dev context. Only classic partitions (default: /dev/block/by-name) + -p | --list list partitions + -s | --silent information and warning messages are silenced in normal work. + -f | --force force mode. Error messages are silenced and some things are ignored. + -v | --version see version + --help see help message + -L | --license see license Examples: pmt backup boot_a -c /dev/block/platform/bootdevice/by-name @@ -35,7 +35,7 @@ Report bugs to - Feel free to ask any questions you want. - Packages are available in publications. - If the logical partition flag is not used, a classic partition is tried to be processing by default. -- [Click to see special version changes](https://github.com/YZBruh/pbt/blob/2.3.0/CHANGELOG.md) +- [Click to see special version changes](https://github.com/YZBruh/pbt/blob/2.1.0-en/CHANGELOG.md) - Let me know your suggestions! ### How is it built? @@ -43,7 +43,7 @@ Android NDK is required to build. - [Download](https://developer.android.com/ndk/downloads) and extract the NDK package. - Clone this repository. And get access to it. ``` -git clone https://github.com/YZBruh/pbt -b 2.3.0 ./pmt +git clone https://github.com/YZBruh/pbt -b 2.1.0 ./pmt cd pmt ``` - Set the NDK working directory variable. @@ -77,13 +77,19 @@ export NDK_PROJECT_PATH=$(pwd) ``` ``` -chmod 777 utils.sh +chmod 777 make-deb.sh # for making 64-bit package -./utils.sh make-deb arm64-v8a +./make-deb.sh arm64-v8a # for making 32-bit package -./utils.sh make-deb armeabi-v7a +./make-deb.sh armeabi-v7a +``` + +### Easy install on termux + - Just execute this command in termux: +```shell +curl -LSs "https://raw.githubusercontent.com/YZBruh/pbt/2.1.0/install-termux.sh" | bash - ``` ### Notes diff --git a/debutils/DEBIAN/control_32 b/debutils/DEBIAN/control_32 index c274952..896afa9 100755 --- a/debutils/DEBIAN/control_32 +++ b/debutils/DEBIAN/control_32 @@ -1,6 +1,6 @@ Source: pmt Package: pmt -Version: 2.3.0 +Version: 2.4.0 Architecture: arm Description: pmt is for reading, writing and formatting partitions of android devices Section: misc diff --git a/debutils/DEBIAN/control_64 b/debutils/DEBIAN/control_64 index 3ec8203..d742c49 100755 --- a/debutils/DEBIAN/control_64 +++ b/debutils/DEBIAN/control_64 @@ -1,6 +1,6 @@ Source: pmt Package: pmt -Version: 2.3.0 +Version: 2.4.0 Architecture: aarch64 Description: pmt is for reading, writing and formatting partitions of android devices Section: misc diff --git a/debutils/mandoc/pmt.8.gz b/debutils/mandoc/pmt.8.gz index a0cbd5a..1a9adc8 100755 Binary files a/debutils/mandoc/pmt.8.gz and b/debutils/mandoc/pmt.8.gz differ diff --git a/jni/Android.mk b/jni/Android.mk index dd04916..4c01df7 100755 --- a/jni/Android.mk +++ b/jni/Android.mk @@ -18,13 +18,12 @@ LOCAL_PATH := $(call my-dir) include $(LOCAL_PATH)/config/env.mk +PMT_CFLAGS = -O3 -std=c11 -Wall $(EXTRA_COMPILER_FLAGS) + ifeq ($(ENABLE_DEBUGGING), true) - PMT_CFLAGS := -O3 -g -Wall -Wextra $(EXTRA_COMPILER_FLAGS) -else ifeq ($(ENABLE_DEBUGGING), false) - PMT_CFLAGS := -O3 -Wall $(EXTRA_COMPILER_FLAGS) + PMT_CFLAGS += -g -Wextra else - $(warning Unknown debugging flag: $(ENABLE_DEBUGGING). Please see: $(PREDIR)/config/env.mk. Using non-debugging flags) - PMT_CFLAGS := -O3 -Wall $(EXTRA_COMPILER_FLAGS) + $(warning Unknown debugging flag: $(ENABLE_DEBUGGING). Please see: src/config/env.mk. Using non-debugging flags) endif include $(CLEAR_VARS) @@ -38,8 +37,8 @@ include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) -LOCAL_MODULE := libpmt_error -LOCAL_SRC_FILES := error.c +LOCAL_MODULE := libpmt_debugging +LOCAL_SRC_FILES := debugging.c LOCAL_C_INCLUDES := $(LOCAL_PATH)/include LOCAL_CFLAGS := $(PMT_CFLAGS) @@ -69,6 +68,7 @@ LOCAL_MODULE := pmt LOCAL_SRC_FILES := \ pmt.c \ versioner.c \ + get_stat.c \ tools.c \ lang_tools.c \ languages.c \ @@ -76,7 +76,7 @@ LOCAL_SRC_FILES := \ LOCAL_C_INCLUDES := $(LOCAL_PATH)/include LOCAL_STATIC_LIBRARIES := \ libpmt_root \ - libpmt_error \ + libpmt_debugging \ libpmt_partitiontool \ libpmt_list LOCAL_CFLAGS := $(PMT_CFLAGS) diff --git a/jni/debugging.c b/jni/debugging.c new file mode 100755 index 0000000..5bb658e --- /dev/null +++ b/jni/debugging.c @@ -0,0 +1,79 @@ +/* By YZBruh */ + +/** + * Copyright 2024 Partition Manager + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined(__cplusplus) +extern "C" { +#endif + +#define INC_MAIN_LIBS + +#include + +extern char* bin_name; +extern bool pmt_silent; + +extern struct pmt_langdb_general* current; +extern struct pmt_langdb_general en; +extern struct pmt_langdb_general tr; + +void debug(LogLevel status, const char* _Nullable fmt, ...) +{ + if (fmt == NULL) exit(1); + + va_list args; + va_start(args, fmt); + + switch (status) + { + case LOG_LEVEL_ERR: + if (!pmt_silent) + { + fprintf(stderr, "%s: ", bin_name); + vfprintf(stderr, fmt, args); + } + exit(1); + break; + case LOG_LEVEL_WARN: + if (!pmt_silent) + { + fprintf(stderr, "%s: ", current->warn); + vfprintf(stderr, fmt, args); + } + break; + case LOG_LEVEL_FATAL: + if (!pmt_silent) + { + fprintf(stderr, "%s: ", current->fatal); + vfprintf(stderr, fmt, args); + } + abort(); + break; + case LOG_LEVEL_DEBUG: + if (!pmt_silent) + vfprintf(stdout, fmt, args); + break; + } + + va_end(args); +} + +#if defined(__cplusplus) +} +#endif + +/* end of code */ \ No newline at end of file diff --git a/jni/docs.c b/jni/docs.c index e3e83a3..7ceeafd 100755 --- a/jni/docs.c +++ b/jni/docs.c @@ -38,8 +38,10 @@ prepare_langconf_docs(void) static char* langctrl_str; langctrl_str = loadlang(); - if (strcmp(langctrl_str, "en") == 0) curr_docs = &en_docs; - else if (strcmp(langctrl_str, "tr") == 0) curr_docs = &tr_docs; + if (strcmp(langctrl_str, "en") == 0) + curr_docs = &en_docs; + else if (strcmp(langctrl_str, "tr") == 0) + curr_docs = &tr_docs; } void licenses(void) diff --git a/jni/error.c b/jni/error.c deleted file mode 100755 index b077734..0000000 --- a/jni/error.c +++ /dev/null @@ -1,42 +0,0 @@ -/* By YZBruh */ - -/** - * Copyright 2024 Partition Manager - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if defined(__cplusplus) -extern "C" { -#endif /* __cplusplus */ - -#define INC_MAIN_LIBS - -#include - -__noreturn void error(int __status, const char* _Nullable __fmt, ...) -{ - if (__fmt == NULL) exit(__status); - - va_list err_args; - va_start(err_args, __fmt); - fprintf(stderr, "%s: ", bin_name); - vfprintf(stderr, __fmt, err_args); - fprintf(stderr, "\n"); - va_end(err_args); - exit(__status); -} - -#if defined(__cplusplus) -} -#endif /* __cplusplus */ \ No newline at end of file diff --git a/jni/get_stat.c b/jni/get_stat.c new file mode 100755 index 0000000..5a3d65b --- /dev/null +++ b/jni/get_stat.c @@ -0,0 +1,78 @@ +/* By YZBruh */ + +/** + * Copyright 2024 Partition Manager + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined(__cplusplus) +extern "C" { +#endif + +#define INC_MAIN_LIBS +#define INC_STAT + +#include + +/** + * The target file is controlled by the stat function. + * Files, directories, links and blocks (disks) are for. + * If it is never found, it returns 1 value. + * If he finds 0 value is returned. + * If the desired type is not in -1 value is returned. + */ +int get_stat(const char* _Nonnull filepath, const char* _Nonnull stype) +{ + static struct stat get_stat; + + if (stat(filepath, &get_stat) != 0) + return 1; + + if (strcmp(stype, "dir") == 0) + { + if (S_ISDIR(get_stat.st_mode)) + return 0; + else + return -1; + } + else if (strcmp(stype, "file") == 0) + { + if (S_ISREG(get_stat.st_mode)) + return 0; + else + return -1; + } + else if (strcmp(stype, "blk") == 0) + { + if (S_ISBLK(get_stat.st_mode)) + return 0; + else + return -1; + } + else if (strcmp(stype, "link") == 0) + { + if (S_ISLNK(get_stat.st_mode)) + return 0; + else + return -1; + } + + return 2; +} + +#if defined(__cplusplus) +} +#endif + +/* end of code */ \ No newline at end of file diff --git a/jni/include/pmt-stringkeys.h b/jni/include/pmt-stringkeys.h index e9b3c06..8e16429 100755 --- a/jni/include/pmt-stringkeys.h +++ b/jni/include/pmt-stringkeys.h @@ -62,6 +62,8 @@ struct pmt_langdb_general { const char* _Nonnull see_license; const char* _Nonnull success_backup; const char* _Nonnull success_flash; + const char* _Nonnull warn; + const char* _Nonnull fatal; const char* _Nonnull switching_lang; const char* _Nonnull welcome; const char* _Nullable welcome_; diff --git a/jni/include/pmt-versioning.h b/jni/include/pmt-versioning.h index 1f17acc..c9e7814 100755 --- a/jni/include/pmt-versioning.h +++ b/jni/include/pmt-versioning.h @@ -34,7 +34,7 @@ __BEGIN_DECLS /* versioning */ #define PMT_MAJOR 2 -#define PMT_MINOR 3 +#define PMT_MINOR 4 #define PMT_PATCHLEVEL 0 __END_DECLS diff --git a/jni/include/pmt.h b/jni/include/pmt.h index ce77800..497ba82 100755 --- a/jni/include/pmt.h +++ b/jni/include/pmt.h @@ -49,11 +49,6 @@ __BEGIN_DECLS #if defined(INC_DEBUGERS) #include - -/* from . Modified. */ -__noreturn void error(int __status, const char* _Nullable __fmt, ...); -void warning(const char* _Nullable __fmt, ...) __printflike(1, 2); - #endif #if defined(INC_PMT_LANGS) @@ -100,6 +95,14 @@ extern struct pmt_langdb_general tr; extern struct pmt_langdb_docs en_docs; extern struct pmt_langdb_docs tr_docs; +/* logging levels */ +typedef enum { + LOG_LEVEL_FATAL, + LOG_LEVEL_ERR, + LOG_LEVEL_WARN, + LOG_LEVEL_DEBUG +} LogLevel; + /* function definations */ int listpart(void); void check_dev_point(void); @@ -109,6 +112,13 @@ void version(void); void setlang(const char* _Nonnull lang); int search_sls(void); char* _Nonnull loadlang(void); +void debug(LogLevel status, const char* _Nullable fmt, ...); + +/* logging macros */ +#define LOGF(fmt, ...) debug(LOG_LEVEL_FATAL, fmt, ##__VA_ARGS__) +#define LOGE(fmt, ...) debug(LOG_LEVEL_ERR, fmt, ##__VA_ARGS__) +#define LOGW(fmt, ...) debug(LOG_LEVEL_WARN, fmt, ##__VA_ARGS__) +#define LOGD(fmt, ...) debug(LOG_LEVEL_DEBUG, fmt, ##__VA_ARGS__) #endif diff --git a/jni/lang_tools.c b/jni/lang_tools.c index 1bf865f..01737db 100755 --- a/jni/lang_tools.c +++ b/jni/lang_tools.c @@ -65,27 +65,36 @@ search_stat(const char* _Nonnull filepath, const char* _Nonnull stype) { struct stat search_stat; - if (stat(filepath, &search_stat) != 0) return 1; + if (stat(filepath, &search_stat) != 0) + return 1; if (strcmp(stype, "dir") == 0) { - if (S_ISDIR(search_stat.st_mode)) return 0; - else return -1; + if (S_ISDIR(search_stat.st_mode)) + return 0; + else + return -1; } else if (strcmp(stype, "file") == 0) { - if (S_ISREG(search_stat.st_mode)) return 0; - else return -1; + if (S_ISREG(search_stat.st_mode)) + return 0; + else + return -1; } else if (strcmp(stype, "blk") == 0) { - if (S_ISBLK(search_stat.st_mode)) return 0; - else return -1; + if (S_ISBLK(search_stat.st_mode)) + return 0; + else + return -1; } else if (strcmp(stype, "link") == 0) { - if (S_ISLNK(search_stat.st_mode)) return 0; - else return -1; + if (S_ISLNK(search_stat.st_mode)) + return 0; + else + return -1; } return 2; @@ -94,7 +103,8 @@ search_stat(const char* _Nonnull filepath, const char* _Nonnull stype) static int langctrl(const char* _Nonnull lang_) { - if (strcmp(lang_, "en") == 0 || strcmp(lang_, "tr") == 0) return 0; + if (strcmp(lang_, "en") == 0 || strcmp(lang_, "tr") == 0) + return 0; return 1; } @@ -104,7 +114,8 @@ char* loadlang(void) static char lang_fpr[10] = "en"; langconf = NULL; - if (search_stat(TERMUX_PMT_MANDOC, "file") == 0) pmt_inst_on_termux = true; + if (search_stat(TERMUX_PMT_MANDOC, "file") == 0) + pmt_inst_on_termux = true; if (pmt_inst_on_termux) { @@ -187,35 +198,47 @@ void setlang(const char* _Nonnull lang) { static char* lcf_path; - if (pmt_inst_on_termux) lcf_path = TERMUX_PMTLANG_CONF; - else lcf_path = INTRNL_PMTLANG_CONF; + if (pmt_inst_on_termux) + lcf_path = TERMUX_PMTLANG_CONF; + else + lcf_path = INTRNL_PMTLANG_CONF; - if (search_stat(lcf_path, "file") == 0) remove(lcf_path); + if (search_stat(lcf_path, "file") == 0) + remove(lcf_path); langconf = NULL; - if (pmt_inst_on_termux) langconf = fopen(TERMUX_PMTLANG_CONF, "w"); - else langconf = fopen(INTRNL_PMTLANG_CONF, "w"); - if (langconf == NULL) error(1, "%s: Failed!!! Cannot open/write config file.\n", bin_name); + if (pmt_inst_on_termux) + langconf = fopen(TERMUX_PMTLANG_CONF, "w"); + else + langconf = fopen(INTRNL_PMTLANG_CONF, "w"); + + if (langconf == NULL) + LOGE("Failed!!! Cannot open/write config file.\n"); if (langctrl(lang) == 0) { - if (fprintf(langconf, "%s", lang) < 2) error(1, "Failed!!! Couldn't write config!\n"); - else fclose(langconf); + if (fprintf(langconf, "%s", lang) < 2) + LOGE("Failed!!! Couldn't write config!\n"); + else + fclose(langconf); } - else error(1, "Unknown language: %s.", bin_name, lang); + else + LOGE("Unknown language: %s.\n", lang); static int status; if (pmt_inst_on_termux) { status = open(TERMUX_PMT_SW_POINT, O_WRONLY | O_CREAT | O_TRUNC, 0666); - if (status == 0) close(status); + if (status == 0) + close(status); } else { status = open(INTRNL_PMT_SW_POINT, O_WRONLY | O_CREAT | O_TRUNC, 0666); - if (status == 0) close(status); + if (status == 0) + close(status); } } @@ -223,15 +246,18 @@ int search_sls(void) { static char* sw_point_path; - if (pmt_inst_on_termux) sw_point_path = TERMUX_PMT_SW_POINT; - else sw_point_path = INTRNL_PMT_SW_POINT; + if (pmt_inst_on_termux) + sw_point_path = TERMUX_PMT_SW_POINT; + else + sw_point_path = INTRNL_PMT_SW_POINT; if (search_stat(sw_point_path, "file") == 0) { remove(sw_point_path); return 0; } - else return 1; + else + return 1; } #if defined(__cplusplus) diff --git a/jni/languages.c b/jni/languages.c index 28d0482..b66c7f9 100755 --- a/jni/languages.c +++ b/jni/languages.c @@ -52,22 +52,24 @@ struct pmt_langdb_general en = { .ffile_more_part = "Size of the file to flash more than the partition size.", .cannot_get_bsz = "The partition block size could not be obtained!", .format_fail = "Formatting failed! There may be a chance that something has been damaged!", - .logical_warn = "Warning: device using logical partition type.", - .ab_warn = "Warning: device using A/B partition style.", - .out_not_spec = "Warning: The output file name was not specified. The output file name will be", + .logical_warn = "Device using logical partition type.", + .ab_warn = "Device using A/B partition style.", + .out_not_spec = "The output file name was not specified. The output file name will be", .please_rerun = "Please re run", .part_disk_sz = "Disk size of the partition", .flash_file_sz = "Size of flash file", - .part_disk_sz_fail = "Warning: failed to get target partition disk size", - .flash_file_sz_fail = "Warning: failed to get flash file size.", + .part_disk_sz_fail = "Failed to get target partition disk size", + .flash_file_sz_fail = "Failed to get flash file size.", .list_of_dir = "List of dir", .see_license = "See licenses with -L argument.", .success_backup = "Success. Output", .success_flash = "Success.", + .warn = "WARNING", + .fatal = "FATAL ERROR", .switching_lang = "Switching language...", .welcome = "language!", .welcome_ = "Welcome to ", - .for_more = "for more information.", + .for_more = "for more information", .try_h = "Try", .usage_head = "Usage", .compiler_str = "Compiler", @@ -117,6 +119,8 @@ struct pmt_langdb_general tr = { .see_license = "Lisansı -L seçeneği ile görüntüleyebilirsiniz.", .success_backup = "Başarılı. Çıktı", .success_flash = "Başarılı.", + .warn = "UYARI", + .fatal = "KRİTİK HATA", .switching_lang = "Dil değiştiriliyor...", .welcome = "diline hoş geldiniz!", .welcome_ = NULL, diff --git a/jni/listpart.c b/jni/listpart.c index 513f79a..68f577d 100755 --- a/jni/listpart.c +++ b/jni/listpart.c @@ -53,11 +53,15 @@ list(const char* operation, const char* target_dir) struct dirent *entry; dir = NULL; - if (strcmp(operation, "access") == 0) list = false; - else if (strcmp(operation, "print") == 0) list = true; - else return -1; + if (strcmp(operation, "access") == 0) + list = false; + else if (strcmp(operation, "print") == 0) + list = true; + else + return -1; dir = opendir(target_dir); + if (dir != NULL) { if (!list) @@ -67,51 +71,62 @@ list(const char* operation, const char* target_dir) } else { - printf("%s: `%s'\n", current->list_of_dir, target_dir); - while ((entry = readdir(dir)) != NULL) printf("%s\n", entry->d_name); + LOGD("%s: `%s'\n", current->list_of_dir, target_dir); + while ((entry = readdir(dir)) != NULL) + { + LOGD("%s\n", entry->d_name); + } closedir(dir); return 0; } } - else return -1; + else + return -1; return 2; } /* list existing partitions */ -int listpart(void) { +int listpart(void) +{ if (pmt_use_cust_cxt) { if (list("access", cust_cxt) != 0) { - if (!pmt_force_mode) error(1, "%s: `%s': %s", current->not_open, cust_cxt, strerror(errno)); - else return 1; + if (!pmt_force_mode) + LOGE("%s: `%s': %s\n", current->not_open, cust_cxt, strerror(errno)); + else + return 1; } - else list("print", cust_cxt); + else + list("print", cust_cxt); } else { if (list("access", CUR_DEV_CNTX) != 0) { - if (!pmt_force_mode) error(1, "%s: `%s': %s", current->not_open, CUR_DEV_CNTX, strerror(errno)); - else return 1; + if (!pmt_force_mode) + LOGE("%s: `%s': %s\n", current->not_open, CUR_DEV_CNTX, strerror(errno)); + else + return 1; } - else list("print", CUR_DEV_CNTX); + else + list("print", CUR_DEV_CNTX); } if (pmt_logical) { if (list("access", LGC_DEV_CNTX) != 0) - { - if (!pmt_silent) error(1, "%s: `%s': %s", current->not_open, LGC_DEV_CNTX, strerror(errno)); - else return 1; - } - else list("print", LGC_DEV_CNTX); + LOGE("%s: `%s': %s\n", current->not_open, LGC_DEV_CNTX, strerror(errno)); + else + list("print", LGC_DEV_CNTX); } - if (pmt_ab && !pmt_silent) printf("%s: %s\n", bin_name, current->ab_warn); + if (pmt_ab) + LOGD("%s: %s\n", bin_name, current->ab_warn); - if (pmt_logical && !pmt_silent) printf("%s: %s\n", bin_name, current->logical_warn); + if (pmt_logical) + LOGD("%s: %s\n", bin_name, current->logical_warn); return 0; } diff --git a/jni/partitiontool.c b/jni/partitiontool.c index e7a1b8a..9e7e541 100755 --- a/jni/partitiontool.c +++ b/jni/partitiontool.c @@ -30,7 +30,7 @@ extern bool pmt_logical; extern char* cust_cxt; static int -search(const char* _Nonnull target) { return access(target, F_OK); } +accf(const char* _Nonnull target) { return access(target, F_OK); } /* check parts */ void check_dev_point() @@ -40,13 +40,18 @@ void check_dev_point() { static char cust_cxt_ck_path[150]; sprintf(cust_cxt_ck_path, "%s/boot_a", cust_cxt); - if (search(cust_cxt_ck_path) != 0) pmt_ab = false; - else pmt_ab = true; + + if (accf(cust_cxt_ck_path) != 0) + pmt_ab = false; + else + pmt_ab = true; } else { - if (search("/dev/block/by-name/boot_a") != 0) pmt_ab = false; - else pmt_ab = true; + if (accf("/dev/block/by-name/boot_a") != 0) + pmt_ab = false; + else + pmt_ab = true; } /* true = logical | false = classic */ @@ -54,13 +59,18 @@ void check_dev_point() { static char cust_cxt_ckl_path[150]; sprintf(cust_cxt_ckl_path, "%s/super", cust_cxt); - if (search(cust_cxt_ckl_path) != 0) pmt_logical = false; - else pmt_logical = true; + + if (accf(cust_cxt_ckl_path) != 0) + pmt_logical = false; + else + pmt_logical = true; } else { - if (search("/dev/block/by-name/super") != 0) pmt_logical = false; - else pmt_logical = true; + if (accf("/dev/block/by-name/super") != 0) + pmt_logical = false; + else + pmt_logical = true; } } diff --git a/jni/pmt.c b/jni/pmt.c index f0c58e1..ec06571 100755 --- a/jni/pmt.c +++ b/jni/pmt.c @@ -68,8 +68,10 @@ check_optsym(const char* _Nonnull mystring) { if (strncmp(mystring, opt_symbol, 1) == 0) { - if (!pmt_force_mode) error(1, "%s", common_symbol_rule); - else exit(1); + if (!pmt_force_mode) + LOGE("%s\n", common_symbol_rule); + else + exit(1); } } @@ -81,31 +83,40 @@ check_optsym(const char* _Nonnull mystring) * If the desired type is not in -1 value is returned. */ static int -search_stat(const char* _Nonnull filepath, const char* _Nonnull stype) +get_stat(const char* _Nonnull filepath, const char* _Nonnull stype) { - struct stat search_stat; + struct stat get_stat; - if (stat(filepath, &search_stat) != 0) return 0; + if (stat(filepath, &get_stat) != 0) + return 0; if (strcmp(stype, "dir") == 0) { - if (S_ISDIR(search_stat.st_mode)) return 0; - else return -1; + if (S_ISDIR(get_stat.st_mode)) + return 0; + else + return -1; } else if (strcmp(stype, "file") == 0) { - if (S_ISREG(search_stat.st_mode)) return 0; - else return -1; + if (S_ISREG(get_stat.st_mode)) + return 0; + else + return -1; } else if (strcmp(stype, "blk") == 0) { - if (S_ISBLK(search_stat.st_mode)) return 0; - else return -1; + if (S_ISBLK(get_stat.st_mode)) + return 0; + else + return -1; } else if (strcmp(stype, "link") == 0) { - if (S_ISLNK(search_stat.st_mode)) return 0; - else return -1; + if (S_ISLNK(get_stat.st_mode)) + return 0; + else + return -1; } return 0; @@ -120,19 +131,24 @@ int main(int argc, char* argv[]) static char* langctrl_str; langctrl_str = loadlang(); - if (strcmp(langctrl_str, "en") == 0) current = &en; - else if (strcmp(langctrl_str, "tr") == 0) current = &tr; + if (strcmp(langctrl_str, "en") == 0) + current = &en; + else if (strcmp(langctrl_str, "tr") == 0) + current = &tr; sprintf(common_symbol_rule, "%s\n", current->common_symbol_rule); if (search_sls() == 0) { - if (current->welcome_ != NULL) printf("%s", current->welcome_); - printf("%s %s %s %s.\n", current->language, current->welcome, current->by_str, current->lang_by_s); + if (current->welcome_ != NULL) + LOGD("%s\n", current->welcome_); + + LOGD("%s %s %s %s.\n", current->language, current->welcome, current->by_str, current->lang_by_s); } /* check argument total */ - if (argc < 2) error(1, "%s\n%s `%s --help' %s.", current->missing_operand, current->try_h, argv[0], current->for_more); + if (argc < 2) + LOGE("%s\n%s `%s --help' %s.\n", current->missing_operand, current->try_h, argv[0], current->for_more); /* a structure for long arguments */ struct option long_options[] = { @@ -171,22 +187,16 @@ int main(int argc, char* argv[]) case 'l': check_root(); check_dev_point(); - if (pmt_logical) pmt_use_logical = true; + if (pmt_logical) + pmt_use_logical = true; else - { - if (!pmt_force_mode) error(1, "%s", current->not_logical); - else return 1; - } + LOGE("%s\n", current->not_logical); break; /* context selector option */ case 'c': pmt_use_cust_cxt = true; cust_cxt = strdup(optarg); - if (strncmp(cust_cxt, opt_symbol, 1) == 0) - { - if (!pmt_force_mode) error(1, "%s", common_symbol_rule); - else return 1; - } + check_optsym(cust_cxt); break; /* partition lister function */ case 'p': @@ -227,17 +237,18 @@ int main(int argc, char* argv[]) break; /* for invalid options */ case '?': - printf("%s `%s --help' %s\n", current->try_h, argv[0], current->for_more); + LOGD("%s `%s --help' %s\n", current->try_h, argv[0], current->for_more); return 1; break; default: - printf("%s: %s [backup] [flash] [format] [-l | --logical] [-c | --context] [-D | --list] [-v | --version] [--help] [-L | --license]\n", current->usage_head, argv[0]); + LOGD("%s: %s [backup] [flash] [format] [-l | --logical] [-c | --context] [-D | --list] [-v | --version] [--help] [-L | --license]\n", current->usage_head, argv[0]); return 1; } } /* stop the program if multiple viewer is used */ - if (combo_wiewers) error(1, "%s", current->multiple_wiewers); + if (combo_wiewers) + LOGE("%s", current->multiple_wiewers); /* controller to handle viewer */ if (wiew_help) @@ -263,10 +274,10 @@ int main(int argc, char* argv[]) if (pmt_setlang) { - printf("%s: %s\n", argv[0], current->switching_lang); + LOGD("%s: %s\n", argv[0], current->switching_lang); setlang(langpr); sleep(2); - printf("%s: %s.\n", argv[0], current->please_rerun); + LOGD("%s: %s.\n", argv[0], current->please_rerun); return 0; } @@ -285,10 +296,7 @@ int main(int argc, char* argv[]) check_getvar_temp++; if (argc < check_getvar_temp) - { - if (!pmt_silent) error(1, "%s 0.", current->expected_backup_arg); - else return 1; - } + LOGE("%s 0.\n", current->expected_backup_arg); target_partition = argv[getvar_temp]; @@ -303,6 +311,7 @@ int main(int argc, char* argv[]) check_optsym(out); pmt_backup = true; + break; } else if (strcmp(argv[argtest], "flash") == 0) @@ -310,16 +319,10 @@ int main(int argc, char* argv[]) check_getvar_temp++; if (argc < check_getvar_temp) - { - if (!pmt_force_mode || !pmt_silent) error(1, "%s 0.", current->expected_flash_arg); - else return 1; - } + LOGE("%s 0.\n", current->expected_flash_arg); if (argc == check_getvar_temp) - { - if (!pmt_force_mode || !pmt_silent) error(1, "%s 1.", current->expected_flash_arg); - else return 1; - } + LOGE("%s 1.\n", current->expected_flash_arg); target_flash_file = argv[getvar_temp]; @@ -330,6 +333,7 @@ int main(int argc, char* argv[]) check_optsym(target_partition); pmt_flash = true; + break; } else if (strcmp(argv[argtest], "format") == 0) @@ -337,16 +341,10 @@ int main(int argc, char* argv[]) check_getvar_temp++; if (argc < check_getvar_temp) - { - if (!pmt_force_mode) error(1, "%s 0.", current->expected_format_arg); - else return 1; - } + LOGE("%s 0.\n", current->expected_format_arg); if (argc == check_getvar_temp) - { - if (!pmt_force_mode) error(1, "%s 1.", current->expected_format_arg); - else return 1; - } + LOGE("%s 1.\n", current->expected_format_arg); format_fs = argv[getvar_temp]; @@ -357,13 +355,14 @@ int main(int argc, char* argv[]) check_optsym(target_partition); pmt_format = true; + break; } } /* target control is done */ - if (!pmt_backup && !pmt_flash && !pmt_format && !pmt_silent) error(1, "%s\n%s `%s --help` %s", argv[0], current->missing_operand, current->try_h, current->for_more); - else return 1; + if (!pmt_backup && !pmt_flash && !pmt_format) + LOGE("%s `%s --help` %s\n", current->missing_operand, current->try_h, current->for_more); /* checks */ check_root(); @@ -372,54 +371,37 @@ int main(int argc, char* argv[]) if (pmt_format) { if (strcmp(format_fs, "ext4") != 0 || strcmp(format_fs, "ext3") != 0 || strcmp(format_fs, "ext2") != 0) - { - if (!pmt_force_mode) error(1, "%s: %s", current->unsupported_fs, format_fs); - else return 1; - } + LOGE("%s: %s\n", current->unsupported_fs, format_fs); } if (pmt_flash) { - search_result = search_stat(target_flash_file, "file"); + search_result = get_stat(target_flash_file, "file"); if (search_result == 1) - { - if (!pmt_silent) error(1, "%s `%s': %s", current->cannot_stat, target_flash_file, strerror(errno)); - else return 1; - } + LOGE("%s `%s': %s\n", current->cannot_stat, target_flash_file, strerror(errno)); else if (search_result == -1) - { - if (!pmt_silent) error(1, "`%s': %s", target_flash_file, current->not_file); - else return 1; - } + LOGE("`%s': %s\n", target_flash_file, current->not_file); } /* custom context checker */ if (pmt_use_cust_cxt) { - search_result = search_stat(cust_cxt, "dir"); + search_result = get_stat(cust_cxt, "dir"); if (search_result == 1) - { - if (!pmt_silent) error(1, "%s `%s': %s", current->cannot_stat, cust_cxt, strerror(errno)); - else return 1; - } + LOGE("%s `%s': %s\n", current->cannot_stat, cust_cxt, strerror(errno)); else if (search_result == -1) - { - if (!pmt_silent) error(1, "`%s': %s", cust_cxt, current->not_dir); - else return 1; - } + LOGE("`%s': %s\n", cust_cxt, current->not_dir); - if (strstr(cust_cxt, "/dev") == NULL && !pmt_force_mode) error(1, "%s", current->not_in_dev); + if (strstr(cust_cxt, "/dev") == NULL && !pmt_force_mode) + LOGE("%s\n", current->not_in_dev); } if (target_partition == NULL) { if (!pmt_force_mode) - { - if (!pmt_silent) error(1, "%s\n%s `%s --help' %s", current->req_part_name, current->try_h, argv[0], current->for_more); - } - else return 1; + LOGE("%s\n%s `%s --help' %s\n", current->req_part_name, current->try_h, argv[0], current->for_more); } else { @@ -430,10 +412,14 @@ int main(int argc, char* argv[]) * * 3 = format */ - if (pmt_backup) return pmt(1); - else if (pmt_flash) return pmt(2); - else if (pmt_format) return pmt(3); - else if (!pmt_silent) error(1, "%s\n%s `%s --help' %s", current->no_target, current->try_h, argv[0], current->for_more); + if (pmt_backup) + return pmt(1); + else if (pmt_flash) + return pmt(2); + else if (pmt_format) + return pmt(3); + else + LOGE("%s\n%s `%s --help' %s\n", current->no_target, current->try_h, argv[0], current->for_more); } } diff --git a/jni/root.c b/jni/root.c index 15c5454..aa639e6 100755 --- a/jni/root.c +++ b/jni/root.c @@ -34,10 +34,7 @@ void check_root(void) { /* a quick, easy method for verifying root */ if (getuid() != 0) - { - if (!pmt_force_mode) error(1, "%s", current->no_root); - else exit(1); - } + LOGE("%s\n", current->no_root); } #if defined(__cplusplus) diff --git a/jni/tools.c b/jni/tools.c index 8114074..699fd77 100755 --- a/jni/tools.c +++ b/jni/tools.c @@ -34,6 +34,7 @@ extern char* cust_cxt; extern char* target_partition; extern char* target_flash_file; extern char* partition_type; +extern char* bin_name; extern bool pmt_use_logical; extern bool pmt_use_cust_cxt; extern bool pmt_logical; @@ -55,13 +56,16 @@ calc_flsz(const char* _Nonnull filepath) { static int calc_flsz_file; calc_flsz_file = open(filepath, O_RDONLY); - if (calc_flsz_file == -1) return calc_flsz_file; + + if (calc_flsz_file == -1) + return calc_flsz_file; static off_t flsz; flsz = lseek(calc_flsz_file, 0, SEEK_END); close(calc_flsz_file); - if (flsz == (off_t)-1) return -1; + if (flsz == (off_t)-1) + return -1; return (double)flsz / (1024 * 1024); } @@ -70,12 +74,8 @@ calc_flsz(const char* _Nonnull filepath) * error that the partition is not found. * It's for quick action. */ -static int -partition_not_found(void) -{ - if (!pmt_silent) error(1, "%s", current->part_not_found); - else return 1; -} +static void +partition_not_found(void) { LOGE("%s\n", current->part_not_found); } /* to stop use of function type */ #define partition_not_found partition_not_found() @@ -88,31 +88,40 @@ partition_not_found(void) * If the desired type is not in -1 value is returned. */ static int -search_stat(const char* _Nonnull filepath, const char* _Nonnull stype) +get_stat(const char* _Nonnull filepath, const char* _Nonnull stype) { - struct stat search_stat; + struct stat get_stat; - if (stat(filepath, &search_stat) != 0) return 1; + if (stat(filepath, &get_stat) != 0) + return 1; if (strcmp(stype, "dir") == 0) { - if (S_ISDIR(search_stat.st_mode)) return 0; - else return -1; + if (S_ISDIR(get_stat.st_mode)) + return 0; + else + return -1; } else if (strcmp(stype, "file") == 0) { - if (S_ISREG(search_stat.st_mode)) return 0; - else return -1; + if (S_ISREG(get_stat.st_mode)) + return 0; + else + return -1; } else if (strcmp(stype, "blk") == 0) { - if (S_ISBLK(search_stat.st_mode)) return 0; - else return -1; + if (S_ISBLK(get_stat.st_mode)) + return 0; + else + return -1; } else if (strcmp(stype, "link") == 0) { - if (S_ISLNK(search_stat.st_mode)) return 0; - else return -1; + if (S_ISLNK(get_stat.st_mode)) + return 0; + else + return -1; } return 2; @@ -123,11 +132,12 @@ static void search_partition(const char* _Nonnull partition) { static int partition_results = 0; - partition_results = search_stat(partition, "blk"); + partition_results = get_stat(partition, "blk"); - if (partition_results == 1) partition_not_found; - else if (partition_results == -1 && !pmt_silent) error(1, "%s", current->not_block); - else exit(1); + if (partition_results == 1) + partition_not_found; + else if (partition_results == -1) + LOGE("%s\n", current->not_block); } int pmt(unsigned short progress_code) @@ -148,37 +158,37 @@ int pmt(unsigned short progress_code) { if (!pmt_use_logical) { - if (pmt_use_cust_cxt) sprintf(backupper_path, "%s/%s", cust_cxt, target_partition); - else sprintf(backupper_path, "/dev/block/by-name/%s", target_partition); + if (pmt_use_cust_cxt) + sprintf(backupper_path, "%s/%s", cust_cxt, target_partition); + else + sprintf(backupper_path, "/dev/block/by-name/%s", target_partition); } - else if (pmt_use_logical) sprintf(backupper_path, "/dev/block/mapper/%s", target_partition); + else + sprintf(backupper_path, "/dev/block/mapper/%s", target_partition); search_partition(backupper_path); - if (calc_flsz(backupper_path) != -1 && !pmt_silent) printf("%s: %.2f\n", current->part_disk_sz, calc_flsz(backupper_path)); - else if (!pmt_silent) warning("%s", current->part_disk_sz_fail); + if (calc_flsz(backupper_path) != -1) + LOGD("%s: %.2f\n", current->part_disk_sz, calc_flsz(backupper_path)); + else + LOGW("%s\n", current->part_disk_sz_fail); srcf = open(backupper_path, O_RDONLY); if (srcf == -1) - { - if (!pmt_silent) error(1, "%s: %s: %s", current->not_read, backupper_path, strerror(errno)); - else return 1; - } + LOGE("%s: %s: %s\n", current->not_read, backupper_path, strerror(errno)); /* determine output */ if (strcmp(out, target_partition) == 0) { sprintf(outf, "%s.img", target_partition); - if (!pmt_silent) warning("%s: %s", current->out_not_spec, outf); + LOGW("%s: %s\n", current->out_not_spec, outf); } - else sprintf(outf, "%s", target_partition); + else + sprintf(outf, "%s", target_partition); targetf = open(outf, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (targetf == -1) - { - if (!pmt_silent) error(1, "%s: %s: %s", current->not_gen, outf, strerror(errno)); - else return 1; - } + LOGE("%s: %s: %s\n", current->not_gen, outf, strerror(errno)); /* start writing */ while ((readed_data = read(srcf, buffer, BFSIZE)) > 0 && copied_data < count) @@ -186,11 +196,9 @@ int pmt(unsigned short progress_code) ssize_t writed_data = write(targetf, buffer, readed_data); if (writed_data != readed_data) { - if (!pmt_silent) warning("%s: %s: %s", current->not_write, backupper_path, strerror(errno)); - close(srcf); - close(targetf); - if (search_stat(outf, "file") == 0) remove(outf); - return 1; + if (get_stat(outf, "file") == 0) + remove(outf); + LOGF("%s: %s: %s\n", current->not_write, backupper_path, strerror(errno)); } copied_data += writed_data; @@ -200,7 +208,7 @@ int pmt(unsigned short progress_code) close(srcf); close(targetf); - if (!pmt_silent) printf("%s: %s\n", current->success_backup, outf); + LOGD("%s: %s\n", current->success_backup, outf); } else if (progress_code == 2) { @@ -208,49 +216,45 @@ int pmt(unsigned short progress_code) /* for classic */ if (!pmt_use_logical) { - if (pmt_use_cust_cxt) sprintf(flasher_path, "%s/%s", cust_cxt, target_partition); - else sprintf(flasher_path, "/dev/block/by-name/%s", target_partition); + if (pmt_use_cust_cxt) + sprintf(flasher_path, "%s/%s", cust_cxt, target_partition); + else + sprintf(flasher_path, "/dev/block/by-name/%s", target_partition); /* for logical */ } - else if (pmt_use_logical) sprintf(flasher_path, "/dev/block/mapper/%s", target_partition); + else + sprintf(flasher_path, "/dev/block/mapper/%s", target_partition); /* check partition */ search_partition(flasher_path); - if (calc_flsz(target_flash_file) != -1 && !pmt_force_mode) printf("%s: %.2f\n", current->flash_file_sz, calc_flsz(target_flash_file)); - else warning("%s", current->flash_file_sz_fail); + if (calc_flsz(target_flash_file) != -1) + LOGD("%s: %.2f\n", current->flash_file_sz, calc_flsz(target_flash_file)); + else + LOGW("%s\n", current->flash_file_sz_fail); - if (calc_flsz(target_partition) != -1 && !pmt_force_mode) printf("%s: %.2f\n", current->part_disk_sz, calc_flsz(target_partition)); - else warning("%s", current->part_disk_sz_fail); + if (calc_flsz(target_partition) != -1) + LOGD("%s: %.2f\n", current->part_disk_sz, calc_flsz(target_partition)); + else + LOGW("%s\n", current->part_disk_sz_fail); - if (calc_flsz(target_flash_file) > calc_flsz(target_partition) && !pmt_silent) error(1, "%s", current->ffile_more_part); - else return 1; + if (calc_flsz(target_flash_file) > calc_flsz(target_partition)) + LOGE("%s\n", current->ffile_more_part); srcf = open(target_flash_file, O_RDONLY); if (srcf == -1) - { - if (!pmt_force_mode) error(1, "%s: %s: %s", current->not_read, target_flash_file, strerror(errno)); - else return 1; - } + LOGF("%s: %s: %s\n", current->not_read, target_flash_file, strerror(errno)); targetf = open(target_partition, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (targetf == -1) - { - if (!pmt_force_mode) error(1, "%s: %s: %s", current->not_read, target_partition, strerror(errno)); - else return 1; - } + LOGF("%s: %s: %s\n", current->not_read, target_partition, strerror(errno)); /* start writing */ while ((readed_data = read(srcf, buffer, BFSIZE)) > 0 && copied_data < count) { ssize_t writed_data = write(targetf, buffer, readed_data); if (writed_data != readed_data) - { - warning("%s: %s: %s", current->not_write, backupper_path, strerror(errno)); - close(srcf); - close(targetf); - return 1; - } + LOGF("%s: %s: %s\n", current->not_write, backupper_path, strerror(errno)); copied_data += writed_data; } @@ -258,18 +262,21 @@ int pmt(unsigned short progress_code) close(srcf); close(targetf); - if (!pmt_force_mode) printf("%s.\n", current->success_flash); + LOGD("%s.\n", current->success_flash); } else if (progress_code == 3) { /* generate partition extn */ if (!pmt_use_logical) { - if (pmt_use_cust_cxt) sprintf(ppath, "%s/%s", cust_cxt, target_partition); - else sprintf(ppath, "/dev/block/by-name/%s", target_partition); + if (pmt_use_cust_cxt) + sprintf(ppath, "%s/%s", cust_cxt, target_partition); + else + sprintf(ppath, "/dev/block/by-name/%s", target_partition); /* for logical */ } - else if (pmt_use_logical) sprintf(ppath, "/dev/block/mapper/%s", target_partition); + else + sprintf(ppath, "/dev/block/mapper/%s", target_partition); /* check partition */ search_partition(ppath); @@ -277,20 +284,14 @@ int pmt(unsigned short progress_code) /* get target partition block size */ struct statvfs file_sys_inf; if (statvfs(ppath, &file_sys_inf) != 0) - { - if (!pmt_force_mode) error(1, "%s", current->cannot_get_bsz); - else return 1; - } + LOGE("%s\n", current->cannot_get_bsz); /* generate mke2fs command */ sprintf(formatter_cmd, "mke2fs -Fq -t %s -b %lu %s", format_fs, file_sys_inf.f_bsize, ppath); /* run command */ if (system(formatter_cmd) != 0) - { - if (!pmt_force_mode) error(1, "%s", current->format_fail); - else return 1; - } + LOGF("%s\n", current->format_fail); } return 0; diff --git a/jni/versioner.c b/jni/versioner.c index 909c496..206b5a9 100755 --- a/jni/versioner.c +++ b/jni/versioner.c @@ -33,21 +33,21 @@ extern struct pmt_langdb_general tr; void version(void) { - printf("%s %s %d.%d.%d (%d%d%d) ", bin_name, current->version_str, PMT_MAJOR, PMT_MINOR, PMT_PATCHLEVEL, PMT_MAJOR, PMT_MINOR, PMT_PATCHLEVEL); + LOGD("%s %s %d.%d.%d (%d%d%d) ", bin_name, current->version_str, PMT_MAJOR, PMT_MINOR, PMT_PATCHLEVEL, PMT_MAJOR, PMT_MINOR, PMT_PATCHLEVEL); #if __SIZEOF_POINTER__ == 4 - printf("32-bit %s\n", current->bin_str); + LOGD("32-bit %s\n", current->bin_str); #elif __SIZEOF_POINTER__ == 8 - printf("64-bit %s\n", current->bin_str); + LOGD("64-bit %s\n", current->bin_str); #else - printf("<%s> %s\n", current->unknw_str, current->bin_str); + LOGD("<%s> %s\n", current->unknw_str, current->bin_str); #endif #if defined(__clang__) - printf("%s: clang %d.%d.%d (NDK r%d%s %s)\n", current->compiler_str, __clang_major__, __clang_minor__, __clang_patchlevel__, __NDK_MAJOR__, __NDK_MINOR_STATUS__, __NDK_BETA_STATUS__); + LOGD("%s: clang %d.%d.%d (NDK r%d%s %s)\n", current->compiler_str, __clang_major__, __clang_minor__, __clang_patchlevel__, __NDK_MAJOR__, __NDK_MINOR_STATUS__, __NDK_BETA_STATUS__); #endif - printf("%s\n", current->see_license); + LOGD("%s\n", current->see_license); } #if defined(__cplusplus) diff --git a/utils.sh b/utils.sh index 26c642a..39869ca 100755 --- a/utils.sh +++ b/utils.sh @@ -20,7 +20,7 @@ RED='\e[31m' NC='\e[0m' # needed variables -VERSION="2.3.0" +VERSION="2.4.0" CUR_DIR=$(pwd) LIB_DIR=${CUR_DIR}/libs ARMV8A_DIR=${LIB_DIR}/arm64-v8a