2 Commits
2.0.0 ... 1.8.0

Author SHA1 Message Date
7cd20acd44 Update README.md 2024-05-05 20:52:56 +03:00
151a520a22 pmt: initial 1.9.0 update 2024-05-05 20:51:53 +03:00
32 changed files with 956 additions and 866 deletions

View File

@@ -1,7 +1,12 @@
### Version 2.0.0 (code 200) changelog #### Version 1.8.0 (code 180):
- Instead of make, it was switched to build with NDK - Add formatting support (only ext2/3/4 file systems)
- File/partition sizes were given during backup/flash operations. - new features were added to the building system to create deb (debian) packages
- The use of `fprintf` has started for all error messages. - Edit some commands that the building system offers. One was removed. Some of them have changed
- More talent was added to the additional features offered by the building system and a simpler pleasant advance was presented
- A more detailed building system was created using separate makefiles
- Light changes on syntax in source code
- The source code folder was changed (binary to src)
- In packages created during the build no longer, xz is used instead of gzip
| END OF VERSION 2.0.0 CHANGELOG | | END OF VERSION 1.8.0 CHANGELOG |
|------------------------------------| |------------------------------------|

4
DISCLAIMER Executable file → Normal file
View File

@@ -1,6 +1,6 @@
WARNING: WARNING:
Disclaimer of Liability Regarding the Use of the C Library Disclaimer of Liability Regarding the Use of the C Library
- This library is intended for the user to manage the C android partitions. However, we do not accept responsibility for any problems or losses that may arise during its use. - This library is intended for the user to backup the C android partitions. However, we do not accept responsibility for any problems or losses that may arise during its use.
- Users should carefully test the library functions and, if necessary, implement their own error management mechanisms. - Users should carefully test the library functions and, if necessary, implement their own error management mechanisms.
- The authors reserve the right to make any changes or updates related to the library. - The authors reserve the right to make any changes or updates related to the library.
- This library is intended for management android partitions and its suitability for any specific project or application is not guaranteed. It is important for users to evaluate the suitability of their own projects. - This library is intended for backing up android partitions and its suitability for any specific project or application is not guaranteed. It is important for users to evaluate the suitability of their own projects.

0
LICENSE Executable file → Normal file
View File

209
Makefile Normal file
View File

@@ -0,0 +1,209 @@
# 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.
include config/vars.mk
include config/env.mk
include config/source.mk
-include config/INS_STAT.mk
-include config/UNINS_STAT.mk
# start build (if no custom target)
.PHONY: all
all:
@printf " ---- Building Partition Manager ---- \n\n"; \
printf " - Version: $(VERSION)\n"; \
printf " - Version code: $(VERSION_CODE)\n\n"; \
printf " -------------------------------- \n\n"; \
printf " - Building... Please waith.\n"; \
sleep 2; \
$(CC) $(CFLAGS) -o $(TARGET) $(SRCS) || exit 1; \
mkdir -p $(OUT_DIR); \
mkdir -p $(BINARY_DIR); \
mkdir -p $(PACKAGE_DIR); \
mv pmt $(BINARY_DIR) || exit 1; \
printf " - Generating xz package...\n"; \
cp $(BINARY_DIR)/pmt $(PACKAGE_DIR) || exit 1; \
xz $(PACKAGE_DIR)/pmt; \
mv $(PACKAGE_DIR)/pmt.xz $(PACKAGE_DIR)/pmt-$(ARCH)-$(LANG).xz || exit 1; \
printf " - Success\n\n"; \
printf " ------------------------------------ \n";
# cleaner functions
.PHONY: clean
clean:
@printf "Cleaning with rm force mode (builded binary)...\n"; \
sleep 1; \
rm -rf $(OUT_DIR); \
printf "Success\n";
# helper function
.PHONY: help
help:
@printf " ------- Partition Manager help -------\n"; \
printf " \n"; \
printf " Commands;\n"; \
printf " make ==> Build Partition Manager\n"; \
printf " make deb ==> Generate deb (debian) package (compatibility => termux)\n"; \
printf " make clean ==> Clear builded binary.\n"; \
printf " make install ==> If you are using termux, it installs the compiled pmt into termux. So it allows you to use it like a normal command.\n"; \
printf " make uninstall ==> If you are using termux, it uninstalls the compiled pmt into termux. So it allows you to use it like a normal command.\n"; \
printf " make help ==> Display help message\n\n";
# deb maker
.PHONY: deb
deb:
@printf " --------- Making deb package ---------\n"; \
printf " - Checking all files and directories (only neededs)...\n"; \
if [ ! -d $(DEBUTILS_DIR) ]; then \
printf " - Not found: $(DEBUTILS_DIR) \n"; \
exit 1; \
fi; \
if [ ! -d $(DEBUTILS_DIR)/DEBIAN ]; then \
printf " - Not found: $(DEBUTILS_DIR)/DEBIAN \n"; \
exit 1; \
fi; \
if [ ! -d $(DEBUTILS_DIR)/mandoc ]; then \
printf " - Not found: $(DEBUTILS_DIR)/mandoc \n"; \
exit 1; \
fi; \
if [ ! -d $(DEBUTILS_DIR)/data/data/com.termux ]; then \
printf " - Not found: $(DEBUTILS_DIR)/data/data/com.termux \n"; \
exit 1; \
fi; \
if [ ! -d $(DEBUTILS_DIR)/data/data/com.termux/files/usr ]; then \
printf " - Not found: $(DEBUTILS_DIR)/data/data/com.termux/files/usr \n"; \
exit 1; \
fi; \
if [ ! -d $(DEBUTILS_DIR)/data/data/com.termux/files/usr/bin ]; then \
printf " - Not found: $(DEBUTILS_DIR)/data/data/com.termux/files/usr/bin \n"; \
exit 1; \
fi; \
if [ ! -d $(DEBUTILS_DIR)/data/data/com.termux/files/usr/share/man/man1 ]; then \
printf " - Not found: $(DEBUTILS_DIR)/data/data/com.termux/files/usr/share/man/man1 \n"; \
exit 1; \
fi; \
if [ ! -f $(DEBUTILS_DIR)/mandoc/pmt.1 ]; then \
printf " - Not found: $(DEBUTILS_DIR)/mandoc/pmt.1 \n"; \
exit 1; \
fi; \
if [ ! -f $(DEBUTILS_DIR)/DEBIAN/control_32 ]; then \
printf " - Not found: $(DEBUTILS_DIR)/DEBIAN/control_32 \n"; \
exit 1; \
fi; \
if [ ! -f $(DEBUTILS_DIR)/DEBIAN/control_64 ]; then \
printf " - Not found: $(DEBUTILS_DIR)/DEBIAN/control_64 \n"; \
exit 1; \
fi; \
if [ ! -f $(BINARY_DIR)/pmt ]; then \
printf " - Package not builded! Please build package and try again \n"; \
exit 1; \
fi; \
printf " - Generating template dir...\n"; \
mkdir -p $(DEBUTILS_DIR)/temp; \
printf " - Generating out dir...\n"; \
mkdir -p $(DEB_DIR); \
printf " - Copying files...\n"; \
rm -f $(DEBTERMUX_USR)/share/man/man1/dummy; \
rm -f $(DEBTERMUX_USR)/bin/dummy; \
cp -r $(DEBUTILS_DIR)/data $(DEBUTILS_DIR)/temp || exit 1; \
mkdir -p $(DEBUTILS_DIR)/temp/DEBIAN; \
if [ "$(ARCH)" = "aarch64" ] || [ "$(ARCH)" = "armv8l" ]; then \
printf " - Selected arm-64 package control file.\n"; \
cp $(DEBUTILS_DIR)/DEBIAN/control_64 $(DEBUTILS_DIR)/temp/DEBIAN/control || exit 1; \
elif [ "$(ARCH)" = "aarch32" ] || [ "$(ARCH)" = "armv7l" ]; then \
printf " - Selected arm-32 package control file.\n"; \
cp $(DEBUTILS_DIR)/DEBIAN/control_32 $(DEBUTILS_DIR)/temp/DEBIAN/control || exit 1; \
fi; \
cp $(DEBUTILS_DIR)/mandoc/pmt.1 $(DEBTERMUX_USR)/share/man/man1 || exit 1; \
cp $(BINARY_DIR)/pmt $(DEBTERMUX_USR)/bin || exit 1; \
printf " - Starting dpkg-deb...\n"; \
sleep 2; \
chmod -R 755 *; \
dpkg-deb -b $(DEBUTILS_DIR)/temp $(DEB_DIR)/pmt-$(ARCH)-$(LANG).deb || exit 1; \
rm -r $(DEBUTILS_DIR)/temp || exit 1; \
printf " - Done! Package: $(DEB_DIR)/pmt-$(ARCH)-$(LANG).deb\n"
# installer
.PHONY: install
install:
@if [ -f $(TERMUX_BIN)/termux-open ]; then \
printf " ------------ pmt installer ------------ \n"; \
if [ -f $(TERMUX_BIN)/pmt ]; then \
printf " - pmt already installed\n"; \
exit; \
fi; \
if [ ! "$(INSTALL_SUCCESS)" = "true" ] && [ ! "$(INSTALL_SUCCESS)" = "" ]; then \
printf " - Warning: a previously-stayed failed installation process found\n"; \
fi; \
printf " - Checking files...\n"; \
if [ ! -f $(BINARY_DIR)/pmt ]; then \
printf " - Package not builded! Please build package and try again \n"; \
echo "INSTALL_SUCCESS := false" > $(CUR_DIR)/config/INS_STAT.mk; \
exit 1; \
fi; \
printf " - Copying files...\n"; \
if [ "`cp $(BINARY_DIR)/pmt /data/data/com.termux/files/usr/bin/pmt`" = "" ]; then \
printf " - Setting up permissions...\n"; \
else \
echo "INSTALL_SUCCESS := false" > $(CUR_DIR)/config/INS_STAT.mk; \
exit 1; \
fi; \
if [ "`chmod 777 $(TERMUX_BIN)/pmt`" = "" ]; then \
printf " - Saving current status...\n"; \
echo "INSTALL_SUCCESS := true" > $(CUR_DIR)/config/INS_STAT.mk; \
else \
echo "INSTALL_SUCCESS := false" > $(CUR_DIR)/config/INS_STAT.mk; \
exit 1; \
fi; \
printf " - Success.\n\n"; \
echo "INSTALL_SUCCESS := true" > $(CUR_DIR)/config/INS_STAT.mk; \
echo "UNINSTALLED_SUCCESS := " > $(CUR_DIR)/config/UNINS_STAT.mk; \
else \
printf " - This function is only available on Termux.\n"; \
fi
# uninstaller
.PHONY: uninstall
uninstall:
@if [ -f $(TERMUX_BIN)/termux-open ]; then \
printf " ----------- pmt uninstaller ----------- \n"; \
if [ ! -f $(TERMUX_BIN)/pmt ]; then \
printf " - pmt already uninstalled\n"; \
exit; \
fi; \
if [ ! "$(UNINSTALL_SUCCESS)" = "true" ] && [ ! "$(UNINSTALL_SUCCESS)" = "" ]; then \
printf " - Warning: a previously-stayed failed uninstallation process found\n"; \
fi; \
if [ -f $(TERMUX_USR)/share/man/man1/pmt.1 ]; then \
printf " - It was found to be established by pmt's deb pack. It's removed with apt...\n"; \
apt remove -y pmt || exit 1; \
printf " - Success.\n\n"; \
echo "UNINSTALLED_SUCCESS := true" > $(CUR_DIR)/config/UNINS_STAT.mk; \
echo "INSTALL_SUCCESS := " > $(CUR_DIR)/config/INS_STAT.mk; \
else \
printf " - It was found that pmt was manually established (with this makefile or copying). Manually removed...\n"; \
if [ "`rm $(TERMUX_BIN)/pmt`" = "" ]; then \
printf " - Success.\n\n"; \
echo "UNINSTALLED_SUCCESS := true" > $(CUR_DIR)/config/UNINS_STAT.mk; \
echo "INSTALL_SUCCESS := " > $(CUR_DIR)/config/INS_STAT.mk; \
else \
echo "UNINSTALLED_SUCCESS := false" > $(CUR_DIR)/config/UNINS_STAT.mk; \
exit 1; \
fi; \
fi; \
else \
printf "This function is only available on Termux.\n"; \
fi

