On 21/10/11 13:47, Fabian Greffrath wrote:
Hi all,

Am 02.06.2011 17:07, schrieb Bram Moolenaar:
Where does Vim crash when homedir is NULL? That should be fixed.

I have investigated this crash a bit further and tailored it down to a
completely unrelated issue. It is just that vim takes a completely
different code path depending on whether a HOME directory is set and
whether it succeeds to call a shell or not (i.e. sh is in PATH). this is
why I first suspected the missing HOME variable to be the culprit, but
it isn't.

Remember, I had the problem that vim compiled in an MSYS environment
crashes when started from a cmd.exe shell when both (a) HOME is not set
(which is quite common in a cmd.exe shell) and (b) sh.exe is found in
PATH (i.e. it works with zsh-nt but not with MSYS's bash).

I can perfectly start vim under the aforementioned conditions if I
comment out the line calling "fclose(stderr);" in src/os_unix.c around
line 3994, that's function mch_call_shell() with (!pipe_error) && (pid
== 0). The code block which contains the malicious line is introduced
with the following paragraph:

* Don't want to show any message from the shell. Can't just
* close stdout and stderr though, because some systems will
* break if you try to write to them after that, so we must
* use dup() to replace them with something else -- webb
* Connect stdin to /dev/null too, so ":n `cat`" doesn't hang,
* waiting for input.

And this is exactly what happens, both stdout and stderr are closed and
the system breaks afterwards. The following calls to dup() aren't even
reached. How can I circumvent this breakage? It seems that cmd.exe needs
to have at least one file decriptor open?

- Fabian


Dos-style shells (COMMAND.COM, NDOS.COM, 4DOS.COM, cmd.exe, 4NT.EXE, etc.) open three handles (sysin, sysout and syserr) before starting a program, and they expect those same three handles still to be open when the program exits. They don't have to point to three different files or devices: in the most usual case, all three point to the CON device i.e. the console keyboard-and-screen device. This is when starting a "console" application — IIUC, a GUI application is started with no stdout or stderr unless a >> > or | redirection was explicitly specified on the command-line (I'm not sure about stdin) and its I/O is handled differently. For instance it is a known fact that in Windows cmd.exe "firefox -help" (without the quotes) displays nothing but "firefox -help |more" (still without the quotes) displays the desired help.

In general, IIRC it takes a lot of precautions to get programs compiled for a Cygwin environment to behave when run outside the Cygwin shell, or conversely to get programs compiled for native Windows to behave when called from the Cygwin shell (I don't know about MSYS). It is possible in not too extreme cases (and Make_cyg.mak does it when preprocessing if_perl.xs to auto/if_perl.c) but it requires, among others, constant attention to /-style and \-style paths and their careful conversion by means of the cygpath utility.

I recommend invoking "native-Windows" programs (including the Vim executables compiled with Make_cyg.mak or Make_ming.mak) directly from cmd.exe or from a desktop shortcut, and invoking "Cygwin" programs (including Vim versions compiled under Cygwin with the top-level Makefile and the traditional-Unix "[make config;] make; make install" procedure) from a Cygwin bash (or sh etc.) prompt. The "Cygwin" icon placed on your desktop when you install Cygwin converts (before starting bash, or maybe as the first step before bash displays its prompt) your Dos-like %HOME% and %PATH% variables to $HOME and $PATH values that Unix-like programs running under Cygwin will understand (but it doesn't do the same for every environment variable).


Best regards,
Tony.
--
Somebody ought to cross ball point pens with coat hangers so that the
pens will multiply instead of disappear.

--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Raspunde prin e-mail lui