102 Commits
1.7.0 ... 1.9.0

Author SHA1 Message Date
df720bd309 Update CHANGELOG.md 2024-05-26 11:25:20 +03:00
f771fb7c68 Update env.mk 2024-05-14 00:07:19 +03:00
4bc5235952 Update vars.mk 2024-05-14 00:04:29 +03:00
d4b4c91ff4 pmt; use target arch macro 2024-05-14 00:00:15 +03:00
6fc38eb01d Update vars.mk 2024-05-13 23:58:04 +03:00
42e5d132e7 Update vars.mk 2024-05-13 23:52:55 +03:00
39d1411b11 pmt; include stdint lib 2024-05-13 23:47:16 +03:00
04d6471c86 Update tools.c 2024-05-13 23:46:54 +03:00
f7d2f313de Update pmt.c 2024-05-13 23:46:37 +03:00
49a87b0387 pmt; include stdint lib 2024-05-13 23:46:15 +03:00
5a104e5b22 pmt; include stdint lib 2024-05-13 23:45:56 +03:00
055213f2f6 pmt; include stdint lib 2024-05-13 23:45:37 +03:00
7f270e319c pmt; include stdint lib 2024-05-13 23:45:17 +03:00
6a035f8f41 Update pmt.h 2024-05-13 23:43:35 +03:00
1b2dda655a Update vars.mk 2024-05-13 23:43:11 +03:00
07d63944c1 Update pmt.h 2024-05-13 23:36:54 +03:00
36b7bcf246 Update pmt.h 2024-05-13 23:35:30 +03:00
cd3f65a145 Update pmt.h 2024-05-13 23:34:56 +03:00
9dd29f96b8 Update pmt.h 2024-05-13 23:31:41 +03:00
7254637caf Update pmt.h 2024-05-13 23:30:54 +03:00
2af00a8028 Update pmt.h 2024-05-13 23:26:39 +03:00
b5790af803 pmt: change macro name 2024-05-13 23:23:02 +03:00
8fe1548796 Update vars.mk 2024-05-13 23:20:12 +03:00
04d8ccdd81 Update vars.mk 2024-05-13 23:14:59 +03:00
1a790d1d89 Update vars.mk 2024-05-13 23:13:43 +03:00
1296e488f1 Update vars.mk 2024-05-13 23:09:35 +03:00
3fea6c73cc Update vars.mk 2024-05-13 23:06:56 +03:00
cf4b590130 Update vars.mk 2024-05-13 23:05:28 +03:00
352ef6e68a Update vars.mk 2024-05-13 23:04:36 +03:00
754ebaade2 Update vars.mk 2024-05-13 23:03:37 +03:00
8a28a8f1ef Update ndk.sh 2024-05-13 23:01:43 +03:00
086a2dd93d Update vars.mk 2024-05-13 23:00:17 +03:00
383a1efe55 Create ndk.sh 2024-05-13 22:59:21 +03:00
b96977a5fc Update vars.mk 2024-05-13 22:58:17 +03:00
976c10593c Update vars.mk 2024-05-13 22:53:23 +03:00
d45dd67cbe Update vars.mk 2024-05-13 22:46:55 +03:00
0fa5a546aa Update vars.mk 2024-05-13 22:44:59 +03:00
0c487c62fe pmt: fix syntax 2024-05-13 22:43:15 +03:00
105d92e0ca Update vars.mk 2024-05-13 22:40:15 +03:00
850d104a1a Update README.md 2024-05-13 22:28:51 +03:00
6d24fb9eae pmt: adapt NDK 2024-05-13 22:28:10 +03:00
ae8c73c4f5 pmt: adapt NDK 2024-05-13 22:26:46 +03:00
890d93131c pmt: include env first 2024-05-13 22:24:57 +03:00
a33d4e3f16 Update README.md 2024-05-13 22:12:29 +03:00
f344d62d4c Update README.md 2024-05-13 22:10:44 +03:00
40c5b155dc Update README.md 2024-05-13 22:08:51 +03:00
0547e18639 Update README.md 2024-05-13 22:05:57 +03:00
f34a47889e Update README.md 2024-05-13 22:00:47 +03:00
a9fac9e661 pmt: just report compiling with android NDK 2024-05-13 21:57:15 +03:00
e8040de436 pmt: header: make compatible with android NDK 2024-05-13 21:53:54 +03:00
ff6e82c556 pmt: versioner: add 32-bit or 64-bit build information to version information 2024-05-13 21:51:20 +03:00
0c7da875b2 pmt: listpart: include string library 2024-05-13 21:43:21 +03:00
41565d221f pmt: update version 2024-05-08 06:58:40 +03:00
5ba78d860e pmt: update version 2024-05-07 20:58:37 +03:00
181125dfca pmt: initial 1.9.0 update 2024-05-05 21:06:14 +03:00
4464c203fd pmt: initial 1.9.0 update 2024-05-05 21:05:21 +03:00
b9e58df98f pmt: initial 1.9.0 update 2024-05-05 21:04:48 +03:00
e2f8cf4ca3 pmt: initial 1.9.0 update 2024-05-05 21:03:51 +03:00
07e2249ef1 pmt: initial 1.9.0 update 2024-05-05 21:03:01 +03:00
fd970be822 pmt: initial 1.9.0 update 2024-05-05 21:02:26 +03:00
45c964997c Delete src/format.c 2024-05-05 21:02:15 +03:00
31b7f16a29 pmt: initial 1.9.0 update 2024-05-05 21:02:04 +03:00
5f83a4476f pmt: initial 1.9.0 update 2024-05-05 21:01:43 +03:00
5438f5210f pmt: initial 1.9.0 update 2024-05-05 21:00:53 +03:00
cb7904cd5a pmt: initial 1.9.0 update 2024-05-05 20:57:20 +03:00
9c570d5b02 pmt: initial 1.9.0 update 2024-05-05 20:56:34 +03:00
c9736863fe pmt: initial 1.9.0 update 2024-05-05 20:55:59 +03:00
d5ce065e8b pmt: initial 1.9.0 update 2024-05-05 20:55:19 +03:00
a4bc9e3834 pmt: initial 1.9.0 update 2024-05-05 20:54:15 +03:00
ce017e2cbc pmt: move source in to src 2024-04-25 22:35:32 +03:00
b5daf8a44c pmt: move source in to src 2024-04-25 22:35:01 +03:00
f125ae760c pmt: move source in to src 2024-04-25 22:34:31 +03:00
f68f92ade1 pmt: move source in to src 2024-04-25 22:34:04 +03:00
3a723446cc pmt: move source in to src 2024-04-25 22:33:40 +03:00
1d66a3c21f pmt: move source in to src 2024-04-25 22:32:34 +03:00
13e31df7c6 pmt: move source in to src 2024-04-25 22:31:52 +03:00
4922ed5a35 pmt: move source in to src 2024-04-25 22:31:12 +03:00
3220aace91 pmt: move source in to src 2024-04-25 22:30:40 +03:00
7f85d63088 pmt: initial 1.8.0 update 2024-04-25 22:09:03 +03:00
412b697b9c pmt: initial 1.8.0 update 2024-04-25 22:08:30 +03:00
afc958aeb4 pmt: initial 1.8.0 update 2024-04-25 22:07:45 +03:00
fbd45e0936 pmt: initial 1.8.0 update 2024-04-25 22:07:05 +03:00
0ef8767eb5 pmt: initial 1.8.0 update 2024-04-25 22:06:31 +03:00
9bc871573e pmt: initial 1.8.0 update 2024-04-25 22:05:58 +03:00
adad63bbbd pmt: initial 1.8.0 update 2024-04-25 22:05:12 +03:00
0157c886ae pmt: initial 1.8.0 update 2024-04-25 22:04:33 +03:00
076774d9f4 pmt: initial 1.8.0 update 2024-04-25 22:04:00 +03:00
25642cc6f2 pmt: initial 1.8.0 update 2024-04-25 22:02:58 +03:00
16c8654fa2 pmt: initial 1.8.0 update 2024-04-25 22:02:04 +03:00
1fb592a94f pmt: initial 1.8.0 update 2024-04-25 22:01:14 +03:00
5bb26c9eea pmt: initial 1.8.0 update 2024-04-25 21:59:54 +03:00
540dd4fe35 pmt: initial 1.8.0 update 2024-04-25 21:59:06 +03:00
22ef985925 pmt: initial 1.8.0 update 2024-04-25 21:58:42 +03:00
2e81ab9541 pmt: initial 1.8.0 update 2024-04-25 21:57:50 +03:00
112a2986b5 pmt: initial 1.8.0 update 2024-04-25 21:56:59 +03:00
65fd480ba2 pmt: initial 1.8.0 update 2024-04-25 21:56:37 +03:00
d31bccd8f6 pmt: initial 1.8.0 update 2024-04-25 21:56:05 +03:00
6c574e9536 pmt: initial 1.8.0 update 2024-04-25 21:55:09 +03:00
a4838b24e1 pmt: initial 1.8.0 update 2024-04-25 21:54:10 +03:00
908060219e pmt: initial 1.8.0 update 2024-04-25 21:50:04 +03:00
ac06203a2c pmt: initial 1.8.0 update 2024-04-25 21:49:07 +03:00
56976b2bd0 pmt: initial 1.8.0 update 2024-04-25 21:48:43 +03:00
26 changed files with 1272 additions and 684 deletions

View File

@@ -1,9 +1,9 @@
#### Version 1.7.0 (code 170):
- Force mode added
- Compatibility with C++ compilers ensured
- Code integrity fixed
- Exit codes have meanings. Review the code to understand
#### 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
| END OF VERSION 1.7.0 CHANGELOG |
| END OF VERSION 1.9.0 CHANGELOG |
|------------------------------------|

261
Makefile
View File

@@ -1,6 +1,6 @@
# By YZBruh
# Copyright 2024 YZBruh - Partition Backupper
# 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.
@@ -15,118 +15,197 @@
# 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
# speficy {version}
VERSION := 1.7.0
VERSION_CODE := 170
SOURCE_DIR := binary
TARGET := pmt
LANG := en
ARCH := $(shell uname -m)
CUR_DIR := $(shell pwd)
# sources
SRCS := $(SOURCE_DIR)/$(TARGET).c
SRCS += $(SOURCE_DIR)/error.c
SRCS += $(SOURCE_DIR)/checkers.c
SRCS += $(SOURCE_DIR)/listpart.c
SRCS += $(SOURCE_DIR)/flash.c
SRCS += $(SOURCE_DIR)/backup.c
SRCS += $(SOURCE_DIR)/docs.c
# objects
OBJS := $(SOURCE_DIR)/$(TARGET).o
OBJS += $(SOURCE_DIR)/error.o
OBJS += $(SOURCE_DIR)/checkers.o
OBJS += $(SOURCE_DIR)/listpart.o
OBJS += $(SOURCE_DIR)/flash.o
OBJS += $(SOURCE_DIR)/backup.o
OBJS += $(SOURCE_DIR)/docs.o
OUT_DIR := $(CUR_DIR)/out
BINARY_DIR := $(OUT_DIR)/binary
PACKAGE_DIR := $(OUT_DIR)/package
# display
# start build (if no custom target)
.PHONY: all
all:
@printf " --- Building Partition Manager --- \n"; \
printf "Version: $(VERSION)\n"; \
printf "Version code: $(VERSION_CODE)\n\n"; \
printf " ------------------------------------- \n\n"; \
printf "Starting build... Please waith.\n"; \
@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; \
printf "Make running with silent mode...\n"; \
make -s pmt;
# build progress
.PHONY: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $@ $(OBJS)
@mkdir -p $(OUT_DIR); \
$(CC) $(CFLAGS) -o $(TARGET) $(SRCS) || exit 1; \
mkdir -p $(OUT_DIR); \
mkdir -p $(BINARY_DIR); \
mkdir -p $(PACKAGE_DIR); \
mv pmt $(BINARY_DIR); \
printf "Generating gzip package...\n"; \
cp $(BINARY_DIR)/pmt $(PACKAGE_DIR); \
gzip -f $(PACKAGE_DIR)/pmt; \
mv $(PACKAGE_DIR)/pmt.gz $(PACKAGE_DIR)/pmt-$(ARCH)-$(LANG).gz; \
printf " \n"; \
printf " ------------------------------------- \n";
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 (builded files [.o extended])...\n"; \
sleep 2; \
rm -rf $(OBJS); \
printf "Success\n";
.PHONY: clean-all
clean-all:
@printf "Cleaning (builded files [.o extended] and binary)...\n"; \
sleep 2; \
rm -rf $(OBJS) $(OUT_DIR); \
@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 " ------- Partition Manager help -------\n"; \
printf " \n"; \
printf " Commands;\n"; \
printf " make ==> Build Partition Manager\n"; \
printf " make clean ==> Clear files (Builded binaries are not deleted)\n"; \
printf " make clean-all ==> Clear files (Builded binaries are deleted)\n"; \
printf " make install-termux ==> 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-termux ==> If you are using termux, it uninstalls the compiled pmt into termux.\n"; \
printf " make help ==> Display help message\n"; \
printf " \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-termux
install-termux:
@if [ -f /data/data/com.termux/files/usr/bin/termux-open ]; then \
printf " ------------------------------------- \n"; \
printf " pmt installer \n"; \
printf " ------------------------------------- \n"; \
cp $(BINARY_DIR)/pmt /data/data/com.termux/files/usr/bin/pmt || exit 1; \
chmod 777 /data/data/com.termux/files/usr/bin/pmt || exit 1; \
printf " \n"; \
printf "Success.\n\n"; \
.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 \
printf "This function is only available on Termux Android devices using aarch64 (64-bit) and armv7l (32-bit)\n"; \
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-termux
uninstall-termux:
@if [ -f /data/data/com.termux/files/usr/bin/termux-open ]; then \
printf " ------------------------------------- \n"; \
printf " pmt uninstaller \n"; \
printf " ------------------------------------- \n"; \
rm /data/data/com.termux/files/usr/bin/pmt || exit 1; \
printf " \n"; \
printf "Success.\n\n"; \
.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 "This function is only available on Termux Android devices using aarch64 (64-bit) and armv7l (32-bit)\n"; \
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

