217 Commits

Author SHA1 Message Date
19b8d74498 pmt: fix wrong translations 2024-07-14 08:18:19 +03:00
57403a0196 pmt: generate build config for workflows (soon) 2024-07-11 17:46:18 +03:00
d591c760e1 pmt: Create comments and text appropriate for the ShawkTeam repository 2024-07-11 16:07:07 +03:00
ec6148b0d9 f*** C 2024-07-10 14:35:30 +03:00
f7bbe2ba15 pmt: languages: en: fix typos 2024-07-10 14:33:48 +03:00
c9453ef968 Merge pull request #1 from r0manas-dev/patch-1
pmt: fix bad English translations
2024-07-10 01:47:07 +03:00
7943fa312c pmt: fix broken syntax 2024-07-10 01:45:30 +03:00
3fb873199b Update ADD-LANGUAGES.md 2024-07-10 01:40:14 +03:00
chakra
c6163bc752 Update languages.c 2024-07-09 15:26:38 -07:00
chakra
30f1a84f13 Update languages.c 2024-07-09 15:22:11 -07:00
4607f565af Update README.md 2024-07-09 21:27:56 +03:00
2edc502bbf pmt: ADD-LANGUAGES 2024-07-09 21:26:40 +03:00
fd15d460f6 pmt.c: cleanup unnecessary code and fix wrong log text
pmt: cleanup

pmt: cleanup
2024-07-09 20:38:17 +03:00
fe752d7505 pmt: First statement about supported languages 2024-07-09 19:38:45 +03:00
464027fd1c Create CHANGELOG.md 2024-07-09 19:33:29 +03:00
99b45da4a7 pmt: README: add new comments as needed 2024-07-09 19:30:52 +03:00
284bb42faa pmt: README: fix wrong text 2024-07-09 19:28:41 +03:00
964d9b5426 pmt: initial 2.4.0 update 2024-07-09 19:26:18 +03:00
4dd49c2509 pmt: fix some 2.3.0 missing: makefile 2024-07-04 14:58:08 +03:00
934d1b0112 pmt: fix some 2.3.0 missings 2024-07-04 14:57:06 +03:00
32ac3a3dd6 pmt: initial 2.3.0 update
Delete jni/Makefile
2024-06-28 00:44:34 +03:00
fc02df6583 pmt: Fix FORTIFY problems 2024-06-17 11:41:55 +03:00
deb42c9ff5 Update README.md 2024-06-17 10:57:12 +03:00
60904a4b2f Update install-termux.sh 2024-06-17 00:37:35 +03:00
ad6115f51b Update install-termux.sh 2024-06-17 00:30:59 +03:00
6cc59d92f8 Update install-termux.sh 2024-06-17 00:28:42 +03:00
fe69408eb5 Update install-termux.sh 2024-06-17 00:26:37 +03:00
cd386ac6f9 Update install-termux.sh 2024-06-17 00:22:37 +03:00
268aa8ac77 Update install-termux.sh 2024-06-17 00:21:57 +03:00
c5746fe14b Update install-termux.sh 2024-06-17 00:17:11 +03:00
d2cb68df5e Update install-termux.sh 2024-06-17 00:13:30 +03:00
3976e0fb39 Update install-termux.sh 2024-06-17 00:08:01 +03:00
0a9e164b9c Update install-termux.sh 2024-06-17 00:07:00 +03:00
ecada5f076 Update install-termux.sh 2024-06-17 00:06:28 +03:00
ca09bb94e1 Update install-termux.sh 2024-06-17 00:03:18 +03:00
52ffe99d4b Update install-termux.sh 2024-06-17 00:00:54 +03:00
416939634a pmt: fix syntax 2024-06-17 00:00:24 +03:00
cbbd36899e Update README.md 2024-06-16 23:58:10 +03:00
9dc79ae923 Update install-termux.sh 2024-06-16 23:57:15 +03:00
b522dcc62b Update install-termux.sh 2024-06-16 23:56:35 +03:00
7aeea39e41 Update README.md 2024-06-16 23:56:01 +03:00
974774eb3e pmt: add quick installer 2024-06-16 23:51:02 +03:00
70ce307e50 readme: create a general file alignment table 2024-06-16 08:44:01 +03:00
99ecb9daf3 Make some corrections. 2024-06-10 06:28:01 +03:00
d0a7b2d16f Update CHANGELOG.md 2024-06-04 18:07:35 +03:00
96336bcd0b Update README.md 2024-06-04 17:59:20 +03:00
545376afb2 Initial 2.1.0 update 2024-06-04 17:55:15 +03:00
62b24d5705 Update docs.c 2024-05-26 17:08:18 +03:00
0fca319b29 Update README.md 2024-05-26 17:07:56 +03:00
929150e034 pmt: delete unnecessary files 2024-05-26 11:31:46 +03:00
93843a511d fix typo 2024-05-26 11:30:57 +03:00
0981e70268 pmt: edit changelog 2024-05-26 11:30:03 +03:00
b214da3cd6 pmt: fix missing explanation 2024-05-26 11:24:41 +03:00
464bfe6e56 pmt: Update build guide 2024-05-26 11:23:54 +03:00
f5531fde32 pmt: initial 2.0.0 update 2024-05-26 10:49:33 +03:00
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
b7ebb92fcd Update CHANGELOG.md 2024-04-25 21:44:08 +03:00
3b36e1309d pmt: Specify that bugs should be reported by email 2024-04-17 17:59:31 +03:00
8dbc54f9fc pmt: build system: update help message 2024-04-13 22:30:29 +03:00
4b4b53a080 pmt: update explanation 2024-04-13 22:29:36 +03:00
09d9aa1ee6 pmt: exclude unnecessary library 2024-04-13 22:26:21 +03:00
171de34710 pmt: exclude unnecessary library 2024-04-13 22:25:54 +03:00
5e39fdcdc9 pmt: add arm defination controller 2024-04-10 01:02:06 +03:00
fbb4822872 Update pmt.h 2024-04-10 00:53:45 +03:00
711319cce0 Update pmt.h 2024-04-10 00:51:39 +03:00
6dbf7acf3c Update pmt.h 2024-04-10 00:48:11 +03:00
287c75aa67 Rename env.mk to env.mk 2024-04-10 00:41:29 +03:00
1835ecc1e0 pmt: apply version 1.7.0 changes 2024-04-09 23:55:55 +03:00
8afbb2314c pmt: apply version 1.7.0 changes 2024-04-09 23:54:53 +03:00
283346f522 Delete binary/include/documentation.h 2024-04-09 23:54:15 +03:00
c46a65607b pmt: apply version 1.7.0 changes 2024-04-09 23:54:01 +03:00
dd6c1c9faf pmt: apply version 1.7.0 changes 2024-04-09 23:53:27 +03:00
6ab211c1b3 pmt: apply version 1.7.0 changes 2024-04-09 23:47:19 +03:00
372563fceb pmt: apply version 1.7.0 changes 2024-04-09 23:46:45 +03:00
0b34fdbfd9 pmt: apply version 1.7.0 changes 2024-04-09 23:46:15 +03:00
a2aee5c5e8 pmt: apply version 1.7.0 changes 2024-04-09 23:45:38 +03:00
d3d6bfd244 pmt: apply version 1.7.0 changes 2024-04-09 23:32:06 +03:00
97edfbc133 pmt: apply version 1.7.0 changes 2024-04-09 23:31:14 +03:00
b5d4c76b2d pmt: apply version 1.7.0 changes 2024-04-09 23:30:35 +03:00
39b1e67f8e Delete mka/apply-config.mk 2024-04-09 23:29:28 +03:00
1ffd0f90be pmt: apply version 1.7.0 changes 2024-04-09 23:28:21 +03:00
b8a8b7ff8f pmt: apply version 1.7.0 changes 2024-04-09 23:26:20 +03:00
848412e1cd pmt: apply version 1.7.0 changes 2024-04-09 23:24:53 +03:00
8034ed897c Fix changelog link 2024-03-12 20:03:43 +03:00
c8c0687519 pmt: improve build system 2024-03-11 22:34:21 +03:00
c82a127e43 pmt: update err message 2024-03-06 22:50:42 +03:00
6378f8300b Update README.md 2024-03-06 20:47:07 +03:00
80b22ee9c7 pmt: initial 1.5.0 update 2024-03-06 20:39:48 +03:00
e770a80d2a pmt: initial 1.5.0 update 2024-03-06 20:39:18 +03:00
9cd749708d pmt: initial 1.5.0 update 2024-03-06 20:31:17 +03:00
39a5098f71 pmt: initial 1.5.0 update 2024-03-06 20:30:50 +03:00
d7c4ec5236 pmt: initial 1.5.0 update 2024-03-06 20:29:49 +03:00
651c49c3d9 pmt: initial 1.5.0 update 2024-03-06 20:29:15 +03:00
c88c529d2c pmt: initial 1.5.0 update 2024-03-06 20:28:11 +03:00
2d23f45387 pmt: initial 1.5.0 update 2024-03-06 20:26:56 +03:00
67d4c86dfd pmt: initial 1.5.0 update 2024-03-06 20:26:25 +03:00
682e7657fd pmt: initial 1.5.0 update 2024-03-06 20:26:05 +03:00
c91cb25c65 pmt: initial 1.5.0 update 2024-03-06 20:25:30 +03:00
d91f9279cc pmt: initial 1.5.0 update 2024-03-06 20:23:44 +03:00
099e9d2ba6 pmt: initial 1.5.0 update 2024-03-06 20:23:09 +03:00
56638ab00e pmt: initial 1.5.0 update 2024-03-06 20:22:35 +03:00
7fd5e1768e pmt: initial 1.5.0 update 2024-03-06 20:21:50 +03:00
b045bf9b87 Add headers 2024-03-04 23:57:56 +03:00
a5ded6a26e pbt: upgrade to 1.5.0 2024-03-04 23:54:36 +03:00
48bc47c1e2 Clean 2024-03-04 23:36:27 +03:00
bbf4ff76cb pbt: add some funcs 2024-03-04 23:32:02 +03:00
9260b35ae6 Update common.h 2024-03-04 23:28:25 +03:00
6064ba2ee1 pbt: update binary 2024-03-04 23:23:27 +03:00
21e7daac0f pbt: add global variables, macros 2024-03-04 23:17:13 +03:00
ddbbffff6b pbt: Let's make a change... 2024-03-04 23:01:50 +03:00
aaf0bc6660 pbt: add banner 2024-03-04 22:51:31 +03:00
d536844f1c pbt: add banner 2024-03-04 22:51:13 +03:00
7dd8694da1 pbt: add banner 2024-03-04 22:49:40 +03:00
ac6d22e58d tb8765ap1_bsp: add banner 2024-03-04 22:49:06 +03:00
189f3078ae tb8765ap1_bsp: change syntax and add banner 2024-03-04 22:48:26 +03:00
9acb17bd10 pbt: update the version and add a new feature 2024-03-04 22:43:54 +03:00
a7da00190f pbt: upgrade version info 2024-03-04 22:41:54 +03:00
36 changed files with 2499 additions and 582 deletions

