Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7ff6ed41ff | |||
| 87a5823422 | |||
| 7db10feabc |
@@ -1,9 +0,0 @@
|
||||
#### 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.9.0 CHANGELOG |
|
||||
|------------------------------------|
|
||||
262
Makefile
262
Makefile
@@ -1,6 +1,8 @@
|
||||
include mka/config.mk
|
||||
|
||||
# By YZBruh
|
||||
|
||||
# Copyright 2024 Partition Manager
|
||||
# Copyright 2024 YZBruh - Partition Backupper
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
@@ -14,198 +16,98 @@
|
||||
# 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
|
||||
# speficy
|
||||
VERSION := 1.4.0
|
||||
VERSION_CODE := 140
|
||||
SOURCE_DIR := binary
|
||||
TARGET := pbt
|
||||
ARCH := $(shell uname -m)
|
||||
|
||||
# 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"; \
|
||||
# code list
|
||||
OBJS= $(SOURCE_DIR)/pbt.o
|
||||
SRCS := $(SOURCE_DIR)/pbt.c
|
||||
|
||||
# gcc flags
|
||||
LDFLAGS :=
|
||||
LDLIBS := -lm
|
||||
|
||||
# display
|
||||
all:
|
||||
@printf " --- Building Partition Backupper --- \n"; \
|
||||
printf "Version: $(VERSION)\n"; \
|
||||
printf "Version code: $(VERSION_CODE)\n"; \
|
||||
printf " \n"; \
|
||||
printf " ------------------------------------- \n"; \
|
||||
printf " \n"; \
|
||||
printf "Starting build... 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";
|
||||
printf "Make running with silent mode...\n"; \
|
||||
make -s pbt;
|
||||
|
||||
# build progress
|
||||
.PHONY: $(TARGET)
|
||||
$(TARGET): $(OBJS)
|
||||
$(LD) -o $@ $(LDFLAGS) $(OBJS) $(LIBS)
|
||||
@mkdir -p out; \
|
||||
mkdir -p out/binary; \
|
||||
mkdir -p out/package; \
|
||||
mv pbt out/binary; \
|
||||
printf "Generating gzip package...\n"; \
|
||||
cp out/binary/pbt out/package; \
|
||||
gzip -f out/package/pbt; \
|
||||
mv out/package/pbt.gz out/package/pbt_$(ARCH).gz; \
|
||||
printf " \n"; \
|
||||
printf " ------------------------------------- \n";
|
||||
|
||||
# cleaner functions
|
||||
.PHONY: clean
|
||||
clean:
|
||||
@printf "Cleaning with rm force mode (builded binary)...\n"; \
|
||||
sleep 1; \
|
||||
rm -rf $(OUT_DIR); \
|
||||
@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; \
|
||||
printf "Success\n";
|
||||
|
||||
# helper function
|
||||
.PHONY: help
|
||||
help:
|
||||
@printf " ------- Partition Manager help -------\n"; \
|
||||
@printf " --------- Partition Backupper 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";
|
||||
printf " make ==> Build Partition Backupper\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 pbt into termux. So it allows you to use it like a normal command.\n"; \
|
||||
printf " make help ==> Display help message\n"; \
|
||||
printf " \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; \
|
||||
.PHONY: install-termux
|
||||
install-termux:
|
||||
@arch=$$(uname -m); \
|
||||
if [ "$$arch" = "aarch64" ]; then \
|
||||
printf " ------------------------------------- \n"; \
|
||||
printf " pbt installer \n"; \
|
||||
printf " ------------------------------------- \n"; \
|
||||
cp out/binary/pbt /data/data/com.termux/files/usr/bin/pbt; \
|
||||
chmod 777 /data/data/com.termux/files/usr/bin/pbt; \
|
||||
printf " \n"; \
|
||||
printf "Success.\n"; \
|
||||
printf " \n"; \
|
||||
elif [ "$$arch" = "armv7l" ]; then \
|
||||
printf " ------------------------------------- \n"; \
|
||||
printf " ptb installer \n"; \
|
||||
printf " ------------------------------------- \n"; \
|
||||
cp out/pbt /data/data/com.termux/files/usr/bin/pbt; \
|
||||
chmod 777 /data/data/com.termux/files/usr/bin/pbt; \
|
||||
printf " \n"; \
|
||||
printf "Success.\n"; \
|
||||
printf " \n"; \
|
||||
else \
|
||||
printf " - This function is only available on Termux.\n"; \
|
||||
printf "This function is only available on Termux Android devices using aarch64 (64-bit) and armv7l (32-bit)\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
|
||||
|
||||
4
NOTICE
4
NOTICE
@@ -1,4 +1,4 @@
|
||||
Copyright 2024 Partition Manager
|
||||
Copyright 2024 YZBruh - Partition Backupper
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
@@ -10,4 +10,4 @@ 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.
|
||||
limitations under the License.
|
||||
76
README.md
76
README.md
@@ -1,78 +1,68 @@
|
||||
## Partition Manager (pmt)
|
||||
## Partition Backupper (pbt)
|
||||
|
||||
This binary C is for manage partitions of android devices.
|
||||
This binary static C library is for backing up 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
|
||||
3. It is backed up using DD. If the progress is not a problem, it is not given (DD)
|
||||
```
|
||||
|
||||
#### 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)
|
||||
-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
|
||||
Usage (arguments):
|
||||
-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 the output name of the backed-up partition (default: partition name)
|
||||
-d, --outdir 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
|
||||
-v, --version see version
|
||||
-h, --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
|
||||
Example 1:
|
||||
-p boot_a -o boot_slot_a_image -d /sdcard/backup -c /dev/block/platform/bootdevice/by-name
|
||||
|
||||
Example 2:
|
||||
-c /dev/block/platform/bootdevice/by-name --list
|
||||
|
||||
Report bugs to <yagizzengin73@gmail.com>
|
||||
Report bugs to <xda-@YZBruh>
|
||||
```
|
||||
|
||||
For example, if we want to back up the `boot_a` partition: `pbt -p boot_a` (edit the command if it has a different name).
|
||||
|
||||
#### 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)
|
||||
- it is mandatory to use the `-p` | `--partition` argument. After all, a partition name is required to be backed up.
|
||||
- If the logical partition flag is not used, a classic partition is tried to be backed up by default.
|
||||
- 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):
|
||||
|
||||
```
|
||||
pmt android-ndk other-directories
|
||||
```
|
||||
|
||||
- The directory structure was thought exactly like this. Be careful.
|
||||
Even termux is enough to build the pbt. Or you can compile it with linux if you want. NOTE: Use a custom gcc according to the architecture you want to compile.
|
||||
|
||||
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.
|
||||
it is located in the `mka` folder. His name is `config.mk`. I gave the information in the file. You can ask more.
|
||||
|
||||
To build;
|
||||
```
|
||||
make
|
||||
```
|
||||
|
||||
Special `make` commands (pmt offers :) ;
|
||||
Special `make` commands (pbt offers :) ;
|
||||
```
|
||||
------- Partition Manager help -------
|
||||
--------- Partition Backupper 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
|
||||
make ==> Build Partition Backupper
|
||||
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 pbt 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 17.0.6`. You can look at the version with the viewing option :)
|
||||
|
||||
54
binary/include/documentation.h
Normal file
54
binary/include/documentation.h
Normal file
@@ -0,0 +1,54 @@
|
||||
#ifndef _DOCUMENTATION_H_
|
||||
#define _DOCUMENTATION_H_
|
||||
|
||||
/* By YZBruh */
|
||||
|
||||
/*
|
||||
* Copyright 2024 YZBruh - Partition Backupper
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
void licenses() {
|
||||
printf("Copyright 2024 YZBruh - Partition Backupper\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");
|
||||
printf(" http://www.apache.org/licenses/LICENSE-2.0\n\n");
|
||||
printf("Unless required by applicable law or agreed to in writing, software\n");
|
||||
printf("distributed under the License is distributed on an \"AS IS\" BASIS,\n");
|
||||
printf("WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n");
|
||||
printf("See the License for the specific language governing permissions and limitations under the License.\n");
|
||||
}
|
||||
|
||||
void help() {
|
||||
printf("Usage (arguments): \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 the output name of the backed-up partition (default: partition name)\n");
|
||||
printf(" -d, --outdir directory where the backup partition will be saved (default: /storage/emulated/0)\n");
|
||||
printf(" -c, --context it is meant to specify a custom /dev context. Only classic partitions (default: /dev/block/by-name)\n");
|
||||
printf(" -D, --list list partitions\n");
|
||||
printf(" -v, --version see version\n");
|
||||
printf(" -h, --help see help message\n");
|
||||
printf(" -L, --license see license\n\n");
|
||||
printf("Example 1:\n");
|
||||
printf(" -p boot_a -o boot_slot_a_image -d /sdcard/backup -c /dev/block/platform/bootdevice/by-name\n\n");
|
||||
printf("Example 2:\n");
|
||||
printf(" -c /dev/block/platform/bootdevice/by-name --list\n\n");
|
||||
printf("Report bugs to <xda-@YZBruh>\n");
|
||||
}
|
||||
|
||||
/* end of code */
|
||||
|
||||
#endif
|
||||
166
binary/include/pbt.h
Normal file
166
binary/include/pbt.h
Normal file
@@ -0,0 +1,166 @@
|
||||
#ifndef _PBT_H_
|
||||
#define _PBT_H_
|
||||
|
||||
/* By YZBruh */
|
||||
|
||||
/*
|
||||
* Copyright 2024 YZBruh - Partition Packupper
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/* add pre-function important */
|
||||
char *out;
|
||||
char *outdir;
|
||||
char *my_out;
|
||||
char *cust_cxt;
|
||||
bool use_cust_cxt = false;
|
||||
bool pbt_ab = false;
|
||||
bool pbt_logical = false;
|
||||
|
||||
/* shorter error messages will be functional xd */
|
||||
void error(const char *err_msg) {
|
||||
fprintf(stderr, ANSI_RED "%s" ANSI_RESET, err_msg);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* check if the device is ab partitioned */
|
||||
void check_psf() {
|
||||
/* true = ab | false = a */
|
||||
if (use_cust_cxt) {
|
||||
char cust_cxt_ckpath[150];
|
||||
sprintf(cust_cxt_ckpath, "%s/boot_a", cust_cxt);
|
||||
if (access(cust_cxt_ckpath, F_OK) != 0) {
|
||||
pbt_ab = false;
|
||||
} else {
|
||||
pbt_ab = true;
|
||||
}
|
||||
} else {
|
||||
if (access("/dev/block/by-name/boot_a", F_OK) != 0) {
|
||||
pbt_ab = false;
|
||||
} else {
|
||||
pbt_ab = true;
|
||||
}
|
||||
}
|
||||
|
||||
/* true = logical | false = classic */
|
||||
if (use_cust_cxt) {
|
||||
char cust_cxt_cklpath[150];
|
||||
sprintf(cust_cxt_cklpath, "%s/super", cust_cxt);
|
||||
if (access(cust_cxt_cklpath, F_OK) != 0) {
|
||||
pbt_logical = false;
|
||||
} else {
|
||||
pbt_logical = true;
|
||||
}
|
||||
} else {
|
||||
if (access("/dev/block/by-name/super", F_OK) != 0) {
|
||||
pbt_logical = false;
|
||||
} else {
|
||||
pbt_logical = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* list existing partitions */
|
||||
void listpart() {
|
||||
if (use_cust_cxt) {
|
||||
printf("List of classic partitions (%s): \n", cust_cxt);
|
||||
char cust_cxt_path[150];
|
||||
sprintf(cust_cxt_path, "ls %s", cust_cxt);
|
||||
if (system(cust_cxt_path) != 0) {
|
||||
error("An error occurred when the partition list appears!\n");
|
||||
}
|
||||
} else {
|
||||
printf("List of classic partitions (/dev/block/by-name): \n");
|
||||
if (system("ls /dev/block/by-name") != 0) {
|
||||
error("An error occurred when the classic partition list appears!\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (pbt_logical) {
|
||||
printf("List of logical partitions (/dev/block/mapper): \n");
|
||||
if (system("ls /dev/block/mapper") != 0) {
|
||||
error("An error occurred when the logical partition list appears!\n");
|
||||
}
|
||||
}
|
||||
if (pbt_ab) {
|
||||
printf("%sWarning: device using A/B partition style.%s\n", ANSI_YELLOW, ANSI_RESET);
|
||||
}
|
||||
if (pbt_logical) {
|
||||
printf("%sWarning: device using logical partition type.%s\n", ANSI_YELLOW, ANSI_RESET);
|
||||
}
|
||||
}
|
||||
|
||||
/* additional function to perform backup */
|
||||
void backup(char *target_pt, char *pst) {
|
||||
char path[200];
|
||||
if (strstr(pst, "classic") != NULL) {
|
||||
if (use_cust_cxt) {
|
||||
sprintf(path, "%s/%s", cust_cxt, target_pt);
|
||||
} else {
|
||||
sprintf(path, "/dev/block/by-name/%s", target_pt);
|
||||
}
|
||||
} else if (strstr(pst, "logical") != NULL) {
|
||||
sprintf(path, "/dev/block/mapper/%s", target_pt);
|
||||
} else {
|
||||
error("İnvalid partition type!\n");
|
||||
}
|
||||
if (access(path, F_OK) == -1) {
|
||||
error("Partition not found!\n");
|
||||
} else {
|
||||
printf("Target partition: %s\nBackupping...\n", target_pt);
|
||||
}
|
||||
char cmd[256];
|
||||
if (my_out != NULL) {
|
||||
if (out != NULL) {
|
||||
sprintf(cmd, "dd if=%s of=%s/%s.img status=none", path, my_out, out);
|
||||
} else {
|
||||
sprintf(cmd, "dd if=%s of=%s/%s.img status=none", path, my_out, target_pt);
|
||||
}
|
||||
} else {
|
||||
if (out != NULL) {
|
||||
sprintf(cmd, "dd if=%s of=/storage/emulated/0/%s.img status=none", path, out);
|
||||
} else {
|
||||
sprintf(cmd, "dd if=%s of=/storage/emulated/0/%s.img status=none", path, target_pt);
|
||||
}
|
||||
}
|
||||
if (system(cmd) != 0) {
|
||||
error("Failed!\n");
|
||||
} else {
|
||||
if (my_out != NULL) {
|
||||
if (out != NULL) {
|
||||
printf("%sSuccess. Output: %s/%s.img%s\n", ANSI_GREEN, my_out, out, ANSI_RESET);
|
||||
} else {
|
||||
printf("%sSuccess. Output: %s/%s.img%s\n", ANSI_GREEN, my_out, target_pt, 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_pt, ANSI_RESET);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* root checker function */
|
||||
void verify_root() {
|
||||
// a quick, easy method to verify root :D
|
||||
if (chdir("/dev/block") != 0) {
|
||||
error("Root privileges could not be detected! Please run this binary with root.\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* end of code */
|
||||
|
||||
#endif
|
||||
173
binary/pbt.c
Normal file
173
binary/pbt.c
Normal file
@@ -0,0 +1,173 @@
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/stat.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
#include <getopt.h>
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#define ANSI_RED "\033[31m"
|
||||
#define ANSI_YELLOW "\033[33m"
|
||||
#define ANSI_GREEN "\033[32m"
|
||||
#define ANSI_RESET "\033[0m"
|
||||
|
||||
#define PACK_VER "1.4.0"
|
||||
#define PACK_VER_CODE "140"
|
||||
#define PACK_NAME "Partition Backupper"
|
||||
#define PACK_LANG "en"
|
||||
|
||||
#include "include/pbt.h"
|
||||
#include "include/documentation.h"
|
||||
|
||||
/* By YZBruh */
|
||||
|
||||
/*
|
||||
* Copyright 2024 YZBruh - Partition Backupper
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/* classic main function (C binary here xd) */
|
||||
int main(int argc, char *argv[]) {
|
||||
# ifdef __aarch64__
|
||||
/* empty */
|
||||
# elif __armv8l__
|
||||
/* empty */
|
||||
# elif __aarch32__
|
||||
/* empty */
|
||||
# elif __armv7l__
|
||||
/* empty */
|
||||
# else
|
||||
error("Incompatible architecture was detected. This binary works with only arm (32-bit or 64-bit).\n");
|
||||
# endif
|
||||
/* a structure for long arguments... */
|
||||
struct option long_options[] = {
|
||||
{"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'},
|
||||
{"version", no_argument, 0, 'v'},
|
||||
{"help", no_argument, 0, 'h'},
|
||||
{"license", no_argument, 0, 'L'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
char *argx_target_p;
|
||||
bool use_argx_p = false;
|
||||
bool use_logical = false;
|
||||
int opt;
|
||||
/* control for each argument */
|
||||
while ((opt = getopt_long(argc, argv, "p:lo:d:c:DvhL", long_options, NULL)) != -1) {
|
||||
/* process arguments */
|
||||
switch (opt) {
|
||||
case 'p':
|
||||
argx_target_p = strdup(optarg);
|
||||
use_argx_p = true;
|
||||
break;
|
||||
case 'l':
|
||||
verify_root();
|
||||
check_psf();
|
||||
if (pbt_logical) {
|
||||
use_logical = true;
|
||||
} else {
|
||||
error("This device does not have logical partitions!\n");
|
||||
}
|
||||
break;
|
||||
case 'o':
|
||||
out = strdup(optarg);
|
||||
break;
|
||||
case 'd':
|
||||
verify_root();
|
||||
check_psf();
|
||||
outdir = strdup(optarg);
|
||||
struct stat out_info;
|
||||
if (stat(outdir, &out_info) != 0) {
|
||||
fprintf(stderr, "%s: %s: no such file or directory.\n", argv[0], outdir);
|
||||
exit(EXIT_FAILURE);
|
||||
} else {
|
||||
if (S_ISDIR(out_info.st_mode)) {
|
||||
my_out = outdir;
|
||||
} else {
|
||||
fprintf(stderr, "%s: %s: is a not directory.\n", argv[0], outdir);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'c':
|
||||
use_cust_cxt = true;
|
||||
cust_cxt = strdup(optarg);
|
||||
break;
|
||||
case 'D':
|
||||
listpart();
|
||||
exit(EXIT_SUCCESS);
|
||||
break;
|
||||
case 'v':
|
||||
printf("Version: %s (code %s)\n", PACK_VER, PACK_VER_CODE);
|
||||
# ifdef __clang__
|
||||
printf("Compiled by clang version %s\n", __clang_version__);
|
||||
# endif
|
||||
printf("See licenses with -L argument.\n");
|
||||
exit(EXIT_SUCCESS);
|
||||
break;
|
||||
case 'h':
|
||||
help();
|
||||
exit(EXIT_SUCCESS);
|
||||
break;
|
||||
case 'L':
|
||||
licenses();
|
||||
exit(EXIT_SUCCESS);
|
||||
break;
|
||||
case '?':
|
||||
printf("Try `%s --help' for more information.\n", argv[0]);
|
||||
exit(EXIT_FAILURE);
|
||||
break;
|
||||
default:
|
||||
printf("Usage: %s -p, --partition PARTITION [-l, --logical] [-o, --out] [-d, --outdir] [-D, --list] [-v, --version] [-h, --help] [-L, --license]\n", argv[0]);
|
||||
}
|
||||
}
|
||||
verify_root();
|
||||
check_psf();
|
||||
/* custom context checker */
|
||||
if (use_cust_cxt) {
|
||||
struct stat cxtinfo;
|
||||
printf("Checking custom context path...\n");
|
||||
if (stat(cust_cxt, &cxtinfo) == 0) {
|
||||
if (S_ISDIR(cxtinfo.st_mode)) {
|
||||
/* empty */
|
||||
} else {
|
||||
fprintf(stderr, "%s: %s: is a not directory.\n", argv[0], cust_cxt);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
} else {
|
||||
error("The specified context was not found!\n");
|
||||
}
|
||||
if (strstr(cust_cxt, "/dev") != 0) {
|
||||
printf("%sThis custom context is strange...%s", ANSI_YELLOW, ANSI_RESET);
|
||||
}
|
||||
}
|
||||
if (use_argx_p) {
|
||||
if (use_logical) {
|
||||
backup(argx_target_p, "logical");
|
||||
} else {
|
||||
backup(argx_target_p, "classic");
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr, "%s: required partition name.\nTry `%s --help' for more information.\n", argv[0], argv[0]);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
/* end of code */
|
||||
@@ -1 +0,0 @@
|
||||
INSTALL_SUCCESS :=
|
||||
@@ -1 +0,0 @@
|
||||
UNINSTALL_SUCCESS :=
|
||||
@@ -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
|
||||
|
||||
#########################################
|
||||
#########################################
|
||||
@@ -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
|
||||
@@ -1,10 +0,0 @@
|
||||
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
|
||||
@@ -1,10 +0,0 @@
|
||||
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
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# By YZBruh
|
||||
|
||||
# Copyright 2024 YZBruh - Partition Manager
|
||||
# Copyright 2024 YZBruh - Partition Backupper
|
||||
#
|
||||
# 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,16 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
# sources
|
||||
SRCS := \
|
||||
$(wildcard $(SOURCE_DIR)/*.c)
|
||||
# gcc setting
|
||||
ifeq ($(USE_CUST_GCC), true)
|
||||
CC := $(CUST_GCC)
|
||||
LD := $(CUST_GCC)
|
||||
else
|
||||
CC := gcc
|
||||
LD := gcc
|
||||
endif
|
||||
|
||||
# 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...
|
||||
# gcc flag settings
|
||||
CFLAGS := -O3 -g -Wno-unused-parameter -Wall -Wextra -static $(EXTRA_GCC_FLAGS)
|
||||
|
||||
# end
|
||||
# end of code
|
||||
@@ -1,8 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
# By YZBruh
|
||||
|
||||
# Copyright 2024 Partition Manager
|
||||
# Copyright 2024 YZBruh - Partition Backupper
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
@@ -16,8 +14,16 @@
|
||||
# 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
|
||||
# use custom gcc | true or false
|
||||
USE_CUST_GCC := false
|
||||
|
||||
# end of script
|
||||
# custom gcc ext (if used)
|
||||
CUST_GCC :=
|
||||
|
||||
# addionital gcc flags
|
||||
EXTRA_GCC_FLAGS :=
|
||||
|
||||
# apply configration
|
||||
include mka/apply-config.mk
|
||||
|
||||
# end of config
|
||||
106
src/checkers.c
106
src/checkers.c
@@ -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 */
|
||||
69
src/docs.c
69
src/docs.c
@@ -1,69 +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 <stdbool.h>
|
||||
|
||||
#include "include/pmt.h"
|
||||
|
||||
void licenses()
|
||||
{
|
||||
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");
|
||||
printf(" http://www.apache.org/licenses/LICENSE-2.0\n\n");
|
||||
printf("Unless required by applicable law or agreed to in writing, software\n");
|
||||
printf("distributed under the License is distributed on an \"AS IS\" BASIS,\n");
|
||||
printf("WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n");
|
||||
printf("See the License for the specific language governing permissions and limitations under the License.\n");
|
||||
}
|
||||
|
||||
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");
|
||||
printf(" -d | --outdir (only backups) directory where the backup partition will be saved (default: /storage/emulated/0)\n");
|
||||
printf(" -c | --context it is meant to specify a custom /dev context. Only classic partitions (default: /dev/block/by-name)\n");
|
||||
printf(" -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(" -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");
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/* end of code */
|
||||
41
src/error.c
41
src/error.c
@@ -1,41 +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 <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "include/pmt.h"
|
||||
|
||||
/* shorter error messages will be functional xd */
|
||||
void error(const char *err_msg, uint32_t errcode)
|
||||
{
|
||||
fprintf(stderr, ANSI_RED "%s" ANSI_RESET, err_msg);
|
||||
exit(errcode);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/* end of code */
|
||||
@@ -1,71 +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
|
||||
|
||||
#ifndef _PMT_H
|
||||
#define _PMT_H
|
||||
|
||||
/* color 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 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 */
|
||||
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();
|
||||
|
||||
#endif /* _PMT_H */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/* end of code */
|
||||
101
src/listpart.c
101
src/listpart.c
@@ -1,101 +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 <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <stdbool.h>
|
||||
#include <errno.h>
|
||||
#include <dirent.h>
|
||||
#include <string.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;
|
||||
|
||||
/* list existing partitions */
|
||||
void listpart() {
|
||||
DIR *dir;
|
||||
struct dirent *entry;
|
||||
|
||||
if (pmt_use_cust_cxt)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
} 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while ((entry = readdir(dir)) != NULL) {
|
||||
printf("%s\n", entry->d_name);
|
||||
}
|
||||
|
||||
closedir(dir);
|
||||
|
||||
if (pmt_logical)
|
||||
{
|
||||
printf("List of logical partitions (/dev/block/mapper): \n");
|
||||
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)
|
||||
{
|
||||
printf("%sWarning: device using A/B partition style.%s\n", ANSI_YELLOW, ANSI_RESET);
|
||||
}
|
||||
|
||||
if (pmt_logical && !pmt_force_mode)
|
||||
{
|
||||
printf("%sWarning: device using logical partition type.%s\n", ANSI_YELLOW, ANSI_RESET);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/* end of code */
|
||||
443
src/pmt.c
443
src/pmt.c
@@ -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 */
|
||||
332
src/tools.c
332
src/tools.c
@@ -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 */
|
||||
@@ -1,58 +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 <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 */
|
||||
Reference in New Issue
Block a user