Ignore:
Timestamp:
Dec 1, 2007, 1:22:28 AM (18 years ago)
Author:
bird
Message:

Allow builtins to spawn and schedule spawning.

File:
1 edited

Legend:

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

    r1162 r1290  
    2929#include <stdio.h>
    3030#include <ctype.h>
     31#include <assert.h>
    3132#ifdef _MSC_VER
    3233# include <io.h>
     
    3940#endif
    4041
    41 int kmk_builtin_command(const char *pszCmd)
     42int kmk_builtin_command(const char *pszCmd, char ***ppapszArgvToSpawn, pid_t *pPidSpawned)
    4243{
    4344    int         argc;
     
    151152     */
    152153    if (!*pszCmd)
    153         rc = kmk_builtin_command_parsed(argc, argv);
     154        rc = kmk_builtin_command_parsed(argc, argv, ppapszArgvToSpawn, pPidSpawned);
    154155    else
    155156        rc = 1;
     
    163164
    164165
    165 int kmk_builtin_command_parsed(int argc, char **argv)
     166int kmk_builtin_command_parsed(int argc, char **argv, char ***ppapszArgvToSpawn, pid_t *pPidSpawned)
    166167{
    167168    const char *pszCmd = argv[0];
     
    194195    else if (!strcmp(pszCmd, "kDepIDB"))
    195196        rc = kmk_builtin_kDepIDB(argc, argv, environ);
    196     else if (!strcmp(pszCmd, "ln"))
    197         rc = kmk_builtin_ln(argc, argv, environ);
    198197    else if (!strcmp(pszCmd, "mkdir"))
    199198        rc = kmk_builtin_mkdir(argc, argv, environ);
    200199    else if (!strcmp(pszCmd, "mv"))
    201200        rc = kmk_builtin_mv(argc, argv, environ);
     201    /*else if (!strcmp(pszCmd, "redirect"))
     202        rc = kmk_builtin_redirect(argc, argv, environ, pPidSpawned);*/
    202203    else if (!strcmp(pszCmd, "rm"))
    203204        rc = kmk_builtin_rm(argc, argv, environ);
    204205    else if (!strcmp(pszCmd, "rmdir"))
    205206        rc = kmk_builtin_rmdir(argc, argv, environ);
     207    /*else if (!strcmp(pszCmd, "test"))
     208        rc = kmk_builtin_test(argc, argv, environ, ppapszArgvToSpawn);*/
    206209    /* rarely used commands: */
    207210    else if (!strcmp(pszCmd, "cp"))
    208211        rc = kmk_builtin_cp(argc, argv, environ);
     212    else if (!strcmp(pszCmd, "ln"))
     213        rc = kmk_builtin_ln(argc, argv, environ);
    209214    else if (!strcmp(pszCmd, "md5sum"))
    210215        rc = kmk_builtin_md5sum(argc, argv, environ);
     
    218223        return 1;
    219224    }
     225
     226    /*
     227     * Cleanup.
     228     */
    220229    g_progname = "kmk";                 /* paranoia, make sure it's not pointing at a freed argv[0]. */
    221230    umask(iumask);
     231
     232
     233    /*
     234     * If we've executed a conditional test or something that wishes to execute
     235     * some child process, check if the child is a kmk_builtin thing. We recurse
     236     * here, both because I'm lazy and because it's easier to debug a problem then
     237     * (the call stack shows what's been going on).
     238     */
     239    if (    !rc
     240        &&  *ppapszArgvToSpawn
     241        &&  !strncmp(**ppapszArgvToSpawn, "kmk_builtin_", sizeof("kmk_builtin_") - 1))
     242    {
     243        char **argv_new = *ppapszArgvToSpawn;
     244        int argc_new = 1;
     245        while (argv_new[argc_new])
     246          argc_new++;
     247
     248        assert(argv_new[0] != argv[0]);
     249        assert(!*pPidSpawned);
     250
     251        *ppapszArgvToSpawn = NULL;
     252        rc = kmk_builtin_command_parsed (argc_new, argv_new, ppapszArgvToSpawn, pPidSpawned);
     253
     254        free (argv_new[0]);
     255        free (argv_new);
     256    }
     257
    222258    return rc;
    223259}
Note: See TracChangeset for help on using the changeset viewer.