Changeset 2591 for trunk/src/kmk/job.c


Ignore:
Timestamp:
Jun 17, 2012, 10:45:31 PM (13 years ago)
Author:
bird
Message:

kmk: Merged in changes from GNU make 3.82. Previous GNU make base version was gnumake-2008-10-28-CVS.

Location:
trunk/src/kmk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk

    • Property svn:ignore
      •  

        old new  
        1313stamp-*
        1414makebook*
         15
        1516.*gdbinit
         17.gdb_history
         18
        1619*.dep
        1720*.dvi
         
        3134*.pg
        3235*.pgs
         36
        3337README
        3438README.DOS
        3539README.W32
         40README.OS2
        3641aclocal.m4
        3742autom4te.cache
         
        5257config.h.W32
        5358config.h-vms
         59
        5460loadavg
        5561loadavg.c
        5662make
         63
        5764.deps
        5865.dep_segment
         66ID
         67TAGS
         68
        5969_*
        6070sun4
         
        7282sol2
        7383i486-linux
         84
        7485customs
         86
        7587install-sh
        7688mkinstalldirs
         89
         90.directive.asc
  • trunk/src/kmk/job.c

    r2564 r2591  
    11/* Job execution and handling for GNU Make.
    22Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
    3 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software
    4 Foundation, Inc.
     31998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
     42010 Free Software Foundation, Inc.
    55This file is part of GNU Make.
    66
     
    182182#endif  /* Don't have `union wait'.  */
    183183
    184 #ifndef HAVE_UNISTD_H
     184#if !defined(HAVE_UNISTD_H) && !defined(WINDOWS32)
    185185# ifndef _MSC_VER /* bird */
    186186int dup2 ();
     
    196196#endif
    197197
     198/* Different systems have different requirements for pid_t.
     199   Plus we have to support gettext string translation... Argh.  */
     200static const char *
     201pid2str (pid_t pid)
     202{
     203  static char pidstring[100];
     204#if defined(WINDOWS32) && (__GNUC__ > 3 || _MSC_VER > 1300)
     205  /* %Id is only needed for 64-builds, which were not supported by
     206      older versions of Windows compilers.  */
     207  sprintf (pidstring, "%Id", pid);
     208#else
     209  sprintf (pidstring, "%lu", (unsigned long) pid);
     210#endif
     211  return pidstring;
     212}
     213
    198214int getloadavg (double loadavg[], int nelem);
    199215int start_remote_job (char **argv, char **envp, int stdin_fd, int *is_remote,
     
    248264 */
    249265int
    250 w32_kill(int pid, int sig)
     266w32_kill(pid_t pid, int sig)
    251267{
    252268  return ((process_kill((HANDLE)pid, sig) == TRUE) ? 0 : -1);
     
    261277{
    262278  const char *const ext = unixy ? "sh" : "bat";
    263   const char *error = NULL;
     279  const char *error_string = NULL;
    264280  char temp_path[MAXPATHLEN]; /* need to know its length */
    265281  unsigned path_size = GetTempPath(sizeof temp_path, temp_path);
     
    307323          else
    308324            {
    309               error = map_windows32_error_to_string (er);
     325              error_string = map_windows32_error_to_string (er);
    310326              break;
    311327            }
     
    316332          char *const path = xmalloc (final_size);
    317333          memcpy (path, temp_path, final_size);
    318           *fd = _open_osfhandle ((long)h, 0);
     334          *fd = _open_osfhandle ((intptr_t)h, 0);
    319335          if (unixy)
    320336            {
     
    330346
    331347  *fd = -1;
    332   if (error == NULL)
    333     error = _("Cannot create a temporary file\n");
    334   fatal (NILF, error);
     348  if (error_string == NULL)
     349    error_string = _("Cannot create a temporary file\n");
     350  fatal (NILF, error_string);
    335351
    336352  /* not reached */
     
    383399#endif /* __EMX__ */
    384400
     401/* determines whether path looks to be a Bourne-like shell. */
     402int
     403is_bourne_compatible_shell (const char *path)
     404{
     405  /* list of known unix (Bourne-like) shells */
     406  const char *unix_shells[] = {
     407    "sh",
     408    "bash",
     409    "ksh",
     410    "rksh",
     411    "zsh",
     412    "ash",
     413    "dash",
     414    NULL
     415  };
     416  unsigned i, len;
     417
     418  /* find the rightmost '/' or '\\' */
     419  const char *name = strrchr (path, '/');
     420  char *p = strrchr (path, '\\');
     421
     422  if (name && p)    /* take the max */
     423    name = (name > p) ? name : p;
     424  else if (p)       /* name must be 0 */
     425    name = p;
     426  else if (!name)   /* name and p must be 0 */
     427    name = path;
     428
     429  if (*name == '/' || *name == '\\') name++;
     430
     431  /* this should be able to deal with extensions on Windows-like systems */
     432  for (i = 0; unix_shells[i] != NULL; i++) {
     433    len = strlen(unix_shells[i]);
     434#if defined(WINDOWS32) || defined(__MSDOS__)
     435    if ((strncasecmp (name, unix_shells[i], len) == 0) &&
     436      (strlen(name) >= len && (name[len] == '\0' || name[len] == '.')))
     437#else
     438    if ((strncmp (name, unix_shells[i], len) == 0) &&
     439      (strlen(name) >= len && name[len] == '\0'))
     440#endif
     441        return 1; /* a known unix-style shell */
     442  }
     443
     444  /* if not on the list, assume it's not a Bourne-like shell */
     445  return 0;
     446}
     447
    385448
    386449
     
    537600            {
    538601              completed_child = c;
    539               DB (DB_JOBS, (_("builtin child 0x%08lx (%s) PID %ld %s Status %ld\n"),
    540                             (unsigned long int) c, c->file->name,
    541                             (long) c->pid, c->remote ? _(" (remote)") : "",
     602              DB (DB_JOBS, (_("builtin child %p (%s) PID %s %s Status %ld\n"),
     603                            (void *)c, c->file->name,
     604                            pid2str (c->pid), c->remote ? _(" (remote)") : "",
    542605                            (long) c->status));
    543606            }
    544607          else
    545608#endif
    546           DB (DB_JOBS, (_("Live child 0x%08lx (%s) PID %ld %s\n"),
    547                         (unsigned long int) c, c->file->name,
    548                         (long) c->pid, c->remote ? _(" (remote)") : ""));
     609          DB (DB_JOBS, (_("Live child %p (%s) PID %s %s\n"),
     610                        (void *)c, c->file->name, pid2str (c->pid),
     611                        c->remote ? _(" (remote)") : ""));
    549612#ifdef VMS
    550613          break;
     
    681744                  }
    682745                else
    683                   DB (DB_VERBOSE, ("Main thread handle = 0x%08lx\n",
    684                                    (unsigned long)main_thread));
     746                  DB (DB_VERBOSE, ("Main thread handle = %p\n", main_thread));
    685747              }
    686748
     
    745807
    746808      DB (DB_JOBS, (child_failed
    747                     ? _("Reaping losing child 0x%08lx PID %ld %s\n")
    748                     : _("Reaping winning child 0x%08lx PID %ld %s\n"),
    749                     (unsigned long int) c, (long) c->pid,
    750                     c->remote ? _(" (remote)") : ""));
     809                    ? _("Reaping losing child %p PID %s %s\n")
     810                    : _("Reaping winning child %p PID %s %s\n"),
     811                    (void *)c, pid2str (c->pid), c->remote ? _(" (remote)") : ""));
    751812
    752813      if (c->sh_batch_file) {
     
    859920        notice_finished_file (c->file);
    860921
    861       DB (DB_JOBS, (_("Removing child 0x%08lx PID %ld%s from chain.\n"),
    862                     (unsigned long int) c, (long) c->pid,
    863                     c->remote ? _(" (remote)") : ""));
     922      DB (DB_JOBS, (_("Removing child %p PID %s%s from chain.\n"),
     923                    (void *)c, pid2str (c->pid), c->remote ? _(" (remote)") : ""));
    864924
    865925      /* Block fatal signals while frobnicating the list, so that
     
    908968#endif
    909969  if (!jobserver_tokens)
    910     fatal (NILF, "INTERNAL: Freeing child 0x%08lx (%s) but no tokens left!\n",
    911            (unsigned long int) child, child->file->name);
     970    fatal (NILF, "INTERNAL: Freeing child %p (%s) but no tokens left!\n",
     971           (void *)child, child->file->name);
    912972
    913973  /* If we're using the jobserver and this child is not the only outstanding
     
    925985        pfatal_with_name (_("write jobserver"));
    926986
    927       DB (DB_JOBS, (_("Released token for child 0x%08lx (%s).\n"),
    928                     (unsigned long int) child, child->file->name));
     987      DB (DB_JOBS, (_("Released token for child %p (%s).\n"),
     988                    (void *)child, child->file->name));
    929989    }
    930990
     
    10311091  rval = sigaction (SIGCLD, &sa, NULL);
    10321092#endif
    1033   if (rval != 0) 
     1093  if (rval != 0)
    10341094    fprintf (stderr, "sigaction: %s (%d)\n", strerror (errno), errno);
    10351095#if defined SIGALRM
     
    10621122  static int bad_stdin = -1;
    10631123#endif
    1064   register char *p;
    1065   int flags;
     1124  char *p;
     1125  /* Must be volatile to silence bogus GCC warning about longjmp/vfork.  */
     1126  /*volatile*/ int flags;
    10661127#ifdef VMS
    10671128  char *argv;
    10681129#else
    10691130  char **argv;
     1131  char ** volatile volatile_argv;
     1132  int volatile volatile_flags;
    10701133#endif
    10711134
     
    12291292      unixy_shell       /* the test is complicated and we already did it */
    12301293#else
    1231       (argv[0] && !strcmp (argv[0], "/bin/sh"))
    1232 #endif
    1233       && (argv[1]
    1234           && argv[1][0] == '-' && argv[1][1] == 'c' && argv[1][2] == '\0')
     1294      (argv[0] && is_bourne_compatible_shell(argv[0]))
     1295#endif
     1296      && (argv[1] && argv[1][0] == '-'
     1297        &&
     1298            ((argv[1][1] == 'c' && argv[1][2] == '\0')
     1299          ||
     1300             (argv[1][1] == 'e' && argv[1][2] == 'c' && argv[1][3] == '\0')))
    12351301      && (argv[2] && argv[2][0] == ':' && argv[2][1] == '\0')
    12361302      && argv[3] == NULL)
     
    14351501
    14361502#else  /* !__EMX__ */
     1503      volatile_argv  = argv;            /* shut up gcc */
     1504      volatile_flags = flags;           /* ditto */
    14371505
    14381506      child->pid = vfork ();
    14391507      environ = parent_environ; /* Restore value child may have clobbered.  */
     1508      argv = volatile_argv;             /* shut up gcc */
    14401509      if (child->pid == 0)
    14411510        {
     
    14451514          /* If we aren't running a recursive command and we have a jobserver
    14461515             pipe, close it before exec'ing.  */
    1447           if (!(flags & COMMANDS_RECURSE) && job_fds[0] >= 0)
     1516          if (!(volatile_flags & COMMANDS_RECURSE) && job_fds[0] >= 0)
    14481517            {
    14491518              close (job_fds[0]);
     
    14521521          if (job_rfd >= 0)
    14531522            close (job_rfd);
     1523
     1524#ifdef SET_STACK_SIZE
     1525          /* Reset limits, if necessary.  */
     1526          if (stack_limit.rlim_cur)
     1527            setrlimit (RLIMIT_STACK, &stack_limit);
     1528#endif
    14541529
    14551530          child_execute_job (child->good_stdin ? 0 : bad_stdin, 1,
     
    15531628
    15541629      if (hPID != INVALID_HANDLE_VALUE)
    1555         child->pid = (int) hPID;
     1630        child->pid = (pid_t) hPID;
    15561631      else {
    15571632        int i;
     
    16751750    case cs_running:
    16761751      c->next = children;
    1677       DB (DB_JOBS, (_("Putting child 0x%08lx (%s) PID %ld%s on the chain.\n"),
    1678                     (unsigned long int) c, c->file->name,
    1679                     (long) c->pid, c->remote ? _(" (remote)") : ""));
     1752      DB (DB_JOBS, (_("Putting child %p (%s) PID %s%s on the chain.\n"),
     1753                    (void *)c, c->file->name, pid2str (c->pid),
     1754                    c->remote ? _(" (remote)") : ""));
    16801755      children = c;
    16811756      /* One more job slot is in use.  */
     
    18201895         Copy the remaining uninteresting text to the output.  */
    18211896      if (out != in)
    1822         strcpy (out, in);
     1897        memmove (out, in, strlen (in) + 1);
    18231898
    18241899      /* Finally, expand the line.  */
     
    18301905     `struct child', and add that to the chain.  */
    18311906
    1832   c = xmalloc (sizeof (struct child));
    1833   memset (c, '\0', sizeof (struct child));
     1907  c = xcalloc (sizeof (struct child));
    18341908  c->file = file;
    18351909  c->command_lines = lines;
     
    19352009        if (got_token == 1)
    19362010          {
    1937             DB (DB_JOBS, (_("Obtained token for child 0x%08lx (%s).\n"),
    1938                           (unsigned long int) c, c->file->name));
     2011            DB (DB_JOBS, (_("Obtained token for child %p (%s).\n"),
     2012                          (void *)c, c->file->name));
    19392013            break;
    19402014          }
     
    22882362      int i;
    22892363      fprintf(stderr,
    2290               _("process_easy() failed failed to launch process (e=%ld)\n"),
     2364              _("process_easy() failed to launch process (e=%ld)\n"),
    22912365              process_last_err(hPID));
    22922366      for (i = 0; argv[i]; i++)
     
    23172391          break;
    23182392      else
     2393        {
     2394          char *pidstr = xstrdup (pid2str ((pid_t)hWaitPID));
     2395
    23192396          fprintf(stderr,
    2320                   _("make reaped child pid %ld, still waiting for pid %ld\n"),
    2321                   (DWORD)hWaitPID, (DWORD)hPID);
     2397                  _("make reaped child pid %s, still waiting for pid %s\n"),
     2398                  pidstr, pid2str ((pid_t)hPID));
     2399          free (pidstr);
     2400        }
    23222401    }
    23232402
     
    24782557static char **
    24792558construct_command_argv_internal (char *line, char **restp, char *shell,
    2480                                  char *ifs, int flags,
     2559                                 char *shellflags, char *ifs, int flags,
    24812560                                 char **batch_filename_ptr)
    24822561{
     
    25192598                                 "continue", "export", "read", "readonly",
    25202599                                 "shift", "times", "trap", "switch", "unset",
    2521                                  0 };
     2600                                 "ulimit", 0 };
    25222601
    25232602  char *sh_chars;
     
    25612640#elif defined (WINDOWS32)
    25622641  static char sh_chars_dos[] = "\"|&<>";
    2563   static char *sh_cmds_dos[] = { "break", "call", "cd", "chcp", "chdir", "cls",
    2564                              "copy", "ctty", "date", "del", "dir", "echo",
    2565                              "erase", "exit", "for", "goto", "if", "if", "md",
    2566                              "mkdir", "path", "pause", "prompt", "rd", "rem",
    2567                              "ren", "rename", "rmdir", "set", "shift", "time",
    2568                              "type", "ver", "verify", "vol", ":", 0 };
     2642  static char *sh_cmds_dos[] = { "assoc", "break", "call", "cd", "chcp",
     2643                                 "chdir", "cls", "color", "copy", "ctty",
     2644                                 "date", "del", "dir", "echo", "echo.",
     2645                                 "endlocal", "erase", "exit", "for", "ftype",
     2646                                 "goto", "if", "if", "md", "mkdir", "path",
     2647                                 "pause", "prompt", "rd", "rem", "ren",
     2648                                 "rename", "rmdir", "set", "setlocal",
     2649                                 "shift", "time", "title", "type", "ver",
     2650                                 "verify", "vol", ":", 0 };
    25692651  static char sh_chars_sh[] = "#;\"*?[]&|<>(){}$`^";
    25702652  static char *sh_cmds_sh[] = { "cd", "eval", "exec", "exit", "login",
     
    25882670                             "login", "logout", "read", "readonly", "set",
    25892671                             "shift", "switch", "test", "times", "trap",
    2590                              "umask", "wait", "while", 0 };
     2672                             "ulimit", "umask", "unset", "wait", "while", 0 };
    25912673# ifdef HAVE_DOS_PATHS
    25922674  /* This is required if the MSYS/Cygwin ports (which do not define
     
    27272809      if (*ap != ' ' && *ap != '\t' && *ap != '\n')
    27282810        goto slow;
     2811
     2812  if (shellflags != 0)
     2813    if (shellflags[0] != '-'
     2814        || ((shellflags[1] != 'c' || shellflags[2] != '\0')
     2815            && (shellflags[1] != 'e' || shellflags[2] != 'c' || shellflags[3] != '\0')))
     2816      goto slow;
    27292817
    27302818  i = strlen (line) + 1;
     
    28102898        goto slow;
    28112899#endif /* !KMK */
     2900      else if (one_shell && *p == '\n')
     2901        /* In .ONESHELL mode \n is a separator like ; or && */
     2902        goto slow;
    28122903#ifdef  __MSDOS__
    28132904      else if (*p == '.' && p[1] == '.' && p[2] == '.' && p[3] != '.')
     
    30323123    return 0;
    30333124#endif /* WINDOWS32 */
     3125
    30343126  {
    30353127    /* SHELL may be a multi-word command.  Construct a command line
    3036        "SHELL -c LINE", with all special chars in LINE escaped.
     3128       "$(SHELL) $(.SHELLFLAGS) LINE", with all special chars in LINE escaped.
    30373129       Then recurse, expanding this command line to get the final
    30383130       argument list.  */
    30393131
    30403132    unsigned int shell_len = strlen (shell);
    3041 #ifndef VMS
    3042     static char minus_c[] = " -c ";
    3043 #else
    3044     static char minus_c[] = "";
    3045 #endif
    30463133    unsigned int line_len = strlen (line);
    3047 
    3048     char *new_line = alloca (shell_len + (sizeof (minus_c)-1)
    3049                              + (line_len*2) + 1);
     3134    unsigned int sflags_len = strlen (shellflags);
    30503135    char *command_ptr = NULL; /* used for batch_mode_shell mode */
     3136    char *new_line;
    30513137
    30523138# ifdef __EMX__ /* is this necessary? */
    30533139    if (!unixy_shell)
    3054       minus_c[1] = '/'; /* " /c " */
     3140      shellflags[0] = '/'; /* "/c" */
    30553141# endif
    30563142
     3143    /* In .ONESHELL mode we are allowed to throw the entire current
     3144        recipe string at a single shell and trust that the user
     3145        has configured the shell and shell flags, and formatted
     3146        the string, appropriately. */
     3147    if (one_shell)
     3148      {
     3149        /* If the shell is Bourne compatible, we must remove and ignore
     3150           interior special chars [@+-] because they're meaningless to
     3151           the shell itself. If, however, we're in .ONESHELL mode and
     3152           have changed SHELL to something non-standard, we should
     3153           leave those alone because they could be part of the
     3154           script. In this case we must also leave in place
     3155           any leading [@+-] for the same reason.  */
     3156
     3157        /* Remove and ignore interior prefix chars [@+-] because they're
     3158             meaningless given a single shell. */
     3159#if defined __MSDOS__ || defined (__EMX__)
     3160        if (unixy_shell)     /* the test is complicated and we already did it */
     3161#else
     3162        if (is_bourne_compatible_shell(shell))
     3163#endif
     3164          {
     3165            const char *f = line;
     3166            char *t = line;
     3167
     3168            /* Copy the recipe, removing and ignoring interior prefix chars
     3169               [@+-]: they're meaningless in .ONESHELL mode.  */
     3170            while (f[0] != '\0')
     3171              {
     3172                int esc = 0;
     3173
     3174                /* This is the start of a new recipe line.
     3175                   Skip whitespace and prefix characters.  */
     3176                while (isblank (*f) || *f == '-' || *f == '@' || *f == '+')
     3177                  ++f;
     3178
     3179                /* Copy until we get to the next logical recipe line.  */
     3180                while (*f != '\0')
     3181                  {
     3182                    *(t++) = *(f++);
     3183                    if (f[-1] == '\\')
     3184                      esc = !esc;
     3185                    else
     3186                      {
     3187                        /* On unescaped newline, we're done with this line.  */
     3188                        if (f[-1] == '\n' && ! esc)
     3189                          break;
     3190
     3191                        /* Something else: reset the escape sequence.  */
     3192                        esc = 0;
     3193                      }
     3194                  }
     3195              }
     3196            *t = '\0';
     3197          }
     3198
     3199        new_argv = xmalloc (4 * sizeof (char *));
     3200        new_argv[0] = xstrdup(shell);
     3201        new_argv[1] = xstrdup(shellflags);
     3202        new_argv[2] = line;
     3203        new_argv[3] = NULL;
     3204        return new_argv;
     3205      }
     3206
     3207    new_line = alloca (shell_len + 1 + sflags_len + 1
     3208                             + (line_len*2) + 1);
    30573209    ap = new_line;
    30583210    memcpy (ap, shell, shell_len);
    30593211    ap += shell_len;
    3060     memcpy (ap, minus_c, sizeof (minus_c) - 1);
    3061     ap += sizeof (minus_c) - 1;
     3212    *(ap++) = ' ';
     3213    memcpy (ap, shellflags, sflags_len);
     3214    ap += sflags_len;
     3215    *(ap++) = ' ';
    30623216    command_ptr = ap;
    30633217    for (p = line; *p != '\0'; ++p)
     
    31093263        *ap++ = *p;
    31103264      }
    3111     if (ap == new_line + shell_len + sizeof (minus_c) - 1)
     3265    if (ap == new_line + shell_len + sflags_len + 2)
    31123266      /* Line was empty.  */
    31133267      return 0;
     
    31613315    } else
    31623316#endif /* WINDOWS32 */
     3317
    31633318    if (unixy_shell)
    3164       new_argv = construct_command_argv_internal (new_line, 0, 0, 0, flags, 0);
     3319      new_argv = construct_command_argv_internal (new_line, 0, 0, 0, 0, flags, 0);
     3320
    31653321#ifdef __EMX__
    31663322    else if (!unixy_shell)
     
    31733329        char *q = new_line;
    31743330        memcpy (new_line, line, line_len + 1);
    3175         /* replace all backslash-newline combination and also following tabs */
    3176         while (*q != '\0')
     3331        /* Replace all backslash-newline combination and also following tabs.
     3332           Important: stop at the first '\n' because that's what the loop above
     3333           did. The next line starting at restp[0] will be executed during the
     3334           next call of this function. */
     3335        while (*q != '\0' && *q != '\n')
    31773336          {
    31783337            if (q[0] == '\\' && q[1] == '\n')
     
    32353394           cannot backslash-escape the special characters (see above).  */
    32363395        new_argv = xmalloc (sizeof (char *));
    3237         line_len = strlen (new_line) - shell_len - sizeof (minus_c) + 1;
     3396        line_len = strlen (new_line) - shell_len - sflags_len - 2;
    32383397        new_argv[0] = xmalloc (line_len + 1);
    32393398        strncpy (new_argv[0],
    3240                  new_line + shell_len + sizeof (minus_c) - 1, line_len);
     3399                 new_line + shell_len + sflags_len + 2, line_len);
    32413400        new_argv[0][line_len] = '\0';
    32423401      }
     
    32703429                        int cmd_flags, char **batch_filename_ptr)
    32713430{
    3272   char *shell, *ifs;
     3431  char *shell, *ifs, *shellflags;
    32733432  char **argv;
    32743433
     
    33753534#endif /* __EMX__ */
    33763535
     3536    shellflags = allocated_variable_expand_for_file ("$(.SHELLFLAGS)", file);
    33773537    ifs = allocated_variable_expand_for_file ("$(IFS)", file);
    33783538
     
    34003560    unixy_shell = 1;
    34013561    batch_mode_shell = 0;
    3402     argv = construct_command_argv_internal (line, restp, shell, ifs,
     3562    argv = construct_command_argv_internal (line, restp, shell, shellflags, ifs,
    34033563                                            cmd_flags, batch_filename_ptr);
    34043564    batch_mode_shell = saved_batch_mode_shell;
     
    34103570  else
    34113571#endif /* CONFIG_WITH_KMK_BUILTIN */
    3412   argv = construct_command_argv_internal (line, restp, shell, ifs,
     3572  argv = construct_command_argv_internal (line, restp, shell, shellflags, ifs,
    34133573                                          cmd_flags, batch_filename_ptr);
    34143574
    34153575  free (shell);
     3576  free (shellflags);
    34163577  free (ifs);
    34173578#endif /* !VMS */
     
    34373598  return fd;
    34383599}
    3439 #endif /* !HAPE_DUP2 && !_AMIGA */
     3600#endif /* !HAVE_DUP2 && !_AMIGA */
    34403601
    34413602#ifdef CONFIG_WITH_PRINT_TIME_SWITCH
Note: See TracChangeset for help on using the changeset viewer.