diff options
Diffstat (limited to 'winsup/utils')
31 files changed, 0 insertions, 17564 deletions
diff --git a/winsup/utils/ChangeLog b/winsup/utils/ChangeLog deleted file mode 100644 index af668e751..000000000 --- a/winsup/utils/ChangeLog +++ /dev/null @@ -1,1387 +0,0 @@ -2004-03-21 Christopher Faylor <cgf@redhat.com> - - * cygcheck.cc (dump_sysinfo): Remove "Win95/NT" from output. - -2004-03-15 Christopher Faylor <cgf@redhat.com> - - * cygpath.cc (usage): Don't issue helpful message if -i is used. - (from Igor Pechtchanski) - -2004-03-13 Rob Siklos <rob2@siklos.ca> - - * kill.cc (get_debug_priv): New function. - (forcekill): Call get_debug_priv before trying to kill process. - -2004-02-24 Christopher Faylor <cgf@redhat.com> - - * cygpath.cc (long_options): Add "mode" option. - (options): Ditto. - (usage): Report on new option. - (report_mode): New function. - (main): Implement -M option. - -2004-02-20 Christopher Faylor <cgf@redhat.com> - - * Makefile.in (build_dumper): Detect missing iconv library. - - * cygpath.cc (dowin): Report on filename conversion errors. - (doit): Ditto. - - * strace.cc (main): Use symbolic constant for _STRACE_ALL when setting - mask. - -2004-02-14 Corinna Vinschen <corinna@vinschen.de> - - * ssp.c (opts): Add leading '+' to force posixly correct behaviour. - -2004-02-11 Corinna Vinschen <corinna@vinschen.de> - - * strace.cc (opts): Add leading '+' to force posixly correct - behaviour. - (main): Revert POSIXLY_CORRECT manipulations. - -2004-02-10 Christopher Faylor <cgf@redhat.com> - - * strace.cc (main): Guard against previous setting of POSIXLY_CORRECT. - -2004-02-10 Christopher Faylor <cgf@redhat.com> - - * strace.cc: Update copyrights. - * cygcheck.cc: Update copyrights. - -2004-02-10 Christopher Faylor <cgf@redhat.com> - - * strace.cc (main): Ensure POSIXLY_CORRECT argument ordering. - * cygcheck.cc (main): Ditto. - -2004-01-23 Christopher Faylor <cgf@redhat.com> - - * cygcheck.cc (pretty_id): Make more robust in absence of id.exe. - -2004-01-22 Corinna Vinschen <corinna@vinschen.de> - - * cygpath.cc (dowin): Revert accidental checkin from November. - -2003-11-26 Corinna Vinschen <corinna@vinschen.de> - - * mkgroup.c (main): Print "root" group with local admins group sid - and gid 0. - -2003-11-19 Corinna Vinschen <corinna@vinschen.de> - - * Makefile.in: Add rules to build ipcrm and ipcs. - * ipcrm.c: New file. - * ipcs.c: New file. - -2003-11-14 Corinna Vinschen <corinna@vinschen.de> - - * mkgroup.c: Avoid compiler warnings throughout. - * mkpasswd.c: Ditto. - * passwd.c: Ditto. - -2003-11-07 Mark Blackburn <marklist@fangorn.ca> - - * cygpath.cc (main): Allow multiple pathnames on command line. - -2003-11-04 Corinna Vinschen <corinna@vinschen.de> - - * passwd.c (PrintPW): Turn around meaning printed for "Password not - required" option to be in line with Windows meaning. - (main): Use more appropriate 1008 option when calling - NetUserSetInfo to change flag values. - -2003-11-04 Corinna Vinschen <corinna@vinschen.de> - - * passwd.c (UF_LOCKOUT): Remove (defined in lmaccess.h). - (version): Bump version number to 1.5. - (longopts): Add -c, -C, -e, -E, -p, -P options. - (opts): Ditto. - (PrintPW): Print values of UF_PASSWD_CANT_CHANGE and - UF_DONT_EXPIRE_PASSWD flags. Slightly reformat output. Don't suppress - correct system password settings just because the account has admin - privileges. - (usage): Define as "noreturn" function. Restructure and rephrase - output. Accomodate new options. - (print_version): Fix copyright dates. - (main): Accomodate new options for setting UF_PASSWD_CANT_CHANGE, - UF_DONT_EXPIRE_PASSWD and UF_PASSWD_NOTREQD settings. - -2003-10-17 Christopher Faylor <cgf@redhat.com> - - * cygcheck.cc (pretty_id): Don't exec if `id' program is not found. - -2003-09-20 Christopher Faylor <cgf@redhat.com> - - * kill.cc (main): Allow negative pids (indicates process groups). - -2003-09-17 Christopher Faylor <cgf@redhat.com> - - * parse_pe.cc (exclusion::sort_and_check): Make error message a little - more explicit and ignore (hopefully) harmless region overlap. - -2003-09-13 Christopher Faylor <cgf@redhat.com> - - * kill.c (forcekill): Wait for process to terminate even if - TerminateProcess says it failed. - -2003-09-11 Christopher Faylor <cgf@redhat.com> - - * Makefile.in: Tweak mingw libz.a detection to make it more reliably - detect when libz.a is not available. - -2003-09-11 Igor Pechtchanski <pechtcha@cs.nyu.edu> - - * cygcheck.cc (dump_only): New global variable. - (usage): Add "--dump-only" option, fix "--verbose" line. - (longopts, opts): Add "--dump-only" option. - (main): Process the "--dump-only" flag. Add new semantic check. - Pass dump_only information to dump_setup(). - -2003-09-11 Corinna Vinschen <corinna@vinschen.de> - - * getfacl (main): Remove extern declaration of optind. - * setfacl (main): Remove extern declaration of optarg and optind. - -2003-09-10 Christopher Faylor <cgf@redhat.com> - - * Makefile.in (cygcheck.o): Use MINGW_CXX for compilation. - * cygcheck.cc: Just include <getopt.h> rather than cygwin version. - (pretty_id): Avoid compiler warnings. - * cygpath.cc (usage): Ditto. - -2003-09-10 Christopher Faylor <cgf@redhat.com> - - * Makefile.in (MINGW_CXX): Define and use for mingw-compiled files. - * path.cc: Include more path info in cygwin-specific includes since the - cygwin directory is no longer included by default. - -2003-09-10 Christopher Faylor <cgf@redhat.com> - - * Makefile.in: More fixups to adjust for the fact that mingw_getopt.o - is no longer built. - -2003-09-10 Christopher Faylor <cgf@redhat.com> - - * Makefile.in: Remove references to getopt since it is now part of - mingwex. - -2003-09-08 Christopher Faylor <cgf@redhat.com> - - * Makefile.in: Rename libz.h -> zlib.h. - -2003-09-07 Christopher Faylor <cgf@redhat.com> - - * Makefile.in: Detect existence of mingw zlib headers and libraries. - Build cygcheck without package checking if they are unavailable. - * dump_setup.cc: Generate dummy zlib macros when zlib is not available. - (open_package_list): Use zlib functions to uncompress package lists. - Return gzFile rather than FILE *. - (check_package_files): Change fp to gzFile to accommodate zlib - functions. Use gzgets to read from package file. Use gzclose to close - the handle. - (package_list): Ditto. - (package_find): Ditto. - -2003-09-05 Igor Pechtchanski <pechtcha@cs.nyu.edu> - - * dump_setup.cc (check_package_files): Don't fail on empty package. - -2003-09-01 AJ Reins <reinsaj@yahoo.com> - - * mount.cc (mount_commands): Ensure user mode is actually user mode and - not the default system mode. - -2003-08-31 Christopher Faylor <cgf@redhat.com> - - * kill.cc (forcekill): Silence some compiler warnings. - -2003-08-31 Christopher Faylor <cgf@redhat.com> - - * Makefile.in: Oops. Put the '...' in the right place. - -2003-08-31 Christopher Faylor <cgf@redhat.com> - - * Makefile.in: Display "..." when not-verbose. - - * kill.cc (forcekill): Default to entered pid when pinfo fails. Issue - some warnings when things don't work. - -2003-08-17 David Rothenberger <daveroth@acm.org> - - * dump_setup.cc (check_package_files): Strip leading / and ./ from - package file names. - -2003-08-16 David Rothenberger <daveroth@acm.org> - - * dump_setup.cc (package_find): Don't stop searching on missing - file list. - (package_list): Ditto. - -2003-08-16 Igor Pechtchanski <pechtcha@cs.nyu.edu> - - * dump_setup.cc: (package_list): Make output terse unless - verbose requested. Fix formatting. - (package_find): Ditto. - -2003-08-15 Corinna Vinschen <corinna@vinschen.de> - - * cygcheck.cc (main): Fix some formatting and help text printing. - -2003-08-15 Igor Pechtchanski <pechtcha@cs.nyu.edu> - - * cygcheck.cc (find_package,list_package): New global - variables. - (usage): Add "--find-package" and "--list-package" options, - reformat output. - (longopts, opts): Add "--find-package" and "--list-package" - options. - (main): Process the "--find-package" and "--list-package" - flags. Add new semantic checks. Add calls to find_package() - and list_package(). - * dump_setup.cc: Fix header comment. - (match_argv): Change return type to int to distinguish - between real matches and default ones. - (open_package_list): New static function. - (check_package_files): Factor out opening the package list - file into open_package_list(). - (get_packages): New static function. - (dump_setup): Factor out getting a list of packages into - get_packages(). - (package_list, package_find): New global functions. - -2003-08-15 Corinna Vinschen <corinna@vinschen.de> - - * regtool.cc (usage): Add missing linefeed. Move example to --help - text. Fix forward slash description. - -2003-08-13 Igor Pechtchanski <pechtcha@cs.nyu.edu> - - * dump_setup.cc (check_package_files): Fix extra '/' in filename. - Resize command buffer. Fix buffer overflow bug. - -2003-08-09 Igor Pechtchanski <pechtcha@cs.nyu.edu> - Christopher Faylor <cgf@redhat.com> - - * dump_setup.cc (dump_setup): Check for the existence of the package - list file. Rework slightly to use static buffer for popen commands. - -2003-08-07 Igor Pechtchanski <pechtcha@cs.nyu.edu> - Christopher Faylor <cgf@redhat.com> - - * dump_setup.cc (version_len): New static variable. - (could_not_access,directory_exists): New static function. - (file_exists): Ditto. - (check_package_files): Ditto. - (dump_setup): Check the contents of each package if check_files is true - and output the result in the "Status" column. Flush output after each - package. - -2003-08-07 Igor Pechtchanski <pechtcha@cs.nyu.edu> - Christopher Faylor <cgf@redhat.com> - - * dump_setup.cc (dump_setup): Remove redundant null check. Add - informative message if package info not found. - -2003-07-26 Christopher Faylor <cgf@redhat.com> - - * mount.cc (do_mount): Issue warning when using managed mount option on - non-empty directory. - -2003-07-25 Christopher Faylor <cgf@redhat.com> - - * configure.in: Use 'install-sh -c'. - * configure: Regenerate. - -2003-07-25 Christopher Faylor <cgf@redhat.com> - - * configure.in: Always use install-sh. - * configure: Regenerate. - -2003-07-03 Christopher Faylor <cgf@redhat.com> - - * mount.cc (struct opt): Remove posix option. - -2003-07-03 Christopher Faylor <cgf@redhat.com> - - * mount.cc (longopts): Add long "options" keyword. - (opts): Add -o option. - (usage): Display -o option. - (struct opt): New. - (concat3): New function. - (main): Handle -o flag. - -2003-06-12 Christopher Faylor <cgf@redhat.com> - - * cygcheck.cc (pretty_id): Rework slightly to not rely on spaces. - -2003-06-12 Christopher Faylor <cgf@redhat.com> - - * cygpath.cc: Throughout, always return error when GetShortPathName - returns 0. - -2003-04-26 Joshua Daniel Franklin <joshuadfranklin at yahoo dot com> - - * mkpasswd.c (usage) Remove extra newline from description output. - -2003-04-26 Joshua Daniel Franklin <joshuadfranklin at yahoo dot com> - - * cygcheck.cc (usage) Add description output. - * cygpath.cc (usage) Add description output. - * dumper.cc (usage) Add newline to description output. - * kill.cc (usage) Add description output. - * mkgroup.c (usage) Grammatical change to description output. - * mkpasswd.c (usage) Grammatical change to description output. - * mount.cc (usage) Add description output. - * passwd.c (usage) Add description output. - * ps.cc (usage) Add description output. - * regtool.cc (usage) Add description output. - * setfacl.c (usage) Remove extra newline from description output. - * ssp.c (usage) Add description output. - * strace.cc (usage) Add description output. - * umount.cc (usage) Add description output. - -2003-04-10 Pierre Humblet <pierre.humblet@ieee.org> - - * mkpasswd.c (current_user): print uid and gid as unsigned. - (enum_users): Ditto. Do not free servername. - (usage): Update to allow several domains and improve -p. - (main): On Win9x limit uids to 1000. Only print specials - when -l is specified. Add a loop to allow several domains - and free servername in the loop. - * mkgroup.c (enum_groups): Do not free servername. - (usage): Update to allow several domains. Change uid to gid. - (main): Only print specials when -l is specified. Add a - loop to allow several domains and free servername in the loop. - -2003-03-24 Christopher Faylor <cgf@redhat.com> - - * cygcheck.cc (dump_sysinfo): Ensure that CYGWIN environment variable - is correctly set. - -2003-03-09 Corinna Vinschen <corinna@vinschen.de> - - * getfacl.c (username): Fix ambiguous printf calls. - (groupname): Ditto. - (main): Ditto. - -2003-03-04 Christopher Faylor <cgf@redhat.com> - - * Makefile.in (strace.exe): Include mingw_getopt.o in link line. - * cygcheck.cc (print_version): Update copyright. - * strace.cc (print_version): Ditto. - (main): Allow cygwin paths for -o option. - (create_child): Allow cygwin path as argv[0]. - * path.cc (path.cc): Allow UNC paths. - -2003-03-01 Pierre Humblet <pierre.humblet@ieee.org> - - * mkpasswd.cc (main): On Win95, output both a default line and a - line for the current user (if known) with a pseudorandom uid. If - the -u switch is given, produce a line for the specified user. - * mkgroup.cc (main): On Win95 change the group name from "unknown" to - "all". - -2003-02-28 Christopher Faylor <cgf@redhat.com> - - * Makefile.in (cygcheck.o): Fix so that actual mingw include files are - used. - * cygcheck.cc (find_on_path): Translate from cygwin path when qualified - path name found. - (pretty_id): New function. Dump output of id command. - (dump_sysinfo): Call pretty_id for CYGWIN=ntsec and CYGWIN=nontsec cases. - -2003-02-12 Christopher Faylor <cgf@redhat.com> - - * cygpath.cc (doit): Allocate more space for non-path filename. - -2003-02-07 Christopher Faylor <cgf@redhat.com> - - * dump_setup.cc (compar): Use case insensitive comparisons. - (dump_setup): Calculate package_len based on already used "len". Don't - bother with version_len. - -2003-02-07 Igor Pechtchanski <pechtcha@cs.nyu.edu> - - * dump_setup.cc (dump_setup): Compute the longest package name - and align columns properly. - -2003-02-06 Christopher Faylor <cgf@redhat.com> - - * cygcheck.cc (common_apps): Add some more apps. - * path.cc (get_cygdrive): Correctly set system flag. - -2003-01-22 Corinna Vinschen <corinna@vinschen.de> - - * Makefile.in (ALL_LDFLAGS): Remove newlib/libm from tools paths. - (MINGW_LDFLAGS): Remove in favor of definition from Makefile.common. - -2003-01-15 Corinna Vinschen <corinna@vinschen.de> - - * mkgroup.c: Fix copyright date. - * mkpasswd.c: Ditto. - * setfacl.c: Ditto. - -2003-01-09 Pierre Humblet <pierre.humblet@ieee.org> - - * setfacl.c (usage): Remove double ":" for mask and other. - -2003-01-07 Pierre Humblet <pierre.humblet@ieee.org> - - * mkpasswd.c (current_user): Create. - (usage): Reorganize to support Win95/98/ME. - (main): Add option for -c. Reorganize to parse options for - Win95/98/ME and to call current_user. Add username in gecos field - on Win95/98/ME. - * mkgroup.c (enum_groups): Print gid with %u. - (print_win_error): Create from passwd.cc. - (current_group): Create. - (usage): Reorganize to support Win95/98/ME. - (main): Add option for -c. Reorganize to parse options for - Win95/98/ME and to call current_group. - -2002-12-14 Pierre Humblet <pierre.humblet@ieee.org> - - * setfacl.c (main): Place a single : after other and mask. - * getfacl.c (getaclentry): Allow both : and :: for other and mask. - (main): Remove extraneous break. - -2002-11-25 Corinna Vinschen <corinna@vinschen.de> - - * mkpasswd.c (main): Set pw_passwd field to '*' on 9x/Me. - -2002-11-24 Corinna Vinschen <corinna@vinschen.de> - - * setfacl.c (getperm): Set only `other' permission bits. - (getaclentry): Set a_id to -1 by default. - -2002-11-24 Corinna Vinschen <corinna@vinschen.de> - - * getfacl.c (permstr): Use `other' permission bits for requesting - ace permissions. - -2002-11-08 Corinna Vinschen <corinna@vinschen.de> - - * setfacl.c (usage): Add missing LF. - -2002-10-30 Christopher Faylor <cgf@redhat.com> - - * cygpath.cc (get_long_path_name_w32impl): Define similarly to - GetLongPathName. - (get_long_name): Correctly prototype GetLongPathName. - (get_long_paths): Implement using get_long_name to cut down on code - duplication. - (doit): Do various things to make path output work predictably. - -2002-10-19 Christopher Faylor <cgf@redhat.com> - - * mount.cc (usage): Correctly report default mode. - * strace.cc (main): Use strtoul as appropriate. - -2002-09-29 Christopher Faylor <cgf@redhat.com> - - * cygpath.cc (close_arg): Remove unused static. - * mkgroup.c (enum_local_users): Avoid compiler warning. - (enum_users): Ditto. - * mkpasswd.c: Ditto throughout. - * ssp.c: Ditto throughout. - -2002-09-18 Christopher Faylor <cgf@redhat.com> - - * cygcheck.cc: Include sys/time.h rather than time.h to avoid a - compiler error. - -2002-09-17 Christopher Faylor <cgf@redhat.com> - - * cygcheck.cc: Reorder includes to avoid compiler error. - -2002-09-15 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * cygcheck.cc (print_version) Add final newline. - * getfacl.c (print_version) Add final newline. - * kill.cc (print_version) Add final newline. - * mkgroup.c (print_version) Add final newline. - * mkpasswd.c (print_version) Add final newline. - * mount.cc (print_version) Add final newline. - * passwd.c (print_version) Add final newline. - * ps.cc (print_version) Add final newline. - * regtool.cc (print_version) Add final newline. - * setfacl.c (print_version) Add final newline. - * ssp.c (print_version) Add final newline. - * strace.cc (print_version) Add final newline. - * umount.cc (print_version) Add final newline. - -2002-09-12 Igor Pechtchanski <pechtcha@cs.nyu.edu> - - * cygpath.cc (options) New global variable. - (main) Make short options global for easier change. - (print_version) Add a missing newline. - -2002-08-07 Igor Pechtchanski <pechtcha@cs.nyu.edu> - - * regtool.cc (find_key): Add support for custom key separator. - (usage): Document it. - -2002-08-02 Corinna Vinschen <corinna@vinschen.de> - - * mkgroup.c (main): Don't print an entry for "Everyone". - * mkpasswd.c (print_special): Set pw_gid to 544 for SYSTEM user. - (main): Don't print an entry for "Everyone". - -2002-07-06 Christopher Faylor <cgf@redhat.com> - - * configure.in: Check for libiconv.a. - * configure: Regenerate. - * Makefile.in: Add libiconv.a to libraries required for dumper.exe. - -2002-07-06 Christopher Faylor <cgf@redhat.com> - - * Makefile.in: Use MINGW stuff from Makefile.common. - -2002-07-01 Corinna Vinschen <corinna@vinschen.de> - - * mkgroup.c: Add function pointers for functions from advapi32.dll. - (load_netapi): Load used functions from advapi32.dll. - (main): Use function pointers instead of statically linked functions - from advapi32.dll. - -2002-07-01 Christopher Faylor <cgf@redhat.com> - - * mount.cc (main): Ensure that mount_already_exists() also gets default - flag that is passed to do_mount. - -2002-06-22 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * cygpath.cc (long_options): Add "dos" and "mixed", correct "close", - "file" and "type" to use NULL flag. - (usage): Clean up usage output (more), accomodate new options. - (main): Add --dos and --mixed options; accomodate all output forms in - --type. Make UNIXy output default. - -2002-06-18 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * cygpath.cc (usage): Clean up usage output. - (dowin): Correct output of -t mixed for -ADHPSW options. - -2002-06-14 Corinna Vinschen <corinna@vinschen.de> - - * passwd.c: Rearrange includes to avoid unnecessary warnings. - (GetPW): Add parameter to (dis)allow printing of Windows username. - Use defines instead of numerical constants where possible. - Try avoiding impersonation problem. Rearrange to print Windows - username only if it's different from Cygwin username. - (ChangePW): Use defines instead of numerical constants where possible. - (main): Call GetPW with additional parameter. Change error text. - -2002-06-14 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * passwd.c (GetPW): Handle case of user-edited /etc/passwd - with cygwin_internal (CW_EXTRACT_DOMAIN_AND_USER, ...). - -2002-06-09 Christopher Faylor <cgf@redhat.com> - - * path.cc (cygpath): Change MOUNT_AUTO to MOUNT_CYGDRIVE. - (getmntent): Ditto. - -2002-06-09 Christopher Faylor <cgf@redhat.com> - - * mount.cc (main): Use default system/user flag for cygdrive stuff, - too. - (change_cygdrive_prefix): Change MOUNT_AUTO to MOUNT_CYGDRIVE. - * umount.cc (remove_cygdrive_prefix): Ditto. - (main): Use default system/user flag for cygdrive stuff, too. - -2002-06-08 Christopher Faylor <cgf@redhat.com> - - * mount.cc (opts): Remove '-i' option. - (usage): Ditto. - (main): Ditto. - (longopts): Remove --import-old-mounts option. - -2002-06-07 David Peterson <chief@mail.idrive.com> - Christopher Faylor <cgf@redhat.com> - - * cygpath.cc: Add option to output windows paths in different formats: - "dos" and "mixed". - (main): Process options. - (doit): Check new options flags. - -2002-06-06 Egor Duda <deo@logos-m.ru> - - * regtool.cc (Fail): Be more verbose. - (find_key): Add support for remote registry access. - (usage): Document it. - * utils.sgml: Document it. - -2002-06-06 Christopher Faylor <cgf@redhat.com> - - * strace.cc (main): Make toggle a local variable. - -2002-06-07 Conrad Scott <conrad.scott@dsl.pipex.com> - - * strace.cc (toggle): New global variable. - (error): Use exit instead of ExitProcess so that stdio buffers get - flushed. - (create_child): Remove command line error checking. - (dostrace): Ditto. - (dotoggle): New function. - (usage): Add entry for new option -T|--toggle. Alphabetize. - (longopts): Add new option -T|--toggle. - (opts): Ditto. - (main): Handle new -T|--toggle option. Move all command line checking - here from other functions. - * utils.sgml: Update section for strace. - -2002-06-05 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * strace.cc (version): New global variable. - (usage): Accommodate stdout output. - (print_version): New function. - -2002-06-03 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * ssp.c (version): New global variable. - (longopts): Ditto. - (opts): Ditto. - (run_program): Correct cmd_line typos to cmdline. - (usage): New function. Standardize usage output. Add ssp.txt to - --help output. - (print_version): New function. - (main): Accommodate getopt. - -2002-06-03 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * umount.cc (version): New global variable. - (longopts): Accommodate new --version option. - (opts): Ditto. - (usage): Standardize usage output. - (print_version): New function. - (main): Accommodate --help, --version options. - -2002-06-02 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * regtool.cc (prog_name): New global variable. - (longopts): Ditto. - (opts): Ditto. - (usage): Standardize usage output. Rearrange/add descriptions. - (print_version): New function. - (main): Accommodate longopts and new --help, --version options. Add - check for (_argv[optind+1] == NULL). - -2002-06-02 Christopher Faylor <cgf@redhat.com> - - * strace.cc (forkdebug): Make true by default. - (attach_process): Use window pid if cygwin pid isn't available (yet). - (create_child): Use either DEBUG_ONLY_THIS_PROCESS or DEBUG_PROCESS, - exclusively. (Suggested by Conrad.Scott@dsl.pipex.com) - -2002-05-30 Christopher Faylor <cgf@redhat.com> - - * mkpasswd.cc (main): Don't reset to binmode if stdout is a terminal. - -2002-05-29 Christopher Faylor <cgf@redhat.com> - - * mount.cc (main): Make -b the default. - -2002-05-29 Corinna Vinschen <corinna@vinschen.de> - - * ps.cc (main): Use uid or uid32 member of struct external_pinfo - dependent of the value of the struct's version member. - -2002-05-29 Corinna Vinschen <corinna@vinschen.de> - - * ps.cc (main): Change print format for uid to unsigned. Use uid32 - member of struct external_pinfo instead of uid. - -2002-05-28 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * passwd.c (prog_name): New global variable. - (longopts): Ditto. - (opts): Ditto. - (usage): Standardize output. Accommodate new options. - (print_version): New function. - (main): Accommodate longopts and new --help, --version options. - -2002-05-28 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * ps.cc (usage): Fix typo. - -2002-05-27 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * ps.cc (prog_name): New global variable. - (longopts): Ditto. - (opts): Ditto. - (usage): New function. - (print_version): New function. - (main): Accommodate longopts and new --help, --version options. - -2002-05-26 Christopher Faylor <cgf@redhat.com> - - * strace.cc (attach_process): Don't tell process to start stracing - here. - (proc_child): Do it here, instead, after first debug event. This - should work around inexplicable races with DebugActiveProcess. - (dostrace): Pass any pid argument to proc_child. - -2002-05-23 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * getfacl.c (usage): Standardize usage output. Change return type to - static void. - (print_version): New function. - (longopts): Added longopts for all options. - (main): Accommodate new help and version options. - -2002-05-22 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * mount.cc (version): New global variable. - (usage): Standardize usage output. Accommodate new version option. - (print_version): New function. - (longopts): Accommodate new version option. - (opts): Ditto. - (main): Ditto. - -2002-05-22 Corinna Vinschen <corinna@vinschen.de> - - * cygpath.cc (usage): Change usage output slightly. - -2002-05-20 Joerg Schaible <joerg.schaible@gmx.de> - - * cygpath.cc (main): Add option l to support conversion to - Windows long file names. Refactured code for capital options. - Support of options from file for capital options. - (dowin): New function. Refactured from main. - (doit): Call long path conversion. - (get_long_name): New function. - (get_long_paths): New function. - (get_long_path_name_w32impl): New function. Reimplementation - of Windows API function GetLongPathName (only 98/Me/2000/XP or - higher). - (get_short_name): Call GetShortPathName only once. - (get_short_paths): Fix calculating buffer size. - * utils.sgml: Update cygpath section for l option. - -2002-05-18 Christopher Faylor <cgf@redhat.com> - - * strace.cc (add_child): Use calloc since new requires working - libstdc++.a. - (remove_child): Ditto for delete/free. - -2002-05-15 Mark Blackburn <marklist@fangorn.ca> - - * cygpath.cc (get_short_paths): Fix more error checking. - (get_short_name): Ditto. - -2002-05-14 Joerg Schaible <joerg.schaible@gmx.de> - - * cygpath.cc (main): Add option H to show the Windows' profiles - directory. Support short names for options DPSW. Clean up - copied code lines. - * utils.sgml: Update cygpath section for H option and s support. - -2002-05-14 Mark Blackburn <marklist@fangorn.ca> - - * cygpath.cc (get_short_paths): Fix error checking. - -2002-05-13 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * kill.cc (prog_name): New global variable. - (usage): Standardize usage output. Add descriptions. - (print_version): New function. - (longopts): Accommodate new version option. - (opts): Ditto. - (main): Ditto. - -2002-05-13 Christopher Faylor <cgf@redhat.com> - - * kill.cc (listsig): Display numeric id when given symbolic input. - -2002-05-13 Christopher Faylor <cgf@redhat.com> - - * kill.cc (usage): Show new options. Allow specification of output - stream. - (main): Implement 'h' option. - -2002-05-13 Christopher Faylor <cgf@redhat.com> - - * Makefile.in (kill.exe): Add as a specific target. - * kill.cc (longopts): New. - (opts): Ditto. - (get_sig): Accept const char * parameter. Return -1 on unknown signal. - (test_for_unknown_sig): New function. - (listsig): New function. - (main): Use getopt_long for option parsing. Implement -l, and -s - options. Use test_for_unknown_sig() to test for signal validity. - - * mount.cc (longopts): Make static. - (opts): Ditto. - -2002-05-12 Christopher Faylor <cgf@redhat.com> - - * mount.cc (do_mount): Default to non-exec option for remote drives. - Report warnings before attempting a mount. - (longopts): Add no-executable option. - (mount_commands): Ditto. - (opts): Ditto. - (usage): Ditto. Indicate that system mount is now the default. - (main): Accommodate no-executable option. Make system mount the - default. - * umount.cc (usage): Indicate that system umount is now the default. - (main): Make system umount the default. - -2002-05-07 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * dumper.cc (usage): Standardize usage output. Generalize to allow use - for help. - (longopts): New struct. Added longopts for all options. - (print_version): New function. - (main): Change getopt to getopt_long. Accommodate new help and version - options. - -2002-03-29 Corinna Vinschen <corinna@vinschen.de> - - * mkgroup.c (main): Change call to exit() to a return statement. - * mkpasswd.c (main): Ditto. - -2002-03-27 Joshua Daniel Franklin joshuadfranklin@yahoo.com - - * mkpasswd.c (usage): Simplify usage output. Generalize to allow use - for help. Correct '?' typo to 'h'. - (longopts): Add version option. - (opts): Add 'v' version option. - (print_version): New function. - (main): Accommodate new version option. Accommodate usage parameter - changes. - -2002-03-19 Christopher Faylor <cgf@redhat.com> - - * mkgroup.c (usage): Use one just fprintf + string concatenation for - output message. - (print_version): Add void to function type and update copyright. - -2002-03-16 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * mkgroup.c (usage): Simplify usage output. Generalize to allow use - for help. Correct '?' typo to 'h'. - (longopts): Add version option. - (opts): Add 'v' version option. - (print_version): New function. - (main): Accommodate new version option. Accommodate usage parameter - changes. Use usage to output help message. - -2002-03-15 Corinna Vinschen <corinna@vinschen.de> - - * mkgroup.c (main): When generating group 513, check for computer's - primary domain instead of current user's domain. - -2002-03-14 Corinna Vinschen <corinna@vinschen.de> - - * mkgroup.c (main): When generating group 513, check for domain SID - if computer name isn't mapped to a SID. - -2001-03-11 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * kill.cc (usage): Move to top of file. - (getsig): Ditto. - (forcekill): Ditto. - -2002-03-06 Christopher Faylor <cgf@redhat.com> - - * cygcheck.cc: Reformat. - -2002-03-06 Christopher Faylor <cgf@redhat.com> - - * cygcheck.cc (longopts): Use correct short option for --version. - -2002-03-06 Christopher Faylor <cgf@redhat.com> - - * cygpath.cc: Reformat. - -2002-02-27 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * cygpath.cc (print_version): New function. - (main): Accommodate new version function. Initialize 'o' to prevent - warning. - -2002-02-27 Christopher Faylor <cgf@redhat.com> - - * cygcheck.cc (main): Eliminate non-GNU formatting glitch. - -2002-02-27 Christopher Faylor <cgf@redhat.com> - - * ssp.c (help_desk): Fix compiler warning. - -2002-02-27 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - Christopher Faylor <cgf@redhat.com> - - Change appropriate globals to statics throughout. - * cygcheck.cc (usage): Simplify usage output. Generalize to allow use - for help. - (longopts): Add version option. - (opts): Add 'V" version option. - (print_version): New function. - (main): Accommodate new version option. Accommodate usage parameter - changes. Use usage to output help message. - -002-02-19 Christopher Faylor <cgf@redhat.com> - - * Makefile.in (CXXFLAGS): Add override so that HAVE_DECL_GETOPT is - defined. - (libbfd): Use -B rather than -L so that bfd from build directory is - correctly found. - (libintl): Ditto. - -2002-02-15 Christopher Faylor <cgf@redhat.com> - - * mount.cc (usage): Fix typo in output. - -2002-02-14 Christopher Faylor <cgf@redhat.com> - - * strace.cc (attach_process): Change CW_STRACE_ON to CW_STRACE_TOGGLE. - -2002-01-31 Corinna Vinschen <corinna@vinschen.de> - - * mkpasswd.c (main): Set default home path for 9x/Me if --path-to-home - isn't given. - -2002-01-30 Corinna Vinschen <corinna@vinschen.de> - - * passwd.cc (ChangePW): Add parameter to differ between called for - checking old password and called for changing password. If called - for checking old password, return non-zero only if password is surely - incorrect. - (main): Call ChangePW() with additional parameter. - -2002-01-29 Christopher Faylor <cgf@redhat.com> - - * dump_setup.cc (parse_filename): Don't consider '_' part of the - version. - -2002-01-28 Christopher Faylor <cgf@redhat.com> - - * cygcheck.cc: Fix typo. Remove uid_t kludge. Rely on kludge in - sys/cygwin.h instead. - * getfacl.c: Add include to remove warning. - * mkgroup.c (main): Assign variables outside of parameter passing. - This seems to eliminate some compiler warnings. - -2002-01-28 Christopher Faylor <cgf@redhat.com> - - * cygcheck.cc: Use specific cygwin includes, as required. - -2002-01-28 Christopher Faylor <cgf@redhat.com> - - * Makefile.in (MINGW_INCLUDES): Change cygwin include. - * strace.cc: Use specific cygwin includes, as required. - (load_cygwin): New function. Loads cygwin DLL, if necessary. - (attach_process): Attaches strace to a running process. - (dostrace): Accept pid argument. Attach to pid if supplied. - (usage): Describe -p option. Correct system description. - (longopts): Alphabetize. - (opts): Ditto. - (main): Ditto. Handle -p option. - -2002-01-21 Christopher Faylor <cgf@redhat.com> - - * Makefile.in (CXXFLAGS): Ensure that important settings are preserved - even when overriden by command line. - -2002-01-21 Christopher Faylor <cgf@redhat.com> - - * Makefile.in: Build intermediate cygcheck.o to force use of MINGW_CXXFLAGS. - * cygcheck.cc (cygwin_info): Intitialize variable to quiet g++ warning. - (dump_sysinfo): Make variables unsigned to quiet g++ warnings. - * strace.cc (version_string): Rename from SCCSid. - (add_child): Remove unused variable. - (version): Use version_string. Avoid use of fprintf. - -2002-01-21 DJ Delorie <dj@redhat.com> - - * Makefile.in: Use CXX instead of CC to compile C++ sources. - -2002-01-17 DJ Delorie <dj@redhat.com> - - * cygcheck.cc (already_did): Avoid default constructors, which may - require exception support. - -2001-01-16 Joshua Daniel Franklin <joshuadfranklin@yahoo.com> - - * cygpath.cc (main): Add options to show Desktop and Start - Menu's Programs directory for current user or all users. - Move bulk of DPWS options outside the getopt case statement. - * utils.sgml: Update cygpath section for ADPWS options. - -2002-01-15 Joerg Schaible <joerg.schaible@gmx.de> - - * cygpath.cc (doit): Empty file ignored using option -i. - -2002-01-15 Mark Bradshaw <bradshaw@crosswalk.com> - - * mkpasswd.c (print_win_error): Add a new function. - (enum_users): Use print_win_error. - (enum_local_groups): Ditto. - (main): Ditto. - -2001-12-26 Jonathan Kamens <jik@curl.com> - - * cygpath.cc (doit): Detect and warn about an empty path. Detect and - warn about errors converting a path. - (main): Set prog_name correctly -- don't leave an extra slash or - backslash at the beginning of it. - -Fri Dec 14 14:04:37 2001 Jason Tishler <jason@tishler.net> - - * mkpasswd.c (enum_users): Change to unconditionally use - the --path-to-home option, if supplied by the user. Use default - --path-to-home option value, if appropriate. - (usage): Change usage statement to reflect new semantics. - (main): Remove defaulting of the --path-to-home option. - -Fri Dec 14 12:10:39 2001 Jason Tishler <jason@tishler.net> - - * mkpasswd.c (opts): Add indication that '-p' option requires an - argument. - -2001-12-11 Christopher Faylor <cgf@redhat.com> - - * Makefile.in: Add define to CXXFLAGS. - -2001-12-03 Christopher Faylor <cgf@redhat.com> - - * cygcheck.cc (usage): Add -c description. - * cygpath.cc (usage): Alphabetize options. - * strace.cc (usage): Ditto. - -2001-11-21 Christopher Faylor <cgf@redhat.com> - - * path.cc (cygpath): Don't consider cygdrive stuff when trying to derive - native paths. - -2001-11-20 Mark Bradshaw <bradshaw@staff.crosswalk.com> - - * mkpasswd.c: include lmerr.h - (main): New -u option to allow specifying a - specific user. If specified, groups aren't displayed and - output is limited to only the specified user. - (enum_users): If specific user is specified, via -u option, - display only that user's record. With -u use NetUserGetInfo - instead of NetUserEnum. - (load_netapi): Added netusergetinfo. - -2001-11-15 Gary R. Van Sickle <g.r.vansickle@worldnet.att.net> - - * strace.cc (main): Change getopt() to getopt_long(). - Add support for help and version info. - Use new parse_mask() function for -m/--mask option. - (longopts): Add long options structure. - (opts): Move options string from getopts call to static var. - (usage): Print usage information. - (SCCSid): Version info. - (version): New function for displaying version info. - (parse_mask): New function supporting parsing of mnemonics, - hex, and basic expressions in masks. - (mnemonic2ul): New mnemonic parsing function. - (tag_mask_mnemonic): New type. - (mnemonic_table): New table of mnemonics for mnemonic2ul() to - search through. - -2001-11-12 Corinna Vinschen <corinna@vinschen.de> - - * cygcheck.cc (dump_sysinfo): Redefine output format slightly. - Print correct build number on 9x/ME systems. - -2001-11-12 Christopher Faylor <cgf@redhat.com> - - * cygcheck.cc (main): Slight formatting tweak. - -2001-11-12 Corinna Vinschen <corinna@vinschen.de> - - * cygcheck.cc (dump_sysinfo): Add some more details. - -2001-11-12 Corinna Vinschen <corinna@vinschen.de> - - * cygcheck.cc (dump_sysinfo): Print more detailed OS information string - using OSVERSIONINFOEX information. - -2001-11-11 Christopher Faylor <cgf@redhat.com> - - * path.h: New file. - -2001-11-11 Christopher Faylor <cgf@redhat.com> - - * cygcheck.cc (scan_registry): Open registry with read-only access. - (main): Reflect argument change for dump_setup. - * dump_setup.cc (dump_setup): Add preliminary extra argument for future - use. - * path.cc (read_mounts): Open registry with read-only access. - -2001-11-11 Christopher Faylor <cgf@redhat.com> - - * cygcheck.cc (main): Display package info when '-s' is specified. - * dump_setup.cc (dump_setup): Change header. Remove typo. Always sort - packages output. - -2001-11-11 Christopher Faylor <cgf@redhat.com> - - * dump_setup.cc: New file. - * Makefile.in: Add info for dump_setup.o. - * cygcheck.cc (main): Recognize '-c' option for checking setup - installed base. - * path.cc (cygpath): Read mount table if not loaded. - -2001-11-10 Christopher Faylor <cgf@redhat.com> - - * Makefile.in (cygcheck.exe): Compile as -mno-cygwin executable. - * path.cc: New file. - * cygcheck.cc (init_paths): Use MS-DOS path syntax. - (cygwin_info): Properly display cygwin version numbers. Prettify some - output. - (dump_sysinfo): Calculate max names of posix and ms-dos paths for - prettier output. - -2001-11-09 Corinna Vinschen <corinna@vinschen.de> - - * cygcheck.cc (dump_sysinfo): Print more detailed OS information string. - -2001-11-04 Corinna Vinschen <corinna@vinschen.de> - - * getfacl.c (username): New function. - (groupname): Ditto. - (usage): Ditto. Add more user friendly help text. - (main): Add -n and --help option. Print names instead of IDs - unless -n option is given. - * setfacl.c (getperm): Tolerate whitespace and comment chars in input. - (getaclentry): Fix several input string misdetections. - (getaclentries): Allow - as input file name to read from stdin. - Tolerate whitespace and comment chars in input. - (usage): Add more user friendly help text. - (main): Add --help option. - -2001-11-04 Egor Duda <deo@logos-m.ru> - - * strace.cc (main): New option '-w'. Start traced process in separate - window. New option '-S x'. Flush buffered output every x seconds. - (create_child): Start child process in new window, when requested. - When requested, periodically flush debugging output. - -2001-10-24 Christopher Faylor <cgf@redhat.com> - - * Makefile.in: Remove EXEEXT consideration. We always need .exe - extensions. - -2001-10-20 Corinna Vinschen <corinna@vinschen.de> - - * mkgroup.c: Avoid compiler warnings. - (print_special): New function. - (main): Print special accounts by calling print_special(). - * mkpasswd.c: Avoid compiler warnings. - (enum_users): Print additional U-domain\username info in gecos - field when SIDs are printed. - (print_special): New function. - (main): Print special accounts by calling print_special(). - -2001-10-15 Christopher Faylor <cgf@redhat.com> - - * mkpasswd.cc (enum_users): Shorten "unused" passwd field. - -2001-10-13 Christopher Faylor <cgf@redhat.com> - - * Makefile.in: Allow stdinc searching for dumper. - -Tue Oct 9 21:59:00 2001 Christopher Faylor <cgf@cygnus.com> - - * Makefile.in (MINGW_INCLUDES): Accommodate changes in Makefile.common. - -Sun Oct 7 23:06:39 2001 Christopher Faylor <cgf@cygnus.com> - - * kill.cc (main): Set exit value to 1 on invalid pid. Perform minor - cleanup. - -Fri Sep 21 20:40:30 2001 Christopher Faylor <cgf@cygnus.com> - - * Makefile.in (mingw_getopt.o): Ensure that newlib include directories - are not searched. - -Thu Sep 20 21:00:20 2001 Christopher Faylor <cgf@cygnus.com> - - * Makefile.in (MINGW_INCLUDES): Still need cygwin/include directory. - -Wed Sep 19 12:22:08 2001 Christopher Faylor <cgf@cygnus.com> - - * Makefile.in: Filter newlib includes from mingw compilation. - -2001-09-14 Egor Duda <deo@logos-m.ru> - - * dumper.cc (dumper::dumper): Print error code in case of error. - (dumper::add_thread): Ditto. - (dumper::collect_memory_sections): Ditto. - (dumper::dump_memory_region): Ditto. - (dumper::collect_process_information): Ditto. - (print_section_name): Fix formatting. - -2001-09-13 Egor Duda <deo@logos-m.ru> - - * dumper.cc (main): Properly recognize negative pids (used by w9x). - -2001-09-09 Egor Duda <deo@logos-m.ru> - - * dumper.cc (main): Change command-line arguments format to be - similar to gdb. Allow adding error_start=x:\path\to\dumper.exe to - CYGWIN environment variable to perform core dumping in case of - program crash. - (usage): Ditto. - -Wed Sep 5 22:37:21 2001 Christopher Faylor <cgf@cygnus.com> - - * Makefile.in (dumper): Change logic for libbfd and libintl so that - they will be found either in the build tree or the installed directory. - * mkpasswd.c (enum_users): Add a comment as a password for NT. - -2001-09-03 Michael A Chase <mchase@ix.netcom.com> - - * mount.cc (mount_commands): Don't write /cygdrive/u mount points. - -2001-09-03 Michael A Chase <mchase@ix.netcom.com> - - * mount.cc (longopts): Add mount-commands to options list. - (usage): Add mount-commands option. - (mount_commands): New function. Write commands to recreate current - mounts. - -Sat Sep 1 15:58:11 2001 Christopher Faylor <cgf@cygnus.com> - - * mount.cc (main): Eliminate excess arguments in printf. - -2001-08-30 Egor Duda <deo@logos-m.ru> - - * dumper.h: Update copyright notice. - * dumper.cc: Ditto. - * dumper.cc: (dumper::print_core_section_list): New function. - * dumper.h: (dumper::print_core_section_list): Declare it. - * dumper.cc (print_section_name): New function. - (dumper::collect_process_information): Augment debugging output. - Stop debugee processing if it posts double exception. - (usage): Fix typo in option name. - -Tue Aug 28 14:45:02 2001 Christopher Faylor <cgf@cygnus.com> - - * mount.cc (main): Issue correct warning for 'not enough arguments'. - -2001-08-14 Joerg Schaible <joerg.schaible@gmx.de> - - * cygpath.cc (main): Support -w for Windows (System) directories and - return physical correct orthography for the Windows System dir. - -2001-07-14 Chris Genly <chgenly@alum.mit.edu> - - * regtool.cc (find_key): Handle keys with only one subkey. - -Wed Jun 27 22:46:10 2001 Christopher Faylor <cgf@cygnus.com> - - * regtool.cc (find_key): Revert previous change. - -Wed Jun 27 13:37:41 2001 Keith Starsmeare" <keith_starsmeare@yahoo.co.uk> - - * regtool.cc (find_key): Allow '/' as a synonym for '\\'. - -Fri Jun 15 00:49:21 2001 Christopher Faylor <cgf@cygnus.com> - - * mkpasswd.c (main): Output passwd file in binary mode so that there - are no CRs in the file. - * umount.cc (remove_all_user_mounts): Don't try to remove /cygdrive - mounts. - -Tue May 1 10:50:48 2001 Christopher Faylor <cgf@cygnus.com> - - * mkpasswd.c (enum_users): Use /bin/bash as the default shell. - (main): Ditto. - -Sat Apr 28 22:32:01 2001 Christopher Faylor <cgf@cygnus.com> - - * passwd.cc (ttymnam): New function. - (main): Use ttynam() to report name of tty. - -2001-04-19 Egor Duda <deo@logos-m.ru> - - * dumper.cc (dumper::init_core_dump): Set architecture field in dump - header. - -Mon Apr 16 15:08:00 2001 Corinna Vinschen <vinschen@redhat.com> - - * mkgroup.c: Add function pointers `netlocalgroupgetmembers' and - `netgroupgetusers'. - (load_netapi): Load function pointers `netlocalgroupgetmembers' - and `netgroupgetusers'. - (enum_local_users): New function. - (enum_local_groups): Call `enum_local_users' for each group if - `print_users' is set. - (enum_users): New function. - (enum_groups): Call `enum_users' for each group if `print_users' is set. - (usage): Add usage text for `-u/--users'. - (longopts): Add option `--users'. - (opts): Add option character `u'. - (main): Set `print_users' according to option `-u/--users'. - Call `enum_local_groups' and `enum_groups' with additional parameter - `print_users'. - -2001-04-15 Michael A Chase <mchase@ix.netcom.com> - - * mount.cc (longopts): Add help to options list. - (opts): Add 'h' to options string. - * umount.cc (longopts): Add help to options list. - (opts): Add 'h' to options string and change 'R' to 'A'. - -2001-04-13 Kazuhiro Fujieda <fujieda@jaist.ac.jp> - - * mkgroup.c (enum_groups): Use RID + offset specified an additional - argument as ID. - (usage): Add description of -o option. - (longopts, opts): Add specifications of -o/--id-offset option. - (main): Add -o option. Invoke enum_groups with specified offset. - * mkpasswd.c (enum_users): Just like mkgroup.c. - (usage, longopts, opts): Ditto. - (main): Add -o option. Invoke enum_users with specified offset only - against domain accounts. - -2001-04-11 Egor Duda <deo@logos-m.ru> - - * mkgroup.c (uni2ansi): Use native method to convert from Unicode - to multi-byte strings. - * mkpasswd.c (uni2ansi): Ditto. - (enum_users): Pass buffer size when converting string. - (enum_local_groups): Ditto. - * mkgroup.c (enum_groups): Ditto. - (enum_local_groups): Ditto. - -Mon Apr 2 22:41:33 2001 Christopher Faylor <cgf@cygnus.com> - - * mount.cc (main): Use getopt_long for parsing arguments. - (usage): Reformat, show long and short options. - * umount.cc (main): Ditto, all of the above. - -Mon Apr 2 10:58:26 2001 Christopher Faylor <cgf@cygnus.com> - - * mount.cc (show_mounts): Change format string to more closely resemble - UNIX when displaying mount table. - -Sat Mar 17 21:46:06 2001 Christopher Faylor <cgf@cygnus.com> - - * kill.cc (forcekill): Use dwProcessId when opening a process, not the - Cygwin pid. - -Mon Mar 5 18:50:00 2001 Corinna Vinschen <vinschen@redhat.com> - - * getfacl.c: Add copyright hint. - * setfacl.c: Ditto. - * strace.cc: Ditto. - -Tue Jan 09 10:26:23 2001 Tony Sideris <tonys1110@home.com> - - * regtool.cc (cmd_list): Add new registry display options. - (cmd_list): Add code to implement -p, -k, and -l options. - - * regtool.cc (Fail): Add call to LocalFree to free memory allocated by - FormatMessage. - -Wed Jan 10 09:16:57 2001 Christopher Faylor <cgf@cygnus.com> - - * regtool.cc (translate): Ensure that 'c' is initialized. - (cmd_set): Ditto for rv. diff --git a/winsup/utils/ChangeLog-2000 b/winsup/utils/ChangeLog-2000 deleted file mode 100644 index 7ea5ae186..000000000 --- a/winsup/utils/ChangeLog-2000 +++ /dev/null @@ -1,347 +0,0 @@ -Fri Dec 15 23:41:48 2000 Christopher Faylor <cgf@cygnus.com> - - * cygcheck.cc (cygwin_info): Add some more bounds checking. - -Fri Dec 15 23:41:34 2000 Christopher Faylor <cgf@cygnus.com> - - From Matt Harget <matt@use.net>: - * utils/cygcheck.cc (keyeprint): Move declaration before other - functions so it could be used by all functions to report error - messages. Add comment. - (add_path): Check for NULL return from malloc. - (find_on_path): Check initial uses of pointers for NULL. - (rva_to_offset): Ditto. - (init_paths): Add checking for return values of Win32 calls. - (get_dword): Ditto. - (get_word): Ditto. - (dll_info): Ditto, also add NULL pointer checks. - (scan_registry): Ditto. - (check_keys): Ditto. - (dump_sysinfo): Ditto. Add default case to switch. Add error - reporting if GetVolumeInformation fails, except when it - returns ERROR_NOT_READY. - (track_down): Add checking for NULL pointers and - return values of Win32 calls. - (cygwin_info): Ditto. Correct small memory leak. - -Sun Dec 10 19:08:58 2000 Christopher Faylor <cgf@cygnus.com> - - * Makefile.in: Compile/link dumper.exe with c++. - -Tue Dec 7 11:15:00 2000 Corinna Vinschen <corinna@vinschen.de> - - * mkpasswd.c: Slight formatting changes to the below patch. - (longopts): Fix typo in `local-groups' option. - (main): Initialize `passed_home_path' before first usage. - -Tue Dec 7 11:15:00 2000 Chris Abbey <cabbey@bresnanlink.net> - - * mkpasswd.c: make default home directory /home/$user if one - can't be found in user registry. Allow user to override - that with command line arg. - -Sun Dec 3 00:40:47 2000 Christopher Faylor <cgf@cygnus.com> - - * Makefile.in: Use CXX to build the DLL. - * configure.in: Find correct c++ compiler. - * configure: Regenerate. - -Sat Nov 18 23:53:59 2000 Christopher Faylor <cgf@cygnus.com> - - * utils.sgml: Document new options for ps and strace. - -Wed Nov 8 08:49:27 2000 Jason Tishler <jt@dothill.com> - - * mount.cc (main): Call show_cygdrive_info instead of - show_cygdrive_prefixes. - * mount.cc (show_cygdrive_prefixes): Remove function. - * mount.cc (show_cygdrive_info): New function. Actually, - show_cygdrive_info is really an enhanced version of - show_cygdrive_prefixes renamed to show_cygdrive_info that also displays - the user and system flags. - -Wed Nov 8 15:52:00 2000 Corinna Vinschen <corinna@vinschen.de> - - * mkgroup.c (load_netapi): New function to load netapi32.dll functions - dynamically so that mkgroup works on 9x/ME as well. - Use corresponding function pointers throughout. - (usage): Change to `int'. Change text to be conformant to mkpasswd. - (main): Use `getlongopt' to process options. - Special handling to create a group entry on 9x/ME. - * mkpasswd.c (load_netapi): New function to load netapi32.dll functions - dynamically so that mkpasswd works on 9x/ME as well. - Use corresponding function pointers throughout. - (usage): Change to `int'. Change text to be conformant to mkgroup. - (main): Use `getlongopt' to process options. - Special handling to create a passwd entry on 9x/ME. - Change conditional to create an entry for the local administrators - group when appropriate. - -Thu Nov 2 2:01:00 2000 Corinna Vinschen <corinna@vinschen.de> - - * kill.cc (main): Return 1 in case of errors. - -Sat Oct 28 01:37:55 2000 Christopher Faylor <cgf@cygnus.com> - - * Makefile.in: Accomodate newer gcc's which require linking of c++ - programs with g++. Fixup output for some compilations. - * cygcheck.cc: Respond to compiler warnings. - * dumper.cc (main): Ditto. - * parse_pe.cc (exclusion::sort_and_check): Ditto. - * setfacl.cc (getaclentry): Ditto. - -Fri Oct 27 20:20:29 2000 Christopher Faylor <cgf@cygnus.com> - - * strace.cc (main): Add a '-b' option. - -2000-10-18 DJ Delorie <dj@redhat.com> - - * ssp.c: new - * ssp.txt: new - * Makefile.in: build ssp.exe - -Wed Oct 18 18:57:46 2000 Christopher Faylor <cgf@cygnus.com> - - * ps.cc (main): Add some extra space to Windows pid output for - Windows 95. - -Tue Oct 17 23:49:04 2000 Christopher Faylor <cgf@cygnus.com> - - * ps.cc (main): Add some extra space to pid output for Windows 95. - -Tue Oct 17 1:09:00 2000 Corinna Vinschen <corinna@vinschen.de> - - Patch suggested by Brad Town <btown@ceddec.com>: - * cygcheck.cc (main): Fix argument counting. - -Sat Oct 14 23:42:58 2000 Christopher Faylor <cgf@cygnus.com> - - * ps.cc (main): Accomodate new PID_ constant. - -Thu Oct 12 02:19:12 2000 Christopher Faylor <cgf@cygnus.com> - - * strace.cc (proc_child): Handle exceptions correctly. - -Sun Oct 8 23:11:17 2000 Christopher Faylor <cgf@cygnus.com> - - * ps.cc (main): Change order of reporting slightly so that windows pids - are more obvious. - * strace.cc (add_child): Just add child's pid directly. - (remove_child): No need to close the child process pid since - ContinueDebugEvent does that automatically. - (proc_child): Ditto for child thread. - -Fri Sep 29 13:12:00 2000 Corinna Vinschen <corinna@vinschen.de> - - * cygcheck.cc (keyeprint): New function. - (check_keys): New function. Perform checking keycodes. - (main): Add option `-k' for invoking check_keys. - Change option processing to use long options and getopt_long. - * cygkeycheck.cc: Removed. Functionality moved to `cygcheck.cc'. - * Makefile.in: Remove cygkeycheck from the dependencies. - -Wed Sep 27 16:24:00 2000 Corinna Vinschen <corinna@vinschen.de> - - * cygkeycheck.cc: New file. Utility to retrieve keycodes. - * Makefile.in: Add cygkeycheck to the dependencies. - -2000-09-15 Joerg Schaible <joerg.schaible@gmx.de> - - * cygpath.cc: Add new options: -s and -i. - * utils.sgml: Document the new options. - -Tue Sep 12 22:45:28 2000 Christopher Faylor <cgf@cygnus.com> - - * kill.cc (main): Change behavior of -f so that it will force the - killing of a cygwin process after waiting 2 tenths of a second for it - to terminate. - (forcekill): Add an extra argument determining whether to wait for the - process to exit. - -Sun Sep 10 12:50:02 2000 Christopher Faylor <cgf@cygnus.com> - - * Makefile.in: Refine dumper.exe message. - -Mon Aug 28 21:55:56 2000 Christopher Faylor <cgf@cygnus.com> - - * kill.c (main): Avoid skipping next argument when a signal number is - specified. - * Makefile.in: Always clean dumper.exe. - -Fri Aug 25 12:41:53 2000 Christopher Faylor <cgf@cygnus.com> - - * Makefile.in: Only build dumper.exe when all of its library and - include dependencies are available. - -Fri Aug 25 11:44:29 2000 Christopher Faylor <cgf@cygnus.com> - - * Makefile.in: Make failure to build dumper.exe a non-error. - -Thu Aug 24 18:02:35 2000 Christopher Faylor <cgf@cygnus.com> - - * ps.cc (main): Always print a cygwin process using cygwin paths. - -2000-08-24 Egor Duda <deo@logos-m.ru> - - * Makefile.in: Add dumper.exe target and associated mechanisms for building it. - * dumper.cc: New file. - * dumper.h: New file. - * module_info.cc: New file. - * parse_pe.cc: New file. - -Mon Jul 31 15:12:00 2000 Corinna Vinschen <corinna@vinschen.de> - - * passwd.c (main): Initialize oldpwd before beeing used. - -Sat Jul 29 00:44:46 2000 Christopher Faylor <cgf@cygnus.com> - - * kill.cc (main): Add '-f' option to force termination of a process. - (forcekill): New function. - * ps.cc (main): Add '-W' option to list Windows pids as well as Cygwin - pids. - (dummyprocessmodules): New function. - (GetModuleFileNameEx95): New function. - (init_win): New function. - (to_time_t): New function. - -Thu Jul 27 22:54:28 2000 Jason Tishler <jt@dothill.com> - - * utils/mount.cc (main): Add --show-cygdrive-prefixes option. - (show_cygdrive_prefixes): New function. - * utils/umount.cc (main): Add --remove-cygdrive-prefix option. - (error): Change signature from 'char *' to 'const char *'. - (remove_cygdrive_prefix): New function. - -Thu Jul 13 22:24:00 2000 Corinna Vinschen <corinna@vinschen.de> - - * mount.cc (mount_already_exists): Slightly rearrange. - Change message texts. - -Thu Jul 13 13:02:00 2000 Corinna Vinschen <corinna@vinschen.de> - - * mount.cc (mount_already_exists): Additional warning message - if mount point exists with another mount type. - -Sat Jul 1 00:19:27 2000 Christopher Faylor <cgf@cygnus.com> - - * Makefile.in: Find getopt.c in cygwin/lib subdirectory. - -Sat Jun 24 23:16:33 2000 Christopher Faylor <cgf@cygnus.com> - - * cygcheck.cc (cygwin_info): New function. Scans DLL for Cygwin - version info. - (dll_info): Add path parameter for checking "cygwin1.dll". - (track_down): Accomodate additional parameter for dll_info. - (ls): Ditto. - (dump_sys_info): Always print cygwin1.dll last. - -2000-06-07 Kazuhiro Fujieda <fujieda@jaist.ac.jp> - - * mount.cc (error): New function to report an error and exit. - * umount.cc (error): Ditto. - (remove_all_automounts): Check return status of cygwin_umount. - (remove_all_user_mounts): Ditto. - (remove_all_system_mounts): Ditto. - -2000-06-05 DJ Delorie <dj@cygnus.com> - - * mount.cc: add stdlib.h for exit - * umount.cc: ditto - * strace.cc: add #define for alloca - -Fri May 20 0:01:00 2000 Corinna Vinschen <corinna@vinschen.de> - - * regtool.cc (find_key): Add parameter `access'. - Call `RegOpenKeyEx' with that desired access. - (cmd_add, cmd_remove, cmd_set, cmd_unset): Call - `find_key' with KEY_ALL_ACCESS access. - (cmd_list, cmd_check, cmd_get): Call `find_key' - with KEY_READ access. - -2000-05-19 DJ Delorie <dj@cygnus.com> - - * cygpath.cc: add --windir/--sysdir options - * utils.sgml: and document them - -Thu May 18 14:38:26 2000 Christopher Faylor <cgf@cygnus.com> - - * Makefile.in: Eliminate WINSUP_DEPS. - * cygpath.cc: Reorganize includes to accomodate sys/cygwin.h changes. - * mkgroup.c: Ditto. - * mkpasswd.c: Ditto. - * mount.cc: Ditto. Eliminate use of cygwin source specific includes. - * ps.cc: Ditto. - * cygwin.cc: Eliminate obsolete file. - -Wed Apr 26 23:43:25 2000 Christopher Faylor <cgf@cygnus.com> - - * mount.cc (main): Add "-X" option to specify a "Cygwin executable". - -Sat Apr 15 23:34:00 2000 Corinna Vinschen <corinna@vinschen.de> - - * mkpasswd.c (main): Use GetDCName instead of GetAnyDCName. - Don't create extra passwd entry for administrators group - if local_groups is set. - (usage): Change usage text slightly. - (enum_users): Loop while ERROR_MORE_DATA is returned. - (enum_local_groups): Ditto. - * mkgroup.c (enum_local_groups): Ditto. - (enum_groups) Ditto. - (usage): Change usage text slightly. - -Thu Apr 13 01:22:35 2000 Christopher Faylor <cgf@cygnus.com> - - * cygpath.cc (main): Add -a -o and -c options. - (doit): Ditto. - -Mon Apr 10 22:56:07 2000 Christopher Faylor <cgf@cygnus.com> - - * cygpath.cc (main): Add -f option for processing a group of paths from - a file. - (doit): New function. - -Sat Mar 18 22:52:37 2000 Christopher Faylor <cgf@cygnus.com> - - Patch suggested by Mumit Khan <khan@xraylith.wisc.edu>: - * strace.cc (_impure_ptr): New global variable to make strace build - under Cygwin gcc. - -Sat Mar 18 12:45:10 2000 Christopher Faylor <cgf@cygnus.com> - - * Makefile.in: Make CXXFLAGS consistent with cygwin. - -Wed Mar 15 00:53:58 2000 Christopher Faylor <cgf@cygnus.com> - - * Makefile.in: Use MINGW_CXXFLAGS when compiling strace. - -Sun Mar 12 21:22:25 2000 Christopher Faylor <cgf@cygnus.com> - - * strace.cc: Throughout, track information like start_time, etc. on a - per-process basis. - -Sun Feb 27 23:37:32 2000 Christopher Faylor <cgf@cygnus.com> - - * strace.cc (handle_output_debug_string): Parse strace output to allow - various types of time output. - -Fri Jan 21 02:10:26 Corinna Vinschen <corinna@vinschen.de> - - * utils/regtool.cc (translate): Added unix like backslash - processing. - -2000-01-20 Corinna Vinschen <corinna@vinschen.de> - - * regtool.cc: allow forward slashes as key separators - -2000-01-19 DJ Delorie <dj@redhat.com> - - * regtool.cc: New file. - * Makefile.in: add regtool - * utils.sgml: add regtool - -Sat Jan 8 17:13:51 2000 Christopher Faylor <cgf@cygnus.com> - - * getfacl.c: New file. - * setfacl.c: New file. - * Makefile.in: Add getfacl.exe and setfacl.exe to list of PROGS. - Fix link flags in MINGW case. diff --git a/winsup/utils/Makefile.in b/winsup/utils/Makefile.in deleted file mode 100644 index e6069891f..000000000 --- a/winsup/utils/Makefile.in +++ /dev/null @@ -1,217 +0,0 @@ -# Makefile for Cygwin utilities -# Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - -# This file is part of Cygwin. - -# This software is a copyrighted work licensed under the terms of the -# Cygwin license. Please consult the file "CYGWIN_LICENSE" for -# details. - -SHELL:=@SHELL@ - -srcdir:=@srcdir@ -VPATH:=@srcdir@ -prefix:=@prefix@ -exec_prefix:=@exec_prefix@ - -bindir:=@bindir@ -etcdir:=$(exec_prefix)/etc -program_transform_name:=@program_transform_name@ - -override INSTALL:=@INSTALL@ -override INSTALL_PROGRAM:=@INSTALL_PROGRAM@ -override INSTALL_DATA:=@INSTALL_DATA@ - -EXEEXT:=@EXEEXT@ -EXEEXT_FOR_BUILD:=@EXEEXT_FOR_BUILD@ - -CC:=@CC@ -CC_FOR_TARGET:=$(CC) -CXX:=@CXX@ -CXX_FOR_TARGET:=$(CXX) - -CFLAGS:=@CFLAGS@ -CXXFLAGS:=@CXXFLAGS@ -override CXXFLAGS+=-fno-exceptions -fno-rtti -DHAVE_DECL_GETOPT=0 - -include $(srcdir)/../Makefile.common - -LIBICONV:=@libiconv@ -libbfd:=${shell $(CC) -B$(bupdir2)/bfd/ --print-file-name=libbfd.a} -libintl:=${shell $(CC) -B$(bupdir2)/intl/ --print-file-name=libintl.a} -build_dumper:=${shell test -r $(libbfd) -a -r $(libintl) -a -n "$(LIBICONV)" && echo 1} - -libz:=${shell x=$$($(CC) -mno-cygwin --print-file-name=libz.a); cd $$(dirname $$x); dir=$$(pwd); case "$$dir" in *mingw*) echo $$dir/libz.a ;; esac} -zlib_h:=-include ${patsubst %/lib/mingw/libz.a,%/include/zlib.h,${patsubst %/lib/libz.a,%/include/zlib.h,$(libz)}} -zconf_h:=${patsubst %/zlib.h,%/zconf.h,$(zlib_h)} -ifeq "${libz}" "" -zlib_h:= -zconf_h:= -libz:= -endif - -DUMPER_INCLUDES:=-I$(bupdir2)/bfd -I$(updir1)/include - -libcygwin:=$(cygwin_build)/libcygwin.a -libuser32:=$(w32api_lib)/libuser32.a -libkernel32:=$(w32api_lib)/libkernel32.a -ALL_DEP_LDLIBS:=$(libcygwin) $(w32api_lib)/libnetapi32.a \ - $(w32api_lib)/libadvapi32.a $(w32api_lib)/libkernel32.a \ - $(w32api_lib)/libuser32.a - -ALL_LDLIBS:=${patsubst $(w32api_lib)/lib%.a,-l%,\ - ${filter-out $(libuser32),\ - ${filter-out $(libkernel32),\ - ${filter-out $(libcygwin), $(ALL_DEP_LDLIBS)}}}} - -MINGW_LIB:=$(mingw_build)/libmingw32.a -DUMPER_LIB:=${libbfd} ${libintl} -L$(bupdir1)/libiberty $(LIBICONV) -liberty -MINGW_LDLIBS:=${filter-out $(libcygwin),$(ALL_LDLIBS) $(MINGW_LIB)} -MINGW_DEP_LDLIBS:=${ALL_DEP_LDLIBS} ${MINGW_LIB} -ALL_LDFLAGS:=-B$(newlib_build)/libc -B$(w32api_lib) $(LDFLAGS) $(ALL_LDLIBS) -DUMPER_LDFLAGS:=$(ALL_LDFLAGS) $(DUMPER_LIB) -MINGW_CXX:=${patsubst %/cygwin/include,%/mingw/include,${filter-out -I$(newlib_source)/%,$(COMPILE_CXX)}} -I$(updir) - -PROGS:= cygcheck.exe cygpath.exe getfacl.exe kill.exe mkgroup.exe \ - mkpasswd.exe mount.exe passwd.exe ps.exe regtool.exe setfacl.exe \ - ssp.exe strace.exe umount.exe ipcrm.exe ipcs.exe - -CLEAN_PROGS:=$(PROGS) -ifndef build_dumper -PROGS:=warn_dumper $(PROGS) -else -PROGS+=dumper$(EXEEXT) -CLEAN_PROGS+=dumper.exe -endif - -.SUFFIXES: -.NOEXPORT: - -.PHONY: all install clean realclean warn_dumper - -all: Makefile $(PROGS) - -strace.exe: strace.o path.o $(MINGW_DEP_LDLIBS) -ifdef VERBOSE - $(CXX) $(MINGW_CXXFLAGS) -o $@ ${wordlist 1,2,$^} -B$(mingw_build)/ $(MINGW_LDFLAGS) -else - @echo $(CXX) -o $@ ${wordlist 1,2,$^} ${filter-out -B%, $(MINGW_CXXFLAGS) $(MINGW_LDFLAGS)};\ - $(CXX) $(MINGW_CXXFLAGS) -o $@ ${wordlist 1,2,$^} -B$(mingw_build)/ $(MINGW_LDFLAGS) -endif - -cygcheck.exe: cygcheck.o path.o dump_setup.o $(MINGW_DEP_LDLIBS) -ifeq "$(libz)" "" - @echo '*** Building cygcheck without package content checking due to missing mingw libz.a.' -endif -ifdef VERBOSE - $(CXX) $(MINGW_CXXFLAGS) -o $@ ${wordlist 1,3,$^} -B$(mingw_build)/ $(MINGW_LDFLAGS) $(libz) -else - @echo $(CXX) -o $@ ${wordlist 1,3,$^} ${filter-out -B%, $(MINGW_CXXFLAGS) $(MINGW_LDFLAGS)} $(libz);\ - $(CXX) $(MINGW_CXXFLAGS) -o $@ ${wordlist 1,3,$^} -B$(mingw_build)/ $(MINGW_LDFLAGS) $(libz) -endif - -dumper.o: dumper.cc dumper.h -ifdef VERBOSE - ${filter-out -nostdinc,$(COMPILE_CXX)} $c -o $@ $(DUMPER_INCLUDES) ${firstword $^} -else - @echo $(CXX) $c $(CFLAGS) $(DUMPER_INCLUDES) ... $(basename $@).cc;\ - ${filter-out -nostdinc,$(COMPILE_CXX)} $c -o $(@D)/$(basename $@)$o $(DUMPER_INCLUDES) $< -endif - -module_info.o: module_info.cc -ifdef VERBOSE - ${filter-out -nostdinc,$(COMPILE_CXX)} $c -o $@ $(DUMPER_INCLUDES) ${firstword $^} -else - @echo $(CXX) $c $(CFLAGS) $(DUMPER_INCLUDES) ... $(basename $@).cc;\ - ${filter-out -nostdinc,$(COMPILE_CXX)} $c -o $(@D)/$(basename $@)$o $(DUMPER_INCLUDES) $< -endif - -parse_pe.o: parse_pe.cc dumper.h -ifdef VERBOSE - ${filter-out -nostdinc,$(COMPILE_CXX)} $c -o $@ $(DUMPER_INCLUDES) ${firstword $^} -else - @echo $(CXX) $c $(CFLAGS) $(DUMPER_INCLUDES) ... $(basename $@).cc;\ - ${filter-out -nostdinc,$(COMPILE_CXX)} $c -o $(@D)/$(basename $@)$o $(DUMPER_INCLUDES) $< -endif - -path.o: path.cc -ifdef VERBOSE - $(MINGW_CXX) $c -o $(@D)/$(basename $@)$o $(MINGW_CXXFLAGS) $< -else - @echo $(MINGW_CXX) $c -o $(@D)/$(basename $@)$o $(MINGW_CXXFLAGS) ... $^;\ - ${MINGW_CXX} $c -o $(@D)/$(basename $@)$o $(MINGW_CXXFLAGS) $< -endif - -dump_setup.o: dump_setup.cc -ifdef VERBOSE - $(MINGW_CXX) $(zconf_h) $(zlib_h) $c -o $(@D)/$(basename $@)$o $(MINGW_CXXFLAGS) $< -else - @echo $(MINGW_CXX) $c -o $(@D)/$(basename $@)$o $(MINGW_CXXFLAGS) ... $^;\ - $(MINGW_CXX) $(zconf_h) $(zlib_h) $c -o $(@D)/$(basename $@)$o $(MINGW_CXXFLAGS) $< -endif - -cygcheck.o: cygcheck.cc -ifdef VERBOSE - ${MINGW_CXX} $c -o $(@D)/$(basename $@)$o $(MINGW_CXXFLAGS) -I$(updir) $< -else - @echo $(MINGW_CXX) $c -o $(@D)/$(basename $@)$o $(MINGW_CXXFLAGS) ... $^;\ - ${MINGW_CXX} $c -o $(@D)/$(basename $@)$o $(MINGW_CXXFLAGS) -I$(updir) $< -endif - -strace.o: strace.cc -ifdef VERBOSE - $(MINGW_CXX) $c -o $(@D)/$(basename $@)$o $(MINGW_CXXFLAGS) -I$(updir) $< -else - @echo $(MINGW_CXX) $c -o $(@D)/$(basename $@)$o $(MINGW_CXXFLAGS) ... $^;\ - $(MINGW_CXX) $c -o $(@D)/$(basename $@)$o $(MINGW_CXXFLAGS) -I$(updir) $< -endif - -kill.exe: kill.o $(bupdir1)/libiberty/strsignal.o -ifdef VERBOSE - $(CXX) -o $@ $^ -B$(cygwin_build)/ $(ALL_LDFLAGS) $(KILL_LIB) -else - @echo $(CXX) -o $@ $^ ${filter-out -B%, $(ALL_LDFLAGS)};\ - $(CXX) -o $@ $^ -B$(cygwin_build)/ $(ALL_LDFLAGS) $(KILL_LIB) -endif - -clean: - rm -f *.o $(CLEAN_PROGS) - -realclean: clean - rm -f Makefile config.cache - -install: all - $(SHELL) $(updir1)/mkinstalldirs $(bindir) $(etcdir) - for i in $(PROGS) ; do \ - n=`echo $$i | sed '$(program_transform_name)'`; \ - $(INSTALL_PROGRAM) $$i $(bindir)/$$n; \ - done - -$(cygwin_build)/libcygwin.a: $(cygwin_build)/Makefile - @$(MAKE) -C $(@D) $(@F) - -$(mingw_build)/libmingw32.a: $(mingw_build)/Makefile - @$(MAKE) -C $(@D) $(@F) - -warn_dumper: - @echo '*** Not building dumper.exe since some required libraries are' - @echo '*** missing: libbfd.a and libintl.a.' - @echo '*** If you need this program, check out the naked-bfd and naked-intl' - @echo '*** sources from sources.redhat.com. Then, configure and build these' - @echo '*** libraries. Otherwise, you can safely ignore this warning.' - -dumper.exe: module_info.o parse_pe.o dumper.o $(ALL_DEP_LDLIBS) -ifdef VERBOSE - $(CXX) -o $@ ${wordlist 1,3,$^} -B$(cygwin_build)/ $(DUMPER_LDFLAGS) -else - @echo $(CXX) -o $@ ${wordlist 1,3,$^} ${filter-out -B%, $(DUMPER_LDFLAGS)};\ - $(CXX) -o $@ ${wordlist 1,3,$^} -B$(cygwin_build)/ $(DUMPER_LDFLAGS) -endif - -%.exe: %.o $(ALL_DEP_LDLIBS) -ifdef VERBOSE - $(CXX) -o $@ ${firstword $^} -B$(cygwin_build)/ $(ALL_LDFLAGS) -else - @echo $(CXX) -o $@ ${firstword $^} ... ${filter-out -B%, $(ALL_LDFLAGS)};\ - $(CXX) -o $@ ${firstword $^} -B$(cygwin_build)/ $(ALL_LDFLAGS) -endif diff --git a/winsup/utils/aclocal.m4 b/winsup/utils/aclocal.m4 deleted file mode 100644 index 754f640bb..000000000 --- a/winsup/utils/aclocal.m4 +++ /dev/null @@ -1,78 +0,0 @@ -dnl aclocal.m4 generated automatically by aclocal 1.3b - -dnl Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl This program is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without -dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A -dnl PARTICULAR PURPOSE. - -# Check to see if we're running under Win32, without using -# AC_CANONICAL_*. If so, set output variable EXEEXT to ".exe". -# Otherwise set it to "". - -dnl AM_EXEEXT() -dnl This knows we add .exe if we're building in the Cygwin -dnl environment. But if we're not, then it compiles a test program -dnl to see if there is a suffix for executables. -AC_DEFUN(AM_EXEEXT, -[AC_REQUIRE([AM_CYGWIN]) -AC_REQUIRE([AM_MINGW32]) -AC_MSG_CHECKING([for executable suffix]) -AC_CACHE_VAL(am_cv_exeext, -[if test "$CYGWIN" = yes || test "$MINGW32" = yes; then -am_cv_exeext=.exe -else -cat > am_c_test.c << 'EOF' -int main() { -/* Nothing needed here */ -} -EOF -${CC-cc} -o am_c_test $CFLAGS $CPPFLAGS $LDFLAGS am_c_test.c $LIBS 1>&5 -am_cv_exeext= -for file in am_c_test.*; do - case $file in - *.c) ;; - *.o) ;; - *) am_cv_exeext=`echo $file | sed -e s/am_c_test//` ;; - esac -done -rm -f am_c_test*]) -test x"${am_cv_exeext}" = x && am_cv_exeext=no -fi -EXEEXT="" -test x"${am_cv_exeext}" != xno && EXEEXT=${am_cv_exeext} -AC_MSG_RESULT(${am_cv_exeext}) -AC_SUBST(EXEEXT)]) - -# Check to see if we're running under Cygwin, without using -# AC_CANONICAL_*. If so, set output variable CYGWIN to "yes". -# Otherwise set it to "no". - -dnl AM_CYGWIN() -AC_DEFUN(AM_CYGWIN, -[AC_CACHE_CHECK(for Cygwin environment, am_cv_cygwin, -[AC_TRY_COMPILE(,[return __CYGWIN32__;], -am_cv_cygwin=yes, am_cv_cygwin=no) -rm -f conftest*]) -CYGWIN= -test "$am_cv_cygwin" = yes && CYGWIN=yes]) - - - -# Check to see if we're running under Mingw, without using -# AC_CANONICAL_*. If so, set output variable MINGW32 to "yes". -# Otherwise set it to "no". - -dnl AM_MINGW32() -AC_DEFUN(AM_MINGW32, -[AC_CACHE_CHECK(for Mingw32 environment, am_cv_mingw32, -[AC_TRY_COMPILE(,[return __MINGW32__;], -am_cv_mingw32=yes, am_cv_mingw32=no) -rm -f conftest*]) -MINGW32= -test "$am_cv_mingw32" = yes && MINGW32=yes]) - diff --git a/winsup/utils/configure b/winsup/utils/configure deleted file mode 100755 index 85502a9be..000000000 --- a/winsup/utils/configure +++ /dev/null @@ -1,1391 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.13 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} -# Maximum number of lines to put in a shell here document. -ac_max_here_lines=12 - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM - run sed PROGRAM on installed program names -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.13" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set these to C if already set. These must not be set unconditionally -# because not all systems understand e.g. LANG=C (notably SCO). -# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! -# Non-C LC_CTYPE values break the ctype check. -if test "${LANG+set}" = set; then LANG=C; export LANG; fi -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi -if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=mount.cc - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -ac_exeext= -ac_objext=o -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - - - - - - - -ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } -fi -ac_config_guess=$ac_aux_dir/config.guess -ac_config_sub=$ac_aux_dir/config.sub -ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. - - -# Do some error checking and defaulting for the host and target type. -# The inputs are: -# configure --host=HOST --target=TARGET --build=BUILD NONOPT -# -# The rules are: -# 1. You are not allowed to specify --host, --target, and nonopt at the -# same time. -# 2. Host defaults to nonopt. -# 3. If nonopt is not specified, then host defaults to the current host, -# as determined by config.guess. -# 4. Target and build default to nonopt. -# 5. If nonopt is not specified, then target and build default to host. - -# The aliases save the names the user supplied, while $host etc. -# will get canonicalized. -case $host---$target---$nonopt in -NONE---*---* | *---NONE---* | *---*---NONE) ;; -*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;; -esac - - -# Make sure we can run config.sub. -if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : -else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } -fi - -echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:578: checking host system type" >&5 - -host_alias=$host -case "$host_alias" in -NONE) - case $nonopt in - NONE) - if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then : - else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } - fi ;; - *) host_alias=$nonopt ;; - esac ;; -esac - -host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` -host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -echo "$ac_t""$host" 1>&6 - -echo $ac_n "checking target system type""... $ac_c" 1>&6 -echo "configure:599: checking target system type" >&5 - -target_alias=$target -case "$target_alias" in -NONE) - case $nonopt in - NONE) target_alias=$host_alias ;; - *) target_alias=$nonopt ;; - esac ;; -esac - -target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias` -target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -echo "$ac_t""$target" 1>&6 - -echo $ac_n "checking build system type""... $ac_c" 1>&6 -echo "configure:617: checking build system type" >&5 - -build_alias=$build -case "$build_alias" in -NONE) - case $nonopt in - NONE) build_alias=$host_alias ;; - *) build_alias=$nonopt ;; - esac ;; -esac - -build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias` -build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -echo "$ac_t""$build" 1>&6 - -test "$host_alias" != "$target_alias" && - test "$program_prefix$program_suffix$program_transform_name" = \ - NONENONEs,x,x, && - program_prefix=${target_alias}- - - -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:643: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:673: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_prog_rejected=no - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_save_ifs" -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:722: checking whether we are using GNU C" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <<EOF -#ifdef __GNUC__ - yes; -#endif -EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:731: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 - -if test $ac_cv_prog_gcc = yes; then - GCC=yes - ac_test_CFLAGS="${CFLAGS+set}" - ac_save_CFLAGS="$CFLAGS" - CFLAGS= - echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:746: checking whether ${CC-cc} accepts -g" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_cc_g=yes -else - ac_cv_prog_cc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 - if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" - elif test $ac_cv_prog_cc_g = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-O2" - fi -else - GCC= - test "${CFLAGS+set}" = set || CFLAGS="-g" -fi - -if test $host != $build; then - ac_tool_prefix=${host_alias}- -else - ac_tool_prefix= -fi - -# Extract the first word of "${ac_tool_prefix}g++", so it can be a program name with args. -set dummy ${ac_tool_prefix}g++; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:782: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CXX="${ac_tool_prefix}g++" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CXX="$ac_cv_prog_CXX" -if test -n "$CXX"; then - echo "$ac_t""$CXX" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -if test -z "$ac_cv_prog_CXX"; then -if test -n "$ac_tool_prefix"; then - # Extract the first word of "g++", so it can be a program name with args. -set dummy g++; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:814: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CXX="g++" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_CXX" && ac_cv_prog_CXX="g++" -fi -fi -CXX="$ac_cv_prog_CXX" -if test -n "$CXX"; then - echo "$ac_t""$CXX" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -else - CXX="g++" -fi -fi - -if test -z "$CXX"; then - # Extract the first word of "c++", so it can be a program name with args. -set dummy c++; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:850: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CXX="c++" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CXX="$ac_cv_prog_CXX" -if test -n "$CXX"; then - echo "$ac_t""$CXX" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -CXXFLAGS='$(CFLAGS)' - - -if test "$program_transform_name" = s,x,x,; then - program_transform_name= -else - # Double any \ or $. echo might interpret backslashes. - cat <<\EOF_SED > conftestsed -s,\\,\\\\,g; s,\$,$$,g -EOF_SED - program_transform_name="`echo $program_transform_name|sed -f conftestsed`" - rm -f conftestsed -fi -test "$program_prefix" != NONE && - program_transform_name="s,^,${program_prefix},; $program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" - -# sed with no file args requires a program. -test "$program_transform_name" = "" && program_transform_name="s,x,x," - - -echo $ac_n "checking for libiconv in -liconv""... $ac_c" 1>&6 -echo "configure:903: checking for libiconv in -liconv" >&5 -ac_lib_var=`echo iconv'_'libiconv | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-liconv $LIBS" -cat > conftest.$ac_ext <<EOF -#line 911 "configure" -#include "confdefs.h" -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char libiconv(); - -int main() { -libiconv() -; return 0; } -EOF -if { (eval echo configure:922: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - libiconv=-liconv -else - echo "$ac_t""no" 1>&6 -fi - - - -if test "x$cross_compiling" = "xyes"; then - if test "x$program_transform_name" = "xs,x,x,"; then - program_transform_name="" - fi - if test "x$program_transform_name" = "x"; then - program_transform_name="s,^,$host-," - else - program_transform_name="$program_transform_name -e s,^,$host-," - fi -fi - -INSTALL="/bin/sh "`cd $srcdir/../..; echo $(pwd)/install-sh -c` - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:969: checking for a BSD compatible install" >&5 -if test -z "$INSTALL"; then -if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_IFS" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - - -echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 -echo "configure:1023: checking for Cygwin environment" >&5 -if eval "test \"`echo '$''{'am_cv_cygwin'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1028 "configure" -#include "confdefs.h" - -int main() { -return __CYGWIN32__; -; return 0; } -EOF -if { (eval echo configure:1035: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - am_cv_cygwin=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - am_cv_cygwin=no -fi -rm -f conftest* -rm -f conftest* -fi - -echo "$ac_t""$am_cv_cygwin" 1>&6 -CYGWIN= -test "$am_cv_cygwin" = yes && CYGWIN=yes -echo $ac_n "checking for Mingw32 environment""... $ac_c" 1>&6 -echo "configure:1052: checking for Mingw32 environment" >&5 -if eval "test \"`echo '$''{'am_cv_mingw32'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1057 "configure" -#include "confdefs.h" - -int main() { -return __MINGW32__; -; return 0; } -EOF -if { (eval echo configure:1064: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - am_cv_mingw32=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - am_cv_mingw32=no -fi -rm -f conftest* -rm -f conftest* -fi - -echo "$ac_t""$am_cv_mingw32" 1>&6 -MINGW32= -test "$am_cv_mingw32" = yes && MINGW32=yes - - -echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 -echo "configure:1083: checking for executable suffix" >&5 -if eval "test \"`echo '$''{'am_cv_exeext'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$CYGWIN" = yes || test "$MINGW32" = yes; then -am_cv_exeext=.exe -else -cat > am_c_test.c << 'EOF' -int main() { -/* Nothing needed here */ -} -EOF -${CC-cc} -o am_c_test $CFLAGS $CPPFLAGS $LDFLAGS am_c_test.c $LIBS 1>&5 -am_cv_exeext= -for file in am_c_test.*; do - case $file in - *.c) ;; - *.o) ;; - *) am_cv_exeext=`echo $file | sed -e s/am_c_test//` ;; - esac -done -rm -f am_c_test* -fi - -test x"${am_cv_exeext}" = x && am_cv_exeext=no -fi -EXEEXT="" -test x"${am_cv_exeext}" != xno && EXEEXT=${am_cv_exeext} -echo "$ac_t""${am_cv_exeext}" 1>&6 - - -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -cat > conftest.defs <<\EOF -s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g -s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g -s%\[%\\&%g -s%\]%\\&%g -s%\$%$$%g -EOF -DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` -rm -f conftest.defs - - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS <<EOF -#! /bin/sh -# Generated automatically by configure. -# Run this file to recreate the current configuration. -# This directory was configured as follows, -# on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.13" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir -ac_given_INSTALL="$INSTALL" - -trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 -EOF -cat >> $CONFIG_STATUS <<EOF - -# Protect against being on the right side of a sed subst in config.status. -sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g; - s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF -$ac_vpsub -$extrasub -s%@SHELL@%$SHELL%g -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@FFLAGS@%$FFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@bindir@%$bindir%g -s%@sbindir@%$sbindir%g -s%@libexecdir@%$libexecdir%g -s%@datadir@%$datadir%g -s%@sysconfdir@%$sysconfdir%g -s%@sharedstatedir@%$sharedstatedir%g -s%@localstatedir@%$localstatedir%g -s%@libdir@%$libdir%g -s%@includedir@%$includedir%g -s%@oldincludedir@%$oldincludedir%g -s%@infodir@%$infodir%g -s%@mandir@%$mandir%g -s%@host@%$host%g -s%@host_alias@%$host_alias%g -s%@host_cpu@%$host_cpu%g -s%@host_vendor@%$host_vendor%g -s%@host_os@%$host_os%g -s%@target@%$target%g -s%@target_alias@%$target_alias%g -s%@target_cpu@%$target_cpu%g -s%@target_vendor@%$target_vendor%g -s%@target_os@%$target_os%g -s%@build@%$build%g -s%@build_alias@%$build_alias%g -s%@build_cpu@%$build_cpu%g -s%@build_vendor@%$build_vendor%g -s%@build_os@%$build_os%g -s%@CC@%$CC%g -s%@CXX@%$CXX%g -s%@libiconv@%$libiconv%g -s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g -s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g -s%@INSTALL_DATA@%$INSTALL_DATA%g -s%@EXEEXT@%$EXEEXT%g - -CEOF -EOF - -cat >> $CONFIG_STATUS <<\EOF - -# Split the substitutions into bite-sized pieces for seds with -# small command number limits, like on Digital OSF/1 and HP-UX. -ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. -ac_file=1 # Number of current file. -ac_beg=1 # First line for current file. -ac_end=$ac_max_sed_cmds # Line after last line for current file. -ac_more_lines=: -ac_sed_cmds="" -while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file - else - sed "${ac_end}q" conftest.subs > conftest.s$ac_file - fi - if test ! -s conftest.s$ac_file; then - ac_more_lines=false - rm -f conftest.s$ac_file - else - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f conftest.s$ac_file" - else - ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" - fi - ac_file=`expr $ac_file + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_cmds` - fi -done -if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat -fi -EOF - -cat >> $CONFIG_STATUS <<EOF - -CONFIG_FILES=\${CONFIG_FILES-"Makefile"} -EOF -cat >> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -s%@INSTALL@%$INSTALL%g -" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file -fi; done -rm -f conftest.s* - -EOF -cat >> $CONFIG_STATUS <<EOF - -EOF -cat >> $CONFIG_STATUS <<\EOF - -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - diff --git a/winsup/utils/configure.in b/winsup/utils/configure.in deleted file mode 100644 index 83d639a02..000000000 --- a/winsup/utils/configure.in +++ /dev/null @@ -1,92 +0,0 @@ -dnl Autoconf configure script for Cygwin utilities. -dnl Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions. -dnl -dnl This file is part of Cygwin. -dnl -dnl This software is a copyrighted work licensed under the terms of the -dnl Cygwin license. Please consult the file "CYGWIN_LICENSE" for -dnl details. - -dnl Process this file with autoconf to produce a configure script. - -AC_PREREQ(2.12) - -AC_INIT(mount.cc) - -dnl FIXME: We temporarily define our own version of AC_PROG_CC. This is -dnl copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We -dnl are probably using a cross compiler, which will not be able to fully -dnl link an executable. This should really be fixed in autoconf -dnl itself. - -AC_DEFUN(LIB_AC_PROG_CC, -[AC_BEFORE([$0], [AC_PROG_CPP])dnl -AC_CHECK_PROG(CC, gcc, gcc) -if test -z "$CC"; then - AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc) - test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH]) -fi - -AC_PROG_CC_GNU - -if test $ac_cv_prog_gcc = yes; then - GCC=yes -dnl Check whether -g works, even if CFLAGS is set, in case the package -dnl plays around with CFLAGS (such as to build both debugging and -dnl normal versions of a library), tasteless as that idea is. - ac_test_CFLAGS="${CFLAGS+set}" - ac_save_CFLAGS="$CFLAGS" - CFLAGS= - AC_PROG_CC_G - if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" - elif test $ac_cv_prog_cc_g = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-O2" - fi -else - GCC= - test "${CFLAGS+set}" = set || CFLAGS="-g" -fi -]) - -AC_DEFUN(LIB_AC_PROG_CXX, -[AC_BEFORE([$0], [AC_PROG_CPP])dnl -AC_CHECK_TOOL(CXX, g++, g++) -if test -z "$CXX"; then - AC_CHECK_PROG(CXX, c++, c++, , , ) - test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH]) -fi - -CXXFLAGS='$(CFLAGS)' -]) - -AC_CANONICAL_SYSTEM - -LIB_AC_PROG_CC -LIB_AC_PROG_CXX - -AC_ARG_PROGRAM - -AC_CHECK_LIB(iconv, libiconv, libiconv=-liconv) -AC_SUBST(libiconv) - -if test "x$cross_compiling" = "xyes"; then - if test "x$program_transform_name" = "xs,x,x,"; then - program_transform_name="" - fi - if test "x$program_transform_name" = "x"; then - program_transform_name="s,^,$host-," - else - program_transform_name="$program_transform_name -e s,^,$host-," - fi -fi - -INSTALL="/bin/sh "`cd $srcdir/../..; echo $(pwd)/install-sh -c` - -AC_PROG_INSTALL - -AM_EXEEXT - -AC_OUTPUT(Makefile) diff --git a/winsup/utils/cygcheck.cc b/winsup/utils/cygcheck.cc deleted file mode 100644 index 924c3ce9b..000000000 --- a/winsup/utils/cygcheck.cc +++ /dev/null @@ -1,1501 +0,0 @@ -/* cygcheck.cc - - Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/time.h> -#include <ctype.h> -#include <io.h> -#include <windows.h> -#include "path.h" -#include <getopt.h> -#include "cygwin/include/sys/cygwin.h" -#include "cygwin/include/mntent.h" - -int verbose = 0; -int registry = 0; -int sysinfo = 0; -int givehelp = 0; -int keycheck = 0; -int check_setup = 0; -int dump_only = 0; -int find_package = 0; -int list_package = 0; - -#ifdef __GNUC__ -typedef long long longlong; -#else -typedef __int64 longlong; -#endif - -void dump_setup (int, char **, bool); -void package_find (int, char **); -void package_list (int, char **); - -static const char version[] = "$Revision$"; - -static const char *known_env_vars[] = { - "c_include_path", - "compiler_path", - "cxx_include_path", - "cygwin", - "cygwin32", - "dejagnu", - "expect", - "gcc_default_options", - "gcc_exec_prefix", - "home", - "ld_library_path", - "library_path", - "login", - "lpath", - "make_mode", - "makeflags", - "path", - "pwd", - "strace", - "tcl_library", - "user", - 0 -}; - -struct -{ - const char *name; - int missing_is_good; -} -static common_apps[] = { - {"awk", 0}, - {"bash", 0}, - {"cat", 0}, - {"cp", 0}, - {"cpp", 1}, - {"find", 0}, - {"gcc", 0}, - {"gdb", 0}, - {"grep", 0}, - {"ld", 0}, - {"ls", 0}, - {"make", 0}, - {"mv", 0}, - {"rm", 0}, - {"sed", 0}, - {"sh", 0}, - {"tar", 0}, - {0, 0} -}; - -static int num_paths = 0, max_paths = 0; -static char **paths = 0; - -/* - * keyeprint() is used to report failure modes - */ -static int -keyeprint (const char *name) -{ - fprintf (stderr, "cygcheck: %s failed: %lu\n", name, GetLastError ()); - return 1; -} - -static void -add_path (char *s, int maxlen) -{ - if (num_paths >= max_paths) - { - max_paths += 10; - if (paths) - paths = (char **) realloc (paths, max_paths * sizeof (char *)); - else - paths = (char **) malloc (max_paths * sizeof (char *)); - } - paths[num_paths] = (char *) malloc (maxlen + 1); - if (paths[num_paths] == NULL) - { - keyeprint ("add_path: malloc()"); - return; - } - memcpy (paths[num_paths], s, maxlen); - paths[num_paths][maxlen] = 0; - char *e = paths[num_paths] + strlen (paths[num_paths]); - if (e[-1] == '\\' && e[-2] != ':') - *--e = 0; - for (int i = 1; i < num_paths; i++) - if (strcasecmp (paths[num_paths], paths[i]) == 0) - return; - num_paths++; -} - -static void -init_paths () -{ - char tmp[4000], *sl; - add_path ((char *) ".", 1); /* to be replaced later */ - add_path ((char *) ".", 1); /* the current directory */ - if (GetSystemDirectory (tmp, 4000)) - add_path (tmp, strlen (tmp)); - else - keyeprint ("init_paths: GetSystemDirectory()"); - sl = strrchr (tmp, '\\'); - if (sl) - { - strcpy (sl, "\\SYSTEM"); - add_path (tmp, strlen (tmp)); - } - GetWindowsDirectory (tmp, 4000); - add_path (tmp, strlen (tmp)); - - char *wpath = getenv ("PATH"); - if (wpath) - { - char *b, *e; - b = wpath; - while (1) - { - for (e = b; *e && *e != ';'; e++); - add_path (b, e - b); - if (!*e) - break; - b = e + 1; - } - } - else - printf ("WARNING: PATH is not set at all!\n"); -} - -static char * -find_on_path (char *file, char *default_extension, - int showall = 0, int search_sysdirs = 0) -{ - static char rv[4000]; - char tmp[4000], *ptr = rv; - - if (!file) - { - keyeprint ("find_on_path: NULL pointer for file"); - return 0; - } - - if (default_extension == NULL) - { - keyeprint ("find_on_path: NULL pointer for default_extension"); - return 0; - } - - if (strchr (file, ':') || strchr (file, '\\') || strchr (file, '/')) - return cygpath (file, NULL); - - if (strchr (file, '.')) - default_extension = (char *) ""; - - for (int i = 0; i < num_paths; i++) - { - if (!search_sysdirs && (i == 0 || i == 2 || i == 3)) - continue; - if (i == 0 || !search_sysdirs || strcasecmp (paths[i], paths[0])) - { - sprintf (ptr, "%s\\%s%s", paths[i], file, default_extension); - if (GetFileAttributes (ptr) != (DWORD) - 1) - { - if (showall) - printf ("Found: %s\n", ptr); - if (ptr == tmp && verbose) - printf ("Warning: %s hides %s\n", rv, ptr); - ptr = tmp; - } - } - } - - if (ptr == tmp) - return rv; - - return 0; -} - -#define DID_NEW 1 -#define DID_ACTIVE 2 -#define DID_INACTIVE 3 - -struct Did -{ - Did *next; - char *file; - int state; -}; -static Did *did = 0; - -static Did * -already_did (char *file) -{ - Did *d; - for (d = did; d; d = d->next) - if (strcasecmp (d->file, file) == 0) - return d; - d = (Did *) malloc (sizeof (Did)); - d->file = strdup (file); - d->next = did; - d->state = DID_NEW; - did = d; - return d; -} - -static int -get_word (HANDLE fh, int offset) -{ - short rv; - unsigned r; - - if (SetFilePointer (fh, offset, 0, FILE_BEGIN) == INVALID_SET_FILE_POINTER - && GetLastError () != NO_ERROR) - keyeprint ("get_word: SetFilePointer()"); - - if (!ReadFile (fh, &rv, 2, (DWORD *) &r, 0)) - keyeprint ("get_word: Readfile()"); - - return rv; -} - -static int -get_dword (HANDLE fh, int offset) -{ - int rv; - unsigned r; - - if (SetFilePointer (fh, offset, 0, FILE_BEGIN) == INVALID_SET_FILE_POINTER - && GetLastError () != NO_ERROR) - keyeprint ("get_word: SetFilePointer()"); - - if (!ReadFile (fh, &rv, 4, (DWORD *) &r, 0)) - keyeprint ("get_dword: Readfile()"); - - return rv; -} - -struct Section -{ - char name[8]; - int virtual_size; - int virtual_address; - int size_of_raw_data; - int pointer_to_raw_data; -}; - -static int -rva_to_offset (int rva, char *sections, int nsections, int *sz) -{ - int i; - - if (sections == NULL) - { - keyeprint ("rva_to_offset: NULL passed for sections"); - return 0; - } - - for (i = 0; i < nsections; i++) - { - Section *s = (Section *) (sections + i * 40); -#if 0 - printf ("%08x < %08x < %08x ? %08x\n", - s->virtual_address, rva, - s->virtual_address + s->virtual_size, s->pointer_to_raw_data); -#endif - if (rva >= s->virtual_address - && rva < s->virtual_address + s->virtual_size) - { - if (sz) - *sz = s->virtual_address + s->virtual_size - rva; - return rva - s->virtual_address + s->pointer_to_raw_data; - } - } - return 0; /* punt */ -} - -struct ExpDirectory -{ - int flags; - int timestamp; - short major_ver; - short minor_ver; - int name_rva; -}; - -struct ImpDirectory -{ - unsigned characteristics; - unsigned timestamp; - unsigned forwarder_chain; - unsigned name_rva; - unsigned iat_rva; -}; - - -static void track_down (char *file, char *suffix, int lvl); - -#define CYGPREFIX (sizeof ("%%% Cygwin ") - 1) -static void -cygwin_info (HANDLE h) -{ - char *buf, *bufend, *buf_start = NULL; - const char *hello = " Cygwin DLL version info:\n"; - DWORD size = GetFileSize (h, NULL); - DWORD n; - - if (size == 0xffffffff) - return; - - buf_start = buf = (char *) calloc (1, size + 1); - if (buf == NULL) - { - keyeprint ("cygwin_info: malloc()"); - return; - } - - (void) SetFilePointer (h, 0, NULL, FILE_BEGIN); - if (!ReadFile (h, buf, size, &n, NULL)) - { - free (buf_start); - return; - } - - static char dummy[] = "\0\0\0\0\0\0\0"; - char *dll_major = dummy; - bufend = buf + size; - while (buf < bufend) - if ((buf = (char *) memchr (buf, '%', bufend - buf)) == NULL) - break; - else if (strncmp ("%%% Cygwin ", buf, CYGPREFIX) != 0) - buf++; - else - { - char *p = strchr (buf += CYGPREFIX, '\n'); - if (!p) - break; - if (strncasecmp (buf, "dll major:", 10) == 0) - { - dll_major = buf + 11; - continue; - } - char *s, pbuf[80]; - int len; - len = 1 + p - buf; - if (strncasecmp (buf, "dll minor:", 10) != 0) - s = buf; - else - { - char c = dll_major[1]; - dll_major[1] = '\0'; - int maj = atoi (dll_major); - dll_major[1] = c; - int min = atoi (dll_major + 1); - sprintf (pbuf, "DLL version: %d.%d.%.*s", maj, min, len - 11, - buf + 11); - len = strlen (s = pbuf); - } - if (strncmp (s, "dll", 3) == 0) - memcpy (s, "DLL", 3); - else if (strncmp (s, "api", 3) == 0) - memcpy (s, "API", 3); - else if (islower (*s)) - *s = toupper (*s); - fprintf (stdout, "%s %.*s", hello, len, s); - hello = ""; - } - - if (!*hello) - puts (""); - - free (buf_start); - return; -} - -static void -dll_info (const char *path, HANDLE fh, int lvl, int recurse) -{ - DWORD junk; - int i; - int pe_header_offset = get_dword (fh, 0x3c); - int opthdr_ofs = pe_header_offset + 4 + 20; - unsigned short v[6]; - - if (path == NULL) - { - keyeprint ("dll_info: NULL passed for path"); - return; - } - - if (SetFilePointer (fh, opthdr_ofs + 40, 0, FILE_BEGIN) == - INVALID_SET_FILE_POINTER && GetLastError () != NO_ERROR) - keyeprint ("dll_info: SetFilePointer()"); - - if (!ReadFile (fh, &v, sizeof (v), &junk, 0)) - keyeprint ("dll_info: Readfile()"); - - if (verbose) - printf (" - os=%d.%d img=%d.%d sys=%d.%d\n", - v[0], v[1], v[2], v[3], v[4], v[5]); - else - printf ("\n"); - - int num_entries = get_dword (fh, opthdr_ofs + 92); - int export_rva = get_dword (fh, opthdr_ofs + 96); - int export_size = get_dword (fh, opthdr_ofs + 100); - int import_rva = get_dword (fh, opthdr_ofs + 104); - int import_size = get_dword (fh, opthdr_ofs + 108); - - int nsections = get_word (fh, pe_header_offset + 4 + 2); - char *sections = (char *) malloc (nsections * 40); - - if (SetFilePointer (fh, pe_header_offset + 4 + 20 + - get_word (fh, pe_header_offset + 4 + 16), 0, - FILE_BEGIN) == INVALID_SET_FILE_POINTER - && GetLastError () != NO_ERROR) - keyeprint ("dll_info: SetFilePointer()"); - - if (!ReadFile (fh, sections, nsections * 40, &junk, 0)) - keyeprint ("dll_info: Readfile()"); - - if (verbose && num_entries >= 1 && export_size > 0) - { - int expsz; - int expbase = rva_to_offset (export_rva, sections, nsections, &expsz); - - if (expbase) - { - if (SetFilePointer (fh, expbase, 0, FILE_BEGIN) == - INVALID_SET_FILE_POINTER && GetLastError () != NO_ERROR) - keyeprint ("dll_info: SetFilePointer()"); - - unsigned char *exp = (unsigned char *) malloc (expsz); - - if (!ReadFile (fh, exp, expsz, &junk, 0)) - keyeprint ("dll_info: Readfile()"); - - ExpDirectory *ed = (ExpDirectory *) exp; - int ofs = ed->name_rva - export_rva; - struct tm *tm = localtime ((const time_t *) &(ed->timestamp)); - if (tm->tm_year < 60) - tm->tm_year += 2000; - if (tm->tm_year < 200) - tm->tm_year += 1900; - printf ("%*c", lvl + 2, ' '); - printf ("\"%s\" v%d.%d ts=", exp + ofs, - ed->major_ver, ed->minor_ver); - printf ("%d/%d/%d %d:%02d\n", - tm->tm_year, tm->tm_mon + 1, tm->tm_mday, - tm->tm_hour, tm->tm_min); - } - } - - if (num_entries >= 2 && import_size > 0 && recurse) - { - int impsz; - int impbase = rva_to_offset (import_rva, sections, nsections, &impsz); - if (impbase) - { - if (SetFilePointer (fh, impbase, 0, FILE_BEGIN) == - INVALID_SET_FILE_POINTER && GetLastError () != NO_ERROR) - keyeprint ("dll_info: SetFilePointer()"); - - unsigned char *imp = (unsigned char *) malloc (impsz); - if (imp == NULL) - { - keyeprint ("dll_info: malloc()"); - return; - } - - if (!ReadFile (fh, imp, impsz, &junk, 0)) - keyeprint ("dll_info: Readfile()"); - - ImpDirectory *id = (ImpDirectory *) imp; - for (i = 0; id[i].name_rva; i++) - { - /* int ofs = id[i].name_rva - import_rva; */ - track_down ((char *) imp + id[i].name_rva - import_rva, - (char *) ".dll", lvl + 2); - } - } - } - if (strstr (path, "\\cygwin1.dll")) - cygwin_info (fh); -} - -static void -track_down (char *file, char *suffix, int lvl) -{ - if (file == NULL) - { - keyeprint ("track_down: malloc()"); - return; - } - - if (suffix == NULL) - { - keyeprint ("track_down: malloc()"); - return; - } - - char *path = find_on_path (file, suffix, 0, 1); - if (!path) - { - printf ("Error: could not find %s\n", file); - return; - } - - Did *d = already_did (file); - switch (d->state) - { - case DID_NEW: - break; - case DID_ACTIVE: - if (verbose) - { - if (lvl) - printf ("%*c", lvl, ' '); - printf ("%s", path); - printf (" (recursive)\n"); - } - return; - case DID_INACTIVE: - if (verbose) - { - if (lvl) - printf ("%*c", lvl, ' '); - printf ("%s", path); - printf (" (already done)\n"); - } - return; - default: - break; - } - - if (lvl) - printf ("%*c", lvl, ' '); - - if (!path) - { - printf ("%s not found\n", file); - return; - } - - printf ("%s", path); - - HANDLE fh = - CreateFile (path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (fh == INVALID_HANDLE_VALUE) - { - printf (" - Cannot open\n"); - return; - } - - d->state = DID_ACTIVE; - - dll_info (path, fh, lvl, 1); - d->state = DID_INACTIVE; - if (!CloseHandle (fh)) - keyeprint ("track_down: CloseHandle()"); -} - -static void -ls (char *f) -{ - HANDLE h = CreateFile (f, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, - 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - BY_HANDLE_FILE_INFORMATION info; - - if (!GetFileInformationByHandle (h, &info)) - keyeprint ("ls: GetFileInformationByHandle()"); - - SYSTEMTIME systime; - - if (!FileTimeToSystemTime (&info.ftLastWriteTime, &systime)) - keyeprint ("ls: FileTimeToSystemTime()"); - printf ("%5dk %04d/%02d/%02d %s", - (((int) info.nFileSizeLow) + 512) / 1024, - systime.wYear, systime.wMonth, systime.wDay, f); - dll_info (f, h, 16, 0); - if (!CloseHandle (h)) - keyeprint ("ls: CloseHandle()"); -} - -static void -cygcheck (char *app) -{ - char *papp = find_on_path (app, (char *) ".exe", 1, 0); - if (!papp) - { - printf ("Error: could not find %s\n", app); - return; - } - char *s = strdup (papp); - char *sl = 0, *t; - for (t = s; *t; t++) - if (*t == '/' || *t == '\\' || *t == ':') - sl = t; - if (sl == 0) - paths[0] = (char *) "."; - else - { - *sl = 0; - paths[0] = s; - } - did = 0; - track_down (papp, (char *) ".exe", 0); -} - - -extern char **environ; - -struct RegInfo -{ - RegInfo *prev; - char *name; - HKEY key; -}; - -static void -show_reg (RegInfo * ri, int nest) -{ - if (!ri) - return; - show_reg (ri->prev, 1); - if (nest) - printf ("%s\\", ri->name); - else - printf ("%s\n", ri->name); -} - -static void -scan_registry (RegInfo * prev, HKEY hKey, char *name, int cygnus) -{ - RegInfo ri; - ri.prev = prev; - ri.name = name; - ri.key = hKey; - - char *cp; - for (cp = name; *cp; cp++) - if (strncasecmp (cp, "cygnus", 6) == 0) - cygnus = 1; - - DWORD num_subkeys, max_subkey_len, num_values; - DWORD max_value_len, max_valdata_len, i; - if (RegQueryInfoKey (hKey, 0, 0, 0, &num_subkeys, &max_subkey_len, 0, - &num_values, &max_value_len, &max_valdata_len, 0, 0) - != ERROR_SUCCESS) - { -#if 0 - char tmp[400]; - FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError (), - MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), tmp, 400, 0); - printf ("RegQueryInfoKey: %s\n", tmp); -#endif - return; - } - - if (cygnus) - { - show_reg (&ri, 0); - - char *value_name = (char *) malloc (max_value_len + 1); - if (value_name == NULL) - { - keyeprint ("scan_registry: malloc()"); - return; - } - - char *value_data = (char *) malloc (max_valdata_len + 1); - if (value_data == NULL) - { - keyeprint ("scan_registry: malloc()"); - return; - } - - for (i = 0; i < num_values; i++) - { - DWORD dlen = max_valdata_len + 1; - DWORD nlen = max_value_len + 1; - DWORD type; - RegEnumValue (hKey, i, value_name, &nlen, 0, - &type, (BYTE *) value_data, &dlen); - { - printf (" %s = ", i ? value_name : "(default)"); - switch (type) - { - case REG_DWORD: - printf ("0x%08x\n", *(unsigned *) value_data); - break; - case REG_EXPAND_SZ: - case REG_SZ: - printf ("`%s'\n", value_data); - break; - default: - printf ("(unsupported type)\n"); - break; - } - } - } - free (value_name); - free (value_data); - } - - char *subkey_name = (char *) malloc (max_subkey_len + 1); - for (i = 0; i < num_subkeys; i++) - { - if (RegEnumKey (hKey, i, subkey_name, max_subkey_len + 1) == - ERROR_SUCCESS) - { - HKEY sKey; - if (RegOpenKeyEx (hKey, subkey_name, 0, KEY_READ, &sKey) - == ERROR_SUCCESS) - { - scan_registry (&ri, sKey, subkey_name, cygnus); - if (RegCloseKey (sKey) != ERROR_SUCCESS) - keyeprint ("scan_registry: RegCloseKey()"); - } - } - } - free (subkey_name); -} - -void -pretty_id (const char *s, char *cygwin, size_t cyglen) -{ - char *groups[16384]; - - strcpy (cygwin + cyglen++, " "); - strcpy (cygwin + cyglen, s); - putenv (cygwin); - - char *id = cygpath ("/bin/id.exe", NULL); - for (char *p = id; (p = strchr (p, '/')); p++) - *p = '\\'; - - if (access (id, X_OK)) - { - fprintf (stderr, "`id' program not found\n"); - return; - } - - FILE *f = popen (id, "rt"); - - char buf[16384]; - static char empty[] = ""; - buf[0] = '\0'; - fgets (buf, sizeof (buf), f); - char *uid = strtok (buf, ")"); - if (uid) - uid += strlen ("uid="); - else - uid = empty; - char *gid = strtok (NULL, ")"); - if (gid) - gid += strlen ("gid=") + 1; - else - gid = empty; - char **ng; - size_t sz = 0; - for (ng = groups; (*ng = strtok (NULL, ",")); ng++) - { - char *p = strchr (*ng, '\n'); - if (p) - *p = '\0'; - if (ng == groups) - *ng += strlen (" groups="); - size_t len = strlen (*ng); - if (sz < len) - sz = len; - } - - printf ("\nOutput from %s (%s)\n", id, s); - size_t szmaybe = strlen ("UID: ") + strlen (uid); - if (sz < szmaybe) - sz = szmaybe; - sz += 1; - int n = 80 / (int) sz; - sz = -sz; - ng[0] += strlen ("groups="); - printf ("UID: %.*s) GID: %s)\n", sz + (sizeof ("UID: ") - 1), uid, gid); - int i = 0; - for (char **g = groups; g < ng; g++) - { - if (i < n) - i++; - else - { - i = 0; - puts (""); - } - if (++i <= n && g != (ng - 1)) - printf ("%*s ", sz, *g); - else - { - printf ("%s\n", *g); - i = 0; - } - } -} - -static void -dump_sysinfo () -{ - int i, j; - char tmp[4000]; - time_t now; - char *found_cygwin_dll; - - printf ("\nCygwin Configuration Diagnostics\n"); - time (&now); - printf ("Current System Time: %s\n", ctime (&now)); - - OSVERSIONINFO osversion; - osversion.dwOSVersionInfoSize = sizeof (osversion); - if (!GetVersionEx (&osversion)) - keyeprint ("dump_sysinfo: GetVersionEx()"); - char *osname = (char *) "unknown OS"; - switch (osversion.dwPlatformId) - { - case VER_PLATFORM_WIN32s: - osname = (char *) "32s"; - break; - case VER_PLATFORM_WIN32_WINDOWS: - switch (osversion.dwMinorVersion) - { - case 0: - if (strchr (osversion.szCSDVersion, 'C')) - osname = (char *) "95 OSR2"; - else - osname = (char *) "95"; - break; - case 10: - if (strchr (osversion.szCSDVersion, 'A')) - osname = (char *) "98 SE"; - else - osname = (char *) "98"; - break; - case 90: - osname = (char *) "ME"; - break; - default: - osname = (char *) "9X"; - break; - } - break; - case VER_PLATFORM_WIN32_NT: - if (osversion.dwMajorVersion == 5) - { - BOOL more_info = FALSE; - OSVERSIONINFOEX osversionex; - osversionex.dwOSVersionInfoSize = sizeof (osversionex); - if (GetVersionEx ((OSVERSIONINFO *) &osversionex)) - more_info = TRUE; - if (osversion.dwMinorVersion == 0) - { - if (!more_info) - osname = (char *) "2000"; - else if (osversionex.wProductType == VER_NT_SERVER - || osversionex.wProductType == - VER_NT_DOMAIN_CONTROLLER) - { - if (osversionex.wSuiteMask &VER_SUITE_DATACENTER) - osname = (char *) "2000 Datacenter Server"; - else if (osversionex.wSuiteMask & VER_SUITE_ENTERPRISE) - osname = (char *) "2000 Advanced Server"; - else - osname = (char *) "2000 Server"; - } - else - osname = (char *) "2000 Professional"; - } - else - { - if (!more_info) - osname = (char *) "XP"; - else if (osversionex.wProductType == VER_NT_SERVER - || osversionex.wProductType == - VER_NT_DOMAIN_CONTROLLER) - { - if (osversionex.wSuiteMask & VER_SUITE_ENTERPRISE) - osname = (char *) ".NET Enterprise Server"; - else - osname = (char *) ".NET Server"; - } - else if (osversionex.wSuiteMask & VER_SUITE_PERSONAL) - osname = (char *) "XP Home Edition"; - else - osname = (char *) "XP Professional"; - - } - } - else - osname = (char *) "NT"; - break; - default: - osname = (char *) "??"; - break; - } - printf ("Windows %s Ver %lu.%lu Build %lu %s\n\n", osname, - osversion.dwMajorVersion, osversion.dwMinorVersion, - osversion.dwPlatformId == VER_PLATFORM_WIN32_NT ? - osversion.dwBuildNumber : (osversion.dwBuildNumber & 0xffff), - osversion.dwPlatformId == VER_PLATFORM_WIN32_NT ? - osversion.szCSDVersion : ""); - - printf ("Path:"); - char *s = getenv ("PATH"), *e; - char sep = strchr (s, ';') ? ';' : ':'; - int count_path_items = 0; - while (1) - { - for (e = s; *e && *e != sep; e++); - printf ("\t%.*s\n", e - s, s); - count_path_items++; - if (!*e) - break; - s = e + 1; - } - - fflush (stdout); - - char *cygwin = getenv ("CYGWIN"); - if (cygwin) - cygwin -= strlen ("CYGWIN="); - else - cygwin = const_cast <char *> ("CYGWIN="); - size_t cyglen = strlen (cygwin); - cygwin = strcpy ((char *) malloc (cyglen + sizeof (" nontsec")), cygwin); - pretty_id ("nontsec", cygwin, cyglen); - pretty_id ("ntsec", cygwin, cyglen); - cygwin[cyglen] = 0; - putenv (cygwin); - - if (!GetSystemDirectory (tmp, 4000)) - keyeprint ("dump_sysinfo: GetSystemDirectory()"); - printf ("\nSysDir: %s\n", tmp); - - GetWindowsDirectory (tmp, 4000); - printf ("WinDir: %s\n\n", tmp); - - - if (givehelp) - printf ("Here's some environment variables that may affect cygwin:\n"); - for (i = 0; environ[i]; i++) - { - char *eq = strchr (environ[i], '='); - if (!eq) - continue; - /* int len = eq - environ[i]; */ - for (j = 0; known_env_vars[j]; j++) - { - *eq = 0; - if (strcmp (environ[i], "PATH") == 0) - continue; /* we handle this one specially */ - if (strcasecmp (environ[i], known_env_vars[j]) == 0) - printf ("%s = `%s'\n", environ[i], eq + 1); - *eq = '='; - } - } - printf ("\n"); - - if (verbose) - { - if (givehelp) - printf ("Here's the rest of your environment variables:\n"); - for (i = 0; environ[i]; i++) - { - int found = 0; - char *eq = strchr (environ[i], '='); - if (!eq) - continue; - /* int len = eq - environ[i]; */ - for (j = 0; known_env_vars[j]; j++) - { - *eq = 0; - if (strcasecmp (environ[i], known_env_vars[j]) == 0) - found = 1; - *eq = '='; - } - if (!found) - { - *eq = 0; - printf ("%s = `%s'\n", environ[i], eq + 1); - *eq = '='; - } - } - printf ("\n"); - } - - if (registry) - { - if (givehelp) - printf ("Scanning registry for keys with `Cygnus' in them...\n"); -#if 0 - /* big and not generally useful */ - scan_registry (0, HKEY_CLASSES_ROOT, (char *) "HKEY_CLASSES_ROOT", 0); -#endif - scan_registry (0, HKEY_CURRENT_CONFIG, - (char *) "HKEY_CURRENT_CONFIG", 0); - scan_registry (0, HKEY_CURRENT_USER, (char *) "HKEY_CURRENT_USER", 0); - scan_registry (0, HKEY_LOCAL_MACHINE, (char *) "HKEY_LOCAL_MACHINE", 0); -#if 0 - /* the parts we need are duplicated in HKEY_CURRENT_USER anyway */ - scan_registry (0, HKEY_USERS, (char *) "HKEY_USERS", 0); -#endif - printf ("\n"); - } - else - printf ("Use `-r' to scan registry\n\n"); - - if (givehelp) - { - printf ("Listing available drives...\n"); - printf ("Drv Type Size Free Flags Name\n"); - } - int prev_mode = - SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); - int drivemask = GetLogicalDrives (); - - HINSTANCE k32 = LoadLibrary ("kernel32.dll"); - BOOL (WINAPI * gdfse) (LPCSTR, long long *, long long *, long long *) = - (BOOL (WINAPI *) (LPCSTR, long long *, long long *, long long *)) - GetProcAddress (k32, "GetDiskFreeSpaceExA"); - - for (i = 0; i < 26; i++) - { - if (!(drivemask & (1 << i))) - continue; - char drive[4], name[200], fsname[200]; - DWORD serno = 0, maxnamelen = 0, flags = 0; - name[0] = name[0] = fsname[0] = 0; - sprintf (drive, "%c:\\", i + 'a'); - /* Report all errors, except if the Volume is ERROR_NOT_READY. - ERROR_NOT_READY is returned when removeable media drives are empty - (CD, floppy, etc.) */ - if (!GetVolumeInformation - (drive, name, sizeof (name), &serno, &maxnamelen, &flags, fsname, - sizeof (fsname)) && GetLastError () != ERROR_NOT_READY) - keyeprint ("dump_sysinfo: GetVolumeInformation()"); - - int dtype = GetDriveType (drive); - char drive_type[4] = "unk"; - switch (dtype) - { - case DRIVE_REMOVABLE: - strcpy (drive_type, "fd "); - break; - case DRIVE_FIXED: - strcpy (drive_type, "hd "); - break; - case DRIVE_REMOTE: - strcpy (drive_type, "net"); - break; - case DRIVE_CDROM: - strcpy (drive_type, "cd "); - break; - case DRIVE_RAMDISK: - strcpy (drive_type, "ram"); - break; - default: - strcpy (drive_type, "unk"); - } - - long capacity_mb = -1; - int percent_full = -1; - - long long free_me = 0ULL, free_bytes = 0ULL, total_bytes = 1ULL; - if (gdfse != NULL && gdfse (drive, &free_me, &total_bytes, &free_bytes)) - { - capacity_mb = total_bytes / (1024L * 1024L); - percent_full = 100 - (int) ((100.0 * free_me) / total_bytes); - } - else - { - DWORD spc = 0, bps = 0, fc = 0, tc = 1; - if (GetDiskFreeSpace (drive, &spc, &bps, &fc, &tc)) - { - capacity_mb = (spc * bps * tc) / (1024 * 1024); - percent_full = 100 - (int) ((100.0 * fc) / tc); - } - } - - printf ("%.2s %s %-6s ", drive, drive_type, fsname); - if (capacity_mb >= 0) - printf ("%5dMb %3d%% ", (int) capacity_mb, (int) percent_full); - else - printf (" N/A N/A "); - printf ("%s %s %s %s %s %s %s\n", - flags & FS_CASE_IS_PRESERVED ? "CP" : " ", - flags & FS_CASE_SENSITIVE ? "CS" : " ", - flags & FS_UNICODE_STORED_ON_DISK ? "UN" : " ", - flags & FS_PERSISTENT_ACLS ? "PA" : " ", - flags & FS_FILE_COMPRESSION ? "FC" : " ", - flags & FS_VOL_IS_COMPRESSED ? "VC" : " ", -#if 0 - flags & FILE_SUPPORTS_ENCRYPTION ? "EN" : " ", - flags & FILE_SUPPORTS_OBJECT_IDS ? "OI" : " ", - flags & FILE_SUPPORTS_REPARSE_POINTS ? "RP" : " ", - flags & FILE_SUPPORTS_SPARSE_FILES ? "SP" : " ", - flags & FILE_VOLUME_QUOTAS ? "QU" : " ", -#endif - name); - } - - if (!FreeLibrary (k32)) - keyeprint ("dump_sysinfo: FreeLibrary()"); - SetErrorMode (prev_mode); - if (givehelp) - { - printf ("fd=floppy, hd=hard drive, cd=CD-ROM, net=Network Share\n"); - printf ("CP=Case Preserving, CS=Case Sensitive, UN=Unicode\n"); - printf - ("PA=Persistent ACLS, FC=File Compression, VC=Volume Compression\n"); - } - printf ("\n"); - - unsigned ml_fsname = 4, ml_dir = 7, ml_type = 6; - - struct mntent *mnt; - setmntent (0, 0); - while ((mnt = getmntent (0))) - { - unsigned n = (int) strlen (mnt->mnt_fsname); - if (ml_fsname < n) - ml_fsname = n; - n = (int) strlen (mnt->mnt_dir); - if (ml_dir < n) - ml_dir = n; - } - - if (givehelp) - { - printf - ("Mount entries: these map POSIX directories to your NT drives.\n"); - printf ("%-*s %-*s %-*s %s\n", ml_fsname, "-NT-", ml_dir, "-POSIX-", - ml_type, "-Type-", "-Flags-"); - } - - setmntent (0, 0); - while ((mnt = getmntent (0))) - { - printf ("%-*s %-*s %-*s %s\n", - ml_fsname, mnt->mnt_fsname, - ml_dir, mnt->mnt_dir, ml_type, mnt->mnt_type, mnt->mnt_opts); - } - printf ("\n"); - - add_path ((char *) "\\bin", 4); /* just in case */ - - if (givehelp) - printf - ("Looking to see where common programs can be found, if at all...\n"); - for (i = 0; common_apps[i].name; i++) - if (!find_on_path ((char *) common_apps[i].name, (char *) ".exe", 1, 0)) - { - if (common_apps[i].missing_is_good) - printf ("Not Found: %s (good!)\n", common_apps[i].name); - else - printf ("Not Found: %s\n", common_apps[i].name); - } - printf ("\n"); - - if (givehelp) - printf ("Looking for various Cygnus DLLs... (-v gives version info)\n"); - for (i = 0; i < num_paths; i++) - { - WIN32_FIND_DATA ffinfo; - sprintf (tmp, "%s/*.*", paths[i]); - HANDLE ff = FindFirstFile (tmp, &ffinfo); - int found = (ff != INVALID_HANDLE_VALUE); - found_cygwin_dll = NULL; - while (found) - { - char *f = ffinfo.cFileName; - if (strcasecmp (f + strlen (f) - 4, ".dll") == 0) - { - if (strncasecmp (f, "cyg", 3) == 0) - { - sprintf (tmp, "%s\\%s", paths[i], f); - if (strcasecmp (f, "cygwin1.dll") == 0) - found_cygwin_dll = strdup (tmp); - else - ls (tmp); - } - } - found = FindNextFile (ff, &ffinfo); - } - if (found_cygwin_dll) - { - ls (found_cygwin_dll); - free (found_cygwin_dll); - } - - FindClose (ff); - } -} - -static int -check_keys () -{ - HANDLE h = CreateFileA ("CONIN$", GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - - if (h == INVALID_HANDLE_VALUE || h == NULL) - return (keyeprint ("check_key: Opening CONIN$")); - - DWORD mode; - - if (!GetConsoleMode (h, &mode)) - keyeprint ("check_keys: GetConsoleMode()"); - else - { - mode &= ~ENABLE_PROCESSED_INPUT; - if (!SetConsoleMode (h, mode)) - keyeprint ("check_keys: GetConsoleMode()"); - } - - fputs ("\nThis key check works only in a console window,", stderr); - fputs (" _NOT_ in a terminal session!\n", stderr); - fputs ("Abort with Ctrl+C if in a terminal session.\n\n", stderr); - fputs ("Press `q' to exit.\n", stderr); - - INPUT_RECORD in, prev_in; - - // Drop first <RETURN> key - ReadConsoleInput (h, &in, 1, &mode); - - memset (&in, 0, sizeof in); - - do - { - prev_in = in; - if (!ReadConsoleInput (h, &in, 1, &mode)) - keyeprint ("ReadConsoleInput"); - - if (!memcmp (&in, &prev_in, sizeof in)) - continue; - - switch (in.EventType) - { - case KEY_EVENT: - printf ("%s %ux VK: 0x%02x VS: 0x%02x A: 0x%02x CTRL: ", - in.Event.KeyEvent.bKeyDown ? "Pressed " : "Released", - in.Event.KeyEvent.wRepeatCount, - in.Event.KeyEvent.wVirtualKeyCode, - in.Event.KeyEvent.wVirtualScanCode, - (unsigned char) in.Event.KeyEvent.uChar.AsciiChar); - fputs (in.Event.KeyEvent.dwControlKeyState & CAPSLOCK_ON ? - "CL " : "-- ", stdout); - fputs (in.Event.KeyEvent.dwControlKeyState & ENHANCED_KEY ? - "EK " : "-- ", stdout); - fputs (in.Event.KeyEvent.dwControlKeyState & LEFT_ALT_PRESSED ? - "LA " : "-- ", stdout); - fputs (in.Event.KeyEvent.dwControlKeyState & LEFT_CTRL_PRESSED ? - "LC " : "-- ", stdout); - fputs (in.Event.KeyEvent.dwControlKeyState & NUMLOCK_ON ? - "NL " : "-- ", stdout); - fputs (in.Event.KeyEvent.dwControlKeyState & RIGHT_ALT_PRESSED ? - "RA " : "-- ", stdout); - fputs (in.Event.KeyEvent.dwControlKeyState & RIGHT_CTRL_PRESSED ? - "RC " : "-- ", stdout); - fputs (in.Event.KeyEvent.dwControlKeyState & SCROLLLOCK_ON ? - "SL " : "-- ", stdout); - fputs (in.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED ? - "SH " : "-- ", stdout); - fputc ('\n', stdout); - break; - - default: - break; - } - } - while (in.EventType != KEY_EVENT || - in.Event.KeyEvent.bKeyDown != FALSE || - in.Event.KeyEvent.uChar.AsciiChar != 'q'); - - CloseHandle (h); - return 0; -} - -static void -usage (FILE * stream, int status) -{ - fprintf (stream, "\ -Usage: cygcheck [OPTIONS] [PROGRAM...]\n\ -Check system information or PROGRAM library dependencies\n\ -\n\ - -c, --check-setup check packages installed via setup.exe\n\ - -d, --dump-only no integrity checking of package contents (requires -c)\n\ - -s, --sysinfo system information (not with -k)\n\ - -v, --verbose verbose output (indented) (for -[cfls] or programs)\n\ - -r, --registry registry search (requires -s)\n\ - -k, --keycheck perform a keyboard check session (not with -[scfl])\n\ - -f, --find-package find installed packages containing files (not with -[cl])\n\ - -l, --list-package list the contents of installed packages (not with -[cf])\n\ - -h, --help give help about the info (not with -[cfl])\n\ - -V, --version output version information and exit\n\ -You must at least give either -s or -k or a program name\n"); - exit (status); -} - -struct option longopts[] = { - {"check-setup", no_argument, NULL, 'c'}, - {"dump-only", no_argument, NULL, 'd'}, - {"sysinfo", no_argument, NULL, 's'}, - {"registry", no_argument, NULL, 'r'}, - {"verbose", no_argument, NULL, 'v'}, - {"keycheck", no_argument, NULL, 'k'}, - {"find-package", no_argument, NULL, 'f'}, - {"list-package", no_argument, NULL, 'l'}, - {"help", no_argument, NULL, 'h'}, - {"version", no_argument, 0, 'V'}, - {0, no_argument, NULL, 0} -}; - -static char opts[] = "cdfhklrsvV"; - -static void -print_version () -{ - const char *v = strchr (version, ':'); - int len; - if (!v) - { - v = "?"; - len = 1; - } - else - { - v += 2; - len = strchr (v, ' ') - v; - } - printf ("\ -cygcheck version %.*s\n\ -System Checker for Cygwin\n\ -Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.\n\ -Compiled on %s\n\ -", len, v, __DATE__); -} - -int -main (int argc, char **argv) -{ - int i; - - (void) putenv("POSIXLY_CORRECT=1"); - while ((i = getopt_long (argc, argv, opts, longopts, NULL)) != EOF) - switch (i) - { - case 's': - sysinfo = 1; - break; - case 'c': - check_setup = 1; - break; - case 'd': - dump_only = 1; - break; - case 'r': - registry = 1; - break; - case 'v': - verbose = 1; - break; - case 'k': - keycheck = 1; - break; - case 'f': - find_package = 1; - break; - case 'l': - list_package = 1; - break; - case 'h': - givehelp = 1; - break; - case 'V': - print_version (); - exit (0); - default: - usage (stderr, 1); - /*NOTREACHED*/} - argc -= optind; - argv += optind; - - if (argc == 0 && !sysinfo && !keycheck && !check_setup) - if (givehelp) - usage (stdout, 0); - else - usage (stderr, 1); - - if ((check_setup || sysinfo || find_package || list_package) && keycheck) - usage (stderr, 1); - - if ((find_package || list_package) && check_setup) - usage (stderr, 1); - - if (dump_only && !check_setup) - usage (stderr, 1); - - if (find_package && list_package) - usage (stderr, 1); - - if (keycheck) - return check_keys (); - - init_paths (); - - /* FIXME: Add help for check_setup and {list,find}_package */ - if (argc >= 1 && givehelp && !check_setup && !find_package && !list_package) - { - printf("Here is where the OS will find your program%s, and which dlls\n", - argc > 1 ? "s" : ""); - printf ("will be used for it. Use -v to see DLL version info\n"); - - if (!sysinfo) - printf ("\n"); - } - - if (check_setup) - { - dump_setup (verbose, argv, !dump_only); - } - else if (find_package) - { - package_find (verbose, argv); - } - else if (list_package) - { - package_list (verbose, argv); - } - else - for (i = 0; i < argc; i++) - { - if (i) - puts (""); - cygcheck (argv[i]); - } - - if (sysinfo) - { - dump_sysinfo (); - if (!check_setup) - { - puts (""); - dump_setup (verbose, NULL, false); - } - - if (!givehelp) - puts ("Use -h to see help about each section"); - } - - return 0; -} diff --git a/winsup/utils/cygpath.cc b/winsup/utils/cygpath.cc deleted file mode 100644 index 45372e327..000000000 --- a/winsup/utils/cygpath.cc +++ /dev/null @@ -1,811 +0,0 @@ -/* cygpath.cc -- convert pathnames between Windows and Unix format - Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#define NOCOMATTRIBUTE - -#include <shlobj.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <limits.h> -#include <getopt.h> -#include <windows.h> -#include <io.h> -#include <sys/fcntl.h> -#include <sys/cygwin.h> -#include <ctype.h> -#include <errno.h> - -static const char version[] = "$Revision$"; - -static char *prog_name; -static char *file_arg; -static int path_flag, unix_flag, windows_flag, absolute_flag; -static int shortname_flag, longname_flag; -static int ignore_flag, allusers_flag, output_flag; -static int mixed_flag; -static const char *format_type_arg; - -static struct option long_options[] = { - {(char *) "absolute", no_argument, NULL, 'a'}, - {(char *) "close", required_argument, NULL, 'c'}, - {(char *) "dos", no_argument, NULL, 'd'}, - {(char *) "file", required_argument, NULL, 'f'}, - {(char *) "help", no_argument, NULL, 'h'}, - {(char *) "ignore", no_argument, NULL, 'i'}, - {(char *) "long-name", no_argument, NULL, 'l'}, - {(char *) "mixed", no_argument, NULL, 'm'}, - {(char *) "mode", no_argument, NULL, 'M'}, - {(char *) "option", no_argument, NULL, 'o'}, - {(char *) "path", no_argument, NULL, 'p'}, - {(char *) "short-name", no_argument, NULL, 's'}, - {(char *) "type", required_argument, NULL, 't'}, - {(char *) "unix", no_argument, NULL, 'u'}, - {(char *) "version", no_argument, NULL, 'v'}, - {(char *) "windows", no_argument, NULL, 'w'}, - {(char *) "allusers", no_argument, NULL, 'A'}, - {(char *) "desktop", no_argument, NULL, 'D'}, - {(char *) "homeroot", no_argument, NULL, 'H'}, - {(char *) "smprograms", no_argument, NULL, 'P'}, - {(char *) "sysdir", no_argument, NULL, 'S'}, - {(char *) "windir", no_argument, NULL, 'W'}, - {0, no_argument, 0, 0} -}; - -static char options[] = "ac:df:hilmMopst:uvwADHPSW"; - -static void -usage (FILE * stream, int status) -{ - if (!ignore_flag || !status) - fprintf (stream, "\ -Usage: %s (-d|-m|-u|-w|-t TYPE) [-c HANDLE] [-f FILE] [options] NAME\n\ - %s [-ADHPSW] \n\ -Convert Unix and Windows format paths, or output system path information\n\ -\n\ -Output type options:\n\ - -d, --dos print DOS (short) form of NAME (C:\\PROGRA~1\\)\n\ - -m, --mixed like --windows, but with regular slashes (C:/WINNT)\n\ - -M, --mode report on mode of file (binmode or textmode)\n\ - -u, --unix (default) print Unix form of NAME (/cygdrive/c/winnt)\n\ - -w, --windows print Windows form of NAME (C:\\WINNT)\n\ - -t, --type TYPE print TYPE form: 'dos', 'mixed', 'unix', or 'windows'\n\ -Path conversion options:\n\ - -a, --absolute output absolute path\n\ - -l, --long-name print Windows long form of NAME (with -w, -m only)\n\ - -p, --path NAME is a PATH list (i.e., '/bin:/usr/bin')\n\ - -s, --short-name print DOS (short) form of NAME (with -w, -m only)\n\ -System information:\n\ - -A, --allusers use `All Users' instead of current user for -D, -P\n\ - -D, --desktop output `Desktop' directory and exit\n\ - -H, --homeroot output `Profiles' directory (home root) and exit\n\ - -P, --smprograms output Start Menu `Programs' directory and exit\n\ - -S, --sysdir output system directory and exit\n\ - -W, --windir output `Windows' directory and exit\n\ -", prog_name, prog_name); - if (ignore_flag) - /* nothing to do */; - else if (stream != stdout) - fprintf(stream, "Try `%s --help' for more information.\n", prog_name); - else - { - fprintf (stream, "\ -Other options:\n\ - -f, --file FILE read FILE for input; use - to read from STDIN\n\ - -o, --option read options from FILE as well (for use with --file)\n\ - -c, --close HANDLE close HANDLE (for use in captured process)\n\ - -i, --ignore ignore missing argument\n\ - -h, --help output usage information and exit\n\ - -v, --version output version information and exit\n\ -"); - } - exit (ignore_flag ? 0 : status); -} - -static char * -get_short_paths (char *path) -{ - char *sbuf; - char *sptr; - char *next; - char *ptr = path; - char *end = strrchr (path, 0); - DWORD acc = 0; - DWORD len; - - while (ptr != NULL) - { - next = ptr; - ptr = strchr (ptr, ';'); - if (ptr) - *ptr++ = 0; - len = GetShortPathName (next, NULL, 0); - if (!len) - { - fprintf (stderr, "%s: cannot create short name of %s\n", prog_name, - next); - exit (2); - } - acc += len + 1; - } - sptr = sbuf = (char *) malloc (acc + 1); - if (sbuf == NULL) - { - fprintf (stderr, "%s: out of memory\n", prog_name); - exit (1); - } - ptr = path; - for (;;) - { - len = GetShortPathName (ptr, sptr, acc); - if (!len) - { - fprintf (stderr, "%s: cannot create short name of %s\n", prog_name, - ptr); - exit (2); - } - - ptr = strrchr (ptr, 0); - sptr = strrchr (sptr, 0); - if (ptr == end) - break; - *sptr = ';'; - ++ptr, ++sptr; - acc -= len + 1; - } - return sbuf; -} - -static char * -get_short_name (const char *filename) -{ - char *sbuf, buf[MAX_PATH]; - DWORD len = GetShortPathName (filename, buf, MAX_PATH); - if (!len) - { - fprintf (stderr, "%s: cannot create short name of %s\n", prog_name, - filename); - exit (2); - } - sbuf = (char *) malloc (++len); - if (sbuf == NULL) - { - fprintf (stderr, "%s: out of memory\n", prog_name); - exit (1); - } - return strcpy (sbuf, buf); -} - -static DWORD WINAPI -get_long_path_name_w32impl (LPCSTR src, LPSTR sbuf, DWORD) -{ - char buf1[MAX_PATH], buf2[MAX_PATH], *ptr; - const char *pelem, *next; - WIN32_FIND_DATA w32_fd; - int len; - - strcpy (buf1, src); - *buf2 = 0; - pelem = src; - ptr = buf2; - while (pelem) - { - next = pelem; - if (*next == '\\') - { - strcat (ptr++, "\\"); - pelem++; - if (!*pelem) - break; - continue; - } - pelem = strchr (next, '\\'); - len = pelem ? (pelem++ - next) : strlen (next); - strncpy (ptr, next, len); - ptr[len] = 0; - if (next[1] != ':' && strcmp(next, ".") && strcmp(next, "..")) - { - if (FindFirstFile (buf2, &w32_fd) != INVALID_HANDLE_VALUE) - strcpy (ptr, w32_fd.cFileName); - } - ptr += strlen (ptr); - if (pelem) - { - *ptr++ = '\\'; - *ptr = 0; - } - } - if (sbuf) - strcpy (sbuf, buf2); - SetLastError (0); - return strlen (buf2) + (sbuf ? 0 : 1); -} - -static char * -get_long_name (const char *filename, DWORD& len) -{ - char *sbuf, buf[MAX_PATH]; - static HINSTANCE k32 = LoadLibrary ("kernel32.dll"); - static DWORD (WINAPI *GetLongPathName) (LPCSTR, LPSTR, DWORD) = - (DWORD (WINAPI *) (LPCSTR, LPSTR, DWORD)) GetProcAddress (k32, "GetLongPathName"); - if (!GetLongPathName) - GetLongPathName = get_long_path_name_w32impl; - - len = GetLongPathName (filename, buf, MAX_PATH); - if (len == 0 && GetLastError () == ERROR_INVALID_PARAMETER) - { - fprintf (stderr, "%s: cannot create long name of %s\n", prog_name, - filename); - exit (2); - } - sbuf = (char *) malloc (len + 1); - if (!sbuf) - { - fprintf (stderr, "%s: out of memory\n", prog_name); - exit (1); - } - return strcpy (sbuf, buf); -} - -static char * -get_long_paths (char *path) -{ - char *sbuf; - char *ptr; - int n = 1; - - ptr = path; - while ((ptr = strchr (ptr, ';'))) - { - ptr++; - n++; - } - - char *paths[n]; - DWORD acc = 0; - int i; - if (!n) - return strdup (""); - - for (i = 0, ptr = path; ptr; i++) - { - DWORD len; - char *next = ptr; - ptr = strchr (ptr, ';'); - if (ptr) - *ptr++ = 0; - paths[i] = get_long_name (next, len); - acc += len + 1; - } - - sbuf = (char *) malloc (acc + 1); - if (sbuf == NULL) - { - fprintf (stderr, "%s: out of memory\n", prog_name); - exit (1); - } - - sbuf[0] = '\0'; - for (i = 0; i < n; i++) - { - strcat (strcat (sbuf, paths[i]), ";"); - free (paths[i]); - } - - strchr (sbuf, '\0')[-1] = '\0'; - return sbuf; -} - -static void -convert_slashes (char* name) -{ - while ((name = strchr (name, '\\')) != NULL) - { - if (*name == '\\') - *name = '/'; - name++; - } -} - -static char * -get_mixed_name (const char* filename) -{ - char* mixed_buf = strdup (filename); - - if (mixed_buf == NULL) - { - fprintf (stderr, "%s: out of memory\n", prog_name); - exit (1); - } - - convert_slashes (mixed_buf); - - return mixed_buf; -} - -static void -dowin (char option) -{ - char *buf, buf1[MAX_PATH], buf2[MAX_PATH]; - DWORD len = MAX_PATH; - WIN32_FIND_DATA w32_fd; - LPITEMIDLIST id; - HINSTANCE k32; - BOOL (*GetProfilesDirectoryAPtr) (LPSTR, LPDWORD) = 0; - - buf = buf1; - switch (option) - { - case 'D': - SHGetSpecialFolderLocation (NULL, allusers_flag ? - CSIDL_COMMON_DESKTOPDIRECTORY : CSIDL_DESKTOPDIRECTORY, &id); - SHGetPathFromIDList (id, buf); - /* This if clause is a Fix for Win95 without any "All Users" */ - if (strlen (buf) == 0) - { - SHGetSpecialFolderLocation (NULL, CSIDL_DESKTOPDIRECTORY, &id); - SHGetPathFromIDList (id, buf); - } - break; - - case 'P': - SHGetSpecialFolderLocation (NULL, allusers_flag ? - CSIDL_COMMON_PROGRAMS : CSIDL_PROGRAMS, &id); - SHGetPathFromIDList (id, buf); - /* This if clause is a Fix for Win95 without any "All Users" */ - if (strlen (buf) == 0) - { - SHGetSpecialFolderLocation (NULL, CSIDL_PROGRAMS, &id); - SHGetPathFromIDList (id, buf); - } - break; - - case 'H': - k32 = LoadLibrary ("userenv"); - if (k32) - GetProfilesDirectoryAPtr = (BOOL (*) (LPSTR, LPDWORD)) - GetProcAddress (k32, "GetProfilesDirectoryA"); - if (GetProfilesDirectoryAPtr) - (*GetProfilesDirectoryAPtr) (buf, &len); - else - { - GetWindowsDirectory (buf, MAX_PATH); - strcat (buf, "\\Profiles"); - } - break; - - case 'S': - GetSystemDirectory (buf, MAX_PATH); - FindFirstFile (buf, &w32_fd); - strcpy (strrchr (buf, '\\') + 1, w32_fd.cFileName); - break; - - case 'W': - GetWindowsDirectory (buf, MAX_PATH); - break; - - default: - usage (stderr, 1); - } - - if (!windows_flag) - { - if (cygwin_conv_to_posix_path (buf, buf2)) - fprintf (stderr, "%s: error converting \"%s\" - %s\n", - prog_name, buf, strerror (errno)); - else - buf = buf2; - } - else - { - if (shortname_flag) - buf = get_short_name (buf); - if (mixed_flag) - buf = get_mixed_name (buf); - } - printf ("%s\n", buf); - exit (0); -} - -static void -report_mode (char *filename) -{ - switch (cygwin_internal (CW_GET_BINMODE, filename)) - { - case O_BINARY: - printf ("%s: binary\n", filename); - break; - case O_TEXT: - printf ("%s: text\n", filename); - break; - default: - fprintf (stderr, "%s: file '%s' - %s\n", prog_name, filename, - strerror (errno)); - break; - } -} - -static void -doit (char *filename) -{ - char *buf; - DWORD len; - int err; - int (*conv_func) (const char *, char *); - - if (!path_flag) - { - len = strlen (filename); - if (len) - len += MAX_PATH + 1001; - else if (ignore_flag) - exit (0); - else - { - fprintf (stderr, "%s: can't convert empty path\n", prog_name); - exit (1); - } - } - else if (unix_flag) - len = cygwin_win32_to_posix_path_list_buf_size (filename); - else - len = cygwin_posix_to_win32_path_list_buf_size (filename); - - buf = (char *) malloc (len); - if (buf == NULL) - { - fprintf (stderr, "%s: out of memory\n", prog_name); - exit (1); - } - - if (path_flag) - { - if (unix_flag) - err = cygwin_win32_to_posix_path_list (filename, buf); - else - { - err = cygwin_posix_to_win32_path_list (filename, buf); - if (err) - /* oops */; - if (shortname_flag) - buf = get_short_paths (buf); - if (longname_flag) - buf = get_long_paths (buf); - if (mixed_flag) - buf = get_mixed_name (buf); - } - if (err) - { - fprintf (stderr, "%s: error converting \"%s\" - %s\n", - prog_name, filename, strerror (errno)); - exit (1); - } - } - else - { - if (unix_flag) - conv_func = (absolute_flag ? cygwin_conv_to_full_posix_path : - cygwin_conv_to_posix_path); - else - conv_func = (absolute_flag ? cygwin_conv_to_full_win32_path : - cygwin_conv_to_win32_path); - err = conv_func (filename, buf); - if (mixed_flag) - buf = get_mixed_name (buf); - if (err) - { - fprintf (stderr, "%s: error converting \"%s\" - %s\n", - prog_name, filename, strerror (errno)); - exit (1); - } - if (!unix_flag) - { - if (shortname_flag) - buf = get_short_name (buf); - if (longname_flag) - buf = get_long_name (buf, len); - } - } - - puts (buf); -} - -static void -print_version () -{ - const char *v = strchr (version, ':'); - int len; - if (!v) - { - v = "?"; - len = 1; - } - else - { - v += 2; - len = strchr (v, ' ') - v; - } - printf ("\ -cygpath (cygwin) %.*s\n\ -Path Conversion Utility\n\ -Copyright 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.\n\ -Compiled on %s\n\ -", len, v, __DATE__); -} - -int -main (int argc, char **argv) -{ - int c, o = 0; - int options_from_file_flag; - int mode_flag; - - prog_name = strrchr (argv[0], '/'); - if (prog_name == NULL) - prog_name = strrchr (argv[0], '\\'); - if (prog_name == NULL) - prog_name = argv[0]; - else - prog_name++; - - path_flag = 0; - unix_flag = 1; - windows_flag = 0; - shortname_flag = 0; - longname_flag = 0; - mixed_flag = 0; - ignore_flag = 0; - options_from_file_flag = 0; - allusers_flag = 0; - output_flag = 0; - mode_flag = 0; - while ((c = getopt_long (argc, argv, options, - long_options, (int *) NULL)) != EOF) - { - switch (c) - { - case 'a': - absolute_flag = 1; - break; - - case 'c': - CloseHandle ((HANDLE) strtoul (optarg, NULL, 16)); - break; - - case 'd': - if (windows_flag) - usage (stderr, 1); - unix_flag = 0; - windows_flag = 1; - shortname_flag = 1; - break; - - case 'f': - file_arg = optarg; - break; - - case 'M': - mode_flag = 1; - break; - - case 'o': - options_from_file_flag = 1; - break; - - case 'p': - path_flag = 1; - break; - - case 'u': - if (windows_flag || mixed_flag) - usage (stderr, 1); - unix_flag = 1; - break; - - case 'w': - if (windows_flag || mixed_flag) - usage (stderr, 1); - unix_flag = 0; - windows_flag = 1; - break; - - case 'm': - unix_flag = 0; - windows_flag = 1; - mixed_flag = 1; - break; - - case 'l': - longname_flag = 1; - break; - - case 's': - shortname_flag = 1; - break; - - case 't': - if (optarg == NULL) - usage (stderr, 1); - - format_type_arg = (*optarg == '=') ? (optarg + 1) : (optarg); - if (strcasecmp (format_type_arg, "dos") == 0) - { - if (windows_flag || longname_flag) - usage (stderr, 1); - unix_flag = 0; - windows_flag = 1; - shortname_flag = 1; - } - else if (strcasecmp (format_type_arg, "mixed") == 0) - { - unix_flag = 0; - mixed_flag = 1; - } - else if (strcasecmp (format_type_arg, "unix") == 0) - { - if (windows_flag) - usage (stderr, 1); - unix_flag = 1; - } - else if (strcasecmp (format_type_arg, "windows") == 0) - { - if (mixed_flag) - usage (stderr, 1); - unix_flag = 0; - windows_flag = 1; - } - else - usage (stderr, 1); - break; - - case 'A': - allusers_flag = 1; - break; - - case 'D': - case 'H': - case 'P': - case 'S': - case 'W': - if (output_flag) - usage (stderr, 1); - output_flag = 1; - o = c; - break; - - case 'i': - ignore_flag = 1; - break; - - case 'h': - usage (stdout, 0); - break; - - case 'v': - print_version (); - exit (0); - - default: - usage (stderr, 1); - break; - } - } - - if (options_from_file_flag && !file_arg) - usage (stderr, 1); - - if (longname_flag && !windows_flag) - usage (stderr, 1); - - if (shortname_flag && !windows_flag) - usage (stderr, 1); - - if (!unix_flag && !windows_flag && !mixed_flag && !options_from_file_flag) - usage (stderr, 1); - - if (!file_arg) - { - if (output_flag) - dowin (o); - - if (optind > argc - 1) - usage (stderr, 1); - - for (int i = optind; argv[i]; i++) - if (mode_flag) - report_mode (argv[i]); - else - doit (argv[i]); - } - else - { - FILE *fp; - char buf[PATH_MAX * 2 + 1]; - - if (argv[optind]) - usage (stderr, 1); - - if (strcmp (file_arg, "-") != 0) - fp = fopen (file_arg, "rt"); - else - { - fp = stdin; - setmode (0, O_TEXT); - } - if (fp == NULL) - { - perror ("cygpath"); - exit (1); - } - - setbuf (stdout, NULL); - while (fgets (buf, sizeof (buf), fp) != NULL) - { - char *s = buf; - char *p = strchr (s, '\n'); - if (p) - *p = '\0'; - if (options_from_file_flag && *s == '-') - { - char c; - for (c = *++s; c && !isspace (c); c = *++s) - switch (c) - { - case 'a': - absolute_flag = 1; - break; - case 'i': - ignore_flag = 1; - break; - case 's': - shortname_flag = 1; - longname_flag = 0; - break; - case 'l': - shortname_flag = 0; - longname_flag = 1; - break; - case 'm': - unix_flag = 0; - windows_flag = 1; - mixed_flag = 1; - case 'w': - unix_flag = 0; - windows_flag = 1; - break; - case 'u': - windows_flag = 0; - unix_flag = 1; - break; - case 'p': - path_flag = 1; - break; - case 'D': - case 'H': - case 'P': - case 'S': - case 'W': - output_flag = 1; - o = c; - break; - } - if (*s) - do - s++; - while (*s && isspace (*s)); - } - if (*s && !output_flag) - doit (s); - if (!*s && output_flag) - dowin (o); - } - } - - exit (0); -} diff --git a/winsup/utils/dump_setup.cc b/winsup/utils/dump_setup.cc deleted file mode 100644 index 11d32c4af..000000000 --- a/winsup/utils/dump_setup.cc +++ /dev/null @@ -1,502 +0,0 @@ -/* dump_setup.cc - - Copyright 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include <windows.h> -#include <stdio.h> -#include <stdlib.h> -#include <ctype.h> -#include <stdlib.h> -#include <string.h> -#include <io.h> -#include <sys/stat.h> -#include <errno.h> -#include "path.h" -#if 0 -#include "zlib.h" -#endif - -#ifndef ZLIB_VERSION -typedef void * gzFile; -#define gzgets(fp, buf, size) ({0;}) -#define gzclose(fp) ({0;}) -#endif - -static int package_len = 20; -static unsigned int version_len = 10; - - -typedef struct -{ - char pkgtar[MAX_PATH + 1]; - char pkg[MAX_PATH + 1]; - char ver[MAX_PATH + 1]; - char tail[MAX_PATH + 1]; - char what[16]; -} fileparse; - -static int -find_tar_ext (const char *path) -{ - char *p = strchr (path, '\0') - 7; - if (p <= path) - return 0; - if (*p == '.') - { - if (strcmp (p, ".tar.gz") != 0) - return 0; - } - else if (--p <= path || strcmp (p, ".tar.bz2") != 0) - return 0; - - return p - path; -} - -static char * -base (const char *s) -{ - if (!s) - return 0; - const char *rv = s; - while (*s) - { - if ((*s == '/' || *s == ':' || *s == '\\') && s[1]) - rv = s + 1; - s++; - } - return (char *) rv; -} - -/* Parse a filename into package, version, and extension components. */ -int -parse_filename (const char *in_fn, fileparse& f) -{ - char *p, *ver; - char fn[strlen (in_fn) + 1]; - - strcpy (fn, in_fn); - int n = find_tar_ext (fn); - - if (!n) - return 0; - - strcpy (f.tail, fn + n); - fn[n] = '\0'; - f.pkg[0] = f.what[0] = '\0'; - p = base (fn); - for (ver = p; *ver; ver++) - if (*ver == '-') - if (isdigit (ver[1])) - { - *ver++ = 0; - strcpy (f.pkg, p); - break; - } - else if (strcasecmp (ver, "-src") == 0 || - strcasecmp (ver, "-patch") == 0) - { - *ver++ = 0; - strcpy (f.pkg, p); - strcpy (f.what, strlwr (ver)); - strcpy (f.pkgtar, p); - strcat (f.pkgtar, f.tail); - ver = strchr (ver, '\0'); - break; - } - - if (!f.pkg[0]) - strcpy (f.pkg, p); - - if (!f.what[0]) - { - int n; - p = strchr (ver, '\0'); - strcpy (f.pkgtar, in_fn); - if ((p -= 4) >= ver && strcasecmp (p, "-src") == 0) - n = 4; - else if ((p -= 2) >= ver && strcasecmp (p, "-patch") == 0) - n = 6; - else - n = 0; - if (n) - { - strcpy (f.what, p + 1); - *p = '\0'; - p = f.pkgtar + (p - fn) + n; - memmove (p - 4, p, strlen (p)); - } - } - - strcpy (f.ver, *ver ? ver : "0.0"); - return 1; -} - -static bool -dump_file (const char *msg, const char *fn) -{ - char *path = cygpath ("/etc/setup/", fn, NULL); - FILE *fp = fopen (path, "rt"); - bool printed; - char buf[4096]; - if (!fp) - printed = false; - else if (!fgets (buf, 4096, fp)) - printed = false; - { - char *p = strchr (buf, '\0'); - printf ("%s%s%s", msg, buf, (p == buf) || p[-1] != '\n' ? "\n" : ""); - printed = true; - } - if (fp) - fclose (fp); - return printed; -} - -struct pkgver -{ - char *name; - char *ver; -}; - -extern "C" { -int -compar (const void *a, const void *b) -{ - const pkgver *pa = (const pkgver *) a; - const pkgver *pb = (const pkgver *) b; - return strcasecmp (pa->name, pb->name); -} -} - -int -match_argv (char **argv, const char *name) -{ - if (!argv || !*argv) - return -1; - for (char **a = argv; *a; a++) - if (strcasecmp (*a, name) == 0) - return a - argv + 1; - return 0; -} - -static bool -could_not_access (int verbose, char *filename, char *package, const char *type) -{ - switch (errno) - { - case ENOTDIR: - break; - case ENOENT: - if (verbose) - printf ("Missing %s: /%s from package %s\n", - type, filename, package); - return true; - case EACCES: - if (verbose) - printf ("Unable to access %s /%s from package %s\n", - type, filename, package); - return true; - } - return false; -} - -static bool -directory_exists (int verbose, char *filename, char *package) -{ - struct stat status; - if (stat(cygpath("/", filename, ".", NULL), &status)) - { - if (could_not_access (verbose, filename, package, "directory")) - return false; - } - else if (!S_ISDIR(status.st_mode)) - { - if (verbose) - printf ("Directory/file mismatch: /%s from package %s\n", filename, package); - return false; - } - return true; -} - -static bool -file_exists (int verbose, char *filename, const char *alt, char *package) -{ - struct stat status; - if (stat(cygpath("/", filename, NULL), &status) && - (!alt || stat(cygpath("/", filename, alt, NULL), &status))) - { - if (could_not_access (verbose, filename, package, "file")) - return false; - } - else if (!S_ISREG(status.st_mode)) - { - if (verbose) - printf ("File type mismatch: /%s from package %s\n", filename, package); - return false; - } - return true; -} - -static gzFile -open_package_list (char *package) -{ - char filelist[MAX_PATH + 1] = "/etc/setup/"; - strcat (strcat (filelist, package), ".lst.gz"); - if (!file_exists (false, filelist + 1, NULL, NULL)) - return NULL; - - gzFile fp; -#ifndef ZLIB_VERSION - fp = NULL; -#else - char *fn = cygpath (filelist, NULL); - fp = gzopen (fn, "rb9"); - free (fn); -#endif - - return fp; -} - -static bool -check_package_files (int verbose, char *package) -{ - gzFile fp = open_package_list (package); - if (!fp) - { - if (verbose) - printf ("Empty package %s\n", package); - return true; - } - - bool result = true; - char buf[MAX_PATH + 1]; - while (gzgets (fp, buf, MAX_PATH)) - { - char *filename = strtok(buf, "\n"); - - if (*filename == '/') - ++filename; - else if (!strncmp (filename, "./", 2)) - filename += 2; - - if (filename[strlen (filename) - 1] == '/') - { - if (!directory_exists (verbose, filename, package)) - result = false; - } - else if (!strncmp (filename, "etc/postinstall/", 16)) - { - if (!file_exists (verbose, filename, ".done", package)) - result = false; - } - else - { - if (!file_exists (verbose, filename, ".lnk", package)) - result = false; - } - } - - gzclose (fp); - return result; -} - -/** - * Returns a calloc'd sorted list of packages or NULL if no info. - * The last entry in the list is {NULL,NULL}. - */ -static pkgver * -get_packages (char **argv) { - char *setup = cygpath ("/etc/setup/installed.db", NULL); - FILE *fp = fopen (setup, "rt"); - - if (fp == NULL) - return NULL; - - int nlines; - nlines = 0; - char buf[4096]; - while (fgets (buf, 4096, fp)) - nlines += 2; /* potentially binary + source */ - if (!nlines) - { - fclose (fp); - return NULL; - } - rewind (fp); - - pkgver *packages; - - packages = (pkgver *) calloc (nlines + 1, sizeof(packages[0])); - int n; - for (n = 0; fgets (buf, 4096, fp) && n < nlines;) - { - char *package = strtok (buf, " "); - if (!package || !*package || !match_argv (argv, package)) - continue; - for (int i = 0; i < 2; i++) - { - fileparse f; - char *tar = strtok (NULL, " "); - if (!tar || !*tar || !parse_filename (tar, f)) - break; - - int len = strlen (package); - if (f.what[0]) - len += strlen (f.what) + 1; - if (len > package_len) - package_len = len; - packages[n].name = (char *) malloc (len + 1); - strcpy (packages[n].name , package); - if (f.what[0]) - strcat (strcat (packages[n].name, "-"), f.what); - packages[n].ver = strdup (f.ver); - if (strlen(f.ver) > version_len) - version_len = strlen(f.ver); - n++; - if (strtok (NULL, " ") == NULL) - break; - } - } - - packages[n].name = packages[n].ver = NULL; - - qsort (packages, n, sizeof (packages[0]), compar); - - fclose (fp); - - return packages; -} - -void -dump_setup (int verbose, char **argv, bool check_files) -{ - pkgver *packages = get_packages(argv); - - puts ("Cygwin Package Information"); - if (packages == NULL) - { - puts ("No setup information found"); - return; - } - - if (verbose) - { - bool need_nl = dump_file ("Last downloaded files to: ", "last-cache"); - if (dump_file ("Last downloaded files from: ", "last-mirror") || need_nl) - puts (""); - } - - printf ("%-*s %-*s %s\n", package_len, "Package", version_len, "Version", check_files?"Status":""); - for (int i = 0; packages[i].name; i++) - { - printf ("%-*s %-*s %s\n", package_len, packages[i].name, version_len, - packages[i].ver, check_files ? - (check_package_files (verbose, packages[i].name) ? "OK" : "Incomplete") : ""); - fflush(stdout); - } - - free (packages); - - return; -} - -void -package_list (int verbose, char **argv) -{ - pkgver *packages = get_packages(argv); - if (packages == NULL) - { - puts ("No setup information found"); - return; - } - - for (int i = 0; packages[i].name; i++) - { - gzFile fp = open_package_list (packages[i].name); - if (!fp) - { - if (verbose) - printf ("Can't open file list /etc/setup/%s.lst.gz for package %s\n", - packages[i].name, packages[i].name); - continue; - } - - if (verbose) - printf ("Package: %s-%s\n", packages[i].name, packages[i].ver); - - char buf[MAX_PATH + 1]; - while (gzgets (fp, buf, MAX_PATH)) - { - char *lastchar = strchr(buf, '\n'); - if (lastchar[-1] != '/') - printf ("%s/%s", (verbose?" ":""), buf); - } - - gzclose (fp); - } - - free (packages); - - return; -} - -void -package_find (int verbose, char **argv) -{ - pkgver *packages = get_packages(NULL); - if (packages == NULL) - { - puts ("No setup information found"); - return; - } - - for (int i = 0; packages[i].name; i++) - { - gzFile fp = open_package_list (packages[i].name); - if (!fp) - continue; - - char buf[MAX_PATH + 2]; - buf[0] = '/'; - while (gzgets (fp, buf + 1, MAX_PATH)) - { - char *filename = strtok(buf, "\n"); - int flen = strlen (filename); - if (filename[flen - 1] != '/') - { - // FIXME: verify that /bin is mounted on /usr/bin; ditto for /lib - bool is_alias = !strncmp(filename, "/usr/bin/", 9) || - !strncmp(filename, "/usr/lib", 9); - int a = match_argv (argv, filename); - if (!a && is_alias) - a = match_argv (argv, filename + 4); - if (!a && !strcmp(filename + flen - 4, ".exe")) - { - filename[flen - 4] = '\0'; - a = match_argv (argv, filename); - } - if (!a && is_alias) - a = match_argv (argv, filename + 4); - if (a > 0) - { - if (verbose) - printf ("%s: found in package ", filename); - printf ("%s-%s\n", packages[i].name, packages[i].ver); - } - } - } - - gzclose (fp); - } - - free (packages); - - return; -} - diff --git a/winsup/utils/dumper.cc b/winsup/utils/dumper.cc deleted file mode 100644 index 5a9beec93..000000000 --- a/winsup/utils/dumper.cc +++ /dev/null @@ -1,881 +0,0 @@ -/* dumper.cc - - Copyright 1999, 2001, 2002 Red Hat Inc. - - Written by Egor Duda <deo@logos-m.ru> - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#include <bfd.h> -#include <elf/common.h> -#include <elf/external.h> -#include <sys/procfs.h> -#include <sys/cygwin.h> -#include <getopt.h> -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <windows.h> - -#include "dumper.h" - -#define NOTE_NAME_SIZE 16 - -typedef struct _note_header - { - Elf_External_Note elf_note_header; - char name[NOTE_NAME_SIZE - 1]; /* external note contains first byte of data */ - } -#ifdef __GNUC__ -__attribute__ ((packed)) -#endif - note_header; - -static const char version[] = "$Revision$"; - -BOOL verbose = FALSE; - -int deb_printf (const char *format,...) -{ - if (!verbose) - return 0; - va_list va; - va_start (va, format); - int ret_val = vprintf (format, va); - va_end (va); - return ret_val; -} - -dumper::dumper (DWORD pid, DWORD tid, const char *file_name) -{ - this->file_name = strdup (file_name); - - this->pid = pid; - this->tid = tid; - core_bfd = NULL; - excl_list = new exclusion (20); - - list = last = NULL; - - status_section = NULL; - - memory_num = module_num = thread_num = 0; - - hProcess = OpenProcess (PROCESS_ALL_ACCESS, - FALSE, /* no inheritance */ - pid); - if (!hProcess) - { - fprintf (stderr, "Failed to open process #%lu, error %ld\n", pid, GetLastError ()); - return; - } - - init_core_dump (); - - if (!sane ()) - dumper_abort (); -} - -dumper::~dumper () -{ - close (); - free (file_name); -} - -void -dumper::dumper_abort () -{ - close (); - unlink (file_name); -} - -void -dumper::close () -{ - if (core_bfd) - bfd_close (core_bfd); - if (excl_list) - delete excl_list; - if (hProcess) - CloseHandle (hProcess); - core_bfd = NULL; - hProcess = NULL; - excl_list = NULL; -} - -int -dumper::sane () -{ - if (hProcess == NULL || core_bfd == NULL || excl_list == NULL) - return 0; - return 1; -} - -void -print_section_name (bfd* abfd, asection* sect, PTR obj) -{ - deb_printf (" %s", bfd_get_section_name (abfd, sect)); -} - -void -dumper::print_core_section_list () -{ - deb_printf ("current sections:"); - bfd_map_over_sections (core_bfd, &print_section_name, NULL); - deb_printf ("\n"); -} - -process_entity * -dumper::add_process_entity_to_list (process_entity_type type) -{ - if (!sane ()) - return NULL; - - process_entity *new_entity = (process_entity *) malloc (sizeof (process_entity)); - if (new_entity == NULL) - return NULL; - new_entity->next = NULL; - new_entity->section = NULL; - if (last == NULL) - list = new_entity; - else - last->next = new_entity; - last = new_entity; - return new_entity; -} - -int -dumper::add_thread (DWORD tid, HANDLE hThread) -{ - if (!sane ()) - return 0; - - CONTEXT *pcontext; - - process_entity *new_entity = add_process_entity_to_list (pr_ent_thread); - if (new_entity == NULL) - return 0; - new_entity->type = pr_ent_thread; - thread_num++; - - new_entity->u.thread.tid = tid; - new_entity->u.thread.hThread = hThread; - - pcontext = &(new_entity->u.thread.context); - pcontext->ContextFlags = CONTEXT_FULL | CONTEXT_FLOATING_POINT; - if (!GetThreadContext (hThread, pcontext)) - { - deb_printf ("Failed to read thread context (tid=%x), error %ld\n", tid, GetLastError ()); - return 0; - } - - deb_printf ("added thread %u\n", tid); - return 1; -} - -int -dumper::add_mem_region (LPBYTE base, DWORD size) -{ - if (!sane ()) - return 0; - - if (base == NULL || size == 0) - return 1; // just ignore empty regions - - process_entity *new_entity = add_process_entity_to_list (pr_ent_memory); - if (new_entity == NULL) - return 0; - new_entity->type = pr_ent_memory; - memory_num++; - - new_entity->u.memory.base = base; - new_entity->u.memory.size = size; - - deb_printf ("added memory region %08x-%08x\n", (DWORD) base, (DWORD) base + size); - return 1; -} - -/* split_add_mem_region scans list of regions to be excluded from dumping process - (excl_list) and removes all "excluded" parts from given region. */ -int -dumper::split_add_mem_region (LPBYTE base, DWORD size) -{ - if (!sane ()) - return 0; - - if (base == NULL || size == 0) - return 1; // just ignore empty regions - - LPBYTE last_base = base; - - for (process_mem_region * p = excl_list->region; - p < excl_list->region + excl_list->last; - p++) - { - if (p->base >= base + size || p->base + p->size <= base) - continue; - - if (p->base <= base) - { - last_base = p->base + p->size; - continue; - } - - add_mem_region (last_base, p->base - last_base); - last_base = p->base + p->size; - } - - if (last_base < base + size) - add_mem_region (last_base, base + size - last_base); - - return 1; -} - -int -dumper::add_module (LPVOID base_address) -{ - if (!sane ()) - return 0; - - char *module_name = psapi_get_module_name (hProcess, (DWORD) base_address); - if (module_name == NULL) - return 1; - - process_entity *new_entity = add_process_entity_to_list (pr_ent_module); - if (new_entity == NULL) - return 0; - new_entity->type = pr_ent_module; - module_num++; - - new_entity->u.module.base_address = base_address; - new_entity->u.module.name = module_name; - - parse_pe (module_name, excl_list); - - deb_printf ("added module %08x %s\n", base_address, module_name); - return 1; -} - -#define PAGE_BUFFER_SIZE 4096 - -int -dumper::collect_memory_sections () -{ - if (!sane ()) - return 0; - - LPBYTE current_page_address; - LPBYTE last_base = (LPBYTE) 0xFFFFFFFF; - DWORD last_size = 0; - DWORD done; - - char mem_buf[PAGE_BUFFER_SIZE]; - - MEMORY_BASIC_INFORMATION mbi; - - if (hProcess == NULL) - return 0; - - for (current_page_address = 0; current_page_address < (LPBYTE) 0xFFFF0000;) - { - if (!VirtualQueryEx (hProcess, current_page_address, &mbi, sizeof (mbi))) - break; - - int skip_region_p = 0; - - if (mbi.Protect & (PAGE_NOACCESS | PAGE_GUARD) || - mbi.State != MEM_COMMIT) - skip_region_p = 1; - - if (!skip_region_p) - { - /* just to make sure that later we'll be able to read it. - According to MS docs either region is all-readable or - all-nonreadable */ - if (!ReadProcessMemory (hProcess, current_page_address, mem_buf, sizeof (mem_buf), &done)) - { - DWORD err = GetLastError (); - const char *pt[10]; - pt[0] = (mbi.Protect & PAGE_READONLY) ? "RO " : ""; - pt[1] = (mbi.Protect & PAGE_READWRITE) ? "RW " : ""; - pt[2] = (mbi.Protect & PAGE_WRITECOPY) ? "WC " : ""; - pt[3] = (mbi.Protect & PAGE_EXECUTE) ? "EX " : ""; - pt[4] = (mbi.Protect & PAGE_EXECUTE_READ) ? "EXRO " : ""; - pt[5] = (mbi.Protect & PAGE_EXECUTE_READWRITE) ? "EXRW " : ""; - pt[6] = (mbi.Protect & PAGE_EXECUTE_WRITECOPY) ? "EXWC " : ""; - pt[7] = (mbi.Protect & PAGE_GUARD) ? "GRD " : ""; - pt[8] = (mbi.Protect & PAGE_NOACCESS) ? "NA " : ""; - pt[9] = (mbi.Protect & PAGE_NOCACHE) ? "NC " : ""; - char buf[10 * 6]; - buf[0] = '\0'; - for (int i = 0; i < 10; i++) - strcat (buf, pt[i]); - - deb_printf ("warning: failed to read memory at %08x-%08x (protect = %s), error %ld.\n", - (DWORD) current_page_address, - (DWORD) current_page_address + mbi.RegionSize, - buf, err); - skip_region_p = 1; - } - } - - if (!skip_region_p) - { - if (last_base + last_size == current_page_address) - last_size += mbi.RegionSize; - else - { - split_add_mem_region (last_base, last_size); - last_base = (LPBYTE) mbi.BaseAddress; - last_size = mbi.RegionSize; - } - } - else - { - split_add_mem_region (last_base, last_size); - last_base = NULL; - last_size = 0; - } - - current_page_address += mbi.RegionSize; - } - - /* dump last sections, if any */ - split_add_mem_region (last_base, last_size); - return 1; -}; - -int -dumper::dump_memory_region (asection * to, process_mem_region * memory) -{ - if (!sane ()) - return 0; - - DWORD size = memory->size; - DWORD todo; - DWORD done; - LPBYTE pos = memory->base; - DWORD sect_pos = 0; - - if (to == NULL || memory == NULL) - return 0; - - char mem_buf[PAGE_BUFFER_SIZE]; - - while (size > 0) - { - todo = min (size, PAGE_BUFFER_SIZE); - if (!ReadProcessMemory (hProcess, pos, mem_buf, todo, &done)) - { - deb_printf ("Failed to read process memory at %x(%x), error %ld\n", pos, todo, GetLastError ()); - return 0; - } - size -= done; - pos += done; - if (!bfd_set_section_contents (core_bfd, to, mem_buf, sect_pos, done)) - { - bfd_perror ("writing memory region to bfd"); - dumper_abort (); - return 0; - }; - sect_pos += done; - } - return 1; -} - -int -dumper::dump_thread (asection * to, process_thread * thread) -{ - if (!sane ()) - return 0; - - if (to == NULL || thread == NULL) - return 0; - - win32_pstatus thread_pstatus; - - note_header header; - bfd_putl32 (NOTE_NAME_SIZE, header.elf_note_header.namesz); - bfd_putl32 (sizeof (thread_pstatus), header.elf_note_header.descsz); - bfd_putl32 (NT_WIN32PSTATUS, header.elf_note_header.type); - strncpy ((char *) &header.elf_note_header.name, "win32thread", NOTE_NAME_SIZE); - - thread_pstatus.data_type = NOTE_INFO_THREAD; - thread_pstatus.data.thread_info.tid = thread->tid; - - if (tid == 0) - { - /* this is a special case. we don't know, which thread - was active when exception occured, so let's blame - the first one */ - thread_pstatus.data.thread_info.is_active_thread = TRUE; - tid = (DWORD) - 1; - } - else if (tid > 0 && thread->tid == tid) - thread_pstatus.data.thread_info.is_active_thread = TRUE; - else - thread_pstatus.data.thread_info.is_active_thread = FALSE; - - memcpy (&(thread_pstatus.data.thread_info.thread_context), - &(thread->context), - sizeof (thread->context)); - - if (!bfd_set_section_contents (core_bfd, to, &header, - 0, - sizeof (header)) || - !bfd_set_section_contents (core_bfd, to, &thread_pstatus, - sizeof (header), - sizeof (thread_pstatus))) - { - bfd_perror ("writing thread info to bfd"); - dumper_abort (); - return 0; - }; - return 1; -} - -int -dumper::dump_module (asection * to, process_module * module) -{ - if (!sane ()) - return 0; - - if (to == NULL || module == NULL) - return 0; - - struct win32_pstatus *module_pstatus_ptr; - - int note_length = sizeof (struct win32_pstatus) + strlen (module->name); - - char *buf = (char *) malloc (note_length); - - if (!buf) - { - fprintf (stderr, "Error alloating memory. Dumping aborted.\n"); - goto out; - }; - - module_pstatus_ptr = (struct win32_pstatus *) buf; - - note_header header; - bfd_putl32 (NOTE_NAME_SIZE, header.elf_note_header.namesz); - bfd_putl32 (note_length, header.elf_note_header.descsz); - bfd_putl32 (NT_WIN32PSTATUS, header.elf_note_header.type); - strncpy ((char *) &header.elf_note_header.name, "win32module", NOTE_NAME_SIZE); - - module_pstatus_ptr->data_type = NOTE_INFO_MODULE; - module_pstatus_ptr->data.module_info.base_address = module->base_address; - module_pstatus_ptr->data.module_info.module_name_size = strlen (module->name) + 1; - strcpy (module_pstatus_ptr->data.module_info.module_name, module->name); - - if (!bfd_set_section_contents (core_bfd, to, &header, - 0, - sizeof (header)) || - !bfd_set_section_contents (core_bfd, to, module_pstatus_ptr, - sizeof (header), - note_length)) - { - bfd_perror ("writing module info to bfd"); - goto out; - }; - return 1; - -out: - if (buf) - free (buf); - dumper_abort (); - return 0; - -} - -int -dumper::collect_process_information () -{ - int exception_level = 0; - - if (!sane ()) - return 0; - - if (!DebugActiveProcess (pid)) - { - fprintf (stderr, "Cannot attach to process #%lu, error %ld", pid, GetLastError ()); - return 0; - } - - char event_name[sizeof ("cygwin_error_start_event") + 20]; - sprintf (event_name, "cygwin_error_start_event%16lx", pid); - HANDLE sync_with_debugee = OpenEvent (EVENT_MODIFY_STATE, FALSE, event_name); - - DEBUG_EVENT current_event; - - while (1) - { - if (!WaitForDebugEvent (¤t_event, 20000)) - return 0; - - deb_printf ("got debug event %d\n", current_event.dwDebugEventCode); - - switch (current_event.dwDebugEventCode) - { - case CREATE_THREAD_DEBUG_EVENT: - - if (!add_thread (current_event.dwThreadId, - current_event.u.CreateThread.hThread)) - goto failed; - - break; - - case CREATE_PROCESS_DEBUG_EVENT: - - if (!add_module (current_event.u.CreateProcessInfo.lpBaseOfImage) || - !add_thread (current_event.dwThreadId, - current_event.u.CreateProcessInfo.hThread)) - goto failed; - - break; - - case EXIT_PROCESS_DEBUG_EVENT: - - deb_printf ("debugee quits"); - ContinueDebugEvent (current_event.dwProcessId, - current_event.dwThreadId, - DBG_CONTINUE); - - return 1; - - break; - - case LOAD_DLL_DEBUG_EVENT: - - if (!add_module (current_event.u.LoadDll.lpBaseOfDll)) - goto failed; - - break; - - case EXCEPTION_DEBUG_EVENT: - - exception_level++; - if (exception_level == 2) - break; - else if (exception_level > 2) - return 0; - - collect_memory_sections (); - - /* got all info. time to dump */ - - if (!prepare_core_dump ()) - { - fprintf (stderr, "Failed to prepare core dump\n"); - goto failed; - }; - - if (!write_core_dump ()) - { - fprintf (stderr, "Failed to write core dump\n"); - goto failed; - }; - - /* signal a debugee that we've finished */ - if (sync_with_debugee) - SetEvent (sync_with_debugee); - - break; - - default: - - break; - - } - - ContinueDebugEvent (current_event.dwProcessId, - current_event.dwThreadId, - DBG_CONTINUE); - } -failed: - /* set debugee free */ - if (sync_with_debugee) - SetEvent (sync_with_debugee); - - return 0; -} - -int -dumper::init_core_dump () -{ - bfd_init (); - - core_bfd = bfd_openw (file_name, "elf32-i386"); - if (core_bfd == NULL) - { - bfd_perror ("opening bfd"); - goto failed; - } - - if (!bfd_set_format (core_bfd, bfd_core)) - { - bfd_perror ("setting bfd format"); - goto failed; - } - - if (!bfd_set_arch_mach (core_bfd, bfd_arch_i386, 0)) - { - bfd_perror ("setting bfd architecture"); - goto failed; - } - - return 1; - -failed: - dumper_abort (); - return 0; - -} - -int -dumper::prepare_core_dump () -{ - if (!sane ()) - return 0; - - int sect_no = 0; - char sect_name[50]; - - flagword sect_flags; - DWORD sect_size; - bfd_vma sect_vma; - - asection *new_section; - - for (process_entity * p = list; p != NULL; p = p->next) - { - sect_no++; - - switch (p->type) - { - case pr_ent_memory: - sprintf (sect_name, ".mem/%u", sect_no); - sect_flags = SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD; - sect_size = p->u.memory.size; - sect_vma = (bfd_vma) (p->u.memory.base); - - break; - - case pr_ent_thread: - sprintf (sect_name, ".note/%u", sect_no); - sect_flags = SEC_HAS_CONTENTS | SEC_LOAD; - sect_size = sizeof (note_header) + sizeof (struct win32_pstatus); - sect_vma = 0; - break; - - case pr_ent_module: - sprintf (sect_name, ".note/%u", sect_no); - sect_flags = SEC_HAS_CONTENTS | SEC_LOAD; - sect_size = sizeof (note_header) + sizeof (struct win32_pstatus) + - (bfd_size_type) (strlen (p->u.module.name)); - sect_vma = 0; - break; - - default: - continue; - } - - if (p->type == pr_ent_module && status_section != NULL) - { - if (!bfd_set_section_size (core_bfd, - status_section, - status_section->_raw_size + sect_size)) - { - bfd_perror ("resizing status section"); - goto failed; - }; - continue; - } - - deb_printf ("creating section (type%u) %s(%u), flags=%08x\n", - p->type, sect_name, sect_size, sect_flags); - - bfd_set_error (bfd_error_no_error); - char *buf = strdup (sect_name); - new_section = bfd_make_section (core_bfd, buf); - if (new_section == NULL) - { - if (bfd_get_error () == bfd_error_no_error) - fprintf (stderr, "error creating new section (%s), section already exists.\n", buf); - else - bfd_perror ("creating section"); - goto failed; - } - - if (!bfd_set_section_flags (core_bfd, new_section, sect_flags) || - !bfd_set_section_size (core_bfd, new_section, sect_size)) - { - bfd_perror ("setting section attributes"); - goto failed; - }; - - new_section->vma = sect_vma; - new_section->output_section = new_section; - new_section->output_offset = 0; - p->section = new_section; - } - - return 1; - -failed: - dumper_abort (); - return 0; -} - -int -dumper::write_core_dump () -{ - if (!sane ()) - return 0; - - for (process_entity * p = list; p != NULL; p = p->next) - { - if (p->section == NULL) - continue; - - deb_printf ("writing section type=%u base=%08x size=%08x flags=%08x\n", - p->type, - p->section->vma, - p->section->_raw_size, - p->section->flags); - - switch (p->type) - { - case pr_ent_memory: - dump_memory_region (p->section, &(p->u.memory)); - break; - - case pr_ent_thread: - dump_thread (p->section, &(p->u.thread)); - break; - - case pr_ent_module: - dump_module (p->section, &(p->u.module)); - break; - - default: - continue; - - } - } - return 1; -} - -static void -usage (FILE *stream, int status) -{ - fprintf (stream, "\ -Usage: dumper [OPTION] FILENAME WIN32PID\n\ -Dump core from WIN32PID to FILENAME.core\n\ -\n\ - -d, --verbose be verbose while dumping\n\ - -h, --help output help information and exit\n\ - -q, --quiet be quiet while dumping (default)\n\ - -v, --version output version information and exit\n\ -"); - exit (status); -} - -struct option longopts[] = { - {"verbose", no_argument, NULL, 'd'}, - {"help", no_argument, NULL, 'h'}, - {"quiet", no_argument, NULL, 'q'}, - {"version", no_argument, 0, 'v'}, - {0, no_argument, NULL, 0} -}; - -static void -print_version () -{ - const char *v = strchr (version, ':'); - int len; - if (!v) - { - v = "?"; - len = 1; - } - else - { - v += 2; - len = strchr (v, ' ') - v; - } - printf ("\ -dumper (cygwin) %.*s\n\ -Core Dumper for Cygwin\n\ -Copyright 1999, 2001, 2002 Red Hat, Inc.\n", len, v); -} - -int -main (int argc, char **argv) -{ - int opt; - const char *p = ""; - DWORD pid; - char win32_name [MAX_PATH]; - - while ((opt = getopt_long (argc, argv, "dqhv", longopts, NULL) ) != EOF) - switch (opt) - { - case 'd': - verbose = TRUE; - break; - case 'q': - verbose = FALSE; - break; - case 'h': - usage (stdout, 0); - case 'v': - print_version (); - exit (0); - default: - usage (stderr, 1); - break; - } - - if (argv && *(argv + optind) && *(argv + optind +1)) - { - *win32_name = '\0'; - cygwin_conv_to_win32_path (*(argv + optind), win32_name); - if ((p = strrchr (win32_name, '\\'))) - p++; - else - p = win32_name; - pid = strtoul (*(argv + optind + 1), NULL, 10); - } - else - { - usage (stderr, 1); - return -1; - } - - char *core_file = (char *) malloc (strlen (p) + sizeof (".core")); - if (!core_file) - { - fprintf (stderr, "error allocating memory\n"); - return -1; - } - sprintf (core_file, "%s.core", p); - - DWORD tid = 0; - - if (verbose) - printf ("dumping process #%lu to %s\n", pid, core_file); - - dumper d (pid, tid, core_file); - if (!d.sane ()) - return -1; - d.collect_process_information (); - free (core_file); - - return 0; -}; diff --git a/winsup/utils/dumper.h b/winsup/utils/dumper.h deleted file mode 100644 index 2a1841e78..000000000 --- a/winsup/utils/dumper.h +++ /dev/null @@ -1,132 +0,0 @@ -/* dumper.h - - Copyright 1999,2001 Red Hat Inc. - - Written by Egor Duda <deo@logos-m.ru> - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _DUMPER_H_ -#define _DUMPER_H_ - -#include <windows.h> - -typedef struct -{ - LPBYTE base; - DWORD size; -} process_mem_region; - -typedef struct -{ - DWORD tid; - HANDLE hThread; - CONTEXT context; -} process_thread; - -typedef struct -{ - LPVOID base_address; - char* name; -} process_module; - -enum process_entity_type -{ - pr_ent_memory, - pr_ent_thread, - pr_ent_module -}; - -typedef struct _process_entity -{ - process_entity_type type; - union - { - process_thread thread; - process_mem_region memory; - process_module module; - } u; - asection* section; - struct _process_entity* next; -} process_entity; - -class exclusion -{ -public: - int last; - int size; - int step; - process_mem_region* region; - - exclusion ( int step ) { last = size = 0; - this->step = step; - region = NULL; } - ~exclusion () { free ( region ); } - int add ( LPBYTE mem_base, DWORD mem_size ); - int sort_and_check (); -}; - -#define PAGE_BUFFER_SIZE 4096 - -class dumper -{ - DWORD pid; - DWORD tid; /* thread id of active thread */ - HANDLE hProcess; - process_entity* list; - process_entity* last; - exclusion* excl_list; - - char* file_name; - bfd* core_bfd; - - asection* status_section; - - int memory_num; - int module_num; - int thread_num; - - void close (); - void dumper_abort (); - - process_entity* add_process_entity_to_list ( process_entity_type type ); - int add_thread ( DWORD tid, HANDLE hThread ); - int add_mem_region ( LPBYTE base, DWORD size ); - - /* break mem_region by excl_list and add add all subregions */ - int split_add_mem_region ( LPBYTE base, DWORD size ); - - int add_module ( LPVOID base_address ); - - int collect_memory_sections (); - int dump_memory_region ( asection* to, process_mem_region* memory ); - int dump_thread ( asection* to, process_thread* thread ); - int dump_module ( asection* to, process_module* module ); - -public: - int sane (); - - int collect_process_information (); - void print_core_section_list (); - - dumper ( DWORD pid, DWORD tid, const char* name ); - ~dumper (); - - int init_core_dump (); - int prepare_core_dump (); - int write_core_dump (); -}; - -extern int deb_printf ( const char* format, ... ); - -extern char* psapi_get_module_name ( HANDLE hProcess, DWORD BaseAddress ); - -extern int parse_pe ( const char* file_name, exclusion* excl_list ); - -extern BOOL verbose; - -#endif diff --git a/winsup/utils/getfacl.c b/winsup/utils/getfacl.c deleted file mode 100644 index a4a3e0df1..000000000 --- a/winsup/utils/getfacl.c +++ /dev/null @@ -1,256 +0,0 @@ -/* getfacl.c - - Copyright 2000, 2001, 2002 Red Hat Inc. - - Written by Corinna Vinschen <vinschen@redhat.com> - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include <pwd.h> -#include <grp.h> -#include <stdio.h> -#include <unistd.h> -#include <getopt.h> -#include <sys/types.h> -#include <sys/acl.h> -#include <sys/stat.h> -#include <string.h> - -static const char version[] = "$Revision$"; -static char *prog_name; - -char * -permstr (mode_t perm) -{ - static char pbuf[4]; - - pbuf[0] = (perm & S_IROTH) ? 'r' : '-'; - pbuf[1] = (perm & S_IWOTH) ? 'w' : '-'; - pbuf[2] = (perm & S_IXOTH) ? 'x' : '-'; - pbuf[3] = '\0'; - return pbuf; -} - -const char * -username (uid_t uid) -{ - static char ubuf[256]; - struct passwd *pw; - - if ((pw = getpwuid (uid))) - strcpy (ubuf, pw->pw_name); - else - sprintf (ubuf, "%lu <unknown>", (unsigned long)uid); - return ubuf; -} - -const char * -groupname (gid_t gid) -{ - static char gbuf[256]; - struct group *gr; - - if ((gr = getgrgid (gid))) - strcpy (gbuf, gr->gr_name); - else - sprintf (gbuf, "%lu <unknown>", (unsigned long)gid); - return gbuf; -} - -static void -usage (FILE * stream) -{ - fprintf (stream, "Usage: %s [-adn] FILE [FILE2...]\n" - "Display file and directory access control lists (ACLs).\n" - "\n" - " -a, --all display the filename, the owner, the group, and\n" - " the ACL of the file\n" - " -d, --dir display the filename, the owner, the group, and\n" - " the default ACL of the directory, if it exists\n" - " -h, --help output usage information and exit\n" - " -n, --noname display user and group IDs instead of names\n" - " -v, --version output version information and exit\n" - "\n" - "When multiple files are specified on the command line, a blank\n" - "line separates the ACLs for each file.\n", prog_name); - if (stream == stdout) - { - fprintf (stream, "" - "For each argument that is a regular file, special file or\n" - "directory, getfacl displays the owner, the group, and the ACL.\n" - "For directories getfacl displays additionally the default ACL.\n" - "\n" - "With no options specified, getfacl displays the filename, the\n" - "owner, the group, and both the ACL and the default ACL, if it\n" - "exists.\n" - "\n" - "The format for ACL output is as follows:\n" - " # file: filename\n" - " # owner: name or uid\n" - " # group: name or uid\n" - " user::perm\n" - " user:name or uid:perm\n" - " group::perm\n" - " group:name or gid:perm\n" - " mask:perm\n" - " other:perm\n" - " default:user::perm\n" - " default:user:name or uid:perm\n" - " default:group::perm\n" - " default:group:name or gid:perm\n" - " default:mask:perm\n" - " default:other:perm\n" - "\n"); - } -} - -struct option longopts[] = { - {"all", no_argument, NULL, 'a'}, - {"dir", no_argument, NULL, 'd'}, - {"help", no_argument, NULL, 'h'}, - {"noname", no_argument, NULL, 'n'}, - {"version", no_argument, NULL, 'v'}, - {0, no_argument, NULL, 0} -}; - -static void -print_version () -{ - const char *v = strchr (version, ':'); - int len; - if (!v) - { - v = "?"; - len = 1; - } - else - { - v += 2; - len = strchr (v, ' ') - v; - } - printf ("\ -getfacl (cygwin) %.*s\n\ -ACL Utility\n\ -Copyright (c) 2000, 2001, 2002 Red Hat, Inc.\n\ -Compiled on %s\n\ -", len, v, __DATE__); -} - -int -main (int argc, char **argv) -{ - int c, i; - int aopt = 0; - int dopt = 0; - int nopt = 0; - int first = 1; - struct stat st; - aclent_t acls[MAX_ACL_ENTRIES]; - - prog_name = strrchr (argv[0], '/'); - if (prog_name == NULL) - prog_name = strrchr (argv[0], '\\'); - if (prog_name == NULL) - prog_name = argv[0]; - else - prog_name++; - - while ((c = getopt_long (argc, argv, "adhnv", longopts, NULL)) != EOF) - switch (c) - { - case 'a': - aopt = 1; - break; - case 'd': - dopt = 1; - break; - case 'h': - usage (stdout); - return 0; - case 'n': - nopt = 1; - break; - case 'v': - print_version (); - return 0; - default: - usage (stderr); - return 1; - } - if (optind > argc - 1) - { - usage (stderr); - return 1; - } - while ((c = optind++) < argc) - { - if (stat (argv[c], &st)) - { - perror (argv[0]); - continue; - } - if (!first) - putchar ('\n'); - first = 0; - printf ("# file: %s\n", argv[c]); - if (nopt) - { - printf ("# owner: %lu\n", (unsigned long)st.st_uid); - printf ("# group: %lu\n", (unsigned long)st.st_gid); - } - else - { - printf ("# owner: %s\n", username (st.st_uid)); - printf ("# group: %s\n", groupname (st.st_gid)); - } - if ((c = acl (argv[c], GETACL, MAX_ACL_ENTRIES, acls)) < 0) - { - perror (argv[0]); - continue; - } - for (i = 0; i < c; ++i) - { - if (acls[i].a_type & ACL_DEFAULT) - { - if (aopt) - continue; - printf ("default:"); - } - else if (dopt) - continue; - switch (acls[i].a_type & ~ACL_DEFAULT) - { - case USER_OBJ: - printf ("user::"); - break; - case USER: - if (nopt) - printf ("user:%lu\n", (unsigned long)acls[i].a_id); - else - printf ("user:%s:", username (acls[i].a_id)); - break; - case GROUP_OBJ: - printf ("group::"); - break; - case GROUP: - if (nopt) - printf ("group:%lu\n", (unsigned long)acls[i].a_id); - else - printf ("group:%s:", groupname (acls[i].a_id)); - break; - case CLASS_OBJ: - printf ("mask:"); - break; - case OTHER_OBJ: - printf ("other:"); - break; - } - printf ("%s\n", permstr (acls[i].a_perm)); - } - } - return 0; -} diff --git a/winsup/utils/ipcrm.c b/winsup/utils/ipcrm.c deleted file mode 100644 index bc17b6ad4..000000000 --- a/winsup/utils/ipcrm.c +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (c) 1994 Adam Glass - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Adam Glass. - * 4. The name of the Author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY Adam Glass ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL Adam Glass BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -#ifndef __FBSDID -#define __FBSDID(s) const char version[] = (s) -#endif -__FBSDID("$FreeBSD: /repoman/r/ncvs/src/usr.bin/ipcrm/ipcrm.c,v 1.11 2002/09/04 23:29:02 dwmalone Exp $"); - -#include <ctype.h> -#include <err.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/types.h> -#ifndef _KERNEL -#define _KERNEL 1 -#endif -#include <sys/ipc.h> -#include <sys/msg.h> -#include <sys/sem.h> -#include <sys/shm.h> - -#ifdef __GNUC__ -#define __unused __attribute__((unused)) -#endif - -#define IPC_TO_STR(x) (x == 'Q' ? "msq" : (x == 'M' ? "shm" : "sem")) -#define IPC_TO_STRING(x) (x == 'Q' ? "message queue" : \ - (x == 'M' ? "shared memory segment" : "semaphore")) - -int signaled; - -void usage(void); -int msgrm(key_t, int); -int shmrm(key_t, int); -int semrm(key_t, int); -void not_configured(int); - -void usage(void) -{ - fprintf(stderr, "%s\n%s\n", - "usage: ipcrm [-q msqid] [-m shmid] [-s semid]", - " [-Q msgkey] [-M shmkey] [-S semkey] ..."); - exit(1); -} - -int msgrm(key_t key, int id) -{ - if (key) { - id = msgget(key, 0); - if (id == -1) - return -1; - } - return msgctl(id, IPC_RMID, NULL); -} - -int shmrm(key_t key, int id) -{ - if (key) { - id = shmget(key, 0, 0); - if (id == -1) - return -1; - } - return shmctl(id, IPC_RMID, NULL); -} - -int semrm(key_t key, int id) -{ - union semun arg; - - if (key) { - id = semget(key, 0, 0); - if (id == -1) - return -1; - } - return semctl(id, 0, IPC_RMID, arg); -} - -void not_configured(int signo __unused) -{ - signaled++; -} - -int main(int argc, char *argv[]) -{ - int c, result, errflg, target_id; - key_t target_key; - - errflg = 0; - signal(SIGSYS, not_configured); - while ((c = getopt(argc, argv, ":q:m:s:Q:M:S:")) != -1) { - - signaled = 0; - switch (c) { - case 'q': - case 'm': - case 's': - target_id = atoi(optarg); - if (c == 'q') - result = msgrm(0, target_id); - else if (c == 'm') - result = shmrm(0, target_id); - else - result = semrm(0, target_id); - if (result < 0) { - errflg++; - if (!signaled) - warn("%sid(%d): ", IPC_TO_STR(toupper(c)), target_id); - else - warnx("%ss are not configured in the running kernel", - IPC_TO_STRING(toupper(c))); - } - break; - case 'Q': - case 'M': - case 'S': - target_key = strtoull(optarg, NULL, 10); - if (target_key == IPC_PRIVATE) { - warnx("can't remove private %ss", IPC_TO_STRING(c)); - continue; - } - if (c == 'Q') - result = msgrm(target_key, 0); - else if (c == 'M') - result = shmrm(target_key, 0); - else - result = semrm(target_key, 0); - if (result < 0) { - errflg++; - if (!signaled) - warn("%ss(%lld): ", IPC_TO_STR(c), target_key); - else - warnx("%ss are not configured in the running kernel", - IPC_TO_STRING(c)); - } - break; - case ':': - fprintf(stderr, "option -%c requires an argument\n", optopt); - usage(); - case '?': - fprintf(stderr, "unrecognized option: -%c\n", optopt); - usage(); - } - } - - if (optind != argc) { - fprintf(stderr, "unknown argument: %s\n", argv[optind]); - usage(); - } - exit(errflg); -} - diff --git a/winsup/utils/ipcs.c b/winsup/utils/ipcs.c deleted file mode 100644 index 229330b99..000000000 --- a/winsup/utils/ipcs.c +++ /dev/null @@ -1,872 +0,0 @@ -/* - * Copyright (c) 1994 SigmaSoft, Th. Lockert <tholo@sigmasoft.com> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -#ifndef __FBSDID -#define __FBSDID(s) const char version[] = (s) -#endif -__FBSDID("$FreeBSD: /repoman/r/ncvs/src/usr.bin/ipcs/ipcs.c,v 1.22 2003/10/30 16:52:14 iwasaki Exp $"); - -#include <assert.h> -#include <err.h> -#include <fcntl.h> -#include <grp.h> -#ifndef __CYGWIN__ -#include <kvm.h> -#include <nlist.h> -#endif /* __CYGWIN__ */ -#include <limits.h> -#include <paths.h> -#include <pwd.h> -#ifdef __CYGWIN__ -#include <grp.h> -#endif /* __CYGWIN__ */ -#include <stddef.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <sys/types.h> -#include <sys/param.h> -#include <sys/time.h> -#ifndef __CYGWIN__ -#include <sys/proc.h> -#include <sys/sysctl.h> -#endif /* __CYGWIN__ */ -#define _KERNEL -#include <sys/ipc.h> -#include <sys/sem.h> -#include <sys/shm.h> -#include <sys/msg.h> - -/* SysCtlGatherStruct structure. */ -struct scgs_vector { - const char *sysctl; - off_t offset; - size_t size; -}; - -int use_sysctl = 1; -struct semid_ds *sema; -struct seminfo seminfo; -struct msginfo msginfo; -struct msqid_ds *msqids; -struct shminfo shminfo; -struct shmid_ds *shmsegs; - -char *fmt_perm(u_short); -void cvt_time(time_t, char *); -void sysctlgatherstruct(void *addr, size_t size, struct scgs_vector *vec); -void kget(int idx, void *addr, size_t size); -void usage(void); -#ifdef __CYGWIN__ -void help() __attribute__ ((noreturn)); -#endif /* __CYGWIN__ */ - -#ifdef __CYGWIN__ -#define _POSIX2_LINE_MAX 255 -typedef int kvm_t; -#define kvm_openfiles(a,b,c,d,e) NULL -#define kvm_nlist(a,b) -1 -#define kvm_close(a) -#define kvm_read(a,b,c,d) 0 -#define kvm_geterr(a) "" -#define sysctlbyname(a,b,c,d,e) -1 - -struct nlist { - const char *n_name; - int n_type; - int n_value; -}; -#endif /* __CYGWIN__ */ - -static struct nlist symbols[] = { - {"sema"}, -#define X_SEMA 0 - {"seminfo"}, -#define X_SEMINFO 1 - {"msginfo"}, -#define X_MSGINFO 2 - {"msqids"}, -#define X_MSQIDS 3 - {"shminfo"}, -#define X_SHMINFO 4 - {"shmsegs"}, -#define X_SHMSEGS 5 -#ifdef __CYGWIN__ - {"msgstat"}, -#define X_MSGSTAT 6 - {"semstat"}, -#define X_SEMSTAT 7 - {"shmstat"}, -#define X_SHMSTAT 8 -#endif /* __CYGWIN__ */ - {NULL} -}; - -#define SHMINFO_XVEC \ -X(shmmax, sizeof(int)) \ -X(shmmin, sizeof(int)) \ -X(shmmni, sizeof(int)) \ -X(shmseg, sizeof(int)) \ -X(shmall, sizeof(int)) - -#define SEMINFO_XVEC \ -X(semmap, sizeof(int)) \ -X(semmni, sizeof(int)) \ -X(semmns, sizeof(int)) \ -X(semmnu, sizeof(int)) \ -X(semmsl, sizeof(int)) \ -X(semopm, sizeof(int)) \ -X(semume, sizeof(int)) \ -X(semusz, sizeof(int)) \ -X(semvmx, sizeof(int)) \ -X(semaem, sizeof(int)) - -#define MSGINFO_XVEC \ -X(msgmax, sizeof(int)) \ -X(msgmni, sizeof(int)) \ -X(msgmnb, sizeof(int)) \ -X(msgtql, sizeof(int)) \ -X(msgssz, sizeof(int)) \ -X(msgseg, sizeof(int)) - -#define X(a, b) { "kern.ipc." #a, offsetof(TYPEC, a), (b) }, -#define TYPEC struct shminfo -struct scgs_vector shminfo_scgsv[] = { SHMINFO_XVEC { NULL } }; -#undef TYPEC -#define TYPEC struct seminfo -struct scgs_vector seminfo_scgsv[] = { SEMINFO_XVEC { NULL } }; -#undef TYPEC -#define TYPEC struct msginfo -struct scgs_vector msginfo_scgsv[] = { MSGINFO_XVEC { NULL } }; -#undef TYPEC -#undef X - -static kvm_t *kd; - -#ifdef __CYGWIN__ -const char * -user_from_uid (uid_t uid, uid_t dummy) -{ - struct passwd *pwd = getpwuid (uid); - return pwd ? pwd->pw_name : "???"; -} - -const char * -group_from_gid (gid_t gid, gid_t dummy) -{ - struct group *grp = getgrgid (gid); - return grp ? grp->gr_name : "???"; -} -#endif /* __CYGWIN__ */ - -char * -fmt_perm(mode) - u_short mode; -{ - static char buffer[100]; - - buffer[0] = '-'; - buffer[1] = '-'; - buffer[2] = ((mode & 0400) ? 'r' : '-'); - buffer[3] = ((mode & 0200) ? 'w' : '-'); - buffer[4] = ((mode & 0100) ? 'a' : '-'); - buffer[5] = ((mode & 0040) ? 'r' : '-'); - buffer[6] = ((mode & 0020) ? 'w' : '-'); - buffer[7] = ((mode & 0010) ? 'a' : '-'); - buffer[8] = ((mode & 0004) ? 'r' : '-'); - buffer[9] = ((mode & 0002) ? 'w' : '-'); - buffer[10] = ((mode & 0001) ? 'a' : '-'); - buffer[11] = '\0'; - return (&buffer[0]); -} - -void -cvt_time(t, buf) - time_t t; - char *buf; -{ - struct tm *tm; - - if (t == 0) { - strcpy(buf, "no-entry"); - } else { - tm = localtime(&t); - sprintf(buf, "%2d:%02d:%02d", - tm->tm_hour, tm->tm_min, tm->tm_sec); - } -} -#define SHMINFO 1 -#define SHMTOTAL 2 -#define MSGINFO 4 -#define MSGTOTAL 8 -#define SEMINFO 16 -#define SEMTOTAL 32 - -#define BIGGEST 1 -#define CREATOR 2 -#define OUTSTANDING 4 -#define PID 8 -#define TIME 16 -#ifdef __CYGWIN__ -#define STATUS 32 -#endif /* __CYGWIN__ */ - -int -main(argc, argv) - int argc; - char *argv[]; -{ - int display = SHMINFO | MSGINFO | SEMINFO; - int option = 0; - char *core = NULL, *namelist = NULL; - char kvmoferr[_POSIX2_LINE_MAX]; /* Error buf for kvm_openfiles. */ - int i; - -#ifdef __CYGWIN__ - while ((i = getopt(argc, argv, "MmQqSsabchoptTu")) != -1) -#else - while ((i = getopt(argc, argv, "MmQqSsabC:cN:optTy")) != -1) -#endif /* __CYGWIN__ */ - switch (i) { - case 'M': - display = SHMTOTAL; - break; - case 'm': - display = SHMINFO; - break; - case 'Q': - display = MSGTOTAL; - break; - case 'q': - display = MSGINFO; - break; - case 'S': - display = SEMTOTAL; - break; - case 's': - display = SEMINFO; - break; - case 'T': - display = SHMTOTAL | MSGTOTAL | SEMTOTAL; - break; - case 'a': - option |= BIGGEST | CREATOR | OUTSTANDING | PID | TIME; - break; - case 'b': - option |= BIGGEST; - break; -#ifndef __CYGWIN__ - case 'C': - core = optarg; - break; -#endif /* __CYGWIN__ */ - case 'c': - option |= CREATOR; - break; -#ifndef __CYGWIN__ - case 'N': - namelist = optarg; - break; -#endif /* __CYGWIN__ */ - case 'o': - option |= OUTSTANDING; - break; - case 'p': - option |= PID; - break; - case 't': - option |= TIME; - break; -#ifdef __CYGWIN__ - case 'h': - help(); - case 'u': - option |= STATUS; - break; -#endif /* __CYGWIN__ */ -#ifndef __CYGWIN__ - case 'y': - use_sysctl = 0; - break; -#endif /* __CYGWIN__ */ - default: - usage(); - } - - /* - * If paths to the exec file or core file were specified, we - * aren't operating on the running kernel, so we can't use - * sysctl. - */ - if (namelist != NULL || core != NULL) - use_sysctl = 0; - - if (!use_sysctl) { - kd = kvm_openfiles(namelist, core, NULL, O_RDONLY, kvmoferr); - if (kd == NULL) - errx(1, "kvm_openfiles: %s", kvmoferr); - switch (kvm_nlist(kd, symbols)) { - case 0: - break; - case -1: - errx(1, "unable to read kernel symbol table"); - default: -#ifdef notdef /* they'll be told more civilly later */ - warnx("nlist failed"); - for (i = 0; symbols[i].n_name != NULL; i++) - if (symbols[i].n_value == 0) - warnx("symbol %s not found", - symbols[i].n_name); -#endif - break; - } - } - - kget(X_MSGINFO, &msginfo, sizeof(msginfo)); - if ((display & (MSGINFO | MSGTOTAL))) { - if (display & MSGTOTAL) { - printf("msginfo:\n"); - printf("\tmsgmax: %8ld\t(max characters in a message)\n", - msginfo.msgmax); - printf("\tmsgmni: %8ld\t(# of message queues)\n", - msginfo.msgmni); - printf("\tmsgmnb: %8ld\t(max characters in a message queue)\n", - msginfo.msgmnb); - printf("\tmsgtql: %8ld\t(max # of messages in system)\n", - msginfo.msgtql); - printf("\tmsgssz: %8ld\t(size of a message segment)\n", - msginfo.msgssz); - printf("\tmsgseg: %8ld\t(# of message segments in system)\n\n", - msginfo.msgseg); - } - if (display & MSGINFO) { - struct msqid_ds *xmsqids; - size_t xmsqids_len; - - - xmsqids_len = sizeof(struct msqid_ds) * msginfo.msgmni; - xmsqids = malloc(xmsqids_len); - kget(X_MSQIDS, xmsqids, xmsqids_len); - - printf("Message Queues:\n"); - printf("T ID KEY MODE OWNER GROUP"); - if (option & CREATOR) - printf(" CREATOR CGROUP"); - if (option & OUTSTANDING) - printf(" CBYTES QNUM"); - if (option & BIGGEST) - printf(" QBYTES"); - if (option & PID) - printf(" LSPID LRPID"); - if (option & TIME) - printf(" STIME RTIME CTIME"); - printf("\n"); - for (i = 0; i < msginfo.msgmni; i += 1) { - if (xmsqids[i].msg_qbytes != 0) { - char stime_buf[100], rtime_buf[100], - ctime_buf[100]; - struct msqid_ds *msqptr = &xmsqids[i]; - - cvt_time(msqptr->msg_stime, stime_buf); - cvt_time(msqptr->msg_rtime, rtime_buf); - cvt_time(msqptr->msg_ctime, ctime_buf); - - printf("q %6d %20llu %s %8s %8s", - IXSEQ_TO_IPCID(i, msqptr->msg_perm), - msqptr->msg_perm.key, - fmt_perm(msqptr->msg_perm.mode), - user_from_uid(msqptr->msg_perm.uid, 0), - group_from_gid(msqptr->msg_perm.gid, 0)); - - if (option & CREATOR) - printf(" %8s %8s", - user_from_uid(msqptr->msg_perm.cuid, 0), - group_from_gid(msqptr->msg_perm.cgid, 0)); - - if (option & OUTSTANDING) - printf(" %6lu %6lu", - msqptr->msg_cbytes, - msqptr->msg_qnum); - - if (option & BIGGEST) - printf(" %6lu", - msqptr->msg_qbytes); - - if (option & PID) - printf(" %6d %6d", - msqptr->msg_lspid, - msqptr->msg_lrpid); - - if (option & TIME) - printf(" %s %s %s", - stime_buf, - rtime_buf, - ctime_buf); - - printf("\n"); - } - } - printf("\n"); - } -#ifdef __CYGWIN__ - if (option & STATUS) { - struct msg_info msg_info; - kget(X_MSGSTAT, &msg_info, sizeof msg_info); - printf("Message Queue Usage:\n"); - printf("\tmsg_ids: %7ld\t(no. of allocated queues)\n", - msg_info.msg_ids); - printf("\tmsg_num: %7ld\t(no. of messages in system)\n", - msg_info.msg_num); - printf("\tmsg_tot: %7ld\t(size in bytes of messages in system)\n", - msg_info.msg_tot); - printf("\n"); - } -#endif /* __CYGWIN__ */ - } else - if (display & (MSGINFO | MSGTOTAL)) { - fprintf(stderr, - "SVID messages facility not configured in the system\n"); - } - - kget(X_SHMINFO, &shminfo, sizeof(shminfo)); - if ((display & (SHMINFO | SHMTOTAL))) { - if (display & SHMTOTAL) { - printf("shminfo:\n"); - printf("\tshmmax: %8ld\t(max shared memory segment size)\n", - shminfo.shmmax); - printf("\tshmmin: %8ld\t(min shared memory segment size)\n", - shminfo.shmmin); - printf("\tshmmni: %8ld\t(max number of shared memory identifiers)\n", - shminfo.shmmni); - printf("\tshmseg: %8ld\t(max shared memory segments per process)\n", - shminfo.shmseg); - printf("\tshmall: %8ld\t(max amount of shared memory in pages)\n\n", - shminfo.shmall); - } - if (display & SHMINFO) { - struct shmid_ds *xshmids; - size_t xshmids_len; - - xshmids_len = sizeof(struct shmid_ds) * shminfo.shmmni; - xshmids = malloc(xshmids_len); - kget(X_SHMSEGS, xshmids, xshmids_len); - - printf("Shared Memory:\n"); - printf("T ID KEY MODE OWNER GROUP"); - if (option & CREATOR) - printf(" CREATOR CGROUP"); - if (option & OUTSTANDING) - printf(" NATTCH"); - if (option & BIGGEST) - printf(" SEGSZ"); - if (option & PID) - printf(" CPID LPID"); - if (option & TIME) - printf(" ATIME DTIME CTIME"); - printf("\n"); - for (i = 0; i < shminfo.shmmni; i += 1) { - if (xshmids[i].shm_perm.mode & 0x0800) { - char atime_buf[100], dtime_buf[100], - ctime_buf[100]; - struct shmid_ds *shmptr = &xshmids[i]; - - cvt_time(shmptr->shm_atime, atime_buf); - cvt_time(shmptr->shm_dtime, dtime_buf); - cvt_time(shmptr->shm_ctime, ctime_buf); - - printf("m %6d %20llu %s %8s %8s", - IXSEQ_TO_IPCID(i, shmptr->shm_perm), - shmptr->shm_perm.key, - fmt_perm(shmptr->shm_perm.mode), - user_from_uid(shmptr->shm_perm.uid, 0), - group_from_gid(shmptr->shm_perm.gid, 0)); - - if (option & CREATOR) - printf(" %8s %8s", - user_from_uid(shmptr->shm_perm.cuid, 0), - group_from_gid(shmptr->shm_perm.cgid, 0)); - - if (option & OUTSTANDING) - printf(" %6d", - shmptr->shm_nattch); - - if (option & BIGGEST) - printf(" %6d", - shmptr->shm_segsz); - - if (option & PID) - printf(" %6d %6d", - shmptr->shm_cpid, - shmptr->shm_lpid); - - if (option & TIME) - printf(" %s %s %s", - atime_buf, - dtime_buf, - ctime_buf); - - printf("\n"); - } - } - printf("\n"); - } -#ifdef __CYGWIN__ - if (option & STATUS) { - struct shm_info shm_info; - kget(X_SHMSTAT, &shm_info, sizeof shm_info); - printf("Shared Memory Usage:\n"); - printf("\tshm_ids: %7ld\t(no. of allocated segments)\n", - shm_info.shm_ids); - printf("\tshm_tot: %7ld\t(size in bytes of allocated segments)\n", - shm_info.shm_tot); - printf("\tshm_atts: %7ld\t(no. of attached segments in system)\n", - shm_info.shm_atts); - printf("\n"); - } -#endif /* __CYGWIN__ */ - } else - if (display & (SHMINFO | SHMTOTAL)) { - fprintf(stderr, - "SVID shared memory facility not configured in the system\n"); - } - - kget(X_SEMINFO, &seminfo, sizeof(seminfo)); - if ((display & (SEMINFO | SEMTOTAL))) { - struct semid_ds *xsema; - size_t xsema_len; - - if (display & SEMTOTAL) { - printf("seminfo:\n"); - printf("\tsemmap: %8ld\t(# of entries in semaphore map)\n", - seminfo.semmap); - printf("\tsemmni: %8ld\t(# of semaphore identifiers)\n", - seminfo.semmni); - printf("\tsemmns: %8ld\t(# of semaphores in system)\n", - seminfo.semmns); - printf("\tsemmnu: %8ld\t(# of undo structures in system)\n", - seminfo.semmnu); - printf("\tsemmsl: %8ld\t(max # of semaphores per id)\n", - seminfo.semmsl); - printf("\tsemopm: %8ld\t(max # of operations per semop call)\n", - seminfo.semopm); - printf("\tsemume: %8ld\t(max # of undo entries per process)\n", - seminfo.semume); - printf("\tsemusz: %8ld\t(size in bytes of undo structure)\n", - seminfo.semusz); - printf("\tsemvmx: %8ld\t(semaphore maximum value)\n", - seminfo.semvmx); - printf("\tsemaem: %8ld\t(adjust on exit max value)\n\n", - seminfo.semaem); - } - if (display & SEMINFO) { - xsema_len = sizeof(struct semid_ds) * seminfo.semmni; - xsema = malloc(xsema_len); - kget(X_SEMA, xsema, xsema_len); - - printf("Semaphores:\n"); - printf("T ID KEY MODE OWNER GROUP"); - if (option & CREATOR) - printf(" CREATOR CGROUP"); - if (option & BIGGEST) - printf(" NSEMS"); - if (option & TIME) - printf(" OTIME CTIME"); - printf("\n"); - for (i = 0; i < seminfo.semmni; i += 1) { - if ((xsema[i].sem_perm.mode & SEM_ALLOC) != 0) { - char ctime_buf[100], otime_buf[100]; - struct semid_ds *semaptr = &xsema[i]; - - cvt_time(semaptr->sem_otime, otime_buf); - cvt_time(semaptr->sem_ctime, ctime_buf); - - printf("s %6d %20llu %s %8s %8s", - IXSEQ_TO_IPCID(i, semaptr->sem_perm), - semaptr->sem_perm.key, - fmt_perm(semaptr->sem_perm.mode), - user_from_uid(semaptr->sem_perm.uid, 0), - group_from_gid(semaptr->sem_perm.gid, 0)); - - if (option & CREATOR) - printf(" %8s %8s", - user_from_uid(semaptr->sem_perm.cuid, 0), - group_from_gid(semaptr->sem_perm.cgid, 0)); - - if (option & BIGGEST) - printf(" %6d", - semaptr->sem_nsems); - - if (option & TIME) - printf(" %s %s", - otime_buf, - ctime_buf); - - printf("\n"); - } - } - - printf("\n"); - } -#ifdef __CYGWIN__ - if (option & STATUS) { - struct sem_info sem_info; - kget(X_SEMSTAT, &sem_info, sizeof sem_info); - printf("Semaphore Usage:\n"); - printf("\tsem_ids: %7ld\t(no. of allocated semaphore sets)\n", - sem_info.sem_ids); - printf("\tsem_num: %7ld\t(no. of allocated semaphores)\n", - sem_info.sem_num); - printf("\n"); - } -#endif /* __CYGWIN__ */ - } else - if (display & (SEMINFO | SEMTOTAL)) { - fprintf(stderr, "SVID semaphores facility not configured in the system\n"); - } - if (!use_sysctl) - kvm_close(kd); - - exit(0); -} - -void -sysctlgatherstruct(addr, size, vecarr) - void *addr; - size_t size; - struct scgs_vector *vecarr; -{ - struct scgs_vector *xp; - size_t tsiz; - int rv; - - for (xp = vecarr; xp->sysctl != NULL; xp++) { - assert(xp->offset <= size); - tsiz = xp->size; - rv = sysctlbyname(xp->sysctl, (char *)addr + xp->offset, - &tsiz, NULL, 0); - if (rv == -1) - errx(1, "sysctlbyname: %s", xp->sysctl); - if (tsiz != xp->size) - errx(1, "%s size mismatch (expected %d, got %d)", - xp->sysctl, xp->size, tsiz); - } -} - -void -kget(idx, addr, size) - int idx; - void *addr; - size_t size; -{ - const char *symn; /* symbol name */ - size_t tsiz; - int rv; - unsigned long kaddr; - const char *sym2sysctl[] = { /* symbol to sysctl name table */ - "kern.ipc.sema", - "kern.ipc.seminfo", - "kern.ipc.msginfo", - "kern.ipc.msqids", - "kern.ipc.shminfo", - "kern.ipc.shmsegs" }; - -#ifndef __CYGWIN__ - assert((unsigned)idx <= sizeof(sym2sysctl) / sizeof(*sym2sysctl)); -#endif /* __CYGWIN__ */ -#ifdef __CYGWIN__ - if (1) { - union semun su; - switch (idx) { - case X_MSGINFO: - if (msgctl(0, IPC_INFO, (struct msqid_ds *)addr) < 0) - err(1, "msgctl"); - break; - case X_SEMINFO: - su.buf = (struct semid_ds *)addr; - if (semctl(0, 0, IPC_INFO, su) < 0) - err(1, "semctl"); - break; - break; - case X_SHMINFO: - if (shmctl(0, IPC_INFO, (struct shmid_ds *)addr) < 0) - err(1, "shmctl"); - break; - case X_MSQIDS: - if (msgctl(size / sizeof(struct msqid_ds), IPC_INFO, - (struct msqid_ds *)addr) < 0) - err(1, "msgctl"); - break; - case X_SEMA: - su.buf = (struct semid_ds *)addr; - if (semctl(size / sizeof(struct semid_ds), 0, - IPC_INFO, su) < 0) - err(1, "semctl"); - break; - case X_SHMSEGS: - if (shmctl(size / sizeof(struct shmid_ds), IPC_INFO, - (struct shmid_ds *)addr) < 0) - err(1, "shmctl"); - break; - case X_MSGSTAT: - if (msgctl(0, MSG_INFO, (struct msqid_ds *)addr) < 0) - err(1, "msgctl"); - break; - case X_SEMSTAT: - su.buf = (struct semid_ds *)addr; - if (semctl(0, 0, SEM_INFO, su) < 0) - err(1, "semctl"); - break; - break; - case X_SHMSTAT: - if (shmctl(0, SHM_INFO, (struct shmid_ds *)addr) < 0) - err(1, "shmctl"); - break; - } - } else -#endif /* __CYGWIN__ */ - if (!use_sysctl) { - symn = symbols[idx].n_name; - if (*symn == '_') - symn++; - if (symbols[idx].n_type == 0 || symbols[idx].n_value == 0) - errx(1, "symbol %s undefined", symn); - /* - * For some symbols, the value we retreieve is - * actually a pointer; since we want the actual value, - * we have to manually dereference it. - */ - switch (idx) { - case X_MSQIDS: - tsiz = sizeof(msqids); - rv = kvm_read(kd, symbols[idx].n_value, - &msqids, tsiz); - kaddr = (u_long)msqids; - break; - case X_SHMSEGS: - tsiz = sizeof(shmsegs); - rv = kvm_read(kd, symbols[idx].n_value, - &shmsegs, tsiz); - kaddr = (u_long)shmsegs; - break; - case X_SEMA: - tsiz = sizeof(sema); - rv = kvm_read(kd, symbols[idx].n_value, - &sema, tsiz); - kaddr = (u_long)sema; - break; - default: - rv = tsiz = 0; - kaddr = symbols[idx].n_value; - break; - } - if ((unsigned)rv != tsiz) - errx(1, "%s: %s", symn, kvm_geterr(kd)); - if ((unsigned)kvm_read(kd, kaddr, addr, size) != size) - errx(1, "%s: %s", symn, kvm_geterr(kd)); - } else { - switch (idx) { - case X_SHMINFO: - sysctlgatherstruct(addr, size, shminfo_scgsv); - break; - case X_SEMINFO: - sysctlgatherstruct(addr, size, seminfo_scgsv); - break; - case X_MSGINFO: - sysctlgatherstruct(addr, size, msginfo_scgsv); - break; - default: - tsiz = size; - rv = sysctlbyname(sym2sysctl[idx], addr, &tsiz, - NULL, 0); - if (rv == -1) - err(1, "sysctlbyname: %s", sym2sysctl[idx]); - if (tsiz != size) - errx(1, "%s size mismatch " - "(expected %d, got %d)", - sym2sysctl[idx], size, tsiz); - break; - } - } -} - -void -usage() -{ - - fprintf(stderr, -#ifdef __CYGWIN__ - "usage: ipcs [-abchmopqstuMQST]\n" - "Try `ipcs -h' for more information.\n"); -#else - "usage: ipcs [-abcmopqstyMQST] [-C corefile] [-N namelist]\n"); -#endif /* __CYGWIN__ */ - exit(1); -} - -#ifdef __CYGWIN__ -void -help() -{ puts( -"usage: ipcs [-abchmopqstuMQST]\n" -"ipcs prints information for IPC resources for which you have read access.\n" -" -a Show the maximum amount of information possible when displaying\n" -" active semaphores, message queues and shared memory segments\n" -" (This is shorthand for specifying -bcopt).\n" -" -b Show the maximum allowed sizes for active semaphores, message queues\n" -" and shared memory segments. The maximum allowed size is the maximum\n" -" number of bytes in a message on a message queue, the size of a shared\n" -" memory segment, or the number of semaphores in a set of semaphores.\n" -" -c Show the creator's name and group for active semaphores, message\n" -" queues, and shared memory segments.\n" -" -h This help.\n" -" -m Display information about active shared memory segments.\n" -" -o Show outstanding usage for active message queues and shared memory\n" -" segments. The outstanding usage is the number of messages in a\n" -" message queue, or the number of processes attached to a shared memory\n" -" segment.\n" -" -p Show the process ID information for active semaphores, message queues\n" -" and shared memory segments. The process ID information is the last\n" -" process to send a message to or receive a message from a message\n" -" queue, the process that created a semaphore, or the last process to\n" -" attach or detach a shared memory segment.\n" -" -q Display information about active message queues.\n" -" -s Display information about active semaphores.\n" -" -t Show access times for active semaphores, message queues and shared\n" -" -u Show system wide usage of IPC resources. This information is added\n" -" as a list after the appropriate shared memory, messages queue or\n" -" semaphore information output\n" -" -M Display system information about shared memory.\n" -" -Q Display system information about messages queues.\n" -" -S Display system information about semaphores.\n" -" -T Display system information about shared memory, message queues and\n" -" semaphores.\n"); - exit(0); -} -#endif /* __CYGWIN__ */ diff --git a/winsup/utils/kill.cc b/winsup/utils/kill.cc deleted file mode 100644 index deb0b41a3..000000000 --- a/winsup/utils/kill.cc +++ /dev/null @@ -1,286 +0,0 @@ -/* kill.cc - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include <stdio.h> -#include <stdlib.h> -#include <signal.h> -#include <string.h> -#include <time.h> -#include <errno.h> -#include <windows.h> -#include <sys/cygwin.h> -#include <getopt.h> - -static const char version[] = "$Revision$"; -static char *prog_name; - -static struct option longopts[] = -{ - {"help", no_argument, NULL, 'h' }, - {"list", optional_argument, NULL, 'l'}, - {"force", no_argument, NULL, 'f'}, - {"signal", required_argument, NULL, 's'}, - {"version", no_argument, NULL, 'v'}, - {NULL, 0, NULL, 0} -}; - -static char opts[] = "hl::fs:v"; - -extern "C" const char *strsigno (int); - -static void -usage (FILE *where = stderr) -{ - fprintf (where , "" - "Usage: %s [-f] [-signal] [-s signal] pid1 [pid2 ...]\n" - " %s -l [signal]\n" - "Send signals to processes\n" - "\n" - " -f, --force force, using win32 interface if necessary\n" - " -l, --list print a list of signal names\n" - " -s, --signal send signal (use %s --list for a list)\n" - " -h, --help output usage information and exit\n" - " -v, --version output version information and exit\n" - "", prog_name, prog_name, prog_name); - exit (where == stderr ? 1 : 0); -} - -static void -print_version () -{ - const char *v = strchr (version, ':'); - int len; - if (!v) - { - v = "?"; - len = 1; - } - else - { - v += 2; - len = strchr (v, ' ') - v; - } - printf ("\ -%s (cygwin) %.*s\n\ -Process Signaller\n\ -Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.\n\ -Compiled on %s\n\ -", prog_name, len, v, __DATE__); -} - -static int -getsig (const char *in_sig) -{ - const char *sig; - char buf[80]; - int intsig; - - if (strncmp (in_sig, "SIG", 3) == 0) - sig = in_sig; - else - { - sprintf (buf, "SIG%s", in_sig); - sig = buf; - } - intsig = strtosigno (sig) ?: atoi (in_sig); - char *p; - if (!intsig && (strcmp (buf, "SIG0") != 0 && (strtol (in_sig, &p, 10) != 0 || *p))) - intsig = -1; - return intsig; -} - -static void -test_for_unknown_sig (int sig, const char *sigstr) -{ - if (sig < 0 || sig > NSIG) - { - fprintf (stderr, "%s: unknown signal: %s\n", prog_name, sigstr); - usage (); - exit (1); - } -} - -static void -listsig (const char *in_sig) -{ - int sig; - if (!in_sig) - for (sig = 1; sig < NSIG; sig++) - printf ("%s%c", strsigno (sig) + 3, (sig < NSIG - 1) ? ' ' : '\n'); - else - { - sig = getsig (in_sig); - test_for_unknown_sig (sig, in_sig); - if (atoi (in_sig) == sig) - puts (strsigno (sig) + 3); - else - printf ("%d\n", sig); - } -} - -static void -get_debug_priv (void) -{ - HANDLE tok; - LUID luid; - TOKEN_PRIVILEGES tkp; - - if (!OpenProcessToken (GetCurrentProcess (), - TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &tok)) - return; - - if (!LookupPrivilegeValue (NULL, SE_DEBUG_NAME, &luid)) - { - CloseHandle (tok); - return; - } - - tkp.PrivilegeCount = 1; - tkp.Privileges[0].Luid = luid; - tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; - - AdjustTokenPrivileges (tok, FALSE, &tkp, sizeof tkp, NULL, NULL); - - CloseHandle (tok); -} - -static void __stdcall -forcekill (int pid, int sig, int wait) -{ - // try to acquire SeDebugPrivilege - get_debug_priv(); - - external_pinfo *p = (external_pinfo *) cygwin_internal (CW_GETPINFO_FULL, pid); - DWORD dwpid = p ? p->dwProcessId : (DWORD) pid; - HANDLE h = OpenProcess (PROCESS_TERMINATE, FALSE, (DWORD) dwpid); - if (!h) - { - fprintf (stderr, "couldn't open pid %u\n", (unsigned) dwpid); - return; - } - if (!wait || WaitForSingleObject (h, 200) != WAIT_OBJECT_0) - if (!TerminateProcess (h, sig << 8) - && WaitForSingleObject (h, 200) != WAIT_OBJECT_0) - fprintf (stderr, "couldn't kill pid %u, %u\n", (unsigned) dwpid, - (unsigned) GetLastError ()); - CloseHandle (h); -} - -int -main (int argc, char **argv) -{ - int sig = SIGTERM; - int force = 0; - int ret = 0; - char *gotasig = NULL; - - prog_name = strrchr (argv[0], '/'); - if (prog_name == NULL) - prog_name = strrchr (argv[0], '\\'); - if (prog_name == NULL) - prog_name = argv[0]; - else - prog_name++; - - if (argc == 1) - usage (); - - opterr = 0; - - char *p; - int pid = 0; - - for (;;) - { - int ch; - char **av = argv + optind; - if ((ch = getopt_long (argc, argv, opts, longopts, NULL)) == EOF) - break; - switch (ch) - { - case 's': - gotasig = optarg; - sig = getsig (gotasig); - break; - case 'l': - if (!optarg) - { - optarg = argv[optind]; - if (optarg) - { - optind++; - optreset = 1; - } - } - if (argv[optind]) - usage (); - listsig (optarg); - break; - case 'f': - force = 1; - break; - case 'h': - usage (stdout); - break; - case 'v': - print_version (); - break; - case '?': - if (gotasig) - { - pid = strtol (argv[optind], &p, 10); - if (pid < 0) - goto out; - usage (); - } - optreset = 1; - optind = 1 + av - argv; - gotasig = *av + 1; - sig = getsig (gotasig); - break; - default: - usage (); - break; - } - } - -out: - test_for_unknown_sig (sig, gotasig); - - argv += optind; - while (*argv != NULL) - { - if (!pid) - pid = strtol (*argv, &p, 10); - if (*p != '\0') - { - fprintf (stderr, "%s: illegal pid: %s\n", prog_name, *argv); - ret = 1; - } - else if (kill (pid, sig) == 0) - { - if (force) - forcekill (pid, sig, 1); - } - else if (force && sig != 0) - forcekill (pid, sig, 0); - else - { - char buf[1000]; - sprintf (buf, "%s %d", prog_name, pid); - perror (buf); - ret = 1; - } - argv++; - pid = 0; - } - return ret; -} - diff --git a/winsup/utils/mkgroup.c b/winsup/utils/mkgroup.c deleted file mode 100644 index 82039e58c..000000000 --- a/winsup/utils/mkgroup.c +++ /dev/null @@ -1,725 +0,0 @@ -/* mkgroup.c: - - Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc. - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#include <ctype.h> -#include <stdlib.h> -#include <wchar.h> -#include <stdio.h> -#include <windows.h> -#include <sys/cygwin.h> -#include <getopt.h> -#include <lmaccess.h> -#include <lmapibuf.h> -#include <ntsecapi.h> -#include <ntdef.h> - -static const char version[] = "$Revision$"; - -SID_IDENTIFIER_AUTHORITY sid_world_auth = {SECURITY_WORLD_SID_AUTHORITY}; -SID_IDENTIFIER_AUTHORITY sid_nt_auth = {SECURITY_NT_AUTHORITY}; - -NET_API_STATUS WINAPI (*netapibufferfree)(PVOID); -NET_API_STATUS WINAPI (*netgroupenum)(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); -NET_API_STATUS WINAPI (*netlocalgroupenum)(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); -NET_API_STATUS WINAPI (*netlocalgroupgetmembers)(LPWSTR,LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); -NET_API_STATUS WINAPI (*netgetdcname)(LPWSTR,LPWSTR,PBYTE*); -NET_API_STATUS WINAPI (*netgroupgetusers)(LPWSTR,LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); - -NTSTATUS NTAPI (*lsaclose)(LSA_HANDLE); -NTSTATUS NTAPI (*lsaopenpolicy)(PLSA_UNICODE_STRING,PLSA_OBJECT_ATTRIBUTES,ACCESS_MASK,PLSA_HANDLE); -NTSTATUS NTAPI (*lsaqueryinformationpolicy)(LSA_HANDLE,POLICY_INFORMATION_CLASS,PVOID*); -NTSTATUS NTAPI (*lsafreememory)(PVOID); - -#ifndef min -#define min(a,b) (((a)<(b))?(a):(b)) -#endif - -BOOL -load_netapi () -{ - HANDLE h = LoadLibrary ("netapi32.dll"); - - if (!h) - return FALSE; - - if (!(netapibufferfree = (void *) GetProcAddress (h, "NetApiBufferFree"))) - return FALSE; - if (!(netgroupenum = (void *) GetProcAddress (h, "NetGroupEnum"))) - return FALSE; - if (!(netgroupgetusers = (void *) GetProcAddress (h, "NetGroupGetUsers"))) - return FALSE; - if (!(netlocalgroupenum = (void *) GetProcAddress (h, "NetLocalGroupEnum"))) - return FALSE; - if (!(netlocalgroupgetmembers = (void *) GetProcAddress (h, "NetLocalGroupGetMembers"))) - return FALSE; - if (!(netgetdcname = (void *) GetProcAddress (h, "NetGetDCName"))) - return FALSE; - - if (!(h = LoadLibrary ("advapi32.dll"))) - return FALSE; - - if (!(lsaclose = (void *) GetProcAddress (h, "LsaClose"))) - return FALSE; - if (!(lsaopenpolicy = (void *) GetProcAddress (h, "LsaOpenPolicy"))) - return FALSE; - if (!(lsaqueryinformationpolicy = (void *) GetProcAddress (h, "LsaQueryInformationPolicy"))) - return FALSE; - if (!(lsafreememory = (void *) GetProcAddress (h, "LsaFreeMemory"))) - return FALSE; - - return TRUE; -} - -char * -put_sid (PSID sid) -{ - static char s[512]; - char t[32]; - DWORD i; - - strcpy (s, "S-1-"); - sprintf(t, "%u", GetSidIdentifierAuthority (sid)->Value[5]); - strcat (s, t); - for (i = 0; i < *GetSidSubAuthorityCount (sid); ++i) - { - sprintf(t, "-%lu", *GetSidSubAuthority (sid, i)); - strcat (s, t); - } - return s; -} - -void -psx_dir (char *in, char *out) -{ - if (isalpha (in[0]) && in[1] == ':') - { - sprintf (out, "/cygdrive/%c", in[0]); - in += 2; - out += strlen (out); - } - - while (*in) - { - if (*in == '\\') - *out = '/'; - else - *out = *in; - in++; - out++; - } - - *out = '\0'; -} - -void -uni2ansi (LPWSTR wcs, char *mbs, int size) -{ - if (wcs) - WideCharToMultiByte (CP_ACP, 0, wcs, -1, mbs, size, NULL, NULL); - else - *mbs = '\0'; -} - -void -enum_local_users (LPWSTR groupname) -{ - LOCALGROUP_MEMBERS_INFO_1 *buf1; - DWORD entries = 0; - DWORD total = 0; - DWORD reshdl = 0; - - if (!netlocalgroupgetmembers (NULL, groupname, - 1, (void *) &buf1, - MAX_PREFERRED_LENGTH, - &entries, &total, &reshdl)) - { - unsigned i, first = 1; - - for (i = 0; i < entries; ++i) - if (buf1[i].lgrmi1_sidusage == SidTypeUser) - { - char user[256]; - - if (!first) - printf (","); - first = 0; - uni2ansi (buf1[i].lgrmi1_name, user, sizeof (user)); - printf ("%s", user); - } - netapibufferfree (buf1); - } -} - -int -enum_local_groups (int print_sids, int print_users) -{ - LOCALGROUP_INFO_0 *buffer; - DWORD entriesread = 0; - DWORD totalentries = 0; - DWORD resume_handle = 0; - DWORD rc; - - do - { - DWORD i; - - rc = netlocalgroupenum (NULL, 0, (void *) &buffer, 1024, - &entriesread, &totalentries, &resume_handle); - switch (rc) - { - case ERROR_ACCESS_DENIED: - fprintf (stderr, "Access denied\n"); - exit (1); - - case ERROR_MORE_DATA: - case ERROR_SUCCESS: - break; - - default: - fprintf (stderr, "NetLocalGroupEnum() failed with %ld\n", rc); - exit (1); - } - - for (i = 0; i < entriesread; i++) - { - char localgroup_name[100]; - char domain_name[100]; - DWORD domname_len = 100; - char psid_buffer[1024]; - PSID psid = (PSID) psid_buffer; - DWORD sid_length = 1024; - DWORD gid; - SID_NAME_USE acc_type; - uni2ansi (buffer[i].lgrpi0_name, localgroup_name, sizeof (localgroup_name)); - - if (!LookupAccountName (NULL, localgroup_name, psid, - &sid_length, domain_name, &domname_len, - &acc_type)) - { - fprintf (stderr, "LookupAccountName(%s) failed with %ld\n", - localgroup_name, GetLastError ()); - continue; - } - else if (acc_type == SidTypeDomain) - { - char domname[356]; - - strcpy (domname, domain_name); - strcat (domname, "\\"); - strcat (domname, localgroup_name); - sid_length = 1024; - domname_len = 100; - if (!LookupAccountName (NULL, domname, - psid, &sid_length, - domain_name, &domname_len, - &acc_type)) - { - fprintf (stderr, - "LookupAccountName(%s) failed with error %ld\n", - localgroup_name, GetLastError ()); - continue; - } - } - - gid = *GetSidSubAuthority (psid, *GetSidSubAuthorityCount(psid) - 1); - - printf ("%s:%s:%ld:", localgroup_name, - print_sids ? put_sid (psid) : "", - gid); - if (print_users) - enum_local_users (buffer[i].lgrpi0_name); - printf ("\n"); - } - - netapibufferfree (buffer); - - } - while (rc == ERROR_MORE_DATA); - - return 0; -} - -void -enum_users (LPWSTR servername, LPWSTR groupname) -{ - GROUP_USERS_INFO_0 *buf1; - DWORD entries = 0; - DWORD total = 0; - DWORD reshdl = 0; - - if (!netgroupgetusers (servername, groupname, - 0, (void *) &buf1, - MAX_PREFERRED_LENGTH, - &entries, &total, &reshdl)) - { - unsigned i, first = 1; - - for (i = 0; i < entries; ++i) - { - char user[256]; - - if (!first) - printf (","); - first = 0; - uni2ansi (buf1[i].grui0_name, user, sizeof (user)); - printf ("%s", user); - } - netapibufferfree (buf1); - } -} - -void -enum_groups (LPWSTR servername, int print_sids, int print_users, int id_offset) -{ - GROUP_INFO_2 *buffer; - DWORD entriesread = 0; - DWORD totalentries = 0; - DWORD resume_handle = 0; - DWORD rc; - char ansi_srvname[256]; - - if (servername) - uni2ansi (servername, ansi_srvname, sizeof (ansi_srvname)); - - do - { - DWORD i; - - rc = netgroupenum (servername, 2, (void *) & buffer, 1024, - &entriesread, &totalentries, &resume_handle); - switch (rc) - { - case ERROR_ACCESS_DENIED: - fprintf (stderr, "Access denied\n"); - exit (1); - - case ERROR_MORE_DATA: - case ERROR_SUCCESS: - break; - - default: - fprintf (stderr, "NetGroupEnum() failed with %ld\n", rc); - exit (1); - } - - for (i = 0; i < entriesread; i++) - { - char groupname[100]; - char domain_name[100]; - DWORD domname_len = 100; - char psid_buffer[1024]; - PSID psid = (PSID) psid_buffer; - DWORD sid_length = 1024; - SID_NAME_USE acc_type; - - int gid = buffer[i].grpi2_group_id; - uni2ansi (buffer[i].grpi2_name, groupname, sizeof (groupname)); - if (print_sids) - { - if (!LookupAccountName (servername ? ansi_srvname : NULL, - groupname, - psid, &sid_length, - domain_name, &domname_len, - &acc_type)) - { - fprintf (stderr, - "LookupAccountName (%s, %s) failed with error %ld\n", - servername ? ansi_srvname : "NULL", - groupname, - GetLastError ()); - continue; - } - else if (acc_type == SidTypeDomain) - { - char domname[356]; - - strcpy (domname, domain_name); - strcat (domname, "\\"); - strcat (domname, groupname); - sid_length = 1024; - domname_len = 100; - if (!LookupAccountName (servername ? ansi_srvname : NULL, - domname, - psid, &sid_length, - domain_name, &domname_len, - &acc_type)) - { - fprintf (stderr, - "LookupAccountName(%s,%s) failed with error %ld\n", - servername ? ansi_srvname : "NULL", - domname, - GetLastError ()); - continue; - } - } - } - printf ("%s:%s:%u:", groupname, - print_sids ? put_sid (psid) : "", - gid + id_offset); - if (print_users) - enum_users (servername, buffer[i].grpi2_name); - printf ("\n"); - } - - netapibufferfree (buffer); - - } - while (rc == ERROR_MORE_DATA); -} - -void -print_special (int print_sids, - PSID_IDENTIFIER_AUTHORITY auth, BYTE cnt, - DWORD sub1, DWORD sub2, DWORD sub3, DWORD sub4, - DWORD sub5, DWORD sub6, DWORD sub7, DWORD sub8) -{ - char name[256], dom[256]; - DWORD len, len2, rid; - PSID sid; - SID_NAME_USE use; - - if (AllocateAndInitializeSid (auth, cnt, sub1, sub2, sub3, sub4, - sub5, sub6, sub7, sub8, &sid)) - { - if (LookupAccountSid (NULL, sid, - name, (len = 256, &len), - dom, (len2 = 256, &len), - &use)) - { - if (sub8) - rid = sub8; - else if (sub7) - rid = sub7; - else if (sub6) - rid = sub6; - else if (sub5) - rid = sub5; - else if (sub4) - rid = sub4; - else if (sub3) - rid = sub3; - else if (sub2) - rid = sub2; - else - rid = sub1; - printf ("%s:%s:%lu:\n", name, - print_sids ? put_sid (sid) : "", - rid); - } - FreeSid (sid); - } -} - -void -print_win_error(DWORD code) -{ - char buf[4096]; - - if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM - | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - code, - MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) buf, sizeof (buf), NULL)) - fprintf (stderr, "mkgroup: [%lu] %s", code, buf); - else - fprintf (stderr, "mkgroup: error %lu", code); -} - -void -current_group (int print_sids, int print_users, int id_offset) -{ - char name[UNLEN + 1], *envname, *envdomain; - DWORD len; - HANDLE ptok; - int errpos = 0; - struct { - PSID psid; - int buffer[10]; - } tg; - - - if ((!GetUserName (name, (len = sizeof (name), &len)) && (errpos = __LINE__)) - || !name[0] - || !(envname = getenv("USERNAME")) - || strcasecmp (envname, name) - || (!GetComputerName (name, (len = sizeof (name), &len)) - && (errpos = __LINE__)) - || !(envdomain = getenv("USERDOMAIN")) - || !envdomain[0] - || !strcasecmp (envdomain, name) - || (!OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &ptok) - && (errpos = __LINE__)) - || (!GetTokenInformation (ptok, TokenPrimaryGroup, &tg, sizeof tg, &len) - && (errpos = __LINE__)) - || (!CloseHandle (ptok) && (errpos = __LINE__))) - { - if (errpos) - { - print_win_error (GetLastError ()); - fprintf(stderr, " on line %d\n", errpos); - } - return; - } - - int gid = *GetSidSubAuthority (tg.psid, *GetSidSubAuthorityCount(tg.psid) - 1); - - printf ("mkgroup_l_d:%s:%u:", print_sids ? put_sid (tg.psid) : "", - gid + id_offset); - if (print_users) - printf("%s", envname); - printf ("\n"); -} - -int -usage (FILE * stream, int isNT) -{ - fprintf (stream, "Usage: mkgroup [OPTION]... [domain]...\n" - "Print /etc/group file to stdout\n\n" - "Options:\n"); - if (isNT) - fprintf (stream, " -l,--local print local group information\n" - " -c,--current print current group, if a domain account\n" - " -d,--domain print global group information (from current\n" - " domain if no domains specified)\n" - " -o,--id-offset offset change the default offset (10000) added to gids\n" - " in domain accounts.\n" - " -s,--no-sids don't print SIDs in pwd field\n" - " (this affects ntsec)\n" - " -u,--users print user list in gr_mem field\n"); - fprintf (stream, " -h,--help print this message\n" - " -v,--version print version information and exit\n\n"); - if (isNT) - fprintf (stream, "One of `-l' or `-d' must be given.\n"); - - return 1; -} - -struct option longopts[] = { - {"local", no_argument, NULL, 'l'}, - {"current", no_argument, NULL, 'c'}, - {"domain", no_argument, NULL, 'd'}, - {"id-offset", required_argument, NULL, 'o'}, - {"no-sids", no_argument, NULL, 's'}, - {"users", no_argument, NULL, 'u'}, - {"help", no_argument, NULL, 'h'}, - {"version", no_argument, NULL, 'v'}, - {0, no_argument, NULL, 0} -}; - -char opts[] = "lcdo:suhv"; - -void -print_version () -{ - const char *v = strchr (version, ':'); - int len; - if (!v) - { - v = "?"; - len = 1; - } - else - { - v += 2; - len = strchr (v, ' ') - v; - } - printf ("\ -mkgroup (cygwin) %.*s\n\ -group File Generator\n\ -Copyright 1997, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.\n\ -Compiled on %s\n\ -", len, v, __DATE__); -} - -int -main (int argc, char **argv) -{ - LPWSTR servername; - DWORD rc = ERROR_SUCCESS; - WCHAR domain_name[100]; - int print_local = 0; - int print_current = 0; - int print_domain = 0; - int print_sids = 1; - int print_users = 0; - int domain_specified = 0; - int id_offset = 10000; - int isNT; - int i; - - char name[256], dom[256]; - DWORD len, len2; - char buf[1024]; - PSID psid = NULL; - SID_NAME_USE use; - - LSA_OBJECT_ATTRIBUTES oa = { 0, 0, 0, 0, 0, 0 }; - LSA_HANDLE lsa = INVALID_HANDLE_VALUE; - NTSTATUS ret; - PPOLICY_PRIMARY_DOMAIN_INFO pdi; - - isNT = (GetVersion () < 0x80000000); - - if (isNT && argc == 1) - return usage(stderr, isNT); - else - { - while ((i = getopt_long (argc, argv, opts, longopts, NULL)) != EOF) - switch (i) - { - case 'l': - print_local = 1; - break; - case 'c': - print_current = 1; - break; - case 'd': - print_domain = 1; - break; - case 'o': - id_offset = strtol (optarg, NULL, 10); - break; - case 's': - print_sids = 0; - break; - case 'u': - print_users = 1; - break; - case 'h': - usage (stdout, isNT); - return 0; - case 'v': - print_version (); - return 0; - default: - fprintf (stderr, "Try `%s --help' for more information.\n", argv[0]); - return 1; - } - } - - /* This takes Windows 9x/ME into account. */ - if (!isNT) - { - printf ("all::%ld:\n", DOMAIN_ALIAS_RID_ADMINS); - return 0; - } - - if (!print_local && !print_domain) - { - fprintf (stderr, "%s: Specify one of `-l' or `-d'\n", argv[0]); - return 1; - } - if (optind < argc) - { - if (!print_domain) - { - fprintf (stderr, "%s: A domain name is only accepted " - "when `-d' is given.\n", argv[0]); - return 1; - } - domain_specified = 1; - } - if (!load_netapi ()) - { - fprintf (stderr, "Failed loading symbols from netapi32.dll " - "with error %lu\n", GetLastError ()); - return 1; - } - - if (print_local) - { - /* - * Very special feature for the oncoming future: - * Create a "root" group account, being actually the local - * Administrators group. Since user name, sid and gid are - * fixed, there's no need to call print_special() for this. - */ - printf ("root:S-1-5-32-544:0:\n"); - - /* - * Get `system' group - */ - print_special (print_sids, &sid_nt_auth, 1, SECURITY_LOCAL_SYSTEM_RID, - 0, 0, 0, 0, 0, 0, 0); - /* - * Get `None' group - */ - len = 256; - GetComputerName (name, &len); - len = 1024; - len2 = 256; - if (LookupAccountName (NULL, name, (PSID) buf, &len, dom, &len, &use)) - psid = (PSID) buf; - else - { - ret = lsaopenpolicy (NULL, &oa, POLICY_VIEW_LOCAL_INFORMATION, &lsa); - if (ret == STATUS_SUCCESS && lsa != INVALID_HANDLE_VALUE) - { - ret = lsaqueryinformationpolicy (lsa, - PolicyPrimaryDomainInformation, - (void *) &pdi); - if (ret == STATUS_SUCCESS) - { - if (pdi->Sid) - { - CopySid (1024, (PSID) buf, pdi->Sid); - psid = (PSID) buf; - } - lsafreememory (pdi); - } - lsaclose (lsa); - } - } - if (!psid) - fprintf (stderr, - "WARNING: Group 513 couldn't get retrieved. Try mkgroup -d\n"); - else - print_special (print_sids, GetSidIdentifierAuthority (psid), 5, - *GetSidSubAuthority (psid, 0), - *GetSidSubAuthority (psid, 1), - *GetSidSubAuthority (psid, 2), - *GetSidSubAuthority (psid, 3), - 513, - 0, - 0, - 0); - - enum_local_groups (print_sids, print_users); - } - - i = 1; - if (print_domain) - do - { - if (domain_specified) - { - mbstowcs (domain_name, argv[optind], (strlen (argv[optind]) + 1)); - rc = netgetdcname (NULL, domain_name, (void *) &servername); - } - else - rc = netgetdcname (NULL, NULL, (void *) &servername); - - if (rc != ERROR_SUCCESS) - { - fprintf (stderr, "Cannot get PDC, code = %ld\n", rc); - return 1; - } - - enum_groups (servername, print_sids, print_users, id_offset * i++); - netapibufferfree (servername); - } - while (++optind < argc); - - if (print_current && !print_domain) - current_group (print_sids, print_users, id_offset); - - return 0; -} diff --git a/winsup/utils/mkpasswd.c b/winsup/utils/mkpasswd.c deleted file mode 100644 index d2493b47d..000000000 --- a/winsup/utils/mkpasswd.c +++ /dev/null @@ -1,743 +0,0 @@ -/* mkpasswd.c: - - Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc. - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#include <ctype.h> -#include <stdlib.h> -#include <wchar.h> -#include <stdio.h> -#include <windows.h> -#include <io.h> -#include <unistd.h> -#include <sys/cygwin.h> -#include <getopt.h> -#include <lmaccess.h> -#include <lmapibuf.h> -#include <sys/fcntl.h> -#include <lmerr.h> -#include <lmcons.h> - -static const char version[] = "$Revision$"; - -SID_IDENTIFIER_AUTHORITY sid_world_auth = {SECURITY_WORLD_SID_AUTHORITY}; -SID_IDENTIFIER_AUTHORITY sid_nt_auth = {SECURITY_NT_AUTHORITY}; - -NET_API_STATUS WINAPI (*netapibufferfree)(PVOID); -NET_API_STATUS WINAPI (*netuserenum)(LPWSTR,DWORD,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); -NET_API_STATUS WINAPI (*netlocalgroupenum)(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); -NET_API_STATUS WINAPI (*netgetdcname)(LPWSTR,LPWSTR,PBYTE*); -NET_API_STATUS WINAPI (*netusergetinfo)(LPWSTR,LPWSTR,DWORD,PBYTE*); - -#ifndef min -#define min(a,b) (((a)<(b))?(a):(b)) -#endif - -BOOL -load_netapi () -{ - HANDLE h = LoadLibrary ("netapi32.dll"); - - if (!h) - return FALSE; - - if (!(netapibufferfree = (void *) GetProcAddress (h, "NetApiBufferFree"))) - return FALSE; - if (!(netuserenum = (void *) GetProcAddress (h, "NetUserEnum"))) - return FALSE; - if (!(netlocalgroupenum = (void *) GetProcAddress (h, "NetLocalGroupEnum"))) - return FALSE; - if (!(netgetdcname = (void *) GetProcAddress (h, "NetGetDCName"))) - return FALSE; - if (!(netusergetinfo = (void *) GetProcAddress (h, "NetUserGetInfo"))) - return FALSE; - - return TRUE; -} - -char * -put_sid (PSID sid) -{ - static char s[512]; - char t[32]; - DWORD i; - - strcpy (s, "S-1-"); - sprintf(t, "%u", GetSidIdentifierAuthority (sid)->Value[5]); - strcat (s, t); - for (i = 0; i < *GetSidSubAuthorityCount (sid); ++i) - { - sprintf(t, "-%lu", *GetSidSubAuthority (sid, i)); - strcat (s, t); - } - return s; -} - -void -psx_dir (char *in, char *out) -{ - if (isalpha (in[0]) && in[1] == ':') - { - sprintf (out, "/cygdrive/%c", in[0]); - in += 2; - out += strlen (out); - } - - while (*in) - { - if (*in == '\\') - *out = '/'; - else - *out = *in; - in++; - out++; - } - - *out = '\0'; -} - -void -uni2ansi (LPWSTR wcs, char *mbs, int size) -{ - if (wcs) - WideCharToMultiByte (CP_ACP, 0, wcs, -1, mbs, size, NULL, NULL); - else - *mbs = '\0'; -} - -void -print_win_error(DWORD code) -{ - char buf[4096]; - - if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM - | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - code, - MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) buf, sizeof (buf), NULL)) - fprintf (stderr, "mkpasswd: [%lu] %s", code, buf); - else - fprintf (stderr, "mkpasswd: error %lu", code); -} - -void -current_user (int print_sids, int print_cygpath, - const char * passed_home_path, int id_offset, const char * disp_username) -{ - char name[UNLEN + 1], *envname, *envdomain; - DWORD len; - HANDLE ptok; - int errpos = 0; - struct { - PSID psid; - int buffer[10]; - } tu, tg; - - - if ((!GetUserName (name, (len = sizeof (name), &len)) && (errpos = __LINE__)) - || !name[0] - || !(envname = getenv("USERNAME")) - || strcasecmp (envname, name) - || (disp_username && strcasecmp(envname, disp_username)) - || (!GetComputerName (name, (len = sizeof (name), &len)) - && (errpos = __LINE__)) - || !(envdomain = getenv("USERDOMAIN")) - || !envdomain[0] - || !strcasecmp (envdomain, name) - || (!OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &ptok) - && (errpos = __LINE__)) - || (!GetTokenInformation (ptok, TokenUser, &tu, sizeof tu, &len) - && (errpos = __LINE__)) - || (!GetTokenInformation (ptok, TokenPrimaryGroup, &tg, sizeof tg, &len) - && (errpos = __LINE__)) - || (!CloseHandle (ptok) && (errpos = __LINE__))) - { - if (errpos) - { - print_win_error (GetLastError ()); - fprintf(stderr, " on line %d\n", errpos); - } - return; - } - - int uid = *GetSidSubAuthority (tu.psid, *GetSidSubAuthorityCount(tu.psid) - 1); - int gid = *GetSidSubAuthority (tg.psid, *GetSidSubAuthorityCount(tg.psid) - 1); - char homedir_psx[MAX_PATH] = {0}, homedir_w32[MAX_PATH] = {0}; - - char *envhomedrive = getenv ("HOMEDRIVE"); - char *envhomepath = getenv ("HOMEPATH"); - - if (passed_home_path[0] == '\0') - { - if (envhomepath && envhomepath[0]) - { - if (envhomedrive) - strlcpy (homedir_w32, envhomedrive, sizeof (homedir_w32)); - if (envhomepath[0] != '\\') - strlcat (homedir_w32, "\\", sizeof (homedir_w32)); - strlcat (homedir_w32, envhomepath, sizeof (homedir_w32)); - if (print_cygpath) - cygwin_conv_to_posix_path (homedir_w32, homedir_psx); - else - psx_dir (homedir_w32, homedir_psx); - } - else - { - strlcpy (homedir_psx, "/home/", sizeof (homedir_psx)); - strlcat (homedir_psx, envname, sizeof (homedir_psx)); - } - } - else - { - strlcpy (homedir_psx, passed_home_path, sizeof (homedir_psx)); - strlcat (homedir_psx, envname, sizeof (homedir_psx)); - } - - printf ("%s:unused_by_nt/2000/xp:%u:%u:%s%s%s%s%s%s%s%s:%s:/bin/bash\n", - envname, - uid + id_offset, - gid + id_offset, - envname, - print_sids ? "," : "", - print_sids ? "U-" : "", - print_sids ? envdomain : "", - print_sids ? "\\" : "", - print_sids ? envname : "", - print_sids ? "," : "", - print_sids ? put_sid (tu.psid) : "", - homedir_psx); -} - -int -enum_users (LPWSTR servername, int print_sids, int print_cygpath, - const char * passed_home_path, int id_offset, char *disp_username) -{ - USER_INFO_3 *buffer; - DWORD entriesread = 0; - DWORD totalentries = 0; - DWORD resume_handle = 0; - DWORD rc; - char ansi_srvname[256]; - WCHAR uni_name[512]; - - if (servername) - uni2ansi (servername, ansi_srvname, sizeof (ansi_srvname)); - - do - { - DWORD i; - - if (disp_username != NULL) - { - MultiByteToWideChar (CP_ACP, 0, disp_username, -1, uni_name, 512 ); - rc = netusergetinfo(servername, (LPWSTR) & uni_name, 3, - (void *) &buffer ); - entriesread=1; - } - else - rc = netuserenum (servername, 3, FILTER_NORMAL_ACCOUNT, - (void *) &buffer, 1024, - &entriesread, &totalentries, &resume_handle); - switch (rc) - { - case ERROR_ACCESS_DENIED: - print_win_error(rc); - exit (1); - - case ERROR_MORE_DATA: - case ERROR_SUCCESS: - break; - - default: - print_win_error(rc); - exit (1); - } - - for (i = 0; i < entriesread; i++) - { - char username[100]; - char fullname[100]; - char homedir_psx[MAX_PATH]; - char homedir_w32[MAX_PATH]; - char domain_name[100]; - DWORD domname_len = 100; - char psid_buffer[1024]; - PSID psid = (PSID) psid_buffer; - DWORD sid_length = 1024; - SID_NAME_USE acc_type; - - int uid = buffer[i].usri3_user_id; - int gid = buffer[i].usri3_primary_group_id; - uni2ansi (buffer[i].usri3_name, username, sizeof (username)); - uni2ansi (buffer[i].usri3_full_name, fullname, sizeof (fullname)); - homedir_w32[0] = homedir_psx[0] = '\0'; - if (passed_home_path[0] == '\0') - { - uni2ansi (buffer[i].usri3_home_dir, homedir_w32, - sizeof (homedir_w32)); - if (homedir_w32[0] != '\0') - { - if (print_cygpath) - cygwin_conv_to_posix_path (homedir_w32, homedir_psx); - else - psx_dir (homedir_w32, homedir_psx); - } - else - { - strcpy (homedir_psx, "/home/"); - strcat (homedir_psx, username); - } - } - else - { - strcpy (homedir_psx, passed_home_path); - strcat (homedir_psx, username); - } - - if (print_sids) - { - if (!LookupAccountName (servername ? ansi_srvname : NULL, - username, - psid, &sid_length, - domain_name, &domname_len, - &acc_type)) - { - print_win_error(GetLastError ()); - continue; - } - else if (acc_type == SidTypeDomain) - { - char domname[356]; - - strcpy (domname, domain_name); - strcat (domname, "\\"); - strcat (domname, username); - sid_length = 1024; - domname_len = 100; - if (!LookupAccountName (servername ? ansi_srvname : NULL, - domname, - psid, &sid_length, - domain_name, &domname_len, - &acc_type)) - { - print_win_error(GetLastError ()); - continue; - } - } - } - printf ("%s:unused_by_nt/2000/xp:%u:%u:%s%s%s%s%s%s%s%s:%s:/bin/bash\n", - username, - uid + id_offset, - gid + id_offset, - fullname, - print_sids && fullname[0] ? "," : "", - print_sids ? "U-" : "", - print_sids ? domain_name : "", - print_sids && domain_name[0] ? "\\" : "", - print_sids ? username : "", - print_sids ? "," : "", - print_sids ? put_sid (psid) : "", - homedir_psx); - } - - netapibufferfree (buffer); - - } - while (rc == ERROR_MORE_DATA); - - return 0; -} - -int -enum_local_groups (int print_sids) -{ - LOCALGROUP_INFO_0 *buffer; - DWORD entriesread = 0; - DWORD totalentries = 0; - DWORD resume_handle = 0; - DWORD rc ; - - do - { - DWORD i; - - rc = netlocalgroupenum (NULL, 0, (void *) &buffer, 1024, - &entriesread, &totalentries, &resume_handle); - switch (rc) - { - case ERROR_ACCESS_DENIED: - print_win_error(rc); - exit (1); - - case ERROR_MORE_DATA: - case ERROR_SUCCESS: - break; - - default: - print_win_error(rc); - exit (1); - } - - for (i = 0; i < entriesread; i++) - { - char localgroup_name[100]; - char domain_name[100]; - DWORD domname_len = 100; - char psid_buffer[1024]; - PSID psid = (PSID) psid_buffer; - DWORD sid_length = 1024; - DWORD gid; - SID_NAME_USE acc_type; - uni2ansi (buffer[i].lgrpi0_name, localgroup_name, sizeof (localgroup_name)); - - if (!LookupAccountName (NULL, localgroup_name, psid, - &sid_length, domain_name, &domname_len, - &acc_type)) - { - print_win_error(GetLastError ()); - continue; - } - else if (acc_type == SidTypeDomain) - { - char domname[356]; - - strcpy (domname, domain_name); - strcat (domname, "\\"); - strcat (domname, localgroup_name); - sid_length = 1024; - domname_len = 100; - if (!LookupAccountName (NULL, domname, - psid, &sid_length, - domain_name, &domname_len, - &acc_type)) - { - print_win_error(GetLastError ()); - continue; - } - } - - gid = *GetSidSubAuthority (psid, *GetSidSubAuthorityCount(psid) - 1); - - printf ("%s:*:%ld:%ld:%s%s::\n", localgroup_name, gid, gid, - print_sids ? "," : "", - print_sids ? put_sid (psid) : ""); - } - - netapibufferfree (buffer); - - } - while (rc == ERROR_MORE_DATA); - - return 0; -} - -void -print_special (int print_sids, - PSID_IDENTIFIER_AUTHORITY auth, BYTE cnt, - DWORD sub1, DWORD sub2, DWORD sub3, DWORD sub4, - DWORD sub5, DWORD sub6, DWORD sub7, DWORD sub8) -{ - char name[256], dom[256]; - DWORD len, len2, rid; - PSID sid; - SID_NAME_USE use; - - if (AllocateAndInitializeSid (auth, cnt, sub1, sub2, sub3, sub4, - sub5, sub6, sub7, sub8, &sid)) - { - if (LookupAccountSid (NULL, sid, - name, (len = 256, &len), - dom, (len2 = 256, &len), - &use)) - { - if (sub8) - rid = sub8; - else if (sub7) - rid = sub7; - else if (sub6) - rid = sub6; - else if (sub5) - rid = sub5; - else if (sub4) - rid = sub4; - else if (sub3) - rid = sub3; - else if (sub2) - rid = sub2; - else - rid = sub1; - printf ("%s:*:%lu:%lu:%s%s::\n", - name, rid, rid == 18 ? 544 : rid, /* SYSTEM hack */ - print_sids ? "," : "", - print_sids ? put_sid (sid) : ""); - } - FreeSid (sid); - } -} - -int -usage (FILE * stream, int isNT) -{ - fprintf (stream, "Usage: mkpasswd [OPTION]... [domain]...\n" - "Print /etc/passwd file to stdout\n\n" - "Options:\n"); - if (isNT) - fprintf (stream, " -l,--local print local user accounts\n" - " -c,--current print current account, if a domain account\n" - " -d,--domain print domain accounts (from current domain\n" - " if no domains specified)\n" - " -o,--id-offset offset change the default offset (10000) added to uids\n" - " in domain accounts.\n" - " -g,--local-groups print local group information too\n" - " if no domain specified\n" - " -m,--no-mount don't use mount points for home dir\n" - " -s,--no-sids don't print SIDs in GCOS field\n" - " (this affects ntsec)\n"); - fprintf (stream, " -p,--path-to-home path use specified path and not user account home dir or /home\n" - " -u,--username username only return information for the specified user\n" - " -h,--help displays this message\n" - " -v,--version version information and exit\n\n"); - if (isNT) - fprintf (stream, "One of `-l', `-d' or `-g' must be given.\n"); - return 1; -} - -struct option longopts[] = { - {"local", no_argument, NULL, 'l'}, - {"current", no_argument, NULL, 'c'}, - {"domain", no_argument, NULL, 'd'}, - {"id-offset", required_argument, NULL, 'o'}, - {"local-groups", no_argument, NULL, 'g'}, - {"no-mount", no_argument, NULL, 'm'}, - {"no-sids", no_argument, NULL, 's'}, - {"path-to-home", required_argument, NULL, 'p'}, - {"username", required_argument, NULL, 'u'}, - {"help", no_argument, NULL, 'h'}, - {"version", no_argument, NULL, 'v'}, - {0, no_argument, NULL, 0} -}; - -char opts[] = "lcdo:gsmhp:u:v"; - -static void -print_version () -{ - const char *v = strchr (version, ':'); - int len; - if (!v) - { - v = "?"; - len = 1; - } - else - { - v += 2; - len = strchr (v, ' ') - v; - } - printf ("\ -mkpasswd (cygwin) %.*s\n\ -passwd File Generator\n\ -Copyright 1997, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.\n\ -Compiled on %s\n\ -", len, v, __DATE__); -} - -int -main (int argc, char **argv) -{ - LPWSTR servername = NULL; - DWORD rc = ERROR_SUCCESS; - WCHAR domain_name[200]; - int print_local = 0; - int print_current = 0; - int print_domain = 0; - int print_local_groups = 0; - int domain_name_specified = 0; - int print_sids = 1; - int print_cygpath = 1; - int id_offset = 10000; - int i; - int isNT; - char *disp_username = NULL; - char name[256], passed_home_path[MAX_PATH]; - DWORD len; - - isNT = (GetVersion () < 0x80000000); - passed_home_path[0] = '\0'; - if (!isatty (1)) - setmode (1, O_BINARY); - - if (isNT && argc == 1) - return usage (stderr, isNT); - else - { - while ((i = getopt_long (argc, argv, opts, longopts, NULL)) != EOF) - switch (i) - { - case 'l': - print_local = 1; - break; - case 'c': - print_current = 1; - break; - case 'd': - print_domain = 1; - break; - case 'o': - id_offset = strtol (optarg, NULL, 10); - break; - case 'g': - print_local_groups = 1; - break; - case 's': - print_sids = 0; - break; - case 'm': - print_cygpath = 0; - break; - case 'p': - if (optarg[0] != '/') - { - fprintf (stderr, "%s: `%s' is not a fully qualified path.\n", - argv[0], optarg); - return 1; - } - strcpy (passed_home_path, optarg); - if (optarg[strlen (optarg)-1] != '/') - strcat (passed_home_path, "/"); - break; - case 'u': - disp_username = optarg; - break; - case 'h': - usage (stdout, isNT); - return 0; - case 'v': - print_version (); - return 0; - default: - fprintf (stderr, "Try `%s --help' for more information.\n", argv[0]); - return 1; - } - } - if (!isNT) - { - /* This takes Windows 9x/ME into account. */ - if (passed_home_path[0] == '\0') - strcpy (passed_home_path, "/home/"); - if (!disp_username) - { - printf ("admin:use_crypt:%lu:%lu:Administrator:%sadmin:/bin/bash\n", - DOMAIN_USER_RID_ADMIN, - DOMAIN_ALIAS_RID_ADMINS, - passed_home_path); - if (GetUserName (name, (len = 256, &len))) - disp_username = name; - } - if (disp_username && disp_username[0]) - { - /* Create a pseudo random uid */ - unsigned long uid = 0, i; - for (i = 0; disp_username[i]; i++) - uid += toupper (disp_username[i]) << ((6 * i) % 25); - uid = (uid % (1000 - DOMAIN_USER_RID_ADMIN - 1)) - + DOMAIN_USER_RID_ADMIN + 1; - - printf ("%s:use_crypt:%lu:%lu:%s:%s%s:/bin/bash\n", - disp_username, - uid, - DOMAIN_ALIAS_RID_ADMINS, - disp_username, - passed_home_path, - disp_username); - } - return 0; - } - if (!print_local && !print_domain && !print_local_groups) - { - fprintf (stderr, "%s: Specify one of `-l', `-d' or `-g'\n", argv[0]); - return 1; - } - if (optind < argc) - { - if (!print_domain) - { - fprintf (stderr, "%s: A domain name is only accepted " - "when `-d' is given.\n", argv[0]); - return 1; - } - domain_name_specified = 1; - } - if (!load_netapi ()) - { - print_win_error(GetLastError ()); - return 1; - } - - if (disp_username == NULL) - { - if (print_local) - { -#if 0 - /* - * Get `Everyone' group - */ - print_special (print_sids, &sid_world_auth, 1, SECURITY_WORLD_RID, - 0, 0, 0, 0, 0, 0, 0); -#endif - /* - * Get `system' group - */ - print_special (print_sids, &sid_nt_auth, 1, SECURITY_LOCAL_SYSTEM_RID, - 0, 0, 0, 0, 0, 0, 0); - /* - * Get `administrators' group - */ - if (!print_local_groups) - print_special (print_sids, &sid_nt_auth, 2, SECURITY_BUILTIN_DOMAIN_RID, - DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0); - } - if (print_local_groups) - enum_local_groups (print_sids); - } - - if (print_local) - enum_users (NULL, print_sids, print_cygpath, passed_home_path, 0, - disp_username); - - i = 1; - if (print_domain) - do - { - if (domain_name_specified) - { - mbstowcs (domain_name, argv[optind], (strlen (argv[optind]) + 1)); - rc = netgetdcname (NULL, domain_name, (void *) &servername); - } - else - rc = netgetdcname (NULL, NULL, (void *) &servername); - - if (rc != ERROR_SUCCESS) - { - print_win_error(rc); - return 1; - } - - enum_users (servername, print_sids, print_cygpath, passed_home_path, - id_offset * i++, disp_username); - netapibufferfree (servername); - } - while (++optind < argc); - - if (print_current && !print_domain) - current_user(print_sids, print_cygpath, passed_home_path, - id_offset, disp_username); - - return 0; -} diff --git a/winsup/utils/module_info.cc b/winsup/utils/module_info.cc deleted file mode 100644 index c0e7079cc..000000000 --- a/winsup/utils/module_info.cc +++ /dev/null @@ -1,114 +0,0 @@ -/* module_info.cc - - Copyright 1999,2000,2001 Red Hat, Inc. - - Written by Egor Duda <deo@logos-m.ru> - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include <stdlib.h> -#include <windows.h> -#include <psapi.h> - -static int psapi_loaded = 0; -static HMODULE psapi_module_handle = NULL; - -typedef BOOL WINAPI (tf_EnumProcessModules) (HANDLE, HMODULE *, DWORD, - LPDWORD); -typedef BOOL WINAPI (tf_GetModuleInformation) (HANDLE, HMODULE, LPMODULEINFO, - DWORD); -typedef DWORD WINAPI (tf_GetModuleFileNameExA) (HANDLE, HMODULE, LPSTR, - DWORD); - -static tf_EnumProcessModules *psapi_EnumProcessModules = NULL; -static tf_GetModuleInformation *psapi_GetModuleInformation = NULL; -static tf_GetModuleFileNameExA *psapi_GetModuleFileNameExA = NULL; - -/* Returns full name of Dll, which is loaded by hProcess at BaseAddress. - Uses psapi.dll. */ - -char * -psapi_get_module_name (HANDLE hProcess, DWORD BaseAddress) -{ - DWORD len; - MODULEINFO mi; - unsigned int i; - HMODULE dh_buf[1]; - HMODULE *DllHandle = dh_buf; - DWORD cbNeeded; - BOOL ok; - - char name_buf[MAX_PATH + 1]; - - if (!psapi_loaded || - psapi_EnumProcessModules == NULL || - psapi_GetModuleInformation == NULL || - psapi_GetModuleFileNameExA == NULL) - { - if (psapi_loaded) - goto failed; - psapi_loaded = 1; - psapi_module_handle = LoadLibrary ("psapi.dll"); - if (!psapi_module_handle) - goto failed; - psapi_EnumProcessModules = - (tf_EnumProcessModules *) GetProcAddress (psapi_module_handle, - "EnumProcessModules"); - psapi_GetModuleInformation = - (tf_GetModuleInformation *) GetProcAddress (psapi_module_handle, - "GetModuleInformation"); - psapi_GetModuleFileNameExA = - (tf_GetModuleFileNameExA *) GetProcAddress (psapi_module_handle, - "GetModuleFileNameExA"); - if (psapi_EnumProcessModules == NULL - || psapi_GetModuleInformation == NULL - || psapi_GetModuleFileNameExA == NULL) - goto failed; - } - - ok = (*psapi_EnumProcessModules) (hProcess, - DllHandle, sizeof (HMODULE), &cbNeeded); - - if (!ok || !cbNeeded) - goto failed; - DllHandle = (HMODULE *) malloc (cbNeeded); - if (!DllHandle) - goto failed; - ok = (*psapi_EnumProcessModules) (hProcess, DllHandle, cbNeeded, &cbNeeded); - if (!ok) - { - free (DllHandle); - goto failed; - } - - for (i = 0; i < cbNeeded / sizeof (HMODULE); i++) - { - if (!(*psapi_GetModuleInformation) (hProcess, - DllHandle[i], &mi, sizeof (mi))) - { - free (DllHandle); - goto failed; - } - - len = (*psapi_GetModuleFileNameExA) (hProcess, - DllHandle[i], name_buf, MAX_PATH); - if (len == 0) - { - free (DllHandle); - goto failed; - } - - if ((DWORD) (mi.lpBaseOfDll) == BaseAddress) - { - free (DllHandle); - return strdup (name_buf); - } - } - -failed: - return NULL; -} diff --git a/winsup/utils/mount.cc b/winsup/utils/mount.cc deleted file mode 100644 index 5c84280f7..000000000 --- a/winsup/utils/mount.cc +++ /dev/null @@ -1,558 +0,0 @@ -/* mount.cc - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include <stdio.h> -#include <sys/mount.h> -#include <sys/stat.h> -#include <mntent.h> -#include <windows.h> -#include <sys/cygwin.h> -#include <stdlib.h> -#include <getopt.h> -#include <dirent.h> - -#ifdef errno -#undef errno -#endif -#include <errno.h> - -#define EXEC_FLAGS (MOUNT_EXEC | MOUNT_NOTEXEC | MOUNT_CYGWIN_EXEC) - -static void mount_commands (void); -static void show_mounts (void); -static void show_cygdrive_info (void); -static void change_cygdrive_prefix (const char *new_prefix, int flags); -static int mount_already_exists (const char *posix_path, int flags); - -// static short create_missing_dirs = FALSE; -static short force = FALSE; - -static const char version[] = "$Revision$"; -static const char *progname; - -static void -error (const char *path) -{ - fprintf (stderr, "%s: %s: %s\n", progname, path, - (errno == EMFILE) ? "Too many mount entries" : strerror (errno)); - exit (1); -} - -/* FIXME: do_mount should also print a warning message if the dev arg - is a non-existent Win32 path. */ - -static void -do_mount (const char *dev, const char *where, int flags) -{ - struct stat statbuf; - char win32_path[MAX_PATH]; - int statres; - - cygwin_conv_to_win32_path (where, win32_path); - - statres = stat (win32_path, &statbuf); - -#if 0 - if (statres == -1) - { - /* FIXME: this'll fail if mount dir is missing any parent dirs */ - if (create_missing_dirs == TRUE) - { - if (mkdir (where, 0755) == -1) - fprintf (stderr, "Warning: unable to create %s!\n", where); - else - statres = 0; /* Pretend stat succeeded if we could mkdir. */ - } - } -#endif - - if (statres == -1) - { - if (!force) - fprintf (stderr, "%s: warning - %s does not exist.\n", progname, where); - } - else if (!(statbuf.st_mode & S_IFDIR)) - { - if (!force) - fprintf (stderr, "%s: warning: %s is not a directory.\n", progname, where); - } - - if (!force && !(flags & EXEC_FLAGS) && strlen (dev)) - { - char devtmp[1 + 2 * strlen (dev)]; - strcpy (devtmp, dev); - char c = strchr (devtmp, '\0')[-1]; - if (c == '/' || c == '\\') - strcat (devtmp, "."); - /* Use a curious property of Windows which allows the use of \.. even - on non-directory paths. */ - for (const char *p = dev; (p = strpbrk (p, "/\\")); p++) - strcat (devtmp, "\\.."); - strcat (devtmp, "\\"); - if (GetDriveType (devtmp) == DRIVE_REMOTE) - { - fprintf (stderr, "%s: defaulting to '--no-executable' flag for speed since native path\n" - "%*creferences a remote share. Use '-f' option to override.\n", progname, - strlen(progname) + 2, ' '); - flags |= MOUNT_NOTEXEC; - } - } - - if (!force && flags & MOUNT_ENC) - { - DIR *dd = opendir (dev); - if (dd) - { - struct dirent *d; - while ((d = readdir (dd))) - { - if (d->d_name[0] != '.') - /* fall through */; - else if (d->d_name[1] == '\0' - || (d->d_name[1] == '.' && d->d_name[2] == '\0')) - continue; - fprintf (stderr, "%s: error: don't use \"-o managed\" on non-empty directories\n", progname); - exit (1); - } - } - } - - if (mount (dev, where, flags)) - error (where); - - exit (0); -} - -static struct option longopts[] = -{ - {"binary", no_argument, NULL, 'b'}, - {"change-cygdrive-prefix", no_argument, NULL, 'c'}, - {"cygwin-executable", no_argument, NULL, 'X'}, - {"executable", no_argument, NULL, 'x'}, - {"force", no_argument, NULL, 'f'}, - {"help", no_argument, NULL, 'h' }, - {"mount-commands", no_argument, NULL, 'm'}, - {"no-executable", no_argument, NULL, 'E'}, - {"options", required_argument, NULL, 'E'}, - {"show-cygdrive-prefix", no_argument, NULL, 'p'}, - {"system", no_argument, NULL, 's'}, - {"text", no_argument, NULL, 't'}, - {"user", no_argument, NULL, 'u'}, - {"version", no_argument, NULL, 'v'}, - {NULL, 0, NULL, 0} -}; - -static char opts[] = "bcfhmpstuvxEXo:"; - -static void -usage (FILE *where = stderr) -{ - fprintf (where, "Usage: %s [OPTION] [<win32path> <posixpath>]\n\ -Display information about mounted filesystems, or mount a filesystem\n\ -\n\ - -b, --binary (default) text files are equivalent to binary files\n\ - (newline = \\n)\n\ - -c, --change-cygdrive-prefix change the cygdrive path prefix to <posixpath>\n\ - -f, --force force mount, don't warn about missing mount\n\ - point directories\n\ - -h, --help output usage information and exit\n\ - -m, --mount-commands write mount commands to replace user and\n\ - system mount points and cygdrive prefixes\n\ - -o, --options X[,X...] specify mount options\n\ - -p, --show-cygdrive-prefix show user and/or system cygdrive path prefix\n\ - -s, --system (default) add system-wide mount point\n\ - -t, --text text files get \\r\\n line endings\n\ - -u, --user add user-only mount point\n\ - -v, --version output version information and exit\n\ - -x, --executable treat all files under mount point as executables\n\ - -E, --no-executable treat all files under mount point as \n\ - non-executables\n\ - -X, --cygwin-executable treat all files under mount point as cygwin\n\ - executables\n\ -", progname); - exit (where == stderr ? 1 : 0); -} - -struct opt -{ - const char *name; - unsigned val; - bool clear; -} oopts[] = -{ - {"user", MOUNT_SYSTEM, 1}, - {"system", MOUNT_SYSTEM, 0}, - {"binary", MOUNT_BINARY, 0}, - {"text", MOUNT_BINARY, 1}, - {"exec", MOUNT_EXEC, 0}, - {"notexec", MOUNT_NOTEXEC, 0}, - {"cygexec", MOUNT_CYGWIN_EXEC, 0}, - {"nosuid", 0, 0}, - {"managed", MOUNT_ENC, 0} -}; - -static void -print_version () -{ - const char *v = strchr (version, ':'); - int len; - if (!v) - { - v = "?"; - len = 1; - } - else - { - v += 2; - len = strchr (v, ' ') - v; - } - printf ("\ -%s (cygwin) %.*s\n\ -Filesystem Utility\n\ -Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.\n\ -Compiled on %s\n\ -", progname, len, v, __DATE__); -} - -static char * -concat3 (char *a, const char *b, const char *c) -{ - size_t totlen = strlen (a) + strlen (b) + strlen (c) + 1; - a = (char *) realloc (a, totlen); - return strcat (strcat (a, b), c); -} - -int -main (int argc, char **argv) -{ - int i; - int flags = MOUNT_BINARY; - int default_flag = MOUNT_SYSTEM; - char *options = strdup (""); - enum do_what - { - nada, - saw_change_cygdrive_prefix, - saw_show_cygdrive_prefix, - saw_mount_commands - } do_what = nada; - - progname = strrchr (argv[0], '/'); - if (progname == NULL) - progname = strrchr (argv[0], '\\'); - if (progname == NULL) - progname = argv[0]; - else - progname++; - - if (argc == 1) - { - show_mounts (); - exit (0); - } - - while ((i = getopt_long (argc, argv, opts, longopts, NULL)) != EOF) - switch (i) - { - case 'b': - flags |= MOUNT_BINARY; - break; - case 'c': - if (do_what == nada) - do_what = saw_change_cygdrive_prefix; - else - usage (); - break; - case 'f': - force = TRUE; - break; - case 'h': - usage (stdout); - break; - case 'm': - if (do_what == nada) - do_what = saw_mount_commands; - else - usage (); - break; - case 'o': - if (*options) - options = concat3 (options, ",", optarg); - else - options = strdup (optarg); - break; - case 'p': - if (do_what == nada) - do_what = saw_show_cygdrive_prefix; - else - usage (); - break; - case 's': - flags |= MOUNT_SYSTEM; - break; - case 't': - flags &= ~MOUNT_BINARY; - break; - case 'u': - flags &= ~MOUNT_SYSTEM; - default_flag = 0; - break; - case 'v': - print_version (); - return 0; - break; - case 'x': - flags |= MOUNT_EXEC; - break; - case 'E': - flags |= MOUNT_NOTEXEC; - break; - case 'X': - flags |= MOUNT_CYGWIN_EXEC; - break; - default: - usage (); - } - - while (*options) - { - char *p = strchr (options, ','); - if (p) - *p++ = '\0'; - else - p = strchr (options, '\0'); - - for (opt *o = oopts; o < (oopts + (sizeof (oopts) / sizeof (oopts[0]))); o++) - if (strcmp (options, o->name) == 0) - { - if (o->clear) - flags &= ~o->val; - else - flags |= o->val; - goto gotit; - } - fprintf (stderr, "%s: invalid option - '%s'\n", progname, options); - exit (1); - - gotit: - options = p; - } - - if (flags & MOUNT_NOTEXEC && flags & (MOUNT_EXEC | MOUNT_CYGWIN_EXEC)) - { - fprintf (stderr, "%s: invalid combination of executable options\n", progname); - exit (1); - } - - argc--; - switch (do_what) - { - case saw_change_cygdrive_prefix: - if (optind != argc) - usage (); - change_cygdrive_prefix (argv[optind], flags | default_flag); - break; - case saw_show_cygdrive_prefix: - if (optind <= argc) - usage (); - show_cygdrive_info (); - break; - case saw_mount_commands: - if (optind <= argc) - usage (); - mount_commands (); - break; - default: - if (optind != (argc - 1)) - { - if (optind >= argc) - fprintf (stderr, "%s: not enough arguments\n", progname); - else - fprintf (stderr, "%s: too many arguments\n", progname); - usage (); - } - if (force || !mount_already_exists (argv[optind + 1], flags | default_flag)) - do_mount (argv[optind], argv[optind + 1], flags | default_flag); - else - { - errno = EBUSY; - error (argv[optind + 1]); - } - } - - /* NOTREACHED */ - return 0; -} - -static void -mount_commands (void) -{ - FILE *m = setmntent ("/-not-used-", "r"); - struct mntent *p; - char *c; - const char *format_mnt = "mount%s \"%s\" \"%s\"\n"; - const char *format_cyg = "mount%s --change-cygdrive-prefix \"%s\"\n"; - char opts[MAX_PATH]; - char user[MAX_PATH]; - char system[MAX_PATH]; - char user_flags[MAX_PATH]; - char system_flags[MAX_PATH]; - - // write mount commands for user and system mount points - while ((p = getmntent (m)) != NULL) - // Only list non-cygdrives - if (!strstr (p->mnt_opts, ",noumount")) - { - strcpy(opts, " -f"); - if (p->mnt_type[0] == 'u') - strcat (opts, " -u"); - else if (p->mnt_type[0] == 's') - strcat (opts, " -s"); - if (p->mnt_opts[0] == 'b') - strcat (opts, " -b"); - else if (p->mnt_opts[0] == 't') - strcat (opts, " -t"); - if (strstr (p->mnt_opts, ",exec")) - strcat (opts, " -x"); - if (strstr (p->mnt_opts, ",noexec")) - strcat (opts, " -E"); - if (strstr (p->mnt_opts, ",managed")) - strcat (opts, " -o managed"); - while ((c = strchr (p->mnt_fsname, '\\')) != NULL) - *c = '/'; - printf (format_mnt, opts, p->mnt_fsname, p->mnt_dir); - } - endmntent (m); - - // write mount commands for cygdrive prefixes - cygwin_internal (CW_GET_CYGDRIVE_INFO, user, system, user_flags, - system_flags); - - if (strlen (user) > 0) - { - strcpy (opts, " -u"); - if (user_flags[0] == 'b') - strcat (opts, " -b"); - else if (user_flags[0] == 't') - strcat (opts, " -t"); - printf (format_cyg, opts, user); - } - - if (strlen (system) > 0) - { - strcpy (opts, " -s"); - if (system_flags[0] == 'b') - strcat (opts, " -b"); - else if (system_flags[0] == 't') - strcat (opts, " -t"); - printf (format_cyg, opts, system); - } - - exit(0); -} - -static void -show_mounts (void) -{ - FILE *m = setmntent ("/-not-used-", "r"); - struct mntent *p; - const char *format = "%s on %s type %s (%s)\n"; - - // printf (format, "Device", "Directory", "Type", "Flags"); - while ((p = getmntent (m)) != NULL) - printf (format, p->mnt_fsname, p->mnt_dir, p->mnt_type, p->mnt_opts); - endmntent (m); -} - -/* Return 1 if mountpoint from the same registry area is already in - mount table. Otherwise return 0. */ -static int -mount_already_exists (const char *posix_path, int flags) -{ - int found_matching = 0; - - FILE *m = setmntent ("/-not-used-", "r"); - struct mntent *p; - - while ((p = getmntent (m)) != NULL) - { - /* if the paths match, and they're both the same type of mount. */ - if (strcmp (p->mnt_dir, posix_path) == 0) - { - if (p->mnt_type[0] == 'u') - { - if (!(flags & MOUNT_SYSTEM)) /* both current_user */ - found_matching = 1; - else - fprintf (stderr, - "%s: warning: system mount point of '%s' " - "will always be masked by user mount.\n", - progname, posix_path); - break; - } - else if (p->mnt_type[0] == 's') - { - if (flags & MOUNT_SYSTEM) /* both system */ - found_matching = 1; - else - fprintf (stderr, - "%s: warning: user mount point of '%s' " - "masks system mount.\n", - progname, posix_path); - break; - } - else - { - fprintf (stderr, "%s: warning: couldn't determine mount type.\n", progname); - break; - } - } - } - endmntent (m); - - return found_matching; -} - -/* change_cygdrive_prefix: Change the cygdrive prefix */ -static void -change_cygdrive_prefix (const char *new_prefix, int flags) -{ - flags |= MOUNT_CYGDRIVE; - - if (mount (NULL, new_prefix, flags)) - error (new_prefix); - - exit (0); -} - -/* show_cygdrive_info: Show the user and/or cygdrive info, i.e., prefix and - flags.*/ -static void -show_cygdrive_info () -{ - /* Get the cygdrive info */ - char user[MAX_PATH]; - char system[MAX_PATH]; - char user_flags[MAX_PATH]; - char system_flags[MAX_PATH]; - cygwin_internal (CW_GET_CYGDRIVE_INFO, user, system, user_flags, - system_flags); - - /* Display the user and system cygdrive path prefix, if necessary - (ie, not empty) */ - const char *format = "%-18s %-11s %s\n"; - printf (format, "Prefix", "Type", "Flags"); - if (strlen (user) > 0) - printf (format, user, "user", user_flags); - if (strlen (system) > 0) - printf (format, system, "system", system_flags); - - exit (0); -} diff --git a/winsup/utils/parse_pe.cc b/winsup/utils/parse_pe.cc deleted file mode 100644 index 4dc7d4f0a..000000000 --- a/winsup/utils/parse_pe.cc +++ /dev/null @@ -1,93 +0,0 @@ -/* parse_pe.cc - - Copyright 1999, 2000, 2001, 2002, 2003 Red Hat, Inc. - - Written by Egor Duda <deo@logos-m.ru> - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#include <bfd.h> -#include <stdio.h> -#include <stdlib.h> - -#include "dumper.h" - -int -exclusion::add (LPBYTE mem_base, DWORD mem_size) -{ - while (last >= size) - size += step; - region = (process_mem_region *) realloc (region, size * sizeof (process_mem_region)); - if (region == NULL) - return 0; - region[last].base = mem_base; - region[last].size = mem_size; - last++; - return 1; -}; - -int -cmp_regions (const void *r1, const void *r2) -{ - if (((process_mem_region *) r1)->base < ((process_mem_region *) r2)->base) - return -1; - if (((process_mem_region *) r1)->base > ((process_mem_region *) r2)->base) - return 1; - return 0; -} - -int -exclusion::sort_and_check () -{ - qsort (region, last, sizeof (process_mem_region), &cmp_regions); - for (process_mem_region * p = region; p < region + last - 1; p++) - { - process_mem_region *q = p + 1; - if (q == p + 1) - continue; - if (p->base + size > q->base) - { - fprintf (stderr, "region error @ (%8p + %d) > %8p\n", (unsigned) p->base, size, q->base); - return 0; - } - } - return 1; -} - -static void -select_data_section (bfd * abfd, asection * sect, PTR obj) -{ - exclusion *excl_list = (exclusion *) obj; - - if ((sect->flags & (SEC_CODE | SEC_DEBUGGING)) && - sect->vma && sect->_raw_size) - { - excl_list->add ((LPBYTE) sect->vma, (DWORD) sect->_raw_size); - deb_printf ("excluding section: %20s %08lx\n", sect->name, sect->_raw_size); - } -} - -int -parse_pe (const char *file_name, exclusion * excl_list) -{ - if (file_name == NULL || excl_list == NULL) - return 0; - - bfd *abfd = bfd_openr (file_name, "pei-i386"); - if (abfd == NULL) - { - bfd_perror ("failed to open file"); - return 0; - } - - bfd_check_format (abfd, bfd_object); - bfd_map_over_sections (abfd, &select_data_section, (PTR) excl_list); - excl_list->sort_and_check (); - - bfd_close (abfd); - return 1; -} diff --git a/winsup/utils/passwd.c b/winsup/utils/passwd.c deleted file mode 100644 index d0f3289cb..000000000 --- a/winsup/utils/passwd.c +++ /dev/null @@ -1,530 +0,0 @@ -/* passwd.c: Changing passwords and managing account information - - Copyright 1999, 2000, 2001, 2002, 2003 Red Hat, Inc. - - Written by Corinna Vinschen <corinna.vinschen@cityweb.de> - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include <windows.h> -#include <wininet.h> -#include <lmaccess.h> -#include <lmerr.h> -#include <lmcons.h> -#include <lmapibuf.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <getopt.h> -#include <pwd.h> -#include <sys/cygwin.h> -#include <sys/types.h> -#include <time.h> - -#define USER_PRIV_ADMIN 2 - -static const char version[] = "$Revision$"; -static char *prog_name; - -static struct option longopts[] = -{ - {"cannot-change", no_argument, NULL, 'c'}, - {"can-change", no_argument, NULL, 'C'}, - {"never-expires", no_argument, NULL, 'e'}, - {"expires", no_argument, NULL, 'E'}, - {"help", no_argument, NULL, 'h' }, - {"inactive", required_argument, NULL, 'i'}, - {"lock", no_argument, NULL, 'l'}, - {"minage", required_argument, NULL, 'n'}, - {"pwd-not-required", no_argument, NULL, 'p'}, - {"pwd-required", no_argument, NULL, 'P'}, - {"unlock", no_argument, NULL, 'u'}, - {"version", no_argument, NULL, 'v'}, - {"maxage", required_argument, NULL, 'x'}, - {"length", required_argument, NULL, 'L'}, - {"status", no_argument, NULL, 'S'}, - {NULL, 0, NULL, 0} -}; - -static char opts[] = "cCeEhi:ln:pPuvx:L:S"; - -int -eprint (int with_name, const char *fmt, ...) -{ - va_list ap; - - if (with_name) - fprintf(stderr, "%s: ", prog_name); - va_start (ap, fmt); - vfprintf (stderr, fmt, ap); - va_end (ap); - fprintf(stderr, "\n"); - return 1; -} - -int -EvalRet (int ret, const char *user) -{ - switch (ret) - { - case NERR_Success: - return 0; - - case ERROR_ACCESS_DENIED: - if (! user) - eprint (0, "You may not change password expiry information."); - else - eprint (0, "You may not change the password for %s.", user); - break; - - eprint (0, "Bad password: Invalid."); - break; - - case NERR_PasswordTooShort: - eprint (0, "Bad password: Too short."); - break; - - case NERR_UserNotFound: - eprint (1, "unknown user %s", user); - break; - - case ERROR_INVALID_PASSWORD: - case NERR_BadPassword: - eprint (0, "Incorrect password for %s.", user); - eprint (0, "The password for %s is unchanged.", user); - break; - - default: - eprint (1, "unrecoverable error %d", ret); - break; - } - return 1; -} - -PUSER_INFO_3 -GetPW (char *user, int print_win_name) -{ - char usr_buf[UNLEN + 1]; - WCHAR name[2 * (UNLEN + 1)]; - DWORD ret; - PUSER_INFO_3 ui; - struct passwd *pw; - char *domain = (char *) alloca (INTERNET_MAX_HOST_NAME_LENGTH + 1); - - /* Try getting a Win32 username in case the user edited /etc/passwd */ - if ((pw = getpwnam (user))) - { - cygwin_internal (CW_EXTRACT_DOMAIN_AND_USER, pw, domain, usr_buf); - if (strcasecmp (pw->pw_name, usr_buf)) - { - /* Hack to avoid problem with LookupAccountSid after impersonation */ - if (strcasecmp (usr_buf, "SYSTEM")) - { - user = usr_buf; - if (print_win_name) - printf ("Windows username : %s\n", user); - } - } - } - MultiByteToWideChar (CP_ACP, 0, user, -1, name, 2 * (UNLEN + 1)); - ret = NetUserGetInfo (NULL, name, 3, (void *) &ui); - return EvalRet (ret, user) ? NULL : ui; -} - -int -ChangePW (const char *user, const char *oldpwd, const char *pwd, int justcheck) -{ - WCHAR name[2 * (UNLEN + 1)], oldpass[512], pass[512]; - DWORD ret; - - MultiByteToWideChar (CP_ACP, 0, user, -1, name, 2 * (UNLEN + 1)); - MultiByteToWideChar (CP_ACP, 0, pwd, -1, pass, 512); - if (! oldpwd) - { - USER_INFO_1003 ui; - - ui.usri1003_password = pass; - ret = NetUserSetInfo (NULL, name, 1003, (LPBYTE) &ui, NULL); - } - else - { - MultiByteToWideChar (CP_ACP, 0, oldpwd, -1, oldpass, 512); - ret = NetUserChangePassword (NULL, name, oldpass, pass); - } - if (justcheck && ret != ERROR_INVALID_PASSWORD) - return 0; - if (! EvalRet (ret, user) && ! justcheck) - { - eprint (0, "Password changed."); - } - return ret; -} - -void -PrintPW (PUSER_INFO_3 ui) -{ - time_t t = time (NULL) - ui->usri3_password_age; - int ret; - PUSER_MODALS_INFO_0 mi; - - printf ("Account disabled : %s", - (ui->usri3_flags & UF_ACCOUNTDISABLE) ? "yes\n" : "no\n"); - printf ("Password not required : %s", - (ui->usri3_flags & UF_PASSWD_NOTREQD) ? "yes\n" : "no\n"); - printf ("User can't change password : %s", - (ui->usri3_flags & UF_PASSWD_CANT_CHANGE) ? "yes\n" : "no\n"); - printf ("Password never expires : %s", - (ui->usri3_flags & UF_DONT_EXPIRE_PASSWD) ? "yes\n" : "no\n"); - printf ("Password expired : %s", - (ui->usri3_password_expired) ? "yes\n" : "no\n"); - printf ("Latest password change : %s", ctime(&t)); - ret = NetUserModalsGet (NULL, 0, (void *) &mi); - if (! ret) - { - if (mi->usrmod0_max_passwd_age == TIMEQ_FOREVER) - mi->usrmod0_max_passwd_age = 0; - if (mi->usrmod0_min_passwd_age == TIMEQ_FOREVER) - mi->usrmod0_min_passwd_age = 0; - if (mi->usrmod0_force_logoff == TIMEQ_FOREVER) - mi->usrmod0_force_logoff = 0; - if (ui->usri3_priv == USER_PRIV_ADMIN) - mi->usrmod0_min_passwd_len = 0; - printf ("\nSystem password settings:\n"); - printf ("Max. password age %ld days\n", - mi->usrmod0_max_passwd_age / ONE_DAY); - printf ("Min. password age %ld days\n", - mi->usrmod0_min_passwd_age / ONE_DAY); - printf ("Force logout after %ld days\n", - mi->usrmod0_force_logoff / ONE_DAY); - printf ("Min. password length: %ld\n", - mi->usrmod0_min_passwd_len); - } -} - -int -SetModals (int xarg, int narg, int iarg, int Larg) -{ - int ret; - PUSER_MODALS_INFO_0 mi; - - ret = NetUserModalsGet (NULL, 0, (void *) &mi); - if (! ret) - { - if (xarg == 0) - mi->usrmod0_max_passwd_age = TIMEQ_FOREVER; - else if (xarg > 0) - mi->usrmod0_max_passwd_age = xarg * ONE_DAY; - - if (narg == 0) - { - mi->usrmod0_min_passwd_age = TIMEQ_FOREVER; - mi->usrmod0_password_hist_len = 0; - } - else if (narg > 0) - mi->usrmod0_min_passwd_age = narg * ONE_DAY; - - if (iarg == 0) - mi->usrmod0_force_logoff = TIMEQ_FOREVER; - else if (iarg > 0) - mi->usrmod0_force_logoff = iarg * ONE_DAY; - - if (Larg >= 0) - mi->usrmod0_min_passwd_len = Larg; - - ret = NetUserModalsSet (NULL, 0, (LPBYTE) mi, NULL); - NetApiBufferFree (mi); - } - return EvalRet (ret, NULL); -} - -static void usage (FILE * stream, int status) __attribute__ ((noreturn)); -static void -usage (FILE * stream, int status) -{ - fprintf (stream, "" - "Usage: %s [OPTION] [USER]\n" - "Change USER's password or password attributes.\n" - "\n" - "User operations:\n" - " -l, --lock lock USER's account.\n" - " -u, --unlock unlock USER's account.\n" - " -c, --cannot-change USER can't change password.\n" - " -C, --can-change USER can change password.\n" - " -e, --never-expires USER's password never expires.\n" - " -E, --expires USER's password expires according to system's\n" - " password aging rule.\n" - " -p, --pwd-not-required no password required for USER.\n" - " -P, --pwd-required password is required for USER.\n" - "\n" - "System operations:\n" - " -i, --inactive NUM set NUM of days before inactive accounts are disabled\n" - " (inactive accounts are those with expired passwords).\n" - " -n, --minage DAYS set system minimum password age to DAYS days.\n" - " -x, --maxage DAYS set system maximum password age to DAYS days.\n" - " -L, --length LEN set system minimum password length to LEN.\n" - "\n" - "Other options:\n" - " -S, --status display password status for USER (locked, expired,\n" - " etc.) plus global system password settings.\n" - " -h, --help output usage information and exit.\n" - " -v, --version output version information and exit.\n" - "\n" - "If no option is given, change USER's password. If no user name is given,\n" - "operate on current user. System operations must not be mixed with user\n" - "operations. Don't specify a USER when triggering a system operation. \n" - "\n" - "Report bugs to <cygwin@cygwin.com>\n", prog_name); - exit (status); -} - -static void -print_version () -{ - const char *v = strchr (version, ':'); - int len; - if (!v) - { - v = "?"; - len = 1; - } - else - { - v += 2; - len = strchr (v, ' ') - v; - } - printf ("\ -%s (cygwin) %.*s\n\ -Password Utility\n\ -Copyright 1999, 2000, 2001, 2002, 2003 Red Hat, Inc.\n\ -Compiled on %s\n\ -", prog_name, len, v, __DATE__); -} - -int -main (int argc, char **argv) -{ - char *c; - char user[64], oldpwd[64], newpwd[64]; - int ret = 0; - int cnt = 0; - int opt; - int Larg = -1; - int xarg = -1; - int narg = -1; - int iarg = -1; - int lopt = 0; - int uopt = 0; - int copt = 0; - int Copt = 0; - int eopt = 0; - int Eopt = 0; - int popt = 0; - int Popt = 0; - int Sopt = 0; - PUSER_INFO_3 ui, li; - - prog_name = strrchr (argv[0], '/'); - if (prog_name == NULL) - prog_name = strrchr (argv[0], '\\'); - if (prog_name == NULL) - prog_name = argv[0]; - else - prog_name++; - c = strrchr (prog_name, '.'); - if (c) - *c = '\0'; - - while ((opt = getopt_long (argc, argv, opts, longopts, NULL)) != EOF) - switch (opt) - { - case 'h': - usage (stdout, 0); - break; - - case 'i': - if (lopt || uopt || copt || Copt || eopt || Eopt || popt || Popt || Sopt) - usage (stderr, 1); - if ((iarg = atoi (optarg)) < 0 || iarg > 999) - return eprint (1, "Force logout time must be between 0 and 999."); - break; - - case 'l': - if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || uopt || Sopt) - usage (stderr, 1); - lopt = 1; - break; - - case 'n': - if (lopt || uopt || copt || Copt || eopt || Eopt || popt || Popt || Sopt) - usage (stderr, 1); - if ((narg = atoi (optarg)) < 0 || narg > 999) - return eprint (1, "Minimum password age must be between 0 and 999."); - if (xarg >= 0 && narg > xarg) - return eprint (1, "Minimum password age must be less than " - "maximum password age."); - break; - - case 'u': - if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || lopt || Sopt) - usage (stderr, 1); - uopt = 1; - break; - - case 'c': - if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || Sopt) - usage (stderr, 1); - copt = 1; - break; - - case 'C': - if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || Sopt) - usage (stderr, 1); - Copt = 1; - break; - - case 'e': - if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || Sopt) - usage (stderr, 1); - eopt = 1; - break; - - case 'E': - if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || Sopt) - usage (stderr, 1); - Eopt = 1; - break; - - case 'p': - if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || Sopt) - usage (stderr, 1); - popt = 1; - break; - - case 'P': - if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || Sopt) - usage (stderr, 1); - Popt = 1; - break; - - case 'v': - print_version (); - exit (0); - break; - - case 'x': - if (lopt || uopt || copt || Copt || eopt || Eopt || popt || Popt || Sopt) - usage (stderr, 1); - if ((xarg = atoi (optarg)) < 0 || xarg > 999) - return eprint (1, "Maximum password age must be between 0 and 999."); - if (narg >= 0 && xarg < narg) - return eprint (1, "Maximum password age must be greater than " - "minimum password age."); - break; - - case 'L': - if (lopt || uopt || copt || Copt || eopt || Eopt || popt || Popt || Sopt) - usage (stderr, 1); - if ((Larg = atoi (optarg)) < 0 || Larg > LM20_PWLEN) - return eprint (1, "Minimum password length must be between " - "0 and %d.", LM20_PWLEN); - break; - - case 'S': - if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || lopt || uopt - || copt || Copt || eopt || Eopt || popt || Popt) - usage (stderr, 1); - Sopt = 1; - break; - - default: - usage (stderr, 1); - } - if (Larg >= 0 || xarg >= 0 || narg >= 0 || iarg >= 0) - { - if (optind < argc) - usage (stderr, 1); - return SetModals (xarg, narg, iarg, Larg); - } - - strcpy (user, optind >= argc ? getlogin () : argv[optind]); - - li = GetPW (getlogin (), 0); - if (! li) - return 1; - - ui = GetPW (user, 1); - if (! ui) - return 1; - - if (lopt || uopt || copt || Copt || eopt || Eopt || popt || Popt || Sopt) - { - USER_INFO_1008 uif; - - if (li->usri3_priv != USER_PRIV_ADMIN) - return eprint (0, "You have no maintenance privileges."); - uif.usri1008_flags = ui->usri3_flags; - if (lopt) - { - if (ui->usri3_priv == USER_PRIV_ADMIN) - return eprint (0, "Locking an admin account is disallowed."); - uif.usri1008_flags |= UF_ACCOUNTDISABLE; - } - if (uopt) - uif.usri1008_flags &= ~UF_ACCOUNTDISABLE; - if (copt) - uif.usri1008_flags |= UF_PASSWD_CANT_CHANGE; - if (Copt) - uif.usri1008_flags &= ~UF_PASSWD_CANT_CHANGE; - if (eopt) - uif.usri1008_flags |= UF_DONT_EXPIRE_PASSWD; - if (Eopt) - uif.usri1008_flags &= ~UF_DONT_EXPIRE_PASSWD; - if (popt) - uif.usri1008_flags |= UF_PASSWD_NOTREQD; - if (Popt) - uif.usri1008_flags &= ~UF_PASSWD_NOTREQD; - - if (lopt || uopt || copt || Copt || eopt || Eopt || popt || Popt) - { - ret = NetUserSetInfo (NULL, ui->usri3_name, 1008, (LPBYTE) &uif, - NULL); - return EvalRet (ret, NULL); - } - // Sopt - PrintPW (ui); - return 0; - } - - if (li->usri3_priv != USER_PRIV_ADMIN && strcmp (getlogin (), user)) - return eprint (0, "You may not change the password for %s.", user); - - eprint (0, "Enter the new password (minimum of 5, maximum of 8 characters)."); - eprint (0, "Please use a combination of upper and lower case letters and numbers."); - - oldpwd[0] = '\0'; - if (li->usri3_priv != USER_PRIV_ADMIN) - { - strcpy (oldpwd, getpass ("Old password: ")); - if (ChangePW (user, oldpwd, oldpwd, 1)) - return 1; - } - - do - { - strcpy (newpwd, getpass ("New password: ")); - if (strcmp (newpwd, getpass ("Re-enter new password: "))) - eprint (0, "Password is not identical."); - else if (! ChangePW (user, *oldpwd ? oldpwd : NULL, newpwd, 0)) - ret = 1; - if (! ret && cnt < 2) - eprint (0, "Try again."); - } - while (! ret && ++cnt < 3); - return ! ret; -} diff --git a/winsup/utils/path.cc b/winsup/utils/path.cc deleted file mode 100644 index 2c475fde3..000000000 --- a/winsup/utils/path.cc +++ /dev/null @@ -1,352 +0,0 @@ -/* path.cc - - Copyright 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* The purpose of this file is to hide all the details about accessing - Cygwin's mount table. If the format or location of the mount table - changes, this is the file to change to match it. */ - -#define str(a) #a -#define scat(a,b) str(a##b) -#include <windows.h> -#include <stdio.h> -#include <stdlib.h> -#include "cygwin/include/cygwin/version.h" -#include "cygwin/include/sys/mount.h" -#include "cygwin/include/mntent.h" - -/* Used when treating / and \ as equivalent. */ -#define SLASH_P(ch) \ - ({ \ - char __c = (ch); \ - ((__c) == '/' || (__c) == '\\'); \ - }) - - -static struct mnt - { - const char *native; - char *posix; - unsigned flags; - int issys; - } mount_table[255]; - -struct mnt *root_here = NULL; - -static char * -find2 (HKEY rkey, unsigned *flags, char *what) -{ - char *retval = 0; - DWORD retvallen = 0; - DWORD type; - HKEY key; - - if (RegOpenKeyEx (rkey, what, 0, KEY_READ, &key) != ERROR_SUCCESS) - return 0; - - if (RegQueryValueEx (key, "native", 0, &type, 0, &retvallen) - == ERROR_SUCCESS) - { - retval = (char *) malloc (MAX_PATH + 1); - if (RegQueryValueEx (key, "native", 0, &type, (BYTE *) retval, &retvallen) - != ERROR_SUCCESS) - { - free (retval); - retval = 0; - } - } - - retvallen = sizeof (flags); - RegQueryValueEx (key, "flags", 0, &type, (BYTE *)flags, &retvallen); - - RegCloseKey (key); - - return retval; -} - -static LONG -get_cygdrive0 (HKEY key, const char *what, void *val, DWORD len) -{ - LONG status = RegQueryValueEx (key, what, 0, 0, (BYTE *)val, &len); - return status; -} - -static mnt * -get_cygdrive (HKEY key, mnt *m, int issystem) -{ - if (get_cygdrive0 (key, CYGWIN_INFO_CYGDRIVE_FLAGS, &m->flags, - sizeof (m->flags)) != ERROR_SUCCESS) { - free (m->posix); - return m; - } - get_cygdrive0 (key, CYGWIN_INFO_CYGDRIVE_PREFIX, m->posix, MAX_PATH); - m->native = strdup ("."); - m->issys = issystem; - return m + 1; -} - -static void -read_mounts () -{ - DWORD posix_path_size; - int res; - struct mnt *m = mount_table; - DWORD disposition; - char buf[10000]; - - root_here = NULL; - for (mnt *m1 = mount_table; m1->posix; m1++) - { - free (m1->posix); - if (m1->native) - free ((char *) m1->native); - m1->posix = NULL; - } - - /* Loop through subkeys */ - /* FIXME: we would like to not check MAX_MOUNTS but the heap in the - shared area is currently statically allocated so we can't have an - arbitrarily large number of mounts. */ - for (int issystem = 0; issystem <= 1; issystem++) - { - sprintf (buf, "Software\\%s\\%s\\%s", - CYGWIN_INFO_CYGNUS_REGISTRY_NAME, - CYGWIN_INFO_CYGWIN_REGISTRY_NAME, - CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME); - - HKEY key = issystem ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; - if (RegCreateKeyEx (key, buf, 0, (LPTSTR) "Cygwin", 0, KEY_READ, - 0, &key, &disposition) != ERROR_SUCCESS) - break; - for (int i = 0; ;i++, m++) - { - m->posix = (char *) malloc (MAX_PATH + 1); - posix_path_size = MAX_PATH; - /* FIXME: if maximum posix_path_size is 256, we're going to - run into problems if we ever try to store a mount point that's - over 256 but is under MAX_PATH. */ - res = RegEnumKeyEx (key, i, m->posix, &posix_path_size, NULL, - NULL, NULL, NULL); - - if (res == ERROR_NO_MORE_ITEMS) - { - m = get_cygdrive (key, m, issystem); - m->posix = NULL; - break; - } - - if (!*m->posix) - goto no_go; - else if (res != ERROR_SUCCESS) - break; - else - { - m->native = find2 (key, &m->flags, m->posix); - m->issys = issystem; - if (!m->native) - goto no_go; - } - continue; - no_go: - free (m->posix); - m->posix = NULL; - m--; - } - RegCloseKey (key); - } -} - -/* Return non-zero if PATH1 is a prefix of PATH2. - Both are assumed to be of the same path style and / vs \ usage. - Neither may be "". - LEN1 = strlen (PATH1). It's passed because often it's already known. - - Examples: - /foo/ is a prefix of /foo <-- may seem odd, but desired - /foo is a prefix of /foo/ - / is a prefix of /foo/bar - / is not a prefix of foo/bar - foo/ is a prefix foo/bar - /foo is not a prefix of /foobar -*/ - -static int -path_prefix_p (const char *path1, const char *path2, int len1) -{ - /* Handle case where PATH1 has trailing '/' and when it doesn't. */ - if (len1 > 0 && SLASH_P (path1[len1 - 1])) - len1--; - - if (len1 == 0) - return SLASH_P (path2[0]) && !SLASH_P (path2[1]); - - if (strncasecmp (path1, path2, len1) != 0) - return 0; - - return SLASH_P (path2[len1]) || path2[len1] == 0 || path1[len1 - 1] == ':'; -} - -static char * -vconcat (const char *s, va_list v) -{ - int len; - char *rv, *arg; - va_list save_v = v; - int unc; - - if (!s) - return 0; - - len = strlen (s); - - unc = SLASH_P (*s) && SLASH_P (s[1]); - - while (1) - { - arg = va_arg (v, char *); - if (arg == 0) - break; - len += strlen (arg); - } - va_end (v); - - rv = (char *) malloc (len + 1); - strcpy (rv, s); - v = save_v; - while (1) - { - arg = va_arg (v, char *); - if (arg == 0) - break; - strcat (rv, arg); - } - va_end (v); - - char *d, *p; - for (p = rv; *p; p++) - if (*p == '\\') - *p = '/'; - - /* concat is only used for urls and files, so we can safely - canonicalize the results */ - for (p = d = rv; *p; p++) - { - *d++ = *p; - /* special case for URLs */ - if (*p == ':' && p[1] == '/' && p[2] == '/' && p > rv + 1) - { - *d++ = *++p; - *d++ = *++p; - } - else if (*p == '/' || *p == '\\') - { - if (p == rv && unc) - *d++ = *p++; - while (p[1] == '/') - p++; - } - } - *d = 0; - - return rv; -} - -static char * -concat (const char *s, ...) -{ - va_list v; - - va_start (v, s); - - return vconcat (s, v); -} - -char * -cygpath (const char *s, ...) -{ - va_list v; - int max_len = -1; - struct mnt *m, *match = NULL; - - if (!mount_table[0].posix) - read_mounts (); - va_start (v, s); - char *path = vconcat (s, v); - if (strncmp (path, "./", 2) == 0) - memmove (path, path + 2, strlen (path + 2) + 1); - if (strncmp (path, "/./", 3) == 0) - memmove (path + 1, path + 3, strlen (path + 3) + 1); - - for (m = mount_table; m->posix ; m++) - { - if (m->flags & MOUNT_CYGDRIVE) - continue; - - int n = strlen (m->posix); - if (n < max_len || !path_prefix_p (m->posix, path, n)) - continue; - max_len = n; - match = m; - } - - char *native; - if (match == NULL) - native = strdup (path); - else if (max_len == (int) strlen (path)) - native = strdup (match->native); - else - native = concat (match->native, "/", path + max_len, NULL); - free (path); - - return native; -} - -static mnt *m = NULL; - -extern "C" FILE * -setmntent (const char *, const char *) -{ - m = mount_table; - if (!m->posix) - read_mounts (); - return NULL; -} - -extern "C" struct mntent * -getmntent (FILE *) -{ - static mntent mnt; - if (!m->posix) - return NULL; - - mnt.mnt_fsname = (char *) m->native; - mnt.mnt_dir = (char *) m->posix; - if (!mnt.mnt_type) - mnt.mnt_type = (char *) malloc (1024); - if (!mnt.mnt_opts) - mnt.mnt_opts = (char *) malloc (1024); - if (!m->issys) - strcpy (mnt.mnt_type, (char *) "user"); - else - strcpy (mnt.mnt_type, (char *) "system"); - if (!(m->flags & MOUNT_BINARY)) - strcpy (mnt.mnt_opts, (char *) "textmode"); - else - strcpy (mnt.mnt_opts, (char *) "binmode"); - if (m->flags & MOUNT_CYGWIN_EXEC) - strcat (mnt.mnt_opts, (char *) ",cygexec"); - else if (m->flags & MOUNT_EXEC) - strcat (mnt.mnt_opts, (char *) ",exec"); - if ((m->flags & MOUNT_CYGDRIVE)) /* cygdrive */ - strcat (mnt.mnt_opts, (char *) ",cygdrive"); - mnt.mnt_freq = 1; - mnt.mnt_passno = 1; - m++; - return &mnt; -} diff --git a/winsup/utils/path.h b/winsup/utils/path.h deleted file mode 100644 index bfc3c699e..000000000 --- a/winsup/utils/path.h +++ /dev/null @@ -1,11 +0,0 @@ -/* path.h - - Copyright 2001, 2002, 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -char *cygpath (const char *s, ...); diff --git a/winsup/utils/ps.cc b/winsup/utils/ps.cc deleted file mode 100644 index b6307fd33..000000000 --- a/winsup/utils/ps.cc +++ /dev/null @@ -1,408 +0,0 @@ -/* ps.cc - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include <stdio.h> -#include <windows.h> -#include <time.h> -#include <getopt.h> -#include <unistd.h> -#include <stdlib.h> -#include <pwd.h> -#include <sys/cygwin.h> -#include <tlhelp32.h> -#include <psapi.h> - -static const char version[] = "$Revision$"; -static char *prog_name; - -static struct option longopts[] = -{ - {"all", no_argument, NULL, 'a' }, - {"everyone", no_argument, NULL, 'e' }, - {"full", no_argument, NULL, 'f' }, - {"help", no_argument, NULL, 'h' }, - {"long", no_argument, NULL, 'l' }, - {"summary", no_argument, NULL, 's' }, - {"user", required_argument, NULL, 'u'}, - {"version", no_argument, NULL, 'v'}, - {"windows", no_argument, NULL, 'W'}, - {NULL, 0, NULL, 0} -}; - -static char opts[] = "aefhlsu:vW"; - -typedef BOOL (WINAPI *ENUMPROCESSMODULES)( - HANDLE hProcess, // handle to the process - HMODULE * lphModule, // array to receive the module handles - DWORD cb, // size of the array - LPDWORD lpcbNeeded // receives the number of bytes returned -); - -typedef DWORD (WINAPI *GETMODULEFILENAME)( - HANDLE hProcess, - HMODULE hModule, - LPTSTR lpstrFileName, - DWORD nSize -); - -typedef HANDLE (WINAPI *CREATESNAPSHOT)( - DWORD dwFlags, - DWORD th32ProcessID -); - -// Win95 functions -typedef BOOL (WINAPI *PROCESSWALK)( - HANDLE hSnapshot, - LPPROCESSENTRY32 lppe -); - -ENUMPROCESSMODULES myEnumProcessModules; -GETMODULEFILENAME myGetModuleFileNameEx; -CREATESNAPSHOT myCreateToolhelp32Snapshot; -PROCESSWALK myProcess32First; -PROCESSWALK myProcess32Next; - -static BOOL WINAPI dummyprocessmodules ( - HANDLE hProcess, // handle to the process - HMODULE * lphModule, // array to receive the module handles - DWORD cb, // size of the array - LPDWORD lpcbNeeded // receives the number of bytes returned -) -{ - lphModule[0] = (HMODULE) *lpcbNeeded; - *lpcbNeeded = 1; - return 1; -} - -static DWORD WINAPI GetModuleFileNameEx95 ( - HANDLE hProcess, - HMODULE hModule, - LPTSTR lpstrFileName, - DWORD n -) -{ - HANDLE h; - DWORD pid = (DWORD) hModule; - - h = myCreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0); - if (!h) - return 0; - - PROCESSENTRY32 proc; - proc.dwSize = sizeof (proc); - if (myProcess32First(h, &proc)) - do - if (proc.th32ProcessID == pid) - { - CloseHandle (h); - strcpy (lpstrFileName, proc.szExeFile); - return 1; - } - while (myProcess32Next (h, &proc)); - CloseHandle (h); - return 0; -} - -int -init_win () -{ - OSVERSIONINFO os_version_info; - - memset (&os_version_info, 0, sizeof os_version_info); - os_version_info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); - GetVersionEx (&os_version_info); - - HMODULE h; - if (os_version_info.dwPlatformId == VER_PLATFORM_WIN32_NT) - { - h = LoadLibrary ("psapi.dll"); - if (!h) - return 0; - myEnumProcessModules = (ENUMPROCESSMODULES) GetProcAddress (h, "EnumProcessModules"); - myGetModuleFileNameEx = (GETMODULEFILENAME) GetProcAddress (h, "GetModuleFileNameExA"); - if (!myEnumProcessModules || !myGetModuleFileNameEx) - return 0; - return 1; - } - - h = GetModuleHandle("KERNEL32.DLL"); - myCreateToolhelp32Snapshot = (CREATESNAPSHOT)GetProcAddress (h, "CreateToolhelp32Snapshot"); - myProcess32First = (PROCESSWALK)GetProcAddress (h, "Process32First"); - myProcess32Next = (PROCESSWALK)GetProcAddress (h, "Process32Next"); - if (!myCreateToolhelp32Snapshot || !myProcess32First || !myProcess32Next) - return 0; - - myEnumProcessModules = dummyprocessmodules; - myGetModuleFileNameEx = GetModuleFileNameEx95; - return 1; -} - -static char * -start_time (external_pinfo *child) -{ - time_t st = child->start_time; - time_t t = time (NULL); - static char stime[40] = {'\0'}; - char now[40]; - - strncpy (stime, ctime (&st) + 4, 15); - strcpy (now, ctime (&t) + 4); - - if ((t - st) < (24 * 3600)) - return (stime + 7); - - stime[6] = '\0'; - - return stime; -} - -#define FACTOR (0x19db1ded53ea710LL) -#define NSPERSEC 10000000LL - -/* Convert a Win32 time to "UNIX" format. */ -long __stdcall -to_time_t (FILETIME *ptr) -{ - /* A file time is the number of 100ns since jan 1 1601 - stuffed into two long words. - A time_t is the number of seconds since jan 1 1970. */ - - long rem; - long long x = ((long long) ptr->dwHighDateTime << 32) + ((unsigned)ptr->dwLowDateTime); - x -= FACTOR; /* number of 100ns between 1601 and 1970 */ - rem = x % ((long long)NSPERSEC); - rem += (NSPERSEC / 2); - x /= (long long) NSPERSEC; /* number of 100ns in a second */ - x += (long long) (rem / NSPERSEC); - return x; -} - -static const char * -ttynam (int ntty) -{ - static char buf[5]; - if (ntty < 0) - return " ?"; - if (ntty == TTY_CONSOLE) - return " con"; - sprintf (buf, "%4d", ntty); - return buf; -} - -static void -usage (FILE * stream, int status) -{ - fprintf (stream, "\ -Usage: %s [-aefls] [-u UID]\n\ -Report process status\n\ -\n\ - -a, --all show processes of all users\n\ - -e, --everyone show processes of all users\n\ - -f, --full show process uids, ppids\n\ - -h, --help output usage information and exit\n\ - -l, --long show process uids, ppids, pgids, winpids\n\ - -s, --summary show process summary\n\ - -u, --user list processes owned by UID\n\ - -v, --version output version information and exit\n\ - -W, --windows show windows as well as cygwin processes\n\ -With no options, %s outputs the long format by default\n", - prog_name, prog_name); - exit (status); -} - -static void -print_version () -{ - const char *v = strchr (version, ':'); - int len; - if (!v) - { - v = "?"; - len = 1; - } - else - { - v += 2; - len = strchr (v, ' ') - v; - } - printf ("\ -%s (cygwin) %.*s\n\ -Process Statistics\n\ -Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.\n\ -Compiled on %s\n\ -", prog_name, len, v, __DATE__); -} - -int -main (int argc, char *argv[]) -{ - external_pinfo *p; - int aflag, lflag, fflag, sflag, uid; - cygwin_getinfo_types query = CW_GETPINFO; - const char *dtitle = " PID TTY STIME COMMAND\n"; - const char *dfmt = "%7d%4s%10s %s\n"; - const char *ftitle = " UID PID PPID TTY STIME COMMAND\n"; - const char *ffmt = "%8.8s%8d%8d%4s%10s %s\n"; - const char *ltitle = " PID PPID PGID WINPID TTY UID STIME COMMAND\n"; - const char *lfmt = "%c %7d %7d %7d %10u %4s %4u %8s %s\n"; - char ch; - - aflag = lflag = fflag = sflag = 0; - uid = getuid (); - lflag = 1; - - prog_name = strrchr (argv[0], '/'); - if (prog_name == NULL) - prog_name = strrchr (argv[0], '\\'); - if (prog_name == NULL) - prog_name = argv[0]; - else - prog_name++; - - while ((ch = getopt_long (argc, argv, opts, longopts, NULL)) != EOF) - switch (ch) - { - case 'a': - case 'e': - aflag = 1; - break; - case 'f': - fflag = 1; - break; - case 'h': - usage (stdout, 0); - case 'l': - lflag = 1; - break; - case 's': - sflag = 1; - break; - case 'u': - uid = atoi (optarg); - if (uid == 0) - { - struct passwd *pw; - - if ((pw = getpwnam (optarg))) - uid = pw->pw_uid; - else - { - fprintf (stderr, "%s: user %s unknown\n", prog_name, optarg); - exit (1); - } - } - break; - case 'v': - print_version (); - exit (0); - break; - case 'W': - query = CW_GETPINFO_FULL; - aflag = 1; - break; - - default: - usage (stderr, 1); - } - - if (sflag) - printf (dtitle); - else if (fflag) - printf (ftitle); - else if (lflag) - printf (ltitle); - - (void) cygwin_internal (CW_LOCK_PINFO, 1000); - - if (query == CW_GETPINFO_FULL && !init_win ()) - query = CW_GETPINFO; - - for (int pid = 0; - (p = (external_pinfo *) cygwin_internal (query, pid | CW_NEXTPID)); - pid = p->pid) - { - if (!aflag) - if (p->version >= EXTERNAL_PINFO_VERSION_32_BIT) - { - if (p->uid32 != (__uid32_t) uid) - continue; - } - else if (p->uid != uid) - continue; - char status = ' '; - if (p->process_state & PID_STOPPED) - status = 'S'; - else if (p->process_state & PID_TTYIN) - status = 'I'; - else if (p->process_state & PID_TTYOU) - status = 'O'; - - char pname[MAX_PATH]; - if (p->process_state & (PID_ZOMBIE | PID_EXITED)) - strcpy (pname, "<defunct>"); - else if (p->ppid) - { - char *s; - pname[0] = '\0'; - cygwin_conv_to_posix_path (p->progname, pname); - s = strchr (pname, '\0') - 4; - if (s > pname && strcasecmp (s, ".exe") == 0) - *s = '\0'; - } - else if (query == CW_GETPINFO_FULL) - { - HANDLE h = OpenProcess (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, - FALSE, p->dwProcessId); - if (!h) - continue; - HMODULE hm[1000]; - DWORD n = p->dwProcessId; - if (!myEnumProcessModules (h, hm, sizeof (hm), &n)) - n = 0; - if (!n || !myGetModuleFileNameEx (h, hm[0], pname, MAX_PATH)) - strcpy (pname, "*** unknown ***"); - FILETIME ct, et, kt, ut; - if (GetProcessTimes (h, &ct, &et, &kt, &ut)) - p->start_time = to_time_t (&ct); - CloseHandle (h); - } - - char uname[128]; - - if (fflag) - { - struct passwd *pw; - - if ((pw = getpwuid (p->version >= EXTERNAL_PINFO_VERSION_32_BIT ? - p->uid32 : p->uid))) - strcpy (uname, pw->pw_name); - else - sprintf (uname, "%u", (unsigned) - (p->version >= EXTERNAL_PINFO_VERSION_32_BIT ? - p->uid32 : p->uid)); - } - - if (sflag) - printf (dfmt, p->pid, ttynam (p->ctty), start_time (p), pname); - else if (fflag) - printf (ffmt, uname, p->pid, p->ppid, ttynam (p->ctty), start_time (p), - pname); - else if (lflag) - printf (lfmt, status, p->pid, p->ppid, p->pgid, - p->dwProcessId, ttynam (p->ctty), - p->version >= EXTERNAL_PINFO_VERSION_32_BIT ? p->uid32 : p->uid, - start_time (p), pname); - - } - (void) cygwin_internal (CW_UNLOCK_PINFO); - - return 0; -} - diff --git a/winsup/utils/regtool.cc b/winsup/utils/regtool.cc deleted file mode 100644 index 5f2396cd9..000000000 --- a/winsup/utils/regtool.cc +++ /dev/null @@ -1,697 +0,0 @@ -/* regtool.cc - - Copyright 2000, 2001, 2002 Red Hat Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include <stdio.h> -#include <stdlib.h> -#include <ctype.h> -#include <getopt.h> -#include <windows.h> - -#define DEFAULT_KEY_SEPARATOR '\\' - -enum -{ - KT_AUTO, KT_INT, KT_STRING, KT_EXPAND, KT_MULTI -} key_type = KT_AUTO; - -char key_sep = DEFAULT_KEY_SEPARATOR; - -#define LIST_KEYS 0x01 -#define LIST_VALS 0x02 -#define LIST_ALL (LIST_KEYS | LIST_VALS) - -static const char version[] = "$Revision$"; -static char *prog_name; - -static struct option longopts[] = -{ - {"expand-string", no_argument, NULL, 'e' }, - {"help", no_argument, NULL, 'h' }, - {"integer", no_argument, NULL, 'i' }, - {"keys", no_argument, NULL, 'k'}, - {"list", no_argument, NULL, 'l'}, - {"multi-string", no_argument, NULL, 'm'}, - {"postfix", no_argument, NULL, 'p'}, - {"quiet", no_argument, NULL, 'q'}, - {"string", no_argument, NULL, 's'}, - {"verbose", no_argument, NULL, 'v'}, - {"version", no_argument, NULL, 'V'}, - {"key-separator", required_argument, NULL, 'K'}, - {NULL, 0, NULL, 0} -}; - -static char opts[] = "ehiklmpqsvVK::"; - -int listwhat = 0; -int postfix = 0; -int verbose = 0; -int quiet = 0; -char **argv; - -HKEY key; -char *value; - -static void -usage (FILE *where = stderr) -{ - fprintf (where, "" - "Usage: %s [OPTION] (add | check | get | list | remove | unset) KEY\n" - "View or edit the Win32 registry\n" - "\n" - "", prog_name); - if (where == stdout) - fprintf (where, "" - "Actions:\n" - " add KEY\\SUBKEY add new SUBKEY\n" - " check KEY exit 0 if KEY exists, 1 if not\n" - " get KEY\\VALUE prints VALUE to stdout\n" - " list KEY list SUBKEYs and VALUEs\n" - " remove KEY remove KEY\n" - " set KEY\\VALUE [data ...] set VALUE\n" - " unset KEY\\VALUE removes VALUE from KEY\n" - "\n"); - fprintf (where, "" - "Options for 'list' Action:\n" - " -k, --keys print only KEYs\n" - " -l, --list print only VALUEs\n" - " -p, --postfix like ls -p, appends '\\' postfix to KEY names\n" - "\n" - "Options for 'set' Action:\n" - " -e, --expand-string set type to REG_EXPAND_SZ\n" - " -i, --integer set type to REG_DWORD\n" - " -m, --multi-string set type to REG_MULTI_SZ\n" - " -s, --string set type to REG_SZ\n" - "\n" - "Options for 'set' and 'unset' Actions:\n" - " -K<c>, --key-separator[=]<c> set key separator to <c> instead of '\\'\n" - "\n" - "Other Options:\n" - " -h, --help output usage information and exit\n" - " -q, --quiet no error output, just nonzero return if KEY/VALUE missing\n" - " -v, --verbose verbose output, including VALUE contents when applicable\n" - " -V, --version output version information and exit\n" - "\n"); - if (where == stdout) - { - fprintf (where, "" - "KEY is in the format [host]\\prefix\\KEY\\KEY\\VALUE, where host is optional\n" - "remote host in either \\\\hostname or hostname: format and prefix is any of:\n" - " root HKCR HKEY_CLASSES_ROOT (local only)\n" - " config HKCC HKEY_CURRENT_CONFIG (local only)\n" - " user HKCU HKEY_CURRENT_USER (local only)\n" - " machine HKLM HKEY_LOCAL_MACHINE\n" - " users HKU HKEY_USERS\n" - "\n" - "If the keyname starts with a forward slash ('/'), the forward slash is used\n" - "as separator and the backslash can be used as escape character.\n"); - fprintf (where, "" - "Example:\n" - "%s list '/machine/SOFTWARE/Classes/MIME/Database/Content Type/audio\\/wav'\n", prog_name); - } - if (where == stderr) - fprintf (where, "Try '%s --help' for more information.\n", prog_name); - exit (where == stderr ? 1 : 0); -} - -static void -print_version () -{ - const char *v = strchr (version, ':'); - int len; - if (!v) - { - v = "?"; - len = 1; - } - else - { - v += 2; - len = strchr (v, ' ') - v; - } - printf ("\ -%s (cygwin) %.*s\n\ -Registry Tool\n\ -Copyright 2000, 2001, 2002 Red Hat, Inc.\n\ -Compiled on %s\n\ -", prog_name, len, v, __DATE__); -} - -void -Fail (DWORD rv) -{ - char *buf; - if (!quiet) - { - FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER - | FORMAT_MESSAGE_FROM_SYSTEM, - 0, rv, 0, (CHAR *) & buf, 0, 0); - fprintf (stderr, "Error (%ld): %s\n", rv, buf); - LocalFree (buf); - } - exit (1); -} - -struct -{ - const char *string; - HKEY key; -} wkprefixes[] = -{ - {"root", HKEY_CLASSES_ROOT}, - {"HKCR", HKEY_CLASSES_ROOT}, - {"HKEY_CLASSES_ROOT", HKEY_CLASSES_ROOT}, - {"config", HKEY_CURRENT_CONFIG}, - {"HKCC", HKEY_CURRENT_CONFIG}, - {"HKEY_CURRENT_CONFIG", HKEY_CURRENT_CONFIG}, - {"user", HKEY_CURRENT_USER}, - {"HKCU", HKEY_CURRENT_USER}, - {"HKEY_CURRENT_USER", HKEY_CURRENT_USER}, - {"machine", HKEY_LOCAL_MACHINE}, - {"HKLM", HKEY_LOCAL_MACHINE}, - {"HKEY_LOCAL_MACHINE", HKEY_LOCAL_MACHINE}, - {"users", HKEY_USERS}, - {"HKU", HKEY_USERS}, - {"HKEY_USERS", HKEY_USERS}, - {0, 0} -}; - -void -translate (char *key) -{ -#define isodigit(c) (strchr("01234567", c)) -#define tooct(c) ((c)-'0') -#define tohex(c) (strchr(_hs,tolower(c))-_hs) - static char _hs[] = "0123456789abcdef"; - - char *d = key; - char *s = key; - char c; - - while (*s) - { - if (*s == '\\') - switch (*++s) - { - case 'a': - *d++ = '\007'; - break; - case 'b': - *d++ = '\b'; - break; - case 'e': - *d++ = '\033'; - break; - case 'f': - *d++ = '\f'; - break; - case 'n': - *d++ = '\n'; - break; - case 'r': - *d++ = '\r'; - break; - case 't': - *d++ = '\t'; - break; - case 'v': - *d++ = '\v'; - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - c = tooct (*s); - if (isodigit (s[1])) - { - c = (c << 3) | tooct (*++s); - if (isodigit (s[1])) - c = (c << 3) | tooct (*++s); - } - *d++ = c; - break; - case 'x': - if (!isxdigit (s[1])) - c = '0'; - else - { - c = tohex (*++s); - if (isxdigit (s[1])) - c = (c << 4) | tohex (*++s); - } - *d++ = c; - break; - default: /* before non-special char: just add the char */ - *d++ = *s; - break; - } - else if (*s == '/') - *d++ = '\\'; - else - *d++ = *s; - ++s; - } - *d = '\0'; -} - -void -find_key (int howmanyparts, REGSAM access) -{ - HKEY base; - int rv; - char *n = argv[0], *e, *h, c; - char* host = NULL; - int i; - if (*n == '/') - translate (n); - if (*n != '\\') - { - /* expect host:/key/value format */ - host = (char*) malloc (strlen (n) + 1); - host[0] = host [1] = '\\'; - for (e = n, h = host + 2; *e && *e != ':'; e++, h++) - *h = *e; - *h = 0; - n = e + 1; - if (*n == '/') - translate (n); - } - else if (n[0] == '\\' && n[1] == '\\') - { - /* expect //host/key/value format */ - host = (char*) malloc (strlen (n) + 1); - host[0] = host[1] = '\\'; - for (e = n + 2, h = host + 2; *e && *e != '\\'; e++, h++) - *h = *e; - *h = 0; - n = e; - } - while (*n != '\\') - n++; - *n++ = 0; - for (e = n; *e && *e != '\\'; e++); - c = *e; - *e = 0; - for (i = 0; wkprefixes[i].string; i++) - if (strcmp (wkprefixes[i].string, n) == 0) - break; - if (!wkprefixes[i].string) - { - fprintf (stderr, "Unknown key prefix. Valid prefixes are:\n"); - for (i = 0; wkprefixes[i].string; i++) - fprintf (stderr, "\t%s\n", wkprefixes[i].string); - exit (1); - } - - n = e; - *e = c; - while (*n && *n == '\\') - n++; - e = n + strlen (n); - if (howmanyparts > 1) - { - while (n < e && *e != key_sep) - e--; - if (*e != key_sep) - { - key = wkprefixes[i].key; - value = n; - return; - } - else - { - *e = 0; - value = e + 1; - } - } - if (host) - { - rv = RegConnectRegistry (host, wkprefixes[i].key, &base); - if (rv != ERROR_SUCCESS) - Fail (rv); - free (host); - } - else - base = wkprefixes[i].key; - - if (n[0] == 0) - key = base; - else - { - rv = RegOpenKeyEx (base, n, 0, access, &key); - if (rv != ERROR_SUCCESS) - Fail (rv); - } - //printf("key `%s' value `%s'\n", n, value); -} - - -int -cmd_list () -{ - DWORD num_subkeys, maxsubkeylen, num_values, maxvalnamelen, maxvaluelen; - DWORD maxclasslen; - char *subkey_name, *value_name, *class_name; - unsigned char *value_data, *vd; - DWORD i, j, m, n, t; - int v; - - find_key (1, KEY_READ); - RegQueryInfoKey (key, 0, 0, 0, &num_subkeys, &maxsubkeylen, &maxclasslen, - &num_values, &maxvalnamelen, &maxvaluelen, 0, 0); - - subkey_name = (char *) malloc (maxsubkeylen + 1); - class_name = (char *) malloc (maxclasslen + 1); - value_name = (char *) malloc (maxvalnamelen + 1); - value_data = (unsigned char *) malloc (maxvaluelen + 1); - - if (!listwhat) - listwhat = LIST_ALL; - - if (listwhat & LIST_KEYS) - for (i = 0; i < num_subkeys; i++) - { - m = maxsubkeylen + 1; - n = maxclasslen + 1; - RegEnumKeyEx (key, i, subkey_name, &m, 0, class_name, &n, 0); - printf ("%s%s", subkey_name, (postfix || verbose) ? "\\" : ""); - - if (verbose) - printf (" (%s)", class_name); - - puts (""); - } - - if (listwhat & LIST_VALS) - for (i = 0; i < num_values; i++) - { - m = maxvalnamelen + 1; - n = maxvaluelen + 1; - RegEnumValue (key, i, value_name, &m, 0, &t, (BYTE *) value_data, &n); - if (!verbose) - printf ("%s\n", value_name); - else - { - printf ("%s = ", value_name); - switch (t) - { - case REG_BINARY: - for (j = 0; j < 8 && j < n; j++) - printf ("%02x ", value_data[j]); - printf ("\n"); - break; - case REG_DWORD: - printf ("0x%08lx (%lu)\n", *(DWORD *) value_data, - *(DWORD *) value_data); - break; - case REG_DWORD_BIG_ENDIAN: - v = ((value_data[0] << 24) - | (value_data[1] << 16) - | (value_data[2] << 8) | (value_data[3])); - printf ("0x%08x (%d)\n", v, v); - break; - case REG_EXPAND_SZ: - case REG_SZ: - printf ("\"%s\"\n", value_data); - break; - case REG_MULTI_SZ: - vd = value_data; - while (vd && *vd) - { - printf ("\"%s\"", vd); - vd = vd + strlen ((const char *) vd) + 1; - if (*vd) - printf (", "); - } - printf ("\n"); - break; - default: - printf ("? (type %d)\n", (int) t); - } - } - } - return 0; -} - -int -cmd_add () -{ - find_key (2, KEY_ALL_ACCESS); - HKEY newkey; - DWORD newtype; - int rv = RegCreateKeyEx (key, value, 0, (char *) "", REG_OPTION_NON_VOLATILE, - KEY_ALL_ACCESS, 0, &newkey, &newtype); - if (rv != ERROR_SUCCESS) - Fail (rv); - - if (verbose) - { - if (newtype == REG_OPENED_EXISTING_KEY) - printf ("Key %s already exists\n", value); - else - printf ("Key %s created\n", value); - } - return 0; -} - -int -cmd_remove () -{ - find_key (2, KEY_ALL_ACCESS); - DWORD rv = RegDeleteKey (key, value); - if (rv != ERROR_SUCCESS) - Fail (rv); - if (verbose) - printf ("subkey %s deleted\n", value); - return 0; -} - -int -cmd_check () -{ - find_key (1, KEY_READ); - if (verbose) - printf ("key %s exists\n", argv[0]); - return 0; -} - -int -cmd_set () -{ - int i, n; - DWORD v, rv; - char *a = argv[1], *data; - find_key (2, KEY_ALL_ACCESS); - - if (key_type == KT_AUTO) - { - char *e; - strtoul (a, &e, 0); - if (a[0] == '%') - key_type = KT_EXPAND; - else if (a[0] && !*e) - key_type = KT_INT; - else if (argv[2]) - key_type = KT_MULTI; - else - key_type = KT_STRING; - } - - switch (key_type) - { - case KT_INT: - v = strtoul (a, 0, 0); - rv = RegSetValueEx (key, value, 0, REG_DWORD, (const BYTE *) &v, - sizeof (v)); - break; - case KT_STRING: - rv = RegSetValueEx (key, value, 0, REG_SZ, (const BYTE *) a, strlen (a)); - break; - case KT_EXPAND: - rv = RegSetValueEx (key, value, 0, REG_EXPAND_SZ, (const BYTE *) a, - strlen (a)); - break; - case KT_MULTI: - for (i = 1, n = 1; argv[i]; i++) - n += strlen (argv[i]) + 1; - data = (char *) malloc (n); - for (i = 1, n = 0; argv[i]; i++) - { - strcpy (data + n, argv[i]); - n += strlen (argv[i]) + 1; - } - data[n] = 0; - rv = RegSetValueEx (key, value, 0, REG_MULTI_SZ, (const BYTE *) data, - n + 1); - break; - case KT_AUTO: - rv = ERROR_SUCCESS; - break; - default: - rv = ERROR_INVALID_CATEGORY; - break; - } - - if (rv != ERROR_SUCCESS) - Fail (rv); - - return 0; -} - -int -cmd_unset () -{ - find_key (2, KEY_ALL_ACCESS); - DWORD rv = RegDeleteValue (key, value); - if (rv != ERROR_SUCCESS) - Fail (rv); - if (verbose) - printf ("value %s deleted\n", value); - return 0; -} - -int -cmd_get () -{ - find_key (2, KEY_READ); - DWORD vtype, dsize, rv; - char *data, *vd; - rv = RegQueryValueEx (key, value, 0, &vtype, 0, &dsize); - if (rv != ERROR_SUCCESS) - Fail (rv); - dsize++; - data = (char *) malloc (dsize); - rv = RegQueryValueEx (key, value, 0, &vtype, (BYTE *) data, &dsize); - if (rv != ERROR_SUCCESS) - Fail (rv); - switch (vtype) - { - case REG_BINARY: - fwrite (data, dsize, 0, stdout); - break; - case REG_DWORD: - printf ("%lu\n", *(DWORD *) data); - break; - case REG_SZ: - printf ("%s\n", data); - break; - case REG_EXPAND_SZ: - if (key_type == KT_EXPAND) // hack - { - char *buf; - DWORD bufsize; - bufsize = ExpandEnvironmentStrings (data, 0, 0); - buf = (char *) malloc (bufsize + 1); - ExpandEnvironmentStrings (data, buf, bufsize + 1); - data = buf; - } - printf ("%s\n", data); - break; - case REG_MULTI_SZ: - vd = data; - while (vd && *vd) - { - printf ("%s\n", vd); - vd = vd + strlen ((const char *) vd) + 1; - } - break; - } - return 0; -} - -struct -{ - const char *name; - int (*func) (); -} commands[] = -{ - {"list", cmd_list}, - {"add", cmd_add}, - {"remove", cmd_remove}, - {"check", cmd_check}, - {"set", cmd_set}, - {"unset", cmd_unset}, - {"get", cmd_get}, - {0, 0} -}; - -int -main (int argc, char **_argv) -{ - int g; - - prog_name = strrchr (_argv[0], '/'); - if (prog_name == NULL) - prog_name = strrchr (_argv[0], '\\'); - if (prog_name == NULL) - prog_name = _argv[0]; - else - prog_name++; - - while ((g = getopt_long (argc, _argv, opts, longopts, NULL)) != EOF) - switch (g) - { - case 'e': - key_type = KT_EXPAND; - break; - case 'k': - listwhat |= LIST_KEYS; - break; - case 'h': - usage (stdout); - case 'i': - key_type = KT_INT; - break; - case 'l': - listwhat |= LIST_VALS; - break; - case 'm': - key_type = KT_MULTI; - break; - case 'p': - postfix++; - break; - case 'q': - quiet++; - break; - case 's': - key_type = KT_STRING; - break; - case 'v': - verbose++; - break; - case 'V': - print_version (); - exit (0); - case 'K': - key_sep = *optarg; - break; - default : - usage (); - } - - if ((_argv[optind] == NULL) || (_argv[optind+1] == NULL)) - usage (); - - argv = _argv + optind; - int i; - for (i = 0; commands[i].name; i++) - if (strcmp (commands[i].name, argv[0]) == 0) - { - argv++; - return commands[i].func (); - } - usage (); - - return 0; -} diff --git a/winsup/utils/setfacl.c b/winsup/utils/setfacl.c deleted file mode 100644 index 996b5ec7f..000000000 --- a/winsup/utils/setfacl.c +++ /dev/null @@ -1,566 +0,0 @@ -/* setfacl.c - - Copyright 2000, 2001, 2002, 2003 Red Hat Inc. - - Written by Corinna Vinschen <vinschen@redhat.com> - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include <stdio.h> -#include <ctype.h> -#include <string.h> -#include <stdlib.h> -#include <unistd.h> -#include <getopt.h> -#include <pwd.h> -#include <grp.h> -#include <sys/types.h> -#include <sys/acl.h> - -#ifndef BOOL -#define BOOL int -#endif - -#ifndef TRUE -#define TRUE (1) -#endif - -#ifndef FALSE -#define FALSE (0) -#endif - -#ifndef ILLEGAL_MODE -#define ILLEGAL_MODE ((mode_t)0xffffffff) -#endif - -static const char version[] = "$Revision$"; -static char *prog_name; - -typedef enum { - NoAction, - Set, - Modify, - Delete, - ModNDel, - SetFromFile -} action_t; - -mode_t getperm (char *in) -{ - if (isdigit (*in) && !in[1]) - { - int i = atoi (in); - if (i < 0 || i > 7) - return ILLEGAL_MODE; - return i << 6 | i << 3 | i; - } - if (strlen (in) > 3 && strchr (" \t\n\r#", in[3])) - in[3] = '\0'; - if (strlen (in) != 3) - return ILLEGAL_MODE; - if (!strchr ("r-", in[0]) - || !strchr ("w-", in[1]) - || !strchr ("x-", in[2])) - return ILLEGAL_MODE; - return (in[0] == 'r' ? S_IROTH : 0) - | (in[1] == 'w' ? S_IWOTH : 0) - | (in[2] == 'x' ? S_IXOTH : 0); -} - -BOOL -getaclentry (action_t action, char *c, aclent_t *ace) -{ - char *c2; - - ace->a_type = 0; - ace->a_id = -1; - ace->a_perm = 0; - - if (!strncmp (c, "default:", 8) - || !strncmp (c, "d:", 2)) - { - ace->a_type = ACL_DEFAULT; - c = strchr (c, ':') + 1; - } - if (!strncmp (c, "user:", 5) - || !strncmp (c, "u:", 2)) - { - ace->a_type |= USER_OBJ; - c = strchr (c, ':') + 1; - } - else if (!strncmp (c, "group:", 6) - || !strncmp (c, "g:", 2)) - { - ace->a_type |= GROUP_OBJ; - c = strchr (c, ':') + 1; - } - else if (!strncmp (c, "mask:", 5) - || !strncmp (c, "m:", 2)) - { - ace->a_type |= CLASS_OBJ; - c = strchr (c, ':') + 1; - } - else if (!strncmp (c, "other:", 6) - || !strncmp (c, "o:", 2)) - { - ace->a_type |= OTHER_OBJ; - c = strchr (c, ':') + 1; - } - else - return FALSE; - if (ace->a_type & (USER_OBJ | GROUP_OBJ)) - { - if ((c2 = strchr (c, ':'))) - { - if (action == Delete) - return FALSE; - *c2 = '\0'; - } - else if (action != Delete) - return FALSE; - if (c2 == c) - { - if (action == Delete) - return FALSE; - } - else if (isdigit (*c)) - { - char *c3; - - ace->a_id = strtol (c, &c3, 10); - if (*c3) - return FALSE; - } - else if (ace->a_type & USER_OBJ) - { - struct passwd *pw = getpwnam (c); - if (!pw) - return FALSE; - ace->a_id = pw->pw_uid; - } - else - { - struct group *gr = getgrnam (c); - if (!gr) - return FALSE; - ace->a_id = gr->gr_gid; - } - if (c2 != c) - { - if (ace->a_type & USER_OBJ) - { - ace->a_type &= ~USER_OBJ; - ace->a_type |= USER; - } - else - { - ace->a_type &= ~GROUP_OBJ; - ace->a_type |= GROUP; - } - } - if (c2) - c = c2 + 1; - } - /* FIXME: currently allow both :: and : */ - else if (*c == ':') - c++; - if (action == Delete) - { - if ((ace->a_type & (CLASS_OBJ | OTHER_OBJ)) - && *c) - return FALSE; - ace->a_perm = ILLEGAL_MODE; - return TRUE; - } - if ((ace->a_perm = getperm (c)) == ILLEGAL_MODE) - return FALSE; - return TRUE; -} - -BOOL -getaclentries (action_t action, char *buf, aclent_t *acls, int *idx) -{ - char *c; - - if (action == SetFromFile) - { - FILE *fp; - char fbuf[256], *fb; - - if (!strcmp (buf, "-")) - fp = stdin; - else if (! (fp = fopen (buf, "r"))) - return FALSE; - while ((fb = fgets (fbuf, 256, fp))) - { - while (strchr (" \t", *fb)) - ++fb; - if (strchr ("\n\r#", *fb)) - continue; - if (!getaclentry (action, fb, acls + (*idx)++)) - { - fclose (fp); - return FALSE; - } - } - if (fp != stdin) - fclose (fp); - } - else - for (c = strtok (buf, ","); c; c = strtok (NULL, ",")) - if (!getaclentry (action, c, acls + (*idx)++)) - return FALSE; - return TRUE; -} - -int -searchace (aclent_t *aclp, int nentries, int type, int id) -{ - int i; - - for (i = 0; i < nentries; ++i) - if ((aclp[i].a_type == type && (id < 0 || aclp[i].a_id == id)) - || !aclp[i].a_type) - return i; - return -1; -} - -int -modacl (aclent_t *tgt, int tcnt, aclent_t *src, int scnt) -{ - int t, s, i; - - for (s = 0; s < scnt; ++s) - { - t = searchace (tgt, MAX_ACL_ENTRIES, src[s].a_type, - (src[s].a_type & (USER | GROUP)) ? src[s].a_id : -1); - if (t < 0) - return -1; - if (src[s].a_perm == ILLEGAL_MODE) - { - if (t < tcnt) - { - for (i = t + 1; i < tcnt; ++i) - tgt[i - 1] = tgt[i]; - --tcnt; - } - } - else - { - tgt[t] = src[s]; - if (t >= tcnt) - ++tcnt; - } - } - return tcnt; -} - -void -setfacl (action_t action, char *path, aclent_t *acls, int cnt) -{ - aclent_t lacl[MAX_ACL_ENTRIES]; - int lcnt; - - memset (lacl, 0, sizeof lacl); - if (action == Set) - { - if (acl (path, SETACL, cnt, acls)) - perror (prog_name); - return; - } - if ((lcnt = acl (path, GETACL, MAX_ACL_ENTRIES, lacl)) < 0 - || (lcnt = modacl (lacl, lcnt, acls, cnt)) < 0 - || (lcnt = acl (path, SETACL, lcnt, lacl)) < 0) - perror (prog_name); -} - -static void -usage (FILE * stream) -{ - fprintf (stream, "" - "Usage: %s [-r] (-f ACL_FILE | -s acl_entries) FILE...\n" - " %s [-r] ([-d acl_entries] [-m acl_entries]) FILE...\n" - "Modify file and directory access control lists (ACLs)\n" - "\n" - " -d, --delete delete one or more specified ACL entries\n" - " -f, --file set ACL entries for FILE to ACL entries read\n" - " from a ACL_FILE\n" - " -m, --modify modify one or more specified ACL entries\n" - " -r, --replace replace mask entry with maximum permissions\n" - " needed for the file group class\n" - " -s, --substitute substitute specified ACL entries for the\n" - " ACL of FILE\n" - " -h, --help output usage information and exit\n" - " -v, --version output version information and exit\n" - "\n" - "At least one of (-d, -f, -m, -s) must be specified\n" - "\n" - "", prog_name, prog_name); - if (stream == stdout) - { - printf("" - " Acl_entries are one or more comma-separated ACL entries \n" - " from the following list:\n" - "\n" - " u[ser]::perm\n" - " u[ser]:uid:perm\n" - " g[roup]::perm\n" - " g[roup]:gid:perm\n" - " m[ask]:perm\n" - " o[ther]:perm\n" - "\n" - " Default entries are like the above with the additional\n" - " default identifier. For example: \n" - "\n" - " d[efault]:u[ser]:uid:perm\n" - "\n" - " `perm' is either a 3-char permissions string in the form\n" - " \"rwx\" with the character - for no permission\n" - " or it is the octal representation of the permissions, a\n" - " value from 0 (equivalent to \"---\") to 7 (\"rwx\").\n" - " `uid' is a user name or a numerical uid.\n" - " `gid' is a group name or a numerical gid.\n" - "\n" - "\n" - "For each file given as parameter, %s will either replace its\n" - "complete ACL (-s, -f), or it will add, modify, or delete ACL\n" - "entries.\n" - "\n" - "The following options are supported:\n" - "\n" - "-d Delete one or more specified entries from the file's ACL.\n" - " The owner, group and others entries must not be deleted.\n" - " Acl_entries to be deleted should be specified without\n" - " permissions, as in the following list:\n" - "\n" - " u[ser]:uid\n" - " g[roup]:gid\n" - " d[efault]:u[ser]:uid\n" - " d[efault]:g[roup]:gid\n" - " d[efault]:m[ask]:\n" - " d[efault]:o[ther]:\n" - "\n" - "-f Take the Acl_entries from ACL_FILE one per line. Whitespace\n" - " characters are ignored, and the character \"#\" may be used\n" - " to start a comment. The special filename \"-\" indicates\n" - " reading from stdin.\n" - " Required entries are\n" - " - One user entry for the owner of the file.\n" - " - One group entry for the group of the file.\n" - " - One other entry.\n" - " If additional user and group entries are given:\n" - " - A mask entry for the file group class of the file.\n" - " - No duplicate user or group entries with the same uid/gid.\n" - " If it is a directory:\n" - " - One default user entry for the owner of the file.\n" - " - One default group entry for the group of the file.\n" - " - One default mask entry for the file group class.\n" - " - One default other entry.\n" - "\n" - "-m Add or modify one or more specified ACL entries.\n" - " Acl_entries is a comma-separated list of entries from the \n" - " same list as above.\n" - "\n" - "-r Causes the permissions specified in the mask entry to be\n" - " ignored and replaced by the maximum permissions needed for\n" - " the file group class.\n" - "\n" - "-s Like -f, but substitute the file's ACL with Acl_entries\n" - " specified in a comma-separated list on the command line.\n" - "\n" - "While the -d and -m options may be used in the same command, the\n" - "-f and -s options may be used only exclusively.\n" - "\n" - "Directories may contain default ACL entries. Files created\n" - "in a directory that contains default ACL entries will have\n" - "permissions according to the combination of the current umask,\n" - "the explicit permissions requested and the default ACL entries\n" - "Note: Under Cygwin, the default ACL entries are not taken into\n" - "account currently.\n", prog_name); - } - else - fprintf(stream, "Try `%s --help' for more information.\n", prog_name); -} - -struct option longopts[] = { - {"delete", required_argument, NULL, 'd'}, - {"file", required_argument, NULL, 'f'}, - {"modify", required_argument, NULL, 'm'}, - {"replace", no_argument, NULL, 'r'}, - {"substitute", required_argument, NULL, 's'}, - {"help", no_argument, NULL, 'h'}, - {"version", no_argument, NULL, 'v'}, - {0, no_argument, NULL, 0} -}; - -static void -print_version () -{ - const char *v = strchr (version, ':'); - int len; - if (!v) - { - v = "?"; - len = 1; - } - else - { - v += 2; - len = strchr (v, ' ') - v; - } - printf ("\ -setfacl (cygwin) %.*s\n\ -ACL Modification Utility\n\ -Copyright 2000, 2001, 2002 Red Hat, Inc.\n\ -Compiled on %s\n\ -", len, v, __DATE__); -} - -int -main (int argc, char **argv) -{ - int c; - action_t action = NoAction; - int ropt = 0; - aclent_t acls[MAX_ACL_ENTRIES]; - int aclidx = 0; - - prog_name = strrchr (argv[0], '/'); - if (prog_name == NULL) - prog_name = strrchr (argv[0], '\\'); - if (prog_name == NULL) - prog_name = argv[0]; - else - prog_name++; - - memset (acls, 0, sizeof acls); - while ((c = getopt_long (argc, argv, "d:f:hm:rs:v", longopts, NULL)) != EOF) - switch (c) - { - case 'd': - if (action == NoAction) - action = Delete; - else if (action == Modify) - action = ModNDel; - else - { - usage (stderr); - return 1; - } - if (! getaclentries (Delete, optarg, acls, &aclidx)) - { - fprintf (stderr, "%s: illegal acl entries\n", prog_name); - return 2; - } - break; - case 'f': - if (action == NoAction) - action = Set; - else - { - usage (stderr); - return 1; - } - if (! getaclentries (SetFromFile, optarg, acls, &aclidx)) - { - fprintf (stderr, "%s: illegal acl entries\n", prog_name); - return 2; - } - break; - case 'h': - usage (stdout); - return 0; - case 'm': - if (action == NoAction) - action = Modify; - else if (action == Delete) - action = ModNDel; - else - { - usage (stderr); - return 1; - } - if (! getaclentries (Modify, optarg, acls, &aclidx)) - { - fprintf (stderr, "%s: illegal acl entries\n", prog_name); - return 2; - } - break; - case 'r': - if (!ropt) - ropt = 1; - else - { - usage (stderr); - return 1; - } - break; - case 's': - if (action == NoAction) - action = Set; - else - { - usage (stderr); - return 1; - } - if (! getaclentries (Set, optarg, acls, &aclidx)) - { - fprintf (stderr, "%s: illegal acl entries\n", prog_name); - return 2; - } - break; - case 'v': - print_version (); - return 0; - default: - usage (stderr); - return 1; - } - if (action == NoAction) - { - usage (stderr); - return 1; - } - if (optind > argc - 1) - { - usage (stderr); - return 1; - } - if (action == Set) - switch (aclcheck (acls, aclidx, NULL)) - { - case GRP_ERROR: - fprintf (stderr, "%s: more than one group entry.\n", prog_name); - return 2; - case USER_ERROR: - fprintf (stderr, "%s: more than one user entry.\n", prog_name); - return 2; - case CLASS_ERROR: - fprintf (stderr, "%s: more than one mask entry.\n", prog_name); - return 2; - case OTHER_ERROR: - fprintf (stderr, "%s: more than one other entry.\n", prog_name); - return 2; - case DUPLICATE_ERROR: - fprintf (stderr, "%s: duplicate additional user or group.\n", prog_name); - return 2; - case ENTRY_ERROR: - fprintf (stderr, "%s: invalid entry type.\n", prog_name); - return 2; - case MISS_ERROR: - fprintf (stderr, "%s: missing entries.\n", prog_name); - return 2; - case MEM_ERROR: - fprintf (stderr, "%s: out of memory.\n", prog_name); - return 2; - default: - break; - } - for (c = optind; c < argc; ++c) - setfacl (action, argv[c], acls, aclidx); - return 0; -} diff --git a/winsup/utils/ssp.c b/winsup/utils/ssp.c deleted file mode 100644 index 4c3bad37d..000000000 --- a/winsup/utils/ssp.c +++ /dev/null @@ -1,951 +0,0 @@ -/* - * Copyright (c) 2000, 2001, 2002 Red Hat, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * A copy of the GNU General Public License can be found at - * http://www.gnu.org/ - * - * Written by DJ Delorie <dj@redhat.com> - * - */ - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <fcntl.h> -#include <time.h> -#include <ctype.h> -#include <windows.h> -#include <getopt.h> - -static const char version[] = "$Revision$"; -static char *prog_name; - -static struct option longopts[] = -{ - {"console-trace", no_argument, NULL, 'c' }, - {"disable", no_argument, NULL, 'd' }, - {"enable", no_argument, NULL, 'e' }, - {"help", no_argument, NULL, 'h' }, - {"dll", no_argument, NULL, 'l' }, - {"sub-threads", no_argument, NULL, 's' }, - {"trace-eip", no_argument, NULL, 't' }, - {"verbose", no_argument, NULL, 'v' }, - {"version", no_argument, NULL, 'V' }, - {NULL, 0, NULL, 0} -}; - -static char opts[] = "+cdehlstvV"; - -#define KERNEL_ADDR 0x77000000 - -#define TRACE_SSP 0 - -#define VERBOSE 1 -#define TIMES 1000 - -/* from winsup/gmon.h */ -struct gmonhdr { - unsigned long lpc; /* base pc address of sample buffer */ - unsigned long hpc; /* max pc address of sampled buffer */ - int ncnt; /* size of sample buffer (plus this header) */ - int version; /* version number */ - int profrate; /* profiling clock rate */ - int spare[3]; /* reserved */ -}; -#define GMONVERSION 0x00051879 -#define HISTCOUNTER unsigned short - -typedef struct { - unsigned int base_address; - int pcount; - int scount; - char *name; -} DllInfo; - -typedef struct { - unsigned int address; - unsigned char real_byte; -} PendingBreakpoints; - -unsigned low_pc=0, high_pc=0; -unsigned last_pc=0, pc, last_sp=0, sp; -int total_cycles, count; -HANDLE hProcess; -PROCESS_INFORMATION procinfo; -STARTUPINFO startup; -CONTEXT context; -HISTCOUNTER *hits=0; -struct gmonhdr hdr; -int running = 1, profiling = 1; -char dll_name[1024], *dll_ptr, *cp; -int eip; -unsigned opcode_count = 0; - -int stepping_enabled = 1; -int tracing_enabled = 0; -int trace_console = 0; -int trace_all_threads = 0; -int dll_counts = 0; -int verbose = 0; - -#define MAXTHREADS 100 -DWORD active_thread_ids[MAXTHREADS]; -HANDLE active_threads[MAXTHREADS]; -DWORD thread_step_flags[MAXTHREADS]; -DWORD thread_return_address[MAXTHREADS]; -int num_active_threads = 0; -int suspended_count=0; - -#define MAXDLLS 100 -DllInfo dll_info[MAXDLLS]; -int num_dlls=0; - -#define MAXPENDS 100 -PendingBreakpoints pending_breakpoints[MAXPENDS]; -int num_breakpoints=0; - -static void -add_breakpoint (unsigned int address) -{ - int i; - DWORD rv; - static char int3[] = { 0xcc }; - for (i=0; i<num_breakpoints; i++) - { - if (pending_breakpoints[i].address == address) - return; - if (pending_breakpoints[i].address == 0) - break; - } - if (i == MAXPENDS) - return; - pending_breakpoints[i].address = address; - ReadProcessMemory (hProcess, - (void *)address, - &(pending_breakpoints[i].real_byte), - 1, &rv); - - WriteProcessMemory (hProcess, - (void *)address, - (LPVOID)int3, 1, &rv); - if (i >= num_breakpoints) - num_breakpoints = i+1; -} - -static int -remove_breakpoint (unsigned int address) -{ - int i; - DWORD rv; - for (i=0; i<num_breakpoints; i++) - { - if (pending_breakpoints[i].address == address) - { - pending_breakpoints[i].address = 0; - WriteProcessMemory (hProcess, - (void *)address, - &(pending_breakpoints[i].real_byte), - 1, &rv); - return 1; - } - } - return 0; -} - -static HANDLE -lookup_thread_id (DWORD threadId, int *tix) -{ - int i; - for (i=0; i<num_active_threads; i++) - if (active_thread_ids[i] == threadId) - { - if (tix) *tix = i; - return active_threads[i]; - } - return 0; -} - -static void -set_step_threads (int threadId, int trace) -{ - int rv, tix; - HANDLE thread = lookup_thread_id (threadId, &tix); - - rv = GetThreadContext (thread, &context); - if (rv != -1) - { - thread_step_flags[tix] = trace; - if (trace) - context.EFlags |= 0x100; /* TRAP (single step) flag */ - else - context.EFlags &= ~0x100; /* TRAP (single step) flag */ - SetThreadContext (thread, &context); - } -} - -static void -set_steps () -{ - int i, s; - for (i=0; i<num_active_threads; i++) - { - GetThreadContext (active_threads[i], &context); - s = context.EFlags & 0x0100; - if (!s && thread_step_flags[i]) - { - set_step_threads (active_thread_ids[i], 1); - } - } -} - -static int -dll_sort (const void *va, const void *vb) -{ - DllInfo *a = (DllInfo *)va; - DllInfo *b = (DllInfo *)vb; - if (a->base_address < b->base_address) - return -1; - return 1; -} - -static char * -addr2dllname (unsigned int addr) -{ - int i; - for (i=num_dlls-1; i>=0; i--) - { - if (dll_info[i].base_address < addr) - { - return dll_info[i].name; - } - } - return (char *)""; -} - -static void -dump_registers (HANDLE thread) -{ - context.ContextFlags = CONTEXT_FULL; - GetThreadContext (thread, &context); - printf ("eax %08lx ebx %08lx ecx %08lx edx %08lx eip\n", - context.Eax, context.Ebx, context.Ecx, context.Edx); - printf ("esi %08lx edi %08lx ebp %08lx esp %08lx %08lx\n", - context.Esi, context.Esi, context.Ebp, context.Esp, context.Eip); -} - -typedef struct Edge { - struct Edge *next; - unsigned int from_pc; - unsigned int to_pc; - unsigned int count; -} Edge; - -Edge *edges[4096]; - -void -store_call_edge (unsigned int from_pc, unsigned int to_pc) -{ - Edge *e; - unsigned int h = ((from_pc + to_pc)>>4) & 4095; - for (e=edges[h]; e; e=e->next) - if (e->from_pc == from_pc && e->to_pc == to_pc) - break; - if (!e) - { - e = (Edge *)malloc (sizeof (Edge)); - e->next = edges[h]; - edges[h] = e; - e->from_pc = from_pc; - e->to_pc = to_pc; - e->count = 0; - } - e->count++; -} - -void -write_call_edges (FILE *f) -{ - int h; - Edge *e; - for (h=0; h<4096; h++) - for (e=edges[h]; e; e=e->next) - fwrite (&(e->from_pc), 1, 3*sizeof (unsigned int), f); -} - -char * -wide_strdup (char *cp) -{ - unsigned short *s = (unsigned short *)cp; - int len; - char *rv; - for (len=0; s[len]; len++); - rv = (char *)malloc (len+1); - for (len=0; s[len]; len++) - rv[len] = s[len]; - rv[len] = 0; - return rv; -} - -void -run_program (char *cmdline) -{ - FILE *tracefile = 0; - int tix, i; - HANDLE hThread; - char *string; - - memset (&startup, 0, sizeof (startup)); - startup.cb = sizeof (startup); - - if (!CreateProcess (0, cmdline, 0, 0, 0, - CREATE_NEW_PROCESS_GROUP - | CREATE_SUSPENDED - | DEBUG_PROCESS - | DEBUG_ONLY_THIS_PROCESS, - 0, 0, &startup, &procinfo)) - { - fprintf (stderr, "Can't create process: error %ld\n", GetLastError ()); - exit (1); - } - - hProcess = procinfo.hProcess; -#if 0 - printf ("procinfo: %08x %08x %08x %08x\n", - hProcess, procinfo.hThread, procinfo.dwProcessId, procinfo.dwThreadId); -#endif - - active_threads[0] = procinfo.hThread; - active_thread_ids[0] = procinfo.dwThreadId; - thread_step_flags[0] = stepping_enabled; - num_active_threads = 1; - - dll_info[0].base_address = 0; - dll_info[0].pcount = 0; - dll_info[0].scount = 0; - dll_info[0].name = cmdline; - num_dlls = 1; - - SetThreadPriority (procinfo.hThread, THREAD_PRIORITY_IDLE); - - context.ContextFlags = CONTEXT_FULL; - - ResumeThread (procinfo.hThread); - - total_cycles = 0; - - if (tracing_enabled) - { - tracefile = fopen ("trace.ssp", "w"); - if (!tracefile) - { - tracing_enabled = 0; - perror ("trace.ssp"); - } - } - - running = 1; - while (running) - { - int src, dest; - DWORD rv; - DEBUG_EVENT event; - int contv = DBG_CONTINUE; - - event.dwDebugEventCode = -1; - if (!WaitForDebugEvent (&event, INFINITE)) - { - printf ("idle...\n"); - } - - hThread = lookup_thread_id (event.dwThreadId, &tix); - -#if 0 - printf ("DE: %x/%d %d %d ", - hThread, tix, - event.dwDebugEventCode, num_active_threads); - for (src=0; src<num_active_threads; src++) - { - int sc = SuspendThread (active_threads[src]); - int rv = GetThreadContext (active_threads[src], &context); - ResumeThread (active_threads[src]); - printf (" [%x,%x,%x]", - active_threads[src], context.Eip, active_thread_ids[src]); - } - printf ("\n"); -#endif - - switch (event.dwDebugEventCode) - { - - case CREATE_PROCESS_DEBUG_EVENT: - break; - - case CREATE_THREAD_DEBUG_EVENT: - if (verbose) - printf ("create thread %08lx at %08x %s\n", - event.dwThreadId, - (int)event.u.CreateThread.lpStartAddress, - addr2dllname ((unsigned int)event.u.CreateThread.lpStartAddress)); - - active_thread_ids[num_active_threads] = event.dwThreadId; - active_threads[num_active_threads] = event.u.CreateThread.hThread; - thread_return_address[num_active_threads] = 0; - num_active_threads++; - - if (trace_all_threads && stepping_enabled) - { - thread_step_flags[num_active_threads-1] = stepping_enabled; - add_breakpoint ((int)event.u.CreateThread.lpStartAddress); - } - - break; - - case EXIT_THREAD_DEBUG_EVENT: - if (verbose) - printf ("exit thread %08lx, code=%ld\n", - event.dwThreadId, - event.u.ExitThread.dwExitCode); - - for (src=0, dest=0; src<num_active_threads; src++) - if (active_thread_ids[src] != event.dwThreadId) - { - active_thread_ids[dest] = active_thread_ids[src]; - active_threads[dest] = active_threads[src]; - dest++; - } - num_active_threads = dest; - break; - - case EXCEPTION_DEBUG_EVENT: - rv = GetThreadContext (hThread, &context); - switch (event.u.Exception.ExceptionRecord.ExceptionCode) - { - case STATUS_BREAKPOINT: - if (remove_breakpoint ((int)event.u.Exception.ExceptionRecord.ExceptionAddress)) - { - context.Eip --; - if (!rv) - SetThreadContext (hThread, &context); - if (ReadProcessMemory (hProcess, (void *)context.Esp, &rv, 4, &rv)) - thread_return_address[tix] = rv; - } - set_step_threads (event.dwThreadId, stepping_enabled); - case STATUS_SINGLE_STEP: - opcode_count++; - pc = (unsigned int)event.u.Exception.ExceptionRecord.ExceptionAddress; - sp = (unsigned int)context.Esp; - if (tracing_enabled) - fprintf (tracefile, "%08x %08lx\n", pc, event.dwThreadId); - if (trace_console) - { - printf ("%d %08x\n", tix, pc); - fflush (stdout); - } - - if (dll_counts) - { - int i; - for (i=num_dlls-1; i>=0; i--) - { - if (dll_info[i].base_address < context.Eip) - { - if (hThread == procinfo.hThread) - dll_info[i].pcount++; - else - dll_info[i].scount++; - break; - } - } - } - - if (pc < last_pc || pc > last_pc+10) - { - static int ncalls=0; - static int qq=0; - if (++qq % 100 == 0) - fprintf (stderr, " %08x %d %d \r", - pc, ncalls, opcode_count); - - if (sp == last_sp-4) - { - ncalls++; - store_call_edge (last_pc, pc); - if (last_pc < KERNEL_ADDR && pc > KERNEL_ADDR) - { - int retaddr; - DWORD rv; - ReadProcessMemory (hProcess, - (void *)sp, - (LPVOID)&(retaddr), - 4, &rv); -#if 0 - printf ("call last_pc = %08x pc = %08x rv = %08x\n", - last_pc, pc, retaddr); - /* experimental - try to skip kernel calls for speed */ - add_breakpoint (retaddr); - set_step_threads (event.dwThreadId, 0); -#endif - } - } - } - - total_cycles++; - last_sp = sp; - last_pc = pc; - if (pc >= low_pc && pc < high_pc) - hits[(pc - low_pc)/2] ++; - break; - default: - if (verbose) - { - printf ("exception %ld, ", event.u.Exception.dwFirstChance); - printf ("code: %lx flags: %lx\n", - event.u.Exception.ExceptionRecord.ExceptionCode, - event.u.Exception.ExceptionRecord.ExceptionFlags); - if (event.u.Exception.dwFirstChance == 1) - dump_registers (hThread); - } - contv = DBG_EXCEPTION_NOT_HANDLED; - running = 0; - break; - } - - if (!rv) - { - if (pc == thread_return_address[tix]) - { - if (context.EFlags & 0x100) - { - context.EFlags &= ~0x100; /* TRAP (single step) flag */ - SetThreadContext (hThread, &context); - } - } - else if (stepping_enabled) - { - if (!(context.EFlags & 0x100)) - { - context.EFlags |= 0x100; /* TRAP (single step) flag */ - SetThreadContext (hThread, &context); - } - } - } - break; - - case OUTPUT_DEBUG_STRING_EVENT: - string = (char *)malloc (event.u.DebugString.nDebugStringLength+1); - i = ReadProcessMemory (hProcess, - event.u.DebugString.lpDebugStringData, - (LPVOID)string, - event.u.DebugString.nDebugStringLength, - &rv); - if (!i) - { - printf ("error reading memory: %ld %ld\n", rv, GetLastError ()); - } - if (verbose) - printf ("ODS: %x/%d \"%s\"\n", - (int)hThread, tix, string); - - if (strcmp (string, "ssp on") == 0) - { - stepping_enabled = 1; - set_step_threads (event.dwThreadId, 1); - } - - if (strcmp (string, "ssp off") == 0) - { - stepping_enabled = 0; - set_step_threads (event.dwThreadId, 0); - } - - break; - - - case LOAD_DLL_DEBUG_EVENT: - if (verbose) - printf ("load dll %08x:", - (int)event.u.LoadDll.lpBaseOfDll); - - dll_ptr = (char *)"( u n k n o w n ) \0\0"; - if (event.u.LoadDll.lpImageName) - { - ReadProcessMemory (hProcess, - event.u.LoadDll.lpImageName, - (LPVOID)&src, - sizeof (src), - &rv); - if (src) - { - ReadProcessMemory (hProcess, - (void *)src, - (LPVOID)dll_name, - sizeof (dll_name), - &rv); - dll_name[rv] = 0; - dll_ptr = dll_name; - for (cp=dll_name; *cp; cp++) - { - if (*cp == '\\' || *cp == '/') - { - dll_ptr = cp+1; - } - *cp = tolower (*cp); - } - } - } - - - dll_info[num_dlls].base_address - = (unsigned int)event.u.LoadDll.lpBaseOfDll; - dll_info[num_dlls].pcount = 0; - dll_info[num_dlls].scount = 0; - dll_info[num_dlls].name = wide_strdup (dll_ptr); - if (verbose) - printf (" %s\n", dll_info[num_dlls].name); - num_dlls++; - qsort (dll_info, num_dlls, sizeof (DllInfo), dll_sort); - - break; - - case UNLOAD_DLL_DEBUG_EVENT: - if (verbose) - printf ("unload dll\n"); - break; - - case EXIT_PROCESS_DEBUG_EVENT: - if (verbose) - printf ("process %08lx %08lx exit %ld\n", - event.dwProcessId, event.dwThreadId, - event.u.ExitProcess.dwExitCode); - - running = 0; - break; - } - - set_steps (); - ContinueDebugEvent (event.dwProcessId, event.dwThreadId, contv); - } - - count = 0; - for (pc=low_pc; pc<high_pc; pc+=2) - { - count += hits[(pc - low_pc)/2]; - } - printf ("total cycles: %d, counted cycles: %d\n", total_cycles, count); - - if (tracing_enabled) - fclose (tracefile); - -} - -static void -usage (FILE * stream) -{ - fprintf (stream , "" - "Usage: %s [options] low_pc high_pc command...\n" - "Single-step profile COMMAND\n" - "\n" - " -c, --console-trace trace every EIP value to the console. *Lots* slower.\n" - " -d, --disable disable single-stepping by default; use\n" - " OutputDebugString (\"ssp on\") to enable stepping\n" - " -e, --enable enable single-stepping by default; use\n" - " OutputDebugString (\"ssp off\") to disable stepping\n" - " -h, --help output usage information and exit\n" - " -l, --dll enable dll profiling. A chart of relative DLL usage\n" - " is produced after the run.\n" - " -s, --sub-threads trace sub-threads too. Dangerous if you have\n" - " race conditions.\n" - " -t, --trace-eip trace every EIP value to a file TRACE.SSP. This\n" - " gets big *fast*.\n" - " -v, --verbose output verbose messages about debug events.\n" - " -V, --version output version information and exit\n" - "\n" - "Example: %s 0x401000 0x403000 hello.exe\n" - "\n" - "", prog_name, prog_name); - if (stream == stdout) - fprintf (stream , "" - "SSP - The Single Step Profiler\n" - "\n" - "Original Author: DJ Delorie <dj@redhat.com>\n" - "\n" - "The SSP is a program that uses the Win32 debug API to run a program\n" - "one ASM instruction at a time. It records the location of each\n" - "instruction used, how many times that instruction is used, and all\n" - "function calls. The results are saved in a format that is usable by\n" - "the profiling program \"gprof\", although gprof will claim the values\n" - "are seconds, they really are instruction counts. More on that later.\n" - "\n" - "Because the SSP was originally designed to profile the cygwin DLL, it\n" - "does not automatically select a block of code to report statistics on.\n" - "You must specify the range of memory addresses to keep track of\n" - "manually, but it's not hard to figure out what to specify. Use the\n" - "\"objdump\" program to determine the bounds of the target's \".text\"\n" - "section. Let's say we're profiling cygwin1.dll. Make sure you've\n" - "built it with debug symbols (else gprof won't run) and run objdump\n" - "like this:\n" - "\n" - " objdump -h cygwin1.dll\n" - "\n" - "It will print a report like this:\n" - "\n" - "cygwin1.dll: file format pei-i386\n" - "\n" - "Sections:\n" - "Idx Name Size VMA LMA File off Algn\n" - " 0 .text 0007ea00 61001000 61001000 00000400 2**2\n" - " CONTENTS, ALLOC, LOAD, READONLY, CODE, DATA\n" - " 1 .data 00008000 61080000 61080000 0007ee00 2**2\n" - " CONTENTS, ALLOC, LOAD, DATA\n" - " . . .\n" - "\n" - "The only information we're concerned with are the VMA of the .text\n" - "section and the VMA of the section after it (sections are usually\n" - "contiguous; you can also add the Size to the VMA to get the end\n" - "address). In this case, the VMA is 0x61001000 and the ending address\n" - "is either 0x61080000 (start of .data method) or 0x0x6107fa00 (VMA+Size\n" - "method).\n" - "\n" - "There are two basic ways to use SSP - either profiling a whole\n" - "program, or selectively profiling parts of the program.\n" - "\n" - "To profile a whole program, just run ssp without options. By default,\n" - "it will step the whole program. Here's a simple example, using the\n" - "numbers above:\n" - "\n" - " ssp 0x61001000 0x61080000 hello.exe\n" - "\n" - "This will step the whole program. It will take at least 8 minutes on\n" - "a PII/300 (yes, really). When it's done, it will create a file called\n" - "\"gmon.out\". You can turn this data file into a readable report with\n" - "gprof:\n" - "\n" - " gprof -b cygwin1.dll\n" - "\n" - "The \"-b\" means 'skip the help pages'. You can omit this until you're\n" - "familiar with the report layout. The gprof documentation explains\n" - "a lot about this report, but ssp changes a few things. For example,\n" - "the first part of the report reports the amount of time spent in each\n" - "function, like this:\n" - "\n" - "Each sample counts as 0.01 seconds.\n" - " %% cumulative self self total\n" - " time seconds seconds calls ms/call ms/call name\n" - " 10.02 231.22 72.43 46 1574.57 1574.57 strcspn\n" - " 7.95 288.70 57.48 130 442.15 442.15 strncasematch\n" - "\n" - "The \"seconds\" columns are really CPU opcodes, 1/100 second per opcode.\n" - "So, \"231.22\" above means 23,122 opcodes. The ms/call values are 10x\n" - "too big; 1574.57 means 157.457 opcodes per call. Similar adjustments\n" - "need to be made for the \"self\" and \"children\" columns in the second\n" - "part of the report.\n" - "\n" - "OK, so now we've got a huge report that took a long time to generate,\n" - "and we've identified a spot we want to work on optimizing. Let's say\n" - "it's the time() function. We can use SSP to selectively profile this\n" - "function by using OutputDebugString() to control SSP from within the\n" - "program. Here's a sample program:\n" - "\n" - " #include <windows.h>\n" - " main()\n" - " {\n" - " time_t t;\n" - " OutputDebugString(\"ssp on\");\n" - " time(&t);\n" - " OutputDebugString(\"ssp off\");\n" - " }\n" - "\n" - "Then, add the \"-d\" option to ssp to default to *disabling* profiling.\n" - "The program will run at full speed until the first OutputDebugString,\n" - "then step until the second.\n" - "\n" - " ssp -d 0x61001000 0x61080000 hello.exe\n" - "\n" - "You can then use gprof (as usual) to see the performance profile for\n" - "just that portion of the program's execution.\n" - "\n" - "There are many options to ssp. Since step-profiling makes your\n" - "program run about 1,000 times slower than normal, it's best to\n" - "understand all the options so that you can narrow down the parts\n" - "of your program you need to single-step.\n" - "\n" - "\"-v\" - verbose. This prints messages about threads starting and\n" - "stopping, OutputDebugString calls, DLLs loading, etc.\n" - "\n" - "\"-t\" and \"-c\" - tracing. With -t, *every* step's address is written\n" - "to the file \"trace.ssp\". This can be used to help debug functions,\n" - "since it can trace multiple threads. Clever use of scripts can match\n" - "addresses with disassembled opcodes if needed. Warning: creates\n" - "*huge* files, very quickly. \"-c\" prints each address to the console,\n" - "useful for debugging key chunks of assembler.\n" - "Use \"addr2line -C -f -s -e foo.exe < trace.ssp > lines.ssp\" and then\n" - "\"perl cvttrace\" to convert to symbolic traces.\n" - "\n" - "\"-s\" - subthreads. Usually, you only need to trace the main thread,\n" - "but sometimes you need to trace all threads, so this enables that.\n" - "It's also needed when you want to profile a function that only a\n" - "subthread calls. However, using OutputDebugString automatically\n" - "enables profiling on the thread that called it, not the main thread.\n" - "\n" - "\"-l\" - dll profiling. Generates a pretty table of how much time was\n" - "spent in each dll the program used. No sense optimizing a function in\n" - "your program if most of the time is spent in the DLL.\n" - "\n" - "I usually use the -v, -s, and -l options:\n" - "\n" - " ssp -v -s -l -d 0x61001000 0x61080000 hello.exe\n" - "\n"); - if (stream == stderr) - fprintf (stream, "Try '%s --help' for more information.", prog_name); - exit (stream == stderr ? 1 : 0); -} - -static void -print_version () -{ - const char *v = strchr (version, ':'); - int len; - if (!v) - { - v = "?"; - len = 1; - } - else - { - v += 2; - len = strchr (v, ' ') - v; - } - printf ("\ -%s (cygwin) %.*s\n\ -Single-Step Profiler\n\ -Copyright 2000, 2001, 2002 Red Hat, Inc.\n\ -Compiled on %s\n\ -", prog_name, len, v, __DATE__); -} - -int -main (int argc, char **argv) -{ - int c, i; - int total_pcount = 0, total_scount = 0; - FILE *gmon; - - setbuf (stdout, 0); - - prog_name = strrchr (argv[0], '/'); - if (prog_name == NULL) - prog_name = strrchr (argv[0], '\\'); - if (prog_name == NULL) - prog_name = argv[0]; - else - prog_name++; - - while ((c = getopt_long (argc, argv, opts, longopts, NULL)) != EOF) - switch (c) - { - case 'c': - printf ("tracing *all* $eip to the console\n"); - trace_console = 1; - break; - case 'd': - printf ("stepping disabled; enable via OutputDebugString (\"ssp on\")\n"); - stepping_enabled = 0; - break; - case 'e': - printf ("stepping enabled; disable via OutputDebugString (\"ssp off\")\n"); - stepping_enabled = 1; - break; - case 'h': - usage (stdout); - break; - case 'l': - printf ("profiling dll usage\n"); - dll_counts = 1; - break; - case 's': - printf ("tracing all sub-threads too, not just the main one\n"); - trace_all_threads = 1; - break; - case 't': - printf ("tracing all $eip to trace.ssp\n"); - tracing_enabled = 1; - break; - case 'v': - printf ("verbose messages enabled\n"); - verbose = 1; - break; - case 'V': - print_version (); - exit (0); - default: - usage (stderr); - } - - if ( (argc - optind) < 3 ) - usage (stderr); - sscanf (argv[optind++], "%i", &low_pc); - sscanf (argv[optind++], "%i", &high_pc); - - if (low_pc > high_pc-8) - { - fprintf (stderr, "Hey, low_pc must be lower than high_pc\n"); - exit (1); - } - - hits = (HISTCOUNTER *)malloc (high_pc-low_pc+4); - memset (hits, 0, high_pc-low_pc+4); - - fprintf (stderr, "prun: [%08x,%08x] Running `%s'\n", - low_pc, high_pc, argv[optind]); - - run_program (argv[optind]); - - hdr.lpc = low_pc; - hdr.hpc = high_pc; - hdr.ncnt = high_pc-low_pc + sizeof (hdr); - hdr.version = GMONVERSION; - hdr.profrate = 100; - - gmon = fopen ("gmon.out", "wb"); - fwrite (&hdr, 1, sizeof (hdr), gmon); - fwrite (hits, 1, high_pc-low_pc, gmon); - write_call_edges (gmon); - fclose (gmon); - - if (dll_counts) - { - /* 1234567 123% 1234567 123% 12345678 xxxxxxxxxxx */ - printf (" Main-Thread Other-Thread BaseAddr DLL Name\n"); - - total_pcount = 0; - total_scount = 0; - for (i=0; i<num_dlls; i++) - { - total_pcount += dll_info[i].pcount; - total_scount += dll_info[i].scount; - } - - if (total_pcount == 0) total_pcount++; - if (total_scount == 0) total_scount++; - - for (i=0; i<num_dlls; i++) - if (dll_info[i].pcount || dll_info[i].scount) - { - printf ("%7d %3d%% %7d %3d%% %08x %s\n", - dll_info[i].pcount, - (dll_info[i].pcount*100)/opcode_count, - dll_info[i].scount, - (dll_info[i].scount*100)/opcode_count, - dll_info[i].base_address, - dll_info[i].name); - } - } - - exit (0); -} - diff --git a/winsup/utils/ssp.txt b/winsup/utils/ssp.txt deleted file mode 100644 index e73880e90..000000000 --- a/winsup/utils/ssp.txt +++ /dev/null @@ -1,125 +0,0 @@ - -SSP - The Single Step Profiler - -Original Author: DJ Delorie <dj@redhat.com> - -The SSP is a program that uses the Win32 debug API to run a program -one ASM instruction at a time. It records the location of each -instruction used, how many times that instruction is used, and all -function calls. The results are saved in a format that is usable by -the profiling program "gprof", although gprof will claim the values -are seconds, they really are instruction counts. More on that later. - -Because the SSP was originally designed to profile the cygwin DLL, it -does not automatically select a block of code to report statistics on. -You must specify the range of memory addresses to keep track of -manually, but it's not hard to figure out what to specify. Use the -"objdump" program to determine the bounds of the target's ".text" -section. Let's say we're profiling cygwin1.dll. Make sure you've -built it with debug symbols (else gprof won't run) and run objdump -like this: - - objdump -h cygwin1.dll - -It will print a report like this: - -cygwin1.dll: file format pei-i386 - -Sections: -Idx Name Size VMA LMA File off Algn - 0 .text 0007ea00 61001000 61001000 00000400 2**2 - CONTENTS, ALLOC, LOAD, READONLY, CODE, DATA - 1 .data 00008000 61080000 61080000 0007ee00 2**2 - CONTENTS, ALLOC, LOAD, DATA - . . . - -The only information we're concerned with are the VMA of the .text -section and the VMA of the section after it (sections are usually -contiguous; you can also add the Size to the VMA to get the end -address). In this case, the VMA is 0x61001000 and the ending address -is either 0x61080000 (start of .data method) or 0x0x6107fa00 (VMA+Size -method). - -There are two basic ways to use SSP - either profiling a whole -program, or selectively profiling parts of the program. - -To profile a whole program, just run ssp without options. By default, -it will step the whole program. Here's a simple example, using the -numbers above: - - ssp 0x61001000 0x61080000 hello.exe - -This will step the whole program. It will take at least 8 minutes on -a PII/300 (yes, really). When it's done, it will create a file called -"gmon.out". You can turn this data file into a readable report with -gprof: - - gprof -b cygwin1.dll - -The "-b" means "skip the help pages". You can omit this until you're -familiar with the report layout. The gprof documentation explains -a lot about this report, but ssp changes a few things. For example, -the first part of the report reports the amount of time spent in each -function, like this: - -Each sample counts as 0.01 seconds. - % cumulative self self total - time seconds seconds calls ms/call ms/call name - 10.02 231.22 72.43 46 1574.57 1574.57 strcspn - 7.95 288.70 57.48 130 442.15 442.15 strncasematch - -The "seconds" columns are really CPU opcodes, 1/100 second per opcode. -So, "231.22" above means 23,122 opcodes. The ms/call values are 10x -too big; 1574.57 means 157.457 opcodes per call. Similar adjustments -need to be made for the "self" and "children" columns in the second -part of the report. - -OK, so now we've got a huge report that took a long time to generate, -and we've identified a spot we want to work on optimizing. Let's say -it's the time() function. We can use SSP to selectively profile this -function by using OutputDebugString() to control SSP from within the -program. Here's a sample program: - - #include <windows.h> - main() - { - time_t t; - OutputDebugString("ssp on"); - time(&t); - OutputDebugString("ssp off"); - } - -Then, add the "-d" option to ssp to default to *disabling* profiling. -The program will run at full speed until the first OutputDebugString, -then step until the second. - - ssp -d 0x61001000 0x61080000 hello.exe - -You can then use gprof (as usual) to see the performance profile for -just that portion of the program's execution. - -OK, now for the other ssp options, and when to use them: - -"-v" - verbose. This prints messages about threads starting and -stopping, OutputDebugString calls, DLLs loading, etc. - -"-t" and "-tc" - tracing. With -t, *every* step's address is written -to the file "trace.ssp". This can be used to help debug functions, -since it can trace multiple threads. Clever use of scripts can match -addresses with disassembled opcodes if needed. Warning: creates -*huge* files, very quickly. "-tc" prints each address to the console, -useful for debugging key chunks of assembler. - -"-s" - subthreads. Usually, you only need to trace the main thread, -but sometimes you need to trace all threads, so this enables that. -It's also needed when you want to profile a function that only a -subthread calls. However, using OutputDebugString automatically -enables profiling on the thread that called it, not the main thread. - -"-dll" - dll profiling. Generates a pretty table of how much time was -spent in each dll the program used. No sense optimizing a function in -your program if most of the time is spent in the DLL. - -I usually use the -v, -s, and -dll options: - - ssp -v -s -dll -d 0x61001000 0x61080000 hello.exe diff --git a/winsup/utils/strace.cc b/winsup/utils/strace.cc deleted file mode 100644 index 2d16b69c7..000000000 --- a/winsup/utils/strace.cc +++ /dev/null @@ -1,1012 +0,0 @@ -/* strace.cc - - Copyright 2000, 2001, 2002, 2003, 2004 Red Hat Inc. - - Written by Chris Faylor <cgf@redhat.com> - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#define cygwin_internal cygwin_internal_dontuse -#include <stdio.h> -#include <fcntl.h> -#include <getopt.h> -#include <stdarg.h> -#include <string.h> -#include <stdlib.h> -#include <time.h> -#include <windows.h> -#include <signal.h> -#include <errno.h> -#include "cygwin/include/sys/strace.h" -#include "cygwin/include/sys/cygwin.h" -#include "path.h" -#undef cygwin_internal - -/* GCC runtime library's C++ EH code unfortunately pulls in stdio, and we - get undefine references to __impure_ptr, and hence the following - hack. It should be reasonably safe however as long as this file - is built using -mno-cygwin as is intended. */ -int _impure_ptr; - -/* we *know* we're being built with GCC */ -#define alloca __builtin_alloca - -// Version string. -static const char version[] = "$Revision$"; - -static const char *pgm; -static int forkdebug = 1; -static int numerror = 1; -static int usecs = 1; -static int delta = 1; -static int hhmmss = 0; -static int bufsize = 0; -static int new_window = 0; -static long flush_period = 0; - -static BOOL close_handle (HANDLE h, DWORD ok); - -#define CloseHandle(h) close_handle(h, 0) - -struct child_list -{ - DWORD id; - HANDLE hproc; - int saw_stars; - char nfields; - long long start_time; - DWORD last_usecs; - struct child_list *next; - child_list ():id (0), hproc (NULL), saw_stars (0), nfields (0), - start_time (0), last_usecs (0), next (NULL) - { - } -}; - -child_list children; - -static void -warn (int geterrno, const char *fmt, ...) -{ - va_list args; - char buf[4096]; - - va_start (args, fmt); - sprintf (buf, "%s: ", pgm); - vsprintf (strchr (buf, '\0'), fmt, args); - if (geterrno) - perror (buf); - else - { - fputs (buf, stderr); - fputs ("\n", stderr); - } -} - -static void __attribute__ ((noreturn)) -error (int geterrno, const char *fmt, ...) -{ - va_list args; - char buf[4096]; - - va_start (args, fmt); - sprintf (buf, "%s: ", pgm); - vsprintf (strchr (buf, '\0'), fmt, args); - if (geterrno) - perror (buf); - else - { - fputs (buf, stderr); - fputs ("\n", stderr); - } - exit (1); -} - -DWORD lastid = 0; -HANDLE lasth; - -#define PROCFLAGS \ - PROCESS_ALL_ACCESS /*(PROCESS_DUP_HANDLE | PROCESS_TERMINATE | PROCESS_VM_READ | PROCESS_VM_WRITE) */ -static void -add_child (DWORD id, HANDLE hproc) -{ - child_list *c = children.next; - children.next = (child_list *) calloc (1, sizeof (child_list)); - children.next->next = c; - lastid = children.next->id = id; - lasth = children.next->hproc = hproc; -} - -static child_list * -get_child (DWORD id) -{ - child_list *c; - for (c = &children; (c = c->next) != NULL;) - if (c->id == id) - return c; - - error (0, "no process id %d found", id); -} - -static void -remove_child (DWORD id) -{ - child_list *c; - if (id == lastid) - lastid = 0; - for (c = &children; c->next != NULL; c = c->next) - if (c->next->id == id) - { - child_list *c1 = c->next; - c->next = c1->next; - free (c1); - return; - } - - error (0, "no process id %d found", id); -} - -#define LINE_BUF_CHUNK 128 - -class linebuf -{ - size_t alloc; -public: - size_t ix; - char *buf; - linebuf () - { - ix = 0; - alloc = 0; - buf = NULL; - } - ~linebuf () - { - if (buf) - free (buf); - } - void add (const char *what, int len); - void add (const char *what) - { - add (what, strlen (what)); - } - void prepend (const char *what, int len); -}; - -void -linebuf::add (const char *what, int len) -{ - size_t newix; - if ((newix = ix + len) >= alloc) - { - alloc += LINE_BUF_CHUNK + len; - buf = (char *) realloc (buf, alloc + 1); - } - memcpy (buf + ix, what, len); - ix = newix; - buf[ix] = '\0'; -} - -void -linebuf::prepend (const char *what, int len) -{ - int buflen; - size_t newix; - if ((newix = ix + len) >= alloc) - { - alloc += LINE_BUF_CHUNK + len; - buf = (char *) realloc (buf, alloc + 1); - buf[ix] = '\0'; - } - if ((buflen = strlen (buf))) - memmove (buf + len, buf, buflen + 1); - else - buf[newix] = '\0'; - memcpy (buf, what, len); - ix = newix; -} - -static void -make_command_line (linebuf & one_line, char **argv) -{ - for (; *argv; argv++) - { - char *p = NULL; - const char *a = *argv; - - int len = strlen (a); - if (len != 0 && !(p = strpbrk (a, " \t\n\r\""))) - one_line.add (a, len); - else - { - one_line.add ("\"", 1); - for (; p; a = p, p = strchr (p, '"')) - { - one_line.add (a, ++p - a); - if (p[-1] == '"') - one_line.add ("\"", 1); - } - if (*a) - one_line.add (a); - one_line.add ("\"", 1); - } - one_line.add (" ", 1); - } - - if (one_line.ix) - one_line.buf[one_line.ix - 1] = '\0'; - else - one_line.add ("", 1); -} - -static DWORD child_pid; - -static BOOL WINAPI -ctrl_c (DWORD) -{ - static int tic = 1; - if ((tic ^= 1) && !GenerateConsoleCtrlEvent (CTRL_C_EVENT, 0)) - error (0, "couldn't send CTRL-C to child, win32 error %d\n", - GetLastError ()); - return TRUE; -} - -DWORD (*cygwin_internal) (int, ...); - -static int -load_cygwin () -{ - static HMODULE h; - - if (cygwin_internal) - return 1; - - if (h) - return 0; - - if (!(h = LoadLibrary ("cygwin1.dll"))) - { - errno = ENOENT; - return 0; - } - if (!(cygwin_internal = (DWORD (*) (int, ...)) GetProcAddress (h, "cygwin_internal"))) - { - errno = ENOSYS; - return 0; - } - return 1; -} - -static void -attach_process (pid_t pid) -{ - load_cygwin (); - child_pid = (DWORD) cygwin_internal (CW_CYGWIN_PID_TO_WINPID, pid); - if (!child_pid) - { - warn (0, "no such cygwin pid - %d", pid); - child_pid = pid; - } - - if (!DebugActiveProcess (child_pid)) - error (0, "couldn't attach to pid %d<%d> for debugging", pid, child_pid); - - printf ("Attached to pid %d (windows pid %u)\n", pid, (unsigned) child_pid); - return; -} - - -static void -create_child (char **argv) -{ - linebuf one_line; - - STARTUPINFO si; - PROCESS_INFORMATION pi; - BOOL ret; - DWORD flags; - - *argv = cygpath (*argv, NULL); - memset (&si, 0, sizeof (si)); - si.cb = sizeof (si); - - flags = CREATE_DEFAULT_ERROR_MODE - | (forkdebug ? DEBUG_PROCESS : DEBUG_ONLY_THIS_PROCESS); - if (new_window) - flags |= CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP; - - make_command_line (one_line, argv); - - SetConsoleCtrlHandler (NULL, 0); - ret = CreateProcess (0, one_line.buf, /* command line */ - NULL, /* Security */ - NULL, /* thread */ - TRUE, /* inherit handles */ - flags, /* start flags */ - NULL, NULL, /* current directory */ - &si, &pi); - if (!ret) - error (0, "error creating process %s, (error %d)", *argv, - GetLastError ()); - - CloseHandle (pi.hThread); - CloseHandle (pi.hProcess); - child_pid = pi.dwProcessId; - SetConsoleCtrlHandler (ctrl_c, 1); -} - -static int -output_winerror (FILE *ofile, char *s) -{ - char *winerr = strstr (s, "Win32 error "); - if (!winerr) - return 0; - - DWORD errnum = atoi (winerr + sizeof ("Win32 error ") - 1); - if (!errnum) - return 0; - - /* - * NOTE: Currently there is no policy for how long the - * the buffers are, and looks like 256 is a smallest one - * (dlfcn.cc). Other than error 1395 (length 213) and - * error 1015 (length 249), the rest are all under 188 - * characters, and so I'll use 189 as the buffer length. - * For those longer error messages, FormatMessage will - * return FALSE, and we'll get the old behaviour such as - * ``Win32 error 1395'' etc. - */ - char buf[4096]; - if (!FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM - | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - errnum, - MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) buf, sizeof (buf), NULL)) - return 0; - - /* Get rid the trailing CR/NL pair. */ - char *p = strchr (buf, '\0'); - p[-2] = '\n'; - p[-1] = '\0'; - - *winerr = '\0'; - fputs (s, ofile); - fputs (buf, ofile); - return 1; -} - -static SYSTEMTIME * -syst (long long t) -{ - FILETIME n; - static SYSTEMTIME st; - long long now = t + ((long long) usecs * 10); - n.dwHighDateTime = now >> 32; - n.dwLowDateTime = now & 0xffffffff; - FileTimeToSystemTime (&n, &st); - return &st; -} - -static void __stdcall -handle_output_debug_string (DWORD id, LPVOID p, unsigned mask, FILE *ofile) -{ - int len; - int special; - char alen[3 + 8 + 1]; - DWORD nbytes; - child_list *child = get_child (id); - HANDLE hchild = child->hproc; -#define INTROLEN (sizeof (alen) - 1) - - if (id == lastid && hchild != lasth) - warn (0, "%p != %p", hchild, lasth); - - alen[INTROLEN] = '\0'; - if (!ReadProcessMemory (hchild, p, alen, INTROLEN, &nbytes)) -#ifndef DEBUGGING - return; -#else - error (0, - "couldn't get message length from subprocess %d<%p>, windows error %d", - id, hchild, GetLastError ()); -#endif - - if (strncmp (alen, "cYg", 3)) - return; - len = (int) strtoul (alen + 3, NULL, 16); - if (!len) - return; - - if (len > 0) - special = 0; - else - { - special = len; - if (special == _STRACE_INTERFACE_ACTIVATE_ADDR) - len = 17; - } - - char *buf; - buf = (char *) alloca (len + 65) + 10; - - if (!ReadProcessMemory (hchild, ((char *) p) + INTROLEN, buf, len, &nbytes)) - error (0, "couldn't get message from subprocess, windows error %d", - GetLastError ()); - - buf[len] = '\0'; - char *s = strtok (buf, " "); - - unsigned n = strtoul (s, NULL, 16); - - s = strchr (s, '\0') + 1; - - if (special == _STRACE_INTERFACE_ACTIVATE_ADDR) - { - DWORD new_flag = 1; - if (!WriteProcessMemory (hchild, (LPVOID) n, &new_flag, - sizeof (new_flag), &nbytes)) - error (0, - "couldn't write strace flag to subprocess, windows error %d", - GetLastError ()); - return; - } - - char *origs = s; - - if (mask & n) - /* got it */ ; - else if (!(mask & _STRACE_ALL) || (n & _STRACE_NOTALL)) - return; /* This should not be included in "all" output */ - - DWORD dusecs, usecs; - char *ptusec, *ptrest; - - dusecs = strtoul (s, &ptusec, 10); - char *q = ptusec; - while (*q == ' ') - q++; - if (*q != '[') - { - usecs = strtoul (q, &ptrest, 10); - while (*ptrest == ' ') - ptrest++; - } - else - { - ptrest = q; - ptusec = s; - usecs = dusecs; - } - - if (child->saw_stars == 0) - { - FILETIME st; - char *news; - - GetSystemTimeAsFileTime (&st); - FileTimeToLocalFileTime (&st, &st); - child->start_time = st.dwHighDateTime; - child->start_time <<= 32; - child->start_time |= st.dwLowDateTime; - if (*(news = ptrest) != '[') - child->saw_stars = 2; - else - { - child->saw_stars++; - while ((news = strchr (news, ' ')) != NULL && *++news != '*') - child->nfields++; - if (news == NULL) - child->saw_stars++; - else - { - s = news; - child->nfields++; - } - } - } - else if (child->saw_stars < 2) - { - int i; - char *news; - if (*(news = ptrest) != '[') - child->saw_stars = 2; - else - { - for (i = 0; i < child->nfields; i++) - if ((news = strchr (news, ' ')) == NULL) - break; // Should never happen - else - news++; - - if (news == NULL) - child->saw_stars = 2; - else - { - s = news; - if (*s == '*') - { - SYSTEMTIME *st = syst (child->start_time); - fprintf (ofile, - "Date/Time: %d-%02d-%02d %02d:%02d:%02d\n", - st->wYear, st->wMonth, st->wDay, st->wHour, - st->wMinute, st->wSecond); - child->saw_stars++; - } - } - } - } - - long long d = usecs - child->last_usecs; - char intbuf[40]; - - if (child->saw_stars < 2 || s != origs) - /* Nothing */ ; - else if (hhmmss) - { - s = ptrest - 9; - SYSTEMTIME *st = syst (child->start_time + (long long) usecs * 10); - sprintf (s, "%02d:%02d:%02d", st->wHour, st->wMinute, st->wSecond); - *strchr (s, '\0') = ' '; - } - else if (!delta) - s = ptusec; - else - { - s = ptusec; - sprintf (intbuf, "%5d ", (int) d); - int len = strlen (intbuf); - - memcpy ((s -= len), intbuf, len); - } - - child->last_usecs = usecs; - if (numerror || !output_winerror (ofile, s)) - fputs (s, ofile); - if (!bufsize) - fflush (ofile); -} - -static void -proc_child (unsigned mask, FILE *ofile, pid_t pid) -{ - DEBUG_EVENT ev; - int processes = 0; - time_t cur_time, last_time; - - SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_HIGHEST); - last_time = time (NULL); - while (1) - { - BOOL debug_event = WaitForDebugEvent (&ev, 1000); - DWORD status = DBG_CONTINUE; - - if (bufsize && flush_period > 0 && - (cur_time = time (NULL)) >= last_time + flush_period) - { - last_time = cur_time; - fflush (ofile); - } - - if (!debug_event) - continue; - - if (pid) - { - (void) cygwin_internal (CW_STRACE_TOGGLE, pid); - pid = 0; - } - - switch (ev.dwDebugEventCode) - { - case CREATE_PROCESS_DEBUG_EVENT: - if (ev.u.CreateProcessInfo.hFile) - CloseHandle (ev.u.CreateProcessInfo.hFile); - add_child (ev.dwProcessId, ev.u.CreateProcessInfo.hProcess); - processes++; - break; - - case CREATE_THREAD_DEBUG_EVENT: - break; - - case LOAD_DLL_DEBUG_EVENT: - if (ev.u.LoadDll.hFile) - CloseHandle (ev.u.LoadDll.hFile); - break; - - case OUTPUT_DEBUG_STRING_EVENT: - handle_output_debug_string (ev.dwProcessId, - ev.u.DebugString.lpDebugStringData, - mask, ofile); - break; - - case EXIT_PROCESS_DEBUG_EVENT: - remove_child (ev.dwProcessId); - break; - case EXCEPTION_DEBUG_EVENT: - if (ev.u.Exception.ExceptionRecord.ExceptionCode != - STATUS_BREAKPOINT) - { - status = DBG_EXCEPTION_NOT_HANDLED; -#if 0 - fprintf (stderr, "exception %p at %p\n", - ev.u.Exception.ExceptionRecord.ExceptionCode, - ev.u.Exception.ExceptionRecord.ExceptionAddress); -#endif - } - break; - } - if (!ContinueDebugEvent (ev.dwProcessId, ev.dwThreadId, status)) - error (0, "couldn't continue debug event, windows error %d", - GetLastError ()); - if (ev.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT && --processes == 0) - break; - } -} - -static void -dotoggle (pid_t pid) -{ - load_cygwin (); - child_pid = (DWORD) cygwin_internal (CW_CYGWIN_PID_TO_WINPID, pid); - if (!child_pid) - { - warn (0, "no such cygwin pid - %d", pid); - child_pid = pid; - } - if (cygwin_internal (CW_STRACE_TOGGLE, child_pid)) - error (0, "failed to toggle tracing for process %d<%d>", pid, child_pid); - - return; -} - -static void -dostrace (unsigned mask, FILE *ofile, pid_t pid, char **argv) -{ - if (!pid) - create_child (argv); - else - attach_process (pid); - proc_child (mask, ofile, pid); - - return; -} - -typedef struct tag_mask_mnemonic -{ - unsigned long val; - const char *text; -} -mask_mnemonic; - -static const mask_mnemonic mnemonic_table[] = { - {_STRACE_ALL, "all"}, - {_STRACE_FLUSH, "flush"}, - {_STRACE_INHERIT, "inherit"}, - {_STRACE_UHOH, "uhoh"}, - {_STRACE_SYSCALL, "syscall"}, - {_STRACE_STARTUP, "startup"}, - {_STRACE_DEBUG, "debug"}, - {_STRACE_PARANOID, "paranoid"}, - {_STRACE_TERMIOS, "termios"}, - {_STRACE_SELECT, "select"}, - {_STRACE_WM, "wm"}, - {_STRACE_SIGP, "sigp"}, - {_STRACE_MINIMAL, "minimal"}, - {_STRACE_EXITDUMP, "exitdump"}, - {_STRACE_SYSTEM, "system"}, - {_STRACE_NOMUTEX, "nomutex"}, - {_STRACE_MALLOC, "malloc"}, - {_STRACE_THREAD, "thread"}, - {0, NULL} -}; - -static unsigned long -mnemonic2ul (const char *nptr, char **endptr) -{ - // Look up mnemonic in table, return value. - // *endptr = ptr to char that breaks match. - const mask_mnemonic *mnp = mnemonic_table; - - while (mnp->text != NULL) - { - if (strcmp (mnp->text, nptr) == 0) - { - // Found a match. - if (endptr != NULL) - { - *endptr = ((char *) nptr) + strlen (mnp->text); - } - return mnp->val; - } - mnp++; - } - - // Didn't find it. - if (endptr != NULL) - { - *endptr = (char *) nptr; - } - return 0; -} - -static unsigned long -parse_mask (const char *ms, char **endptr) -{ - const char *p = ms; - char *newp; - unsigned long retval = 0, thisval; - const size_t bufsize = 16; - char buffer[bufsize]; - size_t len; - - while (*p != '\0') - { - // First extract the term, terminate it, and lowercase it. - strncpy (buffer, p, bufsize); - buffer[bufsize - 1] = '\0'; - len = strcspn (buffer, "+,\0"); - buffer[len] = '\0'; - strlwr (buffer); - - // Check if this is a mnemonic. We have to do this first or strtoul() - // will false-trigger on anything starting with "a" through "f". - thisval = mnemonic2ul (buffer, &newp); - if (buffer == newp) - { - // This term isn't mnemonic, check if it's hex. - thisval = strtoul (buffer, &newp, 16); - if (newp != buffer + len) - { - // Not hex either, syntax error. - *endptr = (char *) p; - return 0; - } - } - - p += len; - retval += thisval; - - // Handle operators - if (*p == '\0') - break; - if ((*p == '+') || (*p == ',')) - { - // For now these both equate to addition/ORing. Until we get - // fancy and add things like "all-<something>", all we need do is - // continue the looping. - p++; - continue; - } - else - { - // Syntax error - *endptr = (char *) p; - return 0; - } - } - - *endptr = (char *) p; - return retval; -} - -static void -usage (FILE *where = stderr) -{ - fprintf (where, "\ -Usage: %s [OPTIONS] <command-line>\n\ -Usage: %s [OPTIONS] -p <pid>\n\ -Trace system calls and signals\n\ -\n\ - -b, --buffer-size=SIZE set size of output file buffer\n\ - -d, --no-delta don't display the delta-t microsecond timestamp\n\ - -f, --trace-children trace child processes (toggle - default true)\n\ - -h, --help output usage information and exit\n\ - -m, --mask=MASK set message filter mask\n\ - -n, --crack-error-numbers output descriptive text instead of error\n\ - numbers for Windows errors\n\ - -o, --output=FILENAME set output file to FILENAME\n\ - -p, --pid=n attach to executing program with cygwin pid n\n\ - -S, --flush-period=PERIOD flush buffered strace output every PERIOD secs\n\ - -t, --timestamp use an absolute hh:mm:ss timestamp insted of \n\ - the default microsecond timestamp. Implies -d\n\ - -T, --toggle toggle tracing in a process already being\n\ - traced. Requires -p <pid>\n\ - -v, --version output version information and exit\n\ - -w, --new-window spawn program under test in a new window\n\ -\n", pgm, pgm); - if ( where == stdout) - fprintf (stdout, "\ - MASK can be any combination of the following mnemonics and/or hex values\n\ - (0x is optional). Combine masks with '+' or ',' like so:\n\ -\n\ - --mask=wm+system,malloc+0x00800\n\ -\n\ - Mnemonic Hex Corresponding Def Description\n\ - =========================================================================\n\ - all 0x00001 (_STRACE_ALL) All strace messages.\n\ - flush 0x00002 (_STRACE_FLUSH) Flush output buffer after each message.\n\ - inherit 0x00004 (_STRACE_INHERIT) Children inherit mask from parent.\n\ - uhoh 0x00008 (_STRACE_UHOH) Unusual or weird phenomenon.\n\ - syscall 0x00010 (_STRACE_SYSCALL) System calls.\n\ - startup 0x00020 (_STRACE_STARTUP) argc/envp printout at startup.\n\ - debug 0x00040 (_STRACE_DEBUG) Info to help debugging. \n\ - paranoid 0x00080 (_STRACE_PARANOID) Paranoid info.\n\ - termios 0x00100 (_STRACE_TERMIOS) Info for debugging termios stuff.\n\ - select 0x00200 (_STRACE_SELECT) Info on ugly select internals.\n\ - wm 0x00400 (_STRACE_WM) Trace Windows msgs (enable _strace_wm).\n\ - sigp 0x00800 (_STRACE_SIGP) Trace signal and process handling.\n\ - minimal 0x01000 (_STRACE_MINIMAL) Very minimal strace output.\n\ - exitdump 0x04000 (_STRACE_EXITDUMP) Dump strace cache on exit.\n\ - system 0x08000 (_STRACE_SYSTEM) Serious error; goes to console and log.\n\ - nomutex 0x10000 (_STRACE_NOMUTEX) Don't use mutex for synchronization.\n\ - malloc 0x20000 (_STRACE_MALLOC) Trace malloc calls.\n\ - thread 0x40000 (_STRACE_THREAD) Thread-locking calls.\n\ -"); - if (where == stderr) - fprintf (stderr, "Try '%s --help' for more information.\n", pgm); - exit (where == stderr ? 1 : 0 ); -} - -struct option longopts[] = { - {"buffer-size", required_argument, NULL, 'b'}, - {"help", no_argument, NULL, 'h'}, - {"flush-period", required_argument, NULL, 'S'}, - {"mask", required_argument, NULL, 'm'}, - {"new-window", no_argument, NULL, 'w'}, - {"output", required_argument, NULL, 'o'}, - {"no-delta", no_argument, NULL, 'd'}, - {"pid", required_argument, NULL, 'p'}, - {"timestamp", no_argument, NULL, 't'}, - {"toggle", no_argument, NULL, 'T'}, - {"trace-children", no_argument, NULL, 'f'}, - {"translate-error-numbers", no_argument, NULL, 'n'}, - {"usecs", no_argument, NULL, 'u'}, - {"version", no_argument, NULL, 'v'}, - {NULL, 0, NULL, 0} -}; - -static const char *const opts = "+b:dhfm:no:p:S:tTuvw"; - -static void -print_version () -{ - const char *v = strchr (version, ':'); - int len; - if (!v) - { - v = "?"; - len = 1; - } - else - { - v += 2; - len = strchr (v, ' ') - v; - } - printf ("\ -%s (cygwin) %.*s\n\ -System Trace\n\ -Copyright 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.\n\ -Compiled on %s\n\ -", pgm, len, v, __DATE__); -} - -int -main (int argc, char **argv) -{ - unsigned mask = 0; - FILE *ofile = NULL; - pid_t pid = 0; - int opt; - int toggle = 0; - - if (!(pgm = strrchr (*argv, '\\')) && !(pgm = strrchr (*argv, '/'))) - pgm = *argv; - else - pgm++; - - while ((opt = getopt_long (argc, argv, opts, longopts, NULL)) != EOF) - switch (opt) - { - case 'b': - bufsize = atoi (optarg); - break; - case 'd': - delta ^= 1; - break; - case 'f': - forkdebug ^= 1; - break; - case 'h': - // Print help and exit - usage (stdout); - break; - case 'm': - { - char *endptr; - mask = parse_mask (optarg, &endptr); - if (*endptr != '\0') - { - // Bad mask expression. - error (0, "syntax error in mask expression \"%s\" near \ -character #%d.\n", optarg, (int) (endptr - optarg), endptr); - } - break; - } - case 'n': - numerror ^= 1; - break; - case 'o': - if ((ofile = fopen (cygpath (optarg, NULL), "w")) == NULL) - error (1, "can't open %s", optarg); -#ifdef F_SETFD - (void) fcntl (fileno (ofile), F_SETFD, 0); -#endif - break; - case 'p': - pid = strtoul (optarg, NULL, 10); - break; - case 'S': - flush_period = strtoul (optarg, NULL, 10); - break; - case 't': - hhmmss ^= 1; - break; - case 'T': - toggle ^= 1; - break; - case 'u': - // FIXME: currently unimplemented - usecs ^= 1; - break; - case 'v': - // Print version info and exit - print_version (); - return 0; - case 'w': - new_window ^= 1; - break; - case '?': - fprintf (stderr, "Try '%s --help' for more information.\n", pgm); - exit (1); - } - - if (pid && argv[optind]) - error (0, "cannot provide both a command line and a process id"); - - if (!pid && !argv[optind]) - error (0, "must provide either a command line or a process id"); - - if (toggle && !pid) - error (0, "must provide a process id to toggle tracing"); - - if (!mask) - mask = _STRACE_ALL; - - if (bufsize) - setvbuf (ofile, (char *) alloca (bufsize), _IOFBF, bufsize); - - if (!ofile) - ofile = stdout; - - if (toggle) - dotoggle (pid); - else - dostrace (mask, ofile, pid, argv + optind); -} - -#undef CloseHandle - -static BOOL -close_handle (HANDLE h, DWORD ok) -{ - child_list *c; - for (c = &children; (c = c->next) != NULL;) - if (c->hproc == h && c->id != ok) - error (0, "Closing child handle %p", h); - return CloseHandle (h); -} diff --git a/winsup/utils/umount.cc b/winsup/utils/umount.cc deleted file mode 100644 index bae371ba0..000000000 --- a/winsup/utils/umount.cc +++ /dev/null @@ -1,254 +0,0 @@ -/* umount.cc - - Copyright 1996, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include <stdio.h> -#include <string.h> -#include <sys/mount.h> -#include <mntent.h> -#include <stdlib.h> -#include <errno.h> -#include <getopt.h> - -static void remove_all_mounts (); -static void remove_all_user_mounts (); -static void remove_all_system_mounts (); -static void remove_cygdrive_prefix (int flags); - -static const char version[] = "$Revision$"; -static const char *progname; - -struct option longopts[] = -{ - {"help", no_argument, NULL, 'h' }, - {"remove-all-mounts", no_argument, NULL, 'A'}, - {"remove-cygdrive-prefix", no_argument, NULL, 'c'}, - {"remove-system-mounts", no_argument, NULL, 'S'}, - {"remove-user-mounts", no_argument, NULL, 'U'}, - {"system", no_argument, NULL, 's'}, - {"user", no_argument, NULL, 'u'}, - {"version", no_argument, NULL, 'v'}, - {NULL, 0, NULL, 0} -}; - -char opts[] = "AchsSuUv"; - -static void -usage (FILE *where = stderr) -{ - fprintf (where, "\ -Usage: %s [OPTION] [<posixpath>]\n\ -Unmount filesystems\n\ -\n\ - -A, --remove-all-mounts remove all mounts\n\ - -c, --remove-cygdrive-prefix remove cygdrive prefix\n\ - -h, --help output usage information and exit\n\ - -s, --system remove system mount (default)\n\ - -S, --remove-system-mounts remove all system mounts\n\ - -u, --user remove user mount\n\ - -U, --remove-user-mounts remove all user mounts\n\ - -v, --version output version information and exit\n\ -", progname); - exit (where == stderr ? 1 : 0); -} - -static void -error (const char *path) -{ - fprintf (stderr, "%s: %s: %s\n", progname, path, strerror (errno)); - exit (1); -} - -static void -print_version () -{ - const char *v = strchr (version, ':'); - int len; - if (!v) - { - v = "?"; - len = 1; - } - else - { - v += 2; - len = strchr (v, ' ') - v; - } - printf ("\ -%s (cygwin) %.*s\n\ -Filesystem Utility\n\ -Copyright 1996, 1998, 1999, 2000, 2001, 2002\n\ -Compiled on %s\n\ -", progname, len, v, __DATE__); -} - -int -main (int argc, char **argv) -{ - int i; - int flags = 0; - int default_flag = MOUNT_SYSTEM; - enum do_what - { - nada, - saw_remove_all_mounts, - saw_remove_cygdrive_prefix, - saw_remove_all_system_mounts, - saw_remove_all_user_mounts - } do_what = nada; - - progname = strrchr (argv[0], '/'); - if (progname == NULL) - progname = strrchr (argv[0], '\\'); - if (progname == NULL) - progname = argv[0]; - else - progname++; - - if (argc == 1) - usage (); - - while ((i = getopt_long (argc, argv, opts, longopts, NULL)) != EOF) - switch (i) - { - case 'A': - if (do_what != nada) - usage (); - do_what = saw_remove_all_mounts; - break; - case 'c': - if (do_what != nada) - usage (); - do_what = saw_remove_cygdrive_prefix; - break; - case 'h': - usage (stdout); - case 's': - flags |= MOUNT_SYSTEM; - break; - case 'S': - if (do_what != nada) - usage (); - do_what = saw_remove_all_system_mounts; - break; - case 'u': - flags &= ~MOUNT_SYSTEM; - default_flag = 0; - break; - case 'U': - if (do_what != nada) - usage (); - do_what = saw_remove_all_user_mounts; - break; - case 'v': - print_version (); - exit (0); - default: - usage (); - } - - switch (do_what) - { - case saw_remove_all_mounts: - if (optind != argc) - usage (); - remove_all_mounts (); - break; - case saw_remove_cygdrive_prefix: - if (optind != argc) - usage (); - remove_cygdrive_prefix (flags | default_flag); - break; - case saw_remove_all_system_mounts: - if (optind != argc) - usage (); - remove_all_system_mounts (); - break; - case saw_remove_all_user_mounts: - if (optind != argc) - usage (); - remove_all_user_mounts (); - break; - default: - if (optind != argc - 1) - usage (); - if (cygwin_umount (argv[optind], flags | default_flag) != 0) - error (argv[optind]); - } - - return 0; -} - -/* remove_all_mounts: Unmount all mounts. */ -static void -remove_all_mounts () -{ - remove_all_user_mounts (); - remove_all_system_mounts (); -} - -/* remove_all_user_mounts: Unmount all user mounts. */ -static void -remove_all_user_mounts () -{ - FILE *m = setmntent ("/-not-used-", "r"); - struct mntent *p; - - while ((p = getmntent (m)) != NULL) - { - /* Remove the mount if it's a user mount. */ - if (strncmp (p->mnt_type, "user", 4) == 0 && - strstr (p->mnt_opts, "noumount") == NULL) - { - if (cygwin_umount (p->mnt_dir, 0)) - error (p->mnt_dir); - - /* We've modified the table so we need to start over. */ - endmntent (m); - m = setmntent ("/-not-used-", "r"); - } - } - - endmntent (m); -} - -/* remove_all_system_mounts: Unmount all system mounts. */ -static void -remove_all_system_mounts () -{ - FILE *m = setmntent ("/-not-used-", "r"); - struct mntent *p; - - while ((p = getmntent (m)) != NULL) - { - /* Remove the mount if it's a system mount. */ - if (strncmp (p->mnt_type, "system", 6) == 0 && - strstr (p->mnt_opts, "noumount") == NULL) - { - if (cygwin_umount (p->mnt_dir, MOUNT_SYSTEM)) - error (p->mnt_dir); - - /* We've modified the table so we need to start over. */ - endmntent (m); - m = setmntent ("/-not-used-", "r"); - } - } - - endmntent (m); -} - -/* remove_cygdrive_prefix: Remove cygdrive user or system path prefix. */ -static void -remove_cygdrive_prefix (int flags) -{ - int res = cygwin_umount (NULL, flags | MOUNT_CYGDRIVE); - if (res) - error ("remove_cygdrive_prefix"); - exit (0); -} diff --git a/winsup/utils/utils.sgml b/winsup/utils/utils.sgml deleted file mode 100644 index 87522b3d8..000000000 --- a/winsup/utils/utils.sgml +++ /dev/null @@ -1,1490 +0,0 @@ -<sect1 id="using-utils"><title>Cygwin Utilities</title> - -<para>Cygwin comes with a number of command-line utilities that are -used to manage the UNIX emulation portion of the Cygwin environment. -While many of these reflect their UNIX counterparts, each was written -specifically for Cygwin. You may use the long or short option names -interchangeably; for example, <literal>--help</literal> and -<literal>-h</literal> function identically. All of the Cygwin -command-line utilities support the <literal>--help</literal> and -<literal>--version</literal> options. -</para> - -<sect2 id="cygcheck"><title>cygcheck</title> - -<screen> -Usage: cygcheck [OPTIONS] [PROGRAM...] -Check system information or PROGRAM library dependencies - - -c, --check-setup check packages installed via setup.exe - -d, --dump-only no integrity checking of package contents (requires -c) - -s, --sysinfo system information (not with -k) - -v, --verbose verbose output (indented) (for -[cfls] or programs) - -r, --registry registry search (requires -s) - -k, --keycheck perform a keyboard check session (not with -[scfl]) - -f, --find-package find installed packages containing files (not with -[cl]) - -l, --list-package list the contents of installed packages (not with -[cf]) - -h, --help give help about the info (not with -[cfl]) - -V, --version output version information and exit -</screen> - -<para> -The <command>cygcheck</command> program is a diagnostic utility for -dealing with Cygwin programs. If you are familiar with -<command>dpkg</command> or <command>rpm</command>, -<command>cygcheck</command> is similar in many ways. (The major difference -is that <command>setup.exe</command> handles installing and uninstalling -packages; see <xref linkend="internet-setup"> for more information.) -</para> -<para> -The <literal>-c</literal> option checks the version and status of -installed Cygwin packages. If you specify one or more package names, -<command>cygcheck</command> will limit its output to those packages, -or with no arguments it lists all packages. A package will be marked -<literal>Incomplete</literal> if files originally installed are no longer -present. The best thing to do in that situation is reinstall the package -with <command>setup.exe</command>. To see which files are missing, use the -<literal>-v</literal> option. If you do not need to know the status -of each package and want <command>cygcheck</command> to run faster, add the -<literal>-d</literal> option and <command>cygcheck</command> will only -output the name and version for each package. -</para> -<para> -If you list one or more programs on the command line, -<command>cygcheck</command> will diagnose the runtime environment of that -program or programs, providing the names of DLL files on which the program -depends. If you specify the <literal>-s</literal> option, -<command>cygcheck</command> will give general system information. If you -list one or more programs on the command line and specify -<literal>-s</literal>, <command>cygcheck</command> will report on -both.</para> -<para> -The <literal>-f</literal> option helps you to track down which package a -file came from, and <literal>-l</literal> lists all files in a package. -For example, to find out about <filename>/usr/bin/less</filename> and its -package: -<example><title>Example <command>cygcheck</command> usage</title> -<screen> -$ cygcheck.exe -f /usr/bin/less -less-381-1 - -$ cygcheck.exe -l less -/usr/bin/less.exe -/usr/bin/lessecho.exe -/usr/bin/lesskey.exe -/usr/man/man1/less.1 -/usr/man/man1/lesskey.1 -</screen> -</example> -</para> - -<para>The <literal>-h</literal> option prints additional helpful -messages in the report, at the beginning of each section. It also -adds table column headings. While this is useful information, it also -adds some to the size of the report, so if you want a compact report -or if you know what everything is already, just leave this out.</para> - -<para>The <literal>-v</literal> option causes the output to be more -verbose. What this means is that additional information will be -reported which is usually not interesting, such as the internal -version numbers of DLLs, additional information about recursive DLL -usage, and if a file in one directory in the PATH also occurs in other -directories on the PATH. </para> - -<para>The <literal>-r</literal> option causes -<command>cygcheck</command> to search your registry for information -that is relevent to Cygwin programs. These registry entries are the -ones that have "Cygwin" in the name. If you are paranoid about -privacy, you may remove information from this report, but please keep -in mind that doing so makes it harder to diagnose your problems.</para> - -<para>The <command>cygcheck</command> program should be used to send -information about your system for troubleshooting when requested. -When asked to run this command save the output so that you can email it, -for example:</para> - -<screen> -<prompt>C:\cygwin></prompt> <userinput>cygcheck -s -v -r -h > cygcheck_output.txt</userinput> -</screen> - -</sect2> - -<sect2 id="cygpath"><title>cygpath</title> - -<screen> -Usage: cygpath (-d|-m|-u|-w|-t TYPE) [-c HANDLE] [-f FILE] [options] NAME - cygpath [-ADHPSW] -Convert Unix and Windows format paths, or output system path information - -Output type options: - -d, --dos print DOS (short) form of NAME (C:\PROGRA~1\) - -m, --mixed like --windows, but with regular slashes (C:/WINNT) - -M, --mode report on mode of file (currently binmode or textmode) - -u, --unix (default) print Unix form of NAME (/cygdrive/c/winnt) - -w, --windows print Windows form of NAME (C:\WINNT) - -t, --type TYPE print TYPE form: 'dos', 'mixed', 'unix', or 'windows' -Path conversion options: - -a, --absolute output absolute path - -l, --long-name print Windows long form of NAME (with -w, -m only) - -p, --path NAME is a PATH list (i.e., '/bin:/usr/bin') - -s, --short-name print DOS (short) form of NAME (with -w, -m only) -System information: - -A, --allusers use `All Users' instead of current user for -D, -P - -D, --desktop output `Desktop' directory and exit - -H, --homeroot output `Profiles' directory (home root) and exit - -P, --smprograms output Start Menu `Programs' directory and exit - -S, --sysdir output system directory and exit - -W, --windir output `Windows' directory and exit -</screen> - -<para>The <command>cygpath</command> program is a utility that -converts Windows native filenames to Cygwin POSIX-style pathnames and -vice versa. It can be used when a Cygwin program needs to pass a file -name to a native Windows program, or expects to get a file name from a -native Windows program. Alternatively, <command>cygpath</command> can -output information about the location of important system directories -in either format. -</para> - -<para>The <literal>-u</literal> and <literal>-w</literal> options -indicate whether you want a conversion to UNIX (POSIX) format -(<literal>-u</literal>) or to Windows format (<literal>-w</literal>). -Use the <literal>-d</literal> to get DOS-style (8.3) file and path names. -The <literal>-m</literal> option will output Windows-style format -but with forward slashes instead of backslashes. This option is -especially useful in shell scripts, which use backslashes as an escape -character.</para> - -<para> In combination with the <literal>-w</literal> option, you can use -the <literal>-l</literal> and <literal>-s</literal> options to use normal -(long) or DOS-style (short) form. The <literal>-d</literal> option is -identical to <literal>-w</literal> and <literal>-s</literal> together. -</para> - -<para>Caveat: The <literal>-l</literal> option does not work if the -<emphasis>check_case</emphasis> parameter of <emphasis>CYGWIN</emphasis> -is set to <emphasis>strict</emphasis>, since Cygwin is not able to match -any Windows short path in this mode. -</para> - -<para>The <literal>-p</literal> option means that you want to convert -a path-style string rather than a single filename. For example, the -PATH environment variable is semicolon-delimited in Windows, but -colon-delimited in UNIX. By giving <literal>-p</literal> you are -instructing <command>cygpath</command> to convert between these -formats.</para> - -<para>The <literal>-i</literal> option supresses the print out of the -usage message if no filename argument was given. It can be used in -make file rules converting variables that may be omitted -to a proper format. Note that <command>cygpath</command> output may -contain spaces (C:\Program Files) so should be enclosed in quotes. -</para> - - -<example><title>Example <command>cygpath</command> usage</title> -<screen> -<![CDATA[ -#!/bin/sh -if [ "${1}" = "" ]; - then - XPATH="."; - else - XPATH="$(cygpath -w "${1}")"; -fi -explorer $XPATH & -]]> -</screen> -</example> - -<para>The capital options -<literal>-D</literal>, <literal>-H</literal>, <literal>-P</literal>, -<literal>-S</literal>, and <literal>-W</literal> output directories used -by Windows that are not the same on all systems, for example -<literal>-S</literal> might output C:\WINNT\SYSTEM32 or C:\WINDOWS\SYSTEM. -The <literal>-H</literal> shows the Windows profiles directory that can -be used as root of home. The <literal>-A</literal> option forces use of -the "All Users" directories instead of the current user for the -<literal>-D</literal> and <literal>-P</literal> options. -On Win9x systems with only a single user, <literal>-A</literal> has no -effect; <literal>-D</literal> and <literal>-AD</literal> would have the -same output. By default the output is in UNIX (POSIX) format; -use the <literal>-w</literal> or <literal>-d</literal> options to get -other formats.</para> - -</sect2> - -<sect2 id="dumper"><title>dumper</title> - -<screen> -Usage: dumper [OPTION] FILENAME WIN32PID -Dump core from WIN32PID to FILENAME.core - --d, --verbose be verbose while dumping --h, --help output help information and exit --q, --quiet be quiet while dumping (default) --v, --version output version information and exit -</screen> - -<para>The <command>dumper</command> utility can be used to create a -core dump of running Windows process. This core dump can be later loaded -to <command>gdb</command> and analyzed. One common way to use -<command>dumper</command> is to plug it into cygwin's Just-In-Time -debugging facility by adding - -<screen> -error_start=x:\path\to\dumper.exe -</screen> - -to the <emphasis>CYGWIN</emphasis> environment variable. Please note that -<literal>x:\path\to\dumper.exe</literal> is Windows-style and not cygwin -path. If <literal>error_start</literal> is set this way, then dumper will -be started whenever some program encounters a fatal error. -</para> - -<para> -<command>dumper</command> can be also be started from the command line to -create a core dump of any running process. Unfortunately, because of a Windows -API limitation, when a core dump is created and <command>dumper</command> -exits, the target process is terminated too. -</para> - -<para> -To save space in the core dump, <command>dumper</command> doesn't write those -portions of target process' memory space that are loaded from executable and -dll files and are unchangeable, such as program code and debug info. Instead, -<command>dumper</command> saves paths to files which contain that data. When a -core dump is loaded into gdb, it uses these paths to load appropriate files. -That means that if you create a core dump on one machine and try to debug it on -another, you'll need to place identical copies of the executable and dlls in -the same directories as on the machine where the core dump was created. -</para> - -</sect2> - -<sect2 id="getfacl"><title>getfacl</title> - -<screen> -Usage: getfacl [-adn] FILE [FILE2...] -Display file and directory access control lists (ACLs). - - -a, --all display the filename, the owner, the group, and - the ACL of the file - -d, --dir display the filename, the owner, the group, and - the default ACL of the directory, if it exists - -h, --help output usage information and exit - -n, --noname display user and group IDs instead of names - -v, --version output version information and exit - -When multiple files are specified on the command line, a blank -line separates the ACLs for each file. -</screen> - -<para> -For each argument that is a regular file, special file or -directory, <command>getfacl</command> displays the owner, the group, and the -ACL. For directories <command>getfacl</command> displays additionally the -default ACL. With no options specified, <command>getfacl</command> displays -the filename, the owner, the group, and both the ACL and the default ACL, if -it exists. For more information on Cygwin and Windows ACLs, see -see <Xref Linkend="ntsec"> in the Cygwin User's Guide. -The format for ACL output is as follows: -<screen> - # file: filename - # owner: name or uid - # group: name or uid - user::perm - user:name or uid:perm - group::perm - group:name or gid:perm - mask:perm - other:perm - default:user::perm - default:user:name or uid:perm - default:group::perm - default:group:name or gid:perm - default:mask:perm - default:other:perm -</screen> -</para> -</sect2> - -<sect2 id="kill"><title>kill</title> - -<screen> -Usage: kill [-f] [-signal] [-s signal] pid1 [pid2 ...] - kill -l [signal] -Send signals to processes - - -f, --force force, using win32 interface if necessary - -l, --list print a list of signal names - -s, --signal send signal (use kill --list for a list) - -h, --help output usage information and exit - -v, --version output version information and exit -</screen> - -<para>The <command>kill</command> program allows you to send arbitrary -signals to other Cygwin programs. The usual purpose is to end a -running program from some other window when ^C won't work, but you can -also send program-specified signals such as SIGUSR1 to trigger actions -within the program, like enabling debugging or re-opening log files. -Each program defines the signals they understand.</para> - -<para>You may need to specify the full path to use <command>kill</command> -from within some shells, including <command>bash</command>, the default Cygwin -shell. This is because <command>bash</command> defines a -<command>kill</command> builtin function; see the <command>bash</command> -man page under <emphasis>BUILTIN COMMANDS</emphasis> for more information. -To make sure you are using the Cygwin version, try - -<screen> -$ /bin/kill --version -</screen> - -which should give the Cygwin <command>kill</command> version number and -copyright information. -</para> - -<para>Unless you specific the <literal>-f</literal> option, the "pid" values -used by <command>kill</command> are the Cygwin pids, not the Windows pids. -To get a list of running programs and their Cygwin pids, use the Cygwin -<command>ps</command> program. <command>ps -W</command> will display -<emphasis>all</emphasis> windows pids.</para> - -<para>The <command>kill -l</command> option prints the name of the -given signal, or a list of all signal names if no signal is given.</para> - -<para>To send a specific signal, use the <literal>-signN</literal> -option, either with a signal number or a signal name (minus the "SIG" -part), like these examples:</para> - -<example><title>Using the kill command</title> -<screen> -<prompt>$</prompt> <userinput>kill 123</userinput> -<prompt>$</prompt> <userinput>kill -1 123</userinput> -<prompt>$</prompt> <userinput>kill -HUP 123</userinput> -<prompt>$</prompt> <userinput>kill -f 123</userinput> -</screen> -</example> - -<para>Here is a list of available signals, their numbers, and some -commentary on them, from the file -<literal><sys/signal.h></literal>, which should be considered -the official source of this information.</para> - -<screen> -SIGHUP 1 hangup -SIGINT 2 interrupt -SIGQUIT 3 quit -SIGILL 4 illegal instruction (not reset when caught) -SIGTRAP 5 trace trap (not reset when caught) -SIGABRT 6 used by abort -SIGEMT 7 EMT instruction -SIGFPE 8 floating point exception -SIGKILL 9 kill (cannot be caught or ignored) -SIGBUS 10 bus error -SIGSEGV 11 segmentation violation -SIGSYS 12 bad argument to system call -SIGPIPE 13 write on a pipe with no one to read it -SIGALRM 14 alarm clock -SIGTERM 15 software termination signal from kill -SIGURG 16 urgent condition on IO channel -SIGSTOP 17 sendable stop signal not from tty -SIGTSTP 18 stop signal from tty -SIGCONT 19 continue a stopped process -SIGCHLD 20 to parent on child stop or exit -SIGTTIN 21 to readers pgrp upon background tty read -SIGTTOU 22 like TTIN for output if (tp->t_local&LTOSTOP) -SIGPOLL 23 System V name for SIGIO -SIGXCPU 24 exceeded CPU time limit -SIGXFSZ 25 exceeded file size limit -SIGVTALRM 26 virtual time alarm -SIGPROF 27 profiling time alarm -SIGWINCH 28 window changed -SIGLOST 29 resource lost (eg, record-lock lost) -SIGUSR1 30 user defined signal 1 -SIGUSR2 31 user defined signal 2 -</screen> - -</sect2> - -<sect2 id="mkgroup"><title>mkgroup</title> - -<screen> -Usage: mkgroup [OPTION]... [domain]... -Prints /etc/group file to stdout - -Options: - -l,--local print local group information - -c,--current print current group, if a domain account - -d,--domain print global group information (from current - domain if no domains specified). - -o,--id-offset offset change the default offset (10000) added to gids - in domain accounts. - -s,--no-sids don't print SIDs in pwd field - (this affects ntsec) - -u,--users print user list in gr_mem field - -h,--help print this message - - -v,--version print version information and exit - -One of `-l' or `-d' must be given on NT/W2K. -</screen> - -<para>The <command>mkgroup</command> program can be used to help -configure your Windows system to be more UNIX-like by creating an -initial <filename>/etc/group</filename>. -Its use is essential on the NT series (Windows NT, 2000, and XP) to -include Windows security information. -It can also be used on the Win9x series (Windows 95, 98, and Me) to -create a file with the correct format. -To initially set up your machine if you are a local user, you'd do -something like this:</para> - -<example><title>Setting up the groups file for local accounts</title> -<screen> -<prompt>$</prompt> <userinput>mkdir /etc</userinput> -<prompt>$</prompt> <userinput>mkgroup -l > /etc/group</userinput> -</screen> -</example> - -<para>Note that this information is static. If you change the group -information in your system, you'll need to regenerate the group file -for it to have the new information.</para> - -<para>The <literal>-d</literal> and <literal>-l</literal> options -allow you to specify where the information comes from, the -local machine or the domain (default or given), or both. -With the <literal>-d</literal> option the program contacts the Domain -Controller, which my be unreachable or have restricted access. -An entry for the current domain user can then be created by using the -option <literal>-c</literal> together with <literal>-l</literal>, -but <literal>-c</literal> has no effect when used with <literal>-d</literal>. -The <literal>-o</literal> option allows for special cases -(such as multiple domains) where the GIDs might match otherwise. -The <literal>-s</literal> -option omits the NT Security Identifier (SID). For more information on -SIDs, see <Xref Linkend="ntsec"> in the Cygwin User's Guide. The -<literal>-u</literal> option causes <command>mkgroup</command> to -enumerate the users for each group, placing the group members in the -gr_mem (last) field. Note that this can greatly increase -the time for <command>mkgroup</command> to run in a large domain. -Having gr_mem fields is helpful when a domain user logs in remotely -while the local machine is disconnected from the Domain Controller. -</para> - -</sect2> - -<sect2 id="mkpasswd"><title>mkpasswd</title> - -<screen> -Usage: mkpasswd [OPTION]... [domain]... -Prints /etc/passwd file to stdout - -Options: - -l,--local print local user accounts - -c,--current print current account, if a domain account - -d,--domain print domain accounts (from current domain - if no domains specified) - -o,--id-offset offset change the default offset (10000) added to uids - in domain accounts. - -g,--local-groups print local group information too - if no domains specified - -m,--no-mount don't use mount points for home dir - -s,--no-sids don't print SIDs in GCOS field - (this affects ntsec) - -p,--path-to-home path use specified path and not user account home dir or /home - -u,--username username only return information for the specified user - -h,--help displays this message - -v,--version version information and exit - -One of `-l', `-d' or `-g' must be given on NT/W2K. -</screen> - -<para>The <command>mkpasswd</command> program can be used to help -configure your Windows system to be more UNIX-like by creating an -initial <filename>/etc/passwd</filename> from your system information. -Its use is essential on the NT series (Windows NT, 2000, and XP) to -include Windows security information, but the actual passwords are -determined by Windows, not by the content of <filename>/etc/passwd</filename>. -On the Win9x series (Windows 95, 98, and Me) the password field must be -replaced by the output of <userinput>crypt your_password</userinput> -if remote access is desired. -To initially set up your machine if you are a local user, you'd do -something like this:</para> - -<example><title>Setting up the passwd file for local accounts</title> -<screen> -<prompt>$</prompt> <userinput>mkdir /etc</userinput> -<prompt>$</prompt> <userinput>mkpasswd -l > /etc/passwd</userinput> -</screen> -</example> - -<para>Note that this information is static. If you change the user -information in your system, you'll need to regenerate the passwd file -for it to have the new information.</para> - -<para>The <literal>-d</literal> and <literal>-l</literal> options -allow you to specify where the information comes from, the -local machine or the domain (default or given), or both. -With the <literal>-d</literal> option the program contacts the Domain -Controller, which my be unreachable or have restricted access. -An entry for the current domain user can then be created by using the -option <literal>-c</literal> together with <literal>-l</literal>, -but <literal>-c</literal> has no effect when used with <literal>-d</literal>. -The <literal>-o</literal> option allows for special cases -(such as multiple domains) where the UIDs might match otherwise. -The <literal>-g</literal> option creates a local -user that corresponds to each local group. This is because NT assigns groups -file ownership. The <literal>-m</literal> option bypasses the current -mount table so that, for example, two users who have a Windows home -directory of H: could mount them differently. The <literal>-s</literal> -option omits the NT Security Identifier (SID). For more information on -SIDs, see <Xref Linkend="ntsec"> in the Cygwin User's Guide. The -<literal>-p</literal> option causes <command>mkpasswd</command> to -use the specified prefix instead of the account home dir or <literal>/home/ -</literal>. For example, this command: - -<example><title>Using an alternate home root</title> -<screen> -<prompt>$</prompt> <userinput>mkpasswd -l -p "$(cygpath -H)" > /etc/passwd</userinput> -</screen> -</example> - -would put local users' home directories in the Windows 'Profiles' directory. -On Win9x machines the <literal>-u</literal> option creates an entry for -the specified user. On the NT series it restricts the output to that user, -greatly reducing the amount of time it takes in a large domain.</para> - -</sect2> - -<sect2 id="mount"><title>mount</title> - -<screen> -Usage: mount [OPTION] [<win32path> <posixpath>] -Display information about mounted filesystems, or mount a filesystem - - -b, --binary (default) text files are equivalent to binary files - (newline = \n) - -c, --change-cygdrive-prefix change the cygdrive path prefix to <posixpath> - -f, --force force mount, don't warn about missing mount - point directories - -h, --help output usage information and exit - -m, --mount-commands write mount commands to replace user and - system mount points and cygdrive prefixes - -o, --options X[,X...] specify mount options - -p, --show-cygdrive-prefix show user and/or system cygdrive path prefix - -s, --system (default) add system-wide mount point - -t, --text text files get \r\n line endings - -u, --user add user-only mount point - -v, --version output version information and exit - -x, --executable treat all files under mount point as executables - -E, --no-executable treat all files under mount point as - non-executables - -X, --cygwin-executable treat all files under mount point as cygwin - executables -</screen> - -<para>The <command>mount</command> program is used to map your drives -and shares onto Cygwin's simulated POSIX directory tree, much like as is -done by mount commands on typical UNIX systems. Please see -<Xref Linkend="mount-table"> for more information on the concepts -behind the Cygwin POSIX file system and strategies for using -mounts. To remove mounts, use <command>umount</command></para> - -<sect3><title>Using mount</title> - -<para>If you just type <command>mount</command> with no parameters, it -will display the current mount table for you.</para> - -<example> -<title>Displaying the current set of mount points</title> -<screen> -<prompt>c:\cygwin\></prompt> <userinput>mount</userinput> -c:\cygwin\bin on /usr/bin type system (binmode) -c:\cygwin\lib on /usr/lib type system (binmode) -c:\cygwin on / type system (binmode) -c: on /c type user (binmode,noumount) -d: on /d type user (binmode,noumount) -</screen> -</example> - -<para>In this example, c:\cygwin is the POSIX root and D drive is mapped to -<filename>/d</filename>. Note that in this case, the root mount is a -system-wide mount point that is visible to all users running Cygwin -programs, whereas the <filename>/d</filename> mount is only visible -to the current user.</para> - -<para>The <command>mount</command> utility is also the mechanism for -adding new mounts to the mount table. The following example -demonstrates how to mount the directory -<filename>\\pollux\home\joe\data</filename> to <filename>/data</filename>. -</para> - -<example> -<title>Adding mount points</title> -<screen> -<prompt>c:\cygwin\></prompt> <userinput>ls /data</userinput> -ls: /data: No such file or directory -<prompt>c:\cygwin\></prompt> <userinput>mount \\pollux\home\joe\data /data</userinput> -mount: warning - /data does not exist! -<prompt>c:\cygwin\></prompt> <userinput>mount</userinput> -\\pollux\home\joe\data on /data type sytem (binmode) -c:\cygwin\bin on /usr/bin type system (binmode) -c:\cygwin\lib on /usr/lib type system (binmode) -c:\cygwin on / type system (binmode) -c: on /c type user (binmode,noumount) -d: on /d type user (binmode,noumount) -</screen> -</example> - -<para>Note that <command>mount</command> was invoked from the Windows -command shell in the previous example. In many Unix shells, including -bash, it is legal and convenient to use the forward "/" in Win32 -pathnames since the "\" is the shell's escape character. </para> - -<para>The <literal>-s</literal> flag to <command>mount</command> is used to add a mount -in the system-wide mount table used by all Cygwin users on the system, -instead of the user-specific one. System-wide mounts are displayed -by <command>mount</command> as being of the "system" type, as is the -case for the <filename>/</filename> partition in the last example. -Under Windows NT, only those users with Administrator priviledges are -permitted to modify the system-wide mount table.</para> - -<para>Note that a given POSIX path may only exist once in the user -table and once in the global, system-wide table. Attempts to replace -the mount will fail with a busy error. The <literal>-f</literal> (force) flag causes -the old mount to be silently replaced with the new one. It will also -silence warnings about the non-existence of directories at the Win32 -path location.</para> - -<para>The <literal>-b</literal> flag is used to instruct Cygwin to treat binary and -text files in the same manner by default. Binary mode mounts are -marked as "binmode" in the Flags column of <command>mount</command> -output. By default, mounts are in text mode ("textmode" in the Flags -column).</para> - -<para>Normally, files ending in certain extensions (.exe, .com, .bat, .cmd) -are assumed to be executable. Files whose first two characters begin with -'#!' are also considered to be executable. -The <literal>-x</literal> flag is used to instruct Cygwin that the -mounted file is "executable". If the <literal>-x</literal> flag is used -with a directory then all files in the directory are executable. -This option allows other files to be marked as executable and avoids the -overhead of opening each file to check for a '#!'. The <literal>-X</literal> -option is very similar to <literal>-x</literal>, but also prevents Cygwin -from setting up commands and environment variables for a normal Windows -program, adding another small performance gain. The opposite of these -flags is the <literal>-E</literal> flag, which means that no files should be -marked as executable. </para> - -<para> -The <literal>-m</literal> option causes the <command>mount</command> utility -to output a series of commands that could recreate both user and system mount -points. You can save this output as a backup when experimenting with the -mount table. It also makes moving your settings to a different machine -much easier. -</para> - -<para> -The <literal>-o</literal> option is the method via which various options about -the mount point may be recorded. The following options are available (note that -most of the options are duplicates of other mount flags):</para> - -<screen> - user - mount lives user-specific mount - system - mount lives in system table (default) - binary - files default to binary mode (default) - text - files default to CRLF text mode line endings - exec - files below mount point are all executable - notexec - files below mount point are not executable - cygexec - files below mount point are all cygwin executables - nosuid - no suid files are allowed (currently unimplemented) - managed - directory is managed by cygwin. Mixed case and special - characters in filenames are allowed. -</screen> -</sect3> - -<sect3><title>Cygdrive mount points</title> - -<para>Whenever Cygwin cannot use any of the existing mounts to convert -from a particular Win32 path to a POSIX one, Cygwin will, instead, -convert to a POSIX path using a default mount point: -<filename>/cygdrive</filename>. For example, if Cygwin accesses -<filename>z:\foo</filename> and the z drive is not currently in the -mount table, then <filename>z:\</filename> will be accessible as -<filename>/cygdrive/z</filename>. The <command>mount</command> utility -can be used to change this default automount prefix through the use of the -"--change-cygdrive-prefix" option. In the following example, we will -set the automount prefix to <filename>/</filename>:</para> - -<example> -<title>Changing the default prefix</title> -<screen> -<prompt>c:\cygwin\></prompt> <userinput>mount --change-cygdrive-prefix /</userinput> -</screen> -</example> - -<para>Note that if you set a new prefix in this manner, you can -specify the <literal>-s</literal> flag to make this the system-wide default -prefix. By default, the cygdrive-prefix applies only to the system-wide setting. -You can always see the user and system cygdrive prefixes with the -<literal>-p</literal> option. Using the <literal>-b</literal> -flag with <literal>--change-cygdrive-prefix</literal> makes all new -automounted filesystems default to binary mode file accesses.</para> - -</sect3> - -<sect3><title>Limitations</title> - -<para>Limitations: there is a hard-coded limit of 30 mount -points. Also, although you can mount to pathnames that do not start -with "/", there is no way to make use of such mount points.</para> - -<para>Normally the POSIX mount point in Cygwin is an existing empty -directory, as in standard UNIX. If this is the case, or if there is a -place-holder for the mount point (such as a file, a symbolic link -pointing anywhere, or a non-empty directory), you will get the expected -behavior. Files present in a mount point directory before the mount -become invisible to Cygwin programs. -</para> - -<para>It is sometimes desirable to mount to a non-existent directory, -for example to avoid cluttering the root directory with names -such as -<filename>a</filename>, <filename>b</filename>, <filename>c</filename> -pointing to disks. -Although <command>mount</command> will give you a warning, most -everything will work properly when you refer to the mount point -explicitly. Some strange effects can occur however. -For example if your current working directory is -<filename>/dir</filename>, -say, and <filename>/dir/mtpt</filename> is a mount point, then -<filename>mtpt</filename> will not show up in an <command>ls</command> -or -<command>echo *</command> command and <command>find .</command> will -not -find <filename>mtpt</filename>. -</para> - -</sect3> - -</sect2> - -<sect2 id="passwd"><title>passwd</title> - -<screen> -Usage: passwd [OPTION] [USER] -Change USER's password or password attributes. - -User operations: - -l, --lock lock USER's account. - -u, --unlock unlock USER's account. - -c, --cannot-change USER can't change password. - -C, --can-change USER can change password. - -e, --never-expires USER's password never expires. - -E, --expires USER's password expires according to system's - password aging rule. - -p, --pwd-not-required no password required for USER. - -P, --pwd-required password is required for USER. - -System operations: - -i, --inactive NUM set NUM of days before inactive accounts are disabled - (inactive accounts are those with expired passwords). - -n, --minage DAYS set system minimum password age to DAYS days. - -x, --maxage DAYS set system maximum password age to DAYS days. - -L, --length LEN set system minimum password length to LEN. - -Other options: - -S, --status display password status for USER (locked, expired, - etc.) plus global system password settings. - -h, --help output usage information and exit. - -v, --version output version information and exit. - -If no option is given, change USER's password. If no user name is given, -operate on current user. System operations must not be mixed with user -operations. Don't specify a USER when triggering a system operation. -</screen> - -<para> <command>passwd</command> changes passwords for user accounts. -A normal user may only change the password for their own account, -but administrators may change passwords on any account. -<command>passwd</command> also changes account information, such as -password expiry dates and intervals.</para> - -<para>For password changes, the user is first prompted for their old -password, if one is present. This password is then encrypted and -compared against the stored password. The user has only one chance to -enter the correct password. The administrators are permitted to -bypass this step so that forgotten passwords may be changed.</para> - -<para>The user is then prompted for a replacement password. -<command>passwd</command> will prompt twice for this replacement and -compare the second entry against the first. Both entries are required to -match in order for the password to be changed.</para> - -<para>After the password has been entered, password aging information -is checked to see if the user is permitted to change their password -at this time. If not, <command>passwd</command> refuses to change the -password and exits.</para> - -<para> -To get current password status information, use the -<literal>-S</literal> option. Administrators can use -<command>passwd</command> to perform several account maintenance -functions (users may perform some of these functions on their own -accounts). Accounts may be locked with the <literal>-l</literal> flag -and unlocked with the <literal>-u</literal> flag. Similarly, -<literal>-c</literal> disables a user's ability to change passwords, and -<literal>-C</literal> allows a user to change passwords. For password -expiry, the <literal>-e</literal> option disables expiration, while the -<literal>-E</literal> option causes the password to expire according to -the system's normal aging rules. Use <literal>-p</literal> to disable -the password requirement for a user, or <literal>-P</literal> to require -a password. -</para> - -<para>Administrators can also use <command>passwd</command> to change -system-wide password expiry and length requirements with the -<literal>-i</literal>, <literal>-n</literal>, <literal>-x</literal>, -and <literal>-L</literal> options. The <literal>-i</literal> -option is used to disable an account after the password has been expired -for a number of days. After a user account has had an expired password -for <emphasis>NUM</emphasis> days, the user may no longer sign on to -the account. The <literal>-n</literal> option is -used to set the minimum number of days before a password may be changed. -The user will not be permitted to change the password until -<emphasis>MINDAYS</emphasis> days have elapsed. The -<literal>-x</literal> option is used to set the maximum number of days -a password remains valid. After <emphasis>MAXDAYS</emphasis> days, the -password is required to be changed. Allowed values for the above options -are 0 to 999. The <literal>-L</literal> option sets the minimum length of -allowed passwords for users who don't belong to the administrators group -to <emphasis>LEN</emphasis> characters. Allowed values for the minimum -password length are 0 to 14. In any of the above cases, a value of 0 -means `no restrictions'.</para> - -<para>Limitations: Users may not be able to change their password on -some systems.</para> - -</sect2> - -<sect2 id="ps"><title>ps</title> - -<screen> -Usage: ps [-aefls] [-u UID] -Report process status - - -a, --all show processes of all users - -e, --everyone show processes of all users - -f, --full show process uids, ppids - -h, --help output usage information and exit - -l, --long show process uids, ppids, pgids, winpids - -s, --summary show process summary - -u, --user list processes owned by UID - -v, --version output version information and exit - -W, --windows show windows as well as cygwin processes -With no options, ps outputs the long format by default -</screen> - -<para>The <command>ps</command> program gives the status of all the -Cygwin processes running on the system (ps = "process status"). Due -to the limitations of simulating a POSIX environment under Windows, -there is little information to give. -</para> - -<para> -The PID column is the process ID you need to give to the -<command>kill</command> command. The PPID is the parent process ID, -and PGID is the process group ID. The WINPID column is the process -ID displayed by NT's Task Manager program. The TTY column gives which -pseudo-terminal a process is running on, or a <literal>'?'</literal> -for services. The UID column shows which user owns each process. -STIME is the time the process was started, and COMMAND gives the name -of the program running. -</para> - -<para> -By default <command>ps</command> will only show processes owned by the -current user. With either the <literal>-a</literal> or <literal>-e</literal> -option, all user's processes (and system processes) are listed. There are -historical UNIX reasons for the synonomous options, which are functionally -identical. The <literal>-f</literal> option outputs a "full" listing with -usernames for UIDs. The <literal>-l</literal> option is the default display -mode, showing a "long" listing with all the above columns. The other display -option is <literal>-s</literal>, which outputs a shorter listing of just -PID, TTY, STIME, and COMMAND. The <literal>-u</literal> option allows you -to show only processes owned by a specific user. The <literal>-W</literal> -option causes <command>ps</command> show non-Cygwin Windows processes as -well as Cygwin processes. The WINPID is also the PID, and they can be killed -with the Cygwin <command>kill</command> command's <literal>-f</literal> -option. -</para> - -</sect2> - -<sect2 id="regtool"><title>regtool</title> - -<screen> -Usage: regtool.exe [OPTION] (add | check | get | list | remove | unset) KEY -View or edit the Win32 registry - -Actions: - add KEY\SUBKEY add new SUBKEY - check KEY exit 0 if KEY exists, 1 if not - get KEY\VALUE prints VALUE to stdout - list KEY list SUBKEYs and VALUEs - remove KEY remove KEY - set KEY\VALUE [data ...] set VALUE - unset KEY\VALUE removes VALUE from KEY - -Options for 'list' Action: - -k, --keys print only KEYs - -l, --list print only VALUEs - -p, --postfix like ls -p, appends '\' postfix to KEY names - -Options for 'set' Action: - -e, --expand-string set type to REG_EXPAND_SZ - -i, --integer set type to REG_DWORD - -m, --multi-string set type to REG_MULTI_SZ - -s, --string set type to REG_SZ - -Options for 'set' and 'unset' Actions: - -K<c>, --key-separator[=]<c> set key separator to <c> instead of '\' - -Other Options: - -h, --help output usage information and exit - -q, --quiet no error output, just nonzero return if KEY/VALUE missing - -v, --verbose verbose output, including VALUE contents when applicable - -V, --version output version information and exit - -KEY is in the format [host]\prefix\KEY\KEY\VALUE, where host is optional -remote host in either \\hostname or hostname: format and prefix is any of: - root HKCR HKEY_CLASSES_ROOT (local only) - config HKCC HKEY_CURRENT_CONFIG (local only) - user HKCU HKEY_CURRENT_USER (local only) - machine HKLM HKEY_LOCAL_MACHINE - users HKU HKEY_USERS - -You can use forward slash ('/') as a separator instead of backslash, in -that case backslash is treated as escape character -Example: regtool.exe get '\user\software\Microsoft\Clock\iFormat' -</screen> - -<para>The <command>regtool</command> program allows shell scripts -to access and modify the Windows registry. Note that modifying the -Windows registry is dangerous, and carelessness here can result -in an unusable system. Be careful.</para> - -<para>The <literal>-v</literal> option means "verbose". For most -commands, this causes additional or lengthier messages to be printed. -Conversely, the <literal>-q</literal> option supresses error messages, -so you can use the exit status of the program to detect if a key -exists or not (for example).</para> - -<para>You must provide <command>regtool</command> with an -<emphasis>action</emphasis> following options (if any). Currently, -the action must be <literal>add</literal>, <literal>set</literal>, -<literal>check</literal>, <literal>get</literal>, <literal>list</literal>, -<literal>remove</literal>, <literal>set</literal>, or <literal>unset</literal>. -</para> - -<para>The <literal>add</literal> action adds a new key. The -<literal>check</literal> action checks to see if a key exists (the -exit code of the program is zero if it does, nonzero if it does not). -The <literal>get</literal> action gets the value of a value of a key, -and prints it (and nothing else) to stdout. Note: if the value -doesn't exist, an error message is printed and the program returns a -non-zero exit code. If you give <literal>-q</literal>, it doesn't -print the message but does return the non-zero exit code.</para> - -<para> -The <literal>list</literal> action lists the subkeys and values -belonging to the given key. With <literal>list</literal>, the -<literal>-k</literal> option instructs <command>regtool</command> -to print only KEYs, and the <literal>-l</literal> option to print -only VALUEs. The <literal>-p</literal> option postfixes a -<literal>'/'</literal> to each KEY, but leave VALUEs with no -postfix. The <literal>remove</literal> action -removes a key. Note that you may need to remove everything in the key -before you may remove it, but don't rely on this stopping you from -accidentally removing too much. -</para> - -<para>The <literal>set</literal> action sets a value within a key. -<literal>-e</literal> means it's an expanding string (REG_EXPAND_SZ) -that contains embedded environment variables. -<literal>-i</literal> means the value is an integer (REG_DWORD). -<literal>-m</literal> means it's a multi-string (REG_MULTI_SZ). -<literal>-s</literal> means the value is a string (REG_SZ). -If you don't specify one of these, <command>regtool</command> tries to -guess the type based on the value you give. If it looks like a -number, it's a DWORD. If it starts with a percent, it's an expanding -string. If you give multiple values, it's a multi-string. Else, it's -a regular string. -The <literal>unset</literal> action removes a value from a key. -</para> - -<para> -By default, the last "\" or "/" is assumed to be the separator between the -key and the value. You can use the <literal>-K</literal> option to provide -an alternate key/value separator character. -</para> - -</sect2> - -<sect2 id="setfacl"><title>setfacl</title> - -<screen> -Usage: setfacl [-r] (-f ACL_FILE | -s acl_entries) FILE... - setfacl [-r] ([-d acl_entries] [-m acl_entries]) FILE... -Modify file and directory access control lists (ACLs) - - -d, --delete delete one or more specified ACL entries - -f, --file set ACL entries for FILE to ACL entries read - from a ACL_FILE - -m, --modify modify one or more specified ACL entries - -r, --replace replace mask entry with maximum permissions - needed for the file group class - -s, --substitute substitute specified ACL entries for the - ACL of FILE - -h, --help output usage information and exit - -v, --version output version information and exit - -At least one of (-d, -f, -m, -s) must be specified -</screen> - -<para> -For each file given as parameter, <command>setfacl</command> will -either replace its complete ACL (<literal>-s</literal>, <literal>-f</literal>), -or it will add, modify, or delete ACL entries. -For more information on Cygwin and Windows ACLs, see -see <Xref Linkend="ntsec"> in the Cygwin User's Guide. -</para> - -<para> -Acl_entries are one or more comma-separated ACL entries -from the following list: -<screen> - u[ser]::perm - u[ser]:uid:perm - g[roup]::perm - g[roup]:gid:perm - m[ask]::perm - o[ther]::perm -</screen> -Default entries are like the above with the additional -default identifier. For example: -<screen> - d[efault]:u[ser]:uid:perm -</screen> -</para> - -<para> -<emphasis>perm</emphasis> is either a 3-char permissions string in the form -"rwx" with the character <literal>'-'</literal> for no permission -or it is the octal representation of the permissions, a -value from 0 (equivalent to "---") to 7 ("rwx"). -<emphasis>uid</emphasis> is a user name or a numerical uid. -<emphasis>gid</emphasis> is a group name or a numerical gid. -</para> - -<para> -The following options are supported: -</para> - -<para> -<literal>-d</literal> -Delete one or more specified entries from the file's ACL. -The owner, group and others entries must not be deleted. -Acl_entries to be deleted should be specified without -permissions, as in the following list: -<screen> - u[ser]:uid - g[roup]:gid - d[efault]:u[ser]:uid - d[efault]:g[roup]:gid - d[efault]:m[ask]: - d[efault]:o[ther]: -</screen> -</para> - -<para> -<literal>-f</literal> -Take the Acl_entries from ACL_FILE one per line. Whitespace -characters are ignored, and the character "#" may be used -to start a comment. The special filename "-" indicates -reading from stdin. Note that you can use this with -<command>getfacl</command> and <command>setfacl</command> to copy -ACLs from one file to another: -<screen> -$ getfacl source_file | setfacl -f - target_file -</screen> -</para> - -<para> -Required entries are: -one user entry for the owner of the file, -one group entry for the group of the file, and -one other entry. -</para> - -<para> -If additional user and group entries are given: -a mask entry for the file group class of the file, and -no duplicate user or group entries with the same uid/gid. -</para> - -<para> -If it is a directory: -one default user entry for the owner of the file, -one default group entry for the group of the file, -one default mask entry for the file group class, and -one default other entry. -</para> - -<para> -<literal>-m</literal> -Add or modify one or more specified ACL entries. Acl_entries is a -comma-separated list of entries from the same list as above. -</para> - -<para> -<literal>-r</literal> -Causes the permissions specified in the mask -entry to be ignored and replaced by the maximum permissions needed for -the file group class. -</para> - -<para> -<literal>-s</literal> -Like <literal>-f</literal>, but substitute the -file's ACL with Acl_entries specified in a comma-separated list on the -command line. -</para> - -<para> -While the <literal>-d</literal> and <literal>-m</literal> options may be used -in the same command, the <literal>-f</literal> and <literal>-s</literal> -options may be used only exclusively. -</para> - -<para> -Directories may contain default ACL entries. Files created -in a directory that contains default ACL entries will have -permissions according to the combination of the current umask, -the explicit permissions requested and the default ACL entries -</para> - -<para> -Limitations: Under Cygwin, the default ACL entries are not taken into -account currently. -</para> - -</sect2> - -<sect2 id="ssp"><title>ssp</title> - -<screen> -Usage: ssp [options] low_pc high_pc command... -Single-step profile COMMAND - - -c, --console-trace trace every EIP value to the console. *Lots* slower. - -d, --disable disable single-stepping by default; use - OutputDebugString ("ssp on") to enable stepping - -e, --enable enable single-stepping by default; use - OutputDebugString ("ssp off") to disable stepping - -h, --help output usage information and exit - -l, --dll enable dll profiling. A chart of relative DLL usage - is produced after the run. - -s, --sub-threads trace sub-threads too. Dangerous if you have - race conditions. - -t, --trace-eip trace every EIP value to a file TRACE.SSP. This - gets big *fast*. - -v, --verbose output verbose messages about debug events. - -V, --version output version information and exit - -Example: ssp 0x401000 0x403000 hello.exe -</screen> - -<para> -SSP - The Single Step Profiler -</para> - -<para> -Original Author: DJ Delorie -</para> - -<para> -The SSP is a program that uses the Win32 debug API to run a program -one ASM instruction at a time. It records the location of each -instruction used, how many times that instruction is used, and all -function calls. The results are saved in a format that is usable by -the profiling program <command>gprof</command>, although -<command>gprof</command> will claim the values -are seconds, they really are instruction counts. More on that later. -</para> - -<para> -Because the SSP was originally designed to profile the cygwin DLL, it -does not automatically select a block of code to report statistics on. -You must specify the range of memory addresses to keep track of -manually, but it's not hard to figure out what to specify. Use the -"objdump" program to determine the bounds of the target's ".text" -section. Let's say we're profiling cygwin1.dll. Make sure you've -built it with debug symbols (else <command>gprof</command> won't run) -and run objdump like this: - -<screen> -$ objdump -h cygwin1.dll -</screen> - -It will print a report like this: -<screen> -cygwin1.dll: file format pei-i386 - -Sections: -Idx Name Size VMA LMA File off Algn - 0 .text 0007ea00 61001000 61001000 00000400 2**2 - CONTENTS, ALLOC, LOAD, READONLY, CODE, DATA - 1 .data 00008000 61080000 61080000 0007ee00 2**2 - CONTENTS, ALLOC, LOAD, DATA - . . . -</screen> -</para> - -<para> -The only information we're concerned with are the VMA of -the .text section and the VMA of the section after it -(sections are usually contiguous; you can also add the -Size to the VMA to get the end address). In this case, -the VMA is 0x61001000 and the ending address is either -0x61080000 (start of .data method) or 0x0x6107fa00 (VMA+Size -method). -</para> - -<para> -There are two basic ways to use SSP - either profiling a whole -program, or selectively profiling parts of the program. -</para> - -<para> -To profile a whole program, just run <command>ssp</command> without options. -By default, it will step the whole program. Here's a simple example, using -the numbers above: - -<screen> -$ ssp 0x61001000 0x61080000 hello.exe -</screen> - -This will step the whole program. It will take at least 8 minutes on -a PII/300 (yes, really). When it's done, it will create a file called -"gmon.out". You can turn this data file into a readable report with -<command>gprof</command>: - -<screen> -$ gprof -b cygwin1.dll -</screen> - -The "-b" means 'skip the help pages'. You can omit this until you're -familiar with the report layout. The <command>gprof</command> documentation -explains a lot about this report, but <command>ssp</command> changes a few -things. For example, the first part of the report reports the amount of time -spent in each function, like this: - -<screen> -Each sample counts as 0.01 seconds. - % cumulative self self total - time seconds seconds calls ms/call ms/call name - 10.02 231.22 72.43 46 1574.57 1574.57 strcspn - 7.95 288.70 57.48 130 442.15 442.15 strncasematch -</screen> - -The "seconds" columns are really CPU opcodes, 1/100 second per opcode. -So, "231.22" above means 23,122 opcodes. The ms/call values are 10x -too big; 1574.57 means 157.457 opcodes per call. Similar adjustments -need to be made for the "self" and "children" columns in the second -part of the report. -</para> - -<para> -OK, so now we've got a huge report that took a long time to generate, -and we've identified a spot we want to work on optimizing. Let's say -it's the time() function. We can use SSP to selectively profile this -function by using OutputDebugString() to control SSP from within the -program. Here's a sample program: - -<screen> - #include <windows.h> - main() - { - time_t t; - OutputDebugString("ssp on"); - time(&t); - OutputDebugString("ssp off"); - } -</screen> -</para> - -<para> -Then, add the <literal>-d</literal> option to ssp to default to -*disabling* profiling. The program will run at full speed until the first -OutputDebugString, then step until the second. -You can then use <command>gprof</command> (as usual) to see the performance -profile for just that portion of the program's execution. -</para> - -<para> -There are many options to ssp. Since step-profiling makes your -program run about 1,000 times slower than normal, it's best to -understand all the options so that you can narrow down the parts -of your program you need to single-step. -</para> - -<para> -<literal>-v</literal> - verbose. This prints messages about threads -starting and stopping, OutputDebugString calls, DLLs loading, etc. -</para> - -<para> -<literal>-t</literal> and <literal>-c</literal> - tracing. -With <literal>-t</literal>, *every* step's address is written -to the file "trace.ssp". This can be used to help debug functions, -since it can trace multiple threads. Clever use of scripts can match -addresses with disassembled opcodes if needed. Warning: creates -*huge* files, very quickly. <literal>-c</literal> prints each address to -the console, useful for debugging key chunks of assembler. Use -<literal>addr2line -C -f -s -e foo.exe < trace.ssp > lines.ssp</literal> -and then <literal>perl cvttrace</literal> to convert to symbolic traces. -</para> - -<para> -<literal>-s</literal> - subthreads. Usually, you only need to trace the -main thread, but sometimes you need to trace all threads, so this enables that. -It's also needed when you want to profile a function that only a -subthread calls. However, using OutputDebugString automatically -enables profiling on the thread that called it, not the main thread. -</para> - -<para> -<literal>-l</literal> - dll profiling. Generates a pretty table of how much -time was spent in each dll the program used. No sense optimizing a function in -your program if most of the time is spent in the DLL. -I usually use the <literal>-v</literal>, <literal>-s</literal>, and -<literal>-l</literal> options: - -<screen> -$ ssp <literal>-v</literal> <literal>-s</literal> <literal>-l</literal> <literal>-d</literal> 0x61001000 0x61080000 hello.exe -</screen> -</para> -</sect2> - -<sect2 id="strace"><title>strace</title> - -<screen> -Usage: strace.exe [OPTIONS] <command-line> -Usage: strace.exe [OPTIONS] -p <pid> -Trace system calls and signals - - -b, --buffer-size=SIZE set size of output file buffer - -d, --no-delta don't display the delta-t microsecond timestamp - -f, --trace-children trace child processes (toggle - default true) - -h, --help output usage information and exit - -m, --mask=MASK set message filter mask - -n, --crack-error-numbers output descriptive text instead of error - numbers for Windows errors - -o, --output=FILENAME set output file to FILENAME - -p, --pid=n attach to executing program with cygwin pid n - -S, --flush-period=PERIOD flush buffered strace output every PERIOD secs - -t, --timestamp use an absolute hh:mm:ss timestamp insted of - the default microsecond timestamp. Implies -d - -T, --toggle toggle tracing in a process already being - traced. Requires -p <pid> - -v, --version output version information and exit - -w, --new-window spawn program under test in a new window - - MASK can be any combination of the following mnemonics and/or hex values - (0x is optional). Combine masks with '+' or ',' like so: - - --mask=wm+system,malloc+0x00800 - - Mnemonic Hex Corresponding Def Description - ========================================================================= - all 0x00001 (_STRACE_ALL) All strace messages. - flush 0x00002 (_STRACE_FLUSH) Flush output buffer after each message. - inherit 0x00004 (_STRACE_INHERIT) Children inherit mask from parent. - uhoh 0x00008 (_STRACE_UHOH) Unusual or weird phenomenon. - syscall 0x00010 (_STRACE_SYSCALL) System calls. - startup 0x00020 (_STRACE_STARTUP) argc/envp printout at startup. - debug 0x00040 (_STRACE_DEBUG) Info to help debugging. - paranoid 0x00080 (_STRACE_PARANOID) Paranoid info. - termios 0x00100 (_STRACE_TERMIOS) Info for debugging termios stuff. - select 0x00200 (_STRACE_SELECT) Info on ugly select internals. - wm 0x00400 (_STRACE_WM) Trace Windows msgs (enable _strace_wm). - sigp 0x00800 (_STRACE_SIGP) Trace signal and process handling. - minimal 0x01000 (_STRACE_MINIMAL) Very minimal strace output. - exitdump 0x04000 (_STRACE_EXITDUMP) Dump strace cache on exit. - system 0x08000 (_STRACE_SYSTEM) Serious error; goes to console and log. - nomutex 0x10000 (_STRACE_NOMUTEX) Don't use mutex for synchronization. - malloc 0x20000 (_STRACE_MALLOC) Trace malloc calls. - thread 0x40000 (_STRACE_THREAD) Thread-locking calls. -</screen> - -<para>The <command>strace</command> program executes a program, and -optionally the children of the program, reporting any Cygwin DLL output -from the program(s) to stdout, or to a file with the <literal>-o</literal> -option. With the <literal>-w</literal> option, you can start an strace -session in a new window, for example: - -<screen> -$ strace -o tracing_output -w sh -c 'while true; do echo "tracing..."; done' & -</screen> -This is particularly useful for <command>strace</command> sessions that -take a long time to complete. -</para> - -<para> -Note that <command>strace</command> is a standalone Windows program and so does -not rely on the Cygwin DLL itself (you can verify this with -<command>cygcheck</command>). As a result it does not understand POSIX -pathnames or symlinks. This program is mainly useful for debugging the -Cygwin DLL itself.</para> - -</sect2> - -<sect2 id="umount"><title>umount</title> - -<screen> -Usage: umount.exe [OPTION] [<posixpath>] -Unmount filesystems - - -A, --remove-all-mounts remove all mounts - -c, --remove-cygdrive-prefix remove cygdrive prefix - -h, --help output usage information and exit - -s, --system remove system mount (default) - -S, --remove-system-mounts remove all system mounts - -u, --user remove user mount - -U, --remove-user-mounts remove all user mounts - -v, --version output version information and exit -</screen> - -<para>The <command>umount</command> program removes mounts from the -mount table. If you specify a POSIX path that corresponds to a -current mount point, <command>umount</command> will remove it from the -system registry area. (Administrator priviledges are required). -The <literal>-u</literal> flag may be used to specify removing the mount -from the user-specific registry area instead.</para> - -<para>The <command>umount</command> utility may also be used to remove -all mounts of a particular type. With the extended options it is -possible to remove all mounts (<literal>-A</literal>), all -cygdrive automatically-mounted mounts (<literal>-c</literal>), all -mounts in the current user's registry area (<literal>-U</literal>), -or all mounts in the system-wide registry area (<literal>-S</literal>) -(with Administrator privileges).</para> - -<para>See <Xref Linkend="mount"> for more information on the mount -table.</para> -</sect2> - -</sect1> |