Merge branch 'vendor/TCSH'
authorSimon 'corecode' Schubert <corecode@fs.ei.tum.de>
Wed, 30 Sep 2009 13:50:00 +0000 (15:50 +0200)
committerSimon 'corecode' Schubert <corecode@fs.ei.tum.de>
Wed, 30 Sep 2009 13:50:00 +0000 (15:50 +0200)
1  2 
contrib/tcsh-6/ed.term.h
contrib/tcsh-6/sh.c
contrib/tcsh-6/sh.decls.h
contrib/tcsh-6/sh.func.c
contrib/tcsh-6/sh.set.c

diff --combined contrib/tcsh-6/ed.term.h
@@@ -1,4 -1,4 +1,4 @@@
- /* $Header: /p/tcsh/cvsroot/tcsh/ed.term.h,v 1.17 2004/12/25 21:15:06 christos Exp $ */
+ /* $Header: /p/tcsh/cvsroot/tcsh/ed.term.h,v 1.18 2007/07/05 14:13:06 christos Exp $ */
  /*
   * ed.term.h: Local terminal header
   */
  # undef  CDISCARD
  # undef  CLNEXT
  # undef  CSTATUS
 +# undef  CCHECKPT
  # undef  CPAGE
  # undef  CPGOFF
  # undef  CKILL2
  #ifndef CSTATUS
  # define CSTATUS      TO_CONTROL('t')
  #endif /* CSTATUS */
 +#ifndef CCHECKPT
 +# define CCHECKPT     TO_CONTROL('e')
 +#endif /* CCHECKPT */
  #ifndef CPAGE
  # define CPAGE                ' '
  #endif /* CPAGE */
  #    undef VSTATUS
  #   endif /* NUMCC <= VSTATUS */
  #  endif /* VSTATUS */
 +#  ifdef VCHECKPT
 +#   if NUMCC <= VCHECKPT
 +#    undef VCHECKPT
 +#   endif /* NUMCC <= VCHECKPT */
 +#  endif /* VCHECKPT */
  #  ifdef VPAGE
  #   if NUMCC <= VPAGE
  #    undef VPAGE
   * Also for RH6.2 on the alpha, defined TIOCGLTC, but does not have
   * struct ltchars
   */
- #if (defined(hpux) && defined(VSUSP) && defined(VDSUSP) && defined(VWERASE) && defined(VLNEXT)) || defined(__linux__) || defined(__GNU__) || defined(__GLIBC__)
+ #if (defined(hpux) && defined(VSUSP) && defined(VDSUSP) && defined(VWERASE) && defined(VLNEXT)) || defined(__linux__) || defined(__GNU__) || defined(__GLIBC__) || defined(__QNXNTO__)
  # undef TIOCGLTC       /* not really needed */
  # undef TIOCSLTC
  #endif
  #define C_BRK         22
  #define C_MIN         23
  #define C_TIME                24
 -#define C_NCC         25
 +#define C_CHECKPT     25
 +#define C_NCC         26
  #define C_SH(A)               (1 << (A))
  
  /*
diff --combined contrib/tcsh-6/sh.c
@@@ -1,4 -1,4 +1,4 @@@
- /* $Header: /p/tcsh/cvsroot/tcsh/sh.c,v 3.136 2007/02/22 21:57:37 christos Exp $ */
+ /* $Header: /p/tcsh/cvsroot/tcsh/sh.c,v 3.145 2009/06/25 21:15:37 christos Exp $ */
  /*
   * sh.c: Main shell routines
   */
@@@ -39,7 -39,7 +39,7 @@@ char    copyright[] 
   All rights reserved.\n";
  #endif /* not lint */
  
- RCSID("$tcsh: sh.c,v 3.136 2007/02/22 21:57:37 christos Exp $")
+ RCSID("$tcsh: sh.c,v 3.145 2009/06/25 21:15:37 christos Exp $")
  
  #include "tc.h"
  #include "ed.h"
@@@ -139,6 -139,7 +139,7 @@@ struct saved_state 
      Char        HIST;
      int         cantell;
      struct Bin          B;
+     int                 justpr;
  };
  
  static        int               srccat        (Char *, Char *);
@@@ -229,10 -230,6 +230,6 @@@ main(int argc, char **argv
        xclose(f);
      }
  