0
NOTICE Executable file → Normal file
View File

View File

@@ -6,7 +6,7 @@ It offers a lot of options. I will place these below. But first let me talk abou
``` ```
1. The partition name is obtained (with the -p or --partition argument) 1. The partition name is obtained (with the -p or --partition argument)
2. Other arguments (if used) are processed. 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 3. It is backed up using DD. If the progress is not a problem, it is not given (DD)
``` ```
#### Presented arguments (options) #### Presented arguments (options)
@@ -32,7 +32,7 @@ Examples:
--flash /sdcard/twrp/boot.img -p boot_a -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 -c /dev/block/platform/bootdevice/by-name --list
Report bugs to <t.me/YZBruh> Report bugs to <yagizzengin73@gmail.com>
``` ```
#### Some notes #### Some notes
@@ -41,48 +41,31 @@ Report bugs to <t.me/YZBruh>
- 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. - İ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.0.0-en/CHANGELOG.md) - [Click to see special version changes](https://github.com/YZBruh/pbt/blob/1.8.0-en/CHANGELOG.md)
- Let me know your suggestions! - Let me know your suggestions!
### How is it built? ### How is it built?
Android NDK is required to build. Even termux is enough to build the pmt. Or you can compile it with linux if you want. NOTE: Use a custom gcc according to the architecture you want to compile.
- [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.0.0 ./pmt
cd pmt
```
- Set the NDK working directory variable.
```
export NDK_PROJECT_PATH=$(pwd)
```
- Go to the NDK directory and start the construction
```
./ndk-build
```
- The output files will be inside the `pmt` folder. Binaries are available in two architectures within the `libs` folder. `arm64-v8a` (64-bit) and `armeabi-v7a` (32-bit).
```
pmt/
|
libs/
|
__________|__________
| |
arm64-v8a/ armeabi-v7a/
| |
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
```
chmod 777 make-deb.sh
# for making 64-bit package
./make-deb.sh arm64-v8a
# for making 32-bit package
./make-deb.sh armeabi-v7a
```
### 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 `config` folder. His name is `env.mk`. I gave the information in the file. You can ask more.
To build;
```
make
```
Special `make` commands (pbt offers :) ;
```
------- Partition Manager help -------
Commands;
make ==> Build Partition Manager
make deb ==> Generate deb (debian) package (compatibility => termux)
make clean ==> Clear builded binary.
make install ==> If you are using termux, it installs the compiled pmt into termux. So it allows you to use it like a normal command.
make uninstall ==> If you are using termux, it uninstalls the compiled pmt into termux. So it allows you to use it like a normal command.
make help ==> Display help message
```
I compiled it with termux :D. Why should I bother... I compiled it with `GCC 18.1.4` You can look at the version with the viewing option :)

1
config/INS_STAT.mk Normal file
View File

@@ -0,0 +1 @@
INSTALL_SUCCESS :=

1
config/UNINS_STAT.mk Normal file
View File

@@ -0,0 +1 @@
UNINSTALL_SUCCESS :=

61
config/env.mk Normal file
View File

@@ -0,0 +1,61 @@
# 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.
#########################################
# #
# Configuration Flags #
# #
# Warning: you can edit #
# #
#########################################
# use custom gcc | true or false
USE_CUST_GCC := false
# custom gcc ext (if used)
CUST_GCC :=
# addionital gcc flags
EXTRA_GCC_FLAGS :=
#########################################
#########################################
#########################################
# #
# Apply Configuration #
# #
# Warning: please do not edit #
# #
#########################################
# gcc setting
ifeq ($(USE_CUST_GCC), true)
CC := $(CUST_GCC)
LD := $(CUST_GCC)
else ifeq ($(USE_CUST_GCC), false)
CC := gcc
LD := gcc
else
$(error İnvalid custom gcc config flag: $(USE_CUST_GCC))
endif
# gcc flag settings
CFLAGS := -O3 -g -Wall -Wextra $(EXTRA_GCC_FLAGS)
#########################################
#########################################

29
config/source.mk Normal file
View File

@@ -0,0 +1,29 @@
# By YZBruh
# Copyright 2024 YZBruh - 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.
# sources
SRCS := \
$(SOURCE_DIR)/$(TARGET).c \
$(SOURCE_DIR)/error.c \
$(SOURCE_DIR)/checkers.c \
$(SOURCE_DIR)/listpart.c \
$(SOURCE_DIR)/flash.c \
$(SOURCE_DIR)/backup.c \
$(SOURCE_DIR)/format.c \
$(SOURCE_DIR)/docs.c
# only the reason why the resource list is available is that:
# construction of a code was made with a different make sub-process in the old compilation logic. And then the built files were saved. And the main structure was created. But no longer needs it. According to new logic...

31
jni/config/env.mk → config/vars.mk Executable file → Normal file
View File

@@ -14,18 +14,25 @@
# 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.
######################################### # speficy
# # VERSION := 1.8.0
# Configuration Flags # VERSION_CODE := 180
# # TARGET := pmt
# Warning: you can edit # LANG := en
# #
#########################################
# addionital compiler flags # device arch info
EXTRA_COMPILER_FLAGS ?= ARCH := $(shell uname -m)
# debugging mode (binary) # current directory
ENABLE_DEBUGGING ?= false CUR_DIR := $(shell pwd)
# end of environment configuration # others needed important variables
SOURCE_DIR := $(CUR_DIR)/src
OUT_DIR := $(CUR_DIR)/out
BINARY_DIR := $(OUT_DIR)/binary
PACKAGE_DIR := $(OUT_DIR)/package
DEB_DIR := $(OUT_DIR)/deb
DEBUTILS_DIR := $(CUR_DIR)/debutils
DEBTERMUX_USR := $(DEBUTILS_DIR)/temp/data/data/com.termux/files/usr
TERMUX_BIN := /data/data/com.termux/files/usr/bin
TERMUX_USR := /data/data/com.termux/files/usr

3
debutils/DEBIAN/control_32 Executable file → Normal file
View File

@@ -1,9 +1,10 @@
Source: pmt Source: pmt
Package: pmt Package: pmt
Version: 2.0.0 Version: 1.8.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
Priority: optional Priority: optional
Maintainer: YZBruh <yagizzengin73@gmail.com> Maintainer: YZBruh <yagizzengin73@gmail.com>
Build-Depends: debhelper (>= 10), clang, make
Standards-Version: 4.5.0 Standards-Version: 4.5.0

3
debutils/DEBIAN/control_64 Executable file → Normal file
View File

@@ -1,9 +1,10 @@
Source: pmt Source: pmt
Package: pmt Package: pmt
Version: 2.0.0 Version: 1.8.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
Priority: optional Priority: optional
Maintainer: YZBruh <yagizzengin73@gmail.com> Maintainer: YZBruh <yagizzengin73@gmail.com>
Build-Depends: debhelper (>= 10), clang, make
Standards-Version: 4.5.0 Standards-Version: 4.5.0

1
debutils/data/data/com.termux/files/usr/bin/dummy Executable file → Normal file
View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1 @@

1
debutils/mandoc/pmt.1 Executable file → Normal file
View File

@@ -22,3 +22,4 @@ EXAMPLES:
BUGS: BUGS:
Report bugs to <yagizzengin73@gmail.com> Report bugs to <yagizzengin73@gmail.com>

View File

@@ -1,48 +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.
LOCAL_PATH := $(call my-dir)
ENVCONF := $(LOCAL_PATH)/config/env.mk
include $(CLEAR_VARS)
include $(ENVCONF)
# configration
LOCAL_MODULE = pmt
LOCAL_SRC_FILES = \
pmt.c \
versioner.c \
tools.c \
checkers.c \
listpart.c \
docs.c
# include dirs
LOCAL_C_INCLUDES = $(LOCAL_PATH)/include
# compiler flags settings
ifeq ($(ENABLE_DEBUGGING), true)
LOCAL_CFLAGS = -O3 -g -Wall -Wextra $(EXTRA_COMPILER_FLAGS)
else ifeq ($(ENABLE_DEBUGGING), false)
LOCAL_CFLAGS = -O3 -Wall $(EXTRA_COMPILER_FLAGS)
else
$(warning Unknown debugging flag: $(ENABLE_DEBUGGING). Please see: $(PREDIR)/config/env.mk. Using non-debugging flags)
LOCAL_CFLAGS = -O3 -Wall $(EXTRA_COMPILER_FLAGS)
endif
include $(BUILD_EXECUTABLE)
# end

View File

@@ -1,26 +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.
# architecture
APP_ABI := \
arm64-v8a \
armeabi-v7a
APP_PLATFORM := android-21
APP_OPTIM := release
# end

View File

@@ -1,30 +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 */
void help();
void licenses();
#if defined(__cplusplus)
}
#endif /* __cplusplus */
/* end */

