Changeset 3433 for trunk/src/kash/eval.c


Ignore:
Timestamp:
Sep 2, 2020, 7:25:31 PM (5 years ago)
Author:
bird
Message:

kash: refactoring forkshell(); simple stuff.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kash/eval.c

    r3065 r3433  
    413413
    414414
     415#ifdef KASH_USE_FORKSHELL2
     416/*
     417 * Child of evalsubshell.
     418 */
     419struct evalsubshellchild
     420{
     421    int flags;
     422    int backgnd;
     423};
     424
     425static int evalsubshell_child(shinstance *psh, union node *n, void *argp)
     426{
     427    struct evalsubshellchild args = *(struct evalsubshellchild *)argp;
     428
     429    INTON;
     430    if (args.backgnd)
     431            args.flags &=~ EV_TESTED;
     432    redirect(psh, n->nredir.redirect, 0);
     433    /* never returns */
     434    evaltree(psh, n->nredir.n, args.flags | EV_EXIT);
     435    /** @todo make us return here. */
     436    return 0;
     437}
     438#endif /* KASH_USE_FORKSHELL2 */
     439
    415440
    416441/*
     
    427452        INTOFF;
    428453        jp = makejob(psh, n, 1);
     454#ifdef KASH_USE_FORKSHELL2
     455        {
     456                struct evalsubshellchild args;
     457                args.flags = flags;
     458                args.backgnd = backgnd;
     459                forkshell2(psh, jp, n, backgnd ? FORK_BG : FORK_FG,
     460                           evalsubshell_child, n, &args, sizeof(args));
     461        }
     462#else
    429463        if (forkshell(psh, jp, n, backgnd ? FORK_BG : FORK_FG) == 0) {
    430464                INTON;
     
    435469                evaltree(psh, n->nredir.n, flags | EV_EXIT);
    436470        }
     471#endif
    437472        if (! backgnd)
    438473                psh->exitstatus = waitforjob(psh, jp);
     
    475510
    476511
     512#ifdef KASH_USE_FORKSHELL2
     513/*
     514 * Child of evalpipe.
     515 */
     516struct evalpipechild
     517{
     518        int prevfd;
     519        int pip[2];
     520};
     521
     522static int evalpipe_child(shinstance *psh, union node *n, void *argp)
     523{
     524        struct evalpipechild args = *(struct evalpipechild *)argp;
     525
     526        if (args.prevfd > 0) {
     527                movefd(psh, args.prevfd, 0);
     528        }
     529        if (args.pip[1] >= 0) {
     530                shfile_close(&psh->fdtab, args.pip[0]);
     531                if (args.pip[1] != 1) {
     532                        movefd(psh, args.pip[1], 1);
     533                }
     534        }
     535        evaltree(psh, n, EV_EXIT);
     536        /** @todo make it return thru here. */
     537        return 0;
     538}
     539#endif /* KASH_USE_FORKSHELL2 */
    477540
    478541/*
     
    508571                        }
    509572                }
     573#ifdef KASH_USE_FORKSHELL2
     574                {
     575                        struct evalpipechild args;
     576                        args.prevfd = prevfd;
     577                        args.pip[0] = pip[0];
     578                        args.pip[1] = pip[1];
     579                        forkshell2(psh, jp, lp->n, n->npipe.backgnd ? FORK_BG : FORK_FG,
     580                                   evalpipe_child, lp->n, &args, sizeof(args));
     581                }
     582#else
    510583                if (forkshell(psh, jp, lp->n, n->npipe.backgnd ? FORK_BG : FORK_FG) == 0) {
    511584                        INTON;
     
    521594                        evaltree(psh, lp->n, EV_EXIT);
    522595                }
     596#endif
    523597                if (prevfd >= 0)
    524598                        shfile_close(&psh->fdtab, prevfd);
     
    533607}
    534608
    535 
     609#ifdef KASH_USE_FORKSHELL2
     610/*
     611 * evalbackcmd child.
     612 */
     613struct evalbackcmdchild
     614{
     615        int pip[2];
     616};
     617
     618static int evalbackcmd_child(shinstance *psh, union node *n, void *argp)
     619{
     620        struct evalbackcmdchild args = *(struct evalbackcmdchild *)argp;
     621
     622        FORCEINTON;
     623        shfile_close(&psh->fdtab, args.pip[0]);
     624        if (args.pip[1] != 1) {
     625                movefd(psh, args.pip[1], 1);
     626        }
     627        eflag(psh) = 0;
     628        evaltree(psh, n, EV_EXIT);
     629        /* NOTREACHED */ /** @todo make it return here to simplify thread handling (no need for setjmp). */
     630        return 0;
     631}
     632#endif /* KASH_USE_FORKSHELL2 */
    536633
    537634/*
     
    574671                        error(psh, "Pipe call failed");
    575672                jp = makejob(psh, n, 1);
     673#ifdef KASH_USE_FORKSHELL2
     674                {
     675                        struct evalbackcmdchild args;
     676                        args.pip[0] = pip[0];
     677                        args.pip[1] = pip[1];
     678                        forkshell2(psh, jp, n, FORK_NOJOB,
     679                                   evalbackcmd_child, n, &args, sizeof(args));
     680                }
     681#else
    576682                if (forkshell(psh, jp, n, FORK_NOJOB) == 0) {
    577683                        FORCEINTON;
     
    584690                        /* NOTREACHED */
    585691                }
     692#endif
    586693                shfile_close(&psh->fdtab, pip[1]);
    587694                result->fd = pip[0];
Note: See TracChangeset for help on using the changeset viewer.