summaryrefslogtreecommitdiff
path: root/winsup/utils/cygwin.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/utils/cygwin.cc')
-rw-r--r--winsup/utils/cygwin.cc126
1 files changed, 126 insertions, 0 deletions
diff --git a/winsup/utils/cygwin.cc b/winsup/utils/cygwin.cc
new file mode 100644
index 00000000000..1fba787fe5b
--- /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;
+}