View File

@@ -1,299 +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 <sys/stat.h>
#include <sys/statvfs.h>
#include <string.h>
#include <stdbool.h>
#include <stddef.h>
#include <errno.h>
#include <fcntl.h>
#include <pmt.h>
#define BFSIZE 1024
extern char *out;
extern char *outdir;
extern char *format_fs;
extern char *cust_cxt;
extern char *target_partition;
extern char *target_flash_file;
extern char *partition_type;
extern bool pmt_use_logical;
extern bool pmt_use_cust_cxt;
extern bool pmt_logical;
extern bool pmt_flash;
extern bool pmt_backup;
extern bool pmt_force_mode;
/**
*
* if progress_code is a
* 1 = backup mode
*
* 2 = flash mode
*
* 3 = format mode
*/
static double
calc_flsz(char *filepath)
{
static int calc_flsz_file;
calc_flsz_file = open(filepath, O_RDONLY);
if (calc_flsz_file == -1) return -1;
off_t flsz = lseek(calc_flsz_file, 0, SEEK_END);
close(calc_flsz_file);
if (flsz == (off_t)-1) return -1;
return (double)flsz / (1024 * 1024);
}
void pmt(unsigned short progress_code)
{
/* required variables */
static int srcf, targetf;
static char backupper_path[512];
static char ppath[100];
static char formatter_cmd[200];
static char outf[512];
static char flasher_path[512];
static char buffer[BFSIZE];
static ssize_t bytesRead;
static unsigned long long bytesCopied = 0;
static unsigned long long count = 1024 * 1024 * 1024;
if (progress_code == 1)
{
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);
} 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);
}
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_force_mode) printf("Disk size of the partition to be backed up: %.2f\n", calc_flsz(backupper_path));
else printf("%sFailed to target partition disk size%s\n", ANSI_YELLOW, ANSI_RESET);
srcf = open(backupper_path, O_RDONLY);
if (srcf == -1) {
if (!pmt_force_mode)
{
fprintf(stderr, "Couldn't read: %s: %s", backupper_path, strerror(errno));
exit(39);
} else exit(39);
}
/* determine output */
if (outdir != NULL)
{
if (out != NULL) sprintf(outf, "%s/%s.img", outdir, out);
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);
}
targetf = open(outf, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (targetf == -1) {
if (!pmt_force_mode)
{
fprintf(stderr, "Couldn't generate: %s: %s", outf, strerror(errno));
exit(37);
} else exit(37);
}
/* start writing */
while ((bytesRead = read(srcf, buffer, BFSIZE)) > 0 && bytesCopied < count)
{
ssize_t bytesWritten = write(targetf, buffer, bytesRead);
if (bytesWritten != bytesRead)
{
fprintf(stderr, "Couldn't write: %s: %s", backupper_path, strerror(errno));
close(srcf);
close(targetf);
exit(81);
}
bytesCopied += bytesWritten;
}
/* close files */
close(srcf);
close(targetf);
/* Print the output information by evaluating all situations */
if (outdir != NULL)
{
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 */
/* 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);
/* 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);
}
/* check partition */
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));
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));
else printf("%sFailed to get target partition disk size%s\n", ANSI_YELLOW, ANSI_RESET);
srcf = open(target_flash_file, O_RDONLY);
if (srcf == -1) {
if (!pmt_force_mode)
{
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);
if (targetf == -1) {
if (!pmt_force_mode)
{
fprintf(stderr, "Couldn't read: %s: %s", target_partition, strerror(errno));
exit(37);
} else exit(37);
}
/* start writing */
while ((bytesRead = read(srcf, buffer, BFSIZE)) > 0 && bytesCopied < count) {
ssize_t bytesWritten = write(targetf, buffer, bytesRead);
if (bytesWritten != bytesRead) {
fprintf(stderr, "Couldn't write: %s: %s", backupper_path, strerror(errno));
close(srcf);
close(targetf);
exit(81);
}
bytesCopied += bytesWritten;
}
close(srcf);
close(targetf);
if (!pmt_force_mode) printf("%sSuccess.%s\n", ANSI_GREEN, ANSI_RESET);
} 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);
/* 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);
}
/* check partition */
if (access(ppath, F_OK) == -1)
{
if (!pmt_force_mode)
{
fprintf(stderr, "Partition not found!\n");
} else exit(31);
}
/* get target partition block size */
struct statvfs file_sys_inf;
if (statvfs(ppath, &file_sys_inf) != 0)
{
if (!pmt_force_mode)
{
fprintf(stderr, "The partition block size could not be obtained!\n");
exit(49);
} else exit(49);
}
/* 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)
{
fprintf(stderr, "Formatting failed! There may be a chance that something has been damaged!\n");
exit(71);
} else exit(71);
}
}
}
#if defined(__cplusplus)
}
#endif /* __cplusplus */
/* end of code */