2
NOTICE
View File

@@ -1,4 +1,4 @@
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.

View File

@@ -1,12 +1,12 @@
## Partition Manager (pmt)
This binary static C library is for manage partitions of android devices.
This binary C is for manage partitions of android devices.
It offers a lot of options. I will place these below. But first let me talk about the operation...
```
1. The partition name is obtained (with the -p or --partition argument)
2. Other arguments (if used) are processed.
3. It is backed up using DD. If the progress is not a problem, it is not given (DD)
3. The backup and flashing processes were written according to DD's code. So there is a piece of toybox code
```
#### Presented arguments (options)
@@ -15,6 +15,7 @@ It offers a lot of options. I will place these below. But first let me talk abou
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)
@@ -40,11 +41,20 @@ Report bugs to <yagizzengin73@gmail.com>
- 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.7.0-en/CHANGELOG.md)
- [Click to see special version changes](https://github.com/YZBruh/pbt/blob/1.9.0-en/CHANGELOG.md)
- Let me know your suggestions!
### How is it built?
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.
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):
```
pmt android-ndk other-directories
```
- The directory structure was thought exactly like this. Be careful.
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.
@@ -54,17 +64,15 @@ To build;
make
```
Special `make` commands (pbt offers :) ;
Special `make` commands (pmt offers :) ;
```
--------- Partition Manager help ---------
------- Partition Manager help -------
Commands;
make ==> Build Partition Manager
make clean ==> Clear files (Builded binaries are not deleted)
make clean-all ==> Clear files (Builded binaries are deleted)
make install-termux ==> 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-termux ==> If you are using termux, it uninstalls the compiled pmt into termux.
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.0.2` You can look at the version with the viewing option :)

View File

@@ -1,109 +0,0 @@
/* 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.
*/
#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 *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 */

View File

@@ -1,86 +0,0 @@
/* 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.
*/
#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 */

View File

@@ -1,306 +0,0 @@
/* 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.
*/
#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 <getopt.h>
#include <errno.h>
#include "include/pmt.h"
char *out = NULL;
char *outdir = NULL;
char *cust_cxt = NULL;
char *target_partition = NULL;
char *target_flash_file = 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_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'},
{"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}
};
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:p:lo:d:c:DfvL", long_options, NULL)) != -1) {
/* process arguments */
switch (opt) {
case 'b':
pmt_backup = true;
break;
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;
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;
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;
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;
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;
case 'd':
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;
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;
case 'D':
check_root();
listpart();
exit(EXIT_SUCCESS);
break;
case 'f':
pmt_force_mode = true;
break;
case 'v':
printf("Version: %s (code %s)\n", PMT_VERSION, PMT_VERSION_CODE);
#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");
#endif
printf("See licenses with -L argument.\n");
exit(EXIT_SUCCESS);
break;
case 0:
help();
exit(EXIT_SUCCESS);
break;
case 'L':
licenses();
exit(EXIT_SUCCESS);
break;
case '?':
printf("Try `%s --help' for more information.\n", argv[0]);
exit(43);
break;
default:
printf("Usage: %s [-b | --backup] [-f | --flash FILE] [-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);
}
}
/* minor checks */
if (!pmt_backup && !pmt_flash) {
fprintf(stderr, "%s: missing operand.\nTry `%s --help` for more information.\n", argv[0], argv[0]);
exit(3);
}
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();
/* 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) {
printf("%sThis custom context is strange...%s\n", ANSI_YELLOW, ANSI_RESET);
}
}
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 {
if (pmt_backup) {
if (pmt_use_logical) {
backup(target_partition, "logical");
exit(EXIT_SUCCESS);
} else {
backup(target_partition, "classic");
exit(EXIT_SUCCESS);
}
} else if (pmt_flash) {
if (pmt_use_logical) {
flash(target_partition, target_flash_file, "logical");
exit(EXIT_SUCCESS);
} else {
flash(target_partition, target_flash_file, "classic");
exit(EXIT_SUCCESS);
}
} 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 */

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 :=

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.
@@ -22,15 +22,14 @@
# #
#########################################
# use custom gcc | true or false
USE_CUST_GCC := false
# custom gcc ext (if used)
CUST_GCC :=
# addionital gcc flags
EXTRA_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
#########################################
#########################################
@@ -43,19 +42,12 @@ EXTRA_GCC_FLAGS :=
# #
#########################################
# 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))
# 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
# gcc flag settings
CFLAGS := -O3 -g -Wall -Wextra $(EXTRA_GCC_FLAGS)
#########################################
#########################################

