/** * Scans the environment for option overrides. * * @param pThis Pointer to the instance data. * @param papszEnv The environment array. * @param pszPrefix The variable prefix. * * @returns 0 on success, -1 and err*() on failure. */ int kBuildProtectionScanEnv(PKBUILDPROTECTION pThis, char **papszEnv, const char *pszPrefix) { unsigned i; const size_t cchPrefix = strlen(pszPrefix); for (i = 0; papszEnv[i]; i++) { const char *pszVar = papszEnv[i]; if (!strncmp(pszVar, pszPrefix, cchPrefix)) { pszVar += cchPrefix; if (!strncmp(pszVar, "PROTECTION_DEPTH=", sizeof("PROTECTION_DEPTH=") - 1)) { const char *pszVal = pszVar + sizeof("PROTECTION_DEPTH=") - 1; if (kBuildProtectionSetDepth(pThis, pszVal)) return -1; } else if (!strncmp(pszVar, "DISABLE_PROTECTION=", sizeof("DISABLE_PROTECTION=") - 1)) pThis->afTypes[KBUILDPROTECTIONTYPE_RECURSIVE] &= ~1U; else if (!strncmp(pszVar, "ENABLE_PROTECTION=", sizeof("ENABLE_PROTECTION=") - 1)) pThis->afTypes[KBUILDPROTECTIONTYPE_RECURSIVE] |= 3; else if (!strncmp(pszVar, "DISABLE_FULL_PROTECTION=", sizeof("DISABLE_FULL_PROTECTION=") - 1)) pThis->afTypes[KBUILDPROTECTIONTYPE_FULL] &= ~1U; else if (!strncmp(pszVar, "ENABLE_FULL_PROTECTION=", sizeof("ENABLE_FULL_PROTECTION=") - 1)) pThis->afTypes[KBUILDPROTECTIONTYPE_FULL] |= 3; } } return 0; }
/* * rm -- * This rm is different from historic rm's, but is expected to match * POSIX 1003.2 behavior. The most visible difference is that -f * has two specific effects now, ignore non-existent files and force * file removal. */ int kmk_builtin_rm(int argc, char *argv[], char **envp) { int ch, rflag; /* reinitialize globals */ argv0 = argv[0]; dflag = eval = fflag = iflag = Pflag = vflag = Wflag = stdin_ok = 0; uid = 0; kBuildProtectionInit(&g_ProtData); /* kmk: reset getopt and set program name. */ g_progname = argv[0]; opterr = 1; optarg = NULL; optopt = 0; optind = 0; /* init */ Pflag = rflag = 0; while ((ch = getopt_long(argc, argv, "dfiPRvW", long_options, NULL)) != -1) switch(ch) { case 'd': dflag = 1; break; case 'f': fflag = 1; iflag = 0; break; case 'i': fflag = 0; iflag = 1; break; case 'P': Pflag = 1; break; case 'R': #if 0 case 'r': /* Compatibility. */ #endif rflag = 1; break; case 'v': vflag = 1; break; #ifdef FTS_WHITEOUT case 'W': Wflag = 1; break; #endif case 261: kBuildProtectionTerm(&g_ProtData); usage(stdout); return 0; case 262: kBuildProtectionTerm(&g_ProtData); return kbuild_version(argv[0]); case 263: kBuildProtectionDisable(&g_ProtData, KBUILDPROTECTIONTYPE_RECURSIVE); break; case 264: kBuildProtectionEnable(&g_ProtData, KBUILDPROTECTIONTYPE_RECURSIVE); break; case 265: kBuildProtectionEnable(&g_ProtData, KBUILDPROTECTIONTYPE_FULL); break; case 266: kBuildProtectionDisable(&g_ProtData, KBUILDPROTECTIONTYPE_FULL); break; case 267: if (kBuildProtectionSetDepth(&g_ProtData, optarg)) { kBuildProtectionTerm(&g_ProtData); return 1; } break; case '?': default: kBuildProtectionTerm(&g_ProtData); return usage(stderr); } argc -= optind; argv += optind; if (argc < 1) { kBuildProtectionTerm(&g_ProtData); if (fflag) return (0); return usage(stderr); } if (!kBuildProtectionScanEnv(&g_ProtData, envp, "KMK_RM_")) { checkdot(argv); uid = geteuid(); if (*argv) { stdin_ok = isatty(STDIN_FILENO); if (rflag) eval |= rm_tree(argv); else eval |= rm_file(argv); } } else { eval = 1; } kBuildProtectionTerm(&g_ProtData); return eval; }