diff options
Diffstat (limited to 'winsup/utils/cygwin.cc')
-rw-r--r-- | winsup/utils/cygwin.cc | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/winsup/utils/cygwin.cc b/winsup/utils/cygwin.cc new file mode 100644 index 0000000..1fba787 --- /dev/null +++ b/winsup/utils/cygwin.cc @@ -0,0 +1,126 @@ +/* cygwin.cc: general system debugging tool. + + Copyright 1996, 1998 Cygnus Solutions. + +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. */ + +/* This program is intended to be a general tool for debugging cygwin. + Possibilities include + - dumping various internal data structures + - poking various values into system tables + - turning on strace'ing for arbitrary tasks + */ + +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <getopt.h> +#include <windows.h> +#include "winsup.h" + +static char *prog_name; + +static void +usage (FILE *stream, int status) +{ + fprintf (stream, "\ +Usage: %s \\\n\ + [-s|--strace pid mask]\\\n\ + [-H|--help] [-V|--version]\n\ +", + prog_name); + exit (status); +} + +static struct option long_options[] = +{ + { "version", no_argument, NULL, 'V' }, + { "help", no_argument, NULL, 'H' }, + { "strace", required_argument, NULL, 's' }, + { 0, no_argument, 0, 0 } +}; + +struct strace_args +{ + int pid; + int mask; + char *fn; +}; + +/* Turn on strace'ing for the indicated pid. */ + +static void +set_strace (strace_args *args) +{ + shared_info *s = cygwin_getshared (); + + pinfo *p = s->p[args->pid]; + + if (!p) + { + fprintf (stderr, "%s: process %d not found\n", prog_name, args->pid); + exit (1); + } + + p->strace_mask = args->mask; +} + +int +main (int argc, char *argv[]) +{ + int c; + int seen_flag_p = 0; + int show_version_p = 0; + int set_strace_p = 0; + strace_args strace_args; + + prog_name = strrchr (argv[0], '/'); + if (prog_name == NULL) + prog_name = strrchr (argv[0], '\\'); + if (prog_name == NULL) + prog_name = argv[0]; + + while ((c = getopt_long (argc, argv, "HVs:", long_options, (int *) 0)) + != EOF) + { + seen_flag_p = 1; + + switch (c) + { + case 'H': + usage (stdout, 0); + break; + case 'V': + show_version_p = 1; + break; + case 's': + if (optind + 1 > argc) + usage (stderr, 1); + strace_args.pid = atoi (optarg); + if (optind < argc) + strace_args.mask = atoi (argv[optind++]); + if (optind < argc) + strace_args.fn = argv[optind++]; + set_strace_p = 1; + break; + default: + usage (stderr, 1); + break; + } + } + + if (show_version_p) + printf ("CYGWIN version ???\n"); + + if (!seen_flag_p || optind != argc) + usage (stderr, 1); + + if (set_strace_p) + set_strace (&strace_args); + + return 0; +} |