- #ifdef O_TEXT
-     setmode(0, O_TEXT);
- #endif
      osinit();                 /* Os dependent initialization */
  
      
        if (*cp) {
            /* only for login shells or root and we must have a tty */
            if ((cp2 = Strrchr(cp, (Char) '/')) != NULL) {
-               cp = cp2 + 1;
+               cp2 = cp2 + 1;
            }
            else
                cp2 = cp;
            if (!(((Strncmp(cp2, STRtty, 3) == 0) && Isalpha(cp2[3])) ||
-                 ((Strncmp(cp, STRpts, 3) == 0) && cp[3] == '/'))) {
+                 Strstr(cp, STRptssl) != NULL)) {
                if (getenv("DISPLAY") == NULL) {
                    /* NOT on X window shells */
                    setcopy(STRautologout, STRdefautologout, VAR_READWRITE);
      /*
       * Re-initialize path if set in environment
       */
 -    if ((tcp = getenv("PATH")) == NULL)
 +    if ((tcp = getenv("PATH")) == NULL) {
  #ifdef _PATH_DEFPATH
        importpath(str2short(_PATH_DEFPATH));
  #else /* !_PATH_DEFPATH */
        setq(STRpath, defaultpath(), &shvhed, VAR_READWRITE);
  #endif /* _PATH_DEFPATH */
 -    else
 +      /*
 +       * Export the path setting so that subsequent processes use the same path as we do.
 +       */
 +      exportpath(adrof(STRpath)->vec);
 +    } else
        /* Importpath() allocates memory for the path, and the
         * returned pointer from SAVE() was discarded, so
         * this was a memory leak.. (sg)
      }
      if (argc > 1 && strcmp(argv[1], "--help") == 0) {
        xprintf("%S\n\n", varval(STRversion));
-       xprintf(CGETS(11, 8, HELP_STRING));
+       xprintf("%s", CGETS(11, 8, HELP_STRING));
        xexit(0);
      }
      /*
            /* ... doesn't return */
            stderror(ERR_SYSTEM, tempv[0], strerror(errno));
        }
- #ifdef O_TEXT
-       setmode(nofile, O_TEXT);
- #endif
        xfree(ffile);
        dolzero = 1;
        ffile = SAVE(tempv[0]);
            }
  #endif /* NeXT */
  #ifdef BSDJOBS                        /* if we have tty job control */
-     retry:
-           if ((tpgrp = tcgetpgrp(f)) != -1) {
-               if (tpgrp != shpgrp) {
-                   struct sigaction old;
-                   sigaction(SIGTTIN, NULL, &old);
-                   signal(SIGTTIN, SIG_DFL);
-                   (void) kill(0, SIGTTIN);
-                   sigaction(SIGTTIN, &old, NULL);
-                   goto retry;
-               }
+           if (grabpgrp(f, shpgrp) != -1) {
                /*
                 * Thanks to Matt Day for the POSIX references, and to
                 * Paul Close for the SGI clarification.
            if (tpgrp == -1) {
        notty:
                xprintf(CGETS(11, 1, "Warning: no access to tty (%s).\n"),
-                       strerror(errno));
-               xprintf(CGETS(11, 2, "Thus no job control in this shell.\n"));
+                   strerror(errno));
+               xprintf("%s",
+                   CGETS(11, 2, "Thus no job control in this shell.\n"));
                /*
                 * Fix from:Sakari Jalovaara <sja@sirius.hut.fi> if we don't
                 * have access to tty, disable editing too
@@@ -1427,9 -1408,6 +1412,6 @@@ srcfile(const char *f, int onlyown, in
  
      if ((unit = xopen(f, O_RDONLY|O_LARGEFILE)) == -1) 
        return 0;
- #ifdef O_TEXT
-     setmode(unit, O_TEXT);
- #endif
      cleanup_push(&unit, open_cleanup);
      unit = dmove(unit, -1);
      cleanup_ignore(&unit);
@@@ -1494,6 -1472,7 +1476,7 @@@ st_save(struct saved_state *st, int uni
      st->alvec         = alvec;
      st->onelflg               = onelflg;
      st->enterhist     = enterhist;
+     st->justpr                = justpr;
      if (hflg)
        st->HIST        = HIST;
      else
@@@ -1592,6 -1571,7 +1575,7 @@@ st_restore(void *xst
        HIST    = st->HIST;
      enterhist = st->enterhist;
      cantell   = st->cantell;
+     justpr    = st->justpr;
  
      if (st->argv != NULL)
        setq(STRargv, st->argv, &shvhed, VAR_READWRITE);
@@@ -1661,6 -1641,7 +1645,7 @@@ goodbye(Char **v, struct command *c
        size_t omark;
        sigset_t set;
  
+       sigemptyset(&set);
        signal(SIGQUIT, SIG_IGN);
        sigaddset(&set, SIGQUIT);
        sigprocmask(SIG_UNBLOCK, &set, NULL);
@@@ -1858,15 -1839,19 +1843,19 @@@ process(int catch
      jmp_buf_t osetexit;
      /* PWP: This might get nuked my longjmp so don't make it a register var */
      size_t omark;
+     volatile int didexitset = 0;
  
      getexit(osetexit);
      omark = cleanup_push_mark();
-     exitset++;
      for (;;) {
        struct command *t;
        int hadhist, old_pintr_disabled;
  
-       (void) setexit();
+       (void)setexit();
+       if (didexitset == 0) {
+           exitset++;
+           didexitset++;
+       }
        pendjob();
  
        justpr = enterhist;     /* execute if not entering history */
      cmd_done:
        cleanup_until(&paraml);
      }
-     exitset--;
      cleanup_pop_mark(omark);
      resexit(osetexit);
+     exitset--;
  }
  
  /*ARGSUSED*/
@@@ -2366,3 -2351,28 +2355,28 @@@ record(void
        rechist(NULL, adrof(STRsavehist) != NULL);
      }
  }
