Changeset 2463


Ignore:
Timestamp:
Nov 19, 2005, 4:58:38 PM (20 years ago)
Author:
bird
Message:

OS/2 changes.

Location:
trunk/ash
Files:
1 added
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/ash/bltin/kill.c

    r2462 r2463  
    5858#ifdef SHELL            /* sh (aka ash) builtin */
    5959#define main killcmd
    60 #include "../../bin/sh/bltin/bltin.h"
    61 #endif /* SHELL */ 
     60#include "bltin/bltin.h"
     61#endif /* SHELL */
    6262
    6363static void nosig(char *);
     
    149149                                continue;
    150150                        }
    151                 } else 
     151                } else
    152152#endif
    153153                {
     
    207207        int termwidth = 80;
    208208
     209#ifdef TIOCGWINSZ
    209210        if (isatty(fileno(fp))) {
    210211                struct winsize win;
     
    212213                        termwidth = win.ws_col;
    213214        }
     215#else
     216#warning TIOCGWINSZ is not present.
     217#endif
    214218
    215219        for (len = 0, sig = 1; sig < NSIG; sig++) {
  • trunk/ash/cd.c

    r2462 r2463  
    120120        if (*dest == '\0')
    121121                dest = ".";
    122         if (*dest == '/' || (path = bltinlookup("CDPATH", 1)) == NULL)
     122        if (IS_ROOT(dest) || (path = bltinlookup("CDPATH", 1)) == NULL)
    123123                path = nullstr;
    124124        while ((p = padvance(&path, dest)) != NULL) {
     
    168168        scopy(dest, cdcomppath);
    169169        STARTSTACKSTR(p);
    170         if (*dest == '/') {
     170        if (IS_ROOT(dest)) {
    171171                STPUTC('/', p);
    172172                cdcomppath++;
     
    269269        scopy(dir, cdcomppath);
    270270        STARTSTACKSTR(new);
    271         if (*dir != '/') {
     271        if (!IS_ROOT(dir)) {
    272272                p = curdir;
    273273                while (*p)
     
    349349                first = 0;
    350350                pwd = getenv("PWD");
    351                 if (pwd && *pwd == '/' && stat(".", &stdot) != -1 &&
     351                if (pwd && IS_ROOT(pwd) && stat(".", &stdot) != -1 &&
    352352                    stat(pwd, &stpwd) != -1 &&
    353353                    stdot.st_dev == stpwd.st_dev &&
     
    381381         * /bin/pwd.
    382382         */
    383 #if defined(__NetBSD__) || defined(__SVR4)
     383#if defined(__NetBSD__) || defined(__SVR4) || defined(__INNOTEK_LIBC__)
    384384
    385385        for (i = MAXPWD;; i *= 2) {
  • trunk/ash/cd.h

    r2462 r2463  
    3434int     cdcmd(int, char **);
    3535int     pwdcmd(int, char **);
     36#ifdef PC_DRIVE_LETTERS
     37#define IS_ROOT(path) (   *(path) == '/' \
     38                       || *(path) == '\\' \
     39                       ||  ( ((*(path) >= 'A' && *(path) <= 'Z') || (*(path) >= 'a' && *(path) <= 'z')) \
     40                             && (path)[1] == ':') )
     41#else
     42#define IS_ROOT(path) ( *(path) == '/' )
     43#endif
  • trunk/ash/error.c

    r2462 r2463  
    168168                exvwarning(-1, msg, ap);
    169169
    170         flushall();
     170        output_flushall();
    171171        exraise(cond);
    172172        /* NOTREACHED */
  • trunk/ash/eval.c

    r2462 r2463  
    606606        static char *sys_path = NULL;
    607607        static int mib[] = {CTL_USER, USER_CS_PATH};
     608#ifdef PC_PATH_SEP
     609        static char def_path[] = "PATH=/usr/bin;/bin;/usr/sbin;/sbin";
     610#else
    608611        static char def_path[] = "PATH=/usr/bin:/bin:/usr/sbin:/sbin";
     612#endif
    609613        size_t len;
    610614
     
    10141018                }
    10151019                handler = savehandler;
    1016                 flushall();
     1020                output_flushall();
    10171021                out1 = &output;
    10181022                out2 = &errout;
  • trunk/ash/exec.c

    r2462 r2463  
    8080#include "jobs.h"
    8181#include "alias.h"
     82#ifdef __INNOTEK_LIBC__
     83#include <InnoTekLIBC/backend.h>
     84#endif
    8285
    8386
     
    101104
    102105
    103 STATIC void tryexec(char *, char **, char **, int);
     106STATIC void tryexec(char *, char **, char **, int, int);
    104107STATIC void execinterp(char **, char **);
    105108STATIC void printentry(struct tblentry *, int);
     
    107110STATIC struct tblentry *cmdlookup(const char *, int);
    108111STATIC void delete_cmd_entry(void);
     112#ifdef PC_EXE_EXTS
     113STATIC int stat_pc_exec_exts(char *fullname, struct stat *st, int has_ext);
     114#endif
    109115
    110116
     
    121127        char *cmdname;
    122128        int e;
    123 
     129#ifdef PC_EXE_EXTS
     130        int has_ext = strlen(argv[0]) - 4;
     131        has_ext = has_ext > 0
     132            && argv[0][has_ext] == '.'
     133            /* use strstr and upper/lower permuated extensions to avoid multiple strcasecmp calls. */
     134            && strstr("exe;" "Exe;" "EXe;" "EXE;" "ExE;" "eXe;" "eXE;" "exE;"
     135                      "cmd;" "Cmd;" "CMd;" "CMD;" "CmD;" "cMd;" "cMD;" "cmD;"
     136                      "com;" "Com;" "COm;" "COM;" "CoM;" "cOm;" "cOM;" "coM;"
     137                      "bat;" "Bat;" "BAt;" "BAT;" "BaT;" "bAt;" "bAT;" "baT;"
     138                      "btm;" "Btm;" "BTm;" "BTM;" "BtM;" "bTm;" "bTM;" "btM;",
     139                      argv[0] + has_ext + 1)
     140               != NULL;
     141#else
     142        const int has_ext = 1;
     143#endif
     144        TRACE(("shellexec: argv[0]=%s idx=%d\n", argv[0], idx));
    124145        if (strchr(argv[0], '/') != NULL) {
    125                 tryexec(argv[0], argv, envp, vforked);
     146                cmdname = stalloc(strlen(argv[0]) + 5);
     147                strcpy(cmdname, argv[0]);
     148                tryexec(cmdname, argv, envp, vforked, has_ext);
     149                TRACE(("shellexec: cmdname=%s\n", cmdname));
     150                stunalloc(cmdname);
    126151                e = errno;
    127152        } else {
     
    129154                while ((cmdname = padvance(&path, argv[0])) != NULL) {
    130155                        if (--idx < 0 && pathopt == NULL) {
    131                                 tryexec(cmdname, argv, envp, vforked);
     156                                tryexec(cmdname, argv, envp, vforked, has_ext);
    132157                                if (errno != ENOENT && errno != ENOTDIR)
    133158                                        e = errno;
     
    149174                break;
    150175        }
    151         TRACE(("shellexec failed for %s, errno %d, vforked %d, suppressint %d\n",
     176        TRACE(("shellexec failed for '%s', errno %d, vforked %d, suppressint %d\n",
    152177                argv[0], e, vforked, suppressint ));
    153178        exerror(EXEXEC, "%s: %s", argv[0], errmsg(e, E_EXEC));
     
    157182
    158183STATIC void
    159 tryexec(char *cmd, char **argv, char **envp, int vforked)
     184tryexec(char *cmd, char **argv, char **envp, int vforked, int has_ext)
    160185{
    161186        int e;
    162 #ifndef BSD
     187#ifdef EXEC_HASH_BANG_SCRIPT
    163188        char *p;
     189#endif
     190#ifdef PC_EXE_EXTS
     191        /* exploit the effect of stat_pc_exec_exts which adds the
     192         * correct extentions to the file.
     193         */
     194        struct stat st;
     195        if (!has_ext)
     196            stat_pc_exec_exts(cmd, &st, 0);
     197#endif
     198#if defined __INNOTEK_LIBC__ && defined EXEC_HASH_BANG_SCRIPT
     199        __libc_Back_gfProcessHandleHashBangScripts = 0;
    164200#endif
    165201
     
    183219                setinputfile(cmd, 0);
    184220                commandname = arg0 = savestr(argv[0]);
    185 #ifndef BSD
     221#ifdef EXEC_HASH_BANG_SCRIPT
    186222                pgetc(); pungetc();             /* fill up input buffer */
    187223                p = parsenextc;
     
    198234
    199235
    200 #ifndef BSD
     236#ifdef EXEC_HASH_BANG_SCRIPT
    201237/*
    202238 * Execute an interpreter introduced by "#!", for systems where this
     
    249285                for (;;) {
    250286                        if (equal(p, "sh") || equal(p, "ash")) {
     287                                TRACE(("hash bang self\n"));
    251288                                return;
    252289                        }
     
    270307        ap = argv;
    271308        while (*ap2++ = *ap++);
    272         shellexec(new, envp, pathval(), 0);
     309        TRACE(("hash bang '%s'\n", new[0]));
     310        shellexec(new, envp, pathval(), 0, 0);
    273311        /* NOTREACHED */
    274312}
     
    300338                return NULL;
    301339        start = *path;
     340#ifdef PC_PATH_SEP
     341        for (p = start ; *p && *p != ';' && *p != '%' ; p++);
     342#else
    302343        for (p = start ; *p && *p != ':' && *p != '%' ; p++);
     344#endif
    303345        len = p - start + strlen(name) + 2;     /* "2" is for '/' and '\0' */
     346#ifdef PC_EXE_EXTS
     347        len += 4; /* "4" is for .exe/.com/.cmd/.bat/.btm */
     348#endif
    304349        while (stackblocksize() < len)
    305350                growstackblock();
     
    314359        if (*p == '%') {
    315360                pathopt = ++p;
     361#ifdef PC_PATH_SEP
     362                while (*p && *p != ';')  p++;
     363#else
    316364                while (*p && *p != ':')  p++;
    317         }
     365#endif
     366        }
     367#ifdef PC_PATH_SEP
     368        if (*p == ';')
     369#else
    318370        if (*p == ':')
     371#endif
    319372                *path = p + 1;
    320373        else
     
    322375        return stalloc(len);
    323376}
     377
     378
     379#ifdef PC_EXE_EXTS
     380STATIC int stat_pc_exec_exts(char *fullname, struct stat *st, int has_ext)
     381{
     382    /* skip the SYSV crap */
     383    if (stat(fullname, st) >= 0)
     384        return 0;
     385    if (!has_ext && errno == ENOENT)
     386    {
     387        char *psz = strchr(fullname, '\0');
     388        memcpy(psz, ".exe", 5);
     389        if (stat(fullname, st) >= 0)
     390            return 0;
     391        if (errno != ENOENT && errno != ENOTDIR)
     392            return -1;
     393
     394        memcpy(psz, ".cmd", 5);
     395        if (stat(fullname, st) >= 0)
     396            return 0;
     397        if (errno != ENOENT && errno != ENOTDIR)
     398            return -1;
     399
     400        memcpy(psz, ".bat", 5);
     401        if (stat(fullname, st) >= 0)
     402            return 0;
     403        if (errno != ENOENT && errno != ENOTDIR)
     404            return -1;
     405
     406        memcpy(psz, ".com", 5);
     407        if (stat(fullname, st) >= 0)
     408            return 0;
     409        if (errno != ENOENT && errno != ENOTDIR)
     410            return -1;
     411
     412        memcpy(psz, ".btm", 5);
     413        if (stat(fullname, st) >= 0)
     414            return 0;
     415        *psz = '\0';
     416    }
     417    return -1;
     418}
     419#endif /* PC_EXE_EXTS */
    324420
    325421
     
    366462                                printentry(cmdp, verbose);
    367463                        }
    368                         flushall();
     464                        output_flushall();
    369465                }
    370466                argptr++;
     
    434530        int e;
    435531        int (*bltin)(int,char **);
     532
     533#ifdef PC_EXE_EXTS
     534        int has_ext = strlen(name) - 4;
     535        has_ext = has_ext > 0
     536            && name[has_ext] == '.'
     537            /* use strstr and upper/lower permuated extensions to avoid multiple strcasecmp calls. */
     538            && strstr("exe;" "Exe;" "EXe;" "EXE;" "ExE;" "eXe;" "eXE;" "exE;"
     539                      "cmd;" "Cmd;" "CMd;" "CMD;" "CmD;" "cMd;" "cMD;" "cmD;"
     540                      "com;" "Com;" "COm;" "COM;" "CoM;" "cOm;" "cOM;" "coM;"
     541                      "bat;" "Bat;" "BAt;" "BAT;" "BaT;" "bAt;" "bAT;" "baT;"
     542                      "btm;" "Btm;" "BTm;" "BTM;" "BtM;" "bTm;" "bTM;" "btM;",
     543                      name + has_ext + 1)
     544               != NULL;
     545#endif
    436546
    437547        /* If name contains a slash, don't use PATH or hash table */
     
    532642                        goto success;
    533643                }
     644#ifdef PC_EXE_EXTS
     645                while (stat_pc_exec_exts(fullname, &statb, has_ext) < 0) {
     646#else
    534647                while (stat(fullname, &statb) < 0) {
     648#endif
    535649#ifdef SYSV
    536650                        if (errno == EINTR)
     
    539653                        if (errno != ENOENT && errno != ENOTDIR)
    540654                                e = errno;
     655
    541656                        goto loop;
    542657                }
     
    707822                if (*old != *new) {
    708823                        firstchange = idx;
     824#ifdef PC_PATH_SEP
     825                        if ((*old == '\0' && *new == ';')
     826                         || (*old == ';' && *new == '\0'))
     827#else
    709828                        if ((*old == '\0' && *new == ':')
    710829                         || (*old == ':' && *new == '\0'))
     830#endif
    711831                                firstchange++;
    712832                        old = new;      /* ignore subsequent differences */
     
    716836                if (*new == '%' && bltin < 0 && prefix("builtin", new + 1))
    717837                        bltin = idx;
     838#ifdef PC_PATH_SEP
     839                if (*new == ';') {
     840#else
    718841                if (*new == ':') {
     842#endif
    719843                        idx++;
    720844                }
  • trunk/ash/input.c

    r2462 r2463  
    105105int whichprompt;                /* 1 == PS1, 2 == PS2 */
    106106
     107#ifndef SMALL
    107108EditLine *el;                   /* cookie for editline package */
     109#endif
    108110
    109111STATIC void pushfile(void);
  • trunk/ash/jobs.c

    r2462 r2463  
    259259                out1fmt(" | %s", jp->ps[i].cmd );
    260260        out1c('\n');
    261         flushall();
     261        output_flushall();
    262262
    263263        for (i = 0; i < jp->nprocs; i++)
     
    339339                        out1fmt(" | %s", jp->ps[i].cmd );
    340340                out1c('\n');
    341                 flushall();
     341                output_flushall();
    342342                restartjob(jp);
    343343        } while (*argptr && *++argptr);
     
    449449                } else {
    450450#if JOBS
    451                         if (WIFSTOPPED(ps->status)) 
     451                        if (WIFSTOPPED(ps->status))
    452452                                st = WSTOPSIG(ps->status);
    453453                        else /* WIFSIGNALED(ps->status) */
  • trunk/ash/miscbltin.c

    r2462 r2463  
    112112        if (prompt && isatty(0)) {
    113113                out2str(prompt);
    114                 flushall();
     114                output_flushall();
    115115        }
    116116
     
    276276
    277277                        INTOFF;
     278#ifdef __INNOTEK_LIBC__
     279                        if ((set = bsd_setmode(ap)) != 0) {
     280#else
    278281                        if ((set = setmode(ap)) != 0) {
     282#endif
    279283                                mask = getmode(set, ~mask & 0777);
    280284                                ckfree(set);
  • trunk/ash/mknodes.sh

    r2462 r2463  
    118118echo "void freefunc(union node *);"
    119119
    120 mv $objdir/nodes.h.tmp $objdir/nodes.h || exit 1
    121 
    122120exec <$nodes_pat
    123121exec >$objdir/nodes.c.tmp
     122mv -f $objdir/nodes.h.tmp $objdir/nodes.h || exit 1
    124123
    125124echo "/*"
     
    215214done
    216215
    217 mv $objdir/nodes.c.tmp $objdir/nodes.c || exit 1
     216exec >/dev/null
     217mv -f $objdir/nodes.c.tmp $objdir/nodes.c || exit 1
  • trunk/ash/mktokens

    r2462 r2463  
    3838# error messages.
    3939
    40 cat > /tmp/ka$$ <<\!
     40F="$TMPDIR/ka$$"
     41echo $F
     42cat > $F <<\!
    4143TEOF    1       end of file
    4244TNL     0       newline
     
    6870TNOT    0       "!"
    6971!
    70 nl=`wc -l /tmp/ka$$`
     72nl=`wc -l $F`
    7173exec > token.h
    72 awk '{print "#define " $1 " " NR-1}' /tmp/ka$$
     74awk '{print "#define " $1 " " NR-1}' $F
    7375echo '
    7476/* Array indicating which tokens mark the end of a list */
    7577const char tokendlist[] = {'
    76 awk '{print "\t" $2 ","}' /tmp/ka$$
     78awk '{print "\t" $2 ","}' $F
    7779echo '};
    7880
     
    8082sed -e 's/"/\\"/g' \
    8183    -e 's/[^     ]*[     ][      ]*[^    ]*[     ][      ]*\(.*\)/      "\1",/' \
    82     /tmp/ka$$
     84    $F
    8385echo '};
    8486'
    85 sed 's/"//g' /tmp/ka$$ | awk '
    86 /TIF/{print "#define KWDOFFSET " NR-1; print ""; 
     87sed 's/"//g' $F | awk '
     88/TIF/{print "#define KWDOFFSET " NR-1; print "";
    8789      print "const char *const parsekwd[] = {"}
    8890/TIF/,/neverfound/{print "      \"" $3 "\","}'
     
    9092};'
    9193
    92 rm /tmp/ka$$
     94rm $F
  • trunk/ash/myhistedit.h

    r2462 r2463  
    3232 */
    3333
     34#ifndef SMALL
    3435#include <histedit.h>
    3536
    3637extern History *hist;
    3738extern EditLine *el;
     39#endif
    3840extern int displayhist;
    3941
  • trunk/ash/options.c

    r2462 r2463  
    482482                *optnext = NULL;
    483483                *optpptr = NULL;
    484                 flushall();
     484                output_flushall();
    485485                exraise(EXERROR);
    486486        }
  • trunk/ash/output.c

    r2462 r2463  
    175175
    176176void
    177 flushall(void)
     177output_flushall(void)
    178178{
    179179        flushout(&output);
     
    285285        vasprintf(&s, f, ap);
    286286        outstr(s, dest);
    287         free(s);     
     287        free(s);
    288288#else   /* !HAVE_VASPRINTF */
    289289        static const char digit[] = "0123456789ABCDEF";
  • trunk/ash/output.h

    r2462 r2463  
    5959void outstr(const char *, struct output *);
    6060void emptyoutbuf(struct output *);
    61 void flushall(void);
     61void output_flushall(void);
    6262void flushout(struct output *);
    6363void freestdout(void);
  • trunk/ash/show.c

    r2462 r2463  
    288288        if (debug != 1)
    289289                return;
     290        fprintf(tracefile, "[%d] ", getpid());
    290291        va_start(va, fmt);
    291292        (void) vfprintf(tracefile, fmt, va);
     
    300301        if (debug != 1)
    301302                return;
     303        fprintf(tracefile, "[%d] ", getpid());
    302304        (void) vfprintf(tracefile, fmt, va);
    303305#endif
  • trunk/ash/trap.c

    r2462 r2463  
    442442        }
    443443l1:   handler = &loc2;                  /* probably unnecessary */
    444         flushall();
     444        output_flushall();
    445445#if JOBS
    446446        setjobctl(0);
  • trunk/ash/var.c

    r2462 r2463  
    4747#include <paths.h>
    4848
     49#ifdef PC_OS2_LIBPATHS
     50#define INCL_BASE
     51#include <os2.h>
     52
     53#ifndef LIBPATHSTRICT
     54#define LIBPATHSTRICT 3
     55#endif
     56
     57extern APIRET
     58#ifdef APIENTRY
     59    APIENTRY
     60#endif
     61    DosQueryHeaderInfo(HMODULE hmod, ULONG ulIndex, PVOID pvBuffer, ULONG cbBuffer, ULONG ulSubFunction);
     62#define QHINF_EXEINFO       1 /* NE exeinfo. */
     63#define QHINF_READRSRCTBL   2 /* Reads from the resource table. */
     64#define QHINF_READFILE      3 /* Reads from the executable file. */
     65#define QHINF_LIBPATHLENGTH 4 /* Gets the libpath length. */
     66#define QHINF_LIBPATH       5 /* Gets the entire libpath. */
     67#define QHINF_FIXENTRY      6 /* NE only */
     68#define QHINF_STE           7 /* NE only */
     69#define QHINF_MAPSEL        8 /* NE only */
     70
     71#endif
     72
     73
    4974/*
    5075 * Shell variables.
     
    101126struct var vvers;
    102127struct var voptind;
     128
     129#ifdef PC_OS2_LIBPATHS
     130static struct var libpath_vars[4];
     131static const char *libpath_envs[4] = {"LIBPATH=", "BEGINLIBPATH=", "ENDLIBPATH=", "LIBPATHSTRICT="};
     132#endif
    103133
    104134const struct varinit varinit[] = {
     
    173203        struct var **vpp;
    174204
     205#ifdef PC_OS2_LIBPATHS
     206        char *psz = ckmalloc(2048);
     207        int rc;
     208        int i;
     209        for (i = 0; i < 4; i++)
     210        {
     211            libpath_vars[i].flags = VSTRFIXED | VOS2LIBPATH;
     212            libpath_vars[i].func = NULL;
     213
     214            if (i > 0)
     215                rc = DosQueryExtLIBPATH(psz, i);
     216            else
     217            {
     218                rc = DosQueryHeaderInfo(NULLHANDLE, 0, psz, 2048, QHINF_LIBPATH);
     219                libpath_vars[i].flags |= VREADONLY;
     220            }
     221            if (!rc && *psz)
     222            {
     223                int cch1 = strlen(libpath_envs[i]);
     224                int cch2 = strlen(psz) + 1;
     225                libpath_vars[i].text = ckmalloc(cch1 + cch2);
     226                memcpy(libpath_vars[i].text, libpath_envs[i], cch1);
     227                memcpy(libpath_vars[i].text + cch1, psz, cch2);
     228            }
     229            else
     230            {
     231                libpath_vars[i].flags |= VUNSET | VTEXTFIXED;
     232                libpath_vars[i].text = (char*)libpath_envs[i];
     233            }
     234            if (find_var(libpath_vars[i].text, &vpp, &libpath_vars[i].name_len) != NULL)
     235                    continue;
     236            libpath_vars[i].next = *vpp;
     237            *vpp = &libpath_vars[i];
     238        }
     239        free(psz);
     240#endif
     241
    175242        for (ip = varinit ; (vp = ip->var) != NULL ; ip++) {
    176243                if (find_var(ip->text, &vpp, &vp->name_len) != NULL)
     
    300367                vp->flags |= flags & ~VNOFUNC;
    301368                vp->text = s;
     369#ifdef PC_OS2_LIBPATHS
     370                if ((vp->flags & VOS2LIBPATH) && (vp->flags & VEXPORT))
     371                    vp->flags &= ~VEXPORT;
     372#endif
    302373
    303374                /*
     
    420491        }
    421492        *ep = NULL;
     493
     494#ifdef PC_OS2_LIBPATHS
     495        /*
     496         * Set the libpaths now as this is exec() time.
     497         */
     498        for (nenv = 0; nenv < 3; nenv++)
     499            DosSetExtLIBPATH(strchr(libpath_vars[nenv].text, '=') + 1, nenv);
     500#endif
     501
    422502        return env;
    423503}
  • trunk/ash/var.h

    r2462 r2463  
    4848#define VNOFUNC         0x40    /* don't call the callback function */
    4949#define VNOSET          0x80    /* do not set variable - just readonly test */
     50#ifdef PC_OS2_LIBPATHS
     51#define VOS2LIBPATH     0x8000  /* OS/2 LIBPATH related variable. */
     52#endif
    5053
    5154
Note: See TracChangeset for help on using the changeset viewer.