24
.github/build.config vendored Normal file
View File

@@ -0,0 +1,24 @@
#
# Build config for pmt workflows
#
# 2.4.0 config
#
# Version
export BUILD_VERSION="2.4.0"
# Relese tag
export BUILD_RELTAG="240"
# Target architures
export BUILD_ARCH="arm64-v8a, armeabi-v7a"
# NDK environ for getting clang version
export NDK="/home/workdir/android-ndk"
export TC="${NDK}/toolchains/llvm/prebuilt/linux-x86_64"
export TARGET_TEMPLATE="aarch64-linux-android"
export API_TEMPLATE="21"
export NDK_CLANG="${TC}/bin/${TARGET_TEMPLATE}${API}-clang"
# get version
export CLANG_VERSION=$(${NDK_CLANG} --version | head -n 1)

136
ADD-LANGUAGES.md Normal file
View File

@@ -0,0 +1,136 @@
### Add a new language to pmt (guide)
On this page, I will tell you how to add languages to pmt. This is not a difficult thing :)
##### Send ready stuff
- Send ready translations via pull requests. After making the necessary checks, if there is no problem, I will accept it.
- Proper commit messages are required.
- If there is an error, I will mention it in the pull request comments.
- Once you accept it, I (YZBruh) will implement the rest of the necessary things.
- It may take 5 days for me to notice :P
##### Little important notes
- You don't have to be a professional to do this thing.
- There will be only one place you need to pay attention to, I will explain it.
- There is no need to know C.
- You can edit existing translations.
- You may need ready pmt to understand some things.
- If you are on an x86 PC, you can compile and use it, but the functions will never work.
##### Understanding general logic
All the texts (strings) in pmt are like variables in bash. I mean:
```
Bash
export missing_operand="missing operand."
APPLYING:
~ $ echo -n "$missing_operand\n" # for more detail I used the -n argument
missing operand
~ $
C / C++
const char* _Nonnull missing_operand = "missing operand.";
const std::string missing_operand = "missing operand.";
APPLYING (C / C++):
printf("%s\n", missing_operand); // Move to new line with '\n' character
std::cout << missing_operand << std::endl; // Move to new line with std::endl
```
For example, let's take the output directly in pmt without any arguments and process the variables and structures behind the work.
```
Shell
~ $ pmt
pmt: missing operand
Try `pmt --help' for more information.
~ $
Code pieces (C)
struct pmt_langdb_general en = {
// other translations
.missing_operand = "missing operand";
.try_h = "Try";
.for_more = "for more information";
// other translations
}
// pmt code functions [ logging ]
LOGE("%s\n%s `%s --help' %s.\n, missing_operand, try_h, argv[0], for_more); // LOGE is error logger (pmt). argv[0] = execution name
```
In short, there are variables for texts. And I made these dynamic by using [struct](https://chatgpt.com/share/a798b57c-7e29-4b17-8887-f230414e57bd) method in C. You just need to add translation :)
##### Translating main program texts (relevant part)
- Let's open our jni/languages.c source file.
- Now, let's create the translation with the ready-made struct structure (see jni/include/pmt-stringkeys.h for the structure).
```
// main
struct pmt_langdb_general <LANGUAGE_PREFIX> = { // LANGUAGE_PREFIX must be the corresponding abbreviation of the language in English. For example, it's like en in English.
// translations
}
// example
struct pmt_langdb_general en = {
// translation
}
```
- We need to add some information about the language.
```
struct pmt_langdb_general <LANGUAGE_PREFIX> = {
.lang_by_s = // Names of those who made the translation. It's up to you. Do you use & between more than one person?
.language = // Language name. For example English
.lang_prefix = // Language prefix. For example en
// other translations
}
// example
struct pmt_langdb_general en = {
.lang_by_s = "YZBruh";
.language = "English";
.lang_prefix = "en";
// other translations
}
// CRITIC WARNING: Do not add ';' to the end of the last translation text. But others always
```
- Now do the others :)
- Now let me explain the documentation...
##### Document texts translation (relevant part)
- Let's open our jni/languages.c source file.
- Now, let's create the translation with the ready-made struct structure (see jni/include/pmt-stringkeys.h for the structure).
```
struct pmt_langdb_docs <LANGUAGE_PREFIX>_docs = {
// translations
}
// example
struct pmt_langdb_docs en_docs = {
// translations
}
```
- Make translations by taking examples from existing ones. And definitely do it regularly by getting help message from pmt :D
##### General things to do in translation
- Open jni/languages.c
- Go down a bit...
```
char* pmt_langdb_langs[] = {
"en",
"tr"
};
// Add the language you are translating into these existing language prefixes. I will fix the errors here (if there is an error)
int pmt_langdb_total = <NUM>; // add one to the existing one and write (replacing with existing)
int pmt_langdb_ctrl = <NUM>; // add one to the existing one and write (replacing with existing)
```
##### Notes
- Apologies for the crappy current language control structure :(
- You can ask your questions: <t.me/YZBruh>

7
CHANGELOG.md Normal file
View File

@@ -0,0 +1,7 @@
### Version 2.4.0 (code 240) changelog
- Logging type has been changed.
- More understandable syntax.
- And one or two more things but I don't remember :P
| END OF VERSION 2.4.0 CHANGELOG |
|------------------------------------|

4
DISCLAIMER Normal file → Executable file
View File

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

4
LANGUAGES.md Normal file
View File

@@ -0,0 +1,4 @@
### Supported languages
- Türkçe (Turkish) (TR)
- English (EN)

0
LICENSE Normal file → Executable file
View File

113
Makefile
View File

@@ -1,113 +0,0 @@
include mka/config.mk
# 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.
# speficy
VERSION := 1.4.0
VERSION_CODE := 140
SOURCE_DIR := binary
TARGET := pbt
ARCH := $(shell uname -m)
# 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; \
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 (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 Backupper help ---------\n"; \
printf " \n"; \
printf " Commands;\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";
.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 Android devices using aarch64 (64-bit) and armv7l (32-bit)\n"; \
fi

2
NOTICE Normal file → Executable file
View File

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

123
README.md Normal file → Executable file
View File

@@ -1,68 +1,93 @@
## Partition Backupper (pbt)
## Partition Manager (pmt)
This binary static C library is for backing up 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)
```
#### Presented arguments (options)
```
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
Usage: pmt [OPTIONS] backup PARTITION [OUTPUT] [OPTIONS]...
or: pmt [OPTIONS] flash FILE PARTITION [OPTIONS]...
or: pmt [OPTIONS] format FILE_SYSTEM[ext/2/3/4] PARTITION [OPTIONS]...
Example 1:
-p boot_a -o boot_slot_a_image -d /sdcard/backup -c /dev/block/platform/bootdevice/by-name
Options:
-l, --logical It is meant to determine whether the target partition is logical.
-c, --context It is meant to specify a custom /dev context. Only classic partitions (default: /dev/block/by-name).
-p, --list List partitions.
-s, --silent Information and warning messages are silenced in normal work.
-f, --force Force mode. Some things are ignored.
-S, --set-lang Set current language.
-v, --version See version.
--help See this help message.
-L, --license See license.
Example 2:
-c /dev/block/platform/bootdevice/by-name --list
Examples:
pmt backup boot_a -c /dev/block/platform/bootdevice/by-name
pmt flash /sdcard/twrp/boot.img boot_a -c /dev/block/platform/bootdevice/by-name
pmt format ext4 system_a --logical
pmt -c /dev/block/platform/bootdevice/by-name --list
Report bugs to <xda-@YZBruh>
Report bugs to <t.me / ShawkTeam | Community / Topics -- pmt>
```
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
- pmt supports multiple languages. [See languages.](https://github.com/ShawkTeam/pmt/blob/2.4.0/LANGUAGES.md)
- [Add language.](https://github.com/ShawkTeam/pmt/blob/2.4.0/ADD-LANGUAGES.md)
- Feel free to ask any questions you want.
- Packages are available in publications.
- 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!
- 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/ShawkTeam/pmt/blob/2.4.0/CHANGELOG.md)
- We are always open to your suggestions and support (developing)!
### How is it built?
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.
Android NDK is required to build.
- [Download](https://developer.android.com/ndk/downloads) and extract the NDK package.
- Clone this repository. And get access to it.
```
git clone https://github.com/ShawkTeam/pmt -b 2.4.0
cd pmt
```
- Set the NDK working directory variable.
```
export NDK_PROJECT_PATH=$(pwd)
```
- Go to the NDK directory and start the construction
```
./ndk-build
```
- The output files will be inside the `pmt` folder. Binaries are available in two architectures within the `libs` folder. `arm64-v8a` (64-bit) and `armeabi-v7a` (32-bit).
```
pmt/
|
________________|________________
| | | |
jni/ debutils/ obj/ libs/
|
__________|__________
| |
arm64-v8a/ armeabi-v7a/
| |
pmt pmt
```
- For the make installable debian package make-deb.sh use the script. It can be created within two architectures. Use the script flags correctly: arm64-v8a, armeabi-v7a. If you want to process with root, add sudo as the second argument. If you don't want, use no-sudo or leave it blank
```
--Usage--
./make-deb.sh [arm64-v8a, armeabi-v7a] [sudo, no-sudo, <blank>]
```
```
chmod 777 utils.sh
# for making 64-bit package
./utils.sh make-deb arm64-v8a
# for making 32-bit package
./utils.sh make-deb armeabi-v7a
```
### Notes
If you want to change something, take a look at the configuration. You can change him.
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 (pbt offers :) ;
```
--------- Partition Backupper help ---------
Commands;
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 :)
it is located in the `jni/config` folder. His name is `env.mk`. I gave the information in the file. You can ask more.

View File

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

View File

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

View File

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

9
debutils/DEBIAN/control_32 Executable file
View File

@@ -0,0 +1,9 @@
Source: pmt
Package: pmt
Version: 2.4.0
Architecture: arm
Description: pmt is for reading, writing and formatting partitions of android devices
Section: misc
Priority: optional
Maintainer: YZBruh <yagizzengin73@gmail.com>
Standards-Version: 4.5.0

9
debutils/DEBIAN/control_64 Executable file
View File

@@ -0,0 +1,9 @@
Source: pmt
Package: pmt
Version: 2.4.0
Architecture: aarch64
Description: pmt is for reading, writing and formatting partitions of android devices
Section: misc
Priority: optional
Maintainer: YZBruh <yagizzengin73@gmail.com>
Standards-Version: 4.5.0

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

Binary file not shown.

86
jni/Android.mk Executable file
View File

@@ -0,0 +1,86 @@
# By YZBruh | ShawkTeam
# Copyright 2024 Partition Manager
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
LOCAL_PATH := $(call my-dir)
include $(LOCAL_PATH)/config/env.mk
PMT_CFLAGS = -O3 -std=c11 -Wall $(EXTRA_COMPILER_FLAGS)
ifeq ($(ENABLE_DEBUGGING), true)
PMT_CFLAGS += -g -Wextra
else
$(warning Unknown debugging flag: $(ENABLE_DEBUGGING). Please see: src/config/env.mk. Using non-debugging flags)
endif
include $(CLEAR_VARS)
LOCAL_MODULE := libpmt_root
LOCAL_SRC_FILES := root.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_CFLAGS := $(PMT_CFLAGS)
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libpmt_debugging
LOCAL_SRC_FILES := debugging.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_CFLAGS := $(PMT_CFLAGS)
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libpmt_partitiontool
LOCAL_SRC_FILES := partitiontool.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_CFLAGS := $(PMT_CFLAGS)
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libpmt_list
LOCAL_SRC_FILES := listpart.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_CFLAGS := $(PMT_CFLAGS)
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := pmt
LOCAL_SRC_FILES := \
pmt.c \
versioner.c \
get_stat.c \
tools.c \
lang_tools.c \
languages.c \
docs.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_STATIC_LIBRARIES := \
libpmt_root \
libpmt_debugging \
libpmt_partitiontool \
libpmt_list
LOCAL_CFLAGS := $(PMT_CFLAGS)
include $(BUILD_EXECUTABLE)
# end

21
mka/config.mk → jni/Application.mk Normal file → Executable file
View File

@@ -1,6 +1,6 @@
# By YZBruh
# By YZBruh | ShawkTeam
# 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.
@@ -14,16 +14,13 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# use custom gcc | true or false
USE_CUST_GCC := false
# architecture
APP_ABI := \
arm64-v8a \
armeabi-v7a
# custom gcc ext (if used)
CUST_GCC :=
APP_PLATFORM := android-21
# addionital gcc flags
EXTRA_GCC_FLAGS :=
APP_OPTIM := release
# apply configration
include mka/apply-config.mk
# end of config
# end

26
mka/apply-config.mk → jni/config/env.mk Normal file → Executable file
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.
@@ -14,16 +14,18 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# gcc setting
ifeq ($(USE_CUST_GCC), true)
CC := $(CUST_GCC)
LD := $(CUST_GCC)
else
CC := gcc
LD := gcc
endif
#########################################
# #
# Configuration Flags #
# #
# Warning: you can edit #
# #
#########################################
# gcc flag settings
CFLAGS := -O3 -g -Wno-unused-parameter -Wall -Wextra -static $(EXTRA_GCC_FLAGS)
# addionital compiler flags
EXTRA_COMPILER_FLAGS ?=
# end of code
# debugging mode (binary)
ENABLE_DEBUGGING ?= false
# end of environment configuration

79
jni/debugging.c Executable file
View File

@@ -0,0 +1,79 @@
/* By YZBruh | ShawkTeam */
/**
* Copyright 2024 Partition Manager
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if defined(__cplusplus)
extern "C" {
#endif
#define INC_MAIN_LIBS
#include <pmt.h>
extern char* bin_name;
extern bool pmt_silent;
extern struct pmt_langdb_general* current;
extern struct pmt_langdb_general en;
extern struct pmt_langdb_general tr;
void debug(LogLevel status, const char* _Nullable fmt, ...)
{
if (fmt == NULL) exit(1);
va_list args;
va_start(args, fmt);
switch (status)
{
case LOG_LEVEL_ERR:
if (!pmt_silent)
{
fprintf(stderr, "%s: ", bin_name);
vfprintf(stderr, fmt, args);
}
exit(1);
break;
case LOG_LEVEL_WARN:
if (!pmt_silent)
{
fprintf(stderr, "%s: ", current->warn);
vfprintf(stderr, fmt, args);
}
break;
case LOG_LEVEL_FATAL:
if (!pmt_silent)
{
fprintf(stderr, "%s: ", current->fatal);
vfprintf(stderr, fmt, args);
}
abort();
break;
case LOG_LEVEL_DEBUG:
if (!pmt_silent)
vfprintf(stdout, fmt, args);
break;
}
va_end(args);
}
#if defined(__cplusplus)
}
#endif
/* end of code */

88
jni/docs.c Executable file
View File

@@ -0,0 +1,88 @@
/* By YZBruh | ShawkTeam */
/*
* Copyright 2024 Partition Manager
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if defined(__cplusplus)
extern "C" {
#endif
#define INC_MAIN_LIBS
#define INC_DOCS_REQS
#include <pmt.h>
extern char* bin_name;
extern char* pmt_langdb_langs_docs[];
struct pmt_langdb_docs* curr_docs = NULL;
extern struct pmt_langdb_docs en_docs;
extern struct pmt_langdb_docs tr_docs;
static void
prepare_langconf_docs(void)
{
static char* langctrl_str;
langctrl_str = loadlang();
if (strcmp(langctrl_str, "en") == 0)
curr_docs = &en_docs;
else if (strcmp(langctrl_str, "tr") == 0)
curr_docs = &tr_docs;
}
void licenses(void)
{
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(void)
{
prepare_langconf_docs();
printf("%s: %s %s\n", curr_docs->usage_docstr, bin_name, curr_docs->docs_strs_l1);
printf(" %s: %s %s\n", curr_docs->or_str, bin_name, curr_docs->docs_strs_l2);
printf(" %s: %s %s\n\n", curr_docs->or_str, bin_name, curr_docs->docs_strs_l3);
printf("%s: \n", curr_docs->docs_strs_l4);
printf(" -l, --logical %s\n", curr_docs->docs_strs_l5);
printf(" -c, --context %s\n", curr_docs->docs_strs_l6);
printf(" -p, --list %s\n", curr_docs->docs_strs_l7);
printf(" -s, --silent %s\n", curr_docs->docs_strs_l8);
printf(" -f, --force %s\n", curr_docs->docs_strs_l9);
printf(" -S, --set-lang %s\n", curr_docs->docs_strs_l10);
printf(" -v, --version %s\n", curr_docs->docs_strs_l11);
printf(" --help %s\n", curr_docs->docs_strs_l12);
printf(" -L, --license %s\n\n", curr_docs->docs_strs_l13);
printf("%s:\n", curr_docs->docs_strs_l14);
printf(" %s backup boot_a -c /dev/block/platform/bootdevice/by-name\n", bin_name);
printf(" %s flash /sdcard/twrp/boot.img boot_a -c /dev/block/platform/bootdevice/by-name\n", bin_name);
printf(" %s format ext4 system_a --logical\n", bin_name);
printf(" %s -c /dev/block/platform/bootdevice/by-name --list\n\n", bin_name);
printf("%s <t.me / ShawkTeam | Community / Topics -- pmt>\n", curr_docs->docs_strs_l15);
}
#if defined(__cplusplus)
}
#endif /* __cplusplus */
/* end of code */

78
jni/get_stat.c Executable file
View File

@@ -0,0 +1,78 @@
/* By YZBruh | ShawkTeam */
/**
* Copyright 2024 Partition Manager
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if defined(__cplusplus)
extern "C" {
#endif
#define INC_MAIN_LIBS
#define INC_STAT
#include <pmt.h>
/**
* The target file is controlled by the stat function.
* Files, directories, links and blocks (disks) are for.
* If it is never found, it returns 1 value.
* If he finds 0 value is returned.
* If the desired type is not in -1 value is returned.
*/
int get_stat(const char* _Nonnull filepath, const char* _Nonnull stype)
{
static struct stat get_stat;
if (stat(filepath, &get_stat) != 0)
return 1;
if (strcmp(stype, "dir") == 0)
{
if (S_ISDIR(get_stat.st_mode))
return 0;
else
return -1;
}
else if (strcmp(stype, "file") == 0)
{
if (S_ISREG(get_stat.st_mode))
return 0;
else
return -1;
}
else if (strcmp(stype, "blk") == 0)
{
if (S_ISBLK(get_stat.st_mode))
return 0;
else
return -1;
}
else if (strcmp(stype, "link") == 0)
{
if (S_ISLNK(get_stat.st_mode))
return 0;
else
return -1;
}
return 2;
}
#if defined(__cplusplus)
}
#endif
/* end of code */

26
jni/include/pmt-docs.h Executable file
View File

@@ -0,0 +1,26 @@
/* By YZBruh */
/*
* Copyright 2024 Partition Manager
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
__BEGIN_DECLS
void help(void);
void licenses(void);
__END_DECLS
/* end */

105
jni/include/pmt-stringkeys.h Executable file
View File

@@ -0,0 +1,105 @@
/* By YZBruh */
/**
* Copyright 2024 Partition Manager
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if !defined(__PMT_STRINGKEYS_)
#define __PMT_STRINGKEYS_
__BEGIN_DECLS
/* The struct is a very good option for setting the languages of texts etc. */
struct pmt_langdb_general {
const char* _Nonnull lang_by_s;
const char* _Nonnull language;
const char* _Nonnull lang_prefix;
const char* _Nonnull not_logical;
const char* _Nonnull not_file;
const char* _Nonnull not_dir;
const char* _Nonnull not_in_dev;
const char* _Nonnull not_open;
const char* _Nonnull not_block;
const char* _Nonnull not_read;
const char* _Nonnull not_write;
const char* _Nonnull not_gen;
const char* _Nonnull no_root;
const char* _Nonnull no_target;
const char* _Nonnull expected_backup_arg;
const char* _Nonnull expected_flash_arg;
const char* _Nonnull expected_format_arg;
const char* _Nonnull missing_operand;
const char* _Nonnull multiple_wiewers;
const char* _Nonnull common_symbol_rule;
const char* _Nonnull req_part_name;
const char* _Nonnull part_not_found;
const char* _Nonnull unsupported_fs;
const char* _Nonnull cannot_stat;
const char* _Nonnull ffile_more_part;
const char* _Nonnull cannot_get_bsz;
const char* _Nonnull format_fail;
const char* _Nonnull logical_warn;
const char* _Nonnull ab_warn;
const char* _Nonnull out_not_spec;
const char* _Nonnull please_rerun;
const char* _Nonnull part_disk_sz;
const char* _Nonnull flash_file_sz;
const char* _Nonnull part_disk_sz_fail;
const char* _Nonnull flash_file_sz_fail;
const char* _Nonnull list_of_dir;
const char* _Nonnull see_license;
const char* _Nonnull success_backup;
const char* _Nonnull success_flash;
const char* _Nonnull warn;
const char* _Nonnull fatal;
const char* _Nonnull switching_lang;
const char* _Nonnull welcome;
const char* _Nullable welcome_;
const char* _Nonnull for_more;
const char* _Nonnull try_h;
const char* _Nonnull usage_head;
const char* _Nonnull compiler_str;
const char* _Nonnull version_str;
const char* _Nonnull bin_str;
const char* _Nonnull unknw_str;
const char* _Nonnull by_str;
};
/* docs, licenses etc. */
struct pmt_langdb_docs {
const char* _Nonnull docs_strs_l1;
const char* _Nonnull docs_strs_l2;
const char* _Nonnull docs_strs_l3;
const char* _Nonnull docs_strs_l4;
const char* _Nonnull docs_strs_l5;
const char* _Nonnull docs_strs_l6;
const char* _Nonnull docs_strs_l7;
const char* _Nonnull docs_strs_l8;
const char* _Nonnull docs_strs_l9;
const char* _Nonnull docs_strs_l10;
const char* _Nonnull docs_strs_l11;
const char* _Nonnull docs_strs_l12;
const char* _Nonnull docs_strs_l13;
const char* _Nonnull docs_strs_l14;
const char* _Nonnull docs_strs_l15;
const char* _Nonnull or_str;
const char* _Nonnull usage_docstr;
};
__END_DECLS
#endif /* __PMT_STRINGKEYS_ */
/* end of code */

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

@@ -0,0 +1,42 @@
/* By YZBruh */
/*
* Copyright 2024 Partition Manager
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
__BEGIN_DECLS
#include <android/ndk-version.h>
#if __NDK_MINOR__ == 1
#define __NDK_MINOR_STATUS__ "b"
#else
#define __NDK_MINOR_STATUS__ ""
#endif
#if __NDK_BETA__ == 1 || __NDK_BETA__ == 2
#define __NDK_BETA_STATUS__ "beta"
#else
#define __NDK_BETA_STATUS__ ""
#endif
/* versioning */
#define PMT_MAJOR 2
#define PMT_MINOR 4
#define PMT_PATCHLEVEL 0
__END_DECLS
/* end */

127
jni/include/pmt.h Executable file
View File

@@ -0,0 +1,127 @@
/* By YZBruh */
/**
* Copyright 2024 Partition Manager
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <sys/cdefs.h>
__BEGIN_DECLS
#if !defined(__PMT_H_)
#define __PMT_H_
#define PMT_PACKAGE_NAME "Partition Manager"
#if defined(INC_MAIN_LIBS)
#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <pmt-stringkeys.h>
#endif
#if defined(INC_GETOPT)
#include <getopt.h>
#endif
#if defined(INC_DIRENT)
#include <dirent.h>
#endif
#if defined(INC_STAT)
#include <sys/stat.h>
#endif
#if defined(INC_DEBUGERS)
#include <errno.h>
#endif
#if defined(INC_PMT_LANGS)
#include <pmt-langs.h>
#endif
#if defined(INC_DOCS_REQS)
#include <pmt-docs.h>
#endif
#if defined(INC_VERSIONER_REQS)
#include <pmt-versioning.h>
#endif
#if defined(INC_TOOLS_REQS)
#include <fcntl.h>
#include <sys/statvfs.h>
#endif
/* variable definations */
extern char* _Nullable out;
extern char* _Nullable cust_cxt;
extern char* _Nullable target_partition;
extern char* _Nullable target_flash_file;
extern char* _Nullable format_fs;
extern char* _Nullable partition_type;
extern char* _Nullable bin_name;
extern bool pmt_use_logical;
extern bool pmt_use_cust_cxt;
extern bool pmt_ab;
extern bool pmt_logical;
extern bool pmt_silent;
extern bool pmt_flash;
extern bool pmt_backup;
extern bool pmt_format;
extern bool pmt_force_mode;
extern bool pmt_inst_on_termux;
/* language struces configurations */
extern struct pmt_langdb_general* _Nullable current;
extern struct pmt_langdb_docs* _Nullable curr_docs;
extern struct pmt_langdb_general en;
extern struct pmt_langdb_general tr;
extern struct pmt_langdb_docs en_docs;
extern struct pmt_langdb_docs tr_docs;
/* logging levels */
typedef enum {
LOG_LEVEL_FATAL,
LOG_LEVEL_ERR,
LOG_LEVEL_WARN,
LOG_LEVEL_DEBUG
} LogLevel;
/* function definations */
int listpart(void);
void check_dev_point(void);
void check_root(void);
int pmt(unsigned short progress_code);
void version(void);
void setlang(const char* _Nonnull lang);
int search_sls(void);
char* _Nonnull loadlang(void);
void debug(LogLevel status, const char* _Nullable fmt, ...);
/* logging macros */
#define LOGF(fmt, ...) debug(LOG_LEVEL_FATAL, fmt, ##__VA_ARGS__)
#define LOGE(fmt, ...) debug(LOG_LEVEL_ERR, fmt, ##__VA_ARGS__)
#define LOGW(fmt, ...) debug(LOG_LEVEL_WARN, fmt, ##__VA_ARGS__)
#define LOGD(fmt, ...) debug(LOG_LEVEL_DEBUG, fmt, ##__VA_ARGS__)
#endif
__END_DECLS
/* end of code */

220
jni/lang_tools.c Executable file
View File

@@ -0,0 +1,220 @@
/* By YZBruh | ShawkTeam */
/**
* Copyright 2024 Partition Manager
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if defined(__cplusplus)
extern "C" {
#endif
#define INC_MAIN_LIBS
#define INC_DEBUGERS
#define INC_STAT
#include <pmt.h>
/* pmt's man doc file path on termux */
#define TERMUX_PMT_MANDOC "/data/data/com.termux/files/usr/share/man/man8/pmt.8.gz"
/* language configuration paths */
/* for termux */
#define TERMUX_PMTLANG_CONF "/data/data/com.termux/files/usr/etc/pmtlang.conf"
/* for internal storage */
#define INTRNL_PMTLANG_CONF "/sdcard/.pmtlang.conf"
/* shortcuts to check that language is changed */
/* for termux */
#define TERMUX_PMT_SW_POINT "/data/data/com.termux/files/usr/etc/pmtlangsw"
/* for internal storage */
#define INTRNL_PMT_SW_POINT "/sdcard/.pmtlangsw"
extern bool pmt_inst_on_termux;
extern char* bin_name;
extern char* pmt_langdb_langs[];
extern int pmt_langdb_total;
extern int pmt_langdb_ctrl;
FILE *langconf;
static int
langctrl(const char* _Nonnull lang_)
{
if (strcmp(lang_, "en") == 0 || strcmp(lang_, "tr") == 0)
return 0;
return 1;
}
char* loadlang(void)
{
static char lang_fpr[10] = "en";
langconf = NULL;
if (get_stat(TERMUX_PMT_MANDOC, "file") == 0)
pmt_inst_on_termux = true;
if (pmt_inst_on_termux)
{
if (get_stat(TERMUX_PMTLANG_CONF, "file") == 0)
{
langconf = fopen(TERMUX_PMTLANG_CONF, "r+");
if (langconf == NULL)
{
langconf = fopen(TERMUX_PMTLANG_CONF, "w+");
if (langconf == NULL)
{
setlang("en");
return "en";
}
fclose(langconf);
}
else
{
while (fgets(lang_fpr, sizeof(lang_fpr), langconf) != NULL)
{
if (strcmp(lang_fpr, "en") == 0)
{
fclose(langconf);
return "en";
}
else if (strcmp(lang_fpr, "tr") == 0)
{
fclose(langconf);
return "tr";
}
}
fclose(langconf);
}
}
}
else
{
if (get_stat(INTRNL_PMTLANG_CONF, "file") == 0)
{
langconf = fopen(INTRNL_PMTLANG_CONF, "r");
if (langconf == NULL)
{
langconf = fopen(INTRNL_PMTLANG_CONF, "w+");
if (langconf == NULL)
{
setlang("en");
return "en";
}
fclose(langconf);
}
else
{
while (fgets(lang_fpr, sizeof(lang_fpr), langconf) != NULL)
{
if (strcmp(lang_fpr, "en") == 0)
{
fclose(langconf);
return "en";
}
else if (strcmp(lang_fpr, "tr") == 0)
{
fclose(langconf);
return "tr";
}
}
fclose(langconf);
}
}
else return "en";
}
return "en";
}
void setlang(const char* _Nonnull lang)
{
static char* lcf_path;
if (pmt_inst_on_termux)
lcf_path = TERMUX_PMTLANG_CONF;
else
lcf_path = INTRNL_PMTLANG_CONF;
if (get_stat(lcf_path, "file") == 0)
remove(lcf_path);
langconf = NULL;
if (pmt_inst_on_termux)
langconf = fopen(TERMUX_PMTLANG_CONF, "w");
else
langconf = fopen(INTRNL_PMTLANG_CONF, "w");
if (langconf == NULL)
LOGE("Failed!!! Cannot open/write config file.\n");
if (langctrl(lang) == 0)
{
if (fprintf(langconf, "%s", lang) < 2)
LOGE("Failed!!! Couldn't write config!\n");
else
fclose(langconf);
}
else
LOGE("Unknown language: %s.\n", lang);
static int status;
if (pmt_inst_on_termux)
{
status = open(TERMUX_PMT_SW_POINT, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (status == 0)
close(status);
}
else
{
status = open(INTRNL_PMT_SW_POINT, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (status == 0)
close(status);
}
}
int search_sls(void)
{
static char* sw_point_path;
if (pmt_inst_on_termux)
sw_point_path = TERMUX_PMT_SW_POINT;
else
sw_point_path = INTRNL_PMT_SW_POINT;
if (get(sw_point_path, "file") == 0)
{
remove(sw_point_path);
return 0;
}
else
return 1;
}
#if defined(__cplusplus)
}
#endif
/* end of code */

189
jni/languages.c Executable file
View File

@@ -0,0 +1,189 @@
/* By YZBruh | ShawkTeam */
/**
* Copyright 2024 Partition Manager
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if defined(__cplusplus)
extern "C" {
#endif
#define INC_MAIN_LIBS
#include <pmt.h>
struct pmt_langdb_general en = {
.lang_by_s = "YZBruh & r0manas",
.language = "English",
.lang_prefix = "en",
.not_logical = "This device does not have logical partitions!",
.not_file = "is not a file.",
.not_dir = "is not a directory.",
.not_in_dev = "Nothing found in /dev. Use force mode to avoid this error.",
.not_open = "Couldn't open",
.not_block = "The specified partition is not recognized as a block device.",
.not_read = "Couldn't read",
.not_write = "Couldn't write",
.not_gen = "Couldn't generate",
.no_root = "Root access could not be detected! Please run this with root permissions.",
.no_target = "No target specified (backup, flash, or format).",
.expected_backup_arg = "Expected backup argument 2 (1 of them are not mandatory), retrieved",
.expected_flash_arg = "Expected flash argument 2, retrieved",
.expected_format_arg = "Expected format argument 2, retrieved",
.missing_operand = "Missing operand",
.multiple_wiewers = "Multiple viewers can't be used on the same line.",
.common_symbol_rule = "When specifying arguments for an option, ensure they do not begin with '-'. Each argument must correspond correctly to its respective option.",
.req_part_name = "Partition name required.",
.part_not_found = "Partition not found!",
.unsupported_fs = "Formatter: unsupported filesystem",
.cannot_stat = "Can't retrieve file status",
.ffile_more_part = "Flash file size exceeds partition capacity.",
.cannot_get_bsz = "Failed to retrieve partition block size.",
.format_fail = "Formatting failed! There is a possibility of data damage.",
.logical_warn = "This device uses logical partitions.",
.ab_warn = "This device uses A/B partition style.",
.out_not_spec = "Output file name not specified. Using default name:",
.please_rerun = "Please rerun the command.",
.part_disk_sz = "Partition disk size",
.flash_file_sz = "Flash file size",
.part_disk_sz_fail = "Failed to retrieve partition disk size.",
.flash_file_sz_fail = "Failed to retrieve flash file size.",
.list_of_dir = "Directory listing",
.see_license = "View licenses using the -L argument.",
.success_backup = "Backup successful. Output:",
.success_flash = "Flash successful.",
.warn = "WARNING",
.fatal = "FATAL ERROR",
.switching_lang = "Switching language...",
.welcome = "language!",
.welcome_ = "Welcome to ",
.for_more = "for more information",
.try_h = "Try",
.usage_head = "Usage",
.compiler_str = "Compiler",
.version_str = "version",
.bin_str = "binary",
.unknw_str = "unknown",
.by_str = "By"
};
struct pmt_langdb_general tr = {
.lang_by_s = "YZBruh",
.language = "Türkçe",
.lang_prefix = "tr",
.not_logical = "Bu cihaz mantıksal (logical) bölümlere sahip değil!",
.not_file = "Bu bir dosya değil",
.not_dir = "Bu bir dizin değil",
.not_in_dev = "Bu bir şakamı? Bunun /dev dizini ile bi r ilgisi yok (içermiyor). Bu hatayla karşılaşmak istemiyorsanız zorlama (force) modu kullanın.",
.not_open = "ılamıyor",
.not_block = "Belirtilen bölüm bir blok değil. Yani aslında bu bir bölüm bile değil (disk). Bu hatayı almak için şanslı olmak gerek..!",
.not_read = "Veri okunamıyor",
.not_write = "Veri yazılamıyor",
.not_gen = "Oluşturulamıyor",
.no_root = "Root erişimi tespit edilemedi! Lütfen root erişimi ile çalıştırın.",
.no_target = "Hedef işlem yok (yedek, flaş veya format).",
.expected_backup_arg = "Beklenen yedekleme argümanı 2 (bir tanesi zorunlu değil), alınan",
.expected_flash_arg = "Beklenen flaş argümanı 2, alınan",
.expected_format_arg = "Beklenen format argümanı 2, alınan",
.missing_operand = "işlem belirtilmedi",
.multiple_wiewers = "Birden fazla görüntüleme işlemi yapan fonksiyonlar bir arada kullanılamaz. Aynı anda sadece bir tanesi kullanılabilir.",
.common_symbol_rule = "Bir seçeneğin argümanını verirken argüman önüne '-' sembolü getirilemez. Sembolü kaldırın ve tekrar deneyin.",
.req_part_name = "Bölüm adı gereklidir.",
.part_not_found = "Bölüm bulunamadı!",
.unsupported_fs = "Formatlayıcı: desteklenmeyen dosya sistemi:",
.cannot_stat = "Durumu tespit edilemedi",
.ffile_more_part = "Flaşlanacak dosyanın boyutu mevcut bölüm boyutundan fazla.",
.cannot_get_bsz = "Bölüm blok boyutu tespit edilemedi!",
.format_fail = "Formatlama başarısız oldu. Bazı şeyler zarar görmüş olabilir!",
.logical_warn = "Uyarı: bu cihaz mantıksal (logical) bölümlere sahip.",
.ab_warn = "Uyarı: bu cihazın bazı bölümleri A/B kullanıyor.",
.out_not_spec = "Uyarı: çıktı dosya belirtilmedi. Çıktı dosya adı bölüm adına göre belirlenecek.",
.please_rerun = "Lütfen yeniden çalıştırın",
.part_disk_sz = "Bölümün disk boyutu",
.flash_file_sz = "Flaşlanacak dosyanın boyutu",
.flash_file_sz_fail = "Uyarı: flaşlanacak dosyanın boyutu tespit edilemedi.",
.part_disk_sz_fail = "Uyarı: bölüm boyutunun boyutu tespit edilemedi.",
.list_of_dir = "Dizin içeriğinin listesi",
.see_license = "Lisansı -L seçeneği ile görüntüleyebilirsiniz.",
.success_backup = "Başarılı. Çıktı",
.success_flash = "Başarılı.",
.warn = "UYARI",
.fatal = "KRİTİK HATA",
.switching_lang = "Dil değiştiriliyor...",
.welcome = "diline hoş geldiniz!",
.welcome_ = NULL,
.for_more = "komutunu kullanabilirsiniz",
.try_h = "Daha fazla bilgi",
.usage_head = "Kullanımı",
.compiler_str = "Derleyici",
.version_str = "versiyon",
.bin_str = "yapı",
.unknw_str = "bilinmeyen",
.by_str = "Çeviriyi yapan(lar):"
};
struct pmt_langdb_docs en_docs = {
.docs_strs_l1 = "backup PARTITION [OUTPUT] [OPTIONS]...",
.docs_strs_l2 = "flash FILE PARTITION [OPTIONS]...",
.docs_strs_l3 = "format FILE_SYSTEM[ext/2/3/4] PARTITION [OPTIONS]...",
.docs_strs_l4 = "Options",
.docs_strs_l5 = "It is meant to determine whether the target partition is logical.",
.docs_strs_l6 = "It is meant to specify a custom /dev context. Only classic partitions (default: /dev/block/by-name).",
.docs_strs_l7 = "List partitions.",
.docs_strs_l8 = "Information and warning messages are silenced in normal work.",
.docs_strs_l9 = "Force mode. Some things are ignored.",
.docs_strs_l10 = "Set current language.",
.docs_strs_l11 = "See version.",
.docs_strs_l12 = "See this help message.",
.docs_strs_l13 = "See license.",
.docs_strs_l14 = "Examples",
.docs_strs_l15 = "Report bugs to",
.or_str = "or",
.usage_docstr = "Usage"
};
struct pmt_langdb_docs tr_docs = {
.docs_strs_l1 = "backup BÖLÜM [ÇIKTI] [SEÇENEKLER]...",
.docs_strs_l2 = "flash DOSYA BÖLÜM [SEÇENEKLER]...",
.docs_strs_l3 = "format DOSYA_SİSTEMİ[ext/2/3/4] BÖLÜM [SEÇENEKLER]...",
.docs_strs_l4 = "Seçenekler",
.docs_strs_l5 = "Bu seçeneği kullanarak mantıksal (logical) bir bölümle işlem yapılacağını belirtebilirsiniz.",
.docs_strs_l6 = "Bu seçeneği kullanarak özel /dev bağlamı belirtebilirsiniz. Sadece normal (mantıksal olmayan) bölümler içindir (Varsayılan: /dev/block/by-name).",
.docs_strs_l7 = "Bölümler listelenir.",
.docs_strs_l8 = "Bilgi ve uyarı mesajları susturulur.",
.docs_strs_l9 = "Zorlama modu. Bazı şeyler göz ardı edilir.",
.docs_strs_l10 = "Mevcut dili ayarlayın.",
.docs_strs_l11 = "Sürümü görüntüleyin.",
.docs_strs_l12 = "Bu yardım mesajını görüntüleyin.",
.docs_strs_l13 = "Lisansı gorüntüleyin.",
.docs_strs_l14 = "Örnekler",
.docs_strs_l15 = "Sorunları şu adrese bildirin:",
.or_str = "yada",
.usage_docstr = "Kullanımı"
};
char* pmt_langdb_langs[] = {
"en",
"tr"
};
int pmt_langdb_total = 2;
int pmt_langdb_ctrl = 1;
#if defined(__cplusplus)
}
#endif
/* end of code */

138
jni/listpart.c Executable file
View File

@@ -0,0 +1,138 @@
/* By YZBruh | ShawkTeam */
/**
* Copyright 2024 Partition Manager
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if defined(__cplusplus)
extern "C" {
#endif
#define INC_MAIN_LIBS
#define INC_DEBUGERS
#define INC_DIRENT
#include <pmt.h>
/* current /dev context */
#define CUR_DEV_CNTX "/dev/block/by-name"
/* for logical partitions */
#define LGC_DEV_CNTX "/dev/block/mapper"
extern bool pmt_use_cust_cxt;
extern bool pmt_ab;
extern bool pmt_logical;
extern bool pmt_silent;
extern bool pmt_force_mode;
extern char* cust_cxt;
extern char* bin_name;
extern struct pmt_langdb_general* current;
extern struct pmt_langdb_general en;
extern struct pmt_langdb_general tr;
DIR *dir;
static int
list(const char* operation, const char* target_dir)
{
static bool list = false;
struct dirent *entry;
dir = NULL;
if (strcmp(operation, "access") == 0)
list = false;
else if (strcmp(operation, "print") == 0)
list = true;
else
return -1;
dir = opendir(target_dir);
if (dir != NULL)
{
if (!list)
{
closedir(dir);
return 0;
}
else
{
LOGD("%s: `%s'\n", current->list_of_dir, target_dir);
while ((entry = readdir(dir)) != NULL)
{
LOGD("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
}
else
return -1;
return 2;
}
/* list existing partitions */
int listpart(void)
{
if (pmt_use_cust_cxt)
{
if (list("access", cust_cxt) != 0)
{
if (!pmt_force_mode)
LOGE("%s: `%s': %s\n", current->not_open, cust_cxt, strerror(errno));
else
return 1;
}
else
list("print", cust_cxt);
}
else
{
if (list("access", CUR_DEV_CNTX) != 0)
{
if (!pmt_force_mode)
LOGE("%s: `%s': %s\n", current->not_open, CUR_DEV_CNTX, strerror(errno));
else
return 1;
}
else
list("print", CUR_DEV_CNTX);
}
if (pmt_logical)
{
if (list("access", LGC_DEV_CNTX) != 0)
LOGE("%s: `%s': %s\n", current->not_open, LGC_DEV_CNTX, strerror(errno));
else
list("print", LGC_DEV_CNTX);
}
if (pmt_ab)
LOGD("%s: %s\n", bin_name, current->ab_warn);
if (pmt_logical)
LOGD("%s: %s\n", bin_name, current->logical_warn);
return 0;
}
#if defined(__cplusplus)
}
#endif /* __cplusplus */
/* end of code */

81
jni/partitiontool.c Executable file
View File

@@ -0,0 +1,81 @@
/* By YZBruh | ShawkTeam */
/**
* Copyright 2024 Partition Manager
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if defined(__cplusplus)
extern "C" {
#endif
#define INC_MAIN_LIBS
#include <pmt.h>
extern bool pmt_use_cust_cxt;
extern bool pmt_ab;
extern bool pmt_logical;
extern char* cust_cxt;
static int
accf(const char* _Nonnull target) { return access(target, F_OK); }
/* check parts */
void check_dev_point()
{
/* true = ab | false = a */
if (pmt_use_cust_cxt)
{
static char cust_cxt_ck_path[150];
sprintf(cust_cxt_ck_path, "%s/boot_a", cust_cxt);
if (accf(cust_cxt_ck_path) != 0)
pmt_ab = false;
else
pmt_ab = true;
}
else
{
if (accf("/dev/block/by-name/boot_a") != 0)
pmt_ab = false;
else
pmt_ab = true;
}
/* true = logical | false = classic */
if (pmt_use_cust_cxt)
{
static char cust_cxt_ckl_path[150];
sprintf(cust_cxt_ckl_path, "%s/super", cust_cxt);
if (accf(cust_cxt_ckl_path) != 0)
pmt_logical = false;
else
pmt_logical = true;
}
else
{
if (accf("/dev/block/by-name/super") != 0)
pmt_logical = false;
else
pmt_logical = true;
}
}
#if defined(__cplusplus)
}
#endif /* __cplusplus */
/* end */

383
jni/pmt.c Executable file
View File

@@ -0,0 +1,383 @@
/* By YZBruh | ShawkTeam */
/**
* Copyright 2024 Partition Manager
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* force use C std (if default is C++) */
#if defined(__cplusplus)
extern "C" {
#endif
#define INC_MAIN_LIBS
#define INC_DEBUGERS
#define INC_STAT
#define INC_GETOPT
#define INC_DOCS_REQS
#include <pmt.h>
/* add value to variables that are added globally and are not worth */
char* out = NULL;
char* cust_cxt = NULL;
char* target_partition = NULL;
char* target_flash_file = NULL;
char* partition_type = NULL;
char* format_fs = NULL;
char* bin_name = NULL;
bool pmt_use_logical = false;
bool pmt_use_cust_cxt = false;
bool pmt_ab = false;
bool pmt_logical = false;
bool pmt_silent = false;
bool pmt_flash = false;
bool pmt_backup = false;
bool pmt_format = false;
bool pmt_force_mode = false;
bool pmt_inst_on_termux = false;
/* import language structs etc. */
struct pmt_langdb_general* current = NULL;
extern struct pmt_langdb_general en;
extern struct pmt_langdb_general tr;
extern const char* pmt_langdb_langs[];
extern int pmt_langdb_total;
/* variable for use in control of '-' expression */
static const char* opt_symbol = "-";
static char common_symbol_rule[350];
/**
* He controls whether the '-' sign at
* the beginning of the given word
*/
static void
check_optsym(const char* _Nonnull mystring)
{
if (strncmp(mystring, opt_symbol, 1) == 0)
{
if (!pmt_force_mode)
LOGE("%s\n", common_symbol_rule);
else
exit(1);
}
}
/* classic main function (C binary here xd) */
int main(int argc, char* argv[])
{
bin_name = argv[0];
/* load language */
static char* langctrl_str;
langctrl_str = loadlang();
if (strcmp(langctrl_str, "en") == 0)
current = &en;
else if (strcmp(langctrl_str, "tr") == 0)
current = &tr;
sprintf(common_symbol_rule, "%s\n", current->common_symbol_rule);
if (search_sls() == 0)
{
if (current->welcome_ != NULL)
LOGD("%s", current->welcome_);
LOGD("%s %s %s %s.\n", current->language, current->welcome, current->by_str, current->lang_by_s);
}
/* check argument total */
if (argc < 2)
LOGE("%s\n%s `%s --help' %s.\n", current->missing_operand, current->try_h, argv[0], current->for_more);
/* a structure for long arguments */
struct option long_options[] = {
{"logical", no_argument, 0, 'l'},
{"context", required_argument, 0, 'c'},
{"list", no_argument, 0, 'p'},
{"silent", no_argument, 0, 's'},
{"force", no_argument, 0, 'f'},
{"set-language", required_argument, 0, 'S'},
{"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 pmt_setlang = false;
static char* langpr;
static int search_result = 3;
static int getvar_temp;
static int check_getvar_temp;
static int opt;
/* control for each argument */
while ((opt = getopt_long(argc, argv, "lc:psfS:vL", long_options, NULL)) != -1)
{
/* process arguments */
switch (opt)
{
/* logical partitions option */
case 'l':
check_root();
check_dev_point();
if (pmt_logical)
pmt_use_logical = true;
else
LOGE("%s\n", current->not_logical);
break;
/* context selector option */
case 'c':
pmt_use_cust_cxt = true;
cust_cxt = strdup(optarg);
check_optsym(cust_cxt);
break;
/* partition lister function */
case 'p':
list_partitions = true;
/* check combo wiewer options and progress */
if (wiew_version || wiew_help || wiew_licenses) combo_wiewers = true;
break;
/* force mode option */
case 'f':
pmt_force_mode = true;
break;
/* silent mode option */
case 's':
pmt_silent = true;
break;
/* language setter option */
case 'S':
pmt_setlang = true;
langpr = strdup(optarg);
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 '?':
LOGD("%s `%s --help' %s\n", current->try_h, argv[0], current->for_more);
return 1;
break;
default:
LOGD("%s: %s [backup] [flash] [format] [-l | --logical] [-c | --context] [-D | --list] [-v | --version] [--help] [-L | --license]\n", current->usage_head, argv[0]);
return 1;
}
}
/* stop the program if multiple viewer is used */
if (combo_wiewers)
LOGE("%s", current->multiple_wiewers);
/* controller to handle viewer */
if (wiew_help)
{
help();
return 0;
}
else if (wiew_version)
{
version();
return 0;
}
else if (wiew_licenses)
{
licenses();
return 0;
}
else if (list_partitions)
{
check_root();
return listpart();
}
if (pmt_setlang)
{
LOGD("%s: %s\n", argv[0], current->switching_lang);
setlang(langpr);
sleep(2);
LOGD("%s: %s.\n", argv[0], current->please_rerun);
return 0;
}
/* detect target mode */
static char arg1[20];
sprintf(arg1, "%s", argv[1]);
for (int argtest = 2; argtest == argc; argtest++)
{
getvar_temp = argtest;
check_getvar_temp = getvar_temp;
getvar_temp++;
if (strcmp(argv[argtest], "backup") == 0)
{
check_getvar_temp++;
if (argc < check_getvar_temp)
LOGE("%s 0.\n", current->expected_backup_arg);
target_partition = argv[getvar_temp];
if (argc == check_getvar_temp) out = target_partition;
else
{
getvar_temp++;
out = argv[getvar_temp];
}
check_optsym(target_partition);
check_optsym(out);
pmt_backup = true;
break;
}
else if (strcmp(argv[argtest], "flash") == 0)
{
check_getvar_temp++;
if (argc < check_getvar_temp)
LOGE("%s 0.\n", current->expected_flash_arg);
if (argc == check_getvar_temp)
LOGE("%s 1.\n", current->expected_flash_arg);
target_flash_file = argv[getvar_temp];
getvar_temp++;
target_partition = argv[getvar_temp];
check_optsym(target_flash_file);
check_optsym(target_partition);
pmt_flash = true;
break;
}
else if (strcmp(argv[argtest], "format") == 0)
{
check_getvar_temp++;
if (argc < check_getvar_temp)
LOGE("%s 0.\n", current->expected_format_arg);
if (argc == check_getvar_temp)
LOGE("%s 1.\n", current->expected_format_arg);
format_fs = argv[getvar_temp];
getvar_temp++;
target_partition = argv[getvar_temp];
check_optsym(format_fs);
check_optsym(target_partition);
pmt_format = true;
break;
}
}
/* target control is done */
if (!pmt_backup && !pmt_flash && !pmt_format)
LOGE("%s `%s --help` %s\n", current->missing_operand, current->try_h, current->for_more);
/* checks */
check_root();
check_dev_point();
if (pmt_format)
{
if (strcmp(format_fs, "ext4") != 0 || strcmp(format_fs, "ext3") != 0 || strcmp(format_fs, "ext2") != 0)
LOGE("%s: %s\n", current->unsupported_fs, format_fs);
}
if (pmt_flash)
{
search_result = get_stat(target_flash_file, "file");
if (search_result == 1)
LOGE("%s `%s': %s\n", current->cannot_stat, target_flash_file, strerror(errno));
else if (search_result == -1)
LOGE("`%s': %s\n", target_flash_file, current->not_file);
}
/* custom context checker */
if (pmt_use_cust_cxt)
{
search_result = get_stat(cust_cxt, "dir");
if (search_result == 1)
LOGE("%s `%s': %s\n", current->cannot_stat, cust_cxt, strerror(errno));
else if (search_result == -1)
LOGE("`%s': %s\n", cust_cxt, current->not_dir);
if (strstr(cust_cxt, "/dev") == NULL && !pmt_force_mode)
LOGE("%s\n", current->not_in_dev);
}
if (target_partition == NULL)
{
if (!pmt_force_mode)
LOGE("%s\n%s `%s --help' %s\n", current->req_part_name, current->try_h, argv[0], current->for_more);
}
else
{
/**
* 1 = backup mode
*
* 2 = flash mode
*
* 3 = format
*/
if (pmt_backup)
return pmt(1);
else if (pmt_flash)
return pmt(2);
else if (pmt_format)
return pmt(3);
else
LOGE("%s\n%s `%s --help' %s\n", current->no_target, current->try_h, argv[0], current->for_more);
}
}
#if defined(__cplusplus)
}
#endif
/* end of code */

44
jni/root.c Executable file
View File

@@ -0,0 +1,44 @@
/* By YZBruh | ShawkTeam */
/**
* Copyright 2024 Partition Manager
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if defined(__cplusplus)
extern "C" {
#endif
#define INC_MAIN_LIBS
#define INC_DEBUGERS
#include <pmt.h>
extern struct pmt_langdb_general* current;
extern struct pmt_langdb_general en;
extern struct pmt_langdb_general tr;
/* root checker function */
void check_root(void)
{
/* a quick, easy method for verifying root */
if (getuid() != 0)
LOGE("%s\n", current->no_root);
}
#if defined(__cplusplus)
}
#endif /* __cplusplus */
/* end of code */

259
jni/tools.c Executable file
View File

@@ -0,0 +1,259 @@
/* By YZBruh | ShawkTeam */
/**
* Copyright 2024 Partition Manager
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if defined(__cplusplus)
extern "C" {
#endif
#define BFSIZE 1024
#define INC_MAIN_LIBS
#define INC_STAT
#define INC_DEBUGERS
#define INC_TOOLS_REQS
#include <pmt.h>
extern char* out;
extern char* format_fs;
extern char* cust_cxt;
extern char* target_partition;
extern char* target_flash_file;
extern char* partition_type;
extern char* bin_name;
extern bool pmt_use_logical;
extern bool pmt_use_cust_cxt;
extern bool pmt_logical;
extern bool pmt_flash;
extern bool pmt_backup;
extern bool pmt_silent;
extern bool pmt_force_mode;
extern struct pmt_langdb_general* current;
extern struct pmt_langdb_general en;
extern struct pmt_langdb_general tr;
/**
* it is meant to calculate the size of the quickly given file.
* its purpose is for rapid processing
*/
static double
calc_flsz(const char* _Nonnull filepath)
{
static int calc_flsz_file;
calc_flsz_file = open(filepath, O_RDONLY);
if (calc_flsz_file == -1)
return calc_flsz_file;
static off_t flsz;
flsz = lseek(calc_flsz_file, 0, SEEK_END);
close(calc_flsz_file);
if (flsz == (off_t)-1)
return -1;
return (double)flsz / (1024 * 1024);
}
/**
* error that the partition is not found.
* It's for quick action.
*/
static void
partition_not_found(void) { LOGE("%s\n", current->part_not_found); }
/* to stop use of function type */
#define partition_not_found partition_not_found()
/* the partitions are meant to quickly find. */
static void
search_partition(const char* _Nonnull partition)
{
static int partition_results = 0;
partition_results = get_stat(partition, "blk");
if (partition_results == 1)
partition_not_found;
else if (partition_results == -1)
LOGE("%s\n", current->not_block);
}
int pmt(unsigned short progress_code)
{
/* required variables */
static int srcf, targetf;
static char backupper_path[512];
static char ppath[100];
static char formatter_cmd[200];
static char outf[512];
static char flasher_path[512];
static char buffer[BFSIZE];
static ssize_t readed_data;
static unsigned long long copied_data = 0;
static unsigned long long count = 1024 * 1024 * 1024;
if (progress_code == 1)
{
if (!pmt_use_logical)
{
if (pmt_use_cust_cxt)
sprintf(backupper_path, "%s/%s", cust_cxt, target_partition);
else
sprintf(backupper_path, "/dev/block/by-name/%s", target_partition);
}
else
sprintf(backupper_path, "/dev/block/mapper/%s", target_partition);
search_partition(backupper_path);
if (calc_flsz(backupper_path) != -1)
LOGD("%s: %.2f\n", current->part_disk_sz, calc_flsz(backupper_path));
else
LOGW("%s\n", current->part_disk_sz_fail);
srcf = open(backupper_path, O_RDONLY);
if (srcf == -1)
LOGE("%s: %s: %s\n", current->not_read, backupper_path, strerror(errno));
/* determine output */
if (strcmp(out, target_partition) == 0)
{
sprintf(outf, "%s.img", target_partition);
LOGW("%s: %s\n", current->out_not_spec, outf);
}
else
sprintf(outf, "%s", target_partition);
targetf = open(outf, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (targetf == -1)
LOGE("%s: %s: %s\n", current->not_gen, outf, strerror(errno));
/* start writing */
while ((readed_data = read(srcf, buffer, BFSIZE)) > 0 && copied_data < count)
{
ssize_t writed_data = write(targetf, buffer, readed_data);
if (writed_data != readed_data)
{
if (get_stat(outf, "file") == 0)
remove(outf);
LOGF("%s: %s: %s\n", current->not_write, backupper_path, strerror(errno));
}
copied_data += writed_data;
}
/* close files */
close(srcf);
close(targetf);
LOGD("%s: %s\n", current->success_backup, outf);
}
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
sprintf(flasher_path, "/dev/block/mapper/%s", target_partition);
/* check partition */
search_partition(flasher_path);
if (calc_flsz(target_flash_file) != -1)
LOGD("%s: %.2f\n", current->flash_file_sz, calc_flsz(target_flash_file));
else
LOGW("%s\n", current->flash_file_sz_fail);
if (calc_flsz(target_partition) != -1)
LOGD("%s: %.2f\n", current->part_disk_sz, calc_flsz(target_partition));
else
LOGW("%s\n", current->part_disk_sz_fail);
if (calc_flsz(target_flash_file) > calc_flsz(target_partition))
LOGE("%s\n", current->ffile_more_part);
srcf = open(target_flash_file, O_RDONLY);
if (srcf == -1)
LOGF("%s: %s: %s\n", current->not_read, target_flash_file, strerror(errno));
targetf = open(target_partition, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (targetf == -1)
LOGF("%s: %s: %s\n", current->not_read, target_partition, strerror(errno));
/* start writing */
while ((readed_data = read(srcf, buffer, BFSIZE)) > 0 && copied_data < count)
{
ssize_t writed_data = write(targetf, buffer, readed_data);
if (writed_data != readed_data)
LOGF("%s: %s: %s\n", current->not_write, backupper_path, strerror(errno));
copied_data += writed_data;
}
close(srcf);
close(targetf);
LOGD("%s.\n", current->success_flash);
}
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
sprintf(ppath, "/dev/block/mapper/%s", target_partition);
/* check partition */
search_partition(ppath);
/* get target partition block size */
struct statvfs file_sys_inf;
if (statvfs(ppath, &file_sys_inf) != 0)
LOGE("%s\n", current->cannot_get_bsz);
/* 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)
LOGF("%s\n", current->format_fail);
}
return 0;
}
#if defined(__cplusplus)
}
#endif /* __cplusplus */
/* end of code */

57
jni/versioner.c Executable file
View File

@@ -0,0 +1,57 @@
/* By YZBruh | ShawkTeam */
/**
* Copyright 2024 Partition Manager
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if defined(__cplusplus)
extern "C" {
#endif
#define INC_MAIN_LIBS
#define INC_VERSIONER_REQS
#include <pmt.h>
extern char* bin_name;
extern struct pmt_langdb_general* current;
extern struct pmt_langdb_general en;
extern struct pmt_langdb_general tr;
void version(void)
{
LOGD("%s %s %d.%d.%d (%d%d%d) ", bin_name, current->version_str, PMT_MAJOR, PMT_MINOR, PMT_PATCHLEVEL, PMT_MAJOR, PMT_MINOR, PMT_PATCHLEVEL);
#if __SIZEOF_POINTER__ == 4
LOGD("32-bit %s\n", current->bin_str);
#elif __SIZEOF_POINTER__ == 8
LOGD("64-bit %s\n", current->bin_str);
#else
LOGD("<%s> %s\n", current->unknw_str, current->bin_str);
#endif
#if defined(__clang__)
LOGD("%s: clang %d.%d.%d (NDK r%d%s %s)\n", current->compiler_str, __clang_major__, __clang_minor__, __clang_patchlevel__, __NDK_MAJOR__, __NDK_MINOR_STATUS__, __NDK_BETA_STATUS__);
#endif
LOGD("%s\n", current->see_license);
}
#if defined(__cplusplus)
}
#endif
/* end of code */

208
utils.sh Executable file
View File

@@ -0,0 +1,208 @@
#!/usr/bin/bash
# By YZBruh | ShawkTeam
# Copyright 2024 Partition Manager
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ANSI color codes
RED='\e[31m'
NC='\e[0m'
# needed variables
VERSION="2.4.0"
CUR_DIR=$(pwd)
LIB_DIR=${CUR_DIR}/libs
ARMV8A_DIR=${LIB_DIR}/arm64-v8a
ARMV7A_DIR=${LIB_DIR}/armeabi-v7a
DEB_DIR=${CUR_DIR}/deb
DEBUTILS_DIR=${CUR_DIR}/debutils
DEBTERMUX_USR=${DEBUTILS_DIR}/data/data/com.termux/files/usr
# set file modes (all) to 755
${SUDO} chmod -R 755 *
# error messages
abort()
{
if [ ! "$1" = "" ]; then
printf "${RED}${1}${NC}\n"
fi
if [ -d ${DEBUTILS_DIR}/temp ]; then
rm -rf ${DEBUTILS_DIR}/temp
fi
exit 1
}
gen_deb()
{
printf " --------- Making pmt deb package ---------\n";
printf " - Checking all files and directories (only
eededs)...\n";
# check important files
if [ ! -d ${DEBUTILS_DIR} ]; then
abort " - Not found: ${DEBUTILS_DIR}\n"
fi
if [ ! -d ${DEBUTILS_DIR}/DEBIAN ]; then
abort " - Not found: ${DEBUTILS_DIR}/DEBIAN\n"
fi
if [ ! -d ${DEBUTILS_DIR}/mandoc ]; then
abort " - Not found: ${DEBUTILS_DIR}/mandoc\n"
fi
if [ ! -d ${DEBUTILS_DIR}/data/data/com.termux ]; then
abort " - Not found: ${DEBUTILS_DIR}/data/data/com.termux\n"
fi
if [ ! -d ${DEBUTILS_DIR}/data/data/com.termux/files/usr ]; then
abort " - Not found: ${DEBUTILS_DIR}/data/data/com.termux/files/usr\n"
fi
if [ ! -d ${DEBUTILS_DIR}/data/data/com.termux/files/usr/bin ]; then
abort " - Not found: ${DEBUTILS_DIR}/data/data/com.termux/files/usr/bin\n"
fi
if [ ! -d ${DEBUTILS_DIR}/data/data/com.termux/files/usr/share/man/man8 ]; then
abort " - Not found: ${DEBUTILS_DIR}/data/data/com.termux/files/usr/share/man/man8\n"
fi
if [ ! -f ${DEBUTILS_DIR}/mandoc/pmt.8.gz ]; then
abort " - Not found: ${DEBUTILS_DIR}/mandoc/pmt.8.gz\n"
fi
if [ ! -f ${DEBUTILS_DIR}/DEBIAN/control_32 ]; then
abort " - Not found: ${DEBUTILS_DIR}/DEBIAN/control_32\n"
fi
if [ ! -f ${DEBUTILS_DIR}/DEBIAN/control_64 ]; then
abort " - Not found: ${DEBUTILS_DIR}/DEBIAN/control_64\n"
fi
if [ ! -f ${ARMV8A_DIR}/pmt ]; then
abort " - Package not comptely builded! Please build package and try again\n"
elif [ ! -f ${ARMV7A_DIR}/pmt ]; then
abort " - Package not comptely builded! Please build package and try again\n"
fi
# generate template dir
printf " - Generating template dir...\n"
${SUDO} mkdir -p ${DEBUTILS_DIR}/temp || abort
# generate out dir
printf " - Generating out dir...\n"
${SUDO} mkdir -p ${DEB_DIR} || abort
# copy files
printf " - Copying files...\n"
${SUDO} cp -r ${DEBUTILS_DIR}/data ${DEBUTILS_DIR}/temp || abort
${SUDO} rm -f ${DEBTERMUX_USR}/share/man/man8/dummy
${SUDO} rm -f ${DEBTERMUX_USR}/bin/dummy
${SUDO} mkdir -p ${DEBUTILS_DIR}/temp/DEBIAN || abort
# select control file
printf " - Selected arm-${PREFIX} package control file.\n"
${SUDO} cp ${DEBUTILS_DIR}/DEBIAN/control_${PREFIX} ${DEBUTILS_DIR}/temp/DEBIAN/control || exit 1
${SUDO} cp ${DEBUTILS_DIR}/mandoc/pmt.8.gz ${DEBTERMUX_USR}/share/man/man8 || abort
if [ "${PREFIX}" = "64" ]; then
${SUDO} cp ${ARMV8A_DIR}/pmt ${DEBTERMUX_USR}/bin || abort
elif [ "${PREFIX}" = "32" ]; then
${SUDO} cp ${ARMV7A_DIR}/pmt ${DEBTERMUX_USR}/bin || abort
fi
# start dpkg-deb
printf " - Starting dpkg-deb...\n"
sleep 2
${SUDO} chmod -R 755 *
# if ARM_PREFIX is '-v7a', unset ARM_PREFIX and PREFIX. Re set PREFIX
if [ "${PREFIX}" = "32" ]; then
unset PREFIX
PREFIX="eabi-v7a"
fi
${SUDO} dpkg-deb -b ${DEBUTILS_DIR}/temp ${DEB_DIR}/pmt-${VERSION}-arm${PREFIX}${ARM_PREFIX}.deb || abort
${SUDO} rm -rf ${DEBUTILS_DIR}/temp
printf " - Done! Package: ${DEB_DIR}/pmt-${VERSION}-arm${PREFIX}${ARM_PREFIX}.deb\n"
}
gen_modpack()
{
printf " ----------- Making static lib package -----------\n"
printf " - Checking files...\n"
if [ ! -f $(STATICLIB_DIR)/libpmt_root.a ]; then
printf " - Not found: $(STATICLIB_DIR)/libpmt_root.a\n"
exit 1
fi
if [ ! -f $(STATICLIB_DIR)/libpmt_lister.a ]; then
printf " - Not found: $(STATICLIB_DIR)/libpmt_lister.a\n"
exit 1
fi
if [ ! -f $(STATICLIB_DIR)/libpmtpartition_tool.a ]; then
printf " - Not found: $(STATICLIB_DIR)/libpmtpartition_tool.a\n"
exit 1
fi
printf " - Compressing...\n"
mkdir -p static-lib-pack
cd static-lib-pack
cp jni/include/pmt.h .
mkdir -p include
mv pmt.h include/
zip -rq pmt-static-lib-pack.zip *.a include || exit 1
rm -rf include
sleep 1
printf " - Success.\n\n"
cd ..
}
case "${1}" in
make-deb)
case "${2}" in
arm64-v8a)
PREFIX="64"
ARM_PREFIX="-v8a"
;;
armeabi-v7a)
PREFIX="32"
ARM_PREFIX=""
;;
*)
abort " - Error: unknown architecture flag: $2. Avaiable: arm64-v8a & armeabi-v7a.\n"
esac
case "${3}" in
sudo)
SUDO="sudo"
;;
no-sudo)
SUDO=""
;;
*)
SUDO=""
esac
gen_deb
;;
modpack)
case "${2}" in
arm64-v8a)
STATICLIB_DIR="${CUR_DIR}/obj/local/${2}"
;;
armeabi-v7a)
STATICLIB_DIR="${CUR_DIR}/obj/local/${2}"
;;
*)
abort " - Error: unknown architecture flag: ${2}. Avaiable: arm64-v8a & armeabi-v7a.\n"
esac
gen_modpack
;;
*)
abort "${0}: invalid operand.\nUse the make-deb flag to create a deb package, and the modpack flag to create packages for static libraries."
esac
# end of script