+ /*
+  * Grab the tty repeatedly, and give up if we are not in the correct
+  * tty process group.
+  */
+ int
+ grabpgrp(int fd, pid_t desired)
+ {
+     struct sigaction old;
+     pid_t pgrp;
+     size_t i;
+     for (i = 0; i < 100; i++) {
+       if ((pgrp = tcgetpgrp(fd)) == -1)
+           return -1;
+       if (pgrp == desired)
+           return 0;
+       (void)sigaction(SIGTTIN, NULL, &old);
+       (void)signal(SIGTTIN, SIG_DFL);
+       (void)kill(0, SIGTTIN);
+       (void)sigaction(SIGTTIN, &old, NULL);
+     }
+     errno = EPERM;
+     return -1;
+ }
@@@ -1,4 -1,4 +1,4 @@@
- /* $Header: /p/tcsh/cvsroot/tcsh/sh.decls.h,v 3.53 2006/08/24 20:56:31 christos Exp $ */
+ /* $Header: /p/tcsh/cvsroot/tcsh/sh.decls.h,v 3.55 2009/02/25 22:54:54 christos Exp $ */
  /*
   * sh.decls.h  External declarations from sh*.c
   */
@@@ -52,6 -52,7 +52,7 @@@ extern        void              done          (int)
  #else
  extern        void              xexit         (int);
  #endif
+ extern        int               grabpgrp      (int, pid_t);
  
  /*
   * sh.dir.c
@@@ -357,7 -358,7 +358,7 @@@ extern  struct process   *pfind            (Char 
  /*
   * sh.sem.c
   */
