36 Commits
1.9.0 ... 2.1.0

Author SHA1 Message Date
1f191dcce9 Update install-termux.sh 2024-07-04 15:22:37 +03:00
96706ada96 Update install-termux.sh 2024-07-04 15:22:16 +03:00
fc02df6583 pmt: Fix FORTIFY problems 2024-06-17 11:41:55 +03:00
deb42c9ff5 Update README.md 2024-06-17 10:57:12 +03:00
60904a4b2f Update install-termux.sh 2024-06-17 00:37:35 +03:00
ad6115f51b Update install-termux.sh 2024-06-17 00:30:59 +03:00
6cc59d92f8 Update install-termux.sh 2024-06-17 00:28:42 +03:00
fe69408eb5 Update install-termux.sh 2024-06-17 00:26:37 +03:00
cd386ac6f9 Update install-termux.sh 2024-06-17 00:22:37 +03:00
268aa8ac77 Update install-termux.sh 2024-06-17 00:21:57 +03:00
c5746fe14b Update install-termux.sh 2024-06-17 00:17:11 +03:00
d2cb68df5e Update install-termux.sh 2024-06-17 00:13:30 +03:00
3976e0fb39 Update install-termux.sh 2024-06-17 00:08:01 +03:00
0a9e164b9c Update install-termux.sh 2024-06-17 00:07:00 +03:00
ecada5f076 Update install-termux.sh 2024-06-17 00:06:28 +03:00
ca09bb94e1 Update install-termux.sh 2024-06-17 00:03:18 +03:00
52ffe99d4b Update install-termux.sh 2024-06-17 00:00:54 +03:00
416939634a pmt: fix syntax 2024-06-17 00:00:24 +03:00
cbbd36899e Update README.md 2024-06-16 23:58:10 +03:00
9dc79ae923 Update install-termux.sh 2024-06-16 23:57:15 +03:00
b522dcc62b Update install-termux.sh 2024-06-16 23:56:35 +03:00
7aeea39e41 Update README.md 2024-06-16 23:56:01 +03:00
974774eb3e pmt: add quick installer 2024-06-16 23:51:02 +03:00
70ce307e50 readme: create a general file alignment table 2024-06-16 08:44:01 +03:00
99ecb9daf3 Make some corrections. 2024-06-10 06:28:01 +03:00
d0a7b2d16f Update CHANGELOG.md 2024-06-04 18:07:35 +03:00
96336bcd0b Update README.md 2024-06-04 17:59:20 +03:00
545376afb2 Initial 2.1.0 update 2024-06-04 17:55:15 +03:00
62b24d5705 Update docs.c 2024-05-26 17:08:18 +03:00
0fca319b29 Update README.md 2024-05-26 17:07:56 +03:00
929150e034 pmt: delete unnecessary files 2024-05-26 11:31:46 +03:00
93843a511d fix typo 2024-05-26 11:30:57 +03:00
0981e70268 pmt: edit changelog 2024-05-26 11:30:03 +03:00
b214da3cd6 pmt: fix missing explanation 2024-05-26 11:24:41 +03:00
464bfe6e56 pmt: Update build guide 2024-05-26 11:23:54 +03:00
f5531fde32 pmt: initial 2.0.0 update 2024-05-26 10:49:33 +03:00
35 changed files with 1323 additions and 1435 deletions

16
CHANGELOG.md Normal file → Executable file
View File

@@ -1,9 +1,11 @@
#### Version 1.9.0 (code 190):
- New features have been added to the compilation system. pmt can now be built with two mods. One is normal and the other is debugging.
- debugging is no longer the default
- In flashing and backup, completely C features are used instead of dd. The code is dd based. bought from toybox
- option trading logic changed
- more details
### Version 2.1.0 (code 210) changelog
- The main usage structure has been changed.
- 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.
- Smoother error processing was performed.
- 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.
- Better deb builder script.
- In short, a lot of missing and errors that happened in 2.0.0 have been fixed
| END OF VERSION 1.8.0 CHANGELOG |
| END OF VERSION 2.1.0 CHANGELOG |
|------------------------------------|

4
DISCLAIMER Normal file → Executable file
View File

@@ -1,6 +1,6 @@
WARNING:
Disclaimer of Liability Regarding the Use of the C Library
- 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.
- 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.
- 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.
- 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.
- 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.

0
LICENSE Normal file → Executable file
View File

211
Makefile
View File

