1 Commits
2.1.0 ... 2.0.0

Author SHA1 Message Date
d7ddaa8621 pmt: control_32: fix wrong version info 2024-06-10 06:39:31 +03:00
20 changed files with 549 additions and 692 deletions

16
CHANGELOG.md Executable file → Normal file
View File

@@ -1,11 +1,7 @@
### Version 2.1.0 (code 210) changelog ### Version 2.0.0 (code 200) changelog
- The main usage structure has been changed. - Instead of make, it was switched to build with NDK
- A more organized and functional code was provided. For example, separate values were not used for the same type of control all the time. Everything was done with a single function. - File/partition sizes were given during backup/flash operations.
- Smoother error processing was performed. - The use of `fprintf` has started for all error messages.
- There were a lot of arguments, it was cleared up. So the usage change I mentioned above has occurred.
- The exit codes were organized according to the sysexits library. | END OF VERSION 2.0.0 CHANGELOG |
- Better deb builder script.
- In short, a lot of missing and errors that happened in 2.0.0 have been fixed
| END OF VERSION 2.1.0 CHANGELOG |
|------------------------------------| |------------------------------------|

69
README.md Executable file → Normal file
View File

@@ -3,29 +3,34 @@
This binary C is for manage partitions of android devices. This binary C is for manage partitions of android devices.
It offers a lot of options. I will place these below. But first let me talk about the operation... It offers a lot of options. I will place these below. But first let me talk about the operation...
```
1. The partition name is obtained (with the -p or --partition argument)
2. Other arguments (if used) are processed.
3. The backup and flashing processes were written according to DD's code. So there is a piece of toybox code
```
#### Presented arguments (options) #### Presented arguments (options)
``` ```
Usage: Usage:
pmt backup PARTITION [OUTPUT] [OPTIONS]... -b | --backup backup mode
pmt flash FILE PARTITION [OPTIONS]... -F | --flash flash mode
pmt format FILE_SYSTEM[ext/2/3/4] PARTITION [OPTIONS]... -r | --format format mode (only ext2/3/4 file systems)
-p | --partition name of the partition to be backed up
Options: -l | --logical know that the partition that will be backed up is logical
-l | --logical it is meant to determine whether the target partition is logical -o | --out (only backups) the output name of the backed-up partition (default: partition name)
-d | --outdir (only backups) directory where the backup partition will be saved (default: /storage/emulated/0)
-c | --context it is meant to specify a custom /dev context. Only classic partitions (default: /dev/block/by-name) -c | --context it is meant to specify a custom /dev context. Only classic partitions (default: /dev/block/by-name)
-p | --list list partitions -D | --list list partitions
-s | --silent information and warning messages are silenced in normal work. -f | --force force mode. Output is not produced. Even if it's a mistake. But if the target is not a mode, the error is given. If you want to work stable, it is important to specify this option first.
-f | --force force mode. Error messages are silenced and some things are ignored.
-v | --version see version -v | --version see version
--help see help message --help see help message
-L | --license see license -L | --license see license
Examples: Examples:
pmt backup boot_a -c /dev/block/platform/bootdevice/by-name -b --partition boot_a -o boot_slot_a_image -d /sdcard/backup -c /dev/block/platform/bootdevice/by-name
pmt flash /sdcard/twrp/boot.img boot_a -c /dev/block/platform/bootdevice/by-name --flash /sdcard/twrp/boot.img -p boot_a -c /dev/block/platform/bootdevice/by-name
pmt format ext4 system_a --logical -c /dev/block/platform/bootdevice/by-name --list
pmt -c /dev/block/platform/bootdevice/by-name --list
Report bugs to <t.me/YZBruh> Report bugs to <t.me/YZBruh>
``` ```
@@ -34,8 +39,9 @@ Report bugs to <t.me/YZBruh>
- Feel free to ask any questions you want. - Feel free to ask any questions you want.
- Packages are available in publications. - Packages are available in publications.
- İt is mandatory to use the `-b` | `--backup` or `-f` | `--flash` and `-p` | `--partition` argument. After all, a partition name and progress type is required to be progress.
- If the logical partition flag is not used, a classic partition is tried to be processing by default. - 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.1.0-en/CHANGELOG.md) - [Click to see special version changes](https://github.com/YZBruh/pbt/blob/2.0.0-en/CHANGELOG.md)
- Let me know your suggestions! - Let me know your suggestions!
### How is it built? ### How is it built?
@@ -43,7 +49,7 @@ Android NDK is required to build.
- [Download](https://developer.android.com/ndk/downloads) and extract the NDK package. - [Download](https://developer.android.com/ndk/downloads) and extract the NDK package.
- Clone this repository. And get access to it. - Clone this repository. And get access to it.
``` ```
git clone https://github.com/YZBruh/pbt -b 2.1.0 ./pmt git clone https://github.com/YZBruh/pbt -b 2.0.0 ./pmt
cd pmt cd pmt
``` ```
- Set the NDK working directory variable. - Set the NDK working directory variable.
@@ -58,40 +64,25 @@ export NDK_PROJECT_PATH=$(pwd)
``` ```
pmt/ pmt/
| |
________________|________________ libs/
| | | | |
jni/ debutils/ obj/ libs/ __________|__________
| | |
__________|__________ arm64-v8a/ armeabi-v7a/
| | | |
arm64-v8a/ armeabi-v7a/ pmt pmt
| |
pmt pmt
``` ```
- For the make installable debian package make-deb.sh use the script. It can be created within two architectures. Use the script flags correctly: arm64-v8a, armeabi-v7a. If you want to process with root, add sudo as the second argument. If you don't want, use no-sudo or leave it blank - For the make installable debian package make-deb.sh use the script. It can be created within two architectures. Use the script flags correctly: arm64-v8a, armeabi-v7a
```
--Usage--
./make-deb.sh [arm64-v8a, armeabi-v7a] [sudo, no-sudo, <blank>]
```
``` ```
chmod 777 make-deb.sh chmod 777 make-deb.sh
# for making 64-bit package # for making 64-bit package
./make-deb.sh arm64-v8a ./make-deb.sh arm64-v8a
# for making 32-bit package # for making 32-bit package
./make-deb.sh 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 ### Notes
If you want to change something, take a look at the configuration. You can change him. If you want to change something, take a look at the configuration. You can change him.
it is located in the `jni/config` folder. His name is `env.mk`. I gave the information in the file. You can ask more. it is located in the `jni/config` folder. His name is `env.mk`. I gave the information in the file. You can ask more.

View File

@@ -1,6 +1,6 @@
Source: pmt Source: pmt
Package: pmt Package: pmt
Version: 2.1.0 Version: 2.0.0
Architecture: arm Architecture: arm
Description: pmt is for reading, writing and formatting partitions of android devices Description: pmt is for reading, writing and formatting partitions of android devices
Section: misc Section: misc

View File

@@ -1,6 +1,6 @@
Source: pmt Source: pmt
Package: pmt Package: pmt
Version: 2.1.0 Version: 2.0.0
Architecture: aarch64 Architecture: aarch64
Description: pmt is for reading, writing and formatting partitions of android devices Description: pmt is for reading, writing and formatting partitions of android devices
Section: misc Section: misc

24
debutils/mandoc/pmt.1 Executable file
View File

@@ -0,0 +1,24 @@
PMT Android Partition Manager 1.8.0
OPTIONS:
-b | --backup backup mode
-F | --flash flash mode
-r | --format format mode (only ext2/3/4 file systems)
-p | --partition name of the partition to be backed up
-l | --logical know that the partition that will be backed up is logical
-o | --out (only backups) the output name of the backed-up partition (default: partition name)
-d | --outdir (only backups) directory where the backup partition will be saved (default: /storage/emulated/0)
-c | --context it is meant to specify a custom /dev context. Only classic partitions (default: /dev/block/by-name)
-D | --list list partitions
-f | --force force mode. Output is not produced. Even if it's a mistake. But if the target is not a mode, the error is given. If you want to work stable, it is important to specify this option first.
-v | --version see version
--help see help message
-L | --license see license
EXAMPLES:
-b --partition boot_a -o boot_slot_a_image -d /sdcard/backup -c /dev/block/platform/bootdevice/by-name
--flash /sdcard/twrp/boot.img -p boot_a -c /dev/block/platform/bootdevice/by-name
-c /dev/block/platform/bootdevice/by-name --list
BUGS:
Report bugs to <yagizzengin73@gmail.com>

Binary file not shown.

View File

@@ -1,62 +0,0 @@
#!/data/data/com.termux/files/usr/bin/env bash
#
# By YZBruh
#
VERSION="2.1.0"
CUR_DIR="$(pwd)"
TMP_DIR="${CUR_DIR}/tempinstall"
TERMUX_BIN_PREFIX="/data/data/com.termux/files/usr/bin"
UNAME="$(uname -m)"
abort()
{
rm -rf "${TMP_DIR}"
exit 1
}
echo " ------------ pmt installer ------------"
if [[ "${UNAME}" == "aarch64" ]] || [[ "${UNAME}" == "armv8a" ]]; then
ARCH="aarch64"
elif [[ "${UNAME}" == "aarch32" ]] || [[ "${UNAME}" == "armv7a" ]]; then
ARCH="armv7a"
SUB_PREF="eabi"
else
echo " - Unsupported arch: ${UNAME}!"
abort
fi
REL_LINK="https://github.com/YZBruh/pbt/releases/download/${VERSION}/pmt-${ARCH}-linux-android${SUB_PREF}.xz"
if [ -f "${TERMUX_BIN_PREFIX}/pmt" ]; then
echo " - pmt already installed."
exit
fi
if [ ! -f "${TERMUX_BIN_PREFIX}/wget" ]; then
echo " - Installing wget..."
pkg update || abort
pkg install wget || abort
fi
echo " - Downloading latest version of package..."
mkdir -p "${TMP_DIR}" || abort
wget -q -P "${TMP_DIR}" "${REL_LINK}" || abort
echo " - Extracting downloaded package..."
cd "${TMP_DIR}" || abort
xz -d *.xz || abort
cd "${CUR_DIR}" || abort
echo " - Installing..."
cp "${TMP_DIR}/pmt-${ARCH}-linux-android${SUB_PREF}" "${TERMUX_BIN_PREFIX}/pmt" || abort
chmod 777 "${TERMUX_BIN_PREFIX}/pmt" || abort
rm -rf "${TMP_DIR}" || abort
echo -e " - Success.\n"
# end of script

View File

@@ -26,8 +26,7 @@ LOCAL_SRC_FILES = \
pmt.c \ pmt.c \
versioner.c \ versioner.c \
tools.c \ tools.c \
partition_tool.c \ checkers.c \
root.c \
listpart.c \ listpart.c \
docs.c docs.c
@@ -46,4 +45,4 @@ endif
include $(BUILD_EXECUTABLE) include $(BUILD_EXECUTABLE)
# end # end

View File

@@ -20,34 +20,32 @@
extern "C" { extern "C" {
#endif #endif
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <errno.h>
#include <pmt.h> #include <pmt.h>
extern bool pmt_use_cust_cxt; extern bool pmt_use_cust_cxt;
extern bool pmt_ab; extern bool pmt_ab;
extern bool pmt_logical; extern bool pmt_logical;
extern char* cust_cxt; extern bool pmt_force_mode;
extern char *cust_cxt;
static int
search(const char* _Nonnull target) { return access(target, F_OK); }
/* check parts */ /* check parts */
void check_dev_point() void check_psf()
{ {
/* true = ab | false = a */ /* true = ab | false = a */
if (pmt_use_cust_cxt) if (pmt_use_cust_cxt)
{ {
static char cust_cxt_ck_path[150]; static char cust_cxt_ck_path[150];
sprintf(cust_cxt_ck_path, "%s/boot_a", cust_cxt); sprintf(cust_cxt_ck_path, "%s/boot_a", cust_cxt);
if (search(cust_cxt_ck_path) != 0) pmt_ab = false; if (access(cust_cxt_ck_path, F_OK) != 0) pmt_ab = false;
else pmt_ab = true; else pmt_ab = true;
} } else {
else if (access("/dev/block/by-name/boot_a", F_OK) != 0) pmt_ab = false;
{
if (search("/dev/block/by-name/boot_a") != 0) pmt_ab = false;
else pmt_ab = true; else pmt_ab = true;
} }
@@ -56,13 +54,25 @@ void check_dev_point()
{ {
static char cust_cxt_ckl_path[150]; static char cust_cxt_ckl_path[150];
sprintf(cust_cxt_ckl_path, "%s/super", cust_cxt); sprintf(cust_cxt_ckl_path, "%s/super", cust_cxt);
if (search(cust_cxt_ckl_path) != 0) pmt_logical = false; if (access(cust_cxt_ckl_path, F_OK) != 0) pmt_logical = false;
else pmt_logical = true;
} else {
if (access("/dev/block/by-name/super", F_OK) != 0) pmt_logical = false;
else pmt_logical = true; else pmt_logical = true;
} }
else }
/* root checker function */
void check_root()
{
/* a quick, easy method to verify root :D */
if (getuid() != 0)
{ {
if (search("/dev/block/by-name/super") != 0) pmt_logical = false; if (!pmt_force_mode)
else pmt_logical = true; {
fprintf(stderr, ANSI_RED "Root privileges could not be detected! Please run this binary with root. Error reason: %s\n" ANSI_RESET, strerror(errno));
exit(27);
} else exit(27);
} }
} }
@@ -70,4 +80,4 @@ void check_dev_point()
} }
#endif /* __cplusplus */ #endif /* __cplusplus */
/* end */ /* end of code */

View File

@@ -23,9 +23,7 @@ extern "C" {
#include <stdio.h> #include <stdio.h>
#include <pmt-docs.h> #include <pmt-docs.h>
extern char* bin_name; void licenses()
void licenses(void)
{ {
printf("Copyright 2024 Partition Manager\n"); printf("Copyright 2024 Partition Manager\n");
printf("Licensed under the Apache License, Version 2.0 (the \"License\");\n"); printf("Licensed under the Apache License, Version 2.0 (the \"License\");\n");
@@ -38,26 +36,26 @@ void licenses(void)
printf("See the License for the specific language governing permissions and limitations under the License.\n"); printf("See the License for the specific language governing permissions and limitations under the License.\n");
} }
void help(void) void help()
{ {
printf("Usage: \n"); printf("Usage: \n");
printf(" %s backup PARTITION [OUTPUT] [OPTIONS]...\n", bin_name); printf(" -b | --backup backup mode\n");
printf(" %s flash FILE PARTITION [OPTIONS]...\n", bin_name); printf(" -F | --flash flash mode\n");
printf(" %s format FILE_SYSTEM[ext/2/3/4] PARTITION [OPTIONS]...\n\n", bin_name); printf(" -r | --format format mode (only ext2/3/4 file systems)\n");
printf("Options: \n"); printf(" -p | --partition name of the partition to be backed up\n");
printf(" -l | --logical it is meant to determine whether the target partition is logical\n"); printf(" -l | --logical know that the partition that will be backed up is logical\n");
printf(" -o | --out (only backups) the output name of the backed-up partition (default: partition name)\n");
printf(" -d | --outdir (only backups) directory where the backup partition will be saved (default: /storage/emulated/0)\n");
printf(" -c | --context it is meant to specify a custom /dev context. Only classic partitions (default: /dev/block/by-name)\n"); printf(" -c | --context it is meant to specify a custom /dev context. Only classic partitions (default: /dev/block/by-name)\n");
printf(" -p | --list list partitions\n"); printf(" -D | --list list partitions\n");
printf(" -s | --silent information and warning messages are silenced in normal work.\n"); printf(" -f | --force force mode. Output is not produced. Even if it's a mistake. But if the target is not a mode, the error is given. If you want to work stable, it is important to specify this option first.\n");
printf(" -f | --force force mode. Error messages are silenced and some things are ignored.\n");
printf(" -v | --version see version\n"); printf(" -v | --version see version\n");
printf(" --help see help message\n"); printf(" --help see help message\n");
printf(" -L | --license see license\n\n"); printf(" -L | --license see license\n\n");
printf("Examples:\n"); printf("Examples:\n");
printf(" %s backup boot_a -c /dev/block/platform/bootdevice/by-name\n", bin_name); printf(" -b --partition boot_a -o boot_slot_a_image -d /sdcard/backup -c /dev/block/platform/bootdevice/by-name\n");
printf(" %s flash /sdcard/twrp/boot.img boot_a -c /dev/block/platform/bootdevice/by-name\n", bin_name); printf(" --flash /sdcard/twrp/boot.img -p boot_a -c /dev/block/platform/bootdevice/by-name\n");
printf(" %s format ext4 system_a --logical\n", bin_name); printf(" -c /dev/block/platform/bootdevice/by-name --list\n\n");
printf(" %s -c /dev/block/platform/bootdevice/by-name --list\n\n", bin_name);
printf("Report bugs to <t.me/YZBruh>\n"); printf("Report bugs to <t.me/YZBruh>\n");
} }

View File

@@ -16,11 +16,15 @@
* limitations under the License. * limitations under the License.
*/ */
__BEGIN_DECLS #if defined(__cplusplus)
extern "C" {
#endif /* __cplusplus */
void help(void); void help();
void licenses(void); void licenses();
__END_DECLS #if defined(__cplusplus)
}
#endif /* __cplusplus */
/* end */ /* end */

View File

@@ -16,13 +16,17 @@
* limitations under the License. * limitations under the License.
*/ */
__BEGIN_DECLS #if defined(__cplusplus)
extern "C" {
#endif /* __cplusplus */
/* versioning */ /* versioning */
#define PMT_MAJOR 2 #define PMT_MAJOR 2
#define PMT_MINOR 1 #define PMT_LEVEL 0
#define PMT_PATCHLEVEL 0 #define PMT_PATCH 0
__END_DECLS #if defined(__cplusplus)
}
#endif /* __cplusplus */
/* end */ /* end */

View File

@@ -16,7 +16,9 @@
* limitations under the License. * limitations under the License.
*/ */
__BEGIN_DECLS #if defined(__cplusplus)
extern "C" {
#endif
#if !defined(__PMT_H_) #if !defined(__PMT_H_)
#define __PMT_H_ #define __PMT_H_
@@ -30,32 +32,33 @@ __BEGIN_DECLS
#define PMT_PACKAGE_NAME "Partition Manager" #define PMT_PACKAGE_NAME "Partition Manager"
/* variable definations */ /* variable definations */
extern char* out; extern char *out;
extern char* cust_cxt; extern char *outdir;
extern char* target_partition; extern char *cust_cxt;
extern char* target_flash_file; extern char *target_partition;
extern char* format_fs; extern char *target_flash_file;
extern char* partition_type; extern char *format_fs;
extern char* bin_name; extern char *partition_type;
extern bool pmt_use_logical; extern bool pmt_use_logical;
extern bool pmt_use_cust_cxt; extern bool pmt_use_cust_cxt;
extern bool pmt_ab; extern bool pmt_ab;
extern bool pmt_logical; extern bool pmt_logical;
extern bool pmt_silent;
extern bool pmt_flash; extern bool pmt_flash;
extern bool pmt_backup; extern bool pmt_backup;
extern bool pmt_format; extern bool pmt_format;
extern bool pmt_force_mode; extern bool pmt_force_mode;
/* function definations */ /* function definations */
int listpart(void); void listpart();
void check_dev_point(void); void check_psf();
void check_root(void); void check_root();
int pmt(unsigned short progress_code); void pmt(unsigned short progress_code);
void version(void); void version();
#endif /* __PMT_H_ */ #endif /* __PMT_H_ */
__END_DECLS #if defined(__cplusplus)
}
#endif /* __cplusplus */
/* end of code */ /* end of code */

View File

@@ -25,8 +25,6 @@ extern "C" {
#include <unistd.h> #include <unistd.h>
#include <stdbool.h> #include <stdbool.h>
#include <errno.h> #include <errno.h>
#include <err.h>
#include <sysexits.h>
#include <dirent.h> #include <dirent.h>
#include <string.h> #include <string.h>
#include <pmt.h> #include <pmt.h>
@@ -34,13 +32,11 @@ extern "C" {
extern bool pmt_use_cust_cxt; extern bool pmt_use_cust_cxt;
extern bool pmt_ab; extern bool pmt_ab;
extern bool pmt_logical; extern bool pmt_logical;
extern bool pmt_silent;
extern bool pmt_force_mode; extern bool pmt_force_mode;
extern char* cust_cxt; extern char *cust_cxt;
extern char* bin_name;
/* list existing partitions */ /* list existing partitions */
int listpart(void) { void listpart() {
DIR *dir; DIR *dir;
struct dirent *entry; struct dirent *entry;
@@ -49,47 +45,42 @@ int listpart(void) {
dir = opendir(cust_cxt); dir = opendir(cust_cxt);
if (dir == NULL) if (dir == NULL)
{ {
if (!pmt_force_mode) errx(EX_OSFILE, "could not open: `%s': %s", cust_cxt, strerror(errno)); if (!pmt_force_mode) {
else return EX_OSFILE; fprintf(stderr, "Could not open: `%s`. Error reason: %s\n", cust_cxt, strerror(errno));
exit(62);
} else exit(62);
} }
} } else {
else
{
dir = opendir("/dev/block/by-name"); dir = opendir("/dev/block/by-name");
if (dir == NULL) if (dir == NULL)
{ {
if (!pmt_force_mode) errx(EX_OSFILE, "could not open: `/dev/block/by-name': %s", strerror(errno)); if (!pmt_force_mode)
else return EX_OSFILE; {
fprintf(stderr, "Could not open: `/dev/block/by-name`. Error reason: %s\n", strerror(errno));
exit(63);
} else exit(63);
} }
} }
while ((entry = readdir(dir)) != NULL) printf("%s\n", entry->d_name); while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir); closedir(dir);
dir = NULL;
if (pmt_logical) if (pmt_logical)
{ {
dir = opendir("/dev/block/mapper"); printf("List of logical partitions (/dev/block/mapper): \n");
if (system("ls /dev/block/mapper") != 0 && !pmt_force_mode)
if (dir == NULL)
{ {
if (!pmt_silent) errx(EX_OSFILE, "could not open: `/dev/block/mapper': %s", strerror(errno)); fprintf(stderr, "%sAn error occurred when the logical partition list appears!%s\n", ANSI_RED, ANSI_RESET);
else return EX_OSFILE; exit(64);
} }
else printf("List of logical partitions (`/dev/block/mapper'):\n");
} }
while ((entry = readdir(dir)) != NULL) printf("%s\n", entry->d_name); if (pmt_ab && !pmt_force_mode) printf("%sWarning: device using A/B partition style.%s\n", ANSI_YELLOW, ANSI_RESET);
closedir(dir); if (pmt_logical && !pmt_force_mode) printf("%sWarning: device using logical partition type.%s\n", ANSI_YELLOW, ANSI_RESET);
dir = NULL;
if (pmt_ab && !pmt_silent) warnx(ANSI_YELLOW "warning: device using A/B partition style." ANSI_RESET);
if (pmt_logical && !pmt_silent) warnx(ANSI_YELLOW "warning: device using logical partition type." ANSI_RESET);
return EX_OK;
} }
#if defined(__cplusplus) #if defined(__cplusplus)

427
jni/pmt.c
View File

@@ -30,99 +30,47 @@ extern "C" {
#include <stdbool.h> #include <stdbool.h>
#include <getopt.h> #include <getopt.h>
#include <errno.h> #include <errno.h>
#include <err.h>
#include <sysexits.h>
#include <pmt.h> #include <pmt.h>
#include <pmt-docs.h> #include <pmt-docs.h>
/* add value to variables that are added globally and are not worth */ /* add value to variables that are added globally and are not worth */
char* out = NULL; char *out = NULL;
char* cust_cxt = NULL; char *outdir = NULL;
char* target_partition = NULL; char *cust_cxt = NULL;
char* target_flash_file = NULL; char *target_partition = NULL;
char* partition_type = NULL; char *target_flash_file = NULL;
char* format_fs = NULL; char *partition_type = NULL;
char* bin_name = NULL; char *format_fs = NULL;
bool pmt_use_logical = NULL; bool pmt_use_logical = NULL;
bool pmt_use_cust_cxt = NULL; bool pmt_use_cust_cxt = NULL;
bool pmt_ab = false; bool pmt_ab = false;
bool pmt_logical = false; bool pmt_logical = false;
bool pmt_silent = false;
bool pmt_flash = false; bool pmt_flash = false;
bool pmt_backup = false; bool pmt_backup = false;
bool pmt_format = false; bool pmt_format = false;
bool pmt_force_mode = false; bool pmt_force_mode = false;
/* variables for use in control of '-' expression */
static const char* opt_symbol = "-";
static const char* common_symbol_rule = "When entering the attached argument of an option, an argument of another option type cannot be used. In short, the rule is: there can be no '-' at the beginning of the attached argument.";
/**
* He controls whether the '-' sign at
* the beginning of the given word
*/
static void
check_optsym(const char* _Nonnull mystring)
{
if (strncmp(mystring, opt_symbol, 1) == 0)
{
if (!pmt_force_mode) errx(EX_USAGE, "%s", common_symbol_rule);
else exit(EX_USAGE);
}
}
/**
* 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.
*/
static int
search_stat(const char* _Nonnull filepath, const char* _Nonnull stype)
{
struct stat search_stat;
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;
}
else if (strcmp(stype, "file") == 0)
{
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;
}
else if (strcmp(stype, "link") == 0)
{
if (S_ISLNK(search_stat.st_mode)) return 0;
else return -1;
}
return 0;
}
/* classic main function (C binary here xd) */ /* classic main function (C binary here xd) */
int main(int argc, char* argv[]) int main(int argc, char *argv[])
{ {
/* check argument total */ /* check argument total */
if (argc < 2) errx(EX_USAGE, "missing operand\nTry `%s --help' for more information.", argv[0]); if (argc < 2)
{
fprintf(stderr, "%s: missing operand\nTry `%s --help' for more information.\n", argv[0], argv[0]);
exit(44);
}
bin_name = argv[0]; /* a structure for long arguments... */
/* a structure for long arguments */
struct option long_options[] = { struct option long_options[] = {
{"backup", no_argument, 0, 'b'},
{"flash", required_argument, 0, 'F'},
{"format", required_argument, 0, 'r'},
{"partition", required_argument, 0, 'p'},
{"logical", no_argument, 0, 'l'}, {"logical", no_argument, 0, 'l'},
{"out", required_argument, 0, 'o'},
{"outdir", required_argument, 0, 'd'},
{"context", required_argument, 0, 'c'}, {"context", required_argument, 0, 'c'},
{"list", no_argument, 0, 'p'}, {"list", no_argument, 0, 'D'},
{"silent", no_argument, 0, 's'},
{"force", no_argument, 0, 'f'}, {"force", no_argument, 0, 'f'},
{"version", no_argument, 0, 'v'}, {"version", no_argument, 0, 'v'},
{"help", no_argument, 0, 0}, {"help", no_argument, 0, 0},
@@ -136,38 +84,108 @@ int main(int argc, char* argv[])
static bool wiew_version = false; static bool wiew_version = false;
static bool list_partitions = false; static bool list_partitions = false;
static bool combo_wiewers = false; static bool combo_wiewers = false;
static int search_result = 3; static bool use_cust_outdir = false;
static int opt; static char *opt_symbol = "-";
static char *common_symbol_rule;
common_symbol_rule = "When entering the attached argument of an option, an argument of another option type cannot be used. In short, the rule is: there can be no '-' at the beginning of the attached argument.";
int opt;
/* control for each argument */ /* control for each argument */
while ((opt = getopt_long(argc, argv, "lc:psfvL", long_options, NULL)) != -1) while ((opt = getopt_long(argc, argv, "bF:rp:lo:d:c:DfvL", long_options, NULL)) != -1)
{ {
/* process arguments */ /* process arguments */
switch (opt) switch (opt)
{ {
/* backup mode */
case 'b':
pmt_backup = true;
break;
/* flash mode */
case 'F':
target_flash_file = strdup(optarg);
if (strncmp(target_flash_file, opt_symbol, 1) == 0)
{
if (!pmt_force_mode)
{
fprintf(stderr, "%s%s%s\n", ANSI_RED, common_symbol_rule, ANSI_RESET);
exit(19);
} else exit(19);
}
pmt_flash = true;
break;
/* format mode */
case 'r':
format_fs = strdup(optarg);
if (strncmp(format_fs, opt_symbol, 1) == 0)
{
if (!pmt_force_mode)
{
fprintf(stderr, "%s%s%s\n", ANSI_RED, common_symbol_rule, ANSI_RESET);
exit(19);
} else exit(19);
}
pmt_format = true;
break;
/* partition selector option */
case 'p':
target_partition = strdup(optarg);
if (strncmp(target_partition, opt_symbol, 1) == 0)
{
if (!pmt_force_mode)
{
fprintf(stderr, "%s%s%s\n", ANSI_RED, common_symbol_rule, ANSI_RESET);
exit(19);
} else exit(19);
}
break;
/* logical partitions option */ /* logical partitions option */
case 'l': case 'l':
check_root(); check_root();
check_dev_point(); check_psf();
if (pmt_logical) pmt_use_logical = true; if (pmt_logical)
else
{ {
if (!pmt_force_mode) errx(EX_USAGE, "this device does not have logical partitions!"); pmt_use_logical = true;
else return EX_USAGE; } else {
if (!pmt_force_mode)
{
fprintf(stderr, "This device does not have logical partitions!\n");
exit(17);
} else exit(17);
} }
break; break;
/* output file option */
case 'o':
out = strdup(optarg);
if (strncmp(out, opt_symbol, 1) == 0)
{
if (!pmt_force_mode)
{
fprintf(stderr, "%s%s%s\n", ANSI_RED, common_symbol_rule, ANSI_RESET);
exit(19);
} else exit(19);
}
break;
/* output dir option */
case 'd':
use_cust_outdir = true;
outdir = strdup(optarg);
break;
/* context selector option */ /* context selector option */
case 'c': case 'c':
pmt_use_cust_cxt = true; pmt_use_cust_cxt = true;
cust_cxt = strdup(optarg); cust_cxt = strdup(optarg);
if (strncmp(cust_cxt, opt_symbol, 1) == 0) if (strncmp(cust_cxt, opt_symbol, 1) == 0)
{ {
if (!pmt_force_mode) errx(EX_USAGE, "%s", common_symbol_rule); if (!pmt_force_mode)
else return EX_USAGE; {
fprintf(stderr, "%s%s%s\n", ANSI_RED, common_symbol_rule, ANSI_RESET);
exit(19);
} else exit(19);
} }
break; break;
/* partition lister function */ /* partition lister function */
case 'p': case 'D':
list_partitions = true; list_partitions = true;
/* check combo wiewer options and progress */ /* check combo wiewer options and progress */
if (wiew_version || wiew_help || wiew_licenses) combo_wiewers = true; if (wiew_version || wiew_help || wiew_licenses) combo_wiewers = true;
@@ -176,10 +194,6 @@ int main(int argc, char* argv[])
case 'f': case 'f':
pmt_force_mode = true; pmt_force_mode = true;
break; break;
/* silent mode option */
case 's':
pmt_silent = true;
break;
/* version info option */ /* version info option */
case 'v': case 'v':
wiew_version = true; wiew_version = true;
@@ -201,182 +215,185 @@ int main(int argc, char* argv[])
/* for invalid options */ /* for invalid options */
case '?': case '?':
printf("Try `%s --help' for more information.\n", argv[0]); printf("Try `%s --help' for more information.\n", argv[0]);
return EX_USAGE; exit(43);
break; break;
default: default:
printf("Usage: %s [backup] flash] [format] [-l | --logical] [-c | --context] [-D | --list] [-v | --version] [--help] [-L | --license]\n", argv[0]); printf("Usage: %s [-b | --backup] [-f | --flash FILE] [-r | --format FS_TYPE] [-p | --partition PARTITION] [-l | --logical] [-o | --out OUTNAME] [-d | --outdir OUTDIR] [-c | --context] [-D | --list] [-v | --version] [--help] [-L | --license]\n", argv[0]);
return EX_USAGE; exit(44);
} }
} }
/* stop the program if multiple viewer is used */ /* stop the program if multiple viewer is used */
if (combo_wiewers) errx(EX_USAGE, "multiple wiewers cannot be used at the same line."); if (combo_wiewers)
{
fprintf(stderr, "%s: Multiple wiewers cannot be used at the same line.\n", argv[0]);
exit(81);
}
/* controller to handle viewer */ /* controller to handle viewer */
if (wiew_help) if (wiew_help)
{ {
help(); help();
return EX_OK; exit(EXIT_SUCCESS);
} } else if (wiew_version)
else if (wiew_version)
{ {
version(); version();
return EX_OK; exit(EXIT_SUCCESS);
} } else if (wiew_licenses)
else if (wiew_licenses)
{ {
licenses(); licenses();
return EX_OK; exit(EXIT_SUCCESS);
} } else if (list_partitions)
else if (list_partitions)
{ {
check_root(); check_root();
return listpart(); listpart();
} exit(EXIT_SUCCESS);
/* detect target mode */
static char arg1[20];
sprintf(arg1, "%s", argv[1]);
if (strcmp(arg1, "backup") == 0)
{
if (argc == 2)
{
if (!pmt_force_mode) errx(EX_USAGE, "expected backup argument 2, retrieved 0.");
else return EX_USAGE;
}
target_partition = argv[2];
if (argc != 4) out = target_partition;
else out = argv[3];
check_optsym(target_partition);
check_optsym(out);
pmt_backup = true;
}
else if (strcmp(arg1, "flash") == 0)
{
if (argc == 2)
{
if (!pmt_force_mode) errx(EX_USAGE, "expected flash argument 2, retrieved 0.");
else return EX_USAGE;
}
if (argc == 3)
{
if (!pmt_force_mode) errx(EX_USAGE, "expected flash argument 2, retrieved 0.");
else return EX_USAGE;
}
target_flash_file = argv[2];
target_partition = argv[3];
check_optsym(target_flash_file);
check_optsym(target_partition);
pmt_flash = true;
}
else if (strcmp(arg1, "format") == 0)
{
if (argc == 2)
{
if (!pmt_force_mode) errx(EX_USAGE, "expected format argument 2, retrieved 0.");
else return EX_USAGE;
}
if (argc == 3)
{
if (!pmt_force_mode) errx(EX_USAGE, "expected format argument 2, retrieved 1.");
else return EX_USAGE;
}
format_fs = argv[2];
target_partition = argv[3];
check_optsym(format_fs);
check_optsym(target_partition);
pmt_format = true;
} }
/* target control is done */ /* target control is done */
if (!pmt_backup && !pmt_flash && !pmt_format && !pmt_silent) errx(EX_USAGE, "missing operand.\nTry `%s --help` for more information.", argv[0]); if (!pmt_backup && !pmt_flash && !pmt_format)
else return EX_USAGE; {
fprintf(stderr, "%s: missing operand.\nTry `%s --help` for more information.\n", argv[0], argv[0]);
exit(3);
}
/* prevent multiple mode use */ /* prevent multiple mode use */
if (pmt_backup && pmt_flash && pmt_format) if (pmt_backup && pmt_flash)
{ {
if (!pmt_force_mode) errx(EX_USAGE, "multi functions cannot be used in the same command."); if (!pmt_force_mode)
else return EX_USAGE; {
fprintf(stderr, "Backup and flash functions cannot be used in the same command.\n");
exit(9);
} else exit(9);
} }
/* checks */ /* checks */
check_root(); check_root();
check_dev_point(); check_psf();
if (pmt_format) if (pmt_format)
{ {
if (strcmp(format_fs, "ext4") != 0 || strcmp(format_fs, "ext3") != 0 || strcmp(format_fs, "ext2") != 0) if (strcmp(format_fs, "ext4") != 0 || strcmp(format_fs, "ext3") != 0 || strcmp(format_fs, "ext2") != 0)
{ {
if (!pmt_force_mode) errx(EX_USAGE, "formatter: unsupported filesystem: %s", format_fs); if (!pmt_force_mode)
else return EX_USAGE; {
fprintf(stderr, "%s: formatter: unsupported filesystem: %s", argv[0], format_fs);
exit(41);
} else exit(41);
}
}
if (use_cust_outdir)
{
if (strncmp(outdir, opt_symbol, 1) == 0)
{
if (!pmt_force_mode)
{
fprintf(stderr, "%s\n", common_symbol_rule);
exit(19);
} else exit(19);
}
struct stat out_info;
if (stat(outdir, &out_info) != 0)
{
if (!pmt_force_mode)
{
fprintf(stderr, "%s: cannot stat '%s': %s\n", argv[0], outdir, strerror(errno));
exit(18);
} else exit(18);
} else {
if (!S_ISDIR(out_info.st_mode))
{
if (!pmt_force_mode)
{
fprintf(stderr, "%s: %s: is a not directory.\n", argv[0], outdir);
exit(20);
} else exit(20);
}
} }
} }
if (pmt_flash) if (pmt_flash)
{ {
search_result = search_stat(target_flash_file, "file"); struct stat flashf_info;
if (stat(target_flash_file, &flashf_info) != 0)
if (search_result == 1)
{ {
if (!pmt_silent) errx(EX_UNAVAILABLE, "cannot stat `%s': %s", target_flash_file, strerror(errno)); if (!pmt_force_mode)
else return EX_UNAVAILABLE; {
} fprintf(stderr, "%s: cannot stat '%s': %s\n", argv[0], target_flash_file, strerror(errno));
else if (search_result == -1) exit(15);
{ } else exit(15);
if (!pmt_silent) errx(EX_USAGE, "`%s': is a not file.", target_flash_file); } else {
else return EX_USAGE; if (!S_ISREG(flashf_info.st_mode))
{
if (!pmt_force_mode)
{
fprintf(stderr, "%s: %s: is a not file.\n", argv[0], target_flash_file);
exit(16);
} else exit(16);
}
} }
} }
/* custom context checker */ /* custom context checker */
if (pmt_use_cust_cxt) if (pmt_use_cust_cxt)
{ {
search_result = search_stat(cust_cxt, "dir"); struct stat cxtinfo;
if (stat(cust_cxt, &cxtinfo) == 0)
if (search_result == 1)
{ {
if (!pmt_silent) errx(EX_UNAVAILABLE, "cannot stat `%s': %s", cust_cxt, strerror(errno)); if (!S_ISREG(cxtinfo.st_mode))
else return EX_UNAVAILABLE; {
if (!pmt_force_mode)
{
fprintf(stderr, "%s: %s: is a not directory.\n", argv[0], cust_cxt);
exit(8);
} else exit(8);
}
} else {
if (!pmt_force_mode)
{
fprintf(stderr, "%s: %s: %s\n", argv[0], cust_cxt, strerror(errno));
exit(6);
} else exit(6);
} }
else if (search_result == -1) if (strstr(cust_cxt, "/dev") == NULL && !pmt_force_mode)
{ {
if (!pmt_silent) errx(EX_USAGE, "`%s': is a not directory.", cust_cxt); fprintf(stderr, "%sYou're going through my wave? There's nothing about this /dev. Use force mode if you don't want this error%s\n", ANSI_YELLOW, ANSI_RESET);
else return EX_USAGE; exit(81);
} }
if (strstr(cust_cxt, "/dev") == NULL && !pmt_force_mode) errx(EX_USAGE, ANSI_YELLOW "you're going through my wave? There's nothing about this /dev. Use force mode if you don't want this error." ANSI_RESET);
} }
if (target_partition == NULL) if (target_partition == NULL)
{ {
if (!pmt_force_mode) if (!pmt_force_mode)
{ {
if (!pmt_silent) errx(EX_USAGE, "required partition name.\nTry `%s --help' for more information.\n", argv[0]); fprintf(stderr, "%s: required partition name.\nTry `%s --help' for more information.\n", argv[0], argv[0]);
} exit(5);
else return EX_USAGE; } else exit(5);
} } else {
else
{
/** /**
*
* 1 = backup mode * 1 = backup mode
* *
* 2 = flash mode * 2 = flash mode
* *
* 3 = format * 3 = format
*/ */
if (pmt_backup) return pmt(1); if (pmt_backup)
else if (pmt_flash) return pmt(2); {
else if (pmt_format) return pmt(3); pmt(1);
else if (!pmt_silent) errx(EX_USAGE, "no target (backup or flash).\nTry `%s --help` for more information.\n", argv[0]); exit(EXIT_SUCCESS);
} else if (pmt_flash)
{
pmt(2);
exit(EXIT_SUCCESS);
} else if (pmt_format)
{
pmt(3);
} else {
fprintf(stderr, "%s: no target (backup or flash).\nTry `%s --help` for more information.\n", argv[0], argv[0]);
exit(3);
}
} }
} }
@@ -384,4 +401,4 @@ int main(int argc, char* argv[])
} }
#endif #endif
/* end of code */ /* end of code */

View File

@@ -1,46 +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
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdbool.h>
#include <err.h>
#include <sysexits.h>
#include <pmt.h>
/* root checker function */
void check_root(void)
{
/* a quick, easy method to verify root */
if (getuid() != 0)
{
if (!pmt_force_mode) errx(EX_NOPERM, "root access could not be detected! Please run this binary with root.");
else exit(EX_NOPERM);
}
}
#if defined(__cplusplus)
}
#endif /* __cplusplus */
/* end of code */

View File

@@ -29,28 +29,27 @@ extern "C" {
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h> #include <stddef.h>
#include <errno.h> #include <errno.h>
#include <err.h>
#include <sysexits.h>
#include <fcntl.h> #include <fcntl.h>
#include <pmt.h> #include <pmt.h>
#define BFSIZE 1024 #define BFSIZE 1024
extern char* out; extern char *out;
extern char* format_fs; extern char *outdir;
extern char* cust_cxt; extern char *format_fs;
extern char* target_partition; extern char *cust_cxt;
extern char* target_flash_file; extern char *target_partition;
extern char* partition_type; extern char *target_flash_file;
extern char *partition_type;
extern bool pmt_use_logical; extern bool pmt_use_logical;
extern bool pmt_use_cust_cxt; extern bool pmt_use_cust_cxt;
extern bool pmt_logical; extern bool pmt_logical;
extern bool pmt_flash; extern bool pmt_flash;
extern bool pmt_backup; extern bool pmt_backup;
extern bool pmt_silent;
extern bool pmt_force_mode; extern bool pmt_force_mode;
/** /**
*
* if progress_code is a * if progress_code is a
* 1 = backup mode * 1 = backup mode
* *
@@ -59,19 +58,14 @@ extern bool pmt_force_mode;
* 3 = format mode * 3 = format mode
*/ */
/**
* it is meant to calculate the size of the quickly given file.
* its purpose is for rapid processing
*/
static double static double
calc_flsz(const char* _Nonnull filepath) calc_flsz(char *filepath)
{ {
static int calc_flsz_file; static int calc_flsz_file;
calc_flsz_file = open(filepath, O_RDONLY); calc_flsz_file = open(filepath, O_RDONLY);
if (calc_flsz_file == -1) return calc_flsz_file; if (calc_flsz_file == -1) return -1;
static off_t flsz; off_t flsz = lseek(calc_flsz_file, 0, SEEK_END);
flsz = lseek(calc_flsz_file, 0, SEEK_END);
close(calc_flsz_file); close(calc_flsz_file);
if (flsz == (off_t)-1) return -1; if (flsz == (off_t)-1) return -1;
@@ -79,85 +73,7 @@ calc_flsz(const char* _Nonnull filepath)
return (double)flsz / (1024 * 1024); return (double)flsz / (1024 * 1024);
} }
/** void pmt(unsigned short progress_code)
* error that the partition is not found.
* It's for quick action.
*/
static int
partition_not_found(void)
{
if (!pmt_silent) errx(EX_OSFILE, "partition not found!");
else return EX_OSFILE;
}
/**
* unknown partition type error.
* It's for quick action.
*/
static int
invalid_partition_type(void)
{
if (!pmt_silent) errx(EX_USAGE, "invalid partition type!");
else exit(EX_USAGE);
return 0;
}
/* to stop use of function type */
#define partition_not_found partition_not_found()
#define invalid_partition_type invalid_partition_type()
/**
* 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.
*/
static int
search_stat(const char* _Nonnull filepath, const char* _Nonnull stype)
{
struct stat search_stat;
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;
}
else if (strcmp(stype, "file") == 0)
{
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;
}
else if (strcmp(stype, "link") == 0)
{
if (S_ISLNK(search_stat.st_mode)) return 0;
else return -1;
}
return 2;
}
/* the partitions are meant to quickly find. */
static void
search_partition(const char* _Nonnull partition)
{
static int partition_results = 0;
partition_results = search_stat(partition, "blk");
if (partition_results == 1) partition_not_found;
else if (partition_results == -1 && !pmt_silent) errx(EX_OSFILE, "the specified partition is not the block. I mean, it's not actually an episode (disc). I'm sure it needs to applaud those mistakes.");
else exit(EX_OSFILE);
}
int pmt(unsigned short progress_code)
{ {
/* required variables */ /* required variables */
static int srcf, targetf; static int srcf, targetf;
@@ -167,8 +83,8 @@ int pmt(unsigned short progress_code)
static char outf[512]; static char outf[512];
static char flasher_path[512]; static char flasher_path[512];
static char buffer[BFSIZE]; static char buffer[BFSIZE];
static ssize_t readed_data; static ssize_t bytesRead;
static unsigned long long copied_data = 0; static unsigned long long bytesCopied = 0;
static unsigned long long count = 1024 * 1024 * 1024; static unsigned long long count = 1024 * 1024 * 1024;
if (progress_code == 1) if (progress_code == 1)
@@ -177,60 +93,85 @@ int pmt(unsigned short progress_code)
{ {
if (pmt_use_cust_cxt) sprintf(backupper_path, "%s/%s", cust_cxt, 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 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 {
if (!pmt_force_mode)
{
fprintf(stderr, "İnvalid partition type!\n");
exit(28);
} else exit(28);
} }
else if (pmt_use_logical) sprintf(backupper_path, "/dev/block/mapper/%s", target_partition);
else return invalid_partition_type;
search_partition(backupper_path); if (access(backupper_path, F_OK) == -1)
{
if (!pmt_force_mode)
{
fprintf(stderr, "Partition not found!\n");
exit(29);
} else exit(29);
}
if (calc_flsz(backupper_path) != -1 && !pmt_silent) printf("Disk size of the partition to be backed up: %.2f\n", calc_flsz(backupper_path)); if (calc_flsz(backupper_path) != -1 && !pmt_force_mode) printf("Disk size of the partition to be backed up: %.2f\n", calc_flsz(backupper_path));
else warnx(ANSI_YELLOW "failed to get target partition disk size" ANSI_RESET); else printf("%sFailed to target partition disk size%s\n", ANSI_YELLOW, ANSI_RESET);
srcf = open(backupper_path, O_RDONLY); srcf = open(backupper_path, O_RDONLY);
if (srcf == -1) if (srcf == -1) {
{ if (!pmt_force_mode)
if (!pmt_silent) errx(EX_OSFILE, "couldn't read: %s: %s", backupper_path, strerror(errno)); {
else return EX_IOERR; fprintf(stderr, "Couldn't read: %s: %s", backupper_path, strerror(errno));
exit(39);
} else exit(39);
} }
/* determine output */ /* determine output */
if (strcmp(out, target_partition) == 0) if (outdir != NULL)
{ {
sprintf(outf, "%s.img", target_partition); if (out != NULL) sprintf(outf, "%s/%s.img", outdir, out);
if (!pmt_silent) warnx(ANSI_YELLOW "warning: The output file name was not specified. The output file name will be: %s" ANSI_RESET, outf); else sprintf(outf, "%s/%s.img", outdir, target_partition);
} else {
if (out != NULL) sprintf(outf, "/storage/emulated/0/%s.img", out);
else sprintf(outf, "/storage/emulated/0/%s.img", target_partition);
} }
else sprintf(outf, "%s", target_partition);
targetf = open(outf, O_WRONLY | O_CREAT | O_TRUNC, 0666); targetf = open(outf, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (targetf == -1) if (targetf == -1) {
{ if (!pmt_force_mode)
if (!pmt_silent) errx(EX_CANTCREAT, "couldn't generate: %s: %s", outf, strerror(errno)); {
else return EX_CANTCREAT; fprintf(stderr, "Couldn't generate: %s: %s", outf, strerror(errno));
exit(37);
} else exit(37);
} }
/* start writing */ /* start writing */
while ((readed_data = read(srcf, buffer, BFSIZE)) > 0 && copied_data < count) while ((bytesRead = read(srcf, buffer, BFSIZE)) > 0 && bytesCopied < count)
{ {
ssize_t writed_data = write(targetf, buffer, readed_data); ssize_t bytesWritten = write(targetf, buffer, bytesRead);
if (writed_data != readed_data) if (bytesWritten != bytesRead)
{ {
if (!pmt_silent) warnx("couldn't write: %s: %s", backupper_path, strerror(errno)); fprintf(stderr, "Couldn't write: %s: %s", backupper_path, strerror(errno));
close(srcf); close(srcf);
close(targetf); close(targetf);
if (search_stat(outf, "file") == 0) remove(outf); exit(81);
return EX_IOERR;
} }
copied_data += writed_data; bytesCopied += bytesWritten;
} }
/* close files */ /* close files */
close(srcf); close(srcf);
close(targetf); close(targetf);
if (!pmt_silent) printf("%sSuccess. Output: %s%s\n", ANSI_GREEN, outf, ANSI_RESET); /* Print the output information by evaluating all situations */
} if (outdir != NULL)
else if (progress_code == 2) {
if (out != NULL) printf("%sSuccess. Output: %s/%s.img%s\n", ANSI_GREEN, outdir, out, ANSI_RESET);
else printf("%sSuccess. Output: %s/%s.img%s\n", ANSI_GREEN, outdir, target_partition, ANSI_RESET);
} else {
if (out != NULL) printf("%sSuccess. Output: /storage/emulated/0/%s.img%s\n", ANSI_GREEN, out, ANSI_RESET);
else printf("%sSuccess. Output: /storage/emulated/0/%s.img%s\n", ANSI_GREEN, target_partition, ANSI_RESET);
}
} else if (progress_code == 2)
{ {
/* determine device block */ /* determine device block */
/* for classic */ /* for classic */
@@ -239,57 +180,67 @@ int pmt(unsigned short progress_code)
if (pmt_use_cust_cxt) sprintf(flasher_path, "%s/%s", cust_cxt, 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); else sprintf(flasher_path, "/dev/block/by-name/%s", target_partition);
/* for logical */ /* for logical */
} else if (pmt_use_logical) sprintf(flasher_path, "/dev/block/mapper/%s", target_partition);
else {
if (!pmt_force_mode)
{
fprintf(stderr, "İnvalid partition type!\n");
exit(30);
} else exit(30);
} }
else if (pmt_use_logical) sprintf(flasher_path, "/dev/block/mapper/%s", target_partition);
else return invalid_partition_type;
/* check partition */ /* check partition */
search_partition(flasher_path); if (access(flasher_path, F_OK) == -1)
{
if (!pmt_force_mode)
{
fprintf(stderr, "Partition not found!\n");
exit(31);
} else exit(31);
}
if (calc_flsz(target_flash_file) != -1 && !pmt_force_mode) printf("Size of flash file: %.2f\n", calc_flsz(target_flash_file)); if (calc_flsz(target_flash_file) != -1 && !pmt_force_mode) printf("Size of flash file: %.2f\n", calc_flsz(target_flash_file));
else warnx(ANSI_YELLOW "failed to get flash file size" ANSI_RESET); else printf("%sFailed to get flash file size%s\n", ANSI_YELLOW, ANSI_RESET);
if (calc_flsz(target_partition) != -1 && !pmt_force_mode) printf("Disk size of the target partition: %.2f\n", calc_flsz(target_partition)); if (calc_flsz(target_partition) != -1 && !pmt_force_mode) printf("Disk size of the target partition: %.2f\n", calc_flsz(target_partition));
else warnx(ANSI_YELLOW "failed to get target partition disk size" ANSI_RESET); else printf("%sFailed to get target partition disk size%s\n", ANSI_YELLOW, ANSI_RESET);
if (calc_flsz(target_flash_file) > calc_flsz(target_partition) && !pmt_silent) errx(EX__BASE, "size of the file to flash more than the partition size.");
else return EX__BASE;
srcf = open(target_flash_file, O_RDONLY); srcf = open(target_flash_file, O_RDONLY);
if (srcf == -1) if (srcf == -1) {
{ if (!pmt_force_mode)
if (!pmt_force_mode) errx(EX_NOINPUT, "couldn't read: %s: %s", target_flash_file, strerror(errno)); {
else return EX_IOERR; fprintf(stderr, "Couldn't read: %s: %s", target_flash_file, strerror(errno));
exit(39);
} else exit(39);
} }
targetf = open(target_partition, O_WRONLY | O_CREAT | O_TRUNC, 0666); targetf = open(target_partition, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (targetf == -1) if (targetf == -1) {
{ if (!pmt_force_mode)
if (!pmt_force_mode) errx(EX_OSFILE, "couldn't read: %s: %s", target_partition, strerror(errno)); {
else return EX_IOERR; fprintf(stderr, "Couldn't read: %s: %s", target_partition, strerror(errno));
exit(37);
} else exit(37);
} }
/* start writing */ /* start writing */
while ((readed_data = read(srcf, buffer, BFSIZE)) > 0 && copied_data < count) while ((bytesRead = read(srcf, buffer, BFSIZE)) > 0 && bytesCopied < count) {
{ ssize_t bytesWritten = write(targetf, buffer, bytesRead);
ssize_t writed_data = write(targetf, buffer, readed_data); if (bytesWritten != bytesRead) {
if (writed_data != readed_data) fprintf(stderr, "Couldn't write: %s: %s", backupper_path, strerror(errno));
{
warnx("couldn't write: %s: %s", backupper_path, strerror(errno));
close(srcf); close(srcf);
close(targetf); close(targetf);
return EX_IOERR; exit(81);
} }
copied_data += writed_data; bytesCopied += bytesWritten;
} }
close(srcf); close(srcf);
close(targetf); close(targetf);
if (!pmt_force_mode) printf("%sSuccess.%s\n", ANSI_GREEN, ANSI_RESET); if (!pmt_force_mode) printf("%sSuccess.%s\n", ANSI_GREEN, ANSI_RESET);
} } else if (progress_code == 3)
else if (progress_code == 3)
{ {
/* generate partition extn */ /* generate partition extn */
if (!pmt_use_logical) if (!pmt_use_logical)
@@ -297,19 +248,33 @@ int pmt(unsigned short progress_code)
if (pmt_use_cust_cxt) sprintf(ppath, "%s/%s", cust_cxt, 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); else sprintf(ppath, "/dev/block/by-name/%s", target_partition);
/* for logical */ /* for logical */
} else if (pmt_use_logical) sprintf(ppath, "/dev/block/mapper/%s", target_partition);
else {
if (!pmt_force_mode)
{
fprintf(stderr, "İnvalid partition type!\n");
exit(49);
} else exit(49);
} }
else if (pmt_use_logical) sprintf(ppath, "/dev/block/mapper/%s", target_partition);
else return invalid_partition_type;
/* check partition */ /* check partition */
search_partition(ppath); if (access(ppath, F_OK) == -1)
{
if (!pmt_force_mode)
{
fprintf(stderr, "Partition not found!\n");
} else exit(31);
}
/* get target partition block size */ /* get target partition block size */
struct statvfs file_sys_inf; struct statvfs file_sys_inf;
if (statvfs(ppath, &file_sys_inf) != 0) if (statvfs(ppath, &file_sys_inf) != 0)
{ {
if (!pmt_force_mode) errx(EX_TEMPFAIL, "the partition block size could not be obtained!"); if (!pmt_force_mode)
else return EX_TEMPFAIL; {
fprintf(stderr, "The partition block size could not be obtained!\n");
exit(49);
} else exit(49);
} }
/* generate mke2fs command */ /* generate mke2fs command */
@@ -318,11 +283,13 @@ int pmt(unsigned short progress_code)
/* run command */ /* run command */
if (system(formatter_cmd) != 0) if (system(formatter_cmd) != 0)
{ {
if (!pmt_force_mode) errx(EX_TEMPFAIL, "formatting failed! There may be a chance that something has been damaged!"); if (!pmt_force_mode)
else return EX_TEMPFAIL; {
fprintf(stderr, "Formatting failed! There may be a chance that something has been damaged!\n");
exit(71);
} else exit(71);
} }
} }
return 0;
} }
#if defined(__cplusplus) #if defined(__cplusplus)