- extern        void              execute       (struct command *, int, int *,
+ extern        void              execute       (struct command *, volatile int, int *,
                                         int *, int);
  extern        void              mypipe        (int *);
  
@@@ -387,7 -388,6 +388,7 @@@ extern     Char             *unparse       (struct command 
  extern        void              update_dspmbyte_vars  (void);
  extern        void              autoset_dspmbyte      (const Char *);
  #endif
 +extern        void             exportpath     (Char **);
  
  /*
   * sh.time.c
diff --combined contrib/tcsh-6/sh.func.c
@@@ -1,4 -1,4 +1,4 @@@
- /* $Header: /p/tcsh/cvsroot/tcsh/sh.func.c,v 3.143 2006/08/24 20:56:31 christos Exp $ */
+ /* $Header: /p/tcsh/cvsroot/tcsh/sh.func.c,v 3.153 2009/06/25 21:15:37 christos Exp $ */
  /*
   * sh.func.c: csh builtin functions
   */
@@@ -32,7 -32,7 +32,7 @@@
   */
  #include "sh.h"
  
- RCSID("$tcsh: sh.func.c,v 3.143 2006/08/24 20:56:31 christos Exp $")
+ RCSID("$tcsh: sh.func.c,v 3.153 2009/06/25 21:15:37 christos Exp $")
  
  #include "ed.h"
  #include "tw.h"
@@@ -62,6 -62,7 +62,7 @@@ static        void    doagain         (void)
  static  const char *isrchx    (int);
  static        void    search          (int, int, Char *);
  static        int     getword         (struct Strbuf *);
+ static        struct wordent  *histgetword    (struct wordent *);
  static        void    toend           (void);
  static        void    xecho           (int, Char **);
  static        int     islocale_var    (Char *);
@@@ -688,7 -689,8 +689,8 @@@ dorepeat(Char **v, struct command *kp
        reexecute(kp);
        --i;
      }
-     cleanup_until(&pintr_disabled);
+     if (setintr && pintr_disabled == 1)
+         cleanup_until(&pintr_disabled);
      donefds();
  }
  
@@@ -753,6 -755,7 +755,7 @@@ search(int type, int level, Char *goal
      Char *cp;
      struct whyle *wp;
      int wlevel = 0;
+     struct wordent *histent = NULL, *ohistent = NULL;
  
      Stype = type;
      Sgoal = goal;
      }
      cleanup_push(&word, Strbuf_cleanup);
      do {
+           
+       if (intty) {
+           histent = xmalloc(sizeof(*histent));
+           ohistent = xmalloc(sizeof(*histent));
+           ohistent->word = STRNULL;
+           ohistent->next = histent;
+           histent->prev = ohistent;
+       }
        if (intty && fseekp == feobp && aret == TCSH_F_SEEK)
            printprompt(1, isrchx(type == TC_BREAK ? zlast : type));
        /* xprintf("? "), flush(); */
        (void) getword(&word);
        Strbuf_terminate(&word);
+       if (intty && Strlen(word.s) > 0) {
+           histent->word = Strsave(word.s);
+           histent->next = xmalloc(sizeof(*histent));
+           histent->next->prev = histent;
+           histent = histent->next;
+       }
        switch (srchx(word.s)) {
  
        case TC_ELSE:
                level = -1;
            break;
        }
-       (void) getword(NULL);
+       if (intty) {
+           ohistent->prev = histgetword(histent);
+           ohistent->prev->next = ohistent;
+           savehist(ohistent, 0);
+           freelex(ohistent);
+           xfree(ohistent);
+       } else 
+           (void) getword(NULL);
      } while (level >= 0);
   end:
      cleanup_until(&word);
  }
  