@@ -1,211 +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.
include config/env.mk
include config/vars.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-$(TARGET_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"; \
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; \
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
# end

0
NOTICE Normal file → Executable file
View File

111
README.md Normal file → Executable file
View File

@@ -3,76 +3,95 @@
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...
```
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)
```
Usage:
-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)
pmt backup PARTITION [OUTPUT] [OPTIONS]...
pmt flash FILE PARTITION [OPTIONS]...
pmt format FILE_SYSTEM[ext/2/3/4] PARTITION [OPTIONS]...
Options:
-l | --logical it is meant to determine whether the target partition is logical
-c | --context it is meant to specify a custom /dev context. Only classic partitions (default: /dev/block/by-name)
-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.
-p | --list list partitions
-s | --silent information and warning messages are silenced in normal work.
-f | --force force mode. Error messages are silenced and some things are ignored.
-v | --version see version
--help see help message
-L | --license see license
Examples:
-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
pmt backup boot_a -c /dev/block/platform/bootdevice/by-name
pmt flash /sdcard/twrp/boot.img boot_a -c /dev/block/platform/bootdevice/by-name
pmt format ext4 system_a --logical
pmt -c /dev/block/platform/bootdevice/by-name --list
Report bugs to <yagizzengin73@gmail.com>
Report bugs to <t.me/YZBruh>
```
#### Some notes
- Feel free to ask any questions you want.
- 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.
- [Click to see special version changes](https://github.com/YZBruh/pbt/blob/1.9.0-en/CHANGELOG.md)
- [Click to see special version changes](https://github.com/YZBruh/pbt/blob/2.1.0-en/CHANGELOG.md)
- Let me know your suggestions!
### How is it built?
Android NDK is required to build. [Click for usage information](https://developer.android.com/ndk/guides/other_build_systems). [Click for NDK downloads](https://developer.android.com/ndk/downloads).
- NOTE 1: The current configuration is configured for compilation with NDK. The configuration was configured according to the NDK guide (I gave the link). You may need to replace it depending on the situation. You just need to set the `CC` variable in the compile command.
- NOTE 2: Use NDK 22+
- NOTE 3: The current target architecture is aarch64. You can change this in the configuration or by adding it to the compile command. Be careful. While making this current configuration, the following was considered (directory structure):
Android NDK is required to build.
- [Download](https://developer.android.com/ndk/downloads) and extract the NDK package.
- Clone this repository. And get access to it.
```
git clone https://github.com/YZBruh/pbt -b 2.1.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/
|
________________|________________
| | | |
jni/ debutils/ obj/ 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. 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
```
pmt android-ndk other-directories
--Usage--
./make-deb.sh [arm64-v8a, armeabi-v7a] [sudo, no-sudo, <blank>]
```
- The directory structure was thought exactly like this. Be careful.
```
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
```
### 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
If you want to change something, take a look at the configuration. You can change him.
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 (pmt 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
```
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 +0,0 @@
INSTALL_SUCCESS :=

View File

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

View File

@@ -1,53 +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.
#########################################
# #
# Configuration Flags #
# #
# Warning: you can edit #
# #
#########################################
# addionital gcc flags
EXTRA_GCC_FLAGS ?=
# arch config. 32-bit = armv7a | 64-bit = aarch64 | default = aarch64
TARGET_BUILD_ARCH ?= aarch64
# debugging mode (binary)
ENABLE_BINARY_DEBUGGING ?= false
#########################################
#########################################
#########################################
# #
# Apply Configuration #
# #
# Warning: please do not edit #
# #
#########################################
# gcc flag settings
ifeq ($(ENABLE_BINARY_DEBUGGING), true)
CFLAGS ?= -O3 -g -Wall -Wextra $(EXTRA_GCC_FLAGS)
else ifeq ($(ENABLE_BINARY_DEBUGGING), false)
CFLAGS ?= -O3 -Wall $(EXTRA_GCC_FLAGS)
endif
#########################################
#########################################

View File

@@ -1,64 +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.
# speficy
VERSION := 1.9.0
VERSION_CODE := 190
TARGET := pmt
LANG := en
# device arch info
ARCH := $(shell uname -m)
OS := $(shell uname)
# current directory
CUR_DIR := $(shell pwd)
# NDK config
NDK_DIR := $(shell dirname ../android-ndk/file)
$(shell chmod 777 $(CUR_DIR)/config/ndk.sh)
$(shell $(CUR_DIR)/config/ndk.sh)
ifeq ($(OS),Darwin)
TOOLCHAIN := $(NDK_DIR)/toolchains/llvm/prebuilt/darwin-x86_64
else ifeq ($(OS),Linux)
TOOLCHAIN := $(NDK_DIR)/toolchains/llvm/prebuilt/linux-x86_64
endif
ifeq ($(TARGET_BUILD_ARCH),aarch64)
TARGET_ARCH := aarch64-linux-android
else ifeq ($(TARGET_BUILD_ARCH),armv7a)
TARGET_ARCH := armv7a-linux-androideabi
endif
API := 29
# compiler
ifeq "$(origin CC)" "default"
undefine CC
endif
CC ?= $(TOOLCHAIN)/bin/$(TARGET_ARCH)$(API)-clang
# source config
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 Normal file → Executable file
View File

@@ -1,10 +1,9 @@
Source: pmt
Package: pmt
Version: 1.9.0
Version: 2.1.0
Architecture: arm
Description: pmt is for reading, writing and formatting partitions of android devices
Section: misc
Priority: optional
Maintainer: YZBruh <yagizzengin73@gmail.com>
Build-Depends: debhelper (>= 10), clang, make
Standards-Version: 4.5.0

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

@@ -1,10 +1,9 @@
Source: pmt
Package: pmt
Version: 1.9.0
Version: 2.1.0
Architecture: aarch64
Description: pmt is for reading, writing and formatting partitions of android devices
Section: misc
Priority: optional
Maintainer: YZBruh <yagizzengin73@gmail.com>
Build-Depends: debhelper (>= 10), clang, make
Standards-Version: 4.5.0

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

@@ -1 +0,0 @@

View File

@@ -1,25 +0,0 @@
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>

BIN
debutils/mandoc/pmt.8.gz Executable file

Binary file not shown.

62
install-termux.sh Normal file
View File

@@ -0,0 +1,62 @@
#!/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

49
jni/Android.mk Executable file
View File

@@ -0,0 +1,49 @@
# 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 \
partition_tool.c \
root.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

15
config/ndk.sh → jni/Application.mk Normal file → Executable file
View File

@@ -1,5 +1,3 @@
#!/bin/bash
# By YZBruh
# Copyright 2024 Partition Manager
@@ -16,8 +14,13 @@
# See the License for the specific language governing permissions and
# limitations under the License.
if [ ! -d ../android-ndk ]; then
printf "warning; ndk directory not found. And the current configuration may create problems...\n\n"
fi
# architecture
APP_ABI := \
arm64-v8a \
armeabi-v7a
# end of script
APP_PLATFORM := android-21
APP_OPTIM := release
# end

21
config/source.mk → jni/config/env.mk Normal file → Executable file
View File

@@ -1,6 +1,6 @@
# By YZBruh
# Copyright 2024 YZBruh - Partition Manager
# 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.
@@ -14,11 +14,18 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# sources
SRCS := \
$(wildcard $(SOURCE_DIR)/*.c)
#########################################
# #
# Configuration Flags #
# #
# Warning: you can edit #
# #
#########################################
# 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...
# addionital compiler flags
EXTRA_COMPILER_FLAGS ?=
# end
# debugging mode (binary)
ENABLE_DEBUGGING ?= false
# end of environment configuration

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

@@ -16,17 +16,16 @@
* limitations under the License.
*/
#ifdef __cplusplus
#if defined(__cplusplus)
extern "C" {
#endif
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <pmt-docs.h>
#include "include/pmt.h"
extern char* bin_name;
void licenses()
void licenses(void)
{
printf("Copyright 2024 Partition Manager\n");
printf("Licensed under the Apache License, Version 2.0 (the \"License\");\n");
@@ -39,31 +38,31 @@ void licenses()
printf("See the License for the specific language governing permissions and limitations under the License.\n");
}
void help()
void help(void)
{
printf("Usage: \n");
printf(" -b | --backup backup mode\n");
printf(" -F | --flash flash mode\n");
printf(" -r | --format format mode (only ext2/3/4 file systems)\n");
printf(" -p | --partition name of the partition to be backed up\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(" %s backup PARTITION [OUTPUT] [OPTIONS]...\n", bin_name);
printf(" %s flash FILE PARTITION [OPTIONS]...\n", bin_name);
printf(" %s format FILE_SYSTEM[ext/2/3/4] PARTITION [OPTIONS]...\n\n", bin_name);
printf("Options: \n");
printf(" -l | --logical it is meant to determine whether the target partition is logical\n");
printf(" -c | --context it is meant to specify a custom /dev context. Only classic partitions (default: /dev/block/by-name)\n");
printf(" -D | --list list partitions\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(" -p | --list list partitions\n");
printf(" -s | --silent information and warning messages are silenced in normal work.\n");
printf(" -f | --force force mode. Error messages are silenced and some things are ignored.\n");
printf(" -v | --version see version\n");
printf(" --help see help message\n");
printf(" -L | --license see license\n\n");
printf("Examples:\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(" -c /dev/block/platform/bootdevice/by-name --list\n\n");
printf("Report bugs to <yagizzengin73@gmail.com>\n");
printf(" %s backup boot_a -c /dev/block/platform/bootdevice/by-name\n", bin_name);
printf(" %s flash /sdcard/twrp/boot.img boot_a -c /dev/block/platform/bootdevice/by-name\n", bin_name);
printf(" %s format ext4 system_a --logical\n", bin_name);
printf(" %s -c /dev/block/platform/bootdevice/by-name --list\n\n", bin_name);
printf("Report bugs to <t.me/YZBruh>\n");
}
#ifdef __cplusplus
#if defined(__cplusplus)
}
#endif
#endif /* __cplusplus */
/* end of code */

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

@@ -16,26 +16,11 @@
* limitations under the License.
*/
#ifdef __cplusplus
extern "C" {
#endif
__BEGIN_DECLS
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
void help(void);
void licenses(void);
#include "include/pmt.h"
__END_DECLS
/* 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);
}
#ifdef __cplusplus
}
#endif
/* end of code */
/* end */

28
jni/include/pmt-versioning.h Executable file
View File

@@ -0,0 +1,28 @@
/* 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.
*/
__BEGIN_DECLS
/* versioning */
#define PMT_MAJOR 2
#define PMT_MINOR 1
#define PMT_PATCHLEVEL 0
__END_DECLS
/* end */

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

@@ -16,56 +16,46 @@
* limitations under the License.
*/
#ifdef __cplusplus
extern "C" {
#endif
__BEGIN_DECLS
#ifndef _PMT_H
#define _PMT_H
#if !defined(__PMT_H_)
#define __PMT_H_
/* color definations */
/* some definations */
#define ANSI_RED "\033[31m"
#define ANSI_YELLOW "\033[33m"
#define ANSI_GREEN "\033[32m"
#define ANSI_RESET "\033[0m"
/* info */
#define PMT_VERSION "1.9.0"
#define PMT_VERSION_CODE "190"
#define PMT_PACKAGE_NAME "Partition Manager"
#define PMT_PACKAGE_LANG "en"
/* variable definations */
extern char *out;
extern char *outdir;
extern char *cust_cxt;
extern char *target_partition;
extern char *target_flash_file;
extern char *format_fs;
extern char *partition_type;
extern char* out;
extern char* cust_cxt;
extern char* target_partition;
extern char* target_flash_file;
extern char* format_fs;
extern char* partition_type;
extern char* bin_name;
extern bool pmt_use_logical;
extern bool pmt_use_cust_cxt;
extern bool pmt_ab;
extern bool pmt_logical;
extern bool pmt_silent;
extern bool pmt_flash;
extern bool pmt_backup;
extern bool pmt_format;
extern bool pmt_force_mode;
/* function definations */
void listpart();
void error(const char *err_msg, uint32_t errcode);
void check_psf();
void check_root();
void pmt(short progress_code);
void version();
void help();
void licenses();
int listpart(void);
void check_dev_point(void);
void check_root(void);
int pmt(unsigned short progress_code);
void version(void);
#endif /* _PMT_H */
#endif /* __PMT_H_ */
#ifdef __cplusplus
}
#endif
__END_DECLS
/* end of code */

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

@@ -16,29 +16,31 @@
* limitations under the License.
*/
#ifdef __cplusplus
#if defined(__cplusplus)
extern "C" {
#endif
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#include <errno.h>
#include <err.h>
#include <sysexits.h>
#include <dirent.h>
#include <string.h>
#include "include/pmt.h"
#include <pmt.h>
extern bool pmt_use_cust_cxt;
extern bool pmt_ab;
extern bool pmt_logical;
extern bool pmt_silent;
extern bool pmt_force_mode;
extern char *cust_cxt;
extern char* cust_cxt;
extern char* bin_name;
/* list existing partitions */
void listpart() {
int listpart(void) {
DIR *dir;
struct dirent *entry;
@@ -47,55 +49,51 @@ void listpart() {
dir = opendir(cust_cxt);
if (dir == NULL)
{
if (!pmt_force_mode) {
fprintf(stderr, "Could not open: `%s`. Error reason: %s\n", cust_cxt, strerror(errno));
exit(62);
} else {
exit(62);
}
if (!pmt_force_mode) errx(EX_OSFILE, "could not open: `%s': %s", cust_cxt, strerror(errno));
else return EX_OSFILE;
}
} else {
}
else
{
dir = opendir("/dev/block/by-name");
if (dir == NULL)
{
if (!pmt_force_mode)
{
fprintf(stderr, "Could not open: `/dev/block/by-name`. Error reason: %s\n", strerror(errno));
exit(63);
} else {
exit(63);
}
if (!pmt_force_mode) errx(EX_OSFILE, "could not open: `/dev/block/by-name': %s", strerror(errno));
else return EX_OSFILE;
}
}
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
while ((entry = readdir(dir)) != NULL) printf("%s\n", entry->d_name);
closedir(dir);
dir = NULL;
if (pmt_logical)
{
printf("List of logical partitions (/dev/block/mapper): \n");
if (system("ls /dev/block/mapper") != 0 && !pmt_force_mode)
dir = opendir("/dev/block/mapper");
if (dir == NULL)
{
error("An error occurred when the logical partition list appears!\n", 64);
if (!pmt_silent) errx(EX_OSFILE, "could not open: `/dev/block/mapper': %s", strerror(errno));
else return EX_OSFILE;
}
else printf("List of logical partitions (`/dev/block/mapper'):\n");
}
if (pmt_ab && !pmt_force_mode)
{
printf("%sWarning: device using A/B partition style.%s\n", ANSI_YELLOW, ANSI_RESET);
}
while ((entry = readdir(dir)) != NULL) printf("%s\n", entry->d_name);
if (pmt_logical && !pmt_force_mode)
{
printf("%sWarning: device using logical partition type.%s\n", ANSI_YELLOW, ANSI_RESET);
}
closedir(dir);
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;
}
#ifdef __cplusplus
#if defined(__cplusplus)
}
#endif
#endif /* __cplusplus */
/* end of code */