View File

@@ -21,25 +21,24 @@ extern "C" {
#endif #endif
#include <stdio.h> #include <stdio.h>
#include <android/ndk-version.h>
#include <pmt-versioning.h> #include <pmt-versioning.h>
extern char* bin_name; void version()
void version(void)
{ {
printf("%s version %d.%d.%d (code %d%d%d) ", bin_name, PMT_MAJOR, PMT_MINOR, PMT_PATCHLEVEL, PMT_MAJOR, PMT_MINOR, PMT_PATCHLEVEL); printf("Version: %d.%d.%d (code %d%d%d) ", PMT_MAJOR, PMT_LEVEL, PMT_PATCH, PMT_MAJOR, PMT_LEVEL, PMT_PATCH);
#if __SIZEOF_POINTER__ == 4 #if __SIZEOF_POINTER__ == 4
printf("32-bit binary\n"); printf("32-bit binary\n");
#elif __SIZEOF_POINTER__ == 8 #elif __SIZEOF_POINTER__ == 8
printf("64-bit binary\n"); printf("64-bit binary\n");
#else #else
printf("<unknown> binary\n"); printf("\n");
#endif #endif
#if defined(__clang__) #if defined(__clang__)
printf("Compiler: clang %d.%d.%d (NDK major r%d)\n", __clang_major__, __clang_minor__, __clang_patchlevel__, __NDK_MAJOR__); printf("Compiler: clang %s\n", __clang_version__);
#elif defined(__gcc__)
printf("Compiler: gcc %s\n", __gcc_version__)
#endif #endif
printf("See licenses with -L argument.\n"); printf("See licenses with -L argument.\n");

View File

@@ -15,65 +15,39 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# ANSI color codes
RED='\e[31m' RED='\e[31m'
NC='\e[0m' NC='\e[0m'
# needed variables
VERSION="2.1.0"
CUR_DIR=$(pwd)
LIB_DIR=${CUR_DIR}/libs
ARMV8A_DIR=${LIB_DIR}/arm64-v8a
ARMV7A_DIR=${LIB_DIR}/armeabi-v7a
DEB_DIR=${CUR_DIR}/deb
DEBUTILS_DIR=${CUR_DIR}/debutils
DEBTERMUX_USR=${DEBUTILS_DIR}/data/data/com.termux/files/usr
# error messages
abort() { abort() {
if [ ! "$1" = "" ]; then printf "${RED}$1${NC}"
printf "${RED}${1}${NC}\n"
fi
if [ -d ${DEBUTILS_DIR}/temp ]; then
rm -rf ${DEBUTILS_DIR}/temp
fi
exit 1 exit 1
} }
# detect arch flag case $1 in
case "$1" in
arm64-v8a) arm64-v8a)
PREFIX="64" PREFIX="64"
ARM_PREFIX="-v8a"
;; ;;
armeabi-v7a) armeabi-v7a)
PREFIX="32" PREFIX="32"
ARM_PREFIX=""
;; ;;
*) *)
abort " - Error: unknown architecture flag: $1. Avaiable: arm64-v8a & armeabi-v7a.\n" abort " - Error: unknown architecture flag: $1. Avaiable: arm64-v8a & armeabi-v7a\n"
esac esac
case "$2" in VERSION="2.0.0"
sudo) CUR_DIR=$(pwd)
SUDO="sudo" LIB_DIR=${CUR_DIR}/libs
;; ARMV8A_DIR=${OUT_DIR}/arm64-v8a
no-sudo) ARMV7A_DIR=${OUT_DIR}/armeabi-v7a
SUDO="" DEB_DIR=${OUT_DIR}/deb
;; DEBUTILS_DIR=${CUR_DIR}/debutils
*) DEBTERMUX_USR=${DEBUTILS_DIR}/data/data/com.termux/files/usr
SUDO=""
esac
# set file modes (all) to 755 chmod -R 755 *
${SUDO} chmod -R 755 *
# start printf " --------- Making pmt deb package ---------\n";
printf " --------- pmt deb package maker ---------\n";
printf " - Checking all files and directories (only printf " - Checking all files and directories (only
eededs)...\n"; eededs)...\n";
# check all important files
if [ ! -d ${DEBUTILS_DIR} ]; then if [ ! -d ${DEBUTILS_DIR} ]; then
abort " - Not found: ${DEBUTILS_DIR}\n" abort " - Not found: ${DEBUTILS_DIR}\n"
fi fi
@@ -92,11 +66,11 @@ fi
if [ ! -d ${DEBUTILS_DIR}/data/data/com.termux/files/usr/bin ]; then if [ ! -d ${DEBUTILS_DIR}/data/data/com.termux/files/usr/bin ]; then
abort " - Not found: ${DEBUTILS_DIR}/data/data/com.termux/files/usr/bin\n" abort " - Not found: ${DEBUTILS_DIR}/data/data/com.termux/files/usr/bin\n"
fi fi
if [ ! -d ${DEBUTILS_DIR}/data/data/com.termux/files/usr/share/man/man8 ]; then if [ ! -d ${DEBUTILS_DIR}/data/data/com.termux/files/usr/share/man/man1 ]; then
abort " - Not found: ${DEBUTILS_DIR}/data/data/com.termux/files/usr/share/man/man8\n" abort " - Not found: ${DEBUTILS_DIR}/data/data/com.termux/files/usr/share/man/man1\n"
fi fi
if [ ! -f ${DEBUTILS_DIR}/mandoc/pmt.8.gz ]; then if [ ! -f ${DEBUTILS_DIR}/mandoc/pmt.1 ]; then
abort " - Not found: ${DEBUTILS_DIR}/mandoc/pmt.8.gz\n" abort " - Not found: ${DEBUTILS_DIR}/mandoc/pmt.1\n"
fi fi
if [ ! -f ${DEBUTILS_DIR}/DEBIAN/control_32 ]; then if [ ! -f ${DEBUTILS_DIR}/DEBIAN/control_32 ]; then
abort " - Not found: ${DEBUTILS_DIR}/DEBIAN/control_32\n" abort " - Not found: ${DEBUTILS_DIR}/DEBIAN/control_32\n"
@@ -106,49 +80,37 @@ if [ ! -f ${DEBUTILS_DIR}/DEBIAN/control_64 ]; then
fi fi
if [ ! -f ${ARMV8A_DIR}/pmt ]; then if [ ! -f ${ARMV8A_DIR}/pmt ]; then
abort " - Package not comptely builded! Please build package and try again\n" abort " - Package not comptely builded! Please build package and try again\n"
elif [ ! -f ${ARMV7A_DIR}/pmt ]; then elif [ ! -f ${ARMV7A_DIR}/pmt ]; then
abort " - Package not comptely builded! Please build package and try again\n" abort " - Package not comptely builded! Please build package and try again\n"
fi fi
# generate template dir
printf " - Generating template dir...\n" printf " - Generating template dir...\n"
${SUDO} mkdir -p ${DEBUTILS_DIR}/temp || abort mkdir -p ${DEBUTILS_DIR}/temp
# generate out dir
printf " - Generating out dir...\n" printf " - Generating out dir...\n"
${SUDO} mkdir -p ${DEB_DIR} || abort mkdir -p ${DEB_DIR}
# copy files
printf " - Copying files...\n" printf " - Copying files...\n"
${SUDO} cp -r ${DEBUTILS_DIR}/data ${DEBUTILS_DIR}/temp || abort cp -r ${DEBUTILS_DIR}/data ${DEBUTILS_DIR}/temp || exit 1
${SUDO} rm -f ${DEBTERMUX_USR}/share/man/man8/dummy rm -f ${DEBTERMUX_USR}/share/man/man1/dummy
${SUDO} rm -f ${DEBTERMUX_USR}/bin/dummy rm -f ${DEBTERMUX_USR}/bin/dummy
${SUDO} mkdir -p ${DEBUTILS_DIR}/temp/DEBIAN || abort mkdir -p ${DEBUTILS_DIR}/temp/DEBIAN
# select control file
printf " - Selected arm-${PREFIX} package control file.\n" printf " - Selected arm-${PREFIX} package control file.\n"
${SUDO} cp ${DEBUTILS_DIR}/DEBIAN/control_${PREFIX} ${DEBUTILS_DIR}/temp/DEBIAN/control || exit 1 cp ${DEBUTILS_DIR}/DEBIAN/control_${PREFIX} ${DEBUTILS_DIR}/temp/DEBIAN/control || exit 1
${SUDO} cp ${DEBUTILS_DIR}/mandoc/pmt.8.gz ${DEBTERMUX_USR}/share/man/man8 || abort cp ${DEBUTILS_DIR}/mandoc/pmt.1 ${DEBTERMUX_USR}/share/man/man1 || exit 1
if [ "${PREFIX}" = "64" ]; then if [ "${PREFIX}" = "64" ]; then
${SUDO} cp ${ARMV8A_DIR}/pmt ${DEBTERMUX_USR}/bin || abort cp ${ARMV8A_DIR}/pmt ${DEBTERMUX_USR}/bin || exit 1
elif [ "${PREFIX}" = "32" ]; then elif [ "${PREFIX}" = "32" ]; then
${SUDO} cp ${ARMV7A_DIR}/pmt ${DEBTERMUX_USR}/bin || abort cp ${ARMV7A_DIR}/pmt ${DEBTERMUX_USR}/bin || exit 1
fi fi
# start dpkg-deb
printf " - Starting dpkg-deb...\n" printf " - Starting dpkg-deb...\n"
sleep 2 sleep 2
${SUDO} chmod -R 755 * chmod -R 755 *
dpkg-deb -b ${DEBUTILS_DIR}/temp ${DEB_DIR}/pmt-${VERSION}-arm${PREFIX}.deb || exit 1;
rm -rf ${DEBUTILS_DIR}/temp || exit 1;
# if ARM_PREFIX is '-v7a', unset ARM_PREFIX and PREFIX. Re set PREFIX printf " - Done! Package: ${DEB_DIR}/pmt-${VERSION}.deb\n"
if [ "${PREFIX}" = "32" ]; then
unset PREFIX
PREFIX="eabi-v7a"
fi
${SUDO} dpkg-deb -b ${DEBUTILS_DIR}/temp ${DEB_DIR}/pmt-${VERSION}-arm${PREFIX}${ARM_PREFIX}.deb || abort # end of script
${SUDO} rm -rf ${DEBUTILS_DIR}/temp
printf " - Done! Package: ${DEB_DIR}/pmt-${VERSION}-arm${PREFIX}${ARM_PREFIX}.deb\n"
# end of script