+ static struct wordent *
+ histgetword(struct wordent *histent) 
+ {
+     int found = 0, first;
+     eChar c, d;
+     int e;
+     struct Strbuf *tmp;
+     tmp = xmalloc(sizeof(*tmp));
+     tmp->size = 0;
+     tmp->s = NULL;
+     c = readc(1);
+     d = 0;
+     e = 0;
+     for (;;) {
+       tmp->len = 0;
+       Strbuf_terminate (tmp);
+       while (c == ' ' || c == '\t')
+           c = readc(1);
+       if (c == '#')
+           do
+               c = readc(1);
+           while (c != CHAR_ERR && c != '\n');
+       if (c == CHAR_ERR)
+           goto past;
+       if (c == '\n') 
+           goto nl;
+       unreadc(c);
+       found = 1;
+       first = 1;
+       do {
+           e = (c == '\\');
+           c = readc(1);
+           if (c == '\\' && !e) {
+               if ((c = readc(1)) == '\n') {
+                   e = 1;
+                   c = ' ';
+               } else {
+                   unreadc(c);
+                   c = '\\';
+               }
+           }
+           if ((c == '\'' || c == '"') && !e) {
+               if (d == 0)
+                   d = c;
+               else if (d == c)
+                   d = 0;
+           }
+           if (c == CHAR_ERR)
+               goto past;
+           
+           Strbuf_append1(tmp, (Char) c);
+           
+           if (!first && !d && c == '(' && !e) {
+               break;
+           }
+           first = 0;
+       } while (d || e || (c != ' ' && c != '\t' && c != '\n'));
+       tmp->len--;
+       if (tmp->len) {
+           Strbuf_terminate(tmp);
+           histent->word = Strsave(tmp->s);
+           histent->next = xmalloc(sizeof (*histent));
+           histent->next->prev = histent;
+           histent = histent->next;
+       }
+       if (c == '\n') {
+       nl:
+           tmp->len = 0;
+           Strbuf_append1(tmp, (Char) c);
+           Strbuf_terminate(tmp);
+           histent->word = Strsave(tmp->s);
+           return histent;
+       }
+     }
+     
+     unreadc(c);
+     return histent;
+ past:
+     switch (Stype) {
+     case TC_IF:
+       stderror(ERR_NAME | ERR_NOTFOUND, "then/endif");
+       break;
+     case TC_ELSE:
+       stderror(ERR_NAME | ERR_NOTFOUND, "endif");
+       break;
+     case TC_BRKSW:
+     case TC_SWITCH:
+       stderror(ERR_NAME | ERR_NOTFOUND, "endsw");
+       break;
+     case TC_BREAK:
+       stderror(ERR_NAME | ERR_NOTFOUND, "end");
+       break;
+     case TC_GOTO:
+       setname(short2str(Sgoal));
+       stderror(ERR_NAME | ERR_NOTFOUND, "label");
+       break;
+     default:
+       break;
+     }
+     /* NOTREACHED */
+     return NULL;
+ }
  static int
  getword(struct Strbuf *wp)
  {
@@@ -1795,9 -1932,11 +1932,15 @@@ struct limits limits[] 
  # ifdef RLIMIT_SBSIZE
      { RLIMIT_SBSIZE,  "sbsize",       1,      ""              },
  # endif /* RLIMIT_SBSIZE */
 +#ifdef RLIMIT_POSIXLOCKS
 +    { RLIMIT_POSIXLOCKS, "posixlocks",   1,      ""           },
 +#endif /* RLIMIT_POSIXLOCKS */
++
+ # ifdef RLIMIT_SWAP 
+     { RLIMIT_SWAP,    "swapsize",     1024,   "kbytes"        }, 
+ # endif /* RLIMIT_SWAP */ 
      { -1,             NULL,           0,      NULL            }
  };
  