73
jni/partition_tool.c Executable file
View File

@@ -0,0 +1,73 @@
/* 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 <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pmt.h>
extern bool pmt_use_cust_cxt;
extern bool pmt_ab;
extern bool pmt_logical;
extern char* cust_cxt;
static int
search(const char* _Nonnull target) { return access(target, F_OK); }
/* check parts */
void check_dev_point()
{
/* true = ab | false = a */
if (pmt_use_cust_cxt)
{
static char cust_cxt_ck_path[150];
sprintf(cust_cxt_ck_path, "%s/boot_a", cust_cxt);
if (search(cust_cxt_ck_path) != 0) pmt_ab = false;
else pmt_ab = true;
}
else
{
if (search("/dev/block/by-name/boot_a") != 0) pmt_ab = false;
else pmt_ab = true;
}
/* true = logical | false = classic */
if (pmt_use_cust_cxt)
{
static char cust_cxt_ckl_path[150];
sprintf(cust_cxt_ckl_path, "%s/super", cust_cxt);
if (search(cust_cxt_ckl_path) != 0) pmt_logical = false;
else pmt_logical = true;
}
else
{
if (search("/dev/block/by-name/super") != 0) pmt_logical = false;
else pmt_logical = true;
}
}
#if defined(__cplusplus)
}
#endif /* __cplusplus */
/* end */