View File

@@ -1,51 +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 <pmt-versioning.h>
void version()
{
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
printf("32-bit binary\n");
#elif __SIZEOF_POINTER__ == 8
printf("64-bit binary\n");
#else
printf("\n");
#endif
#if defined(__clang__)
printf("Compiler: clang %s\n", __clang_version__);
#elif defined(__gcc__)
printf("Compiler: gcc %s\n", __gcc_version__)
#endif
printf("See licenses with -L argument.\n");
}
#if defined(__cplusplus)
}
#endif /* __cplusplus */
/* end of code */

View File

@@ -1,116 +0,0 @@
#!/usr/bin/bash
# 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.
RED='\e[31m'
NC='\e[0m'
abort() {
printf "${RED}$1${NC}"
exit 1
}
case $1 in
arm64-v8a)
PREFIX="64"
;;
armeabi-v7a)
PREFIX="32"
;;
*)
abort " - Error: unknown architecture flag: $1. Avaiable: arm64-v8a & armeabi-v7a\n"
esac
VERSION="2.0.0"
CUR_DIR=$(pwd)
LIB_DIR=${CUR_DIR}/libs
ARMV8A_DIR=${OUT_DIR}/arm64-v8a
ARMV7A_DIR=${OUT_DIR}/armeabi-v7a
DEB_DIR=${OUT_DIR}/deb
DEBUTILS_DIR=${CUR_DIR}/debutils
DEBTERMUX_USR=${DEBUTILS_DIR}/data/data/com.termux/files/usr
chmod -R 755 *
printf " --------- Making pmt deb package ---------\n";
printf " - Checking all files and directories (only
eededs)...\n";
if [ ! -d ${DEBUTILS_DIR} ]; then
abort " - Not found: ${DEBUTILS_DIR}\n"
fi
if [ ! -d ${DEBUTILS_DIR}/DEBIAN ]; then
abort " - Not found: ${DEBUTILS_DIR}/DEBIAN\n"
fi
if [ ! -d ${DEBUTILS_DIR}/mandoc ]; then
abort " - Not found: ${DEBUTILS_DIR}/mandoc\n"
fi
if [ ! -d ${DEBUTILS_DIR}/data/data/com.termux ]; then
abort " - Not found: ${DEBUTILS_DIR}/data/data/com.termux\n"
fi
if [ ! -d ${DEBUTILS_DIR}/data/data/com.termux/files/usr ]; then
abort " - Not found: ${DEBUTILS_DIR}/data/data/com.termux/files/usr\n"
fi
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"
fi
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/man1\n"
fi
if [ ! -f ${DEBUTILS_DIR}/mandoc/pmt.1 ]; then
abort " - Not found: ${DEBUTILS_DIR}/mandoc/pmt.1\n"
fi
if [ ! -f ${DEBUTILS_DIR}/DEBIAN/control_32 ]; then
abort " - Not found: ${DEBUTILS_DIR}/DEBIAN/control_32\n"
fi
if [ ! -f ${DEBUTILS_DIR}/DEBIAN/control_64 ]; then
abort " - Not found: ${DEBUTILS_DIR}/DEBIAN/control_64\n"
fi
if [ ! -f ${ARMV8A_DIR}/pmt ]; then
abort " - Package not comptely builded! Please build package and try again\n"
elif [ ! -f ${ARMV7A_DIR}/pmt ]; then
abort " - Package not comptely builded! Please build package and try again\n"
fi
printf " - Generating template dir...\n"
mkdir -p ${DEBUTILS_DIR}/temp
printf " - Generating out dir...\n"
mkdir -p ${DEB_DIR}
printf " - Copying files...\n"
cp -r ${DEBUTILS_DIR}/data ${DEBUTILS_DIR}/temp || exit 1
rm -f ${DEBTERMUX_USR}/share/man/man1/dummy
rm -f ${DEBTERMUX_USR}/bin/dummy
mkdir -p ${DEBUTILS_DIR}/temp/DEBIAN
printf " - Selected arm-${PREFIX} package control file.\n"
cp ${DEBUTILS_DIR}/DEBIAN/control_${PREFIX} ${DEBUTILS_DIR}/temp/DEBIAN/control || exit 1
cp ${DEBUTILS_DIR}/mandoc/pmt.1 ${DEBTERMUX_USR}/share/man/man1 || exit 1
if [ "${PREFIX}" = "64" ]; then
cp ${ARMV8A_DIR}/pmt ${DEBTERMUX_USR}/bin || exit 1
elif [ "${PREFIX}" = "32" ]; then
cp ${ARMV7A_DIR}/pmt ${DEBTERMUX_USR}/bin || exit 1
fi
printf " - Starting dpkg-deb...\n"
sleep 2
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;
printf " - Done! Package: ${DEB_DIR}/pmt-${VERSION}.deb\n"
# end of script