@@@ -2137,10 -2276,9 +2280,9 @@@ voi
  dosuspend(Char **v, struct command *c)
  {
  #ifdef BSDJOBS
-     int     ctpgrp;
      struct sigaction old;
  #endif /* BSDJOBS */
-     
      USE(c);
      USE(v);
  
  
  #ifdef BSDJOBS
      if (tpgrp != -1) {
- retry:
-       ctpgrp = tcgetpgrp(FSHTTY);
-       if (ctpgrp == -1)
+       if (grabpgrp(FSHTTY, opgrp) == -1)
            stderror(ERR_SYSTEM, "tcgetpgrp", strerror(errno));
-       if (ctpgrp != opgrp) {
-           sigaction(SIGTTIN, NULL, &old);
-           signal(SIGTTIN, SIG_DFL);
-           (void) kill(0, SIGTTIN);
-           sigaction(SIGTTIN, &old, NULL);
-           goto retry;
-       }
        (void) setpgid(0, shpgrp);
        (void) tcsetpgrp(FSHTTY, shpgrp);
      }
@@@ -2223,13 -2352,15 +2356,15 @@@ doeval_cleanup(void *xstate
      close_on_exec(SHDIAG = dmove(state->saveDIAG, state->SHDIAG), 1);
  }
  
+ static Char **Ggv;
  /*ARGSUSED*/
  void
  doeval(Char **v, struct command *c)
  {
      struct doeval_state state;
-     int gflag;
+     int gflag, my_reenter;
      Char **gv;
+     jmp_buf_t osetexit;
  
      USE(c);
      v++;
        trim(v);
      }
  
+     Ggv = gv;
      state.evalvec = evalvec;
      state.evalp = evalp;
      state.didfds = didfds;
  
      cleanup_push(&state, doeval_cleanup);
  
-     evalvec = v;
-     evalp = 0;
-     (void)close_on_exec(SHIN = dcopy(0, -1), 1);
-     (void)close_on_exec(SHOUT = dcopy(1, -1), 1);
-     (void)close_on_exec(SHDIAG = dcopy(2, -1), 1);
+     getexit(osetexit);
+     /* PWP: setjmp/longjmp bugfix for optimizing compilers */
+ #ifdef cray
+     my_reenter = 1;             /* assume non-zero return val */
+     if (setexit() == 0) {
+       my_reenter = 0;         /* Oh well, we were wrong */
+ #else /* !cray */
+     if ((my_reenter = setexit()) == 0) {
+ #endif /* cray */
+       evalvec = v;
+       evalp = 0;
+       (void)close_on_exec(SHIN = dcopy(0, -1), 1);
+       (void)close_on_exec(SHOUT = dcopy(1, -1), 1);
+       (void)close_on_exec(SHDIAG = dcopy(2, -1), 1);
  #ifndef CLOSE_ON_EXEC
-     didcch = 0;
+       didcch = 0;
  #endif /* CLOSE_ON_EXEC */
-     didfds = 0;
-     process(0);
+       didfds = 0;
+       gv = Ggv;
+       process(0);
+       Ggv = gv;
+     }
  
-     cleanup_until(&state);
+     if (my_reenter == 0) {
+       cleanup_until(&state);
+       if (Ggv)
+           cleanup_until(Ggv);
+     }
  
-     if (gv)
-       cleanup_until(gv);
+     resexit(osetexit);
+     if (my_reenter)
+       stderror(ERR_SILENT);
  }
  
  /*************************************************************************/
diff --combined contrib/tcsh-6/sh.set.c
@@@ -1,4 -1,4 +1,4 @@@
- /* $Header: /p/tcsh/cvsroot/tcsh/sh.set.c,v 3.70 2006/08/24 20:56:31 christos Exp $ */
+ /* $Header: /p/tcsh/cvsroot/tcsh/sh.set.c,v 3.72 2007/09/28 21:02:03 christos Exp $ */
  /*
   * sh.set.c: Setting and Clearing of variables
   */
@@@ -32,7 -32,7 +32,7 @@@
   */
  #include "sh.h"
  
- RCSID("$tcsh: sh.set.c,v 3.70 2006/08/24 20:56:31 christos Exp $")
+ RCSID("$tcsh: sh.set.c,v 3.72 2007/09/28 21:02:03 christos Exp $")
  
  #include "ed.h"
  #include "tw.h"
@@@ -53,6 -53,7 +53,6 @@@ static        Char            *operate        (int, Char *, Cha
  static        void             putn1          (unsigned);
  static        struct varent   *madrof         (Char *, struct varent *);
  static        void             unsetv1        (struct varent *);
 -static        void             exportpath     (Char **);
  static        void             balance        (struct varent *, int, int);
  
  /*
@@@ -173,6 -174,9 +173,9 @@@ update_vars(Char *vp
      else if (eq(vp, STRbackslash_quote)) {
        bslash_quote = 1;
      }
+     else if (eq(vp, STRcompat_expr)) {
+       compat_expr = 1;
+     }
      else if (eq(vp, STRdirstack)) {
        dsetstack();
      }
@@@ -524,6 -528,7 +527,7 @@@ getn(Char *cp
  {
      int n;
      int     sign;
+     int base;
  
      if (!cp)                  /* PWP: extra error checking */
        stderror(ERR_NAME | ERR_BADNUM);
        if (!Isdigit(*cp))
            stderror(ERR_NAME | ERR_BADNUM);
      }
+     if (cp[0] == '0' && cp[1])
+       base = 8;
+     else
+       base = 10;
      n = 0;
      while (Isdigit(*cp))
-       n = n * 10 + *cp++ - '0';
+     {
+       if (base == 8 && *cp >= '8')
+           stderror(ERR_NAME | ERR_BADNUM);
+       n = n * base + *cp++ - '0';
+     }
      if (*cp)
        stderror(ERR_NAME | ERR_BADNUM);
      return (sign ? -n : n);
@@@ -749,6 -764,8 +763,8 @@@ unset(Char **v, struct command *c
        editing = 0;
      if (adrof(STRbackslash_quote) == 0)
        bslash_quote = 0;
+     if (adrof(STRcompat_expr) == 0)
+       compat_expr = 0;
      if (adrof(STRsymlinks) == 0)
        symlinks = 0;
      if (adrof(STRimplicitcd) == 0)
@@@ -873,7 -890,7 +889,7 @@@ shift(Char **v, struct command *c
      update_vars(name);
  }
  
 -static void
 +void
  exportpath(Char **val)
  {
      struct Strbuf buf = Strbuf_INIT;