From 54294bb9abc37dd4230c358d71249ed8cd8e20de Mon Sep 17 00:00:00 2001 From: sef Date: Sat, 6 Dec 1997 04:19:09 +0000 Subject: First checkin of the procctl program. --- usr.sbin/procctl/Makefile | 5 +++++ usr.sbin/procctl/procctl.8 | 29 ++++++++++++++++++++++++ usr.sbin/procctl/procctl.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 usr.sbin/procctl/Makefile create mode 100644 usr.sbin/procctl/procctl.8 create mode 100644 usr.sbin/procctl/procctl.c (limited to 'usr.sbin/procctl') diff --git a/usr.sbin/procctl/Makefile b/usr.sbin/procctl/Makefile new file mode 100644 index 0000000..ceb3df3 --- /dev/null +++ b/usr.sbin/procctl/Makefile @@ -0,0 +1,5 @@ +PROG= procctl +LDFLAGS += -static + +.include + diff --git a/usr.sbin/procctl/procctl.8 b/usr.sbin/procctl/procctl.8 new file mode 100644 index 0000000..8af32da --- /dev/null +++ b/usr.sbin/procctl/procctl.8 @@ -0,0 +1,29 @@ +.Dd Nov 23, 1997 +.Dt PROCCTL 1 +.Os FreeBSD +.Sh NAME +.Nm \&procctl +.Nd clear procfs event flags +.Sh Synopsis +.Nm \&procctl +.Ar command +.Ar [...] +.Sh DESCRIPTION +.Nm \&procctl +clears the +.Xr procfs 5 +event mask used by +.Xr truss 1 . +This can be used in the event that a process is left stranded, since +the +.Xr procfs 5 +events result in a non-killable process. +The options are a list of process ID's; +.Nm \&procctl +goes through the list and clears the event masks for each specified process. +.Xr truss 1 , +.Xr procfs 5 +.Sh HISTORY +The +.Nm procctl +command was written by Sean Eric Fagan for FreeBSD. diff --git a/usr.sbin/procctl/procctl.c b/usr.sbin/procctl/procctl.c new file mode 100644 index 0000000..2578c47 --- /dev/null +++ b/usr.sbin/procctl/procctl.c @@ -0,0 +1,55 @@ +/* + * procctl -- clear the event mask, and continue, any specified processes. + * This is largely an example of how to use the procfs interface; however, + * for now, it is also sometimes necessary, as a stopped process will not + * otherwise continue. (This will be fixed in a later version of the + * procfs code, almost certainly; however, this program will still be useful + * for some annoying circumstances.) + */ +/* + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +main(int ac, char **av) { + int fd; + int i; + unsigned int mask; + char **command; + struct procfs_status pfs; + + for (i = 1; i < ac; i++) { + char buf[32]; + + sprintf(buf, "/proc/%s/mem", av[i]); + fd = open(buf, O_RDWR); + if (fd == -1) { + if (errno == ENOENT) + continue; + fprintf(stderr, "%s: cannot open pid %s: %s\n", + av[0], av[i], strerror(errno)); + continue; + } + mask = ~0; + if (ioctl(fd, PIOCBIC, &mask) == -1) { + fprintf(stderr, "%s: cannot clear process %s's event mask: %s\n", + av[0], av[i], strerror(errno)); + } + mask = 0; + if (ioctl(fd, PIOCCONT, &mask) == -1 && errno != EINVAL) { + fprintf(stderr, "%s: cannot continue process %s: %s\n", + av[0], av[i], strerror(errno)); + } + close(fd); + } + return 0; +} -- cgit v1.1