124
src/backup.c Normal file
View File

@@ -0,0 +1,124 @@
/* 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.
*/
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <stdbool.h>
#include <stddef.h>
#include "include/pmt.h"
extern char *out;
extern char *outdir;
extern char *cust_cxt;
extern bool pmt_use_logical;
extern bool pmt_use_cust_cxt;
extern bool pmt_force_mode;
/* backupper func */
void backup(char *target_backup_partition, char *backup_partition_style)
{
static char backupper_path[200];
if (strstr(backup_partition_style, "classic") != NULL)
{
if (pmt_use_cust_cxt)
{
sprintf(backupper_path, "%s/%s", cust_cxt, target_backup_partition);
} else {
sprintf(backupper_path, "/dev/block/by-name/%s", target_backup_partition);
}
} else if (strstr(backup_partition_style, "logical") != NULL)
{
sprintf(backupper_path, "/dev/block/mapper/%s", target_backup_partition);
} else {
if (!pmt_force_mode)
{
error("İnvalid partition type!\n", 28);
} else {
exit(28);
}
}
if (access(backupper_path, F_OK) == -1)
{
if (!pmt_force_mode)
{
error("Partition not found!\n", 29);
} else {
exit(29);
}
}
static char backupper_cmd[256];
if (outdir != NULL)
{
if (out != NULL)
{
sprintf(backupper_cmd, "dd if=%s of=%s/%s.img status=none", backupper_path, outdir, out);
} else {
sprintf(backupper_cmd, "dd if=%s of=%s/%s.img status=none", backupper_path, outdir, target_backup_partition);
}
} else {
if (out != NULL)
{
sprintf(backupper_cmd, "dd if=%s of=/storage/emulated/0/%s.img status=none", backupper_path, out);
} else {
sprintf(backupper_cmd, "dd if=%s of=/storage/emulated/0/%s.img status=none", backupper_path, target_backup_partition);
}
}
if (system(backupper_cmd) != 0)
{
if (!pmt_force_mode)
{
error("Failed!\n", 99);
} else {
exit(EXIT_FAILURE);
}
} else {
if (outdir != NULL)
{
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_backup_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_backup_partition, ANSI_RESET);
}
}
}
}
#ifdef __cplusplus
}
#endif
/* end of code */

50
jni/checkers.c → src/checkers.c Executable file → Normal file
View File

@@ -1,6 +1,6 @@
/* By YZBruh */ /* By YZBruh */
/** /*
* Copyright 2024 Partition Manager * Copyright 2024 Partition Manager
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,7 +16,7 @@
* limitations under the License. * limitations under the License.
*/ */
#if defined(__cplusplus) #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@@ -25,8 +25,10 @@ extern "C" {
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h>
#include <errno.h> #include <errno.h>
#include <pmt.h>
#include "include/pmt.h"
extern bool pmt_use_cust_cxt; extern bool pmt_use_cust_cxt;
extern bool pmt_ab; extern bool pmt_ab;
@@ -42,11 +44,19 @@ void check_psf()
{ {
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 (access(cust_cxt_ck_path, F_OK) != 0) pmt_ab = false; if (access(cust_cxt_ck_path, F_OK) != 0)
else pmt_ab = true; {
pmt_ab = false;
} else { } else {
if (access("/dev/block/by-name/boot_a", F_OK) != 0) pmt_ab = false; pmt_ab = true;
else pmt_ab = true; }
} else {
if (access("/dev/block/by-name/boot_a", F_OK) != 0)
{
pmt_ab = false;
} else {
pmt_ab = true;
}
} }
/* true = logical | false = classic */ /* true = logical | false = classic */
@@ -54,11 +64,19 @@ void check_psf()
{ {
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 (access(cust_cxt_ckl_path, F_OK) != 0) pmt_logical = false; if (access(cust_cxt_ckl_path, F_OK) != 0)
else pmt_logical = true; {
pmt_logical = false;
} else { } else {
if (access("/dev/block/by-name/super", F_OK) != 0) pmt_logical = false; pmt_logical = true;
else pmt_logical = true; }
} else {
if (access("/dev/block/by-name/super", F_OK) != 0)
{
pmt_logical = false;
} else {
pmt_logical = true;
}
} }
} }
@@ -66,18 +84,20 @@ void check_psf()
void check_root() void check_root()
{ {
/* a quick, easy method to verify root :D */ /* a quick, easy method to verify root :D */
if (getuid() != 0) if (chdir("/dev/block") != 0)
{ {
if (!pmt_force_mode) if (!pmt_force_mode)
{ {
fprintf(stderr, ANSI_RED "Root privileges could not be detected! Please run this binary with root. Error reason: %s\n" ANSI_RESET, strerror(errno)); 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); exit(27);
} else exit(27); } else {
exit(27);
}
} }
} }
#if defined(__cplusplus) #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif
/* end of code */ /* end of code */

12
jni/docs.c → src/docs.c Executable file → Normal file
View File

@@ -16,12 +16,14 @@
* limitations under the License. * limitations under the License.
*/ */
#if defined(__cplusplus) #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#include <stdio.h> #include <stdio.h>
#include <pmt-docs.h> #include <stdbool.h>
#include "include/pmt.h"
void licenses() void licenses()
{ {
@@ -56,11 +58,11 @@ void help()
printf(" -b --partition boot_a -o boot_slot_a_image -d /sdcard/backup -c /dev/block/platform/bootdevice/by-name\n"); printf(" -b --partition boot_a -o boot_slot_a_image -d /sdcard/backup -c /dev/block/platform/bootdevice/by-name\n");
printf(" --flash /sdcard/twrp/boot.img -p boot_a -c /dev/block/platform/bootdevice/by-name\n"); printf(" --flash /sdcard/twrp/boot.img -p boot_a -c /dev/block/platform/bootdevice/by-name\n");
printf(" -c /dev/block/platform/bootdevice/by-name --list\n\n"); printf(" -c /dev/block/platform/bootdevice/by-name --list\n\n");
printf("Report bugs to <t.me/YZBruh>\n"); printf("Report bugs to <yagizzengin73@gmail.com>\n");
} }
#if defined(__cplusplus) #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif
/* end of code */ /* end of code */

26
jni/include/pmt-versioning.h → src/error.c Executable file → Normal file
View File