23
config/ndk.sh Normal file
View File

@@ -0,0 +1,23 @@
#!/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.
if [ ! -d ../android-ndk ]; then
printf "warning; ndk directory not found. And the current configuration may create problems...\n\n"
fi
# end of script

24
config/source.mk Normal file
View File

@@ -0,0 +1,24 @@
# 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 := \
$(wildcard $(SOURCE_DIR)/*.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...
# end

64
config/vars.mk Normal file
View File

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

View File

@@ -0,0 +1,10 @@
Source: pmt
Package: pmt
Version: 1.9.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

View File

@@ -0,0 +1,10 @@
Source: pmt
Package: pmt
Version: 1.9.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

View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1 @@

25
debutils/mandoc/pmt.1 Normal file
View File

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

View File

@@ -1,7 +1,7 @@
/* 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.
@@ -21,10 +21,12 @@ 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"
@@ -38,34 +40,42 @@ extern char *cust_cxt;
/* check parts */
void check_psf()
{
struct stat abinf;
/* true = ab | false = a */
if (pmt_use_cust_cxt) {
if (pmt_use_cust_cxt)
{
static char cust_cxt_ck_path[150];
sprintf(cust_cxt_ck_path, "%s/boot_a", cust_cxt);
if (access(cust_cxt_ck_path, F_OK) != 0) {
if (stat(cust_cxt_ck_path, &abinf) != 0)
{
pmt_ab = false;
} else {
pmt_ab = true;
}
} else {
if (access("/dev/block/by-name/boot_a", F_OK) != 0) {
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) {
if (pmt_use_cust_cxt)
{
static char cust_cxt_ckl_path[150];
sprintf(cust_cxt_ckl_path, "%s/super", cust_cxt);
if (access(cust_cxt_ckl_path, F_OK) != 0) {
if (stat(cust_cxt_ckl_path, &logcinf) != 0)
{
pmt_logical = false;
} else {
pmt_logical = true;
}
} else {
if (access("/dev/block/by-name/super", F_OK) != 0) {
if (stat("/dev/block/by-name/super", &logcinf) != 0)
{
pmt_logical = false;
} else {
pmt_logical = true;
@@ -77,8 +87,10 @@ void check_psf()
void check_root()
{
/* a quick, easy method to verify root :D */
if (chdir("/dev/block") != 0) {
if (!pmt_force_mode) {
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 {

View File

@@ -1,7 +1,7 @@
/* 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.
@@ -21,13 +21,14 @@ extern "C" {
#endif
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include "include/pmt.h"
void licenses()
{
printf("Copyright 2024 YZBruh - Partition Manager\n");
printf("Copyright 2024 Partition Manager\n");
printf("Licensed under the Apache License, Version 2.0 (the \"License\");\n");
printf("you may not use this file except in compliance with the License.\n");
printf("You may obtain a copy of the License at\n\n");
@@ -43,6 +44,7 @@ void help()
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");
@@ -57,7 +59,7 @@ void help()
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 <xda-@YZBruh>\n");
printf("Report bugs to <yagizzengin73@gmail.com>\n");
}
#ifdef __cplusplus

View File

@@ -1,7 +1,7 @@
/* 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.
@@ -21,6 +21,7 @@ extern "C" {
#endif
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>

View File

@@ -1,7 +1,7 @@
/* 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.
@@ -20,20 +20,8 @@
extern "C" {
#endif
/* check compiler system */
#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
/* compiler architecture if arm is not 32-bit or 64-bit, the compilation is stopped */
#if ! defined __arm__ || __aarch64__ || __aarch32__ || __armv8__ || __armv7l__
#error "only 32-bit or 64-bit arm compilers can be used"
#endif
#ifndef _COMMON_H_
#define _COMMON_H_
#ifndef _PMT_H
#define _PMT_H
/* color definations */
#define ANSI_RED "\033[31m"
@@ -42,8 +30,8 @@ extern "C" {
#define ANSI_RESET "\033[0m"
/* info */
#define PMT_VERSION "1.7.0"
#define PMT_VERSION_CODE "170"
#define PMT_VERSION "1.9.0"
#define PMT_VERSION_CODE "190"
#define PMT_PACKAGE_NAME "Partition Manager"
#define PMT_PACKAGE_LANG "en"
@@ -53,12 +41,15 @@ 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 bool pmt_use_logical;
extern bool pmt_use_cust_cxt;
extern bool pmt_ab;
extern bool pmt_logical;
extern bool pmt_flash;
extern bool pmt_backup;
extern bool pmt_format;
extern bool pmt_force_mode;
/* function definations */
@@ -66,14 +57,15 @@ void listpart();
void error(const char *err_msg, uint32_t errcode);
void check_psf();
void check_root();
void backup(char *target_backup_partition, char *backup_partition_style);
void flash(char *target_flash_partition, char *target_file, char *flash_partition_style);
void pmt(short progress_code);
void version();
void help();
void licenses();
#endif
#endif /* _PMT_H */
#ifdef __cplusplus
}
#endif
/* end of code */

View File

@@ -1,7 +1,7 @@
/* 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.
@@ -21,11 +21,13 @@ extern "C" {
#endif
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#include <errno.h>
#include <dirent.h>
#include <string.h>
#include "include/pmt.h"
@@ -40,9 +42,11 @@ void listpart() {
DIR *dir;
struct dirent *entry;
if (pmt_use_cust_cxt) {
if (pmt_use_cust_cxt)
{
dir = opendir(cust_cxt);
if (dir == NULL) {
if (dir == NULL)
{
if (!pmt_force_mode) {
fprintf(stderr, "Could not open: `%s`. Error reason: %s\n", cust_cxt, strerror(errno));
exit(62);
@@ -52,8 +56,10 @@ void listpart() {
}
} else {
dir = opendir("/dev/block/by-name");
if (dir == NULL) {
if (!pmt_force_mode) {
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 {
@@ -68,18 +74,22 @@ void listpart() {
closedir(dir);
if (pmt_logical) {
if (pmt_logical)
{
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)
{
error("An error occurred when the logical partition list appears!\n", 64);
}
}
if (pmt_ab && !pmt_force_mode) {
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) {
if (pmt_logical && !pmt_force_mode)
{
printf("%sWarning: device using logical partition type.%s\n", ANSI_YELLOW, ANSI_RESET);
}
}

443
src/pmt.c Normal file
View File

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

332
src/tools.c Normal 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.
*/
#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 */

58
src/versioner.c Normal file
View File

@@ -0,0 +1,58 @@
/* 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 <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include "include/pmt.h"
void version()
{
printf("Version: %s (code %s) ", PMT_VERSION, PMT_VERSION_CODE);
#if __SIZEOF_POINTER__ == 4
printf("32-bit binary\n");
#elif __SIZEOF_POINTER__ == 8
printf("64-bit binary\n");
#else
printf("\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");
#endif
printf("See licenses with -L argument.\n");
}
#ifdef __cplusplus
}
#endif
/* end of code */