Tue, 29 Mar 2011 19:46:35 +0200
Correct and introduce slightly needed logic, leading to better reliability:
Update bash(1) patch logic, correct several buildconf make location
errors, correct failed bash(1) configure invocation, enable perl(1) to
build with unpathed make(1), patch rpm(1) to correctly link with
internal libdb(3), and lastly unsuscessfully try to reorganize rpm patch
hunks.
michael@13 | 1 | This patch documents two implemented and classical command |
michael@13 | 2 | line options "-v" and "-x". It is derived from Debian GNU/Linux. |
michael@13 | 3 | |
michael@13 | 4 | Index: doc/bash.1 |
michael@13 | 5 | --- doc/bash.1.orig 2004-07-12 17:27:08 +0200 |
michael@13 | 6 | +++ doc/bash.1 2004-07-27 19:47:10 +0200 |
michael@13 | 7 | @@ -116,6 +116,12 @@ |
michael@13 | 8 | This option allows the positional parameters to be set |
michael@13 | 9 | when invoking an interactive shell. |
michael@13 | 10 | .TP |
michael@13 | 11 | +.B \-v |
michael@13 | 12 | +Print shell input lines as they are read. |
michael@13 | 13 | +.TP |
michael@13 | 14 | +.B \-x |
michael@13 | 15 | +Print commands and their arguments as they are executed. |
michael@13 | 16 | +.TP |
michael@13 | 17 | .B \-D |
michael@13 | 18 | A list of all double-quoted strings preceded by \fB$\fP |
michael@333 | 19 | is printed on the standard output. |
michael@13 | 20 | |
michael@13 | 21 | ----------------------------------------------------------------------------- |
michael@13 | 22 | |
michael@13 | 23 | Port to HP-UX 11i and similar less smart platforms. |
michael@13 | 24 | |
michael@13 | 25 | Index: configure |
michael@13 | 26 | --- configure.orig 2004-07-21 22:18:56 +0200 |
michael@13 | 27 | +++ configure 2004-07-27 19:47:10 +0200 |
michael@13 | 28 | @@ -1517,6 +1517,7 @@ |
michael@13 | 29 | *-beos*) opt_bash_malloc=no ;; # they say it's suitable |
michael@13 | 30 | *-cygwin*) opt_bash_malloc=no ;; # Cygnus's CYGWIN environment |
michael@13 | 31 | *-opennt*|*-interix*) opt_bash_malloc=no ;; # Interix, now owned by Microsoft |
michael@13 | 32 | +*-hpux*) opt_bash_malloc=no ;; # HP HP-UX |
michael@13 | 33 | esac |
michael@13 | 34 | |
michael@13 | 35 | # memory scrambling on free() |
michael@13 | 36 | @@ -1662,7 +1663,7 @@ |
michael@13 | 37 | |
michael@13 | 38 | else |
michael@13 | 39 | MALLOC_LIB= |
michael@13 | 40 | - MALLOC_LIBRARY= |
michael@13 | 41 | + MALLOC_LIBRARY=dummy |
michael@13 | 42 | MALLOC_LDFLAGS= |
michael@13 | 43 | MALLOC_DEP= |
michael@13 | 44 | fi |
michael@13 | 45 | Index: syntax.h |
michael@13 | 46 | --- syntax.h.orig 2004-04-15 05:19:36 +0200 |
michael@13 | 47 | +++ syntax.h 2004-07-27 19:47:10 +0200 |
michael@13 | 48 | @@ -21,6 +21,8 @@ |
michael@13 | 49 | #ifndef _SYNTAX_H_ |
michael@13 | 50 | #define _SYNTAX_H_ |
michael@13 | 51 | |
michael@13 | 52 | +#include "config.h" |
michael@13 | 53 | + |
michael@13 | 54 | /* Defines for use by mksyntax.c */ |
michael@13 | 55 | |
michael@13 | 56 | #define slashify_in_quotes "\\`$\"\n" |
michael@13 | 57 | |
michael@13 | 58 | ----------------------------------------------------------------------------- |
michael@13 | 59 | |
michael@13 | 60 | This adds the OpenPKG packaging brand. |
michael@13 | 61 | |
michael@13 | 62 | Index: version.c |
michael@13 | 63 | --- version.c.orig 2003-12-19 22:34:02 +0100 |
michael@13 | 64 | +++ version.c 2004-07-27 19:47:10 +0200 |
michael@13 | 65 | @@ -77,7 +77,7 @@ |
michael@13 | 66 | show_shell_version (extended) |
michael@13 | 67 | int extended; |
michael@13 | 68 | { |
michael@13 | 69 | - printf ("GNU bash, version %s (%s)\n", shell_version_string (), MACHTYPE); |
michael@13 | 70 | + printf ("GNU bash, version %s (%s) [@l_openpkg_release@]\n", shell_version_string (), MACHTYPE); |
michael@13 | 71 | if (extended) |
michael@333 | 72 | printf (_("Copyright (C) 2005 Free Software Foundation, Inc.\n")); |
michael@13 | 73 | } |
michael@13 | 74 | |
michael@13 | 75 | ----------------------------------------------------------------------------- |
michael@13 | 76 | |
michael@13 | 77 | Accumulated vendor patches Bash 3.2 001-005 |
michael@13 | 78 | |
michael@13 | 79 | Generated via: |
michael@13 | 80 | |
michael@13 | 81 | $ gunzip <bash-3.2.tar.gz | tar xf - |
michael@13 | 82 | $ pushd bash-3.2 |
michael@13 | 83 | $ cat bash32-[0-9]* | patch -p0 -Vt -b |
michael@13 | 84 | $ shtool move -e '*.~1~' '%1.orig' |
michael@13 | 85 | $ pushd /tmp |
michael@13 | 86 | $ curl -O ftp://ftp.gnu.org/gnu/bison/bison-1.28.tar.gz |
michael@13 | 87 | $ cd bison-1.28 |
michael@13 | 88 | $ ./configure --prefix=/tmp/bison |
michael@13 | 89 | $ make |
michael@13 | 90 | $ make install |
michael@13 | 91 | $ popd |
michael@13 | 92 | $ mv y.tab.c y.tab.c.orig |
michael@13 | 93 | $ mv y.tab.h y.tab.h.orig |
michael@13 | 94 | $ /tmp/bison/bin/bison -y -d parse.y |
michael@13 | 95 | $ rm -rf /tmp/bison /tmp/bison-1.28 /tmp/bison-1.28.tar.gz |
michael@13 | 96 | $ shtool subst -b.dummy \ |
michael@13 | 97 | -e 's;parse\.y;/Users/chet/src/bash/src/parse.y;g' \ |
michael@13 | 98 | -e 's;/tmp/bison/share/bison\.simple;/usr/share/bison.simple;g' y.tab.c |
michael@13 | 99 | $ svs diff >/tmp/bash.patch |
michael@13 | 100 | $ popd |
michael@13 | 101 | $ rm -rf bash-3.2 |
michael@13 | 102 | |
michael@13 | 103 | Index: parse.y |
michael@13 | 104 | --- parse.y.orig 2006-09-19 22:37:21 +0200 |
michael@13 | 105 | +++ parse.y 2006-12-06 13:32:45 +0100 |
michael@13 | 106 | @@ -1029,6 +1029,7 @@ |
michael@13 | 107 | #define PST_CMDTOKEN 0x1000 /* command token OK - unused */ |
michael@13 | 108 | #define PST_COMPASSIGN 0x2000 /* parsing x=(...) compound assignment */ |
michael@13 | 109 | #define PST_ASSIGNOK 0x4000 /* assignment statement ok in this context */ |
michael@13 | 110 | +#define PST_REGEXP 0x8000 /* parsing an ERE/BRE as a single word */ |
michael@13 | 111 | |
michael@13 | 112 | /* Initial size to allocate for tokens, and the |
michael@13 | 113 | amount to grow them by. */ |
michael@13 | 114 | @@ -2591,6 +2592,9 @@ |
michael@13 | 115 | return (character); |
michael@13 | 116 | } |
michael@13 | 117 | |
michael@13 | 118 | + if (parser_state & PST_REGEXP) |
michael@13 | 119 | + goto tokword; |
michael@13 | 120 | + |
michael@13 | 121 | /* Shell meta-characters. */ |
michael@13 | 122 | if MBTEST(shellmeta (character) && ((parser_state & PST_DBLPAREN) == 0)) |
michael@13 | 123 | { |
michael@13 | 124 | @@ -2698,6 +2702,7 @@ |
michael@13 | 125 | if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND)) |
michael@13 | 126 | return (character); |
michael@13 | 127 | |
michael@13 | 128 | +tokword: |
michael@13 | 129 | /* Okay, if we got this far, we have to read a word. Read one, |
michael@13 | 130 | and then check it against the known ones. */ |
michael@13 | 131 | result = read_token_word (character); |
michael@13 | 132 | @@ -2735,7 +2740,7 @@ |
michael@13 | 133 | /* itrace("parse_matched_pair: open = %c close = %c", open, close); */ |
michael@13 | 134 | count = 1; |
michael@13 | 135 | pass_next_character = backq_backslash = was_dollar = in_comment = 0; |
michael@13 | 136 | - check_comment = (flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0; |
michael@13 | 137 | + check_comment = (flags & P_COMMAND) && qc != '`' && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0; |
michael@13 | 138 | |
michael@13 | 139 | /* RFLAGS is the set of flags we want to pass to recursive calls. */ |
michael@13 | 140 | rflags = (qc == '"') ? P_DQUOTE : (flags & P_DQUOTE); |
michael@13 | 141 | @@ -3202,8 +3207,11 @@ |
michael@13 | 142 | if (tok == WORD && test_binop (yylval.word->word)) |
michael@13 | 143 | op = yylval.word; |
michael@13 | 144 | #if defined (COND_REGEXP) |
michael@13 | 145 | - else if (tok == WORD && STREQ (yylval.word->word,"=~")) |
michael@13 | 146 | - op = yylval.word; |
michael@13 | 147 | + else if (tok == WORD && STREQ (yylval.word->word, "=~")) |
michael@13 | 148 | + { |
michael@13 | 149 | + op = yylval.word; |
michael@13 | 150 | + parser_state |= PST_REGEXP; |
michael@13 | 151 | + } |
michael@13 | 152 | #endif |
michael@13 | 153 | else if (tok == '<' || tok == '>') |
michael@13 | 154 | op = make_word_from_token (tok); /* ( */ |
michael@13 | 155 | @@ -3234,6 +3242,7 @@ |
michael@13 | 156 | |
michael@13 | 157 | /* rhs */ |
michael@13 | 158 | tok = read_token (READ); |
michael@13 | 159 | + parser_state &= ~PST_REGEXP; |
michael@13 | 160 | if (tok == WORD) |
michael@13 | 161 | { |
michael@13 | 162 | tright = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL); |
michael@13 | 163 | @@ -3419,9 +3428,34 @@ |
michael@13 | 164 | goto next_character; |
michael@13 | 165 | } |
michael@13 | 166 | |
michael@13 | 167 | +#ifdef COND_REGEXP |
michael@13 | 168 | + /* When parsing a regexp as a single word inside a conditional command, |
michael@13 | 169 | + we need to special-case characters special to both the shell and |
michael@13 | 170 | + regular expressions. Right now, that is only '(' and '|'. */ /*)*/ |
michael@13 | 171 | + if MBTEST((parser_state & PST_REGEXP) && (character == '(' || character == '|')) /*)*/ |
michael@13 | 172 | + { |
michael@13 | 173 | + if (character == '|') |
michael@13 | 174 | + goto got_character; |
michael@13 | 175 | + |
michael@13 | 176 | + push_delimiter (dstack, character); |
michael@13 | 177 | + ttok = parse_matched_pair (cd, '(', ')', &ttoklen, 0); |
michael@13 | 178 | + pop_delimiter (dstack); |
michael@13 | 179 | + if (ttok == &matched_pair_error) |
michael@13 | 180 | + return -1; /* Bail immediately. */ |
michael@13 | 181 | + RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2, |
michael@13 | 182 | + token_buffer_size, TOKEN_DEFAULT_GROW_SIZE); |
michael@13 | 183 | + token[token_index++] = character; |
michael@13 | 184 | + strcpy (token + token_index, ttok); |
michael@13 | 185 | + token_index += ttoklen; |
michael@13 | 186 | + FREE (ttok); |
michael@13 | 187 | + dollar_present = all_digit_token = 0; |
michael@13 | 188 | + goto next_character; |
michael@13 | 189 | + } |
michael@13 | 190 | +#endif /* COND_REGEXP */ |
michael@13 | 191 | + |
michael@13 | 192 | #ifdef EXTENDED_GLOB |
michael@13 | 193 | /* Parse a ksh-style extended pattern matching specification. */ |
michael@13 | 194 | - if (extended_glob && PATTERN_CHAR (character)) |
michael@13 | 195 | + if MBTEST(extended_glob && PATTERN_CHAR (character)) |
michael@13 | 196 | { |
michael@13 | 197 | peek_char = shell_getc (1); |
michael@13 | 198 | if MBTEST(peek_char == '(') /* ) */ |
michael@13 | 199 | Index: patchlevel.h |
michael@13 | 200 | --- patchlevel.h.orig 2006-04-13 14:31:04 +0200 |
michael@13 | 201 | +++ patchlevel.h 2006-12-06 13:32:45 +0100 |
michael@13 | 202 | @@ -25,6 +25,6 @@ |
michael@13 | 203 | regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh |
michael@13 | 204 | looks for to find the patch level (for the sccs version string). */ |
michael@13 | 205 | |
michael@13 | 206 | -#define PATCHLEVEL 0 |
michael@13 | 207 | +#define PATCHLEVEL 5 |
michael@13 | 208 | |
michael@13 | 209 | #endif /* _PATCHLEVEL_H_ */ |
michael@13 | 210 | Index: subst.c |
michael@13 | 211 | --- subst.c.orig 2006-09-19 14:35:09 +0200 |
michael@13 | 212 | +++ subst.c 2006-12-06 13:32:45 +0100 |
michael@13 | 213 | @@ -5707,6 +5707,11 @@ |
michael@13 | 214 | vtype &= ~VT_STARSUB; |
michael@13 | 215 | |
michael@13 | 216 | mflags = 0; |
michael@13 | 217 | + if (patsub && *patsub == '/') |
michael@13 | 218 | + { |
michael@13 | 219 | + mflags |= MATCH_GLOBREP; |
michael@13 | 220 | + patsub++; |
michael@13 | 221 | + } |
michael@13 | 222 | |
michael@13 | 223 | /* Malloc this because expand_string_if_necessary or one of the expansion |
michael@13 | 224 | functions in its call chain may free it on a substitution error. */ |
michael@13 | 225 | @@ -5741,13 +5746,12 @@ |
michael@13 | 226 | } |
michael@13 | 227 | |
michael@13 | 228 | /* ksh93 doesn't allow the match specifier to be a part of the expanded |
michael@13 | 229 | - pattern. This is an extension. */ |
michael@13 | 230 | + pattern. This is an extension. Make sure we don't anchor the pattern |
michael@13 | 231 | + at the beginning or end of the string if we're doing global replacement, |
michael@13 | 232 | + though. */ |
michael@13 | 233 | p = pat; |
michael@13 | 234 | - if (pat && pat[0] == '/') |
michael@13 | 235 | - { |
michael@13 | 236 | - mflags |= MATCH_GLOBREP|MATCH_ANY; |
michael@13 | 237 | - p++; |
michael@13 | 238 | - } |
michael@13 | 239 | + if (mflags & MATCH_GLOBREP) |
michael@13 | 240 | + mflags |= MATCH_ANY; |
michael@13 | 241 | else if (pat && pat[0] == '#') |
michael@13 | 242 | { |
michael@13 | 243 | mflags |= MATCH_BEG; |
michael@13 | 244 | Index: y.tab.c |
michael@13 | 245 | --- y.tab.c.orig 2006-09-25 14:15:16 +0200 |
michael@13 | 246 | +++ y.tab.c 2006-12-06 13:39:36 +0100 |
michael@13 | 247 | @@ -2359,6 +2359,7 @@ |
michael@13 | 248 | #define PST_CMDTOKEN 0x1000 /* command token OK - unused */ |
michael@13 | 249 | #define PST_COMPASSIGN 0x2000 /* parsing x=(...) compound assignment */ |
michael@13 | 250 | #define PST_ASSIGNOK 0x4000 /* assignment statement ok in this context */ |
michael@13 | 251 | +#define PST_REGEXP 0x8000 /* parsing an ERE/BRE as a single word */ |
michael@13 | 252 | |
michael@13 | 253 | /* Initial size to allocate for tokens, and the |
michael@13 | 254 | amount to grow them by. */ |
michael@13 | 255 | @@ -3921,6 +3922,9 @@ |
michael@13 | 256 | return (character); |
michael@13 | 257 | } |
michael@13 | 258 | |
michael@13 | 259 | + if (parser_state & PST_REGEXP) |
michael@13 | 260 | + goto tokword; |
michael@13 | 261 | + |
michael@13 | 262 | /* Shell meta-characters. */ |
michael@13 | 263 | if MBTEST(shellmeta (character) && ((parser_state & PST_DBLPAREN) == 0)) |
michael@13 | 264 | { |
michael@13 | 265 | @@ -4028,6 +4032,7 @@ |
michael@13 | 266 | if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND)) |
michael@13 | 267 | return (character); |
michael@13 | 268 | |
michael@13 | 269 | +tokword: |
michael@13 | 270 | /* Okay, if we got this far, we have to read a word. Read one, |
michael@13 | 271 | and then check it against the known ones. */ |
michael@13 | 272 | result = read_token_word (character); |
michael@13 | 273 | @@ -4065,7 +4070,7 @@ |
michael@13 | 274 | /* itrace("parse_matched_pair: open = %c close = %c", open, close); */ |
michael@13 | 275 | count = 1; |
michael@13 | 276 | pass_next_character = backq_backslash = was_dollar = in_comment = 0; |
michael@13 | 277 | - check_comment = (flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0; |
michael@13 | 278 | + check_comment = (flags & P_COMMAND) && qc != '`' && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0; |
michael@13 | 279 | |
michael@13 | 280 | /* RFLAGS is the set of flags we want to pass to recursive calls. */ |
michael@13 | 281 | rflags = (qc == '"') ? P_DQUOTE : (flags & P_DQUOTE); |
michael@13 | 282 | @@ -4532,8 +4537,11 @@ |
michael@13 | 283 | if (tok == WORD && test_binop (yylval.word->word)) |
michael@13 | 284 | op = yylval.word; |
michael@13 | 285 | #if defined (COND_REGEXP) |
michael@13 | 286 | - else if (tok == WORD && STREQ (yylval.word->word,"=~")) |
michael@13 | 287 | - op = yylval.word; |
michael@13 | 288 | + else if (tok == WORD && STREQ (yylval.word->word, "=~")) |
michael@13 | 289 | + { |
michael@13 | 290 | + op = yylval.word; |
michael@13 | 291 | + parser_state |= PST_REGEXP; |
michael@13 | 292 | + } |
michael@13 | 293 | #endif |
michael@13 | 294 | else if (tok == '<' || tok == '>') |
michael@13 | 295 | op = make_word_from_token (tok); /* ( */ |
michael@13 | 296 | @@ -4564,6 +4572,7 @@ |
michael@13 | 297 | |
michael@13 | 298 | /* rhs */ |
michael@13 | 299 | tok = read_token (READ); |
michael@13 | 300 | + parser_state &= ~PST_REGEXP; |
michael@13 | 301 | if (tok == WORD) |
michael@13 | 302 | { |
michael@13 | 303 | tright = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL); |
michael@13 | 304 | @@ -4749,9 +4758,34 @@ |
michael@13 | 305 | goto next_character; |
michael@13 | 306 | } |
michael@13 | 307 | |
michael@13 | 308 | +#ifdef COND_REGEXP |
michael@13 | 309 | + /* When parsing a regexp as a single word inside a conditional command, |
michael@13 | 310 | + we need to special-case characters special to both the shell and |
michael@13 | 311 | + regular expressions. Right now, that is only '(' and '|'. */ /*)*/ |
michael@13 | 312 | + if MBTEST((parser_state & PST_REGEXP) && (character == '(' || character == '|')) /*)*/ |
michael@13 | 313 | + { |
michael@13 | 314 | + if (character == '|') |
michael@13 | 315 | + goto got_character; |
michael@13 | 316 | + |
michael@13 | 317 | + push_delimiter (dstack, character); |
michael@13 | 318 | + ttok = parse_matched_pair (cd, '(', ')', &ttoklen, 0); |
michael@13 | 319 | + pop_delimiter (dstack); |
michael@13 | 320 | + if (ttok == &matched_pair_error) |
michael@13 | 321 | + return -1; /* Bail immediately. */ |
michael@13 | 322 | + RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2, |
michael@13 | 323 | + token_buffer_size, TOKEN_DEFAULT_GROW_SIZE); |
michael@13 | 324 | + token[token_index++] = character; |
michael@13 | 325 | + strcpy (token + token_index, ttok); |
michael@13 | 326 | + token_index += ttoklen; |
michael@13 | 327 | + FREE (ttok); |
michael@13 | 328 | + dollar_present = all_digit_token = 0; |
michael@13 | 329 | + goto next_character; |
michael@13 | 330 | + } |
michael@13 | 331 | +#endif /* COND_REGEXP */ |
michael@13 | 332 | + |
michael@13 | 333 | #ifdef EXTENDED_GLOB |
michael@13 | 334 | /* Parse a ksh-style extended pattern matching specification. */ |
michael@13 | 335 | - if (extended_glob && PATTERN_CHAR (character)) |
michael@13 | 336 | + if MBTEST(extended_glob && PATTERN_CHAR (character)) |
michael@13 | 337 | { |
michael@13 | 338 | peek_char = shell_getc (1); |
michael@13 | 339 | if MBTEST(peek_char == '(') /* ) */ |
michael@13 | 340 | |
michael@13 | 341 | ----------------------------------------------------------------------------- |
michael@13 | 342 | |
michael@13 | 343 | Do not require autoconf. Fixes build on Solaris 10 8/07 u4 on sparc64 |
michael@13 | 344 | |
michael@13 | 345 | Index: Makefile.in |
michael@13 | 346 | --- Makefile.in.orig 2006-08-17 20:03:35 +0200 |
michael@13 | 347 | +++ Makefile.in 2007-10-15 13:00:34 +0200 |
michael@13 | 348 | @@ -682,13 +682,9 @@ |
michael@13 | 349 | stamp-h: config.status $(srcdir)/config.h.in $(srcdir)/config-top.h $(srcdir)/config-bot.h |
michael@13 | 350 | CONFIG_FILES= CONFIG_HEADERS=config.h $(SHELL) ./config.status |
michael@13 | 351 | |
michael@13 | 352 | -config.status: $(srcdir)/configure |
michael@13 | 353 | +config.status: |
michael@13 | 354 | $(SHELL) ./config.status --recheck |
michael@13 | 355 | |
michael@13 | 356 | -# comment out for distribution |
michael@13 | 357 | -$(srcdir)/configure: $(srcdir)/configure.in $(srcdir)/aclocal.m4 $(srcdir)/config.h.in |
michael@13 | 358 | - cd $(srcdir) && autoconf |
michael@13 | 359 | - |
michael@13 | 360 | # for chet |
michael@13 | 361 | reconfig: force |
michael@13 | 362 | sh $(srcdir)/configure -C |