@@ -16,17 +16,25 @@
* limitations under the License. * limitations under the License.
*/ */
#if defined(__cplusplus) #ifdef __cplusplus
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif
/* versioning */ #include <stdio.h>
#define PMT_MAJOR 2 #include <stdlib.h>
#define PMT_LEVEL 0 #include <stdbool.h>
#define PMT_PATCH 0
#if defined(__cplusplus) #include "include/pmt.h"
/* shorter error messages will be functional xd */
void error(const char *err_msg, uint32_t errcode)
{
fprintf(stderr, ANSI_RED "%s" ANSI_RESET, err_msg);
exit(errcode);
} }
#endif /* __cplusplus */
/* end */ #ifdef __cplusplus
}
#endif
/* end of code */

94
src/flash.c Normal file
View File

@@ -0,0 +1,94 @@
/* 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.
*/
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <stdbool.h>
#include "include/pmt.h"
extern char *cust_cxt;
extern bool pmt_use_cust_cxt;
extern bool pmt_force_mode;
/* flasher func */
void flash(char *target_flash_partition, char *target_file, char *flash_partition_style)
{
static char flasher_path[200];
/* determine device block */
/* for classic */
if (strstr(flash_partition_style, "classic") != NULL)
{
if (pmt_use_cust_cxt)
{
sprintf(flasher_path, "%s/%s", cust_cxt, target_flash_partition);
} else {
sprintf(flasher_path, "/dev/block/by-name/%s", target_flash_partition);
}
/* for logical */
} else if (strstr(flash_partition_style, "logical") != NULL)
{
sprintf(flasher_path, "/dev/block/mapper/%s", target_flash_partition);
} else {
if (!pmt_force_mode)
{
error("İnvalid partition type!\n", 30);
} else {
exit(30);
}
}
/* check partition */
if (access(flasher_path, F_OK) == -1)
{
if (!pmt_force_mode)
{
error("Partition not found!\n", 31);
} else {
exit(31);
}
}
/* setting up */
static char flasher_cmd[256];
sprintf(flasher_cmd, "dd if=%s of=%s status=none", target_file, flasher_path);
/* start flash */
if (system(flasher_cmd) != 0)
{
if (!pmt_force_mode)
{
error("Failed!\n", 98);
} else {
exit(98);
}
}
}
#ifdef __cplusplus
}
#endif
/* end of code */

107
src/format.c Normal file
View File

@@ -0,0 +1,107 @@
/* 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.
*/
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/statvfs.h>
#include <string.h>
#include <stdbool.h>
#include "include/pmt.h"
extern char *format_fs;
extern char *cust_cxt;
extern bool pmt_use_cust_cxt;
extern bool pmt_force_mode;
void format(char *target_format_partition, char *format_partition_style)
{
/* generate partition extn */
static char ppath[100];
if (strstr(format_partition_style, "classic") != NULL)
{
if (pmt_use_cust_cxt)
{
sprintf(ppath, "%s/%s", cust_cxt, target_format_partition);
} else {
sprintf(ppath, "/dev/block/by-name/%s", target_format_partition);
}
/* for logical */
} else if (strstr(format_partition_style, "logical") != NULL)
{
sprintf(ppath, "/dev/block/mapper/%s", target_format_partition);
} else {
if (!pmt_force_mode)
{
error("İnvalid partition type!\n", 30);
} else {
exit(49);
}
}
/* check partition */
if (access(ppath, F_OK) == -1)
{
if (!pmt_force_mode)
{
error("Partition not found!\n", 31);
} else {
exit(31);
}
}
/* get target partition block size */
struct statvfs file_sys_inf;
if (statvfs(ppath, &file_sys_inf) != 0)
{
if (!pmt_force_mode)
{
fprintf(stderr, "The partition block size could not be obtained!\n");
exit(49);
} else {
exit(49);
}
}
/* generate mke2fs command */
static char formatter_cmd[200];
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("Formatting failed! There may be a chance that something has been damaged!\n", 71);
} else {
exit(71);
}
}
}
#ifdef __cplusplus
}
#endif
/* end of code */

41
jni/include/pmt.h → src/include/pmt.h Executable file → Normal file
View File

@@ -1,6 +1,6 @@
/* By YZBruh */ /* By YZBruh */
/** /*
* Copyright 2024 Partition Manager * Copyright 2024 Partition Manager
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,20 +16,36 @@
* limitations under the License. * limitations under the License.
*/ */
#if defined(__cplusplus) #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#if !defined(__PMT_H_) /* check compiler system */
#define __PMT_H_ #ifdef _WIN32
#error "it can only be compiled in linux or android environment. but current system windows (_WIN32 defined)"
#elif ! __linux__ || __android__
#error "unknown compiler system founded"
#endif
/* some definations */ /* compiler architecture if arm is not 32-bit or 64-bit, the compilation is stopped */
#if ! __SIZEOF_POINTER__ == 4 || ! __SIZEOF_POINTER__ == 8
#error "only 32-bit or 64-bit arm compilers can be used"
#endif
#ifndef _PMT_H
#define _PMT_H
/* color definations */
#define ANSI_RED "\033[31m" #define ANSI_RED "\033[31m"
#define ANSI_YELLOW "\033[33m" #define ANSI_YELLOW "\033[33m"
#define ANSI_GREEN "\033[32m" #define ANSI_GREEN "\033[32m"
#define ANSI_RESET "\033[0m" #define ANSI_RESET "\033[0m"
/* info */
#define PMT_VERSION "1.8.0"
#define PMT_VERSION_CODE "180"
#define PMT_PACKAGE_NAME "Partition Manager" #define PMT_PACKAGE_NAME "Partition Manager"
#define PMT_PACKAGE_LANG "en"
/* variable definations */ /* variable definations */
extern char *out; extern char *out;
@@ -38,7 +54,6 @@ extern char *cust_cxt;
extern char *target_partition; extern char *target_partition;
extern char *target_flash_file; extern char *target_flash_file;
extern char *format_fs; extern char *format_fs;
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;
@@ -50,15 +65,19 @@ extern bool pmt_force_mode;
/* function definations */ /* function definations */
void listpart(); void listpart();
void error(const char *err_msg, uint32_t errcode);
void check_psf(); void check_psf();
void check_root(); void check_root();
void pmt(unsigned short progress_code); void backup(char *target_backup_partition, char *backup_partition_style);
void version(); void flash(char *target_flash_partition, char *target_file, char *flash_partition_style);
void format(char *target_format_partition, char *format_partition_style);
void help();
void licenses();
#endif /* __PMT_H_ */ #endif /* _PMT_H */
#if defined(__cplusplus) #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif
/* end of code */ /* end of code */

33
jni/listpart.c → src/listpart.c Executable file → Normal file
View File

