/* Copyright 2014 TeamWin This file is part of TWRP/TeamWin Recovery Project. TWRP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. TWRP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with TWRP. If not, see . */ #include "../twrp-functions.hpp" #include "../twrpTar.hpp" #include "../exclude.hpp" #include "../progresstracking.hpp" #include "../gui/gui.hpp" #include "../gui/twmsg.h" #include void gui_msg(const char* text) { if (text) { Message msg = Msg(text); gui_msg(msg); } } void gui_warn(const char* text) { if (text) { Message msg = Msg(msg::kWarning, text); gui_msg(msg); } } void gui_err(const char* text) { if (text) { Message msg = Msg(msg::kError, text); gui_msg(msg); } } void gui_highlight(const char* text) { if (text) { Message msg = Msg(msg::kHighlight, text); gui_msg(msg); } } void gui_msg(Message msg) { std::string output = msg; output += "\n"; fputs(output.c_str(), stdout); } void usage() { printf("twrpTar [options]\n\n"); printf("actions: -c create\n"); printf(" -x extract\n\n"); printf(" -d target directory\n"); printf(" -t output file\n"); printf(" -m skip media subfolder (has data media)\n"); printf(" -z compress backup (/sbin/pigz must be present)\n"); #ifndef TW_EXCLUDE_ENCRYPTED_BACKUPS printf(" -e encrypt/decrypt backup followed by password (/sbin/openaes must be present)\n"); printf(" -u encrypt using userdata encryption (must be used with -e)\n"); #endif printf("\n\n"); printf("Example: twrpTar -c -d /cache -t /sdcard/test.tar\n"); printf(" twrpTar -x -d /cache -t /sdcard/test.tar\n"); } int main(int argc, char **argv) { twrpTar tar; int use_encryption = 0, userdata_encryption = 0, has_data_media = 0, use_compression = 0, include_root = 0; int i, action = 0; unsigned j; string Directory, Tar_Filename; ProgressTracking progress(1); pid_t tar_fork_pid = 0; #ifndef TW_EXCLUDE_ENCRYPTED_BACKUPS string Password; #endif if (argc < 2) { usage(); return 0; } if (strcmp(argv[1], "-c") == 0) action = 1; // create tar else if (strcmp(argv[1], "-x") == 0) action = 2; // extract tar else { printf("Invalid action '%s' specified.\n", argv[1]); usage(); return -1; } for (i = 2; i < argc; i++) { if (strcmp(argv[i], "-d") == 0) { i++; if (argc <= i) { printf("No argument specified for %s\n", argv[i - 1]); usage(); return -1; } else { Directory = argv[i]; } } else if (strcmp(argv[i], "-t") == 0) { i++; if (argc <= i) { printf("No argument specified for %s\n", argv[i - 1]); usage(); return -1; } else { Tar_Filename = argv[i]; } } else if (strcmp(argv[i], "-e") == 0) { #ifndef TW_EXCLUDE_ENCRYPTED_BACKUPS i++; if (argc <= i) { printf("No argument specified for %s\n", argv[i - 1]); usage(); return -1; } else { use_encryption = 1; Password = argv[i]; } #else printf("Encrypted tar file support not present\n"); usage(); return -1; #endif } else if (strcmp(argv[i], "-m") == 0) { if (action == 2) printf("NOTE: %s option not needed when extracting.\n", argv[i]); has_data_media = 1; } else if (strcmp(argv[i], "-z") == 0) { if (action == 2) printf("NOTE: %s option not needed when extracting.\n", argv[i]); use_compression = 1; } else if (strcmp(argv[i], "-u") == 0) { #ifndef TW_EXCLUDE_ENCRYPTED_BACKUPS if (action == 2) printf("NOTE: %s option not needed when extracting.\n", argv[i]); userdata_encryption = 1; #else printf("Encrypted tar file support not present\n"); usage(); return -1; #endif } } TWExclude exclude; exclude.add_absolute_dir("/data/media"); tar.has_data_media = has_data_media; tar.setdir(Directory); tar.setfn(Tar_Filename); tar.setsize(exclude.Get_Folder_Size(Directory)); tar.use_compression = use_compression; tar.backup_exclusions = &exclude; #ifndef TW_EXCLUDE_ENCRYPTED_BACKUPS if (userdata_encryption && !use_encryption) { printf("userdata encryption set without encryption option\n"); usage(); return -1; } if (use_encryption) { tar.use_encryption = use_encryption; tar.userdata_encryption = userdata_encryption; tar.setpassword(Password); } else { use_encryption = false; } #endif if (action == 1) { if (tar.createTarFork(&tar_fork_pid) != 0) { sync(); return -1; } sync(); printf("\n\ntar created successfully.\n"); } else if (action == 2) { if (tar.extractTarFork() != 0) { sync(); return -1; } sync(); printf("\n\ntar extracted successfully.\n"); } return 0; }