f6176009b1
Stages TWRP's GUI engine and standalone tooling as PawletOS-owned modules instead of a bootable/recovery fork, per the plugin-architecture finding in NOTES-ota-recovery-ab.md: stock recovery_main.cpp already dlopen()s librecovery_ui_ext.so and dlsym()s make_device() from it at runtime, so the UI layer doesn't require touching stock bootable/recovery at all. Confirmed via source grep that recovery.cpp/install.cpp have zero references into the partition manager/backup engine/GUI code and vice versa. recovery_ui/: TWRP's gui/, minuitwrp/, libpixelflinger/ (copied verbatim, GPL-3.0), plus a new device/ providing PawletTwrpUI (a ScreenRecoveryUI subclass) and make_device() — written from scratch against stock's RecoveryUI/ScreenRecoveryUI virtual-method contract, since TWRP's own fork never ships a make_device() (every real TWRP device provides its own, and no reference device tree was available to copy from). Top-level Android.bp defines librecovery_ui_pawlet_twrp, the module TARGET_RECOVERY_UI_LIB should point at. gui/Android.bp and minuitwrp/Android.bp had their include_dirs rewritten for the new paths. recovery_toolkit/: partition manager, backup engine (tar/digest/adbbu/apex), filesystem/format support (exfat/dosfstools/gpt/fuse/mtp/crypto), scripting (openrecoveryscript/orscmd/twrpinstall), shared helpers. Source only, no Android.bp yet for any of it. Known gap blocking recovery_ui from actually linking: gui/'s libguitwrp depends on libaosprecovery, built from recovery_toolkit/helpers/twrp.cpp via a Go Soong plugin (libaosprecovery_defaults.go) not yet ported. Neither repo has been build-tested — no local AOSP build environment available in this workspace. See each directory's README.md for a precise done/not-done breakdown.
182 lines
3.5 KiB
C
182 lines
3.5 KiB
C
/*
|
|
** Copyright 1998-2003 University of Illinois Board of Trustees
|
|
** Copyright 1998-2003 Mark D. Roth
|
|
** All rights reserved.
|
|
**
|
|
** wrapper.c - libtar high-level wrapper code
|
|
**
|
|
** Mark D. Roth <roth@uiuc.edu>
|
|
** Campus Information Technologies and Educational Services
|
|
** University of Illinois at Urbana-Champaign
|
|
*/
|
|
|
|
#include <internal.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <sys/param.h>
|
|
#include <dirent.h>
|
|
#include <errno.h>
|
|
|
|
#ifdef STDC_HEADERS
|
|
# include <string.h>
|
|
#endif
|
|
|
|
|
|
int
|
|
tar_extract_glob(TAR *t, char *globname, char *prefix)
|
|
{
|
|
char *filename;
|
|
char buf[MAXPATHLEN];
|
|
int i, fd = 0;
|
|
|
|
while ((i = th_read(t)) == 0)
|
|
{
|
|
filename = th_get_pathname(t);
|
|
if (fnmatch(globname, filename, FNM_PATHNAME | FNM_PERIOD))
|
|
{
|
|
if (TH_ISREG(t) && tar_skip_regfile(t))
|
|
return -1;
|
|
continue;
|
|
}
|
|
if (t->options & TAR_VERBOSE)
|
|
th_print_long_ls(t);
|
|
if (prefix != NULL)
|
|
snprintf(buf, sizeof(buf), "%s/%s", prefix, filename);
|
|
else
|
|
strlcpy(buf, filename, sizeof(buf));
|
|
if (tar_extract_file(t, buf, prefix, &fd) != 0)
|
|
return -1;
|
|
}
|
|
|
|
return (i == 1 ? 0 : -1);
|
|
}
|
|
|
|
|
|
int
|
|
tar_extract_all(TAR *t, char *prefix, const int *progress_fd)
|
|
{
|
|
char *filename;
|
|
char buf[MAXPATHLEN];
|
|
int i;
|
|
|
|
#ifdef DEBUG
|
|
LOG("==> tar_extract_all(TAR *t, \"%s\")\n",
|
|
(prefix ? prefix : "(null)"));
|
|
#endif
|
|
|
|
while ((i = th_read(t)) == 0)
|
|
{
|
|
#ifdef DEBUG
|
|
LOG(" tar_extract_all(): calling th_get_pathname()");
|
|
#endif
|
|
filename = th_get_pathname(t);
|
|
if (t->options & TAR_VERBOSE)
|
|
th_print_long_ls(t);
|
|
if (prefix != NULL)
|
|
snprintf(buf, sizeof(buf), "%s/%s", prefix, filename);
|
|
else
|
|
strlcpy(buf, filename, sizeof(buf));
|
|
#ifdef DEBUG
|
|
LOG(" tar_extract_all(): calling tar_extract_file(t, "
|
|
"\"%s\")\n", buf);
|
|
#endif
|
|
if (tar_extract_file(t, buf, prefix, progress_fd) != 0)
|
|
return -1;
|
|
}
|
|
|
|
return (i == 1 ? 0 : -1);
|
|
}
|
|
|
|
|
|
int
|
|
tar_append_tree(TAR *t, char *realdir, char *savedir)
|
|
{
|
|
char realpath[MAXPATHLEN];
|
|
char savepath[MAXPATHLEN];
|
|
struct dirent *dent;
|
|
DIR *dp;
|
|
struct stat s;
|
|
|
|
#ifdef DEBUG
|
|
LOG("==> tar_append_tree(0x%lx, \"%s\", \"%s\")\n",
|
|
t, realdir, (savedir ? savedir : "[NULL]"));
|
|
#endif
|
|
|
|
if (tar_append_file(t, realdir, savedir) != 0)
|
|
return -1;
|
|
|
|
#ifdef DEBUG
|
|
LOG(" tar_append_tree(): done with tar_append_file()...");
|
|
#endif
|
|
|
|
dp = opendir(realdir);
|
|
if (dp == NULL)
|
|
{
|
|
if (errno == ENOTDIR)
|
|
return 0;
|
|
return -1;
|
|
}
|
|
while ((dent = readdir(dp)) != NULL)
|
|
{
|
|
if (strcmp(dent->d_name, ".") == 0 ||
|
|
strcmp(dent->d_name, "..") == 0)
|
|
continue;
|
|
|
|
snprintf(realpath, MAXPATHLEN, "%s/%s", realdir,
|
|
dent->d_name);
|
|
if (savedir)
|
|
snprintf(savepath, MAXPATHLEN, "%s/%s", savedir,
|
|
dent->d_name);
|
|
|
|
if (lstat(realpath, &s) != 0)
|
|
return -1;
|
|
|
|
if (S_ISDIR(s.st_mode))
|
|
{
|
|
if (tar_append_tree(t, realpath,
|
|
(savedir ? savepath : NULL)) != 0)
|
|
return -1;
|
|
continue;
|
|
}
|
|
|
|
if (tar_append_file(t, realpath,
|
|
(savedir ? savepath : NULL)) != 0)
|
|
return -1;
|
|
}
|
|
|
|
closedir(dp);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
int
|
|
tar_find(TAR *t, char *searchstr)
|
|
{
|
|
if (!searchstr)
|
|
return 0;
|
|
|
|
char *filename;
|
|
int i, entryfound = 0;
|
|
#ifdef DEBUG
|
|
LOG("==> tar_find(0x%lx, %s)\n", (long unsigned int)t, searchstr);
|
|
#endif
|
|
while ((i = th_read(t)) == 0) {
|
|
filename = th_get_pathname(t);
|
|
if (fnmatch(searchstr, filename, FNM_FILE_NAME | FNM_PERIOD) == 0) {
|
|
entryfound++;
|
|
#ifdef DEBUG
|
|
LOG("Found matching entry: %s\n", filename);
|
|
#endif
|
|
break;
|
|
}
|
|
}
|
|
#ifdef DEBUG
|
|
if (!entryfound)
|
|
LOG("No matching entry found.\n");
|
|
#endif
|
|
|
|
return entryfound;
|
|
}
|