1--- bashline.c 2015-02-06 17:12:55.823275600 -0700
2+++ bashline.c 2015-02-06 17:14:11.000103800 -0700
3@@ -71,6 +71,16 @@
4 # include "pcomplete.h"
5 #endif
6
7+#if __CYGWIN__
8+# ifdef __x86_64__
9+# define IMP(x) __imp_##x
10+# else
11+# define IMP(x) _imp__##x
12+# endif
13+#else
14+# define IMP(x) x
15+#endif
16+
17 /* These should agree with the defines for emacs_mode and vi_mode in
18 rldefs.h, even though that's not a public readline header file. */
19 #ifndef EMACS_EDITING_MODE
20@@ -264,6 +274,11 @@ int no_empty_command_completion;
21 are the only possible matches, even if FIGNORE says to. */
22 int force_fignore = 1;
23
24+#if __CYGWIN__
25+/* If set, shorten "foo.exe" to "foo" when they are the same file. */
26+int completion_strip_exe;
27+#endif /* __CYGWIN__ */
28+
29 /* Perform spelling correction on directory names during word completion */
30 int dircomplete_spelling = 0;
31
32@@ -491,11 +506,12 @@ initialize_readline ()
33 kseq[0] = CTRL('J');
34 kseq[1] = '\0';
35 func = rl_function_of_keyseq (kseq, emacs_meta_keymap, (int *)NULL);
36- if (func == rl_vi_editing_mode)
37+ extern rl_command_func_t *IMP(rl_vi_editing_mode);
38+ if (func == rl_vi_editing_mode || func == IMP(rl_vi_editing_mode))
39 rl_unbind_key_in_map (CTRL('J'), emacs_meta_keymap);
40 kseq[0] = CTRL('M');
41 func = rl_function_of_keyseq (kseq, emacs_meta_keymap, (int *)NULL);
42- if (func == rl_vi_editing_mode)
43+ if (func == rl_vi_editing_mode || func == IMP(rl_vi_editing_mode))
44 rl_unbind_key_in_map (CTRL('M'), emacs_meta_keymap);
45 #if defined (VI_MODE)
46 rl_unbind_key_in_map (CTRL('E'), vi_movement_keymap);
47@@ -514,7 +530,8 @@ initialize_readline ()
48 kseq[0] = '~';
49 kseq[1] = '\0';
50 func = rl_function_of_keyseq (kseq, emacs_meta_keymap, (int *)NULL);
51- if (func == 0 || func == rl_tilde_expand)
52+ extern rl_command_func_t *IMP(rl_tilde_expand);
53+ if (func == 0 || func == rl_tilde_expand || func == IMP(rl_tilde_expand))
54 rl_bind_keyseq_in_map (kseq, bash_complete_username, emacs_meta_keymap);
55
56 rl_bind_key_if_unbound_in_map ('~', bash_possible_username_completions, emacs_ctlx_keymap);
57@@ -537,7 +554,8 @@ initialize_readline ()
58 kseq[0] = TAB;
59 kseq[1] = '\0';
60 func = rl_function_of_keyseq (kseq, emacs_meta_keymap, (int *)NULL);
61- if (func == 0 || func == rl_tab_insert)
62+ extern rl_command_func_t *IMP(rl_tab_insert);
63+ if (func == 0 || func == rl_tab_insert || func == IMP(rl_tab_insert))
64 rl_bind_key_in_map (TAB, dynamic_complete_history, emacs_meta_keymap);
65
66 /* Tell the completer that we want a crack first. */
67@@ -2109,6 +2127,21 @@ globword:
68
69 if (match && executable_completion ((searching_path ? val : cval), searching_path))
70 {
71+#if __CYGWIN__
72+ if (completion_strip_exe)
73+ {
74+ size_t val_len = strlen (val);
75+ char *candidate;
76+ if (val_len > 4 && !strcasecmp (&val[val_len - 4], ".exe")
77+ && (candidate = strdup (val)))
78+ {
79+ candidate[val_len - 4] = '\0';
80+ if (same_file (val, candidate, NULL, NULL))
81+ temp[strlen (temp) - 4] = '\0';
82+ free (candidate);
83+ }
84+ }
85+#endif
86 if (cval != val)
87 free (cval);
88 free (val);
89@@ -2844,6 +2877,17 @@ test_for_directory (name)
90 int r;
91
92 fn = bash_tilde_expand (name, 0);
93+#if __CYGWIN__
94+ /* stat("//server") can only be successful as a directory, but takes
95+ a several-second timeout to fail. It is much faster to assume
96+ that //server is a valid name than it is to wait for the stat,
97+ even though it gives false positives on bad names. */
98+ if (fn[0] == '/' && fn[1] == '/' && ! strchr (&fn[2], '/'))
99+ {
100+ free (fn);
101+ return 1;
102+ }
103+#endif /* __CYGWIN__ */
104 r = file_isdir (fn);
105 free (fn);
106
107--- builtins/evalstring.c 2015-02-06 17:12:55.682776800 -0700
108+++ builtins/evalstring.c 2015-02-06 17:14:11.015662800 -0700
109@@ -195,7 +195,7 @@ parse_and_execute (string, from_file, fl
110 int code, lreset;
111 volatile int should_jump_to_top_level, last_result;
112 COMMAND *volatile command;
113- volatile sigset_t pe_sigmask;
114+ sigset_t pe_sigmask;
115
116 parse_prologue (string, flags, PE_TAG);
117
118@@ -451,7 +451,7 @@ parse_string (string, from_file, flags,
119 volatile int should_jump_to_top_level;
120 COMMAND *volatile command, *oglobal;
121 char *ostring;
122- volatile sigset_t ps_sigmask;
123+ sigset_t ps_sigmask;
124
125 parse_prologue (string, flags, PS_TAG);
126
127--- builtins/set.def 2013-04-19 05:20:34.000000000 -0600
128+++ builtins/set.def 2015-02-06 17:14:11.015662800 -0700
129@@ -56,6 +56,13 @@ extern int dont_save_function_defs;
130 #if defined (READLINE)
131 extern int no_line_editing;
132 #endif /* READLINE */
133+#if __CYGWIN__
134+extern int igncr;
135+static int set_minus_o_option_maybe (int, const char *, int);
136+# define INTERACTIVE_ONLY ,1
137+#else /* ! __CYGWIN__ */
138+# define INTERACTIVE_ONLY
139+#endif
140
141 $BUILTIN set
142 $FUNCTION set_builtin
143@@ -92,6 +99,9 @@ Options:
144 #if defined (HISTORY)
145 history enable command history
146 #endif
147+#if __CYGWIN__
148+ igncr on cygwin, ignore \r in line endings
149+#endif
150 ignoreeof the shell will not exit upon reading EOF
151 interactive-comments
152 allow comments to appear in interactive commands
153@@ -188,29 +198,41 @@ const struct {
154 int *variable;
155 setopt_set_func_t *set_func;
156 setopt_get_func_t *get_func;
157+#if __CYGWIN__
158+ /* Cygwin users have taken to exporting SHELLOPTS for the
159+ cygwin-specific igncr. As a result, we need to make sure
160+ SHELLOPTS parsing does not turn on interactive options when
161+ exported from an interactive shell, but parsed in a
162+ non-interactive setting, since some interactive options violate
163+ POSIX /bin/sh rules. */
164+ int interactive_only;
165+#endif /* __CYGWIN__ */
166 } o_options[] = {
167 { "allexport", 'a', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
168 #if defined (BRACE_EXPANSION)
169 { "braceexpand",'B', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
170 #endif
171 #if defined (READLINE)
172- { "emacs", '\0', (int *)NULL, set_edit_mode, get_edit_mode },
173+ { "emacs", '\0', (int *)NULL, set_edit_mode, get_edit_mode INTERACTIVE_ONLY},
174 #endif
175 { "errexit", 'e', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
176 { "errtrace", 'E', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
177 { "functrace", 'T', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
178 { "hashall", 'h', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
179 #if defined (BANG_HISTORY)
180- { "histexpand", 'H', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
181+ { "histexpand", 'H', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL INTERACTIVE_ONLY},
182 #endif /* BANG_HISTORY */
183 #if defined (HISTORY)
184- { "history", '\0', &enable_history_list, bash_set_history, (setopt_get_func_t *)NULL },
185+ { "history", '\0', &enable_history_list, bash_set_history, (setopt_get_func_t *)NULL INTERACTIVE_ONLY},
186+#endif
187+#if __CYGWIN__
188+ { "igncr", '\0', &igncr, NULL, (setopt_get_func_t *)NULL },
189 #endif
190 { "ignoreeof", '\0', &ignoreeof, set_ignoreeof, (setopt_get_func_t *)NULL },
191 { "interactive-comments", '\0', &interactive_comments, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
192 { "keyword", 'k', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
193 #if defined (JOB_CONTROL)
194- { "monitor", 'm', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
195+ { "monitor", 'm', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL INTERACTIVE_ONLY},
196 #endif
197 { "noclobber", 'C', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
198 { "noexec", 'n', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
199@@ -229,7 +251,7 @@ const struct {
200 { "privileged", 'p', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
201 { "verbose", 'v', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
202 #if defined (READLINE)
203- { "vi", '\0', (int *)NULL, set_edit_mode, get_edit_mode },
204+ { "vi", '\0', (int *)NULL, set_edit_mode, get_edit_mode INTERACTIVE_ONLY},
205 #endif
206 { "xtrace", 'x', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
207 {(char *)NULL, 0 , (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
208@@ -416,6 +438,15 @@ int
209 set_minus_o_option (on_or_off, option_name)
210 int on_or_off;
211 char *option_name;
212+#if __CYGWIN__
213+{
214+ /* See cygwin comments above. */
215+ return set_minus_o_option_maybe (on_or_off, option_name, 0);
216+}
217+static int
218+set_minus_o_option_maybe (int on_or_off, const char *option_name,
219+ int avoid_interactive)
220+#endif /* __CYGWIN__ */
221 {
222 register int i;
223
224@@ -423,6 +454,10 @@ set_minus_o_option (on_or_off, option_na
225 {
226 if (STREQ (option_name, o_options[i].name))
227 {
228+#if __CYGWIN__
229+ if (o_options[i].interactive_only && avoid_interactive)
230+ return EXECUTION_SUCCESS;
231+#endif /* __CYGWIN__ */
232 if (o_options[i].letter == 0)
233 {
234 SET_BINARY_O_OPTION_VALUE (i, on_or_off, option_name);
235@@ -548,7 +583,11 @@ parse_shellopts (value)
236 vptr = 0;
237 while (vname = extract_colon_unit (value, &vptr))
238 {
239+#if __CYGWIN__
240+ set_minus_o_option_maybe (FLAG_ON, vname, !interactive_shell);
241+#else /* !__CYGWIN__ */
242 set_minus_o_option (FLAG_ON, vname);
243+#endif
244 free (vname);
245 }
246 }
247--- builtins/shopt.def 2013-02-27 07:43:20.000000000 -0700
248+++ builtins/shopt.def 2015-02-06 17:14:11.015662800 -0700
249@@ -91,6 +91,11 @@ extern int glob_star;
250 extern int glob_asciirange;
251 extern int lastpipe_opt;
252
253+#if __CYGWIN__
254+extern int completion_strip_exe;
255+#endif
256+
257+
258 #if defined (EXTENDED_GLOB)
259 extern int extended_glob;
260 #endif
261@@ -161,6 +166,9 @@ static struct {
262 { "compat40", &shopt_compat40, set_compatibility_level },
263 { "compat41", &shopt_compat41, set_compatibility_level },
264 { "compat42", &shopt_compat41, set_compatibility_level },
265+#if __CYGWIN__
266+ { "completion_strip_exe", &completion_strip_exe, NULL },
267+#endif
268 #if defined (READLINE)
269 { "complete_fullquote", &complete_fullquote, (shopt_set_func_t *)NULL},
270 { "direxpand", &dircomplete_expand, shopt_set_complete_direxpand },
271--- config-top.h 2012-08-18 18:51:30.000000000 -0600
272+++ config-top.h 2015-02-06 17:14:11.015662800 -0700
273@@ -80,10 +80,10 @@
274 #define KSH_COMPATIBLE_SELECT
275
276 /* System-wide .bashrc file for interactive shells. */
277-/* #define SYS_BASHRC "/etc/bash.bashrc" */
278+#define SYS_BASHRC "/etc/bash.bashrc"
279
280 /* System-wide .bash_logout for login shells. */
281-/* #define SYS_BASH_LOGOUT "/etc/bash.bash_logout" */
282+#define SYS_BASH_LOGOUT "/etc/bash.bash_logout"
283
284 /* Define this to make non-interactive shells begun with argv[0][0] == '-'
285 run the startup files when not in posix mode. */
286@@ -93,7 +93,7 @@
287 sshd and source the .bashrc if so (like the rshd behavior). This checks
288 for the presence of SSH_CLIENT or SSH2_CLIENT in the initial environment,
289 which can be fooled under certain not-uncommon circumstances. */
290-/* #define SSH_SOURCE_BASHRC */
291+#define SSH_SOURCE_BASHRC
292
293 /* Define if you want the case-capitalizing operators (~[~]) and the
294 `capcase' variable attribute (declare -c). */
295--- doc/Makefile.in 2013-10-30 14:18:12.000000000 -0600
296+++ doc/Makefile.in 2015-02-06 17:14:11.015662800 -0700
297@@ -176,7 +176,7 @@ bashref.html: $(BASHREF_FILES) $(HSUSER)
298 $(TEXI2HTML) -menu -monolithic -I $(TEXINPUTDIR) $(srcdir)/bashref.texi
299
300 bash.info: bashref.info
301- ${SHELL} ${INFOPOST} < $(srcdir)/bashref.info > $@ ; \
302+ ${SHELL} ${INFOPOST} < bashref.info > $@ ; \
303
304 bash.txt: bash.1
305 bash.ps: bash.1
306@@ -237,9 +237,9 @@ install: info installdirs bash.info
307 -$(INSTALL_DATA) $(srcdir)/bashbug.1 $(DESTDIR)$(man1dir)/bashbug${man1ext}
308 -$(INSTALL_DATA) $(OTHER_DOCS) $(DESTDIR)$(docdir)
309 # uncomment the next lines to install the builtins man page
310-# sed 's:bash\.1:man1/&:' $(srcdir)/builtins.1 > $${TMPDIR:-/var/tmp}/builtins.1
311-# -$(INSTALL_DATA) $${TMPDIR:-/var/tmp}/builtins.1 $(DESTDIR)$(man1dir)/bash_builtins${man1ext}
312-# -$(RM) $${TMPDIR:-/var/tmp}/builtins.1
313+ sed 's:bash\.1:man1/&:' $(srcdir)/builtins.1 > $${TMPDIR:-/var/tmp}/builtins.1
314+ -$(INSTALL_DATA) $${TMPDIR:-/var/tmp}/builtins.1 $(DESTDIR)$(man1dir)/bash_builtins${man1ext}
315+ -$(RM) $${TMPDIR:-/var/tmp}/builtins.1
316 -if test -f bash.info; then d=.; else d=$(srcdir); fi; \
317 $(INSTALL_DATA) $$d/bash.info $(DESTDIR)$(infodir)/bash.info
318 # run install-info if it is present to update the info directory
319--- doc/bash.1 2014-02-06 07:03:52.000000000 -0700
320+++ doc/bash.1 2015-02-06 17:14:11.015662800 -0700
321@@ -1658,6 +1658,14 @@ subsequently reset.
322 Expands to the effective user ID of the current user, initialized at
323 shell startup. This variable is readonly.
324 .TP
325+.B EXECIGNORE
326+A colon-separated list of extended glob (see \fBPattern Matching\fP)
327+patterns. Files with full paths matching one of these patterns are
328+not considered executable for the purposes of completion and PATH
329+searching, but the \fB[\fP, \fB[[\fP, and \fBtest\fP builtins are not
330+affected. Use this variable to deal with systems that set the
331+executable bit on files that are not actually executable.
332+.TP
333 .B FUNCNAME
334 An array variable containing the names of all shell functions
335 currently in the execution call stack.
336@@ -3308,6 +3316,10 @@ the character
337 .B ``.''
338 at the start of a name or immediately following a slash
339 must be matched explicitly, unless the shell option
340+.B completion_strip_exe
341+If set, whenever bash sees `foo.exe' during completion, it checks if
342+`foo' is the same file and strips the suffix.
343+.TP 8
344 .B dotglob
345 is set.
346 When matching a pathname, the slash character must always be
347--- doc/bashref.texi 2014-02-22 11:20:36.000000000 -0700
348+++ doc/bashref.texi 2015-02-06 17:14:11.015662800 -0700
349@@ -4992,6 +4992,10 @@ filenames.
350 This variable is set by default, which is the default Bash behavior in
351 versions through 4.2.
352
353+@item completion_strip_exe
354+If set, whenever bash sees `foo.exe' during completion, it checks if
355+`foo' is the same file and strips the suffix.
356+
357 @item direxpand
358 If set, Bash
359 replaces directory names with the results of word expansion when performing
360@@ -5578,6 +5582,14 @@ Similar to @code{BASH_ENV}; used when th
361 The numeric effective user id of the current user. This variable
362 is readonly.
363
364+@item EXECIGNORE
365+A colon-separated list of extended glob ((@pxref{Pattern Matching})
366+patterns. Files with full paths matching one of these patterns are
367+not considered executable for the purposes of completion and PATH
368+searching, but the @code{[}, @code{[[}, and @code{test} builtins are
369+not affected. Use this variable to deal with systems that set the
370+executable bit on files that are not actually executable.
371+
372 @item FCEDIT
373 The editor used as a default by the @option{-e} option to the @code{fc}
374 builtin command.
375--- doc/builtins.1 2012-02-21 12:32:05.000000000 -0700
376+++ doc/builtins.1 2015-02-06 17:14:11.031260100 -0700
377@@ -19,6 +19,6 @@ shift, shopt, source, suspend, test, tim
378 ulimit, umask, unalias, unset, wait \- bash built-in commands, see \fBbash\fR(1)
379 .SH BASH BUILTIN COMMANDS
380 .nr zZ 1
381-.so bash.1
382+.so man1/bash.1
383 .SH SEE ALSO
384 bash(1), sh(1)
385--- execute_cmd.c 2015-02-06 17:12:55.261573700 -0700
386+++ execute_cmd.c 2015-02-06 17:14:11.031260100 -0700
387@@ -58,6 +58,7 @@ extern int errno;
388 #endif
389
390 #define NEED_FPURGE_DECL
391+#define NEED_SH_SETLINEBUF_DECL /* used in externs.h */
392
393 #include "bashansi.h"
394 #include "bashintl.h"
395--- expr.c 2014-01-03 06:55:00.000000000 -0700
396+++ expr.c 2015-02-06 17:14:11.031260100 -0700
397@@ -83,6 +83,7 @@
398
399 #include "shell.h"
400 #include "typemax.h" /* INTMAX_MAX, INTMAX_MIN */
401+#define exp2 exp2_
402
403 /* Because of the $((...)) construct, expressions may include newlines.
404 Here is a macro which accepts newlines, tabs and spaces as whitespace. */
405--- findcmd.c 2012-10-15 05:45:04.000000000 -0600
406+++ findcmd.c 2015-02-06 17:14:11.031260100 -0700
407@@ -48,6 +48,8 @@
408 extern int errno;
409 #endif
410
411+#include <glob/strmatch.h>
412+
413 extern int posixly_correct;
414 extern int last_command_exit_value;
415
416@@ -77,6 +79,38 @@ int check_hashed_filenames;
417 containing the file of interest. */
418 int dot_found_in_search = 0;
419
420+static struct ignorevar execignore =
421+{
422+ "EXECIGNORE",
423+ (struct ign *)0,
424+ 0,
425+ (char *)0,
426+ (sh_iv_item_func_t *)0,
427+};
428+
429+void
430+setup_exec_ignore (char *varname)
431+{
432+ setup_ignore_patterns (&execignore);
433+}
434+
435+/* Return whether we should never consider file executable
436+ * even if the system tells us it is. */
437+static int
438+is_on_exec_blacklist (char *name)
439+{
440+ struct ign *p;
441+ int flags = FNM_EXTMATCH | FNM_CASEFOLD;
442+
443+ for (p = execignore.ignores; p && p->val; p++)
444+ {
445+ if (strmatch (p->val, (char *)name, flags) != FNM_NOMATCH)
446+ return (1);
447+ }
448+
449+ return (0);
450+}
451+
452 /* Return some flags based on information about this file.
453 The EXISTS bit is non-zero if the file is found.
454 The EXECABLE bit is non-zero the file is executble.
455@@ -104,7 +138,7 @@ file_status (name)
456 file access mechanisms into account. eaccess uses the effective
457 user and group IDs, not the real ones. We could use sh_eaccess,
458 but we don't want any special treatment for /dev/fd. */
459- if (eaccess (name, X_OK) == 0)
460+ if (!is_on_exec_blacklist (name) && eaccess (name, X_OK) == 0)
461 r |= FS_EXECABLE;
462 if (eaccess (name, R_OK) == 0)
463 r |= FS_READABLE;
464--- findcmd.h 2012-01-14 16:56:25.000000000 -0700
465+++ findcmd.h 2015-02-06 17:14:11.031260100 -0700
466@@ -31,5 +31,6 @@ extern char *find_user_command __P((cons
467 extern char *find_path_file __P((const char *));
468 extern char *search_for_command __P((const char *, int));
469 extern char *user_command_matches __P((const char *, int, int));
470+extern void setup_exec_ignore __P((char *));
471
472 #endif /* _FINDCMD_H_ */
473--- general.c 2014-01-30 14:46:15.000000000 -0700
474+++ general.c 2015-02-06 17:14:11.031260100 -0700
475@@ -44,6 +44,10 @@
476
477 #include <tilde/tilde.h>
478
479+#ifdef __CYGWIN__
480+# include <sys/cygwin.h>
481+#endif
482+
483 #if !defined (errno)
484 extern int errno;
485 #endif /* !errno */
486@@ -632,7 +636,8 @@ make_absolute (string, dot_path)
487 {
488 char pathbuf[PATH_MAX + 1];
489
490- cygwin_conv_to_full_posix_path (string, pathbuf);
491+ cygwin_conv_path (CCP_WIN_A_TO_POSIX | CCP_ABSOLUTE, string, pathbuf,
492+ sizeof pathbuf);
493 result = savestring (pathbuf);
494 }
495 #else
496--- include/chartypes.h 2011-04-11 12:30:52.000000000 -0600
497+++ include/chartypes.h 2015-02-06 17:14:11.031260100 -0700
498@@ -40,6 +40,7 @@
499 #else
500 # define IN_CTYPE_DOMAIN(c) isascii(c)
501 #endif
502+#define to_uchar(c) ((unsigned char)(c))
503
504 #if !defined (isspace) && !defined (HAVE_ISSPACE)
505 # define isspace(c) ((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) == '\f')
506@@ -67,16 +68,16 @@
507
508 #undef ISPRINT
509
510-#define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (c))
511-#define ISDIGIT(c) (IN_CTYPE_DOMAIN (c) && isdigit (c))
512-#define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum (c))
513-#define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (c))
514-#define ISCNTRL(c) (IN_CTYPE_DOMAIN (c) && iscntrl (c))
515-#define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower (c))
516-#define ISPUNCT(c) (IN_CTYPE_DOMAIN (c) && ispunct (c))
517-#define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c))
518-#define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (c))
519-#define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit (c))
520+#define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (to_uchar (c)))
521+#define ISDIGIT(c) (IN_CTYPE_DOMAIN (c) && isdigit (to_uchar (c)))
522+#define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum (to_uchar (c)))
523+#define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (to_uchar (c)))
524+#define ISCNTRL(c) (IN_CTYPE_DOMAIN (c) && iscntrl (to_uchar (c)))
525+#define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower (to_uchar (c)))
526+#define ISPUNCT(c) (IN_CTYPE_DOMAIN (c) && ispunct (to_uchar (c)))
527+#define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (to_uchar (c)))
528+#define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (to_uchar (c)))
529+#define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit (to_uchar (c)))
530
531 #define ISLETTER(c) (ISALPHA(c))
532
533--- include/posixjmp.h 2012-12-23 20:20:50.000000000 -0700
534+++ include/posixjmp.h 2015-02-06 17:14:11.031260100 -0700
535@@ -27,13 +27,13 @@
536
537 #if defined (HAVE_POSIX_SIGSETJMP)
538 # define procenv_t sigjmp_buf
539-# if !defined (__OPENNT)
540+# if !defined (__OPENNT) && !defined __CYGWIN__
541 # undef setjmp
542 # define setjmp(x) sigsetjmp((x), 1)
543-# define setjmp_nosigs(x) sigsetjmp((x), 0)
544 # undef longjmp
545 # define longjmp(x, n) siglongjmp((x), (n))
546 # endif /* !__OPENNT */
547+# define setjmp_nosigs(x) sigsetjmp((x), 0)
548 #else
549 # define procenv_t jmp_buf
550 # define setjmp_nosigs setjmp
551--- input.c 2014-02-07 07:13:08.000000000 -0700
552+++ input.c 2015-02-06 17:14:11.031260100 -0700
553@@ -44,6 +44,10 @@
554 #include "quit.h"
555 #include "trap.h"
556
557+#if __CYGWIN__
558+int igncr;
559+#endif
560+
561 #if !defined (errno)
562 extern int errno;
563 #endif /* !errno */
564@@ -561,6 +565,19 @@ buffered_getchar ()
565 {
566 CHECK_TERMSIG;
567
568+#if __CYGWIN__
569+ /* shopt igncr means to discard carriage returns from input stream.
570+ If cr is the only character in the buffer, then recurse to pick
571+ up the next character; otherwise flatten the buffer. */
572+ if (igncr)
573+ {
574+ int ch;
575+ while ((ch = bufstream_getc (buffers[bash_input.location.buffered_fd]))
576+ == '\r')
577+ ;
578+ return ch;
579+ }
580+#endif /* __CYGWIN__ */
581 #if !defined (DJGPP)
582 return (bufstream_getc (buffers[bash_input.location.buffered_fd]));
583 #else
584--- lib/readline/bind.c 2013-04-06 15:46:38.000000000 -0600
585+++ lib/readline/bind.c 2015-02-06 17:14:11.031260100 -0700
586@@ -452,7 +452,7 @@ rl_translate_keyseq (seq, array, len)
587 {
588 register int i, c, l, temp;
589
590- for (i = l = 0; c = seq[i]; i++)
591+ for (i = l = 0; (c = seq[i]); i++)
592 {
593 if (c == '\\')
594 {
595@@ -1210,7 +1210,7 @@ _rl_skip_to_delim (string, start, delim)
596 {
597 int i, c, passc;
598
599- for (i = start,passc = 0; c = string[i]; i++)
600+ for (i = start,passc = 0; (c = string[i]); i++)
601 {
602 if (passc)
603 {
604@@ -1297,7 +1297,6 @@ rl_parse_and_bind (string)
605 if (_rl_stricmp (string, "set") == 0)
606 {
607 char *var, *value, *e;
608- int s;
609
610 var = string + i;
611 /* Make VAR point to start of variable name. */
612@@ -2198,7 +2197,7 @@ rl_function_dumper (print_readably)
613
614 fprintf (rl_outstream, "\n");
615
616- for (i = 0; name = names[i]; i++)
617+ for (i = 0; (name = names[i]); i++)
618 {
619 rl_command_func_t *function;
620 char **invokers;
621--- lib/readline/chardefs.h 2011-07-25 19:47:56.000000000 -0600
622+++ lib/readline/chardefs.h 2015-02-06 17:14:11.046889800 -0700
623@@ -71,6 +71,7 @@
624 #else
625 # define IN_CTYPE_DOMAIN(c) isascii(c)
626 #endif
627+#define to_uchar(c) ((unsigned char)(c))
628
629 #if !defined (isxdigit) && !defined (HAVE_ISXDIGIT) && !defined (__cplusplus)
630 # define isxdigit(c) (isdigit((c)) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
631@@ -87,13 +88,13 @@
632
633 /* Beware: these only work with single-byte ASCII characters. */
634
635-#define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum (c))
636-#define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (c))
637-#define ISDIGIT(c) (IN_CTYPE_DOMAIN (c) && isdigit (c))
638-#define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower (c))
639-#define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (c))
640-#define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (c))
641-#define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit (c))
642+#define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum (to_uchar (c)))
643+#define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (to_uchar (c)))
644+#define ISDIGIT(c) (IN_CTYPE_DOMAIN (c) && isdigit (to_uchar (c)))
645+#define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower (to_uchar (c)))
646+#define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (to_uchar (c)))
647+#define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (to_uchar (c)))
648+#define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit (to_uchar (c)))
649
650 #define _rl_lowercase_p(c) (NON_NEGATIVE(c) && ISLOWER(c))
651 #define _rl_uppercase_p(c) (NON_NEGATIVE(c) && ISUPPER(c))
652--- lib/readline/complete.c 2013-10-14 07:27:10.000000000 -0600
653+++ lib/readline/complete.c 2015-02-06 17:14:11.046889800 -0700
654@@ -1082,7 +1082,7 @@ _rl_find_completion_word (fp, dp)
655 /* We didn't find an unclosed quoted substring upon which to do
656 completion, so use the word break characters to find the
657 substring on which to complete. */
658- while (rl_point = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_ANY))
659+ while ((rl_point = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_ANY)))
660 {
661 scan = rl_line_buffer[rl_point];
662
663@@ -2116,7 +2116,7 @@ rl_completion_matches (text, entry_funct
664 match_list = (char **)xmalloc ((match_list_size + 1) * sizeof (char *));
665 match_list[1] = (char *)NULL;
666
667- while (string = (*entry_function) (text, matches))
668+ while ((string = (*entry_function) (text, matches)))
669 {
670 if (RL_SIG_RECEIVED ())
671 {
672@@ -2190,7 +2190,7 @@ rl_username_completion_function (text, s
673 }
674
675 #if defined (HAVE_GETPWENT)
676- while (entry = getpwent ())
677+ while ((entry = getpwent ()))
678 {
679 /* Null usernames should result in all users as possible completions. */
680 if (namelen == 0 || (STREQN (username, entry->pw_name, namelen)))
681@@ -2723,7 +2723,7 @@ rl_menu_complete (count, ignore)
682 static int full_completion = 0; /* set to 1 if menu completion should reinitialize on next call */
683 static int orig_start, orig_end;
684 static char quote_char;
685- static int delimiter, cstate;
686+ static int delimiter;
687
688 /* The first time through, we generate the list of matches and set things
689 up to insert them. */
690--- lib/readline/display.c 2015-02-06 17:12:54.793574600 -0700
691+++ lib/readline/display.c 2015-02-06 17:14:11.046889800 -0700
692@@ -66,7 +66,6 @@ extern char *strchr (), *strrchr ();
693 static void update_line PARAMS((char *, char *, int, int, int, int));
694 static void space_to_eol PARAMS((int));
695 static void delete_chars PARAMS((int));
696-static void insert_some_chars PARAMS((char *, int, int));
697 static void open_some_spaces PARAMS((int));
698 static void cr PARAMS((void));
699
700@@ -1314,7 +1313,7 @@ update_line (old, new, current_line, oma
701 int current_line, omax, nmax, inv_botlin;
702 {
703 register char *ofd, *ols, *oe, *nfd, *nls, *ne;
704- int temp, lendiff, wsatend, od, nd, twidth, o_cpos;
705+ int temp, lendiff, wsatend, od, nd, o_cpos;
706 int current_invis_chars;
707 int col_lendiff, col_temp;
708 int bytes_to_insert;
709@@ -2485,6 +2484,7 @@ _rl_clear_screen ()
710 #endif /* __DJGPP__ */
711 }
712
713+#if 0
714 /* Insert COUNT characters from STRING to the output stream at column COL. */
715 static void
716 insert_some_chars (string, count, col)
717@@ -2494,6 +2494,7 @@ insert_some_chars (string, count, col)
718 open_some_spaces (col);
719 _rl_output_some_chars (string, count);
720 }
721+#endif
722
723 /* Insert COL spaces, keeping the cursor at the same position. We follow the
724 ncurses documentation and use either im/ei with explicit spaces, or IC/ic
725--- lib/readline/histexpand.c 2013-12-02 07:22:30.000000000 -0700
726+++ lib/readline/histexpand.c 2015-02-06 17:14:11.046889800 -0700
727@@ -204,7 +204,7 @@ get_history_event (string, caller_index,
728 }
729
730 /* Only a closing `?' or a newline delimit a substring search string. */
731- for (local_index = i; c = string[i]; i++)
732+ for (local_index = i; (c = string[i]); i++)
733 {
734 #if defined (HANDLE_MULTIBYTE)
735 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
736@@ -677,7 +677,7 @@ history_expand_internal (string, start,
737 case 's':
738 {
739 char *new_event;
740- int delimiter, failed, si, l_temp, ws, we;
741+ int delimiter, failed, si, l_temp, we;
742
743 if (c == 's')
744 {
745@@ -776,7 +776,6 @@ history_expand_internal (string, start,
746 {
747 for (; temp[si] && whitespace (temp[si]); si++)
748 ;
749- ws = si;
750 we = history_tokenize_word (temp, si);
751 }
752
753--- lib/readline/histfile.c 2013-07-19 06:17:17.000000000 -0600
754+++ lib/readline/histfile.c 2015-02-06 17:14:11.046889800 -0700
755@@ -104,7 +104,7 @@ int history_write_timestamps = 0;
756
757 /* Does S look like the beginning of a history timestamp entry? Placeholder
758 for more extensive tests. */
759-#define HIST_TIMESTAMP_START(s) (*(s) == history_comment_char && isdigit ((s)[1]) )
760+#define HIST_TIMESTAMP_START(s) (*(s) == history_comment_char && isdigit ((unsigned char) (s)[1]) )
761
762 /* Return the string that should be used in the place of this
763 filename. This only matters when you don't specify the
764--- lib/readline/input.c 2015-02-06 17:12:55.027577800 -0700
765+++ lib/readline/input.c 2015-02-06 17:14:11.046889800 -0700
766@@ -431,7 +431,7 @@ rl_read_key ()
767 else
768 {
769 /* If input is coming from a macro, then use that. */
770- if (c = _rl_next_macro_key ())
771+ if ((c = _rl_next_macro_key ()))
772 return (c);
773
774 /* If the user has an event function, then call it periodically. */
775--- lib/readline/isearch.c 2013-10-14 07:08:40.000000000 -0600
776+++ lib/readline/isearch.c 2015-02-06 17:14:11.046889800 -0700
777@@ -740,7 +740,7 @@ rl_search_history (direction, invoking_k
778 int direction, invoking_key;
779 {
780 _rl_search_cxt *cxt; /* local for now, but saved globally */
781- int c, r;
782+ int r;
783
784 RL_SETSTATE(RL_STATE_ISEARCH);
785 cxt = _rl_isearch_init (direction);
786@@ -755,7 +755,7 @@ rl_search_history (direction, invoking_k
787 r = -1;
788 for (;;)
789 {
790- c = _rl_search_getchar (cxt);
791+ _rl_search_getchar (cxt);
792 /* We might want to handle EOF here (c == 0) */
793 r = _rl_isearch_dispatch (cxt, cxt->lastc);
794 if (r <= 0)
795@@ -778,9 +778,9 @@ int
796 _rl_isearch_callback (cxt)
797 _rl_search_cxt *cxt;
798 {
799- int c, r;
800+ int r;
801
802- c = _rl_search_getchar (cxt);
803+ _rl_search_getchar (cxt);
804 /* We might want to handle EOF here */
805 r = _rl_isearch_dispatch (cxt, cxt->lastc);
806
807--- lib/readline/misc.c 2015-02-06 17:12:55.230384200 -0700
808+++ lib/readline/misc.c 2015-02-06 17:14:11.046889800 -0700
809@@ -455,7 +455,7 @@ _rl_revert_all_lines ()
810 entry = (hpos == history_length) ? previous_history () : current_history ();
811 while (entry)
812 {
813- if (ul = (UNDO_LIST *)entry->data)
814+ if ((ul = (UNDO_LIST *)entry->data))
815 {
816 if (ul == saved_undo_list)
817 saved_undo_list = 0;
818@@ -502,7 +502,7 @@ rl_clear_history ()
819 for (i = 0; i < history_length; i++)
820 {
821 hent = hlist[i];
822- if (ul = (UNDO_LIST *)hent->data)
823+ if ((ul = (UNDO_LIST *)hent->data))
824 {
825 if (ul == saved_undo_list)
826 saved_undo_list = 0;
827--- lib/readline/nls.c 2013-03-09 12:51:10.000000000 -0700
828+++ lib/readline/nls.c 2015-02-06 17:14:11.046889800 -0700
829@@ -80,7 +80,7 @@ static char *legal_lang_values[] =
830 static char *normalize_codeset PARAMS((char *));
831 #endif /* !HAVE_SETLOCALE */
832
833-static char *find_codeset PARAMS((char *, size_t *));
834+static char *find_codeset PARAMS((char *, size_t *)) __attribute__ ((__unused__));
835
836 static char *_rl_get_locale_var PARAMS((const char *));
837
838@@ -104,12 +104,13 @@ utf8locale (lspec)
839 char *lspec;
840 {
841 char *cp;
842- size_t len;
843
844 #if HAVE_LANGINFO_CODESET
845 cp = nl_langinfo (CODESET);
846 return (STREQ (cp, "UTF-8") || STREQ (cp, "utf8"));
847 #else
848+ size_t len;
849+
850 cp = find_codeset (lspec, &len);
851
852 if (cp == 0 || len < 4 || len > 5)
853--- lib/readline/parens.c 2009-04-19 11:12:06.000000000 -0600
854+++ lib/readline/parens.c 2015-02-06 17:14:11.046889800 -0700
855@@ -106,7 +106,7 @@ rl_insert_close (count, invoking_key)
856 else
857 {
858 #if defined (HAVE_SELECT)
859- int orig_point, match_point, ready;
860+ int orig_point, match_point;
861 struct timeval timer;
862 fd_set readfds;
863
864@@ -126,7 +126,7 @@ rl_insert_close (count, invoking_key)
865 orig_point = rl_point;
866 rl_point = match_point;
867 (*rl_redisplay_function) ();
868- ready = select (1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &timer);
869+ select (1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &timer);
870 rl_point = orig_point;
871 #else /* !HAVE_SELECT */
872 _rl_insert_char (count, invoking_key);
873--- lib/readline/posixjmp.h 2012-12-23 20:20:50.000000000 -0700
874+++ lib/readline/posixjmp.h 2015-02-06 17:14:11.046889800 -0700
875@@ -27,13 +27,13 @@
876
877 #if defined (HAVE_POSIX_SIGSETJMP)
878 # define procenv_t sigjmp_buf
879-# if !defined (__OPENNT)
880+# if !defined (__OPENNT) && !defined __CYGWIN__
881 # undef setjmp
882 # define setjmp(x) sigsetjmp((x), 1)
883-# define setjmp_nosigs(x) sigsetjmp((x), 0)
884 # undef longjmp
885 # define longjmp(x, n) siglongjmp((x), (n))
886 # endif /* !__OPENNT */
887+# define setjmp_nosigs(x) sigsetjmp((x), 0)
888 #else
889 # define procenv_t jmp_buf
890 # define setjmp_nosigs setjmp
891--- lib/readline/readline.c 2015-02-06 17:12:54.310964200 -0700
892+++ lib/readline/readline.c 2015-02-06 17:14:11.046889800 -0700
893@@ -95,7 +95,7 @@ static void bind_arrow_keys_internal PAR
894 static void bind_arrow_keys PARAMS((void));
895
896 static void readline_default_bindings PARAMS((void));
897-static void reset_default_bindings PARAMS((void));
898+//static void reset_default_bindings PARAMS((void));
899
900 static int _rl_subseq_result PARAMS((int, Keymap, int, int));
901 static int _rl_subseq_getchar PARAMS((int));
902@@ -522,7 +522,7 @@ readline_internal_char ()
903 readline_internal_charloop ()
904 #endif
905 {
906- static int lastc, eof_found;
907+ static int lastc, eof_found __attribute__((unused));
908 int c, code, lk;
909
910 lastc = -1;
911@@ -1204,6 +1204,7 @@ readline_default_bindings ()
912 rl_tty_set_default_bindings (_rl_keymap);
913 }
914
915+#if 0
916 /* Reset the default bindings for the terminal special characters we're
917 interested in back to rl_insert and read the new ones. */
918 static void
919@@ -1215,6 +1216,7 @@ reset_default_bindings ()
920 rl_tty_set_default_bindings (_rl_keymap);
921 }
922 }
923+#endif
924
925 /* Bind some common arrow key sequences in MAP. */
926 static void
927--- lib/readline/rltty.c 2013-08-25 14:57:05.000000000 -0600
928+++ lib/readline/rltty.c 2015-02-06 17:14:11.062454900 -0700
929@@ -30,6 +30,7 @@
930 #include <signal.h>
931 #include <errno.h>
932 #include <stdio.h>
933+#include <sys/ioctl.h>
934
935 #if defined (HAVE_UNISTD_H)
936 # include <unistd.h>
937--- lib/readline/shell.c 2013-03-13 08:17:00.000000000 -0600
938+++ lib/readline/shell.c 2015-02-06 17:14:11.062454900 -0700
939@@ -123,8 +123,10 @@ sh_single_quote (string)
940 /* Set the environment variables LINES and COLUMNS to lines and cols,
941 respectively. */
942 static char setenv_buf[INT_STRLEN_BOUND (int) + 1];
943+# if !defined (HAVE_SETENV) && defined (HAVE_PUTENV)
944 static char putenv_buf1[INT_STRLEN_BOUND (int) + 6 + 1]; /* sizeof("LINES=") == 6 */
945 static char putenv_buf2[INT_STRLEN_BOUND (int) + 8 + 1]; /* sizeof("COLUMNS=") == 8 */
946+# endif
947
948 void
949 sh_set_lines_and_columns (lines, cols)
950--- lib/readline/signals.c 2014-01-10 13:06:48.000000000 -0700
951+++ lib/readline/signals.c 2015-02-06 17:14:11.062454900 -0700
952@@ -576,7 +576,6 @@ rl_free_line_state ()
953 /* **************************************************************** */
954
955 #if defined (HAVE_POSIX_SIGNALS)
956-static sigset_t sigint_set, sigint_oset;
957 static sigset_t sigwinch_set, sigwinch_oset;
958 #else /* !HAVE_POSIX_SIGNALS */
959 # if defined (HAVE_BSD_SIGNALS)
960--- lib/readline/terminal.c 2013-09-18 07:12:01.000000000 -0600
961+++ lib/readline/terminal.c 2015-02-06 17:14:11.062454900 -0700
962@@ -31,6 +31,7 @@
963 #if defined (HAVE_SYS_FILE_H)
964 # include <sys/file.h>
965 #endif /* HAVE_SYS_FILE_H */
966+#include <sys/ioctl.h>
967
968 #if defined (HAVE_UNISTD_H)
969 # include <unistd.h>
970--- lib/readline/text.c 2013-10-14 07:25:05.000000000 -0600
971+++ lib/readline/text.c 2015-02-06 17:14:11.062454900 -0700
972@@ -859,11 +859,10 @@ _rl_overwrite_char (count, c)
973 int i;
974 #if defined (HANDLE_MULTIBYTE)
975 char mbkey[MB_LEN_MAX];
976- int k;
977
978 /* Read an entire multibyte character sequence to insert COUNT times. */
979 if (count > 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0)
980- k = _rl_read_mbstring (c, mbkey, MB_LEN_MAX);
981+ _rl_read_mbstring (c, mbkey, MB_LEN_MAX);
982 #endif
983
984 rl_begin_undo_group ();
985--- lib/readline/tilde.c 2010-07-25 15:42:13.000000000 -0600
986+++ lib/readline/tilde.c 2015-02-06 17:14:11.062454900 -0700
987@@ -196,7 +196,7 @@ tilde_expand (string)
988 int result_size, result_index;
989
990 result_index = result_size = 0;
991- if (result = strchr (string, '~'))
992+ if ((result = strchr (string, '~')))
993 result = (char *)xmalloc (result_size = (strlen (string) + 16));
994 else
995 result = (char *)xmalloc (result_size = (strlen (string) + 1));
996--- lib/readline/undo.c 2014-02-02 13:47:46.000000000 -0700
997+++ lib/readline/undo.c 2015-02-06 17:14:11.062454900 -0700
998@@ -124,7 +124,7 @@ _rl_free_undo_list (ul)
999 void
1000 rl_free_undo_list ()
1001 {
1002- UNDO_LIST *release, *orig_list;
1003+ UNDO_LIST *orig_list;
1004
1005 orig_list = rl_undo_list;
1006 _rl_free_undo_list (rl_undo_list);
1007--- lib/readline/vi_mode.c 2012-09-01 16:55:30.000000000 -0600
1008+++ lib/readline/vi_mode.c 2015-02-06 17:14:11.062454900 -0700
1009@@ -1089,7 +1089,7 @@ static int
1010 rl_domove_motion_callback (m)
1011 _rl_vimotion_cxt *m;
1012 {
1013- int c, save, r;
1014+ int c, r;
1015 int old_end;
1016
1017 _rl_vi_last_motion = c = m->motion;
1018@@ -1257,7 +1257,6 @@ int
1019 rl_vi_domove (x, ignore)
1020 int x, *ignore;
1021 {
1022- int r;
1023 _rl_vimotion_cxt *m;
1024
1025 m = _rl_vimvcxt;
1026--- lib/sh/pathphys.c 2013-05-28 13:33:58.000000000 -0600
1027+++ lib/sh/pathphys.c 2015-02-06 17:14:11.062454900 -0700
1028@@ -35,6 +35,7 @@
1029 #include <stdio.h>
1030 #include <chartypes.h>
1031 #include <errno.h>
1032+#include <stdlib.h>
1033
1034 #include "shell.h"
1035
1036@@ -76,6 +77,10 @@ sh_physpath (path, flags)
1037 char *path;
1038 int flags;
1039 {
1040+#if __CYGWIN__
1041+ /* realpath does this correctly without all the hassle */
1042+ return realpath (path, NULL);
1043+#else
1044 char tbuf[PATH_MAX+1], linkbuf[PATH_MAX+1];
1045 char *result, *p, *q, *qsave, *qbase, *workpath;
1046 int double_slash_path, linklen, nlink;
1047@@ -214,11 +219,7 @@ error:
1048 {
1049 q = result;
1050 /* Duplicating some code here... */
1051-#if defined (__CYGWIN__)
1052- qbase = (ISALPHA((unsigned char)workpath[0]) && workpath[1] == ':') ? workpath + 3 : workpath + 1;
1053-#else
1054 qbase = workpath + 1;
1055-#endif
1056 double_slash_path = DOUBLE_SLASH (workpath);
1057 qbase += double_slash_path;
1058
1059@@ -249,6 +250,7 @@ error:
1060 }
1061
1062 return (result);
1063+#endif /* ! __CYGWIN__ */
1064 }
1065
1066 char *
1067--- lib/sh/tmpfile.c 2013-12-18 15:50:13.000000000 -0700
1068+++ lib/sh/tmpfile.c 2015-02-06 17:14:11.062454900 -0700
1069@@ -96,7 +96,7 @@ get_tmpdir (flags)
1070 if (tdir && (file_iswdir (tdir) == 0 || strlen (tdir) > PATH_MAX))
1071 tdir = 0;
1072
1073- if (tdir == 0)
1074+ if (tdir == 0 || !file_iswdir (tdir))
1075 tdir = get_sys_tmpdir ();
1076
1077 #if defined (HAVE_PATHCONF) && defined (_PC_NAME_MAX)
1078@@ -118,14 +118,15 @@ sh_mktmpname (nameroot, flags)
1079 struct stat sb;
1080 int r, tdlen;
1081
1082- filename = (char *)xmalloc (PATH_MAX + 1);
1083+ filename = NULL;
1084 tdir = get_tmpdir (flags);
1085 tdlen = strlen (tdir);
1086
1087 lroot = nameroot ? nameroot : DEFAULT_NAMEROOT;
1088
1089 #ifdef USE_MKTEMP
1090- sprintf (filename, "%s/%s.XXXXXX", tdir, lroot);
1091+ if (asprintf (&filename, "%s/%s.XXXXXX", tdir, lroot) < 0)
1092+ return NULL;
1093 if (mktemp (filename) == 0)
1094 {
1095 free (filename);
1096@@ -138,7 +139,9 @@ sh_mktmpname (nameroot, flags)
1097 (unsigned long) time ((time_t *)0) ^
1098 (unsigned long) dollar_dollar_pid ^
1099 (unsigned long) ((flags & MT_USERANDOM) ? random () : ntmpfiles++);
1100- sprintf (filename, "%s/%s-%lu", tdir, lroot, filenum);
1101+ free (filename);
1102+ if (asprintf (&filename, "%s/%s-%lu", tdir, lroot, filenum) < 0)
1103+ return NULL;
1104 if (tmpnamelen > 0 && tmpnamelen < 32)
1105 filename[tdlen + 1 + tmpnamelen] = '\0';
1106 # ifdef HAVE_LSTAT
1107@@ -163,14 +166,19 @@ sh_mktmpfd (nameroot, flags, namep)
1108 char *filename, *tdir, *lroot;
1109 int fd, tdlen;
1110
1111- filename = (char *)xmalloc (PATH_MAX + 1);
1112+ filename = NULL;
1113 tdir = get_tmpdir (flags);
1114 tdlen = strlen (tdir);
1115
1116 lroot = nameroot ? nameroot : DEFAULT_NAMEROOT;
1117
1118 #ifdef USE_MKSTEMP
1119- sprintf (filename, "%s/%s.XXXXXX", tdir, lroot);
1120+ if (asprintf (&filename, "%s/%s.XXXXXX", tdir, lroot) < 0)
1121+ {
1122+ if (namep)
1123+ *namep = NULL;
1124+ return -1;
1125+ }
1126 fd = mkstemp (filename);
1127 if (fd < 0 || namep == 0)
1128 {
1129@@ -187,7 +195,13 @@ sh_mktmpfd (nameroot, flags, namep)
1130 (unsigned long) time ((time_t *)0) ^
1131 (unsigned long) dollar_dollar_pid ^
1132 (unsigned long) ((flags & MT_USERANDOM) ? random () : ntmpfiles++);
1133- sprintf (filename, "%s/%s-%lu", tdir, lroot, filenum);
1134+ free (filename);
1135+ if (asprintf (&filename, "%s/%s-%lu", tdir, lroot, filenum) < 0)
1136+ {
1137+ if (namep)
1138+ *namep = NULL;
1139+ return -1;
1140+ }
1141 if (tmpnamelen > 0 && tmpnamelen < 32)
1142 filename[tdlen + 1 + tmpnamelen] = '\0';
1143 fd = open (filename, BASEOPENFLAGS | ((flags & MT_READWRITE) ? O_RDWR : O_WRONLY), 0600);
1144--- mksyntax.c 2012-07-29 17:48:38.000000000 -0600
1145+++ mksyntax.c 2015-02-06 17:14:11.062454900 -0700
1146@@ -29,13 +29,13 @@
1147
1148 #ifdef HAVE_UNISTD_H
1149 # include <unistd.h>
1150+#else
1151+extern int optind;
1152+extern char *optarg;
1153 #endif
1154
1155 #include "syntax.h"
1156
1157-extern int optind;
1158-extern char *optarg;
1159-
1160 #ifndef errno
1161 extern int errno;
1162 #endif
1163--- parse.y 2015-02-06 17:12:55.682776800 -0700
1164+++ parse.y 2015-02-06 17:14:11.062454900 -0700
1165@@ -1531,14 +1531,20 @@ yy_string_get ()
1166 string = bash_input.location.string;
1167
1168 /* If the string doesn't exist, or is empty, EOF found. */
1169- if (string && *string)
1170+ while (string && *string)
1171 {
1172 c = *string++;
1173 bash_input.location.string = string;
1174+#if __CYGWIN__
1175+ {
1176+ extern int igncr;
1177+ if (igncr && c == '\r')
1178+ continue;
1179+ }
1180+#endif
1181 return (c);
1182 }
1183- else
1184- return (EOF);
1185+ return (EOF);
1186 }
1187
1188 static int
1189@@ -2305,7 +2311,7 @@ shell_getc (remove_quoted_newline)
1190 if (n <= 2) /* we have to save 1 for the newline added below */
1191 {
1192 if (truncating == 0)
1193- internal_warning("shell_getc: shell_input_line_size (%zu) exceeds SIZE_MAX (%llu): line truncated", shell_input_line_size, SIZE_MAX);
1194+ internal_warning("shell_getc: shell_input_line_size (%zu) exceeds SIZE_MAX (%zu): line truncated", shell_input_line_size, SIZE_MAX);
1195 shell_input_line[i] = '\0';
1196 truncating = 1;
1197 }
1198@@ -3582,7 +3588,6 @@ parse_comsub (qc, open, close, lenp, fla
1199
1200 while (count)
1201 {
1202-comsub_readchar:
1203 ch = shell_getc (qc != '\'' && (tflags & (LEX_INCOMMENT|LEX_PASSNEXT)) == 0);
1204
1205 if (ch == EOF)
1206--- pathexp.h 2009-01-04 12:32:40.000000000 -0700
1207+++ pathexp.h 2015-02-06 17:14:11.062454900 -0700
1208@@ -86,7 +86,7 @@ struct ign {
1209 typedef int sh_iv_item_func_t __P((struct ign *));
1210
1211 struct ignorevar {
1212- char *varname; /* FIGNORE or GLOBIGNORE */
1213+ char *varname; /* FIGNORE or GLOBIGNORE or EXECIGNORE */
1214 struct ign *ignores; /* Store the ignore strings here */
1215 int num_ignores; /* How many are there? */
1216 char *last_ignoreval; /* Last value of variable - cached for speed */
1217--- redir.c 2013-10-14 07:19:59.000000000 -0600
1218+++ redir.c 2015-02-06 17:14:11.078059300 -0700
1219@@ -156,7 +156,6 @@ redirection_error (temp, error)
1220 #endif
1221 else if (expandable_redirection_filename (temp))
1222 {
1223-expandable_filename:
1224 oflags = temp->redirectee.filename->flags;
1225 if (posixly_correct && interactive_shell == 0)
1226 temp->redirectee.filename->flags |= W_NOGLOB;
1227--- subst.c 2015-02-06 17:12:55.370841100 -0700
1228+++ subst.c 2015-02-06 17:14:11.078059300 -0700
1229@@ -41,6 +41,7 @@
1230 #include "posixstat.h"
1231 #include "bashintl.h"
1232
1233+#define NEED_SH_SETLINEBUF_DECL /* used in externs.h */
1234 #include "shell.h"
1235 #include "parser.h"
1236 #include "flags.h"
1237@@ -5268,6 +5269,13 @@ read_comsub (fd, quoted, rflag)
1238 #endif
1239 continue;
1240 }
1241+#if __CYGWIN__
1242+ {
1243+ extern int igncr;
1244+ if (igncr && c == '\r')
1245+ continue;
1246+ }
1247+#endif /* __CYGWIN__ */
1248
1249 /* Add the character to ISTRING, possibly after resizing it. */
1250 RESIZE_MALLOCED_BUFFER (istring, istring_index, 2, istring_size, DEFAULT_ARRAY_SIZE);
1251@@ -5385,6 +5393,28 @@ command_substitute (string, quoted)
1252 goto error_exit;
1253 }
1254
1255+#if __CYGWIN__
1256+ /* Passing a pipe through std fds can cause hangs when talking to a
1257+ non-cygwin child. Move it. */
1258+ if (fildes[0] < 3)
1259+ {
1260+ int fd = fcntl (fildes[0], F_DUPFD, 3);
1261+ close (fildes[0]);
1262+ fildes[0] = fd;
1263+ }
1264+ if (fildes[1] < 3)
1265+ {
1266+ int fd = fcntl (fildes[1], F_DUPFD, 3);
1267+ close (fildes[1]);
1268+ fildes[1] = fd;
1269+ }
1270+ if (fildes[0] < 0 || fildes[1] < 0)
1271+ {
1272+ sys_error (_("cannot make pipe for command substitution"));
1273+ goto error_exit;
1274+ }
1275+#endif /* __CYGWIN__ */
1276+
1277 old_pid = last_made_pid;
1278 #if defined (JOB_CONTROL)
1279 old_pipeline_pgrp = pipeline_pgrp;
1280--- support/bashversion.c 2008-09-09 07:31:53.000000000 -0600
1281+++ support/bashversion.c 2015-02-06 17:14:11.078059300 -0700
1282@@ -26,6 +26,9 @@
1283
1284 #if defined (HAVE_UNISTD_H)
1285 # include <unistd.h>
1286+#else
1287+extern int optind;
1288+extern char *optarg;
1289 #endif
1290
1291 #include "bashansi.h"
1292@@ -41,9 +44,6 @@
1293 #define LFLAG 0x0020
1294 #define XFLAG 0x0040
1295
1296-extern int optind;
1297-extern char *optarg;
1298-
1299 extern char *dist_version;
1300 extern int patch_level;
1301
1302@@ -65,7 +65,7 @@ main (argc, argv)
1303 char **argv;
1304 {
1305 int opt, oflags;
1306- char dv[128], *rv;
1307+ char dv[128], *rv = NULL;
1308
1309 if (progname = strrchr (argv[0], '/'))
1310 progname++;
1311--- support/mkversion.sh 2008-08-13 06:25:57.000000000 -0600
1312+++ support/mkversion.sh 2015-02-06 17:14:11.078059300 -0700
1313@@ -29,7 +29,7 @@ source_dir="."
1314 while [ $# -gt 0 ]; do
1315 case "$1" in
1316 -o) shift; OUTFILE=$1; shift ;;
1317- -b) shift; inc_build=yes ;;
1318+ -b) shift; ;;# inc_build=yes ;; # hacked out for cygport
1319 -s) shift; rel_status=$1; shift ;;
1320 -p) shift; patch_level=$1; shift ;;
1321 -d) shift; dist_version=$1; shift ;;
1322--- variables.c 2015-02-06 17:12:55.729569600 -0700
1323+++ variables.c 2015-02-06 17:14:11.078059300 -0700
1324@@ -2526,9 +2526,9 @@ bind_variable_internal (name, value, tab
1325
1326 newname = 0;
1327 #if defined (ARRAY_VARS)
1328- if ((aflags & ASS_FROMREF) && (hflags & HASH_NOSRCH) == 0 && valid_array_reference (name))
1329+ if ((aflags & ASS_FROMREF) && (hflags & HASH_NOSRCH) == 0 && valid_array_reference ((char *)name))
1330 {
1331- newname = array_variable_name (name, &subp, &sublen);
1332+ newname = array_variable_name ((char*)name, &subp, &sublen);
1333 if (newname == 0)
1334 return (SHELL_VAR *)NULL; /* XXX */
1335 entry = hash_lookup (newname, table);
1336@@ -2573,13 +2573,13 @@ bind_variable_internal (name, value, tab
1337 entry = make_new_array_variable (newname); /* indexed array by default */
1338 if (entry == 0)
1339 return entry;
1340- ind = array_expand_index (name, subp, sublen);
1341+ ind = array_expand_index (entry, subp, sublen);
1342 bind_array_element (entry, ind, value, aflags);
1343 }
1344 #endif
1345 else if (entry == 0)
1346 {
1347- entry = make_new_variable (name, table);
1348+ entry = make_new_variable ((char*)name, table);
1349 var_setvalue (entry, make_variable_value (entry, value, 0)); /* XXX */
1350 }
1351 else if (entry->assign_func) /* array vars have assign functions now */
1352@@ -4679,6 +4679,8 @@ static struct name_and_function special_
1353 { "COMP_WORDBREAKS", sv_comp_wordbreaks },
1354 #endif
1355
1356+ { "EXECIGNORE", sv_execignore },
1357+
1358 { "FUNCNEST", sv_funcnest },
1359
1360 { "GLOBIGNORE", sv_globignore },
1361@@ -4877,6 +4879,13 @@ sv_globignore (name)
1362 setup_glob_ignore (name);
1363 }
1364
1365+/* What to do when EXECIGNORE changes. */
1366+void
1367+sv_execignore (char *name)
1368+{
1369+ setup_exec_ignore (name);
1370+}
1371+
1372 #if defined (READLINE)
1373 void
1374 sv_comp_wordbreaks (name)
1375@@ -4950,7 +4959,7 @@ sv_winsize (name)
1376 /* Update the value of HOME in the export environment so tilde expansion will
1377 work on cygwin. */
1378 #if defined (__CYGWIN__)
1379-sv_home (name)
1380+void sv_home (name)
1381 char *name;
1382 {
1383 array_needs_making = 1;
1384--- variables.h 2014-01-08 13:33:29.000000000 -0700
1385+++ variables.h 2015-02-06 17:14:11.078059300 -0700
1386@@ -372,6 +372,7 @@ extern void sv_ifs __P((char *));
1387 extern void sv_path __P((char *));
1388 extern void sv_mail __P((char *));
1389 extern void sv_funcnest __P((char *));
1390+extern void sv_execignore __P((char *));
1391 extern void sv_globignore __P((char *));
1392 extern void sv_ignoreeof __P((char *));
1393 extern void sv_strict_posix __P((char *));