387
jni/pmt.c Executable file
View File

@@ -0,0 +1,387 @@
/* 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.
*/
/* force use C std (if default is C++) */
#if defined(__cplusplus)
extern "C" {
#endif
/* include needed libs (headers) */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <stdbool.h>
#include <getopt.h>
#include <errno.h>
#include <err.h>
#include <sysexits.h>
#include <pmt.h>
#include <pmt-docs.h>
/* add value to variables that are added globally and are not worth */
char* out = NULL;
char* cust_cxt = NULL;
char* target_partition = NULL;
char* target_flash_file = NULL;
char* partition_type = NULL;
char* format_fs = NULL;
char* bin_name = NULL;
bool pmt_use_logical = NULL;
bool pmt_use_cust_cxt = NULL;
bool pmt_ab = false;
bool pmt_logical = false;
bool pmt_silent = false;
bool pmt_flash = false;
bool pmt_backup = false;
bool pmt_format = 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) */
int main(int argc, char* argv[])
{
/* check argument total */
if (argc < 2) errx(EX_USAGE, "missing operand\nTry `%s --help' for more information.", argv[0]);
bin_name = argv[0];
/* a structure for long arguments */
struct option long_options[] = {
{"logical", no_argument, 0, 'l'},
{"context", required_argument, 0, 'c'},
{"list", no_argument, 0, 'p'},
{"silent", no_argument, 0, 's'},
{"force", no_argument, 0, 'f'},
{"version", no_argument, 0, 'v'},
{"help", no_argument, 0, 0},
{"license", no_argument, 0, 'L'},
{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 int search_result = 3;
static int opt;
/* control for each argument */
while ((opt = getopt_long(argc, argv, "lc:psfvL", long_options, NULL)) != -1)
{
/* process arguments */
switch (opt)
{
/* logical partitions option */
case 'l':
check_root();
check_dev_point();
if (pmt_logical) pmt_use_logical = true;
else
{
if (!pmt_force_mode) errx(EX_USAGE, "this device does not have logical partitions!");
else return EX_USAGE;
}
break;
/* context selector option */
case 'c':
pmt_use_cust_cxt = true;
cust_cxt = strdup(optarg);
if (strncmp(cust_cxt, opt_symbol, 1) == 0)
{
if (!pmt_force_mode) errx(EX_USAGE, "%s", common_symbol_rule);
else return EX_USAGE;
}
break;
/* partition lister function */
case 'p':
list_partitions = true;
/* check combo wiewer options and progress */
if (wiew_version || wiew_help || wiew_licenses) combo_wiewers = true;
break;
/* force mode option */
case 'f':
pmt_force_mode = true;
break;
/* silent mode option */
case 's':
pmt_silent = true;
break;
/* version info option */
case 'v':
wiew_version = true;
/* check combo wiewer options and progress */
if (list_partitions || wiew_help || wiew_licenses) combo_wiewers = true;
break;
/* help message opption */
case 0:
wiew_help = true;
/* check combo wiewer options and progress */
if (wiew_version || list_partitions || wiew_licenses) combo_wiewers = true;
break;
/* license wiewer option */
case 'L':
wiew_licenses = true;
/* check combo wiewer options and progress */
if (wiew_version || wiew_help || list_partitions) combo_wiewers = true;
break;
/* for invalid options */
case '?':
printf("Try `%s --help' for more information.\n", argv[0]);
return EX_USAGE;
break;
default:
printf("Usage: %s [backup] flash] [format] [-l | --logical] [-c | --context] [-D | --list] [-v | --version] [--help] [-L | --license]\n", argv[0]);
return EX_USAGE;
}
}
/* stop the program if multiple viewer is used */
if (combo_wiewers) errx(EX_USAGE, "multiple wiewers cannot be used at the same line.");
/* controller to handle viewer */
if (wiew_help)
{
help();
return EX_OK;
}
else if (wiew_version)
{
version();
return EX_OK;
}
else if (wiew_licenses)
{
licenses();
return EX_OK;
}
else if (list_partitions)
{
check_root();
return listpart();
}
/* 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 */
if (!pmt_backup && !pmt_flash && !pmt_format && !pmt_silent) errx(EX_USAGE, "missing operand.\nTry `%s --help` for more information.", argv[0]);
else return EX_USAGE;
/* prevent multiple mode use */
if (pmt_backup && pmt_flash && pmt_format)
{
if (!pmt_force_mode) errx(EX_USAGE, "multi functions cannot be used in the same command.");
else return EX_USAGE;
}
/* checks */
check_root();
check_dev_point();
if (pmt_format)
{
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);
else return EX_USAGE;
}
}
if (pmt_flash)
{
search_result = search_stat(target_flash_file, "file");
if (search_result == 1)
{
if (!pmt_silent) errx(EX_UNAVAILABLE, "cannot stat `%s': %s", target_flash_file, strerror(errno));
else return EX_UNAVAILABLE;
}
else if (search_result == -1)
{
if (!pmt_silent) errx(EX_USAGE, "`%s': is a not file.", target_flash_file);
else return EX_USAGE;
}
}
/* custom context checker */
if (pmt_use_cust_cxt)
{
search_result = search_stat(cust_cxt, "dir");
if (search_result == 1)
{
if (!pmt_silent) errx(EX_UNAVAILABLE, "cannot stat `%s': %s", cust_cxt, strerror(errno));
else return EX_UNAVAILABLE;
}
else if (search_result == -1)
{
if (!pmt_silent) errx(EX_USAGE, "`%s': is a not directory.", cust_cxt);
else return EX_USAGE;
}
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 (!pmt_force_mode)
{
if (!pmt_silent) errx(EX_USAGE, "required partition name.\nTry `%s --help' for more information.\n", argv[0]);
}
else return EX_USAGE;
}
else
{
/**
* 1 = backup mode
*
* 2 = flash mode
*
* 3 = format
*/
if (pmt_backup) return pmt(1);
else if (pmt_flash) return pmt(2);
else if (pmt_format) return pmt(3);
else if (!pmt_silent) errx(EX_USAGE, "no target (backup or flash).\nTry `%s --help` for more information.\n", argv[0]);
}
}
#if defined(__cplusplus)
}
#endif
/* end of code */