@@ -1,6 +1,6 @@
/* By YZBruh */ /* By YZBruh */
/** /*
* Copyright 2024 Partition Manager * Copyright 2024 Partition Manager
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,7 +16,7 @@
* limitations under the License. * limitations under the License.
*/ */
#if defined(__cplusplus) #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@@ -26,8 +26,8 @@ extern "C" {
#include <stdbool.h> #include <stdbool.h>
#include <errno.h> #include <errno.h>
#include <dirent.h> #include <dirent.h>
#include <string.h>
#include <pmt.h> #include "include/pmt.h"
extern bool pmt_use_cust_cxt; extern bool pmt_use_cust_cxt;
extern bool pmt_ab; extern bool pmt_ab;
@@ -48,7 +48,9 @@ void listpart() {
if (!pmt_force_mode) { if (!pmt_force_mode) {
fprintf(stderr, "Could not open: `%s`. Error reason: %s\n", cust_cxt, strerror(errno)); fprintf(stderr, "Could not open: `%s`. Error reason: %s\n", cust_cxt, strerror(errno));
exit(62); exit(62);
} else exit(62); } else {
exit(62);
}
} }
} else { } else {
dir = opendir("/dev/block/by-name"); dir = opendir("/dev/block/by-name");
@@ -58,7 +60,9 @@ void listpart() {
{ {
fprintf(stderr, "Could not open: `/dev/block/by-name`. Error reason: %s\n", strerror(errno)); fprintf(stderr, "Could not open: `/dev/block/by-name`. Error reason: %s\n", strerror(errno));
exit(63); exit(63);
} else exit(63); } else {
exit(63);
}
} }
} }
@@ -73,18 +77,23 @@ void listpart() {
printf("List of logical partitions (/dev/block/mapper): \n"); printf("List of logical partitions (/dev/block/mapper): \n");
if (system("ls /dev/block/mapper") != 0 && !pmt_force_mode) if (system("ls /dev/block/mapper") != 0 && !pmt_force_mode)
{ {
fprintf(stderr, "%sAn error occurred when the logical partition list appears!%s\n", ANSI_RED, ANSI_RESET); error("An error occurred when the logical partition list appears!\n", 64);
exit(64);
} }
} }
if (pmt_ab && !pmt_force_mode) printf("%sWarning: device using A/B partition style.%s\n", ANSI_YELLOW, ANSI_RESET); if (pmt_ab && !pmt_force_mode)
{
printf("%sWarning: device using A/B partition style.%s\n", ANSI_YELLOW, ANSI_RESET);
}
if (pmt_logical && !pmt_force_mode) printf("%sWarning: device using logical partition type.%s\n", ANSI_YELLOW, ANSI_RESET); if (pmt_logical && !pmt_force_mode)
{
printf("%sWarning: device using logical partition type.%s\n", ANSI_YELLOW, ANSI_RESET);
}
} }
#if defined(__cplusplus) #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif
/* end of code */ /* end of code */

318
jni/pmt.c → src/pmt.c Executable file → Normal file
View File

