newlib/winsup/utils/cygwin.cc
2000-02-17 19:38:31 +00:00

127 lines
2.4 KiB
C++

/* 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;
}