46
jni/root.c Executable file
View File

@@ -0,0 +1,46 @@
/* 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 */

332
jni/tools.c Executable file
View File

@@ -0,0 +1,332 @@
/* 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 <err.h>
#include <sysexits.h>
#include <fcntl.h>
#include <pmt.h>
#define BFSIZE 1024
extern char* out;
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_silent;
extern bool pmt_force_mode;
/**
* if progress_code is a
* 1 = backup mode
*
* 2 = flash mode
*
* 3 = format mode
*/
/**
* it is meant to calculate the size of the quickly given file.
* its purpose is for rapid processing
*/
static double
calc_flsz(const char* _Nonnull filepath)
{
static int calc_flsz_file;
calc_flsz_file = open(filepath, O_RDONLY);
if (calc_flsz_file == -1) return calc_flsz_file;
static off_t flsz;
flsz = lseek(calc_flsz_file, 0, SEEK_END);
close(calc_flsz_file);
if (flsz == (off_t)-1) return -1;
return (double)flsz / (1024 * 1024);
}
/**
* 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 */
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 readed_data;
static unsigned long long copied_data = 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 return invalid_partition_type;
search_partition(backupper_path);
if (calc_flsz(backupper_path) != -1 && !pmt_silent) 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);
srcf = open(backupper_path, O_RDONLY);
if (srcf == -1)
{
if (!pmt_silent) errx(EX_OSFILE, "couldn't read: %s: %s", backupper_path, strerror(errno));
else return EX_IOERR;
}
/* determine output */
if (strcmp(out, target_partition) == 0)
{
sprintf(outf, "%s.img", target_partition);
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", target_partition);
targetf = open(outf, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (targetf == -1)
{
if (!pmt_silent) errx(EX_CANTCREAT, "couldn't generate: %s: %s", outf, strerror(errno));
else return EX_CANTCREAT;
}
/* start writing */
while ((readed_data = read(srcf, buffer, BFSIZE)) > 0 && copied_data < count)
{
ssize_t writed_data = write(targetf, buffer, readed_data);
if (writed_data != readed_data)
{
if (!pmt_silent) warnx("couldn't write: %s: %s", backupper_path, strerror(errno));
close(srcf);
close(targetf);
if (search_stat(outf, "file") == 0) remove(outf);
return EX_IOERR;
}
copied_data += writed_data;
}
/* close files */
close(srcf);
close(targetf);
if (!pmt_silent) printf("%sSuccess. Output: %s%s\n", ANSI_GREEN, outf, 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 return invalid_partition_type;
/* check partition */
search_partition(flasher_path);
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);
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);
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);
if (srcf == -1)
{
if (!pmt_force_mode) errx(EX_NOINPUT, "couldn't read: %s: %s", target_flash_file, strerror(errno));
else return EX_IOERR;
}
targetf = open(target_partition, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (targetf == -1)
{
if (!pmt_force_mode) errx(EX_OSFILE, "couldn't read: %s: %s", target_partition, strerror(errno));
else return EX_IOERR;
}
/* start writing */
while ((readed_data = read(srcf, buffer, BFSIZE)) > 0 && copied_data < count)
{
ssize_t writed_data = write(targetf, buffer, readed_data);
if (writed_data != readed_data)
{
warnx("couldn't write: %s: %s", backupper_path, strerror(errno));
close(srcf);
close(targetf);
return EX_IOERR;
}
copied_data += writed_data;
}
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 return invalid_partition_type;
/* check partition */
search_partition(ppath);
/* get target partition block size */
struct statvfs file_sys_inf;
if (statvfs(ppath, &file_sys_inf) != 0)
{
if (!pmt_force_mode) errx(EX_TEMPFAIL, "the partition block size could not be obtained!");
else return EX_TEMPFAIL;
}
/* 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) errx(EX_TEMPFAIL, "formatting failed! There may be a chance that something has been damaged!");
else return EX_TEMPFAIL;
}
}
return 0;
}
#if defined(__cplusplus)
}
#endif /* __cplusplus */
/* end of code */

28
src/versioner.c → jni/versioner.c Normal file → Executable file
View File

@@ -16,43 +16,37 @@
* limitations under the License.
*/
#ifdef __cplusplus
#if defined(__cplusplus)
extern "C" {
#endif
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <android/ndk-version.h>
#include <pmt-versioning.h>
#include "include/pmt.h"
extern char* bin_name;
void version()
void version(void)
{
printf("Version: %s (code %s) ", PMT_VERSION, PMT_VERSION_CODE);
printf("%s version %d.%d.%d (code %d%d%d) ", bin_name, PMT_MAJOR, PMT_MINOR, PMT_PATCHLEVEL, PMT_MAJOR, PMT_MINOR, PMT_PATCHLEVEL);
#if __SIZEOF_POINTER__ == 4
printf("32-bit binary\n");
#elif __SIZEOF_POINTER__ == 8
printf("64-bit binary\n");
#else
printf("\n");
printf("<unknown> binary\n");
#endif
#ifdef __clang__
printf("Compiler: clang %s ", __clang_version__);
#endif
#ifdef __GNUC__
printf("(GNUC %d.%d.%d)\n", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
#else
printf("\n");
#if defined(__clang__)
printf("Compiler: clang %d.%d.%d (NDK major r%d)\n", __clang_major__, __clang_minor__, __clang_patchlevel__, __NDK_MAJOR__);
#endif
printf("See licenses with -L argument.\n");
}
#ifdef __cplusplus
#if defined(__cplusplus)
}
#endif
#endif /* __cplusplus */
/* end of code */

154
make-deb.sh Executable file
View File

@@ -0,0 +1,154 @@
#!/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.
# ANSI color codes
RED='\e[31m'
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() {
if [ ! "$1" = "" ]; then
printf "${RED}${1}${NC}\n"
fi
if [ -d ${DEBUTILS_DIR}/temp ]; then
rm -rf ${DEBUTILS_DIR}/temp
fi
exit 1
}
# detect arch flag
case "$1" in
arm64-v8a)
PREFIX="64"
ARM_PREFIX="-v8a"
;;
armeabi-v7a)
PREFIX="32"
ARM_PREFIX=""
;;
*)
abort " - Error: unknown architecture flag: $1. Avaiable: arm64-v8a & armeabi-v7a.\n"
esac
case "$2" in
sudo)
SUDO="sudo"
;;
no-sudo)
SUDO=""
;;
*)
SUDO=""
esac
# set file modes (all) to 755
${SUDO} chmod -R 755 *
# start
printf " --------- pmt deb package maker ---------\n";
printf " - Checking all files and directories (only
eededs)...\n";
# check all important files
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/man8 ]; then
abort " - Not found: ${DEBUTILS_DIR}/data/data/com.termux/files/usr/share/man/man8\n"
fi
if [ ! -f ${DEBUTILS_DIR}/mandoc/pmt.8.gz ]; then
abort " - Not found: ${DEBUTILS_DIR}/mandoc/pmt.8.gz\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
# generate template dir
printf " - Generating template dir...\n"
${SUDO} mkdir -p ${DEBUTILS_DIR}/temp || abort
# generate out dir
printf " - Generating out dir...\n"
${SUDO} mkdir -p ${DEB_DIR} || abort
# copy files
printf " - Copying files...\n"
${SUDO} cp -r ${DEBUTILS_DIR}/data ${DEBUTILS_DIR}/temp || abort
${SUDO} rm -f ${DEBTERMUX_USR}/share/man/man8/dummy
${SUDO} rm -f ${DEBTERMUX_USR}/bin/dummy
${SUDO} mkdir -p ${DEBUTILS_DIR}/temp/DEBIAN || abort
# select control file
printf " - Selected arm-${PREFIX} package control file.\n"
${SUDO} 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
if [ "${PREFIX}" = "64" ]; then
${SUDO} cp ${ARMV8A_DIR}/pmt ${DEBTERMUX_USR}/bin || abort
elif [ "${PREFIX}" = "32" ]; then
${SUDO} cp ${ARMV7A_DIR}/pmt ${DEBTERMUX_USR}/bin || abort
fi
# start dpkg-deb
printf " - Starting dpkg-deb...\n"
sleep 2
${SUDO} chmod -R 755 *
# if ARM_PREFIX is '-v7a', unset ARM_PREFIX and PREFIX. Re set PREFIX
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
${SUDO} rm -rf ${DEBUTILS_DIR}/temp
printf " - Done! Package: ${DEB_DIR}/pmt-${VERSION}-arm${PREFIX}${ARM_PREFIX}.deb\n"
# end of script