@@ -1,6 +1,6 @@
/* By YZBruh */ /* By YZBruh */
/** /*
* Copyright 2024 Partition Manager * Copyright 2024 Partition Manager
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,12 +16,10 @@
* limitations under the License. * limitations under the License.
*/ */
/* force use C std (if default is C++) */ #ifdef __cplusplus
#if defined(__cplusplus)
extern "C" { extern "C" {
#endif #endif
/* include needed libs (headers) */
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <stdlib.h> #include <stdlib.h>
@@ -30,16 +28,14 @@ extern "C" {
#include <stdbool.h> #include <stdbool.h>
#include <getopt.h> #include <getopt.h>
#include <errno.h> #include <errno.h>
#include <pmt.h>
#include <pmt-docs.h>
/* add value to variables that are added globally and are not worth */ #include "include/pmt.h"
char *out = NULL; char *out = NULL;
char *outdir = NULL; char *outdir = NULL;
char *cust_cxt = NULL; char *cust_cxt = NULL;
char *target_partition = NULL; char *target_partition = NULL;
char *target_flash_file = NULL; char *target_flash_file = NULL;
char *partition_type = NULL;
char *format_fs = 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;
@@ -78,68 +74,92 @@ int main(int argc, char *argv[])
{0, 0, 0, 0} {0, 0, 0, 0}
}; };
/* boolean statements (only valid in this file) to distinguish. and pointer from a shortcut for the symbol rule */
static bool wiew_help = false;
static bool wiew_licenses = false;
static bool wiew_version = false;
static bool list_partitions = false;
static bool combo_wiewers = false;
static bool use_cust_outdir = false;
static char *opt_symbol = "-"; static char *opt_symbol = "-";
static char *common_symbol_rule; 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."; 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.\n";
int opt; int opt;
/* control for each argument */ /* control for each argument */
while ((opt = getopt_long(argc, argv, "bF:rp:lo:d:c:DfvL", 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': case 'b':
pmt_backup = true; pmt_backup = true;
break; break;
/* flash mode */
case 'F': case 'F':
target_flash_file = strdup(optarg); target_flash_file = strdup(optarg);
if (strncmp(target_flash_file, opt_symbol, 1) == 0) if (strncmp(target_flash_file, opt_symbol, 1) == 0)
{ {
if (!pmt_force_mode) if (!pmt_force_mode)
{ {
fprintf(stderr, "%s%s%s\n", ANSI_RED, common_symbol_rule, ANSI_RESET); error(common_symbol_rule, 19);
} else {
exit(19); exit(19);
} else exit(19); }
} }
pmt_flash = true; pmt_flash = true;
check_root();
check_psf();
struct stat flashf_info;
if (stat(target_flash_file, &flashf_info) != 0)
{
if (!pmt_force_mode)
{
fprintf(stderr, "%s: %s: %s\n", argv[0], target_flash_file, strerror(errno));
exit(15);
} else {
exit(15);
}
} else {
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);
}
}
}
break; break;
/* format mode */
case 'r': case 'r':
format_fs = strdup(optarg); format_fs = strdup(optarg);
if (strncmp(format_fs, opt_symbol, 1) == 0) if (strncmp(format_fs, opt_symbol, 1) == 0)
{ {
if (!pmt_force_mode) if (!pmt_force_mode)
{ {
fprintf(stderr, "%s%s%s\n", ANSI_RED, common_symbol_rule, ANSI_RESET); fprintf(stderr, "%s", common_symbol_rule);
exit(19); exit(71);
} else exit(19); } else {
exit(71);
}
} }
pmt_format = true; pmt_format = true;
if (strcmp(format_fs, "ext4") != 0 || strcmp(format_fs, "ext3") != 0 || strcmp(format_fs, "ext2") != 0)
{
if (!pmt_force_mode)
{
fprintf(stderr, "%s: formatter: unsupported filesystem: %s", argv[0], format_fs);
exit(41);
} else {
exit(41);
}
}
break; break;
/* partition selector option */
case 'p': case 'p':
target_partition = strdup(optarg); target_partition = strdup(optarg);
if (strncmp(target_partition, opt_symbol, 1) == 0) if (strncmp(target_partition, opt_symbol, 1) == 0)
{ {
if (!pmt_force_mode) if (!pmt_force_mode)
{ {
fprintf(stderr, "%s%s%s\n", ANSI_RED, common_symbol_rule, ANSI_RESET); error(common_symbol_rule, 19);
} else {
exit(19); exit(19);
} else exit(19); }
} }
break; break;
/* logical partitions option */
case 'l': case 'l':
check_root(); check_root();
check_psf(); check_psf();
@@ -149,29 +169,60 @@ int main(int argc, char *argv[])
} else { } else {
if (!pmt_force_mode) if (!pmt_force_mode)
{ {
fprintf(stderr, "This device does not have logical partitions!\n"); error("This device does not have logical partitions!\n", 17);
} else {
exit(17); exit(17);
} else exit(17); }
} }
break; break;
/* output file option */
case 'o': case 'o':
out = strdup(optarg); out = strdup(optarg);
if (strncmp(out, opt_symbol, 1) == 0) if (strncmp(out, opt_symbol, 1) == 0)
{ {
if (!pmt_force_mode) if (!pmt_force_mode)
{ {
fprintf(stderr, "%s%s%s\n", ANSI_RED, common_symbol_rule, ANSI_RESET); error(common_symbol_rule, 19);
} else {
exit(19); exit(19);
} else exit(19); }
} }
break; break;
/* output dir option */
case 'd': case 'd':
use_cust_outdir = true;
outdir = strdup(optarg); outdir = strdup(optarg);
if (strncmp(outdir, opt_symbol, 1) == 0)
{
if (!pmt_force_mode)
{
error(common_symbol_rule, 19);
} else {
exit(19);
}
}
check_root();
check_psf();
struct stat out_info;
if (stat(outdir, &out_info) != 0)
{
if (!pmt_force_mode)
{
fprintf(stderr, "%s: %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);
}
}
}
break; break;
/* 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);
@@ -179,40 +230,41 @@ int main(int argc, char *argv[])
{ {
if (!pmt_force_mode) if (!pmt_force_mode)
{ {
fprintf(stderr, "%s%s%s\n", ANSI_RED, common_symbol_rule, ANSI_RESET); error(common_symbol_rule, 19);
} else {
exit(19); exit(19);
} else exit(19); }
} }
break; break;
/* partition lister function */
case 'D': case 'D':
list_partitions = true; check_root();
/* check combo wiewer options and progress */ listpart();
if (wiew_version || wiew_help || wiew_licenses) combo_wiewers = true; exit(EXIT_SUCCESS);
break; break;
/* force mode option */
case 'f': case 'f':
pmt_force_mode = true; pmt_force_mode = true;
break; break;
/* version info option */
case 'v': case 'v':
wiew_version = true; printf("Version: %s (code %s)\n", PMT_VERSION, PMT_VERSION_CODE);
/* check combo wiewer options and progress */ #ifdef __clang__
if (list_partitions || wiew_help || wiew_licenses) combo_wiewers = true; printf("Compiler: clang %s", __clang_version__);
#endif
#ifdef __GNUC__
printf("(GNUC %d.%d.%d)\n", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
#else
printf("\n");
#endif
printf("See licenses with -L argument.\n");
exit(EXIT_SUCCESS);
break; break;
/* help message opption */
case 0: case 0:
wiew_help = true; help();
/* check combo wiewer options and progress */ exit(EXIT_SUCCESS);
if (wiew_version || list_partitions || wiew_licenses) combo_wiewers = true;
break; break;
/* license wiewer option */
case 'L': case 'L':
wiew_licenses = true; licenses();
/* check combo wiewer options and progress */ exit(EXIT_SUCCESS);
if (wiew_version || wiew_help || list_partitions) combo_wiewers = true;
break; break;
/* 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]);
exit(43); exit(43);
@@ -223,118 +275,27 @@ int main(int argc, char *argv[])
} }
} }
/* stop the program if multiple viewer is used */ /* minor checks */
if (combo_wiewers) if (!pmt_backup && !pmt_flash)
{
fprintf(stderr, "%s: Multiple wiewers cannot be used at the same line.\n", argv[0]);
exit(81);
}
/* controller to handle viewer */
if (wiew_help)
{
help();
exit(EXIT_SUCCESS);
} else if (wiew_version)
{
version();
exit(EXIT_SUCCESS);
} else if (wiew_licenses)
{
licenses();
exit(EXIT_SUCCESS);
} else if (list_partitions)
{
check_root();
listpart();
exit(EXIT_SUCCESS);
}
/* target control is done */
if (!pmt_backup && !pmt_flash && !pmt_format)
{ {
fprintf(stderr, "%s: missing operand.\nTry `%s --help` for more information.\n", argv[0], argv[0]); fprintf(stderr, "%s: missing operand.\nTry `%s --help` for more information.\n", argv[0], argv[0]);
exit(3); exit(3);
} }
/* prevent multiple mode use */
if (pmt_backup && pmt_flash) if (pmt_backup && pmt_flash)
{ {
if (!pmt_force_mode) if (!pmt_force_mode)
{ {
fprintf(stderr, "Backup and flash functions cannot be used in the same command.\n"); error("Backup and flash functions cannot be used in the same command\n", 9);
} else {
exit(9); exit(9);
} else exit(9); }
} }
/* checks */ /* checks */
check_root(); check_root();
check_psf(); check_psf();
if (pmt_format)
{
if (strcmp(format_fs, "ext4") != 0 || strcmp(format_fs, "ext3") != 0 || strcmp(format_fs, "ext2") != 0)
{
if (!pmt_force_mode)
{
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)
{
struct stat flashf_info;
if (stat(target_flash_file, &flashf_info) != 0)
{
if (!pmt_force_mode)
{
fprintf(stderr, "%s: cannot stat '%s': %s\n", argv[0], target_flash_file, strerror(errno));
exit(15);
} else exit(15);
} else {
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)
{ {
@@ -347,19 +308,22 @@ int main(int argc, char *argv[])
{ {
fprintf(stderr, "%s: %s: is a not directory.\n", argv[0], cust_cxt); fprintf(stderr, "%s: %s: is a not directory.\n", argv[0], cust_cxt);
exit(8); exit(8);
} else exit(8); } else {
exit(8);
}
} }
} else { } else {
if (!pmt_force_mode) if (!pmt_force_mode)
{ {
fprintf(stderr, "%s: %s: %s\n", argv[0], cust_cxt, strerror(errno)); fprintf(stderr, "%s: %s: %s\n", argv[0], cust_cxt, strerror(errno));
exit(6); exit(6);
} else exit(6); } else {
exit(6);
}
} }
if (strstr(cust_cxt, "/dev") == NULL && !pmt_force_mode) if (strstr(cust_cxt, "/dev") == NULL && !pmt_force_mode)
{ {
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); printf("%sThis custom context is strange...%s\n", ANSI_YELLOW, ANSI_RESET);
exit(81);
} }
} }
@@ -369,27 +333,39 @@ int main(int argc, char *argv[])
{ {
fprintf(stderr, "%s: required partition name.\nTry `%s --help' for more information.\n", argv[0], argv[0]); fprintf(stderr, "%s: required partition name.\nTry `%s --help' for more information.\n", argv[0], argv[0]);
exit(5); exit(5);
} else exit(5);
} else { } else {
/** exit(5);
* }
* 1 = backup mode } else {
*
* 2 = flash mode
*
* 3 = format
*/
if (pmt_backup) if (pmt_backup)
{ {
pmt(1); if (pmt_use_logical)
{
backup(target_partition, "logical");
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} else {
backup(target_partition, "classic");
exit(EXIT_SUCCESS);
}
} else if (pmt_flash) } else if (pmt_flash)
{ {
pmt(2); if (pmt_use_logical)
{
flash(target_partition, target_flash_file, "logical");
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} else {
flash(target_partition, target_flash_file, "classic");
exit(EXIT_SUCCESS);
}
} else if (pmt_format) } else if (pmt_format)
{ {
pmt(3); if (pmt_use_logical) {
format(target_partition, "logical");
exit(EXIT_SUCCESS);
} else {
format(target_partition, "classic");
exit(EXIT_SUCCESS);
}
} else { } else {
fprintf(stderr, "%s: no target (backup or flash).\nTry `%s --help` for more information.\n", argv[0], argv[0]); fprintf(stderr, "%s: no target (backup or flash).\nTry `%s --help` for more information.\n", argv[0], argv[0]);
exit(3); exit(3);
@@ -397,7 +373,7 @@ int main(int argc, char *argv[])
} }
} }
#if defined(__cplusplus) #ifdef __cplusplus
} }
#endif #endif