3 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc.
5 This file is part of Cygwin.
7 This software is a copyrighted work licensed under the terms of the
8 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
11 #define cygwin_internal cygwin_internal_dontuse
23 #include "cygwin/include/sys/cygwin.h"
24 #include "cygwin/include/mntent.h"
25 #undef cygwin_internal
27 #define alloca __builtin_alloca
38 int grep_packages
= 0;
41 typedef long long longlong
;
43 typedef __int64 longlong
;
46 void dump_setup (int, char **, bool);
47 void package_find (int, char **);
48 void package_list (int, char **);
50 static const char version
[] = "$Revision$";
52 static const char *known_env_vars
[] = {
60 "gcc_default_options",
82 static common_apps
[] = {
110 static int num_paths
= 0, max_paths
= 0;
111 static char **paths
= 0;
114 eprintf (const char *format
, ...)
117 va_start (ap
, format
);
118 vfprintf (stderr
, format
, ap
);
123 * display_error() is used to report failure modes
126 display_error (const char *name
, bool show_error
= true, bool print_failed
= true)
129 fprintf (stderr
, "cygcheck: %s%s: %lu\n", name
,
130 print_failed
? " failed" : "", GetLastError ());
132 fprintf (stderr
, "cygcheck: %s%s\n", name
,
133 print_failed
? " failed" : "");
137 /* Display a WinInet error message, and close a variable number of handles.
138 (Passed a list of handles terminated by NULL.) */
140 display_internet_error (const char *message
, ...)
142 DWORD err
= GetLastError ();
147 /* in the case of a successful connection but 404 response, there is no
148 win32 error message, but we still get passed a message to display. */
151 if (FormatMessage (FORMAT_MESSAGE_FROM_HMODULE
,
152 GetModuleHandle ("wininet.dll"), err
, 0, err_buf
,
153 sizeof (err_buf
), NULL
) == 0)
154 strcpy (err_buf
, "(Unknown error)");
156 fprintf (stderr
, "cygcheck: %s: %s (win32 error %d)\n", message
,
160 fprintf (stderr
, "cygcheck: %s\n", message
);
162 va_start (hptr
, message
);
163 while ((h
= va_arg (hptr
, HINTERNET
)) != 0)
164 InternetCloseHandle (h
);
171 add_path (char *s
, int maxlen
)
173 if (num_paths
>= max_paths
)
177 paths
= (char **) realloc (paths
, max_paths
* sizeof (char *));
179 paths
= (char **) malloc (max_paths
* sizeof (char *));
181 paths
[num_paths
] = (char *) malloc (maxlen
+ 1);
182 if (paths
[num_paths
] == NULL
)
184 display_error ("add_path: malloc()");
187 memcpy (paths
[num_paths
], s
, maxlen
);
188 paths
[num_paths
][maxlen
] = 0;
189 char *e
= paths
[num_paths
] + strlen (paths
[num_paths
]);
190 if (e
[-1] == '\\' && e
[-2] != ':')
192 for (int i
= 1; i
< num_paths
; i
++)
193 if (strcasecmp (paths
[num_paths
], paths
[i
]) == 0)
195 free (paths
[num_paths
]);
205 add_path ((char *) ".", 1); /* to be replaced later */
207 if (GetCurrentDirectory (4000, tmp
))
208 add_path (tmp
, strlen (tmp
));
210 display_error ("init_paths: GetCurrentDirectory()");
212 if (GetSystemDirectory (tmp
, 4000))
213 add_path (tmp
, strlen (tmp
));
215 display_error ("init_paths: GetSystemDirectory()");
216 sl
= strrchr (tmp
, '\\');
219 strcpy (sl
, "\\SYSTEM");
220 add_path (tmp
, strlen (tmp
));
222 GetWindowsDirectory (tmp
, 4000);
223 add_path (tmp
, strlen (tmp
));
225 char *wpath
= getenv ("PATH");
232 for (e
= b
; *e
&& *e
!= ';'; e
++);
233 if (strncmp(b
, ".", 1) && strncmp(b
, ".\\", 2))
241 printf ("WARNING: PATH is not set at all!\n");
245 find_on_path (char *file
, char *default_extension
,
246 int showall
= 0, int search_sysdirs
= 0)
248 static char rv
[4000];
249 char tmp
[4000], *ptr
= rv
;
253 display_error ("find_on_path: NULL pointer for file", false, false);
257 if (default_extension
== NULL
)
259 display_error ("find_on_path: NULL pointer for default_extension", false, false);
263 if (strchr (file
, ':') || strchr (file
, '\\') || strchr (file
, '/'))
265 char *fn
= cygpath (file
, NULL
);
266 if (access (fn
, F_OK
) == 0)
269 strcat (rv
, default_extension
);
270 return access (rv
, F_OK
) == 0 ? rv
: fn
;
273 if (strchr (file
, '.'))
274 default_extension
= (char *) "";
276 for (int i
= 0; i
< num_paths
; i
++)
278 if (!search_sysdirs
&& (i
== 0 || i
== 2 || i
== 3))
280 if (i
== 0 || !search_sysdirs
|| strcasecmp (paths
[i
], paths
[0]))
282 sprintf (ptr
, "%s\\%s%s", paths
[i
], file
, default_extension
);
283 if (GetFileAttributes (ptr
) != (DWORD
) - 1)
286 printf ("Found: %s\n", ptr
);
287 if (ptr
== tmp
&& verbose
)
288 printf ("Warning: %s hides %s\n", rv
, ptr
);
302 #define DID_INACTIVE 3
313 already_did (char *file
)
316 for (d
= did
; d
; d
= d
->next
)
317 if (strcasecmp (d
->file
, file
) == 0)
319 d
= (Did
*) malloc (sizeof (Did
));
320 d
->file
= strdup (file
);
328 get_word (HANDLE fh
, int offset
)
333 if (SetFilePointer (fh
, offset
, 0, FILE_BEGIN
) == INVALID_SET_FILE_POINTER
334 && GetLastError () != NO_ERROR
)
335 display_error ("get_word: SetFilePointer()");
337 if (!ReadFile (fh
, &rv
, 2, (DWORD
*) &r
, 0))
338 display_error ("get_word: Readfile()");
344 get_dword (HANDLE fh
, int offset
)
349 if (SetFilePointer (fh
, offset
, 0, FILE_BEGIN
) == INVALID_SET_FILE_POINTER
350 && GetLastError () != NO_ERROR
)
351 display_error ("get_dword: SetFilePointer()");
353 if (!ReadFile (fh
, &rv
, 4, (DWORD
*) &r
, 0))
354 display_error ("get_dword: Readfile()");
364 int size_of_raw_data
;
365 int pointer_to_raw_data
;
369 rva_to_offset (int rva
, char *sections
, int nsections
, int *sz
)
373 if (sections
== NULL
)
375 display_error ("rva_to_offset: NULL passed for sections", true, false);
379 for (i
= 0; i
< nsections
; i
++)
381 Section
*s
= (Section
*) (sections
+ i
* 40);
383 printf ("%08x < %08x < %08x ? %08x\n",
384 s
->virtual_address
, rva
,
385 s
->virtual_address
+ s
->virtual_size
, s
->pointer_to_raw_data
);
387 if (rva
>= s
->virtual_address
388 && rva
< s
->virtual_address
+ s
->virtual_size
)
391 *sz
= s
->virtual_address
+ s
->virtual_size
- rva
;
392 return rva
- s
->virtual_address
+ s
->pointer_to_raw_data
;
409 unsigned characteristics
;
411 unsigned forwarder_chain
;
417 static bool track_down (char *file
, char *suffix
, int lvl
);
419 #define CYGPREFIX (sizeof ("%%% Cygwin ") - 1)
421 cygwin_info (HANDLE h
)
423 char *buf
, *bufend
, *buf_start
= NULL
;
424 const char *hello
= " Cygwin DLL version info:\n";
425 DWORD size
= GetFileSize (h
, NULL
);
428 if (size
== 0xffffffff)
431 buf_start
= buf
= (char *) calloc (1, size
+ 1);
434 display_error ("cygwin_info: calloc()");
438 (void) SetFilePointer (h
, 0, NULL
, FILE_BEGIN
);
439 if (!ReadFile (h
, buf
, size
, &n
, NULL
))
445 static char dummy
[] = "\0\0\0\0\0\0\0";
446 char *dll_major
= dummy
;
449 if ((buf
= (char *) memchr (buf
, '%', bufend
- buf
)) == NULL
)
451 else if (strncmp ("%%% Cygwin ", buf
, CYGPREFIX
) != 0)
455 char *p
= strchr (buf
+= CYGPREFIX
, '\n');
458 if (strncasecmp (buf
, "dll major:", 10) == 0)
460 dll_major
= buf
+ 11;
466 if (strncasecmp (buf
, "dll minor:", 10) != 0)
470 char c
= dll_major
[1];
472 int maj
= atoi (dll_major
);
474 int min
= atoi (dll_major
+ 1);
475 sprintf (pbuf
, "DLL version: %d.%d.%.*s", maj
, min
, len
- 11,
477 len
= strlen (s
= pbuf
);
479 if (strncmp (s
, "dll", 3) == 0)
480 memcpy (s
, "DLL", 3);
481 else if (strncmp (s
, "api", 3) == 0)
482 memcpy (s
, "API", 3);
483 else if (islower (*s
))
485 fprintf (stdout
, "%s %.*s", hello
, len
, s
);
497 dll_info (const char *path
, HANDLE fh
, int lvl
, int recurse
)
501 int pe_header_offset
= get_dword (fh
, 0x3c);
502 int opthdr_ofs
= pe_header_offset
+ 4 + 20;
507 display_error ("dll_info: NULL passed for path", true, false);
511 if (SetFilePointer (fh
, opthdr_ofs
+ 40, 0, FILE_BEGIN
) ==
512 INVALID_SET_FILE_POINTER
&& GetLastError () != NO_ERROR
)
513 display_error ("dll_info: SetFilePointer()");
515 if (!ReadFile (fh
, &v
, sizeof (v
), &junk
, 0))
516 display_error ("dll_info: Readfile()");
519 printf (" - os=%d.%d img=%d.%d sys=%d.%d\n",
520 v
[0], v
[1], v
[2], v
[3], v
[4], v
[5]);
524 int num_entries
= get_dword (fh
, opthdr_ofs
+ 92);
525 int export_rva
= get_dword (fh
, opthdr_ofs
+ 96);
526 int export_size
= get_dword (fh
, opthdr_ofs
+ 100);
527 int import_rva
= get_dword (fh
, opthdr_ofs
+ 104);
528 int import_size
= get_dword (fh
, opthdr_ofs
+ 108);
530 int nsections
= get_word (fh
, pe_header_offset
+ 4 + 2);
531 char *sections
= (char *) malloc (nsections
* 40);
533 if (SetFilePointer (fh
, pe_header_offset
+ 4 + 20 +
534 get_word (fh
, pe_header_offset
+ 4 + 16), 0,
535 FILE_BEGIN
) == INVALID_SET_FILE_POINTER
536 && GetLastError () != NO_ERROR
)
537 display_error ("dll_info: SetFilePointer()");
539 if (!ReadFile (fh
, sections
, nsections
* 40, &junk
, 0))
540 display_error ("dll_info: Readfile()");
542 if (verbose
&& num_entries
>= 1 && export_size
> 0)
545 int expbase
= rva_to_offset (export_rva
, sections
, nsections
, &expsz
);
549 if (SetFilePointer (fh
, expbase
, 0, FILE_BEGIN
) ==
550 INVALID_SET_FILE_POINTER
&& GetLastError () != NO_ERROR
)
551 display_error ("dll_info: SetFilePointer()");
553 unsigned char *exp
= (unsigned char *) malloc (expsz
);
555 if (!ReadFile (fh
, exp
, expsz
, &junk
, 0))
556 display_error ("dll_info: Readfile()");
558 ExpDirectory
*ed
= (ExpDirectory
*) exp
;
559 int ofs
= ed
->name_rva
- export_rva
;
560 struct tm
*tm
= localtime ((const time_t *) &(ed
->timestamp
));
561 if (tm
->tm_year
< 60)
563 if (tm
->tm_year
< 200)
565 printf ("%*c", lvl
+ 2, ' ');
566 printf ("\"%s\" v%d.%d ts=", exp
+ ofs
,
567 ed
->major_ver
, ed
->minor_ver
);
568 printf ("%d/%d/%d %d:%02d\n",
569 tm
->tm_year
, tm
->tm_mon
+ 1, tm
->tm_mday
,
570 tm
->tm_hour
, tm
->tm_min
);
574 if (num_entries
>= 2 && import_size
> 0 && recurse
)
577 int impbase
= rva_to_offset (import_rva
, sections
, nsections
, &impsz
);
580 if (SetFilePointer (fh
, impbase
, 0, FILE_BEGIN
) ==
581 INVALID_SET_FILE_POINTER
&& GetLastError () != NO_ERROR
)
582 display_error ("dll_info: SetFilePointer()");
584 unsigned char *imp
= (unsigned char *) malloc (impsz
);
587 display_error ("dll_info: malloc()");
591 if (!ReadFile (fh
, imp
, impsz
, &junk
, 0))
592 display_error ("dll_info: Readfile()");
594 ImpDirectory
*id
= (ImpDirectory
*) imp
;
595 for (i
= 0; id
[i
].name_rva
; i
++)
597 /* int ofs = id[i].name_rva - import_rva; */
598 track_down ((char *) imp
+ id
[i
].name_rva
- import_rva
,
599 (char *) ".dll", lvl
+ 2);
603 if (strstr (path
, "\\cygwin1.dll"))
607 // Return true on success, false if error printed
609 track_down (char *file
, char *suffix
, int lvl
)
613 display_error ("track_down: NULL passed for file", true, false);
619 display_error ("track_down: NULL passed for suffix", false, false);
623 char *path
= find_on_path (file
, suffix
, 0, 1);
626 printf ("Error: could not find %s\n", file
);
630 Did
*d
= already_did (file
);
639 printf ("%*c", lvl
, ' ');
641 printf (" (recursive)\n");
648 printf ("%*c", lvl
, ' ');
650 printf (" (already done)\n");
658 printf ("%*c", lvl
, ' ');
662 printf ("%s not found\n", file
);
669 CreateFile (path
, GENERIC_READ
, FILE_SHARE_READ
| FILE_SHARE_WRITE
,
670 NULL
, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
671 if (fh
== INVALID_HANDLE_VALUE
)
673 printf (" - Cannot open\n");
677 d
->state
= DID_ACTIVE
;
679 dll_info (path
, fh
, lvl
, 1);
680 d
->state
= DID_INACTIVE
;
681 if (!CloseHandle (fh
))
682 display_error ("track_down: CloseHandle()");
689 HANDLE h
= CreateFile (f
, GENERIC_READ
, FILE_SHARE_READ
| FILE_SHARE_WRITE
,
690 0, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, 0);
691 BY_HANDLE_FILE_INFORMATION info
;
693 if (!GetFileInformationByHandle (h
, &info
))
694 display_error ("ls: GetFileInformationByHandle()");
698 if (!FileTimeToSystemTime (&info
.ftLastWriteTime
, &systime
))
699 display_error ("ls: FileTimeToSystemTime()");
700 printf ("%5dk %04d/%02d/%02d %s",
701 (((int) info
.nFileSizeLow
) + 512) / 1024,
702 systime
.wYear
, systime
.wMonth
, systime
.wDay
, f
);
703 dll_info (f
, h
, 16, 0);
704 if (!CloseHandle (h
))
705 display_error ("ls: CloseHandle()");
708 // Return true on success, false if error printed
712 char *papp
= find_on_path (app
, (char *) ".exe", 1, 0);
715 printf ("Error: could not find %s\n", app
);
718 char *s
= strdup (papp
);
721 if (*t
== '/' || *t
== '\\' || *t
== ':')
724 paths
[0] = (char *) ".";
731 return track_down (papp
, (char *) ".exe", 0);
735 extern char **environ
;
745 show_reg (RegInfo
* ri
, int nest
)
749 show_reg (ri
->prev
, 1);
751 printf ("%s\\", ri
->name
);
753 printf ("%s\n", ri
->name
);
757 scan_registry (RegInfo
* prev
, HKEY hKey
, char *name
, int cygnus
)
765 for (cp
= name
; *cp
; cp
++)
766 if (strncasecmp (cp
, "cygnus", 6) == 0)
769 DWORD num_subkeys
, max_subkey_len
, num_values
;
770 DWORD max_value_len
, max_valdata_len
, i
;
771 if (RegQueryInfoKey (hKey
, 0, 0, 0, &num_subkeys
, &max_subkey_len
, 0,
772 &num_values
, &max_value_len
, &max_valdata_len
, 0, 0)
777 FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
, 0, GetLastError (),
778 MAKELANGID (LANG_NEUTRAL
, SUBLANG_DEFAULT
), tmp
, 400, 0);
779 printf ("RegQueryInfoKey: %s\n", tmp
);
788 char *value_name
= (char *) malloc (max_value_len
+ 1);
789 if (value_name
== NULL
)
791 display_error ("scan_registry: malloc()");
795 char *value_data
= (char *) malloc (max_valdata_len
+ 1);
796 if (value_data
== NULL
)
798 display_error ("scan_registry: malloc()");
802 for (i
= 0; i
< num_values
; i
++)
804 DWORD dlen
= max_valdata_len
+ 1;
805 DWORD nlen
= max_value_len
+ 1;
807 RegEnumValue (hKey
, i
, value_name
, &nlen
, 0,
808 &type
, (BYTE
*) value_data
, &dlen
);
810 printf (" %s = ", i
? value_name
: "(default)");
814 printf ("0x%08x\n", *(unsigned *) value_data
);
818 printf ("'%s'\n", value_data
);
821 printf ("(unsupported type)\n");
830 char *subkey_name
= (char *) malloc (max_subkey_len
+ 1);
831 for (i
= 0; i
< num_subkeys
; i
++)
833 if (RegEnumKey (hKey
, i
, subkey_name
, max_subkey_len
+ 1) ==
837 if (RegOpenKeyEx (hKey
, subkey_name
, 0, KEY_READ
, &sKey
)
840 scan_registry (&ri
, sKey
, subkey_name
, cygnus
);
841 if (RegCloseKey (sKey
) != ERROR_SUCCESS
)
842 display_error ("scan_registry: RegCloseKey()");
850 pretty_id (const char *s
, char *cygwin
, size_t cyglen
)
854 strcpy (cygwin
+ cyglen
++, " ");
855 strcpy (cygwin
+ cyglen
, s
);
858 char *id
= cygpath ("/bin/id.exe", NULL
);
859 for (char *p
= id
; (p
= strchr (p
, '/')); p
++)
862 if (access (id
, X_OK
))
864 fprintf (stderr
, "'id' program not found\n");
868 FILE *f
= popen (id
, "rt");
872 fgets (buf
, sizeof (buf
), f
);
874 char *uid
= strtok (buf
, ")");
876 uid
+= strlen ("uid=");
879 fprintf (stderr
, "garbled output from 'id' command - no uid= found\n");
882 char *gid
= strtok (NULL
, ")");
884 gid
+= strlen ("gid=") + 1;
887 fprintf (stderr
, "garbled output from 'id' command - no gid= found\n");
891 char **ng
= groups
- 1;
892 size_t len_uid
= strlen ("UID: )") + strlen (uid
);
893 size_t len_gid
= strlen ("GID: )") + strlen (gid
);
894 *++ng
= groups
[0] = (char *) alloca (len_uid
+ 1);
895 *++ng
= groups
[1] = (char *) alloca (len_gid
+ 1);
896 sprintf (groups
[0], "UID: %s)", uid
);
897 sprintf (groups
[1], "GID: %s)", gid
);
898 size_t sz
= max (len_uid
, len_gid
);
899 while ((*++ng
= strtok (NULL
, ",")))
901 char *p
= strchr (*ng
, '\n');
904 if (ng
== groups
+ 2)
905 *ng
+= strlen (" groups=");
906 size_t len
= strlen (*ng
);
912 printf ("\nOutput from %s (%s)\n", id
, s
);
913 int n
= 80 / (int) ++sz
;
914 int i
= n
> 2 ? n
- 2 : 0;
916 for (char **g
= groups
; g
<= ng
; g
++)
917 if ((g
!= ng
) && (++i
< n
))
918 printf ("%*s", sz
, *g
);
926 /* This dumps information about each installed cygwin service, if cygrunsrv
929 dump_sysinfo_services ()
934 bool no_services
= false;
937 printf ("\nChecking for any Cygwin services... %s\n\n",
938 verbose
? "" : "(use -v for more detail)");
940 fputc ('\n', stdout
);
942 /* find the location of cygrunsrv.exe */
943 char *cygrunsrv
= cygpath ("/bin/cygrunsrv.exe", NULL
);
944 for (char *p
= cygrunsrv
; (p
= strchr (p
, '/')); p
++)
947 if (access (cygrunsrv
, X_OK
))
949 puts ("Can't find the cygrunsrv utility, skipping services check.\n");
953 /* check for a recent cygrunsrv */
954 snprintf (buf
, sizeof (buf
), "%s --version", cygrunsrv
);
955 if ((f
= popen (buf
, "rt")) == NULL
)
957 printf ("Failed to execute '%s', skipping services check.\n", buf
);
961 int ret
= fscanf (f
, "cygrunsrv V%u.%u", &maj
, &min
);
962 if (ferror (f
) || feof (f
) || ret
== EOF
|| maj
< 1 || min
< 10)
964 puts ("The version of cygrunsrv installed is too old to dump service info.\n");
969 /* For verbose mode, just run cygrunsrv --list --verbose and copy output
970 verbatim; otherwise run cygrunsrv --list and then cygrunsrv --query for
972 snprintf (buf
, sizeof (buf
), (verbose
? "%s --list --verbose" : "%s --list"),
974 if ((f
= popen (buf
, "rt")) == NULL
)
976 printf ("Failed to execute '%s', skipping services check.\n", buf
);
982 /* copy output to stdout */
984 while (!feof (f
) && !ferror (f
))
985 nchars
+= fwrite ((void *) buf
, 1,
986 fread ((void *) buf
, 1, sizeof (buf
), f
), stdout
);
988 /* cygrunsrv outputs nothing if there are no cygwin services found */
995 /* read the output of --list, and then run --query for each service */
996 size_t nchars
= fread ((void *) buf
, 1, sizeof (buf
) - 1, f
);
1001 for (char *srv
= strtok (buf
, "\n"); srv
; srv
= strtok (NULL
, "\n"))
1003 snprintf (buf2
, sizeof (buf2
), "%s --query %s", cygrunsrv
, srv
);
1004 if ((f
= popen (buf2
, "rt")) == NULL
)
1006 printf ("Failed to execute '%s', skipping services check.\n", buf2
);
1010 /* copy output to stdout */
1011 while (!feof (f
) && !ferror (f
))
1012 fwrite ((void *) buf2
, 1,
1013 fread ((void *) buf2
, 1, sizeof (buf2
), f
), stdout
);
1020 /* inform the user if nothing found */
1022 puts ("No Cygwin services found.\n");
1031 char *found_cygwin_dll
;
1034 printf ("\nCygwin Configuration Diagnostics\n");
1036 printf ("Current System Time: %s\n", ctime (&now
));
1038 OSVERSIONINFO osversion
;
1039 osversion
.dwOSVersionInfoSize
= sizeof (osversion
);
1040 if (!GetVersionEx (&osversion
))
1041 display_error ("dump_sysinfo: GetVersionEx()");
1042 char *osname
= (char *) "unknown OS";
1043 switch (osversion
.dwPlatformId
)
1045 case VER_PLATFORM_WIN32s
:
1046 osname
= (char *) "32s";
1048 case VER_PLATFORM_WIN32_WINDOWS
:
1049 switch (osversion
.dwMinorVersion
)
1052 if (strchr (osversion
.szCSDVersion
, 'C'))
1053 osname
= (char *) "95 OSR2";
1055 osname
= (char *) "95";
1058 if (strchr (osversion
.szCSDVersion
, 'A'))
1059 osname
= (char *) "98 SE";
1061 osname
= (char *) "98";
1064 osname
= (char *) "ME";
1067 osname
= (char *) "9X";
1071 case VER_PLATFORM_WIN32_NT
:
1073 if (osversion
.dwMajorVersion
== 5)
1075 BOOL more_info
= FALSE
;
1076 OSVERSIONINFOEX osversionex
;
1077 osversionex
.dwOSVersionInfoSize
= sizeof (osversionex
);
1078 if (GetVersionEx ((OSVERSIONINFO
*) &osversionex
))
1080 if (osversion
.dwMinorVersion
== 0)
1083 osname
= (char *) "2000";
1084 else if (osversionex
.wProductType
== VER_NT_SERVER
1085 || osversionex
.wProductType
== VER_NT_DOMAIN_CONTROLLER
)
1087 if (osversionex
.wSuiteMask
& VER_SUITE_DATACENTER
)
1088 osname
= (char *) "2000 Datacenter Server";
1089 else if (osversionex
.wSuiteMask
& VER_SUITE_ENTERPRISE
)
1090 osname
= (char *) "2000 Advanced Server";
1092 osname
= (char *) "2000 Server";
1095 osname
= (char *) "2000 Professional";
1097 else if (osversion
.dwMinorVersion
== 1)
1099 if (GetSystemMetrics (SM_MEDIACENTER
))
1100 osname
= (char *) "XP Media Center Edition";
1101 else if (GetSystemMetrics (SM_TABLETPC
))
1102 osname
= (char *) "XP Tablet PC Edition";
1103 else if (!more_info
)
1104 osname
= (char *) "XP";
1105 else if (osversionex
.wSuiteMask
& VER_SUITE_PERSONAL
)
1106 osname
= (char *) "XP Home Edition";
1108 osname
= (char *) "XP Professional";
1110 else if (osversion
.dwMinorVersion
== 2)
1113 osname
= (char *) "2003 Server";
1114 else if (osversionex
.wSuiteMask
& VER_SUITE_BLADE
)
1115 osname
= (char *) "2003 Web Server";
1116 else if (osversionex
.wSuiteMask
& VER_SUITE_DATACENTER
)
1117 osname
= (char *) "2003 Datacenter Server";
1118 else if (osversionex
.wSuiteMask
& VER_SUITE_ENTERPRISE
)
1119 osname
= (char *) "2003 Enterprise Server";
1121 osname
= (char *) "2003 Server";
1125 osname
= (char *) "NT";
1128 osname
= (char *) "??";
1131 printf ("Windows %s Ver %lu.%lu Build %lu %s\n\n", osname
,
1132 osversion
.dwMajorVersion
, osversion
.dwMinorVersion
,
1133 osversion
.dwPlatformId
== VER_PLATFORM_WIN32_NT
?
1134 osversion
.dwBuildNumber
: (osversion
.dwBuildNumber
& 0xffff),
1135 osversion
.dwPlatformId
== VER_PLATFORM_WIN32_NT
?
1136 osversion
.szCSDVersion
: "");
1137 if (GetSystemMetrics (SM_REMOTESESSION
))
1138 printf ("Running in Terminal Service session\n\n");
1141 char *s
= getenv ("PATH"), *e
;
1146 char sep
= strchr (s
, ';') ? ';' : ':';
1147 int count_path_items
= 0;
1150 for (e
= s
; *e
&& *e
!= sep
; e
++);
1152 printf ("\t%.*s\n", e
- s
, s
);
1164 char *cygwin
= getenv ("CYGWIN");
1166 cygwin
-= strlen ("CYGWIN=");
1168 cygwin
= const_cast <char *> ("CYGWIN=");
1169 size_t cyglen
= strlen (cygwin
);
1170 cygwin
= strcpy ((char *) malloc (cyglen
+ sizeof (" nontsec")), cygwin
);
1171 pretty_id ("nontsec", cygwin
, cyglen
);
1172 pretty_id ("ntsec", cygwin
, cyglen
);
1176 if (!GetSystemDirectory (tmp
, 4000))
1177 display_error ("dump_sysinfo: GetSystemDirectory()");
1178 printf ("\nSysDir: %s\n", tmp
);
1180 GetWindowsDirectory (tmp
, 4000);
1181 printf ("WinDir: %s\n\n", tmp
);
1185 printf ("Here's some environment variables that may affect cygwin:\n");
1186 for (i
= 0; environ
[i
]; i
++)
1188 char *eq
= strchr (environ
[i
], '=');
1191 /* int len = eq - environ[i]; */
1192 for (j
= 0; known_env_vars
[j
]; j
++)
1195 if (strcmp (environ
[i
], "PATH") == 0)
1196 continue; /* we handle this one specially */
1197 if (strcasecmp (environ
[i
], known_env_vars
[j
]) == 0)
1198 printf ("%s = '%s'\n", environ
[i
], eq
+ 1);
1207 printf ("Here's the rest of your environment variables:\n");
1208 for (i
= 0; environ
[i
]; i
++)
1211 char *eq
= strchr (environ
[i
], '=');
1214 /* int len = eq - environ[i]; */
1215 for (j
= 0; known_env_vars
[j
]; j
++)
1218 if (strcasecmp (environ
[i
], known_env_vars
[j
]) == 0)
1225 printf ("%s = '%s'\n", environ
[i
], eq
+ 1);
1235 printf ("Scanning registry for keys with 'Cygnus' in them...\n");
1237 /* big and not generally useful */
1238 scan_registry (0, HKEY_CLASSES_ROOT
, (char *) "HKEY_CLASSES_ROOT", 0);
1240 scan_registry (0, HKEY_CURRENT_CONFIG
,
1241 (char *) "HKEY_CURRENT_CONFIG", 0);
1242 scan_registry (0, HKEY_CURRENT_USER
, (char *) "HKEY_CURRENT_USER", 0);
1243 scan_registry (0, HKEY_LOCAL_MACHINE
, (char *) "HKEY_LOCAL_MACHINE", 0);
1245 /* the parts we need are duplicated in HKEY_CURRENT_USER anyway */
1246 scan_registry (0, HKEY_USERS
, (char *) "HKEY_USERS", 0);
1251 printf ("Use '-r' to scan registry\n\n");
1255 printf ("Listing available drives...\n");
1256 printf ("Drv Type Size Used Flags Name\n");
1259 SetErrorMode (SEM_FAILCRITICALERRORS
| SEM_NOOPENFILEERRORBOX
);
1260 int drivemask
= GetLogicalDrives ();
1262 HINSTANCE k32
= LoadLibrary ("kernel32.dll");
1263 BOOL (WINAPI
* gdfse
) (LPCSTR
, long long *, long long *, long long *) =
1264 (BOOL (WINAPI
*) (LPCSTR
, long long *, long long *, long long *))
1265 GetProcAddress (k32
, "GetDiskFreeSpaceExA");
1267 for (i
= 0; i
< 26; i
++)
1269 if (!(drivemask
& (1 << i
)))
1271 char drive
[4], name
[200], fsname
[200];
1272 DWORD serno
= 0, maxnamelen
= 0, flags
= 0;
1273 name
[0] = name
[0] = fsname
[0] = 0;
1274 sprintf (drive
, "%c:\\", i
+ 'a');
1275 /* Report all errors, except if the Volume is ERROR_NOT_READY.
1276 ERROR_NOT_READY is returned when removeable media drives are empty
1277 (CD, floppy, etc.) */
1278 if (!GetVolumeInformation (drive
, name
, sizeof (name
), &serno
,
1279 &maxnamelen
, &flags
, fsname
,
1281 && GetLastError () != ERROR_NOT_READY
)
1283 # define FMT "dump_sysinfo: GetVolumeInformation() for drive %c:"
1284 char buf
[sizeof (FMT
)];
1285 sprintf (buf
, FMT
, 'A' + i
);
1286 display_error (buf
);
1290 int dtype
= GetDriveType (drive
);
1291 char drive_type
[4] = "unk";
1294 case DRIVE_REMOVABLE
:
1295 strcpy (drive_type
, "fd ");
1298 strcpy (drive_type
, "hd ");
1301 strcpy (drive_type
, "net");
1304 strcpy (drive_type
, "cd ");
1307 strcpy (drive_type
, "ram");
1310 strcpy (drive_type
, "unk");
1313 long capacity_mb
= -1;
1314 int percent_full
= -1;
1316 long long free_me
= 0ULL, free_bytes
= 0ULL, total_bytes
= 1ULL;
1317 if (gdfse
!= NULL
&& gdfse (drive
, &free_me
, &total_bytes
, &free_bytes
))
1319 capacity_mb
= total_bytes
/ (1024L * 1024L);
1320 percent_full
= 100 - (int) ((100.0 * free_me
) / total_bytes
);
1324 DWORD spc
= 0, bps
= 0, fc
= 0, tc
= 1;
1325 if (GetDiskFreeSpace (drive
, &spc
, &bps
, &fc
, &tc
))
1327 capacity_mb
= (spc
* bps
* tc
) / (1024 * 1024);
1328 percent_full
= 100 - (int) ((100.0 * fc
) / tc
);
1332 printf ("%.2s %s %-6s ", drive
, drive_type
, fsname
);
1333 if (capacity_mb
>= 0)
1334 printf ("%7dMb %3d%% ", (int) capacity_mb
, (int) percent_full
);
1336 printf (" N/A N/A ");
1337 printf ("%s %s %s %s %s %s %s\n",
1338 flags
& FS_CASE_IS_PRESERVED
? "CP" : " ",
1339 flags
& FS_CASE_SENSITIVE
? "CS" : " ",
1340 flags
& FS_UNICODE_STORED_ON_DISK
? "UN" : " ",
1341 flags
& FS_PERSISTENT_ACLS
? "PA" : " ",
1342 flags
& FS_FILE_COMPRESSION
? "FC" : " ",
1343 flags
& FS_VOL_IS_COMPRESSED
? "VC" : " ",
1345 flags
& FILE_SUPPORTS_ENCRYPTION
? "EN" : " ",
1346 flags
& FILE_SUPPORTS_OBJECT_IDS
? "OI" : " ",
1347 flags
& FILE_SUPPORTS_REPARSE_POINTS
? "RP" : " ",
1348 flags
& FILE_SUPPORTS_SPARSE_FILES
? "SP" : " ",
1349 flags
& FILE_VOLUME_QUOTAS
? "QU" : " ",
1354 if (!FreeLibrary (k32
))
1355 display_error ("dump_sysinfo: FreeLibrary()");
1356 SetErrorMode (prev_mode
);
1360 "fd = floppy, hd = hard drive, cd = CD-ROM\n"
1361 "net= Network Share, ram= RAM drive, unk= Unknown\n"
1362 "CP = Case Preserving, CS = Case Sensitive, UN = Unicode\n"
1363 "PA = Persistent ACLS, FC = File Compression, VC = Volume Compression");
1367 unsigned ml_fsname
= 4, ml_dir
= 7, ml_type
= 6;
1368 bool ml_trailing
= false;
1372 while ((mnt
= getmntent (0)))
1374 unsigned n
= (int) strlen (mnt
->mnt_fsname
);
1375 ml_trailing
|= (n
> 1 && strchr ("\\/", mnt
->mnt_fsname
[n
- 1]));
1378 n
= (int) strlen (mnt
->mnt_dir
);
1379 ml_trailing
|= (n
> 1 && strchr ("\\/", mnt
->mnt_dir
[n
- 1]));
1385 puts ("Warning: Mount entries should not have a trailing (back)slash\n");
1390 ("Mount entries: these map POSIX directories to your NT drives.\n");
1391 printf ("%-*s %-*s %-*s %s\n", ml_fsname
, "-NT-", ml_dir
, "-POSIX-",
1392 ml_type
, "-Type-", "-Flags-");
1396 while ((mnt
= getmntent (0)))
1398 printf ("%-*s %-*s %-*s %s\n",
1399 ml_fsname
, mnt
->mnt_fsname
,
1400 ml_dir
, mnt
->mnt_dir
, ml_type
, mnt
->mnt_type
, mnt
->mnt_opts
);
1404 add_path ((char *) "\\bin", 4); /* just in case */
1408 ("Looking to see where common programs can be found, if at all...\n");
1409 for (i
= 0; common_apps
[i
].name
; i
++)
1410 if (!find_on_path ((char *) common_apps
[i
].name
, (char *) ".exe", 1, 0))
1412 if (common_apps
[i
].missing_is_good
)
1413 printf ("Not Found: %s (good!)\n", common_apps
[i
].name
);
1415 printf ("Not Found: %s\n", common_apps
[i
].name
);
1420 printf ("Looking for various Cygwin DLLs... (-v gives version info)\n");
1421 int cygwin_dll_count
= 0;
1422 for (i
= 1; i
< num_paths
; i
++)
1424 WIN32_FIND_DATA ffinfo
;
1425 sprintf (tmp
, "%s/*.*", paths
[i
]);
1426 HANDLE ff
= FindFirstFile (tmp
, &ffinfo
);
1427 int found
= (ff
!= INVALID_HANDLE_VALUE
);
1428 found_cygwin_dll
= NULL
;
1431 char *f
= ffinfo
.cFileName
;
1432 if (strcasecmp (f
+ strlen (f
) - 4, ".dll") == 0)
1434 if (strncasecmp (f
, "cyg", 3) == 0)
1436 sprintf (tmp
, "%s\\%s", paths
[i
], f
);
1437 if (strcasecmp (f
, "cygwin1.dll") == 0)
1440 found_cygwin_dll
= strdup (tmp
);
1446 found
= FindNextFile (ff
, &ffinfo
);
1448 if (found_cygwin_dll
)
1450 ls (found_cygwin_dll
);
1451 free (found_cygwin_dll
);
1456 if (cygwin_dll_count
> 1)
1457 puts ("Warning: There are multiple cygwin1.dlls on your path");
1458 if (!cygwin_dll_count
)
1459 puts ("Warning: cygwin1.dll not found on your path");
1462 dump_sysinfo_services ();
1468 HANDLE h
= CreateFileA ("CONIN$", GENERIC_READ
| GENERIC_WRITE
,
1469 FILE_SHARE_READ
| FILE_SHARE_WRITE
, NULL
,
1470 OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
1472 if (h
== INVALID_HANDLE_VALUE
|| h
== NULL
)
1473 return (display_error ("check_keys: Opening CONIN$"));
1477 if (!GetConsoleMode (h
, &mode
))
1478 display_error ("check_keys: GetConsoleMode()");
1481 mode
&= ~ENABLE_PROCESSED_INPUT
;
1482 if (!SetConsoleMode (h
, mode
))
1483 display_error ("check_keys: SetConsoleMode()");
1486 fputs ("\nThis key check works only in a console window,", stderr
);
1487 fputs (" _NOT_ in a terminal session!\n", stderr
);
1488 fputs ("Abort with Ctrl+C if in a terminal session.\n\n", stderr
);
1489 fputs ("Press 'q' to exit.\n", stderr
);
1491 INPUT_RECORD in
, prev_in
;
1493 // Drop first <RETURN> key
1494 ReadConsoleInput (h
, &in
, 1, &mode
);
1496 memset (&in
, 0, sizeof in
);
1501 if (!ReadConsoleInput (h
, &in
, 1, &mode
))
1502 display_error ("check_keys: ReadConsoleInput()");
1504 if (!memcmp (&in
, &prev_in
, sizeof in
))
1507 switch (in
.EventType
)
1510 printf ("%s %ux VK: 0x%02x VS: 0x%02x A: 0x%02x CTRL: ",
1511 in
.Event
.KeyEvent
.bKeyDown
? "Pressed " : "Released",
1512 in
.Event
.KeyEvent
.wRepeatCount
,
1513 in
.Event
.KeyEvent
.wVirtualKeyCode
,
1514 in
.Event
.KeyEvent
.wVirtualScanCode
,
1515 (unsigned char) in
.Event
.KeyEvent
.uChar
.AsciiChar
);
1516 fputs (in
.Event
.KeyEvent
.dwControlKeyState
& CAPSLOCK_ON
?
1517 "CL " : "-- ", stdout
);
1518 fputs (in
.Event
.KeyEvent
.dwControlKeyState
& ENHANCED_KEY
?
1519 "EK " : "-- ", stdout
);
1520 fputs (in
.Event
.KeyEvent
.dwControlKeyState
& LEFT_ALT_PRESSED
?
1521 "LA " : "-- ", stdout
);
1522 fputs (in
.Event
.KeyEvent
.dwControlKeyState
& LEFT_CTRL_PRESSED
?
1523 "LC " : "-- ", stdout
);
1524 fputs (in
.Event
.KeyEvent
.dwControlKeyState
& NUMLOCK_ON
?
1525 "NL " : "-- ", stdout
);
1526 fputs (in
.Event
.KeyEvent
.dwControlKeyState
& RIGHT_ALT_PRESSED
?
1527 "RA " : "-- ", stdout
);
1528 fputs (in
.Event
.KeyEvent
.dwControlKeyState
& RIGHT_CTRL_PRESSED
?
1529 "RC " : "-- ", stdout
);
1530 fputs (in
.Event
.KeyEvent
.dwControlKeyState
& SCROLLLOCK_ON
?
1531 "SL " : "-- ", stdout
);
1532 fputs (in
.Event
.KeyEvent
.dwControlKeyState
& SHIFT_PRESSED
?
1533 "SH " : "-- ", stdout
);
1534 fputc ('\n', stdout
);
1541 while (in
.EventType
!= KEY_EVENT
||
1542 in
.Event
.KeyEvent
.bKeyDown
!= FALSE
||
1543 in
.Event
.KeyEvent
.uChar
.AsciiChar
!= 'q');
1549 /* RFC1738 says that these do not need to be escaped. */
1550 static const char safe_chars
[] = "$-_.+!*'(),";
1552 /* the URL to query. */
1553 static const char base_url
[] =
1554 "http://cygwin.com/cgi-bin2/package-grep.cgi?text=1&grep=";
1556 /* Queries Cygwin web site for packages containing files matching a regexp.
1557 Return value is 1 if there was a problem, otherwise 0. */
1559 package_grep (char *search
)
1563 /* construct the actual URL by escaping */
1564 char *url
= (char *) alloca (sizeof (base_url
) + strlen (search
) * 3);
1565 strcpy (url
, base_url
);
1568 for (dest
= &url
[sizeof (base_url
) - 1]; *search
; search
++)
1570 if (isalnum (*search
)
1571 || memchr (safe_chars
, *search
, sizeof (safe_chars
) - 1))
1578 sprintf (dest
, "%02x", (unsigned char) *search
);
1584 /* Connect to the net and open the URL. */
1585 if (InternetAttemptConnect (0) != ERROR_SUCCESS
)
1587 fputs ("An internet connection is required for this function.\n", stderr
);
1591 /* Initialize WinInet and attempt to fetch our URL. */
1592 HINTERNET hi
= NULL
, hurl
= NULL
;
1593 if (!(hi
= InternetOpen ("cygcheck", INTERNET_OPEN_TYPE_PRECONFIG
, NULL
, NULL
, 0)))
1594 return display_internet_error ("InternetOpen() failed", NULL
);
1596 if (!(hurl
= InternetOpenUrl (hi
, url
, NULL
, 0, 0, 0)))
1597 return display_internet_error ("unable to contact cygwin.com site, "
1598 "InternetOpenUrl() failed", hi
, NULL
);
1600 /* Check the HTTP response code. */
1601 DWORD rc
= 0, rc_s
= sizeof (DWORD
);
1602 if (!HttpQueryInfo (hurl
, HTTP_QUERY_STATUS_CODE
| HTTP_QUERY_FLAG_NUMBER
,
1603 (void *) &rc
, &rc_s
, NULL
))
1604 return display_internet_error ("HttpQueryInfo() failed", hurl
, hi
, NULL
);
1606 if (rc
!= HTTP_STATUS_OK
)
1608 sprintf (buf
, "error retrieving results from cygwin.com site, "
1609 "HTTP status code %lu", rc
);
1610 return display_internet_error (buf
, hurl
, hi
, NULL
);
1613 /* Fetch result and print to stdout. */
1617 if (!InternetReadFile (hurl
, (void *) buf
, sizeof (buf
), &numread
))
1618 return display_internet_error ("InternetReadFile failed", hurl
, hi
, NULL
);
1620 fwrite ((void *) buf
, (size_t) numread
, 1, stdout
);
1624 InternetCloseHandle (hurl
);
1625 InternetCloseHandle (hi
);
1630 usage (FILE * stream
, int status
)
1633 Usage: cygcheck PROGRAM [ -v ] [ -h ]\n\
1634 cygcheck -c [ PACKAGE ] [ -d ]\n\
1635 cygcheck -s [ -r ] [ -v ] [ -h ]\n\
1637 cygcheck -f FILE [ FILE ... ]\n\
1638 cygcheck -l [ PACKAGE ] [ PACKAGE ... ]\n\
1639 cygcheck -p REGEXP\n\
1640 List system information, check installed packages, or query package database.\n\
1642 At least one command option or a PROGRAM is required, as shown above.\n\
1644 PROGRAM list library (DLL) dependencies of PROGRAM\n\
1645 -c, --check-setup show installed version of PACKAGE and verify integrity\n\
1646 (or for all installed packages if none specified)\n\
1647 -d, --dump-only just list packages, do not verify (with -c)\n\
1648 -s, --sysinfo produce diagnostic system information (implies -c -d)\n\
1649 -r, --registry also scan registry for Cygwin settings (with -s)\n\
1650 -k, --keycheck perform a keyboard check session (must be run from a\n\
1651 plain console only, not from a pty/rxvt/xterm)\n\
1652 -f, --find-package find the package that FILE belongs to\n\
1653 -l, --list-package list contents of PACKAGE (or all packages if none given)\n\
1654 -p, --package-query search for REGEXP in the entire cygwin.com package\n\
1655 repository (requies internet connectivity)\n\
1656 -v, --verbose produce more verbose output\n\
1657 -h, --help annotate output with explanatory comments when given\n\
1658 with another command, otherwise print this help\n\
1659 -V, --version print the version of cygcheck and exit\n\
1661 Note: -c, -f, and -l only report on packages that are currently installed. To\n\
1662 search all official Cygwin packages use -p instead. The -p REGEXP matches\n\
1663 package names, descriptions, and names of files/paths within all packages.\n\
1668 struct option longopts
[] = {
1669 {"check-setup", no_argument
, NULL
, 'c'},
1670 {"dump-only", no_argument
, NULL
, 'd'},
1671 {"sysinfo", no_argument
, NULL
, 's'},
1672 {"registry", no_argument
, NULL
, 'r'},
1673 {"verbose", no_argument
, NULL
, 'v'},
1674 {"keycheck", no_argument
, NULL
, 'k'},
1675 {"find-package", no_argument
, NULL
, 'f'},
1676 {"list-package", no_argument
, NULL
, 'l'},
1677 {"package-query", no_argument
, NULL
, 'p'},
1678 {"help", no_argument
, NULL
, 'h'},
1679 {"version", no_argument
, 0, 'V'},
1680 {0, no_argument
, NULL
, 0}
1683 static char opts
[] = "cdsrvkflphV";
1688 const char *v
= strchr (version
, ':');
1698 len
= strchr (v
, ' ') - v
;
1701 cygcheck version %.*s\n\
1702 System Checker for Cygwin\n\
1703 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc.\n\
1705 ", len
, v
, __DATE__
);
1711 int n
= 1 + strchr (ev
, '=') - ev
;
1712 char *s
= (char *) alloca (n
+ 1);
1719 unsigned long (*cygwin_internal
) (int, ...);
1723 load_cygwin (int& argc
, char **&argv
)
1727 if (!(h
= LoadLibrary ("cygwin1.dll")))
1729 if (!(cygwin_internal
= (DWORD (*) (int, ...)) GetProcAddress (h
, "cygwin_internal")))
1732 char **av
= (char **) cygwin_internal (CW_ARGV
);
1733 if (av
&& ((DWORD
) av
!= (DWORD
) -1))
1734 for (argc
= 0, argv
= av
; *av
; av
++)
1737 char **envp
= (char **) cygwin_internal (CW_ENVP
);
1738 if (envp
&& ((DWORD
) envp
!= (DWORD
) -1))
1740 /* Store path and revert to this value, otherwise path gets overwritten
1741 by the POSIXy Cygwin variation, which breaks cygcheck.
1742 Another approach would be to use the Cygwin PATH and convert it to
1746 while (*(env
= _environ
))
1748 if (strncmp (*env
, "PATH=", 5) == 0)
1749 path
= strdup (*env
);
1752 for (char **ev
= envp
; *ev
; ev
++)
1753 if (strncmp (*ev
, "PATH=", 5) != 0)
1761 main (int argc
, char **argv
)
1765 load_cygwin (argc
, argv
);
1767 (void) putenv("POSIXLY_CORRECT=1");
1768 while ((i
= getopt_long (argc
, argv
, opts
, longopts
, NULL
)) != EOF
)
1810 if (argc
== 0 && !sysinfo
&& !keycheck
&& !check_setup
&& !list_package
)
1816 if ((check_setup
|| sysinfo
|| find_package
|| list_package
|| grep_packages
)
1820 if ((find_package
|| list_package
|| grep_packages
) && check_setup
)
1823 if (dump_only
&& !check_setup
)
1826 if (find_package
+ list_package
+ grep_packages
> 1)
1830 return check_keys ();
1832 return package_grep (*argv
);
1836 /* FIXME: Add help for check_setup and {list,find}_package */
1837 if (argc
>= 1 && givehelp
&& !check_setup
&& !find_package
&& !list_package
)
1839 printf("Here is where the OS will find your program%s, and which dlls\n",
1840 argc
> 1 ? "s" : "");
1841 printf ("will be used for it. Use -v to see DLL version info\n");
1848 dump_setup (verbose
, argv
, !dump_only
);
1849 else if (find_package
)
1850 package_find (verbose
, argv
);
1851 else if (list_package
)
1852 package_list (verbose
, argv
);
1854 for (i
= 0; i
< argc
; i
++)
1858 ok
&= cygcheck (argv
[i
]);
1867 dump_setup (verbose
, NULL
, false);
1871 puts ("Use -h to see help about each section");
1874 return ok
? EXIT_SUCCESS
: EXIT_FAILURE
;