View File

@@ -1,106 +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.
*/
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <sys/stat.h>
#include <errno.h>
#include "include/pmt.h"
extern bool pmt_use_cust_cxt;
extern bool pmt_ab;
extern bool pmt_logical;
extern bool pmt_force_mode;
extern char *cust_cxt;
/* check parts */
void check_psf()
{
struct stat abinf;
/* true = ab | false = a */
if (pmt_use_cust_cxt)
{
static char cust_cxt_ck_path[150];
sprintf(cust_cxt_ck_path, "%s/boot_a", cust_cxt);
if (stat(cust_cxt_ck_path, &abinf) != 0)
{
pmt_ab = false;
} else {
pmt_ab = true;
}
} else {
if (stat("/dev/block/by-name/boot_a", &abinf) != 0)
{
pmt_ab = false;
} else {
pmt_ab = true;
}
}
struct stat logcinf;
/* true = logical | false = classic */
if (pmt_use_cust_cxt)
{
static char cust_cxt_ckl_path[150];
sprintf(cust_cxt_ckl_path, "%s/super", cust_cxt);
if (stat(cust_cxt_ckl_path, &logcinf) != 0)
{
pmt_logical = false;
} else {
pmt_logical = true;
}
} else {
if (stat("/dev/block/by-name/super", &logcinf) != 0)
{
pmt_logical = false;
} else {
pmt_logical = true;
}
}
}
/* root checker function */
void check_root()
{
/* a quick, easy method to verify root :D */
if (chdir("/dev/block") != 0)
{
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));
exit(27);
} else {
exit(27);
}
}
}
#ifdef __cplusplus
}
#endif
/* end of code */

