-win32_executable_type (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. */
-
- 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;
- }
- }
- }
- }
-
-unwind:
- close_file_data (&executable);
-}
-
-int
-compare_env (const char **strp1, const char **strp2)
-{
- const char *str1 = *strp1, *str2 = *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