pmt: initial 1.8.0 update

This commit is contained in:
2024-04-25 22:02:58 +03:00
committed by GitHub
parent 16c8654fa2
commit 25642cc6f2

View File

@@ -1,7 +1,7 @@
/* By YZBruh */
/*
* Copyright 2024 YZBruh - Partition Manager
* Copyright 2024 Partition Manager
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -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);