VirtualBox

Changeset 1207 in kBuild for trunk/src


Ignore:
Timestamp:
Oct 7, 2007 5:09:24 PM (17 years ago)
Author:
bird
Message:

jobs and other stuff.

Location:
trunk/src/kash
Files:
22 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kash/Makefile.kmk

    r1206 r1207  
    3636        error.c \
    3737        eval.c \
     38        exec.c \
     39        expand.c \
    3840        histedit.c \
     41        input.c \
     42        jobs.c \
    3943        mail.c \
    4044        memalloc.c \
    4145        mystring.c \
    4246        options.c \
     47        output.c \
    4348        show.c \
    4449        syntax.c \
    45         output.c \
    46         input.c \
    47         exec.c \
    48         expand.c \
    4950        miscbltin.c \
    5051        bltin/echo.c \
    5152        bltin/test.c \
    5253        \
    53         jobs.c \
    5454        parser.c \
    5555        redir.c \
  • trunk/src/kash/bltin/kill.c

    r1202 r1207  
    6868#define main killcmd
    6969#include "bltin/bltin.h"
     70#include "jobs.h"
    7071#endif /* SHELL */
    7172
     
    153154        for (errors = 0; argc; argc--, argv++) {
    154155#ifdef SHELL
    155                 extern int getjobpgrp(shinstance *psh, const char *);
    156156                if (*argv[0] == '%') {
    157157                        pid = getjobpgrp(psh, *argv);
  • trunk/src/kash/error.c

    r1199 r1207  
    164164                TRACE((psh, "exverror(%d, \"", cond));
    165165                TRACEV((psh, msg, ap));
    166                 TRACE((psh, "\") pid=%d\n", getpid()));
     166                TRACE((psh, "\") pid=%d\n", sh_getpid(psh)));
    167167        } else
    168                 TRACE((psh, "exverror(%d, NULL) pid=%d\n", cond, getpid()));
     168                TRACE((psh, "exverror(%d, NULL) pid=%d\n", cond, sh_getpid(psh)));
    169169#endif
    170170        if (msg)
  • trunk/src/kash/eval.c

    r1203 r1207  
    234234#endif
    235235        TRACE((psh, "pid %d, evaltree(%p: %d, %d) called\n",
    236                getpid(), n, n->type, flags));
     236               sh_getpid(psh), n, n->type, flags));
    237237        switch (n->type) {
    238238        case NSEMI:
  • trunk/src/kash/exec.c

    r1203 r1207  
    676676                /* XXX this code stops root executing stuff, and is buggy
    677677                   if you need a group from the group list. */
    678                 if (statb.st_uid == geteuid()) {
     678                if (statb.st_uid == sh_geteuid(psh)) {
    679679                        if ((statb.st_mode & 0100) == 0)
    680680                                goto loop;
    681                 } else if (statb.st_gid == getegid()) {
     681                } else if (statb.st_gid == sh_getegid(psh)) {
    682682                        if ((statb.st_mode & 010) == 0)
    683683                                goto loop;
  • trunk/src/kash/expand.c

    r1203 r1207  
    453453                        if (in.fd < 0)
    454454                                break;
    455                         while ((i = read(in.fd, buf, sizeof buf)) < 0 && errno == EINTR);
     455                        while ((i = shfile_read(&psh->fdtab, in.fd, buf, sizeof buf)) < 0 && errno == EINTR);
    456456                        TRACE((psh, "expbackq: read returns %d\n", i));
    457457                        if (i <= 0)
     
    474474
    475475        if (in.fd >= 0)
    476                 close(in.fd);
     476                shfile_close(&psh->fdtab, in.fd);
    477477        if (in.buf)
    478478                ckfree(in.buf);
     
    11921192                                break;
    11931193                }
    1194                 if (metaflag == 0 || lstat(psh->expdir, &statb) >= 0)
     1194                if (metaflag == 0 || shfile_lstat(&psh->fdtab, psh->expdir, &statb) >= 0)
    11951195                        addfname(psh, psh->expdir);
    11961196                return;
  • trunk/src/kash/histedit.c

    r1203 r1207  
    389389                        error(psh, "can't create temporary file %s", editfile);
    390390                if ((efp = fdopen(fd, "w")) == NULL) {
    391                         close(fd);
     391                        shfile_close(&psh->fdtab, fd);
    392392                        error(psh, "can't allocate stdio buffer for temp");
    393393                }
  • trunk/src/kash/jobs.c

    r1203 r1207  
    4848#include <fcntl.h>
    4949#ifdef __sun__
    50 #define sys_siglist _sys_siglist
     50# define sys_siglist _sys_siglist
    5151#endif
    5252#include <signal.h>
     
    5555#include <stdlib.h>
    5656#ifndef __sun__
    57 #include <paths.h>
     57# include <paths.h>
    5858#endif
    5959#include <sys/types.h>
    6060#include <sys/param.h>
    6161#if defined(BSD) || defined(__sun__)
    62 #include <sys/wait.h>
    63 #include <sys/time.h>
    64 #include <sys/resource.h>
     62# include <sys/wait.h>
     63# include <sys/time.h>
     64# include <sys/resource.h>
    6565#endif
    6666#include <sys/ioctl.h>
     
    6868#include "shell.h"
    6969#if JOBS
    70 #if OLD_TTY_DRIVER
    71 #include "sgtty.h"
    72 #else
    73 #include <termios.h>
    74 #endif
    75 #undef CEOF                     /* syntax.h redefines this */
     70# include <termios.h>
     71# undef CEOF                    /* syntax.h redefines this */
    7672#endif
    7773#include "redir.h"
     
    8985#include "error.h"
    9086#include "mystring.h"
    91 
    92 
    93 static struct job *jobtab;              /* array of jobs */
    94 static int njobs;                       /* size of array */
    95 static int jobs_invalid;                /* set in child */
    96 MKINIT pid_t psh->backgndpid = -1;      /* pid of last background process */
    97 #if JOBS
    98 int initialpgrp;                /* pgrp of shell on invocation */
    99 static int curjob = -1;         /* current job */
    100 #endif
    101 static int ttyfd = -1;
    102 
    103 STATIC void restartjob(struct job *);
    104 STATIC void freejob(struct job *);
    105 STATIC struct job *getjob(const char *, int);
    106 STATIC int dowait(int, struct job *);
    107 STATIC int onsigchild(void);
    108 STATIC int waitproc(int, struct job *, int *);
    109 STATIC void cmdtxt(union node *);
    110 STATIC void cmdlist(union node *, int);
    111 STATIC void cmdputs(const char *);
    112 
    113 #ifdef OLD_TTY_DRIVER
    114 static pid_t tcgetpgrp(int fd);
    115 static int tcsetpgrp(int fd, pid_t pgrp);
    116 
    117 static pid_t
    118 tcgetpgrp(shinstance *psh, int fd)
    119 {
    120         pid_t pgrp;
    121         if (shfile_ioctl(&psh->fdtab, fd, TIOCGPGRP, (char *)&pgrp) == -1)
    122                 return -1;
    123         else
    124                 return pgrp;
    125 }
    126 
    127 static int
    128 tcsetpgrp(shinstance *psh, int fd, pid_tpgrp)
    129 {
    130         return shfile_ioctl(&psh->fdtab, fd, TIOCSPGRP, (char *)&pgrp);
    131 }
    132 #endif
     87#include "shinstance.h"
     88
     89//static struct job *jobtab;            /* array of jobs */
     90//static int njobs;                     /* size of array */
     91//static int jobs_invalid;              /* set in child */
     92//MKINIT pid_t backgndpid = -1; /* pid of last background process */
     93#if JOBS
     94//int initialpgrp;              /* pgrp of shell on invocation */
     95//static int curjob = -1;               /* current job */
     96#endif
     97//static int ttyfd = -1;
     98
     99STATIC void restartjob(shinstance *, struct job *);
     100STATIC void freejob(shinstance *, struct job *);
     101STATIC struct job *getjob(shinstance *, const char *, int);
     102STATIC int dowait(shinstance *, int, struct job *);
     103STATIC int waitproc(shinstance *, int, struct job *, int *);
     104STATIC void cmdtxt(shinstance *, union node *);
     105STATIC void cmdlist(shinstance *, union node *, int);
     106STATIC void cmdputs(shinstance *, const char *);
     107
    133108
    134109/*
     
    140115 */
    141116
    142 MKINIT int jobctl;
     117//MKINIT int jobctl;
    143118
    144119void
    145 setjobctl(int on)
    146 {
    147 #ifdef OLD_TTY_DRIVER
    148         int ldisc;
    149 #endif
    150 
    151         if (on == jobctl || rootshell == 0)
     120setjobctl(shinstance *psh, int on)
     121{
     122        if (on == psh->jobctl || psh->rootshell == 0)
    152123                return;
    153124        if (on) {
     
    155126                int err;
    156127                int i;
    157                 if (ttyfd != -1)
    158                         close(ttyfd);
    159                 if ((ttyfd = open("/dev/tty", O_RDWR)) == -1) {
     128                if (psh->ttyfd != -1)
     129                        shfile_close(&psh->fdtab, psh->ttyfd);
     130                if ((psh->ttyfd = shfile_open(&psh->fdtab, "/dev/tty", O_RDWR)) == -1) {
    160131                        for (i = 0; i < 3; i++) {
    161                                 if (isatty(i) && (ttyfd = dup(i)) != -1)
     132                                if (shfile_isatty(&psh->fdtab, i)
     133                                 && (psh->ttyfd = shfile_dup(&psh->fdtab, i)) != -1)
    162134                                        break;
    163135                        }
     
    167139                /* Move to a high fd */
    168140                for (i = 10; i > 2; i--) {
    169                         if ((err = fcntl(ttyfd, F_DUPFD, (1 << i) - 1)) != -1)
     141                        if ((err = shfile_fcntl(&psh->fdtab, psh->ttyfd, F_DUPFD, (1 << i) - 1)) != -1)
    170142                                break;
    171143                }
    172144                if (err != -1) {
    173                         close(ttyfd);
    174                         ttyfd = err;
     145                        shfile_close(&psh->fdtab, psh->ttyfd);
     146                        psh->ttyfd = err;
    175147                }
    176148#ifdef FIOCLEX
    177                 err = ioctl(ttyfd, FIOCLEX, 0);
     149                err = shfile_ioctl(&psh->fdtab, psh->ttyfd, FIOCLEX, 0);
    178150#elif FD_CLOEXEC
    179                 err = fcntl(ttyfd, F_SETFD,
    180                     fcntl(ttyfd, F_GETFD, 0) | FD_CLOEXEC);
     151                err = shfile_fcntl(&psh->fdtab, psh->ttyfd, F_SETFD,
     152                    shfile_fcntl(&psh->fdtab, psh->ttyfd, F_GETFD, 0) | FD_CLOEXEC);
    181153#endif
    182154                if (err == -1) {
    183                         close(ttyfd);
    184                         ttyfd = -1;
     155                        shfile_close(&psh->fdtab, psh->ttyfd);
     156                        psh->ttyfd = -1;
    185157                        goto out;
    186158                }
     
    190162#endif
    191163                do { /* while we are in the background */
    192                         if ((initialpgrp = tcgetpgrp(ttyfd)) < 0) {
     164                        if ((psh->initialpgrp = sh_tcgetpgrp(psh, psh->ttyfd)) < 0) {
    193165out:
    194166                                out2str(psh, "sh: can't access tty; job control turned off\n");
     
    196168                                return;
    197169                        }
    198                         if (initialpgrp == -1)
    199                                 initialpgrp = getpgrp();
    200                         else if (initialpgrp != getpgrp()) {
    201                                 killpg(0, SIGTTIN);
     170                        if (psh->initialpgrp == -1)
     171                                psh->initialpgrp = sh_getpgrp(psh);
     172                        else if (psh->initialpgrp != sh_getpgrp(psh)) {
     173                                sh_killpg(psh, 0, SIGTTIN);
    202174                                continue;
    203175                        }
    204176                } while (0);
    205177
    206 #ifdef OLD_TTY_DRIVER
    207                 if (ioctl(ttyfd, TIOCGETD, (char *)&ldisc) < 0
    208                     || ldisc != NTTYDISC) {
    209                         out2str(psh, "sh: need new tty driver to run job control; job control turned off\n");
    210                         mflag(psh) = 0;
    211                         return;
    212                 }
    213 #endif
    214178                setsignal(psh, SIGTSTP, 0);
    215179                setsignal(psh, SIGTTOU, 0);
    216180                setsignal(psh, SIGTTIN, 0);
    217                 if (getpgid(0) != psh->rootpid && sh_setpgid(0, psh->rootpid) == -1)
     181                if (sh_getpgid(psh, 0) != psh->rootpid && sh_setpgid(psh, 0, psh->rootpid) == -1)
    218182                        error(psh, "Cannot set process group (%s) at %d",
    219183                            strerror(errno), __LINE__);
    220                 if (tcsetpgrp(ttyfd, psh->rootpid) == -1)
     184                if (sh_tcsetpgrp(psh, psh->ttyfd, psh->rootpid) == -1)
    221185                        error(psh, "Cannot set tty process group (%s) at %d",
    222186                            strerror(errno), __LINE__);
    223187        } else { /* turning job control off */
    224                 if (getpgid(0) != initialpgrp && sh_setpgid(0, initialpgrp) == -1)
     188                if (sh_getpgid(psh, 0) != psh->initialpgrp && sh_setpgid(psh, 0, psh->initialpgrp) == -1)
    225189                        error(psh, "Cannot set process group (%s) at %d",
    226190                            strerror(errno), __LINE__);
    227                 if (tcsetpgrp(ttyfd, initialpgrp) == -1)
     191                if (sh_tcsetpgrp(psh, psh->ttyfd, psh->initialpgrp) == -1)
    228192                        error(psh, "Cannot set tty process group (%s) at %d",
    229193                            strerror(errno), __LINE__);
    230                 close(ttyfd);
    231                 ttyfd = -1;
     194                shfile_close(&psh->fdtab, psh->ttyfd);
     195                psh->ttyfd = -1;
    232196                setsignal(psh, SIGTSTP, 0);
    233197                setsignal(psh, SIGTTOU, 0);
    234198                setsignal(psh, SIGTTIN, 0);
    235199        }
    236         jobctl = on;
     200        psh->jobctl = on;
    237201}
    238202
     
    261225
    262226        nextopt(psh, "");
    263         jp = getjob(*psh->argptr, 0);
     227        jp = getjob(psh, *psh->argptr, 0);
    264228        if (jp->jobctl == 0)
    265229                error(psh, "job not created under job control");
     
    271235
    272236        for (i = 0; i < jp->nprocs; i++)
    273             if (tcsetpgrp(psh, ttyfd, jp->ps[i].pid) != -1)
     237            if (sh_tcsetpgrp(psh, psh->ttyfd, jp->ps[i].pid) != -1)
    274238                    break;
    275239
     
    286250
    287251static void
    288 set_curjob(struct job *jp, int mode)
     252set_curjob(shinstance *psh, struct job *jp, int mode)
    289253{
    290254        struct job *jp1, *jp2;
    291255        int i, ji;
    292256
    293         ji = jp - jobtab;
     257        ji = (int)(jp - psh->jobtab);
    294258
    295259        /* first remove from list */
    296         if (ji == curjob)
    297                 curjob = jp->prev_job;
     260        if (ji == psh->curjob)
     261                psh->curjob = jp->prev_job;
    298262        else {
    299                 for (i = 0; i < njobs; i++) {
    300                         if (jobtab[i].prev_job != ji)
     263                for (i = 0; i < psh->njobs; i++) {
     264                        if (psh->jobtab[i].prev_job != ji)
    301265                                continue;
    302                         jobtab[i].prev_job = jp->prev_job;
     266                        psh->jobtab[i].prev_job = jp->prev_job;
    303267                        break;
    304268                }
     
    312276        case 1: /* newly created job or backgrounded job,
    313277                   put after all stopped jobs. */
    314                 if (curjob != -1 && jobtab[curjob].state == JOBSTOPPED) {
    315                         for (jp1 = jobtab + curjob; ; jp1 = jp2) {
     278                if (psh->curjob != -1 && psh->jobtab[psh->curjob].state == JOBSTOPPED) {
     279                        for (jp1 = psh->jobtab + psh->curjob; ; jp1 = jp2) {
    316280                                if (jp1->prev_job == -1)
    317281                                        break;
    318                                 jp2 = jobtab + jp1->prev_job;
     282                                jp2 = psh->jobtab + jp1->prev_job;
    319283                                if (jp2->state != JOBSTOPPED)
    320284                                        break;
     
    325289                }
    326290                /* FALLTHROUGH */
    327         case 2: /* newly stopped job - becomes curjob */
    328                 jp->prev_job = curjob;
    329                 curjob = ji;
     291        case 2: /* newly stopped job - becomes psh->curjob */
     292                jp->prev_job = psh->curjob;
     293                psh->curjob = ji;
    330294                break;
    331295        }
     
    333297
    334298int
    335 bgcmd(int argc, char **argv)
     299bgcmd(shinstance *psh, int argc, char **argv)
    336300{
    337301        struct job *jp;
     
    343307                if (jp->jobctl == 0)
    344308                        error(psh, "job not created under job control");
    345                 set_curjob(jp, 1);
    346                 out1fmt(psh, "[%ld] %s", (long)(jp - jobtab + 1), jp->ps[0].cmd);
     309                set_curjob(psh, jp, 1);
     310                out1fmt(psh, "[%ld] %s", (long)(jp - psh->jobtab + 1), jp->ps[0].cmd);
    347311                for (i = 1; i < jp->nprocs; i++)
    348312                        out1fmt(psh, " | %s", jp->ps[i].cmd );
    349313                out1c(psh, '\n');
    350314                output_flushall(psh);
    351                 restartjob(jp);
     315                restartjob(psh, jp);
    352316        } while (*psh->argptr && *++psh->argptr);
    353317        return 0;
     
    356320
    357321STATIC void
    358 restartjob(struct job *jp)
     322restartjob(shinstance *psh, struct job *jp)
    359323{
    360324        struct procstat *ps;
     
    365329        INTOFF;
    366330        for (i = 0; i < jp->nprocs; i++)
    367                 if (killpg(jp->ps[i].pid, SIGCONT) != -1)
     331                if (sh_killpg(psh, jp->ps[i].pid, SIGCONT) != -1)
    368332                        break;
    369333        if (i >= jp->nprocs)
     
    380344
    381345static void
    382 showjob(struct output *out, struct job *jp, int mode)
     346showjob(shinstance *psh, struct output *out, struct job *jp, int mode)
    383347{
    384348        int procno;
    385349        int st;
    386350        struct procstat *ps;
    387         int col;
     351        size_t col;
    388352        char s[64];
    389353
     
    425389        if (mode & SHOW_SIGNALLED && !(mode & SHOW_ISSIG)) {
    426390                if (jp->state == JOBDONE && !(mode & SHOW_NO_FREE)) {
    427                         TRACE((psh, "showjob: freeing job %d\n", jp - jobtab + 1));
    428                         freejob(jp);
     391                        TRACE((psh, "showjob: freeing job %d\n", jp - psh->jobtab + 1));
     392                        freejob(psh, jp);
    429393                }
    430394                return;
     
    434398                if (ps == jp->ps)
    435399                        fmtstr(s, 16, "[%ld] %c ",
    436                                 (long)(jp - jobtab + 1),
    437 #if JOBS
    438                                 jp == jobtab + curjob ? '+' :
    439                                 curjob != -1 && jp == jobtab +
    440                                             jobtab[curjob].prev_job ? '-' :
     400                                (long)(jp - psh->jobtab + 1),
     401#if JOBS
     402                                jp == psh->jobtab + psh->curjob ? '+' :
     403                                psh->curjob != -1 && jp == psh->jobtab +
     404                                            psh->jobtab[psh->curjob].prev_job ? '-' :
    441405#endif
    442406                                ' ');
     
    494458        jp->changed = 0;
    495459        if (jp->state == JOBDONE && !(mode & SHOW_NO_FREE))
    496                 freejob(jp);
     460                freejob(psh, jp);
    497461}
    498462
    499463
    500464int
    501 jobscmd(int argc, char **argv)
     465jobscmd(shinstance *psh, int argc, char **argv)
    502466{
    503467        int mode, m;
    504         int sv = jobs_invalid;
    505 
    506         jobs_invalid = 0;
     468        int sv = psh->jobs_invalid;
     469
     470        psh->jobs_invalid = 0;
    507471        mode = 0;
    508472        while ((m = nextopt(psh, "lp")))
     
    513477        if (*psh->argptr)
    514478                do
    515                         showjob(out1, getjob(*psh->argptr,0), mode);
     479                        showjob(psh, psh->out1, getjob(psh, *psh->argptr,0), mode);
    516480                while (*++psh->argptr);
    517481        else
    518                 showjobs(psh, out1, mode);
    519         jobs_invalid = sv;
     482                showjobs(psh, psh->out1, mode);
     483        psh->jobs_invalid = sv;
    520484        return 0;
    521485}
     
    532496
    533497void
    534 showjobs(struct output *out, int mode)
     498showjobs(shinstance *psh, struct output *out, int mode)
    535499{
    536500        int jobno;
     
    541505
    542506        /* If not even one one job changed, there is nothing to do */
    543         gotpid = dowait(0, NULL);
    544         while (dowait(0, NULL) > 0)
     507        gotpid = dowait(psh, 0, NULL);
     508        while (dowait(psh, 0, NULL) > 0)
    545509                continue;
    546510#ifdef JOBS
     
    549513         * put us in it.
    550514         */
    551         if (mflag(psh) && gotpid != -1 && tcgetpgrp(ttyfd) != getpid()) {
    552                 if (tcsetpgrp(ttyfd, getpid()) == -1)
     515        if (mflag(psh) && gotpid != -1 && sh_tcgetpgrp(psh, psh->ttyfd) != sh_getpid(psh)) {
     516                if (sh_tcsetpgrp(psh, psh->ttyfd, sh_getpid(psh)) == -1)
    553517                        error(psh, "Cannot set tty process group (%s) at %d",
    554518                            strerror(errno), __LINE__);
     
    557521        }
    558522#endif
    559         if (jobs_invalid)
     523        if (psh->jobs_invalid)
    560524                return;
    561525
    562         for (jobno = 1, jp = jobtab ; jobno <= njobs ; jobno++, jp++) {
     526        for (jobno = 1, jp = psh->jobtab ; jobno <= psh->njobs ; jobno++, jp++) {
    563527                if (!jp->used)
    564528                        continue;
    565529                if (jp->nprocs == 0) {
    566                         freejob(jp);
     530                        freejob(psh, jp);
    567531                        continue;
    568532                }
     
    573537                        continue;
    574538                }
    575                 showjob(out, jp, mode);
     539                showjob(psh, out, jp, mode);
    576540        }
    577541}
     
    582546
    583547STATIC void
    584 freejob(struct job *jp)
     548freejob(shinstance *psh, struct job *jp)
    585549{
    586550        INTOFF;
     
    592556        jp->used = 0;
    593557#if JOBS
    594         set_curjob(jp, 0);
     558        set_curjob(psh, jp, 0);
    595559#endif
    596560        INTON;
     
    600564
    601565int
    602 waitcmd(int argc, char **argv)
     566waitcmd(shinstance *psh, int argc, char **argv)
    603567{
    604568        struct job *job;
     
    610574        if (!*psh->argptr) {
    611575                /* wait for all jobs */
    612                 jp = jobtab;
    613                 if (jobs_invalid)
     576                jp = psh->jobtab;
     577                if (psh->jobs_invalid)
    614578                        return 0;
    615579                for (;;) {
    616                         if (jp >= jobtab + njobs) {
     580                        if (jp >= psh->jobtab + psh->njobs) {
    617581                                /* no running procs */
    618582                                return 0;
     
    622586                                continue;
    623587                        }
    624                         if (dowait(1, (struct job *)NULL) == -1)
     588                        if (dowait(psh, 1, (struct job *)NULL) == -1)
    625589                               return 128 + SIGINT;
    626                         jp = jobtab;
     590                        jp = psh->jobtab;
    627591                }
    628592        }
     
    630594        retval = 127;           /* XXXGCC: -Wuninitialized */
    631595        for (; *psh->argptr; psh->argptr++) {
    632                 job = getjob(*psh->argptr, 1);
     596                job = getjob(psh, *psh->argptr, 1);
    633597                if (!job) {
    634598                        retval = 127;
     
    637601                /* loop until process terminated or stopped */
    638602                while (job->state == JOBRUNNING) {
    639                         if (dowait(1, (struct job *)NULL) == -1)
     603                        if (dowait(psh, 1, (struct job *)NULL) == -1)
    640604                               return 128 + SIGINT;
    641605                }
     
    652616                }
    653617                if (!iflag(psh))
    654                         freejob(job);
     618                        freejob(psh, job);
    655619        }
    656620        return retval;
     
    660624
    661625int
    662 jobidcmd(int argc, char **argv)
     626jobidcmd(shinstance *psh, int argc, char **argv)
    663627{
    664628        struct job *jp;
     
    666630
    667631        nextopt(psh, "");
    668         jp = getjob(*psh->argptr, 0);
     632        jp = getjob(psh, *psh->argptr, 0);
    669633        for (i = 0 ; i < jp->nprocs ; ) {
    670634                out1fmt(psh, "%ld", (long)jp->ps[i].pid);
     
    675639
    676640int
    677 getjobpgrp(const char *name)
     641getjobpgrp(shinstance *psh, const char *name)
    678642{
    679643        struct job *jp;
    680644
    681         jp = getjob(name, 1);
     645        jp = getjob(psh, name, 1);
    682646        if (jp == 0)
    683647                return 0;
     
    690654
    691655STATIC struct job *
    692 getjob(const char *name, int noerror)
     656getjob(shinstance *psh, const char *name, int noerror)
    693657{
    694658        int jobno = -1;
     
    700664        if (name == NULL) {
    701665#if JOBS
    702                 jobno = curjob;
     666                jobno = psh->curjob;
    703667#endif
    704668                err_msg = "No current job";
     
    712676                        case '+':
    713677                        case '%':
    714                                 jobno = curjob;
     678                                jobno = psh->curjob;
    715679                                err_msg = "No current job";
    716680                                break;
    717681                        case '-':
    718                                 jobno = curjob;
     682                                jobno = psh->curjob;
    719683                                if (jobno != -1)
    720                                         jobno = jobtab[jobno].prev_job;
     684                                        jobno = psh->jobtab[jobno].prev_job;
    721685                                err_msg = "No previous job";
    722686                                break;
     
    729693    check_pattern:
    730694                        found = NULL;
    731                         for (jp = jobtab, i = njobs ; --i >= 0 ; jp++) {
     695                        for (jp = psh->jobtab, i = psh->njobs ; --i >= 0 ; jp++) {
    732696                                if (!jp->used || jp->nprocs <= 0)
    733697                                        continue;
     
    749713        } else if (is_number(name)) {
    750714                pid = number(psh, name);
    751                 for (jp = jobtab, i = njobs ; --i >= 0 ; jp++) {
     715                for (jp = psh->jobtab, i = psh->njobs ; --i >= 0 ; jp++) {
    752716                        if (jp->used && jp->nprocs > 0
    753717                         && jp->ps[jp->nprocs - 1].pid == pid)
     
    756720        }
    757721
    758         if (!jobs_invalid && jobno >= 0 && jobno < njobs) {
    759                 jp = jobtab + jobno;
     722        if (!psh->jobs_invalid && jobno >= 0 && jobno < psh->njobs) {
     723                jp = psh->jobtab + jobno;
    760724                if (jp->used)
    761725                        return jp;
     
    773737
    774738struct job *
    775 makejob(union node *node, int nprocs)
     739makejob(shinstance *psh, union node *node, int nprocs)
    776740{
    777741        int i;
    778742        struct job *jp;
    779743
    780         if (jobs_invalid) {
    781                 for (i = njobs, jp = jobtab ; --i >= 0 ; jp++) {
     744        if (psh->jobs_invalid) {
     745                for (i = psh->njobs, jp = psh->jobtab ; --i >= 0 ; jp++) {
    782746                        if (jp->used)
    783                                 freejob(jp);
    784                 }
    785                 jobs_invalid = 0;
    786         }
    787 
    788         for (i = njobs, jp = jobtab ; ; jp++) {
     747                                freejob(psh, jp);
     748                }
     749                psh->jobs_invalid = 0;
     750        }
     751
     752        for (i = psh->njobs, jp = psh->jobtab ; ; jp++) {
    789753                if (--i < 0) {
    790754                        INTOFF;
    791                         if (njobs == 0) {
    792                                 jobtab = ckmalloc(4 * sizeof jobtab[0]);
     755                        if (psh->njobs == 0) {
     756                                psh->jobtab = ckmalloc(4 * sizeof psh->jobtab[0]);
    793757                        } else {
    794                                 jp = ckmalloc((njobs + 4) * sizeof jobtab[0]);
    795                                 memcpy(jp, jobtab, njobs * sizeof jp[0]);
     758                                jp = ckmalloc((psh->njobs + 4) * sizeof psh->jobtab[0]);
     759                                memcpy(jp, psh->jobtab, psh->njobs * sizeof jp[0]);
    796760                                /* Relocate `ps' pointers */
    797                                 for (i = 0; i < njobs; i++)
    798                                         if (jp[i].ps == &jobtab[i].ps0)
     761                                for (i = 0; i < psh->njobs; i++)
     762                                        if (jp[i].ps == &psh->jobtab[i].ps0)
    799763                                                jp[i].ps = &jp[i].ps0;
    800                                 ckfree(jobtab);
    801                                 jobtab = jp;
     764                                ckfree(psh->jobtab);
     765                                psh->jobtab = jp;
    802766                        }
    803                         jp = jobtab + njobs;
    804                         for (i = 4 ; --i >= 0 ; jobtab[njobs++].used = 0);
     767                        jp = psh->jobtab + psh->njobs;
     768                        for (i = 4 ; --i >= 0 ; psh->jobtab[psh->njobs++].used = 0);
    805769                        INTON;
    806770                        break;
     
    815779        jp->nprocs = 0;
    816780#if JOBS
    817         jp->jobctl = jobctl;
    818         set_curjob(jp, 1);
     781        jp->jobctl = psh->jobctl;
     782        set_curjob(psh, jp, 1);
    819783#endif
    820784        if (nprocs > 1) {
     
    825789        INTON;
    826790        TRACE((psh, "makejob(0x%lx, %d) returns %%%d\n", (long)node, nprocs,
    827                jp - jobtab + 1));
     791               jp - psh->jobtab + 1));
    828792        return jp;
    829793}
     
    846810
    847811int
    848 forkshell(struct job *jp, union node *n, int mode)
     812forkshell(shinstance *psh, struct job *jp, union node *n, int mode)
    849813{
    850814        int pid;
    851815
    852         TRACE((psh, "forkshell(%%%d, %p, %d) called\n", jp - jobtab, n, mode));
     816        TRACE((psh, "forkshell(%%%d, %p, %d) called\n", jp - psh->jobtab, n, mode));
    853817        switch ((pid = fork())) {
    854818        case -1:
     
    856820                INTON;
    857821                error(psh, "Cannot fork");
    858                 break;
     822                return -1; /* won't get here */
    859823        case 0:
    860824                forkchild(psh, jp, n, mode, 0);
     
    866830
    867831int
    868 forkparent(struct job *jp, union node *n, int mode, pid_t pid)
     832forkparent(shinstance *psh, struct job *jp, union node *n, int mode, pid_t pid)
    869833{
    870834        int pgrp;
    871835
    872         if (rootshell && mode != FORK_NOJOB && mflag(psh)) {
     836        if (psh->rootshell && mode != FORK_NOJOB && mflag(psh)) {
    873837                if (jp == NULL || jp->nprocs == 0)
    874838                        pgrp = pid;
     
    876840                        pgrp = jp->ps[0].pid;
    877841                /* This can fail because we are doing it in the child also */
    878                 (void)setpgid(pid, pgrp);
     842                (void)sh_setpgid(psh, pid, pgrp);
    879843        }
    880844        if (mode == FORK_BG)
    881                 psh0->backgndpid = pid;         /* set $! */
     845                psh->backgndpid = pid;          /* set $! */
    882846        if (jp) {
    883847                struct procstat *ps = &jp->ps[jp->nprocs++];
     
    893857
    894858void
    895 forkchild(struct job *jp, union node *n, int mode, int vforked)
     859forkchild(shinstance *psh, struct job *jp, union node *n, int mode, int vforked)
    896860{
    897861        int wasroot;
     
    900864        const char *nullerr = "Can't open %s";
    901865
    902         wasroot = rootshell;
    903         TRACE((psh, "Child shell %d\n", getpid()));
     866        wasroot = psh->rootshell;
     867        TRACE((psh, "Child shell %d\n", sh_getpid(psh)));
    904868        if (!vforked)
    905                 rootshell = 0;
     869                psh->rootshell = 0;
    906870
    907871        closescript(psh, vforked);
     
    909873#if JOBS
    910874        if (!vforked)
    911                 jobctl = 0;             /* do job control only in root shell */
     875                psh->jobctl = 0;                /* do job control only in root shell */
    912876        if (wasroot && mode != FORK_NOJOB && mflag(psh)) {
    913877                if (jp == NULL || jp->nprocs == 0)
    914                         pgrp = getpid();
     878                        pgrp = sh_getpid(psh);
    915879                else
    916880                        pgrp = jp->ps[0].pid;
    917881                /* This can fail because we are doing it in the parent also */
    918                 (void)setpgid(0, pgrp);
     882                (void)sh_setpgid(psh, 0, pgrp);
    919883                if (mode == FORK_FG) {
    920                         if (tcsetpgrp(ttyfd, pgrp) == -1)
     884                        if (sh_tcsetpgrp(psh, psh->ttyfd, pgrp) == -1)
    921885                                error(psh, "Cannot set tty process group (%s) at %d",
    922886                                    strerror(errno), __LINE__);
     
    929893                if ((jp == NULL || jp->nprocs == 0) &&
    930894                    ! fd0_redirected_p(psh)) {
    931                         close(0);
     895                        shfile_close(&psh->fdtab, 0);
    932896                        if (open(devnull, O_RDONLY) != 0)
    933897                                error(psh, nullerr, devnull);
     
    940904                if ((jp == NULL || jp->nprocs == 0) &&
    941905                    ! fd0_redirected_p(psh)) {
    942                         close(0);
     906                        shfile_close(&psh->fdtab, 0);
    943907                        if (open(devnull, O_RDONLY) != 0)
    944908                                error(psh, nullerr, devnull);
     
    953917
    954918        if (!vforked)
    955                 jobs_invalid = 1;
     919                psh->jobs_invalid = 1;
    956920}
    957921
     
    976940
    977941int
    978 waitforjob(struct job *jp)
    979 {
    980 #if JOBS
    981         int mypgrp = getpgrp();
     942waitforjob(shinstance *psh, struct job *jp)
     943{
     944#if JOBS
     945        int mypgrp = sh_getpgrp(psh);
    982946#endif
    983947        int status;
     
    985949
    986950        INTOFF;
    987         TRACE((psh, "waitforjob(%%%d) called\n", jp - jobtab + 1));
     951        TRACE((psh, "waitforjob(%%%d) called\n", jp - psh->jobtab + 1));
    988952        while (jp->state == JOBRUNNING) {
    989                 dowait(1, jp);
     953                dowait(psh, 1, jp);
    990954        }
    991955#if JOBS
    992956        if (jp->jobctl) {
    993                 if (tcsetpgrp(ttyfd, mypgrp) == -1)
     957                if (sh_tcsetpgrp(psh, psh->ttyfd, mypgrp) == -1)
    994958                        error(psh, "Cannot set tty process group (%s) at %d",
    995959                            strerror(errno), __LINE__);
    996960        }
    997         if (jp->state == JOBSTOPPED && curjob != jp - jobtab)
    998                 set_curjob(jp, 2);
     961        if (jp->state == JOBSTOPPED && psh->curjob != jp - psh->jobtab)
     962                set_curjob(psh, jp, 2);
    999963#endif
    1000964        status = jp->ps[jp->nprocs - 1].status;
     
    1009973                st = WTERMSIG(status) + 128;
    1010974        TRACE((psh, "waitforjob: job %d, nproc %d, status %x, st %x\n",
    1011                 jp - jobtab + 1, jp->nprocs, status, st ));
     975                jp - psh->jobtab + 1, jp->nprocs, status, st ));
    1012976#if JOBS
    1013977        if (jp->jobctl) {
     
    1025989#endif
    1026990        if (! JOBS || jp->state == JOBDONE)
    1027                 freejob(jp);
     991                freejob(psh, jp);
    1028992        INTON;
    1029993        return st;
     
    10371001
    10381002STATIC int
    1039 dowait(int block, struct job *job)
     1003dowait(shinstance *psh, int block, struct job *job)
    10401004{
    10411005        int pid;
     
    10461010        int done;
    10471011        int stopped;
    1048         extern volatile char gotsig[];
    10491012
    10501013        TRACE((psh, "dowait(%d) called\n", block));
    10511014        do {
    1052                 pid = waitproc(block, job, &status);
     1015                pid = waitproc(psh, block, job, &status);
    10531016                TRACE((psh, "wait returns pid %d, status %d\n", pid, status));
    1054         } while (pid == -1 && errno == EINTR && gotsig[SIGINT - 1] == 0);
     1017        } while (pid == -1 && errno == EINTR && psh->gotsig[SIGINT - 1] == 0);
    10551018        if (pid <= 0)
    10561019                return pid;
    10571020        INTOFF;
    10581021        thisjob = NULL;
    1059         for (jp = jobtab ; jp < jobtab + njobs ; jp++) {
     1022        for (jp = psh->jobtab ; jp < psh->jobtab + psh->njobs ; jp++) {
    10601023                if (jp->used) {
    10611024                        done = 1;
     
    10651028                                        continue;
    10661029                                if (sp->pid == pid) {
    1067                                         TRACE((psh, "Job %d: changing status of proc %d from 0x%x to 0x%x\n", jp - jobtab + 1, pid, sp->status, status));
     1030                                        TRACE((psh, "Job %d: changing status of proc %d from 0x%x to 0x%x\n", jp - psh->jobtab + 1, pid, sp->status, status));
    10681031                                        sp->status = status;
    10691032                                        thisjob = jp;
     
    10771040                                int state = done ? JOBDONE : JOBSTOPPED;
    10781041                                if (jp->state != state) {
    1079                                         TRACE((psh, "Job %d: changing state from %d to %d\n", jp - jobtab + 1, jp->state, state));
     1042                                        TRACE((psh, "Job %d: changing state from %d to %d\n", jp - psh->jobtab + 1, jp->state, state));
    10801043                                        jp->state = state;
    10811044#if JOBS
    10821045                                        if (done)
    1083                                                 set_curjob(jp, 0);
     1046                                                set_curjob(psh, jp, 0);
    10841047#endif
    10851048                                }
     
    10901053        if (thisjob && thisjob->state != JOBRUNNING) {
    10911054                int mode = 0;
    1092                 if (!rootshell || !iflag(psh))
     1055                if (!psh->rootshell || !iflag(psh))
    10931056                        mode = SHOW_SIGNALLED;
    10941057                if (job == thisjob)
    10951058                        mode = SHOW_SIGNALLED | SHOW_NO_FREE;
    10961059                if (mode)
    1097                         showjob(psh->out2, thisjob, mode);
     1060                        showjob(psh, psh->out2, thisjob, mode);
    10981061                else {
    10991062                        TRACE((psh, "Not printing status, rootshell=%d, job=%p\n",
    1100                                 rootshell, job));
     1063                                psh->rootshell, job));
    11011064                        thisjob->changed = 1;
    11021065                }
     
    11131076 * stopped processes.  If block is zero, we return a value of zero
    11141077 * rather than blocking.
    1115  *
    1116  * System V doesn't have a non-blocking wait system call.  It does
    1117  * have a SIGCLD signal that is sent to a process when one of it's
    1118  * children dies.  The obvious way to use SIGCLD would be to install
    1119  * a handler for SIGCLD which simply bumped a counter when a SIGCLD
    1120  * was received, and have waitproc bump another counter when it got
    1121  * the status of a process.  Waitproc would then know that a wait
    1122  * system call would not block if the two counters were different.
    1123  * This approach doesn't work because if a process has children that
    1124  * have not been waited for, System V will send it a SIGCLD when it
    1125  * installs a signal handler for SIGCLD.  What this means is that when
    1126  * a child exits, the shell will be sent SIGCLD signals continuously
    1127  * until is runs out of stack space, unless it does a wait call before
    1128  * restoring the signal handler.  The code below takes advantage of
    1129  * this (mis)feature by installing a signal handler for SIGCLD and
    1130  * then checking to see whether it was called.  If there are any
    1131  * children to be waited for, it will be.
    1132  *
    1133  * If neither SYSV nor BSD is defined, we don't implement nonblocking
    1134  * waits at all.  In this case, the user will not be informed when
    1135  * a background process until the next time she runs a real program
    1136  * (as opposed to running a builtin command or just typing return),
    1137  * and the jobs command may give out of date information.
    11381078 */
    1139 
    1140 #ifdef SYSV
    1141 STATIC int gotsigchild;
    1142 
    1143 STATIC int onsigchild() {
    1144         gotsigchild = 1;
    1145 }
    1146 #endif
    1147 
    1148 
    11491079STATIC int
    1150 waitproc(int block, struct job *jp, int *status)
    1151 {
    1152 #ifdef BSD
     1080waitproc(shinstance *psh, int block, struct job *jp, int *status)
     1081{
    11531082        int flags = 0;
    11541083
     
    11591088        if (block == 0)
    11601089                flags |= WNOHANG;
    1161         return wait3(status, flags, (struct rusage *)NULL);
    1162 #else
    1163 #ifdef SYSV
    1164         int (*save)();
    1165 
    1166         if (block == 0) {
    1167                 gotsigchild = 0;
    1168                 save = signal(SIGCLD, onsigchild);
    1169                 signal(SIGCLD, save);
    1170                 if (gotsigchild == 0)
    1171                         return 0;
    1172         }
    1173         return wait(status);
    1174 #else
    1175         if (block == 0)
    1176                 return 0;
    1177         return wait(status);
    1178 #endif
    1179 #endif
     1090        return sh_waitpid(psh, -1, status, flags);
    11801091}
    11811092
     
    11831094 * return 1 if there are stopped jobs, otherwise 0
    11841095 */
    1185 int job_warning = 0;
     1096//int job_warning = 0;
    11861097int
    1187 stoppedjobs(void)
     1098stoppedjobs(shinstance *psh)
    11881099{
    11891100        int jobno;
    11901101        struct job *jp;
    11911102
    1192         if (job_warning || jobs_invalid)
     1103        if (psh->job_warning || psh->jobs_invalid)
    11931104                return (0);
    1194         for (jobno = 1, jp = jobtab; jobno <= njobs; jobno++, jp++) {
     1105        for (jobno = 1, jp = psh->jobtab; jobno <= psh->njobs; jobno++, jp++) {
    11951106                if (jp->used == 0)
    11961107                        continue;
    11971108                if (jp->state == JOBSTOPPED) {
    11981109                        out2str(psh, "You have stopped jobs.\n");
    1199                         job_warning = 2;
     1110                        psh->job_warning = 2;
    12001111                        return (1);
    12011112                }
     
    12101121 */
    12111122
    1212 STATIC char *cmdnextc;
    1213 STATIC int cmdnleft;
     1123//STATIC char *cmdnextc;
     1124//STATIC int cmdnleft;
    12141125
    12151126void
    1216 commandtext(struct procstat *ps, union node *n)
     1127commandtext(shinstance *psh, struct procstat *ps, union node *n)
    12171128{
    12181129        int len;
    12191130
    1220         cmdnextc = ps->cmd;
    1221         if (iflag(psh) || mflag(psh) || sizeof ps->cmd < 100)
     1131        psh->cmdnextc = ps->cmd;
     1132        if (iflag(psh) || mflag(psh) || sizeof(ps->cmd) < 100)
    12221133                len = sizeof(ps->cmd);
    12231134        else
    12241135                len = sizeof(ps->cmd) / 10;
    1225         cmdnleft = len;
    1226         cmdtxt(n);
    1227         if (cmdnleft <= 0) {
     1136        psh->cmdnleft = len;
     1137        cmdtxt(psh, n);
     1138        if (psh->cmdnleft <= 0) {
    12281139                char *p = ps->cmd + len - 4;
    12291140                p[0] = '.';
     
    12321143                p[3] = 0;
    12331144        } else
    1234                 *cmdnextc = '\0';
     1145                *psh->cmdnextc = '\0';
    12351146        TRACE((psh, "commandtext: ps->cmd %x, end %x, left %d\n\t\"%s\"\n",
    1236                 ps->cmd, cmdnextc, cmdnleft, ps->cmd));
     1147                ps->cmd, psh->cmdnextc, psh->cmdnleft, ps->cmd));
    12371148}
    12381149
    12391150
    12401151STATIC void
    1241 cmdtxt(union node *n)
     1152cmdtxt(shinstance *psh, union node *n)
    12421153{
    12431154        union node *np;
     
    12471158        char s[2];
    12481159
    1249         if (n == NULL || cmdnleft <= 0)
     1160        if (n == NULL || psh->cmdnleft <= 0)
    12501161                return;
    12511162        switch (n->type) {
    12521163        case NSEMI:
    1253                 cmdtxt(n->nbinary.ch1);
    1254                 cmdputs("; ");
    1255                 cmdtxt(n->nbinary.ch2);
     1164                cmdtxt(psh, n->nbinary.ch1);
     1165                cmdputs(psh, "; ");
     1166                cmdtxt(psh, n->nbinary.ch2);
    12561167                break;
    12571168        case NAND:
    1258                 cmdtxt(n->nbinary.ch1);
    1259                 cmdputs(" && ");
    1260                 cmdtxt(n->nbinary.ch2);
     1169                cmdtxt(psh, n->nbinary.ch1);
     1170                cmdputs(psh, " && ");
     1171                cmdtxt(psh, n->nbinary.ch2);
    12611172                break;
    12621173        case NOR:
    1263                 cmdtxt(n->nbinary.ch1);
    1264                 cmdputs(" || ");
    1265                 cmdtxt(n->nbinary.ch2);
     1174                cmdtxt(psh, n->nbinary.ch1);
     1175                cmdputs(psh, " || ");
     1176                cmdtxt(psh, n->nbinary.ch2);
    12661177                break;
    12671178        case NPIPE:
    12681179                for (lp = n->npipe.cmdlist ; lp ; lp = lp->next) {
    1269                         cmdtxt(lp->n);
     1180                        cmdtxt(psh, lp->n);
    12701181                        if (lp->next)
    1271                                 cmdputs(" | ");
     1182                                cmdputs(psh, " | ");
    12721183                }
    12731184                break;
    12741185        case NSUBSHELL:
    1275                 cmdputs("(");
    1276                 cmdtxt(n->nredir.n);
    1277                 cmdputs(")");
     1186                cmdputs(psh, "(");
     1187                cmdtxt(psh, n->nredir.n);
     1188                cmdputs(psh, ")");
    12781189                break;
    12791190        case NREDIR:
    12801191        case NBACKGND:
    1281                 cmdtxt(n->nredir.n);
     1192                cmdtxt(psh, n->nredir.n);
    12821193                break;
    12831194        case NIF:
    1284                 cmdputs("if ");
    1285                 cmdtxt(n->nif.test);
    1286                 cmdputs("; then ");
    1287                 cmdtxt(n->nif.ifpart);
     1195                cmdputs(psh, "if ");
     1196                cmdtxt(psh, n->nif.test);
     1197                cmdputs(psh, "; then ");
     1198                cmdtxt(psh, n->nif.ifpart);
    12881199                if (n->nif.elsepart) {
    1289                         cmdputs("; else ");
    1290                         cmdtxt(n->nif.elsepart);
    1291                 }
    1292                 cmdputs("; fi");
     1200                        cmdputs(psh, "; else ");
     1201                        cmdtxt(psh, n->nif.elsepart);
     1202                }
     1203                cmdputs(psh, "; fi");
    12931204                break;
    12941205        case NWHILE:
    1295                 cmdputs("while ");
     1206                cmdputs(psh, "while ");
    12961207                goto until;
    12971208        case NUNTIL:
    1298                 cmdputs("until ");
     1209                cmdputs(psh, "until ");
    12991210until:
    1300                 cmdtxt(n->nbinary.ch1);
    1301                 cmdputs("; do ");
    1302                 cmdtxt(n->nbinary.ch2);
    1303                 cmdputs("; done");
     1211                cmdtxt(psh, n->nbinary.ch1);
     1212                cmdputs(psh, "; do ");
     1213                cmdtxt(psh, n->nbinary.ch2);
     1214                cmdputs(psh, "; done");
    13041215                break;
    13051216        case NFOR:
    1306                 cmdputs("for ");
    1307                 cmdputs(n->nfor.var);
    1308                 cmdputs(" in ");
    1309                 cmdlist(n->nfor.args, 1);
    1310                 cmdputs("; do ");
    1311                 cmdtxt(n->nfor.body);
    1312                 cmdputs("; done");
     1217                cmdputs(psh, "for ");
     1218                cmdputs(psh, n->nfor.var);
     1219                cmdputs(psh, " in ");
     1220                cmdlist(psh, n->nfor.args, 1);
     1221                cmdputs(psh, "; do ");
     1222                cmdtxt(psh, n->nfor.body);
     1223                cmdputs(psh, "; done");
    13131224                break;
    13141225        case NCASE:
    1315                 cmdputs("case ");
    1316                 cmdputs(n->ncase.expr->narg.text);
    1317                 cmdputs(" in ");
     1226                cmdputs(psh, "case ");
     1227                cmdputs(psh, n->ncase.expr->narg.text);
     1228                cmdputs(psh, " in ");
    13181229                for (np = n->ncase.cases; np; np = np->nclist.next) {
    1319                         cmdtxt(np->nclist.pattern);
    1320                         cmdputs(") ");
    1321                         cmdtxt(np->nclist.body);
    1322                         cmdputs(";; ");
    1323                 }
    1324                 cmdputs("esac");
     1230                        cmdtxt(psh, np->nclist.pattern);
     1231                        cmdputs(psh, ") ");
     1232                        cmdtxt(psh, np->nclist.body);
     1233                        cmdputs(psh, ";; ");
     1234                }
     1235                cmdputs(psh, "esac");
    13251236                break;
    13261237        case NDEFUN:
    1327                 cmdputs(n->narg.text);
    1328                 cmdputs("() { ... }");
     1238                cmdputs(psh, n->narg.text);
     1239                cmdputs(psh, "() { ... }");
    13291240                break;
    13301241        case NCMD:
    1331                 cmdlist(n->ncmd.args, 1);
    1332                 cmdlist(n->ncmd.redirect, 0);
     1242                cmdlist(psh, n->ncmd.args, 1);
     1243                cmdlist(psh, n->ncmd.redirect, 0);
    13331244                break;
    13341245        case NARG:
    1335                 cmdputs(n->narg.text);
     1246                cmdputs(psh, n->narg.text);
    13361247                break;
    13371248        case NTO:
     
    13531264                        s[0] = n->nfile.fd + '0';
    13541265                        s[1] = '\0';
    1355                         cmdputs(s);
    1356                 }
    1357                 cmdputs(p);
     1266                        cmdputs(psh, s);
     1267                }
     1268                cmdputs(psh, p);
    13581269                if (n->type == NTOFD || n->type == NFROMFD) {
    13591270                        s[0] = n->ndup.dupfd + '0';
    13601271                        s[1] = '\0';
    1361                         cmdputs(s);
     1272                        cmdputs(psh, s);
    13621273                } else {
    1363                         cmdtxt(n->nfile.fname);
     1274                        cmdtxt(psh, n->nfile.fname);
    13641275                }
    13651276                break;
    13661277        case NHERE:
    13671278        case NXHERE:
    1368                 cmdputs("<<...");
     1279                cmdputs(psh, "<<...");
    13691280                break;
    13701281        default:
    1371                 cmdputs("???");
     1282                cmdputs(psh, "???");
    13721283                break;
    13731284        }
     
    13751286
    13761287STATIC void
    1377 cmdlist(union node *np, int sep)
     1288cmdlist(shinstance *psh, union node *np, int sep)
    13781289{
    13791290        for (; np; np = np->narg.next) {
    13801291                if (!sep)
    1381                         cmdputs(" ");
    1382                 cmdtxt(np);
     1292                        cmdputs(psh, " ");
     1293                cmdtxt(psh, np);
    13831294                if (sep && np->narg.next)
    1384                         cmdputs(" ");
     1295                        cmdputs(psh, " ");
    13851296        }
    13861297}
     
    13881299
    13891300STATIC void
    1390 cmdputs(const char *s)
     1301cmdputs(shinstance *psh, const char *s)
    13911302{
    13921303        const char *p, *str = 0;
     
    14001311
    14011312        p = s;
    1402         nextc = cmdnextc;
    1403         nleft = cmdnleft;
     1313        nextc = psh->cmdnextc;
     1314        nleft = psh->cmdnleft;
    14041315        while (nleft > 0 && (c = *p++) != 0) {
    14051316                switch (c) {
     
    14801391                nleft--;
    14811392        }
    1482         cmdnleft = nleft;
    1483         cmdnextc = nextc;
    1484 }
     1393        psh->cmdnleft = nleft;
     1394        psh->cmdnextc = nextc;
     1395}
  • trunk/src/kash/main.c

    r1199 r1207  
    222222state2:
    223223        state = 3;
    224         if (getuid() == geteuid() && getgid() == getegid()) {
     224        if (sh_getuid(psh) == sh_geteuid(psh) && sh_getgid(psh) == sh_getegid(psh)) {
    225225                if ((shinit = lookupvar(psh, "ENV")) != NULL && *shinit != '\0') {
    226226                        state = 3;
  • trunk/src/kash/miscbltin.c

    r1204 r1207  
    129129        STARTSTACKSTR(psh, p);
    130130        for (;;) {
    131                 if (read(0, &c, 1) != 1) {
     131                if (shfile_read(&psh->fdtab, 0, &c, 1) != 1) {
    132132                        status = 1;
    133133                        break;
     
    136136                        continue;
    137137                if (c == '\\' && !rflag) {
    138                         if (read(0, &c, 1) != 1) {
     138                        if (shfile_read(&psh->fdtab, 0, &c, 1) != 1) {
    139139                                status = 1;
    140140                                break;
  • trunk/src/kash/mystring.c

    r1198 r1207  
    7979
    8080void
    81 scopyn(const char *from, char *to, int size)
     81scopyn(const char *from, char *to, ssize_t size)
    8282{
    8383
  • trunk/src/kash/mystring.h

    r1198 r1207  
    3838#include "shinstance.h"
    3939
    40 void scopyn(const char *, char *, int);
     40void scopyn(const char *, char *, ssize_t);
    4141int prefix(const char *, const char *);
    4242int number(shinstance *, const char *);
  • trunk/src/kash/output.c

    r1199 r1207  
    308308#else
    309309        long l;
    310         u_long num;
     310        unsigned long num;
    311311#endif
    312312        unsigned base;
  • trunk/src/kash/redir.c

    r1202 r1207  
    138138                        INTOFF;
    139139again:
    140                         if ((i = fcntl(fd, F_DUPFD, 10)) == -1) {
     140                        if ((i = shfile_fcntl(&psh->fdtab, fd, F_DUPFD, 10)) == -1) {
    141141                                switch (errno) {
    142142                                case EBADF:
     
    155155                        if (!try) {
    156156                                sv->renamed[fd] = i;
    157                                 close(fd);
     157                                shfile_close(&psh->fdtab, fd);
    158158                        }
    159159                        INTON;
    160160                } else {
    161                         close(fd);
     161                        shfile_close(&psh->fdtab, fd);
    162162                }
    163163                if (fd == 0)
     
    198198                        goto eopen;
    199199                if (eflags)
    200                         (void)fcntl(f, F_SETFL, fcntl(f, F_GETFL, 0) & ~eflags);
     200                        (void)shfile_fcntl(&psh->fdtab, f, F_SETFL, shfile_fcntl(&psh->fdtab, f, F_GETFL, 0) & ~eflags);
    201201                break;
    202202        case NFROMTO:
     
    272272        }
    273273        if (forkshell(psh, (struct job *)NULL, (union node *)NULL, FORK_NOJOB) == 0) {
    274                 close(pip[0]);
     274                shfile_close(&psh->fdtab, pip[0]);
    275275                signal(SIGINT, SIG_IGN);
    276276                signal(SIGQUIT, SIG_IGN);
     
    287287        }
    288288out:
    289         close(pip[1]);
     289        shfile_close(&psh->fdtab, pip[1]);
    290290        return pip[0];
    291291}
     
    359359                for (i = 0 ; i < 10 ; i++) {
    360360                        if (rp->renamed[i] >= 0) {
    361                                 close(rp->renamed[i]);
     361                                shfile_close(&psh->fdtab, rp->renamed[i]);
    362362                        }
    363363                        if (!vforked)
  • trunk/src/kash/shfile.h

    r1206 r1207  
    107107long shfile_lseek(shfdtab *, int, long, int);
    108108int shfile_fcntl(shfdtab *, int fd, int cmd, int arg);
     109int shfile_dup(shfdtab *, int fd);
    109110
    110111int shfile_stat(shfdtab *, const char *, struct stat *);
  • trunk/src/kash/shinstance.c

    r1201 r1207  
    6666        psh->out2 = &psh->errout;
    6767
     68        /* jobs.c */
     69        psh->backgndpid = -1;
     70#if JOBS
     71        psh->curjob = -1;
     72#endif
     73        psh->ttyfd = -1;
     74
    6875    }
    6976    return psh;
  • trunk/src/kash/shinstance.h

    r1206 r1207  
    2929
    3030#include <stdio.h> /* BUFSIZ */
     31#include <signal.h> /* NSIG */
    3132
    3233#include "shtypes.h"
     
    191192
    192193    /* jobs.h */
    193     pid_t               backgndpid   /**< pid of last background process */
     194    pid_t               backgndpid/* = -1 */;   /**< pid of last background process */
    194195    int                 job_warning;    /**< user was warned about stopped jobs */
     196
     197    /* jobs.c */
     198    struct job         *jobtab;         /**< array of jobs */
     199    int                 njobs;          /**< size of array */
     200    int                 jobs_invalid;   /**< set in child */
     201#if JOBS
     202    int                 initialpgrp;    /**< pgrp of shell on invocation */
     203    int                 curjob/* = -1*/;/**< current job */
     204#endif
     205    int                 ttyfd/* = -1*/;
     206    int                 jobctl;         /**< job control enabled / disabled */
     207    char               *cmdnextc;
     208    int                 cmdnleft;
    195209
    196210    /* input.h */
     
    262276    char              **t_wp;
    263277    struct t_op const  *t_wp_op;
     278
     279    /* trap.c */
     280    char                gotsig[NSIG];   /**< indicates specified signal received */
    264281
    265282} shinstance;
     
    331348gid_t sh_getgid(shinstance *);
    332349gid_t sh_getegid(shinstance *);
    333 
    334 #endif
     350pid_t sh_getpid(shinstance *);
     351pid_t sh_getpgrp(shinstance *);
     352pid_t sh_getpgid(shinstance *, pid_t);
     353int sh_setpgid(shinstance *, pid_t, pid_t);
     354int sh_killpg(shinstance *, pid_t, int);
     355
     356/* tc* */
     357pid_t sh_tcgetpgrp(shinstance *, int);
     358int sh_tcsetpgrp(shinstance *, int, pid_t);
     359
     360#endif
  • trunk/src/kash/show.c

    r1206 r1207  
    290290        if (debug(psh) != 1)
    291291                return;
    292         fprintf(tracefile, "[%d] ", getpid());
     292        fprintf(tracefile, "[%d] ", sh_getpid(psh));
    293293        va_start(va, fmt);
    294294        (void) vfprintf(tracefile, fmt, va);
     
    303303        if (debug(psh) != 1)
    304304                return;
    305         fprintf(tracefile, "[%d] ", getpid());
     305        fprintf(tracefile, "[%d] ", sh_getpid(psh));
    306306        (void) vfprintf(tracefile, fmt, va);
    307307#endif
     
    396396                char *p;
    397397                if ((p = getenv("HOME")) == NULL) {
    398                         if (geteuid() == 0)
     398                        if (sh_geteuid(psh) == 0)
    399399                                p = "/";
    400400                        else
     
    421421        }
    422422#if defined(O_APPEND) && !defined(_MSC_VER)
    423         if ((flags = fcntl(fileno(tracefile), F_GETFL, 0)) >= 0)
    424                 fcntl(fileno(tracefile), F_SETFL, flags | O_APPEND);
     423        if ((flags = shfile_fcntl(&psh->fdtab, fileno(tracefile), F_GETFL, 0)) >= 0)
     424                shfile_fcntl(&psh->fdtab, fileno(tracefile), F_SETFL, flags | O_APPEND);
    425425#endif
    426426        setvbuf(tracefile, (char *)NULL, _IOLBF, 0); //setlinebuf(tracefile);
  • trunk/src/kash/shtypes.h

    r1206 r1207  
    3232
    3333#ifdef _MSC_VER
    34 #include <io.h> /* intptr_t and uintptr_t */
     34# define setmode setmode_msc
     35# include <io.h> /* intptr_t and uintptr_t */
     36# undef setmode
    3537typedef signed char     int8_t;
    3638typedef unsigned char   uint8_t;
     
    7274typedef unsigned short  uid_t;
    7375typedef unsigned short  gid_t;
     76typedef int             mode_t;
     77typedef intptr_t        ssize_t;
    7478
    7579#else
  • trunk/src/kash/trap.c

    r1203 r1207  
    261261        else
    262262                action = S_IGN;
    263         if (rootshell && !vforked && action == S_DFL) {
     263        if (psh->rootshell && !vforked && action == S_DFL) {
    264264                switch (signo) {
    265265                case SIGINT:
     
    447447        char *p;
    448448
    449         TRACE((psh, "pid %d, exitshell(%d)\n", getpid(), status));
     449        TRACE((psh, "pid %d, exitshell(%d)\n", sh_getpid(psh), status));
    450450        if (setjmp(loc1.loc)) {
    451451                goto l1;
  • trunk/src/kash/var.c

    r1203 r1207  
    272272                vps1.next = *vpp;
    273273                *vpp = &vps1;
    274                 vps1.text = strdup(geteuid() ? "PS1=$ " : "PS1=# ");
     274                vps1.text = strdup(sh_geteuid(psh) ? "PS1=$ " : "PS1=# ");
    275275                vps1.flags = VSTRFIXED|VTEXTFIXED;
    276276        }
  • trunk/src/kash/win/mscfakes.h

    r1204 r1207  
    2727#ifdef _MSC_VER
    2828
     29#include "shtypes.h"
    2930#define setmode setmode_msc
    3031#include <sys/cdefs.h>
     
    8485
    8586#define MAX(a,b) ((a) >= (b) ? (a) : (b))
    86 
    87 typedef int mode_t;
    88 typedef unsigned short nlink_t;
    89 typedef long ssize_t;
    90 typedef unsigned long u_long;
    91 typedef unsigned int u_int;
    92 typedef unsigned short u_short;
    9387
    9488#ifndef timerisset
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