OpenPKG CVS Repository
  http://cvs.openpkg.org/
  ____________________________________________________________________________

  Server: cvs.openpkg.org                  Name:   Ralf S. Engelschall
  Root:   /e/openpkg/cvs                   Email:  [EMAIL PROTECTED]
  Module: openpkg-src                      Date:   04-Nov-2004 17:13:21
  Branch: OPENPKG_2_2_SOLID                Handle: 2004110416131901

  Modified files:           (Branch: OPENPKG_2_2_SOLID)
    openpkg-src/openpkg     HISTORY bash.patch openpkg.spec

  Log:
    Synchronize bootstrap with OpenPKG-CURRENT by mainly appling the GNU
    bash patch for brain-dead Linux platforms with the broken WCONTINUE

  Summary:
    Revision    Changes     Path
    1.214.2.2   +8  -0      openpkg-src/openpkg/HISTORY
    1.5.2.1     +647 -37    openpkg-src/openpkg/bash.patch
    1.361.2.4   +1  -1      openpkg-src/openpkg/openpkg.spec
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: openpkg-src/openpkg/HISTORY
  ============================================================================
  $ cvs diff -u -r1.214.2.1 -r1.214.2.2 HISTORY
  --- openpkg-src/openpkg/HISTORY       11 Oct 2004 18:57:43 -0000      1.214.2.1
  +++ openpkg-src/openpkg/HISTORY       4 Nov 2004 16:13:19 -0000       1.214.2.2
  @@ -2,6 +2,14 @@
   2004
   ====
   
  +20041004 **** RELEASE AS PART OF OPENPKG 2.2.1 ***
  +20041104 apply GNU bash patch for brain-dead Linux platforms with broken WCONTINUE
  +20041103 upgrade to OSSP uuid 1.1.0 (excluded in 2.2.1)
  +20041024 synchronize GNU bash patches with OpenPKG "bash" package
  +20041018 upgrade to cURL 1.12.2 (excluded in 2.2.1)
  +20041018 upgrade to OSSP uuid 1.0.4 (excluded in 2.2.1)
  +20041015 upgrade to OSSP uuid 1.0.3 (excluded in 2.2.1)
  +
   20041002 **** RELEASE AS PART OF OPENPKG 2.2.0 ***
   20041002 cleanup more shtool usages
   20040928 fix broken shtool usage introduced in 20040924
  @@ .
  patch -p0 <<'@@ .'
  Index: openpkg-src/openpkg/bash.patch
  ============================================================================
  $ cvs diff -u -r1.5 -r1.5.2.1 bash.patch
  --- openpkg-src/openpkg/bash.patch    11 Aug 2004 13:24:56 -0000      1.5
  +++ openpkg-src/openpkg/bash.patch    4 Nov 2004 16:13:20 -0000       1.5.2.1
  @@ -148,31 +148,6 @@
   
   -----------------------------------------------------------------------------
   
  -Fix display handling of multi-line prompts.
  -
  -Index: lib/readline/display.c
  ---- lib/readline/display.c.orig      2004-05-28 04:57:51 +0200
  -+++ lib/readline/display.c   2004-07-28 20:17:43 +0200
  -@@ -351,14 +351,14 @@
  -       local_prompt = expand_prompt (p, &prompt_visible_length,
  -                                    &prompt_last_invisible,
  -                                    (int *)NULL,
  --                                   (int *)NULL);
  -+                                   &prompt_physical_chars);
  -       c = *t; *t = '\0';
  -       /* The portion of the prompt string up to and including the
  -      final newline is now null-terminated. */
  -       local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length,
  -                                                (int *)NULL,
  -                                                &prompt_invis_chars_first_line,
  --                                               &prompt_physical_chars);
  -+                                               (int *)NULL);
  -       *t = c;
  -       return (prompt_prefix_length);
  -     }
  -
  ------------------------------------------------------------------------------
  -
   Fix timezone handling for HPUX
   
   Index: lib/sh/strftime.c
  @@ -202,12 +177,23 @@
   
   -----------------------------------------------------------------------------
   
  -Fix segfault when accessing an unset array.
  -http://lists.gnu.org/archive/html/bug-bash/2004-08/msg00026.html
  +These are the accumulated official GNU bash 3.0 patches 001 to 014.
   
  +Index: array.c
  +--- array.c.orig     2004-05-06 14:24:13 +0200
  ++++ array.c  2004-10-24 18:48:43 +0200
  +@@ -451,7 +451,7 @@
  +                      */
  +                     array_dispose_element(new);
  +                     free(element_value(ae));
  +-                    ae->value = savestring(v);
  ++                    ae->value = v ? savestring(v) : (char *)NULL;
  +                     return(0);
  +             } else if (element_index(ae) > i) {
  +                     ADD_BEFORE(ae, new);
   Index: arrayfunc.c
   --- arrayfunc.c.orig 2003-12-19 06:03:09 +0100
  -+++ arrayfunc.c      2004-08-11 15:17:03 +0200
  ++++ arrayfunc.c      2004-10-24 18:48:43 +0200
   @@ -611,7 +611,7 @@
      var = find_variable (t);
    
  @@ -217,20 +203,644 @@
    }
    
    /* Return a string containing the elements in the array and subscript
  -
  ------------------------------------------------------------------------------
  -
  -Fix nested brace vs. variable expansion.
  -http://lists.gnu.org/archive/html/bug-bash/2004-08/msg00056.html
  -
  +Index: bashline.c
  +--- bashline.c.orig  2004-07-06 05:22:12 +0200
  ++++ bashline.c       2004-10-24 18:48:43 +0200
  +@@ -100,6 +100,7 @@
  + #endif
  + 
  + /* Helper functions for Readline. */
  ++static int bash_directory_expansion __P((char **));
  + static int bash_directory_completion_hook __P((char **));
  + static int filename_completion_ignore __P((char **));
  + static int bash_push_line __P((void));
  +@@ -292,7 +293,7 @@
  +       /* See if we have anything to do. */
  +       at = strchr (rl_completer_word_break_characters, '@');
  +       if ((at == 0 && on_or_off == 0) || (at != 0 && on_or_off != 0))
  +-        return;
  ++        return old_value;
  + 
  +       /* We have something to do.  Do it. */
  +       nval = (char *)xmalloc (strlen (rl_completer_word_break_characters) + 1 + 
on_or_off);
  +@@ -1406,10 +1407,19 @@
  +          filename. */
  +       if (*hint_text == '~')
  +         {
  +-          int l, tl, vl;
  ++          int l, tl, vl, dl;
  ++          char *rd;
  +           vl = strlen (val);
  +           tl = strlen (hint_text);
  ++#if 0
  +           l = vl - hint_len;        /* # of chars added */
  ++#else
  ++          rd = savestring (filename_hint);
  ++          bash_directory_expansion (&rd);
  ++          dl = strlen (rd);
  ++          l = vl - dl;              /* # of chars added */
  ++          free (rd);
  ++#endif
  +           temp = (char *)xmalloc (l + 2 + tl);
  +           strcpy (temp, hint_text);
  +           strcpy (temp + tl, val + vl - l);
  +@@ -2187,6 +2197,27 @@
  +   return 0;
  + }
  + 
  ++/* Simulate the expansions that will be performed by
  ++   rl_filename_completion_function.  This must be called with the address of
  ++   a pointer to malloc'd memory. */
  ++static int
  ++bash_directory_expansion (dirname)
  ++     char **dirname;
  ++{
  ++  char *d;
  ++
  ++  d = savestring (*dirname);
  ++
  ++  if (rl_directory_rewrite_hook)
  ++    (*rl_directory_rewrite_hook) (&d);
  ++
  ++  if (rl_directory_completion_hook && (*rl_directory_completion_hook) (&d))
  ++    {
  ++      free (*dirname);
  ++      *dirname = d;
  ++    }
  ++}
  ++  
  + /* Handle symbolic link references and other directory name
  +    expansions while hacking completion. */
  + static int
  +@@ -2513,7 +2544,7 @@
  +   static char **matches = (char **)NULL;
  +   static int ind;
  +   int glen;
  +-  char *ret;
  ++  char *ret, *ttext;
  + 
  +   if (state == 0)
  +     {
  +@@ -2523,17 +2554,22 @@
  +     FREE (globorig);
  +       FREE (globtext);
  + 
  ++      ttext = bash_tilde_expand (text, 0);
  ++
  +       if (rl_explicit_arg)
  +     {
  +-      globorig = savestring (text);
  +-      glen = strlen (text);
  ++      globorig = savestring (ttext);
  ++      glen = strlen (ttext);
  +       globtext = (char *)xmalloc (glen + 2);
  +-      strcpy (globtext, text);
  ++      strcpy (globtext, ttext);
  +       globtext[glen] = '*';
  +       globtext[glen+1] = '\0';
  +     }
  +       else
  +-        globtext = globorig = savestring (text);
  ++        globtext = globorig = savestring (ttext);
  ++
  ++      if (ttext != text)
  ++    free (ttext);
  + 
  +       matches = shell_glob_filename (globtext);
  +       if (GLOB_FAILED (matches))
   Index: braces.c
   --- braces.c.orig    2003-12-04 17:09:52 +0100
  -+++ braces.c 2004-08-11 15:18:14 +0200
  -@@ -402,6 +402,7 @@
  ++++ braces.c 2004-10-24 18:48:43 +0200
  +@@ -340,8 +340,8 @@
  +   
  +   if (lhs_t == ST_CHAR)
  +     {
  +-      lhs_v = lhs[0];
  +-      rhs_v = rhs[0];
  ++      lhs_v = (unsigned char)lhs[0];
  ++      rhs_v = (unsigned char)rhs[0];
  +     }
  +   else
  +     {
  +@@ -402,6 +402,8 @@
        {
          pass_next = 1;
          i++;
  -+      level++;
  ++      if (quoted == 0)
  ++        level++;
          continue;
        }
    #endif
  +Index: builtins/trap.def
  +--- builtins/trap.def.orig   2004-05-28 04:26:19 +0200
  ++++ builtins/trap.def        2004-10-24 18:48:43 +0200
  +@@ -23,7 +23,7 @@
  + 
  + $BUILTIN trap
  + $FUNCTION trap_builtin
  +-$SHORT_DOC trap [-lp] [[arg] signal_spec ...]
  ++$SHORT_DOC trap [-lp] [arg signal_spec ...]
  + The command ARG is to be read and executed when the shell receives
  + signal(s) SIGNAL_SPEC.  If ARG is absent (and a single SIGNAL_SPEC
  + is supplied) or `-', each specified signal is reset to its original
  +@@ -87,7 +87,7 @@
  + trap_builtin (list)
  +      WORD_LIST *list;
  + {
  +-  int list_signal_names, display, result, opt;
  ++  int list_signal_names, display, result, opt, first_signal;
  + 
  +   list_signal_names = display = 0;
  +   result = EXECUTION_SUCCESS;
  +@@ -118,14 +118,19 @@
  +   else
  +     {
  +       char *first_arg;
  +-      int operation, sig;
  ++      int operation, sig, first_signal;
  + 
  +       operation = SET;
  +       first_arg = list->word->word;
  ++      first_signal = first_arg && *first_arg && all_digits (first_arg) && 
signal_object_p (first_arg, opt);
  ++
  ++      /* Backwards compatibility */
  ++      if (first_signal)
  ++    operation = REVERT;
  +       /* When in posix mode, the historical behavior of looking for a
  +      missing first argument is disabled.  To revert to the original
  +      signal handling disposition, use `-' as the first argument. */
  +-      if (posixly_correct == 0 && first_arg && *first_arg &&
  ++      else if (posixly_correct == 0 && first_arg && *first_arg &&
  +             (*first_arg != '-' || first_arg[1]) &&
  +             signal_object_p (first_arg, opt) && list->next == 0)
  +     operation = REVERT;
  +Index: include/shmbutil.h
  +--- include/shmbutil.h.orig  2004-04-19 15:59:42 +0200
  ++++ include/shmbutil.h       2004-10-24 18:48:43 +0200
  +@@ -31,6 +31,8 @@
  + extern size_t xmbsrtowcs __P((wchar_t *, const char **, size_t, mbstate_t *));
  + extern size_t xdupmbstowcs __P((wchar_t **, char ***, const char *));
  + 
  ++extern size_t mbstrlen __P((const char *));
  ++
  + extern char *xstrchr __P((const char *, int));
  + 
  + #ifndef MB_INVALIDCH
  +@@ -38,6 +40,9 @@
  + #define MB_NULLWCH(x)               ((x) == 0)
  + #endif
  + 
  ++#define MBSLEN(s)   (((s) && (s)[0]) ? ((s)[1] ? mbstrlen (s) : 1) : 0)
  ++#define MB_STRLEN(s)        ((MB_CUR_MAX > 1) ? MBSLEN (s) : STRLEN (s))
  ++
  + #else /* !HANDLE_MULTIBYTE */
  + 
  + #undef MB_LEN_MAX
  +@@ -54,6 +59,8 @@
  + #define MB_NULLWCH(x)               (0)
  + #endif
  + 
  ++#define MB_STRLEN(s)                (STRLEN(s))
  ++
  + #endif /* !HANDLE_MULTIBYTE */
  + 
  + /* Declare and initialize a multibyte state.  Call must be terminated
  +Index: jobs.c
  +--- jobs.c.orig      2004-04-23 22:28:25 +0200
  ++++ jobs.c   2004-10-24 18:48:43 +0200
  +@@ -1778,8 +1778,13 @@
  +   if (pipefail_opt)
  +     {
  +       fail = 0;
  +-      for (p = jobs[job]->pipe; p->next != jobs[job]->pipe; p = p->next)
  +-        if (p->status != EXECUTION_SUCCESS) fail = p->status;
  ++      p = jobs[job]->pipe;
  ++      do
  ++    {
  ++      if (p->status != EXECUTION_SUCCESS) fail = p->status;
  ++      p = p->next;
  ++    }
  ++      while (p != jobs[job]->pipe);
  +       return fail;
  +     }
  + 
  +Index: lib/readline/display.c
  +--- lib/readline/display.c.orig      2004-05-28 04:57:51 +0200
  ++++ lib/readline/display.c   2004-10-24 18:48:43 +0200
  +@@ -201,7 +201,7 @@
  +      int *lp, *lip, *niflp, *vlp;
  + {
  +   char *r, *ret, *p;
  +-  int l, rl, last, ignoring, ninvis, invfl, ind, pind, physchars;
  ++  int l, rl, last, ignoring, ninvis, invfl, invflset, ind, pind, physchars;
  + 
  +   /* Short-circuit if we can. */
  +   if ((MB_CUR_MAX <= 1 || rl_byte_oriented) && strchr (pmt, 
RL_PROMPT_START_IGNORE) == 0)
  +@@ -222,6 +222,7 @@
  +   r = ret = (char *)xmalloc (l + 1);
  + 
  +   invfl = 0;        /* invisible chars in first line of prompt */
  ++  invflset = 0;     /* we only want to set invfl once */
  + 
  +   for (rl = ignoring = last = ninvis = physchars = 0, p = pmt; p && *p; p++)
  +     {
  +@@ -249,7 +250,10 @@
  +           while (l--)
  +             *r++ = *p++;
  +           if (!ignoring)
  +-            rl += ind - pind;
  ++            {
  ++              rl += ind - pind;
  ++              physchars += _rl_col_width (pmt, pind, ind);
  ++            }
  +           else
  +             ninvis += ind - pind;
  +           p--;                      /* compensate for later increment */
  +@@ -259,16 +263,19 @@
  +         {
  +           *r++ = *p;
  +           if (!ignoring)
  +-            rl++;                   /* visible length byte counter */
  ++            {
  ++              rl++;                 /* visible length byte counter */
  ++              physchars++;
  ++            }
  +           else
  +             ninvis++;               /* invisible chars byte counter */
  +         }
  + 
  +-      if (rl >= _rl_screenwidth)
  +-        invfl = ninvis;
  +-
  +-      if (ignoring == 0)
  +-        physchars++;
  ++      if (invflset == 0 && rl >= _rl_screenwidth)
  ++        {
  ++          invfl = ninvis;
  ++          invflset = 1;
  ++        }
  +     }
  +     }
  + 
  +@@ -351,14 +358,14 @@
  +       local_prompt = expand_prompt (p, &prompt_visible_length,
  +                                    &prompt_last_invisible,
  +                                    (int *)NULL,
  +-                                   (int *)NULL);
  ++                                   &prompt_physical_chars);
  +       c = *t; *t = '\0';
  +       /* The portion of the prompt string up to and including the
  +      final newline is now null-terminated. */
  +       local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length,
  +                                                (int *)NULL,
  +                                                &prompt_invis_chars_first_line,
  +-                                               &prompt_physical_chars);
  ++                                               (int *)NULL);
  +       *t = c;
  +       return (prompt_prefix_length);
  +     }
  +@@ -417,7 +424,7 @@
  +   register int in, out, c, linenum, cursor_linenum;
  +   register char *line;
  +   int c_pos, inv_botlin, lb_botlin, lb_linenum;
  +-  int newlines, lpos, temp, modmark;
  ++  int newlines, lpos, temp, modmark, n0, num;
  +   char *prompt_this_line;
  + #if defined (HANDLE_MULTIBYTE)
  +   wchar_t wc;
  +@@ -573,6 +580,7 @@
  + 
  + #if defined (HANDLE_MULTIBYTE)
  +   memset (_rl_wrapped_line, 0, vis_lbsize);
  ++  num = 0;
  + #endif
  + 
  +   /* prompt_invis_chars_first_line is the number of invisible characters in
  +@@ -591,13 +599,32 @@
  +          probably too much work for the benefit gained.  How many people have
  +          prompts that exceed two physical lines?
  +          Additional logic fix from Edward Catmur <[EMAIL PROTECTED]> */
  ++#if defined (HANDLE_MULTIBYTE)
  ++      n0 = num;
  ++      temp = local_prompt ? strlen (local_prompt) : 0;
  ++      while (num < temp)
  ++    {
  ++      if (_rl_col_width  (local_prompt, n0, num) > _rl_screenwidth)
  ++        {
  ++          num = _rl_find_prev_mbchar (local_prompt, num, MB_FIND_ANY);
  ++          break;
  ++        }
  ++      num++;
  ++    }
  ++      temp = num +
  ++#else
  +       temp = ((newlines + 1) * _rl_screenwidth) +
  ++#endif /* !HANDLE_MULTIBYTE */
  +              ((local_prompt_prefix == 0) ? ((newlines == 0) ? 
prompt_invis_chars_first_line
  +                                                         : ((newlines == 1) ? 
wrap_offset : 0))
  +                                      : ((newlines == 0) ? wrap_offset :0));
  +              
  +       inv_lbreaks[++newlines] = temp;
  ++#if defined (HANDLE_MULTIBYTE)
  ++      lpos -= _rl_col_width (local_prompt, n0, num);
  ++#else
  +       lpos -= _rl_screenwidth;
  ++#endif
  +     }
  + 
  +   prompt_last_screen_line = newlines;
  +Index: lib/readline/mbutil.c
  +--- lib/readline/mbutil.c.orig       2004-01-14 15:44:52 +0100
  ++++ lib/readline/mbutil.c    2004-10-24 18:48:43 +0200
  +@@ -126,11 +126,11 @@
  +   if (find_non_zero)
  +     {
  +       tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);
  +-      while (wcwidth (wc) == 0)
  ++      while (tmp > 0 && wcwidth (wc) == 0)
  +     {
  +       point += tmp;
  +       tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);
  +-      if (tmp == (size_t)(0) || tmp == (size_t)(-1) || tmp == (size_t)(-2))
  ++      if (MB_NULLWCH (tmp) || MB_INVALIDCH (tmp))
  +         break;
  +     }
  +     }
  +Index: lib/readline/misc.c
  +--- lib/readline/misc.c.orig 2004-07-07 14:56:32 +0200
  ++++ lib/readline/misc.c      2004-10-24 18:48:43 +0200
  +@@ -276,12 +276,6 @@
  +       _rl_saved_line_for_history->line = savestring (rl_line_buffer);
  +       _rl_saved_line_for_history->data = (char *)rl_undo_list;
  +     }
  +-  else if (STREQ (rl_line_buffer, _rl_saved_line_for_history->line) == 0)
  +-    {
  +-      free (_rl_saved_line_for_history->line);
  +-      _rl_saved_line_for_history->line = savestring (rl_line_buffer);
  +-      _rl_saved_line_for_history->data = (char *)rl_undo_list;      /* XXX 
possible memleak */
  +-    }
  + 
  +   return 0;
  + }
  +Index: lib/readline/vi_mode.c
  +--- lib/readline/vi_mode.c.orig      2004-07-13 20:08:27 +0200
  ++++ lib/readline/vi_mode.c   2004-10-24 18:48:43 +0200
  +@@ -272,10 +272,12 @@
  +   switch (key)
  +     {
  +     case '?':
  ++      _rl_free_saved_history_line ();
  +       rl_noninc_forward_search (count, key);
  +       break;
  + 
  +     case '/':
  ++      _rl_free_saved_history_line ();
  +       rl_noninc_reverse_search (count, key);
  +       break;
  + 
  +@@ -690,7 +692,7 @@
  + {
  +   wchar_t wc;
  +   char mb[MB_LEN_MAX+1];
  +-  int mblen;
  ++  int mblen, p;
  +   mbstate_t ps;
  + 
  +   memset (&ps, 0, sizeof (mbstate_t));
  +@@ -713,11 +715,14 @@
  +       /* Vi is kind of strange here. */
  +       if (wc)
  +     {
  ++      p = rl_point;
  +       mblen = wcrtomb (mb, wc, &ps);
  +       if (mblen >= 0)
  +         mb[mblen] = '\0';
  +       rl_begin_undo_group ();
  +-      rl_delete (1, 0);
  ++      rl_vi_delete (1, 0);
  ++      if (rl_point < p)     /* Did we retreat at EOL? */
  ++        rl_point++; /* XXX - should we advance more than 1 for mbchar? */
  +       rl_insert_text (mb);
  +       rl_end_undo_group ();
  +       rl_vi_check ();
  +@@ -1310,12 +1315,16 @@
  +       rl_vi_delete (1, c);
  + #if defined (HANDLE_MULTIBYTE)
  +       if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
  +-    while (_rl_insert_char (1, c))
  +-      {
  +-        RL_SETSTATE (RL_STATE_MOREINPUT);
  +-        c = rl_read_key ();
  +-        RL_UNSETSTATE (RL_STATE_MOREINPUT);
  +-      }
  ++    {
  ++      if (rl_point < p)             /* Did we retreat at EOL? */
  ++        rl_point++;
  ++      while (_rl_insert_char (1, c))
  ++        {
  ++          RL_SETSTATE (RL_STATE_MOREINPUT);
  ++          c = rl_read_key ();
  ++          RL_UNSETSTATE (RL_STATE_MOREINPUT);
  ++        }
  ++    }
  +       else
  + #endif
  +     {
  +Index: patchlevel.h
  +--- patchlevel.h.orig        2001-08-22 14:05:39 +0200
  ++++ patchlevel.h     2004-10-24 18:48:43 +0200
  +@@ -25,6 +25,6 @@
  +    regexp `^#define[        ]*PATCHLEVEL', since that's what support/mkversion.sh
  +    looks for to find the patch level (for the sccs version string). */
  + 
  +-#define PATCHLEVEL 0
  ++#define PATCHLEVEL 14
  + 
  + #endif /* _PATCHLEVEL_H_ */
  +Index: pcomplete.c
  +--- pcomplete.c.orig 2004-01-08 16:36:17 +0100
  ++++ pcomplete.c      2004-10-24 18:48:43 +0200
  +@@ -863,6 +863,8 @@
  +   if (array_p (v) == 0)
  +     v = convert_var_to_array (v);
  +   v = assign_array_var_from_word_list (v, lwords);
  ++
  ++  VUNSETATTR (v, att_invisible);
  +   return v;
  + }
  + #endif /* ARRAY_VARS */
  +@@ -1022,6 +1024,8 @@
  +   if (array_p (v) == 0)
  +     v = convert_var_to_array (v);
  + 
  ++  VUNSETATTR (v, att_invisible);
  ++
  +   a = array_cell (v);
  +   if (a == 0 || array_empty (a))
  +     sl = (STRINGLIST *)NULL;
  +Index: subst.c
  +--- subst.c.orig     2004-07-04 19:56:13 +0200
  ++++ subst.c  2004-10-24 18:48:43 +0200
  +@@ -4691,6 +4691,26 @@
  +       legal_identifier (name + 1));                         /* ${#PS1} */
  + }
  + 
  ++#if defined (HANDLE_MULTIBYTE)
  ++size_t
  ++mbstrlen (s)
  ++     const char *s;
  ++{
  ++  size_t clen, nc;
  ++  mbstate_t mbs;
  ++
  ++  nc = 0;
  ++  memset (&mbs, 0, sizeof (mbs));
  ++  while ((clen = mbrlen(s, MB_CUR_MAX, &mbs)) != 0 && (MB_INVALIDCH(clen) == 0))
  ++    {
  ++      s += clen;
  ++      nc++;
  ++    }
  ++  return nc;
  ++}
  ++#endif
  ++      
  ++
  + /* Handle the parameter brace expansion that requires us to return the
  +    length of a parameter. */
  + static intmax_t
  +@@ -4746,14 +4766,14 @@
  +       if (legal_number (name + 1, &arg_index))              /* ${#1} */
  +     {
  +       t = get_dollar_var_value (arg_index);
  +-      number = STRLEN (t);
  ++      number = MB_STRLEN (t);
  +       FREE (t);
  +     }
  + #if defined (ARRAY_VARS)
  +-      else if ((var = find_variable (name + 1)) && array_p (var))
  ++      else if ((var = find_variable (name + 1)) && (invisible_p (var) == 0) && 
array_p (var))
  +     {
  +       t = array_reference (array_cell (var), 0);
  +-      number = STRLEN (t);
  ++      number = MB_STRLEN (t);
  +     }
  + #endif
  +       else                          /* ${#PS1} */
  +@@ -4766,7 +4786,7 @@
  +       if (list)
  +         dispose_words (list);
  + 
  +-      number = STRLEN (t);
  ++      number = MB_STRLEN (t);
  +       FREE (t);
  +     }
  +     }
  +@@ -4871,7 +4891,7 @@
  +     {
  +     case VT_VARIABLE:
  +     case VT_ARRAYMEMBER:
  +-      len = strlen (value);
  ++      len = MB_STRLEN (value);
  +       break;
  +     case VT_POSPARMS:
  +       len = number_of_args () + 1;
  +@@ -4891,7 +4911,7 @@
  +   if (*e1p < 0)             /* negative offsets count from end */
  +     *e1p += len;
  + 
  +-  if (*e1p >= len || *e1p < 0)
  ++  if (*e1p > len || *e1p < 0)
  +     return (-1);
  + 
  + #if defined (ARRAY_VARS)
  +@@ -4982,7 +5002,7 @@
  +       else
  +     return -1;
  +     }
  +-  else if ((v = find_variable (varname)) && array_p (v))
  ++  else if ((v = find_variable (varname)) && (invisible_p (v) == 0) && array_p (v))
  +     {
  +       vtype = VT_ARRAYMEMBER;
  +       *varp = v;
  +Index: variables.c
  +--- variables.c.orig 2004-07-04 19:57:26 +0200
  ++++ variables.c      2004-10-24 18:48:43 +0200
  +@@ -1419,11 +1419,11 @@
  +   v = init_dynamic_array_var ("GROUPS", get_groupset, null_array_assign, 
att_noassign);
  + 
  + #  if defined (DEBUGGER)
  +-  v = init_dynamic_array_var ("BASH_ARGC", get_self, null_array_assign, 
(att_invisible|att_noassign));
  +-  v = init_dynamic_array_var ("BASH_ARGV", get_self, null_array_assign, 
(att_invisible|att_noassign));
  ++  v = init_dynamic_array_var ("BASH_ARGC", get_self, null_array_assign, 
att_noassign);
  ++  v = init_dynamic_array_var ("BASH_ARGV", get_self, null_array_assign, 
att_noassign);
  + #  endif /* DEBUGGER */
  +-  v = init_dynamic_array_var ("BASH_SOURCE", get_self, null_array_assign, 
(att_invisible|att_noassign));
  +-  v = init_dynamic_array_var ("BASH_LINENO", get_self, null_array_assign, 
(att_invisible|att_noassign));
  ++  v = init_dynamic_array_var ("BASH_SOURCE", get_self, null_array_assign, 
att_noassign);
  ++  v = init_dynamic_array_var ("BASH_LINENO", get_self, null_array_assign, 
att_noassign);
  + #endif
  + 
  +   v = init_funcname_var ();
  +@@ -1599,7 +1599,10 @@
  +   /* local foo; local foo;  is a no-op. */
  +   old_var = find_variable (name);
  +   if (old_var && local_p (old_var) && old_var->context == variable_context)
  +-    return (old_var);
  ++    {
  ++      VUNSETATTR (old_var, att_invisible);
  ++      return (old_var);
  ++    }
  + 
  +   was_tmpvar = old_var && tempvar_p (old_var);
  +   if (was_tmpvar)
  +
  +-----------------------------------------------------------------------------
  +
  +On brain-dead Linux platforms somewhere between glibc 2.3.3 (20040405)
  +and glibc 2.3.3 (20040917) (e.g. between SuSE 9.1 and SuSE 9.2 or
  +between Gentoo 1.4.x and 1.5.x) the system headers provide the
  +waitpid(2) option WCONTINUED although the underlying Linux kernels 2.4
  +and 2.6 still do not support this option and return EINVAL on waitpid(2)
  +using WCONTINUED.
  +
  +As a side-effect the GNU Bash goes into an endless loop with waitpid(3)
  +calls after the first executed command terminated. The following
  +patch is derived from Gentoo Portage and workarounds this problems by
  +gracefully and efficiently degrading the options on waitpid(2) calls.
  +
  +Well, it's just another great example of how good Linux provides
  +standardized APIs -- actually they are nothing more than Potemkin
  +villages. Ggrrrrr!
  +
  +Index: jobs.c
  +--- jobs.c.orig      2004-11-04 10:29:23 +0100
  ++++ jobs.c   2004-11-04 10:32:47 +0100
  +@@ -2476,6 +2476,9 @@
  +   PROCESS *child;
  +   pid_t pid;
  +   int call_set_current, last_stopped_job, job, children_exited, waitpid_flags;
  ++#ifdef __linux__
  ++  static int wcontinued_not_supported = 0;
  ++#endif
  + 
  +   call_set_current = children_exited = 0;
  +   last_stopped_job = NO_JOB;
  +@@ -2489,7 +2492,18 @@
  +                     : 0;
  +       if (sigchld || block == 0)
  +     waitpid_flags |= WNOHANG;
  ++#ifdef __linux__
  ++      retry:
  ++      if (wcontinued_not_supported)
  ++          waitpid_flags &= ~WCONTINUED;
  ++#endif
  +       pid = WAITPID (-1, &status, waitpid_flags);
  ++#ifdef __linux__
  ++      if (pid == -1 && errno == EINVAL) {
  ++          wcontinued_not_supported = 1;
  ++          goto retry;
  ++      }
  ++#endif
  + 
  +       /* The check for WNOHANG is to make sure we decrement sigchld only
  +      if it was non-zero before we called waitpid. */
  @@ .
  patch -p0 <<'@@ .'
  Index: openpkg-src/openpkg/openpkg.spec
  ============================================================================
  $ cvs diff -u -r1.361.2.3 -r1.361.2.4 openpkg.spec
  --- openpkg-src/openpkg/openpkg.spec  18 Oct 2004 13:07:29 -0000      1.361.2.3
  +++ openpkg-src/openpkg/openpkg.spec  4 Nov 2004 16:13:20 -0000       1.361.2.4
  @@ -39,7 +39,7 @@
   #   o any cc(1)
   
   #   the package version/release
  -%define       V_openpkg  2.2.0
  +%define       V_openpkg  2.2.1
   
   #   the used software versions
   %define       V_rpm      4.2.1
  @@ .
______________________________________________________________________
The OpenPKG Project                                    www.openpkg.org
CVS Repository Commit List                     [EMAIL PROTECTED]

Reply via email to