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`.

- db738a11

See also 96eefda/scripts/properties.sh
This commit is contained in:
agnostic-apollo 2025-03-28 11:45:04 +05:00
parent 8440a72805
commit b7d2a4b663
No known key found for this signature in database
GPG key ID: BCCC0287E9DCCAED

View file

@ -1,9 +1,13 @@
package com.termux.shared.shell; package com.termux.shared.shell;
import android.content.Context; import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.os.Build;
import androidx.annotation.NonNull; 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.models.errors.Error;
import com.termux.shared.termux.TermuxConstants; import com.termux.shared.termux.TermuxConstants;
import com.termux.shared.file.FileUtils; import com.termux.shared.file.FileUtils;
@ -57,10 +61,42 @@ public class TermuxShellUtils {
if (TERMUX_API_VERSION_NAME != null) if (TERMUX_API_VERSION_NAME != null)
environment.add("TERMUX_API_VERSION=" + TERMUX_API_VERSION_NAME); environment.add("TERMUX_API_VERSION=" + TERMUX_API_VERSION_NAME);
environment.add("TERM=xterm-256color"); environment.add("TERM=xterm-256color");
environment.add("COLORTERM=truecolor"); 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("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("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("BOOTCLASSPATH=" + System.getenv("BOOTCLASSPATH"));
environment.add("ANDROID_ROOT=" + System.getenv("ANDROID_ROOT")); environment.add("ANDROID_ROOT=" + System.getenv("ANDROID_ROOT"));
environment.add("ANDROID_DATA=" + System.getenv("ANDROID_DATA")); environment.add("ANDROID_DATA=" + System.getenv("ANDROID_DATA"));