X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fntproc.c;h=eebf13ffdea02db8eff2d6be7600e802e3541e20;hb=9816585ded614fa87be5a2ecfda6dc16c60beb2c;hp=1546a74203d9616019e7780c0a1e9d3813615841;hpb=ea21eb75bbf90355514d65686bd53bea579f8e23;p=chise%2Fxemacs-chise.git- diff --git a/src/ntproc.c b/src/ntproc.c index 1546a74..eebf13f 100644 --- a/src/ntproc.c +++ b/src/ntproc.c @@ -32,7 +32,7 @@ Boston, MA 02111-1307, USA. #include /* must include CRT headers *before* config.h */ -/* ### I don't believe it - martin */ +/* #### I don't believe it - martin */ #include #undef signal #undef wait @@ -55,6 +55,9 @@ Boston, MA 02111-1307, USA. #include "syswait.h" #include "buffer.h" #include "process.h" + +#include "console-msw.h" + /*#include "w32term.h"*/ /* From 19.34.6: sync in ? --marcpa */ /* #### I'm not going to play with shit. */ @@ -393,7 +396,7 @@ reader_thread (void *arg) static const char * process_dir; static BOOL -create_child (CONST char *exe, char *cmdline, char *env, +create_child (const char *exe, char *cmdline, char *env, int * pPid, child_process *cp) { STARTUPINFO start; @@ -406,7 +409,6 @@ create_child (CONST char *exe, char *cmdline, char *env, xzero (start); start.cb = sizeof (start); -#ifdef HAVE_NTGUI if (NILP (Vwin32_start_process_show_window)) start.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; else @@ -416,7 +418,6 @@ create_child (CONST char *exe, char *cmdline, char *env, start.hStdInput = GetStdHandle (STD_INPUT_HANDLE); start.hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE); start.hStdError = GetStdHandle (STD_ERROR_HANDLE); -#endif /* HAVE_NTGUI */ /* Explicitly specify no security */ if (!InitializeSecurityDescriptor (&sec_desc, SECURITY_DESCRIPTOR_REVISION)) @@ -457,155 +458,6 @@ create_child (CONST char *exe, char *cmdline, char *env, return FALSE; } -#ifndef __MINGW32__ -/* Return pointer to section header for section containing the given - relative virtual address. */ -static IMAGE_SECTION_HEADER * -rva_to_section (DWORD rva, IMAGE_NT_HEADERS * nt_header) -{ - PIMAGE_SECTION_HEADER section; - int i; - - section = IMAGE_FIRST_SECTION (nt_header); - - for (i = 0; i < nt_header->FileHeader.NumberOfSections; i++) - { - if (rva >= section->VirtualAddress - && rva < section->VirtualAddress + section->SizeOfRawData) - return section; - section++; - } - return NULL; -} -#endif - -void -win32_executable_type (CONST char * filename, int * is_dos_app, int * is_cygnus_app) -{ - file_data executable; - char * p; - - /* Default values in case we can't tell for sure. */ - *is_dos_app = FALSE; - *is_cygnus_app = FALSE; - - if (!open_input_file (&executable, filename)) - return; - - p = strrchr (filename, '.'); - - /* We can only identify DOS .com programs from the extension. */ - if (p && stricmp (p, ".com") == 0) - *is_dos_app = TRUE; - else if (p && (stricmp (p, ".bat") == 0 || - stricmp (p, ".cmd") == 0)) - { - /* A DOS shell script - it appears that CreateProcess is happy to - accept this (somewhat surprisingly); presumably it looks at - COMSPEC to determine what executable to actually invoke. - Therefore, we have to do the same here as well. */ - /* Actually, I think it uses the program association for that - extension, which is defined in the registry. */ - p = egetenv ("COMSPEC"); - if (p) - win32_executable_type (p, is_dos_app, is_cygnus_app); - } - else - { - /* Look for DOS .exe signature - if found, we must also check that - it isn't really a 16- or 32-bit Windows exe, since both formats - start with a DOS program stub. Note that 16-bit Windows - executables use the OS/2 1.x format. */ - -#ifdef __MINGW32__ - /* mingw32 doesn't have enough headers to detect cygwin - apps, just do what we can. */ - FILHDR * exe_header; - - exe_header = (FILHDR*) executable.file_base; - if (exe_header->e_magic != DOSMAGIC) - goto unwind; - - if ((char *) exe_header->e_lfanew > (char *) executable.size) - { - /* Some dos headers (pkunzip) have bogus e_lfanew fields. */ - *is_dos_app = TRUE; - } - else if (exe_header->nt_signature != NT_SIGNATURE) - { - *is_dos_app = TRUE; - } -#else - IMAGE_DOS_HEADER * dos_header; - IMAGE_NT_HEADERS * nt_header; - - dos_header = (PIMAGE_DOS_HEADER) executable.file_base; - if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) - goto unwind; - - nt_header = (PIMAGE_NT_HEADERS) ((char *) dos_header + dos_header->e_lfanew); - - if ((char *) nt_header > (char *) dos_header + executable.size) - { - /* Some dos headers (pkunzip) have bogus e_lfanew fields. */ - *is_dos_app = TRUE; - } - else if (nt_header->Signature != IMAGE_NT_SIGNATURE && - LOWORD (nt_header->Signature) != IMAGE_OS2_SIGNATURE) - { - *is_dos_app = TRUE; - } - else if (nt_header->Signature == IMAGE_NT_SIGNATURE) - { - /* Look for cygwin.dll in DLL import list. */ - IMAGE_DATA_DIRECTORY import_dir = - nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]; - IMAGE_IMPORT_DESCRIPTOR * imports; - IMAGE_SECTION_HEADER * section; - - section = rva_to_section (import_dir.VirtualAddress, nt_header); - imports = RVA_TO_PTR (import_dir.VirtualAddress, section, executable); - - for ( ; imports->Name; imports++) - { - char * dllname = RVA_TO_PTR (imports->Name, section, executable); - - if (strcmp (dllname, "cygwin.dll") == 0) - { - *is_cygnus_app = TRUE; - break; - } - } - } -#endif - } - - unwind: - close_file_data (&executable); -} - -int -compare_env (const void *strp1, const void *strp2) -{ - const char *str1 = *(const char**)strp1, *str2 = *(const char**)strp2; - - while (*str1 && *str2 && *str1 != '=' && *str2 != '=') - { - if ((*str1) > (*str2)) - return 1; - else if ((*str1) < (*str2)) - return -1; - str1++, str2++; - } - - if (*str1 == '=' && *str2 == '=') - return 0; - else if (*str1 == '=') - return -1; - else - return 1; -} - void merge_and_sort_env (char **envp1, char **envp2, char **new_envp) { @@ -623,7 +475,7 @@ merge_and_sort_env (char **envp1, char **envp2, char **new_envp) *nptr++ = *optr++; num += optr - envp2; - qsort (new_envp, num, sizeof (char *), compare_env); + qsort (new_envp, num, sizeof (char*), compare_env); *nptr = NULL; } @@ -631,8 +483,8 @@ merge_and_sort_env (char **envp1, char **envp2, char **new_envp) /* When a new child process is created we need to register it in our list, so intercept spawn requests. */ int -sys_spawnve (int mode, CONST char *cmdname, - CONST char * CONST *argv, CONST char *CONST *envp) +sys_spawnve (int mode, const char *cmdname, + const char * const *argv, const char *const *envp) { Lisp_Object program, full; char *cmdline, *env, *parg, **targ; @@ -668,11 +520,13 @@ sys_spawnve (int mode, CONST char *cmdname, errno = EINVAL; return -1; } - GET_C_STRING_FILENAME_DATA_ALLOCA (full, cmdname); + TO_EXTERNAL_FORMAT (LISP_STRING, full, + C_STRING_ALLOCA, cmdname, + Qfile_name); } else { - (char*)cmdname = alloca (strlen (argv[0]) + 1); + cmdname = (char*)alloca (strlen (argv[0]) + 1); strcpy ((char*)cmdname, argv[0]); } UNGCPRO; @@ -680,21 +534,21 @@ sys_spawnve (int mode, CONST char *cmdname, /* make sure argv[0] and cmdname are both in DOS format */ unixtodos_filename ((char*)cmdname); /* #### KLUDGE */ - ((CONST char**)argv)[0] = cmdname; + ((const char**)argv)[0] = cmdname; /* Determine whether program is a 16-bit DOS executable, or a Win32 executable that is implicitly linked to the Cygnus dll (implying it was compiled with the Cygnus GNU toolchain and hence relies on cygwin.dll to parse the command line - we use this to decide how to escape quote chars in command line args that must be quoted). */ - win32_executable_type (cmdname, &is_dos_app, &is_cygnus_app); + mswindows_executable_type (cmdname, &is_dos_app, &is_cygnus_app); /* On Windows 95, if cmdname is a DOS app, we invoke a helper application to start it by specifying the helper app as cmdname, while leaving the real app name as argv[0]. */ if (is_dos_app) { - cmdname = alloca (MAXPATHLEN); + cmdname = (char*) alloca (MAXPATHLEN); if (egetenv ("CMDPROXY")) strcpy ((char*)cmdname, egetenv ("CMDPROXY")); else @@ -741,7 +595,7 @@ sys_spawnve (int mode, CONST char *cmdname, /* Override escape char by binding win32-quote-process-args to desired character, or use t for auto-selection. */ if (INTP (Vwin32_quote_process_args)) - escape_char = XINT (Vwin32_quote_process_args); + escape_char = (char) XINT (Vwin32_quote_process_args); else escape_char = is_cygnus_app ? '"' : '\\'; } @@ -793,7 +647,7 @@ sys_spawnve (int mode, CONST char *cmdname, } arglen += strlen (*targ++) + 1; } - cmdline = alloca (arglen); + cmdline = (char*) alloca (arglen); targ = (char**)argv; parg = cmdline; while (*targ) @@ -875,7 +729,7 @@ sys_spawnve (int mode, CONST char *cmdname, /* and envp... */ arglen = 1; - targ = (char**)envp; + targ = (char**) envp; numenv = 1; /* for end null */ while (*targ) { @@ -889,11 +743,11 @@ sys_spawnve (int mode, CONST char *cmdname, numenv++; /* merge env passed in and extra env into one, and sort it. */ - targ = (char **) alloca (numenv * sizeof (char *)); - merge_and_sort_env ((char**)envp, extra_env, targ); + targ = (char **) alloca (numenv * sizeof (char*)); + merge_and_sort_env ((char**) envp, extra_env, targ); /* concatenate env entries. */ - env = alloca (arglen); + env = (char*) alloca (arglen); parg = env; while (*targ) { @@ -937,7 +791,7 @@ find_child_console (HWND hwnd, child_process * cp) GetClassName (hwnd, window_class, sizeof (window_class)); if (strcmp (window_class, - (os_subtype == OS_WIN95) + msw_windows9x_p() ? "tty" : "ConsoleWindowClass") == 0) { @@ -1030,7 +884,7 @@ sys_kill (int pid, int sig) if (NILP (Vwin32_start_process_share_console) && cp && cp->hwnd) { #if 1 - if (os_subtype == OS_WIN95) + if (msw_windows9x_p()) { /* Another possibility is to try terminating the VDM out-right by @@ -1091,7 +945,7 @@ sys_kill (int pid, int sig) #if 0 /* Sync with FSF Emacs 19.34.6 note: ifdef'ed out in XEmacs */ -extern int report_file_error (CONST char *, Lisp_Object); +extern int report_file_error (const char *, Lisp_Object); #endif /* The following two routines are used to manipulate stdin, stdout, and stderr of our child processes. @@ -1419,7 +1273,7 @@ If successful, the new locale id is returned, otherwise nil. /* Sync with FSF Emacs 19.34.6 note: dwWinThreadId declared in w32term.h and defined in w32fns.c, both of which are not in current - XEmacs. ### Check what we lose by ifdef'ing out these. --marcpa */ + XEmacs. #### Check what we lose by ifdef'ing out these. --marcpa */ #if 0 /* Need to set input thread locale if present. */ if (dwWinThreadId) @@ -1432,7 +1286,7 @@ If successful, the new locale id is returned, otherwise nil. void -syms_of_ntproc () +syms_of_ntproc (void) { DEFSUBR (Fwin32_short_file_name); DEFSUBR (Fwin32_long_file_name);