443
src/pmt.c
View File

@@ -1,443 +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.
*/
/* force use C std (if default is C++) */
#ifdef __cplusplus
extern "C" {
#endif
/* include needed libs (headers) */
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <stdbool.h>
#include <getopt.h>
#include <errno.h>
/* include custom pmt header */
#include "include/pmt.h"
/* add value to variables that are added globally and are not worth */
char *out = NULL;
char *outdir = NULL;
char *cust_cxt = NULL;
char *target_partition = NULL;
char *target_flash_file = NULL;
char *partition_type = NULL;
char *format_fs = NULL;
bool pmt_use_logical = NULL;
bool pmt_use_cust_cxt = NULL;
bool pmt_ab = false;
bool pmt_logical = false;
bool pmt_flash = false;
bool pmt_backup = false;
bool pmt_format = false;
bool pmt_force_mode = false;
/* classic main function (C binary here xd) */
int main(int argc, char *argv[])
{
/* check argument total */
if (argc < 2)
{
fprintf(stderr, "%s: missing operand\nTry `%s --help' for more information.\n", argv[0], argv[0]);
exit(44);
}
/* a structure for long arguments... */
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'},
{"out", required_argument, 0, 'o'},
{"outdir", required_argument, 0, 'd'},
{"context", required_argument, 0, 'c'},
{"list", no_argument, 0, 'D'},
{"force", no_argument, 0, 'f'},
{"version", no_argument, 0, 'v'},
{"help", no_argument, 0, 0},
{"license", no_argument, 0, 'L'},
{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 *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.\n";
int opt;
/* control for each argument */
while ((opt = getopt_long(argc, argv, "bF:rp:lo:d:c:DfvL", long_options, NULL)) != -1)
{
/* process arguments */
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)
{
error(common_symbol_rule, 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", common_symbol_rule);
exit(71);
} else {
exit(71);
}
}
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)
{
error(common_symbol_rule, 19);
} else {
exit(19);
}
}
break;
/* logical partitions option */
case 'l':
check_root();
check_psf();
if (pmt_logical)
{
pmt_use_logical = true;
} else {
if (!pmt_force_mode)
{
error("This device does not have logical partitions!\n", 17);
} else {
exit(17);
}
}
break;
/* output file option */
case 'o':
out = strdup(optarg);
if (strncmp(out, opt_symbol, 1) == 0)
{
if (!pmt_force_mode)
{
error(common_symbol_rule, 19);
} else {
exit(19);
}
}
break;
/* output dir option */
case 'd':
use_cust_outdir = true;
outdir = strdup(optarg);
break;
/* context selector option */
case 'c':
pmt_use_cust_cxt = true;
cust_cxt = strdup(optarg);
if (strncmp(cust_cxt, opt_symbol, 1) == 0)
{
if (!pmt_force_mode)
{
error(common_symbol_rule, 19);
} else {
exit(19);
}
}
break;
/* partition lister function */
case 'D':
list_partitions = true;
/* check combo wiewer options and progress */
if (wiew_version || wiew_help || wiew_licenses)
{
combo_wiewers = true;
}
break;
/* force mode option */
case 'f':
pmt_force_mode = true;
break;
/* version info option */
case 'v':
wiew_version = true;
/* check combo wiewer options and progress */
if (list_partitions || wiew_help || wiew_licenses)
{
combo_wiewers = true;
}
break;
/* help message opption */
case 0:
wiew_help = true;
/* check combo wiewer options and progress */
if (wiew_version || list_partitions || wiew_licenses)
{
combo_wiewers = true;
}
break;
/* license wiewer option */
case 'L':
wiew_licenses = true;
/* check combo wiewer options and progress */
if (wiew_version || wiew_help || list_partitions)
{
combo_wiewers = true;
}
break;
/* for invalid options */
case '?':
printf("Try `%s --help' for more information.\n", argv[0]);
exit(43);
break;
default:
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]);
exit(44);
}
}
/* stop the program if multiple viewer is used */
if (combo_wiewers)
{
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]);
exit(3);
}
/* prevent multiple mode use */
if (pmt_backup && pmt_flash)
{
if (!pmt_force_mode)
{
error("Backup and flash functions cannot be used in the same command.\n", 9);
} else {
exit(9);
}
}
/* checks */
check_root();
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)
{
error(common_symbol_rule, 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 */
if (pmt_use_cust_cxt)
{
struct stat cxtinfo;
if (stat(cust_cxt, &cxtinfo) == 0)
{
if (!S_ISREG(cxtinfo.st_mode))
{
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);
}
}
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);
exit(81);
}
}
if (target_partition == NULL)
{
if (!pmt_force_mode)
{
fprintf(stderr, "%s: required partition name.\nTry `%s --help' for more information.\n", argv[0], argv[0]);
exit(5);
} else {
exit(5);
}
} else {
/**
*
* 1 = backup mode
*
* 2 = flash mode
*
* 3 = format
*/
if (pmt_backup)
{
pmt(1);
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);
}
}
}
#ifdef __cplusplus
}
#endif
/* end of code */

View File

@@ -1,332 +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.
*/
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <stdint.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 "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
*/
void pmt(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)
{
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);
}
}
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)
{
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);
}
}
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)
{
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 */
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 */