From 25642cc6f2450979a97fd871d984c1b8773a9b8c Mon Sep 17 00:00:00 2001 From: YZBruh Date: Thu, 25 Apr 2024 22:02:58 +0300 Subject: [PATCH] pmt: initial 1.8.0 update --- binary/pmt.c | 156 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 115 insertions(+), 41 deletions(-) diff --git a/binary/pmt.c b/binary/pmt.c index 4634dde..a44fa96 100644 --- a/binary/pmt.c +++ b/binary/pmt.c @@ -1,7 +1,7 @@ /* By YZBruh */ /* - * Copyright 2024 YZBruh - Partition Manager + * Copyright 2024 Partition Manager * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,20 +36,23 @@ char *outdir = NULL; char *cust_cxt = NULL; char *target_partition = NULL; char *target_flash_file = NULL; +char *format_fs = NULL; bool pmt_use_logical = NULL; bool pmt_use_cust_cxt = NULL; bool pmt_ab = false; bool pmt_logical = false; bool pmt_flash = false; bool pmt_backup = false; +bool pmt_format = false; bool pmt_force_mode = false; /* classic main function (C binary here xd) */ int main(int argc, char *argv[]) { /* check argument total */ - if (argc < 2) { - fprintf(stderr, "%s: missing operand\nTry `%s --help` for more information.\n", argv[0], argv[0]); + if (argc < 2) + { + fprintf(stderr, "%s: missing operand\nTry `%s --help' for more information.\n", argv[0], argv[0]); exit(44); } @@ -57,6 +60,7 @@ int main(int argc, char *argv[]) struct option long_options[] = { {"backup", no_argument, 0, 'b'}, {"flash", required_argument, 0, 'F'}, + {"format", required_argument, 0, 'r'}, {"partition", required_argument, 0, 'p'}, {"logical", no_argument, 0, 'l'}, {"out", required_argument, 0, 'o'}, @@ -75,16 +79,20 @@ int main(int argc, char *argv[]) common_symbol_rule = "When entering the attached argument of an option, an argument of another option type cannot be used. In short, the rule is: there can be no '-' at the beginning of the attached argument.\n"; int opt; /* control for each argument */ - while ((opt = getopt_long(argc, argv, "bF:p:lo:d:c:DfvL", long_options, NULL)) != -1) { + while ((opt = getopt_long(argc, argv, "bF:rp:lo:d:c:DfvL", long_options, NULL)) != -1) + { /* process arguments */ - switch (opt) { + switch (opt) + { case 'b': pmt_backup = true; break; case 'F': target_flash_file = strdup(optarg); - if (strncmp(target_flash_file, opt_symbol, 1) == 0) { - if (!pmt_force_mode) { + if (strncmp(target_flash_file, opt_symbol, 1) == 0) + { + if (!pmt_force_mode) + { error(common_symbol_rule, 19); } else { exit(19); @@ -94,16 +102,20 @@ int main(int argc, char *argv[]) check_root(); check_psf(); struct stat flashf_info; - if (stat(target_flash_file, &flashf_info) != 0) { - if (!pmt_force_mode) { + if (stat(target_flash_file, &flashf_info) != 0) + { + if (!pmt_force_mode) + { fprintf(stderr, "%s: %s: %s\n", argv[0], target_flash_file, strerror(errno)); exit(15); } else { exit(15); } } else { - if (!S_ISREG(flashf_info.st_mode)) { - if (!pmt_force_mode) { + if (!S_ISREG(flashf_info.st_mode)) + { + if (!pmt_force_mode) + { fprintf(stderr, "%s: %s: is a not file.\n", argv[0], target_flash_file); exit(16); } else { @@ -112,10 +124,36 @@ int main(int argc, char *argv[]) } } break; + case 'r': + format_fs = strdup(optarg); + if (strncmp(format_fs, opt_symbol, 1) == 0) + { + if (!pmt_force_mode) + { + fprintf(stderr, "%s", common_symbol_rule); + exit(71); + } else { + exit(71); + } + } + pmt_format = true; + if (strcmp(format_fs, "ext4") != 0 || strcmp(format_fs, "ext3") != 0 || strcmp(format_fs, "ext2") != 0) + { + if (!pmt_force_mode) + { + fprintf(stderr, "%s: formatter: unsupported filesystem: %s", argv[0], format_fs); + exit(41); + } else { + exit(41); + } + } + break; case 'p': target_partition = strdup(optarg); - if (strncmp(target_partition, opt_symbol, 1) == 0) { - if (!pmt_force_mode) { + if (strncmp(target_partition, opt_symbol, 1) == 0) + { + if (!pmt_force_mode) + { error(common_symbol_rule, 19); } else { exit(19); @@ -125,10 +163,12 @@ int main(int argc, char *argv[]) case 'l': check_root(); check_psf(); - if (pmt_logical) { + if (pmt_logical) + { pmt_use_logical = true; } else { - if (!pmt_force_mode) { + if (!pmt_force_mode) + { error("This device does not have logical partitions!\n", 17); } else { exit(17); @@ -137,8 +177,10 @@ int main(int argc, char *argv[]) break; case 'o': out = strdup(optarg); - if (strncmp(out, opt_symbol, 1) == 0) { - if (!pmt_force_mode) { + if (strncmp(out, opt_symbol, 1) == 0) + { + if (!pmt_force_mode) + { error(common_symbol_rule, 19); } else { exit(19); @@ -147,8 +189,10 @@ int main(int argc, char *argv[]) break; case 'd': outdir = strdup(optarg); - if (strncmp(outdir, opt_symbol, 1) == 0) { - if (!pmt_force_mode) { + if (strncmp(outdir, opt_symbol, 1) == 0) + { + if (!pmt_force_mode) + { error(common_symbol_rule, 19); } else { exit(19); @@ -157,16 +201,20 @@ int main(int argc, char *argv[]) check_root(); check_psf(); struct stat out_info; - if (stat(outdir, &out_info) != 0) { - if (!pmt_force_mode) { + if (stat(outdir, &out_info) != 0) + { + if (!pmt_force_mode) + { fprintf(stderr, "%s: %s: %s\n", argv[0], outdir, strerror(errno)); exit(18); } else { exit(18); } } else { - if (!S_ISDIR(out_info.st_mode)) { - if (!pmt_force_mode) { + if (!S_ISDIR(out_info.st_mode)) + { + if (!pmt_force_mode) + { fprintf(stderr, "%s: %s: is a not directory.\n", argv[0], outdir); exit(20); } else { @@ -178,8 +226,10 @@ int main(int argc, char *argv[]) case 'c': pmt_use_cust_cxt = true; cust_cxt = strdup(optarg); - if (strncmp(cust_cxt, opt_symbol, 1) == 0) { - if (!pmt_force_mode) { + if (strncmp(cust_cxt, opt_symbol, 1) == 0) + { + if (!pmt_force_mode) + { error(common_symbol_rule, 19); } else { exit(19); @@ -220,19 +270,22 @@ int main(int argc, char *argv[]) exit(43); break; default: - printf("Usage: %s [-b | --backup] [-f | --flash FILE] [-p | --partition PARTITION] [-l | --logical] [-o | --out OUTNAME] [-d | --outdir OUTDIR] [-c | --context] [-D | --list] [-v | --version] [--help] [-L | --license]\n", argv[0]); + printf("Usage: %s [-b | --backup] [-f | --flash FILE] [-r | --format FS_TYPE] [-p | --partition PARTITION] [-l | --logical] [-o | --out OUTNAME] [-d | --outdir OUTDIR] [-c | --context] [-D | --list] [-v | --version] [--help] [-L | --license]\n", argv[0]); exit(44); } } /* minor checks */ - if (!pmt_backup && !pmt_flash) { + if (!pmt_backup && !pmt_flash) + { fprintf(stderr, "%s: missing operand.\nTry `%s --help` for more information.\n", argv[0], argv[0]); exit(3); } - if (pmt_backup && pmt_flash) { - if (!pmt_force_mode) { + if (pmt_backup && pmt_flash) + { + if (!pmt_force_mode) + { error("Backup and flash functions cannot be used in the same command\n", 9); } else { exit(9); @@ -244,11 +297,15 @@ int main(int argc, char *argv[]) check_psf(); /* custom context checker */ - if (pmt_use_cust_cxt) { + if (pmt_use_cust_cxt) + { struct stat cxtinfo; - if (stat(cust_cxt, &cxtinfo) == 0) { - if (!S_ISREG(cxtinfo.st_mode)) { - if (!pmt_force_mode) { + if (stat(cust_cxt, &cxtinfo) == 0) + { + if (!S_ISREG(cxtinfo.st_mode)) + { + if (!pmt_force_mode) + { fprintf(stderr, "%s: %s: is a not directory.\n", argv[0], cust_cxt); exit(8); } else { @@ -256,42 +313,59 @@ int main(int argc, char *argv[]) } } } else { - if (!pmt_force_mode) { + if (!pmt_force_mode) + { fprintf(stderr, "%s: %s: %s\n", argv[0], cust_cxt, strerror(errno)); exit(6); } else { exit(6); } } - if (strstr(cust_cxt, "/dev") == NULL && !pmt_force_mode) { + if (strstr(cust_cxt, "/dev") == NULL && !pmt_force_mode) + { printf("%sThis custom context is strange...%s\n", ANSI_YELLOW, ANSI_RESET); } } - if (target_partition == NULL) { - if (!pmt_force_mode) { + if (target_partition == NULL) + { + if (!pmt_force_mode) + { fprintf(stderr, "%s: required partition name.\nTry `%s --help' for more information.\n", argv[0], argv[0]); exit(5); } else { exit(5); } } else { - if (pmt_backup) { - if (pmt_use_logical) { + if (pmt_backup) + { + if (pmt_use_logical) + { backup(target_partition, "logical"); exit(EXIT_SUCCESS); } else { backup(target_partition, "classic"); exit(EXIT_SUCCESS); } - } else if (pmt_flash) { - if (pmt_use_logical) { + } else if (pmt_flash) + { + if (pmt_use_logical) + { flash(target_partition, target_flash_file, "logical"); exit(EXIT_SUCCESS); } else { flash(target_partition, target_flash_file, "classic"); exit(EXIT_SUCCESS); } + } else if (pmt_format) + { + if (pmt_use_logical) { + format(target_partition, "logical"); + exit(EXIT_SUCCESS); + } else { + format(target_partition, "classic"); + exit(EXIT_SUCCESS); + } } else { fprintf(stderr, "%s: no target (backup or flash).\nTry `%s --help` for more information.\n", argv[0], argv[0]); exit(3);