VirtualBox

Changeset 2074 in kBuild for trunk/src/kmk


Ignore:
Timestamp:
Nov 17, 2008 2:55:56 AM (16 years ago)
Author:
bird
Message:

kmk_redirect: OS/2 hack - close files, zap environment.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/kmkbuiltin/redirect.c

    r2019 r2074  
    6666{
    6767    fprintf(pOut,
    68             "usage: %s [-[rwa+tb]<fd> <file>] [-E <var=val>] [-C <dir>] -- <program> [args]\n"
     68            "usage: %s [-[rwa+tb]<fd> <file>] [-c<fd>] [-Z] [-E <var=val>] [-C <dir>] -- <program> [args]\n"
    6969            "   or: %s --help\n"
    7070            "   or: %s --version\n"
     
    7575            "   o = stdout\n"
    7676            "   e = stderr\n"
     77            "\n"
     78            "The -c switch will close the specified file descriptor.\n"
     79            "\n"
     80            "The -Z switch zaps the environment.\n"
    7781            "\n"
    7882            "The -E switch is for making changes to the environment in a putenv\n"
     
    9296
    9397
    94 int main(int argc, char **argv)
     98int main(int argc, char **argv, char **envp)
    9599{
    96100    int i;
     
    132136                else if (!strcmp(psz, "-chdir"))
    133137                    psz = "C";
     138                else if (!strcmp(psz, "-zap-env"))
     139                    psz = "Z";
     140                else if (!strcmp(psz, "-close"))
     141                    psz = "c";
    134142            }
    135143
     
    237245                fprintf(pStdErr, "%s: error: chdir(\"%s\"): %s\n", name(argv[0]), psz, strerror(errno));
    238246                return 1;
     247            }
     248
     249            /*
     250             * Zap environment switch?
     251             * This is a bit of a hack.
     252             */
     253            if (*psz == 'Z')
     254            {
     255                unsigned i = 0;
     256                while (envp[i] != NULL)
     257                    i++;
     258                while (i-- > 0)
     259                {
     260                    char *pszEqual = strchr(envp[i], '=');
     261                    char *pszCopy;
     262                   
     263                    if (pszEqual)
     264                        *pszEqual = '\0';
     265                    pszCopy = strdup(envp[i]);
     266                    if (pszEqual)
     267                        *pszEqual = '=';
     268
     269#if defined(_MSC_VER) || defined(__OS2__)
     270                    putenv(pszCopy);
     271#else
     272                    unsetenv(pszCopy);
     273#endif
     274                    free(pszCopy);
     275                }
     276                continue;
     277            }
     278
     279            /*
     280             * Close the specified file descriptor (no stderr/out/in aliases).
     281             */
     282            if (*psz == 'c')
     283            {
     284                psz++;
     285                if (!*psz)
     286                {
     287                    i++;
     288                    if (i >= argc)
     289                    {
     290                        fprintf(pStdErr, "%s: syntax error: missing filename argument.\n", name(argv[0]));
     291                        return 1;
     292                    }
     293                    psz = argv[i];
     294                }
     295
     296                fd = (int)strtol(psz, &psz, 0);
     297                if (!fd || *psz)
     298                {
     299                    fprintf(pStdErr, "%s: error: failed to convert '%s' to a number\n", name(argv[0]), argv[i]);
     300                    return 1;
     301
     302                }
     303                if (fd < 0)
     304                {
     305                    fprintf(pStdErr, "%s: error: negative fd %d (%s)\n", name(argv[0]), fd, argv[i]);
     306                    return 1;
     307                }
     308                /** @todo deal with stderr */
     309                close(fd);
     310                continue;
    239311            }
    240312
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette