From b7d2a4b6633979ad7181db89b73d2d836fe99bcc Mon Sep 17 00:00:00 2001 From: agnostic-apollo Date: Fri, 28 Mar 2025 11:45:04 +0500 Subject: [PATCH] Added: Export additional primary `TERMUX_*` scoped shell environment variables - TERMUX__ROOTFS - TERMUX__HOME - TERMUX__PREFIX - TERMUX_APP__DATA_DIR (Actual app data directory path assigned by Android for the `com.termux` app returned by `ApplicationInfo`) - TERMUX_APP__LEGACY_DATA_DIR (Expected legacy app data directory path for the `com.termux` app, mainly accessible on primary user `0` and is a symlink/bind mount to/from `TERMUX_APP__DATA_DIR`) - TERMUX_APP__BUILD_DATA_DIR (App data directory path used by `termux-packages` `properties.sh` while building packages and `TermuxConstants.java` while building Termux app) - TERMUX__SE_PROCESS_CONTEXT (SeLinux process context for current process) - TERMUX_APP__SE_FILE_CONTEXT (SeLinux file context for the `TERMUX_APP__DATA_DIR`) - TERMUX_APP__SE_INFO (Termux app seInfo tag found in selinux policy used to set app process and app data files selinux context) This is also required for `libtermux-exec-*-ld-preload.so` `$LD_PRELOAD` library as well for `termux-exec` version `>= 2.0.0`. - https://github.com/termux/termux-exec-package/commit/db738a11 See also https://github.com/termux/termux-packages/blob/96eefda/scripts/properties.sh --- .../termux/shared/shell/TermuxShellUtils.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/termux-shared/src/main/java/com/termux/shared/shell/TermuxShellUtils.java b/termux-shared/src/main/java/com/termux/shared/shell/TermuxShellUtils.java index 0a6ccb1c..f1576178 100644 --- a/termux-shared/src/main/java/com/termux/shared/shell/TermuxShellUtils.java +++ b/termux-shared/src/main/java/com/termux/shared/shell/TermuxShellUtils.java @@ -1,9 +1,13 @@ package com.termux.shared.shell; import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.os.Build; import androidx.annotation.NonNull; +import com.termux.shared.android.SELinuxUtils; +import com.termux.shared.data.DataUtils; import com.termux.shared.models.errors.Error; import com.termux.shared.termux.TermuxConstants; import com.termux.shared.file.FileUtils; @@ -57,10 +61,42 @@ public class TermuxShellUtils { if (TERMUX_API_VERSION_NAME != null) environment.add("TERMUX_API_VERSION=" + TERMUX_API_VERSION_NAME); + + environment.add("TERM=xterm-256color"); environment.add("COLORTERM=truecolor"); + + try { + ApplicationInfo applicationInfo = currentPackageContext.getPackageManager().getApplicationInfo( + TermuxConstants.TERMUX_PACKAGE_NAME, 0); + if (applicationInfo != null && !applicationInfo.enabled) { + applicationInfo = null; + } + + if (applicationInfo != null) { + environment.add("TERMUX_APP__DATA_DIR=" + applicationInfo.dataDir); + environment.add("TERMUX_APP__LEGACY_DATA_DIR=" + "/data/data/" + applicationInfo.packageName); + environment.add("TERMUX_APP__BUILD_DATA_DIR=" + TermuxConstants.TERMUX_INTERNAL_PRIVATE_APP_DATA_DIR_PATH); + + environment.add("TERMUX_APP__SE_FILE_CONTEXT=" + SELinuxUtils.getFileContext(applicationInfo.dataDir)); + + String seInfoUser = PackageUtils.getApplicationInfoSeInfoUserForPackage(applicationInfo); + environment.add("TERMUX_APP__SE_INFO=" + PackageUtils.getApplicationInfoSeInfoForPackage(applicationInfo) + + (DataUtils.isNullOrEmpty(seInfoUser) ? "" : seInfoUser)); + } + + } catch (final Exception e) { + // Ignore + } + + environment.add("TERMUX__ROOTFS=" + TermuxConstants.TERMUX_FILES_DIR_PATH); environment.add("HOME=" + TermuxConstants.TERMUX_HOME_DIR_PATH); + environment.add("TERMUX__HOME=" + TermuxConstants.TERMUX_HOME_DIR_PATH); environment.add("PREFIX=" + TermuxConstants.TERMUX_PREFIX_DIR_PATH); + environment.add("TERMUX__PREFIX=" + TermuxConstants.TERMUX_PREFIX_DIR_PATH); + + environment.add("TERMUX__SE_PROCESS_CONTEXT=" + SELinuxUtils.getContext()); + environment.add("BOOTCLASSPATH=" + System.getenv("BOOTCLASSPATH")); environment.add("ANDROID_ROOT=" + System.getenv("ANDROID_ROOT")); environment.add("ANDROID_DATA=" + System.getenv("ANDROID_DATA"));