btrace(8): move to proper location
- move from minix/commands to minix/usr.sbin; - install into /usr/sbin instead of /usr/bin; - move manual page into source directory; - resolve compilation warning; - convert to KNF. Change-Id: I08c16998bd499a468799a6587f6fe45f42590461
This commit is contained in:
parent
d8634bad6a
commit
964427e0ea
8 changed files with 233 additions and 223 deletions
|
@ -249,7 +249,7 @@
|
||||||
./usr/bin/bdes minix-sys
|
./usr/bin/bdes minix-sys
|
||||||
./usr/bin/bsdtar minix-sys
|
./usr/bin/bsdtar minix-sys
|
||||||
./usr/bin/bsfilt minix-sys
|
./usr/bin/bsfilt minix-sys
|
||||||
./usr/bin/btrace minix-sys
|
./usr/bin/btrace minix-sys obsolete
|
||||||
./usr/bin/bunzip2 minix-sys
|
./usr/bin/bunzip2 minix-sys
|
||||||
./usr/bin/bzcat minix-sys
|
./usr/bin/bzcat minix-sys
|
||||||
./usr/bin/bzip2 minix-sys
|
./usr/bin/bzip2 minix-sys
|
||||||
|
@ -5308,6 +5308,7 @@
|
||||||
./usr/preserve minix-sys
|
./usr/preserve minix-sys
|
||||||
./usr/run minix-sys
|
./usr/run minix-sys
|
||||||
./usr/sbin minix-sys
|
./usr/sbin minix-sys
|
||||||
|
./usr/sbin/btrace minix-sys
|
||||||
./usr/sbin/chown minix-sys
|
./usr/sbin/chown minix-sys
|
||||||
./usr/sbin/chroot minix-sys
|
./usr/sbin/chroot minix-sys
|
||||||
./usr/sbin/group minix-sys
|
./usr/sbin/group minix-sys
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
.include <bsd.own.mk>
|
.include <bsd.own.mk>
|
||||||
|
|
||||||
SUBDIR= add_route arp at backup btrace \
|
SUBDIR= add_route arp at backup \
|
||||||
cawf cdprobe \
|
cawf cdprobe \
|
||||||
ci cleantmp co \
|
ci cleantmp co \
|
||||||
compress crc cron crontab \
|
compress crc cron crontab \
|
||||||
|
|
|
@ -1,219 +0,0 @@
|
||||||
/* Block trace command line tool */
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <minix/btrace.h>
|
|
||||||
#include <minix/u64.h>
|
|
||||||
#include <sys/ioc_block.h>
|
|
||||||
|
|
||||||
static btrace_entry buf[BTBUF_SIZE];
|
|
||||||
|
|
||||||
static void usage(char *name)
|
|
||||||
{
|
|
||||||
printf("usage:\n"
|
|
||||||
"%s start <device> <nr_entries>\n"
|
|
||||||
"%s stop <device> <file>\n"
|
|
||||||
"%s reset <device>\n"
|
|
||||||
"%s dump <file>\n",
|
|
||||||
name, name, name, name);
|
|
||||||
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void btrace_start(char *device, int nr_entries)
|
|
||||||
{
|
|
||||||
int r, ctl, devfd;
|
|
||||||
size_t size;
|
|
||||||
|
|
||||||
if ((devfd = open(device, O_RDONLY)) < 0) {
|
|
||||||
perror("device open");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
size = nr_entries;
|
|
||||||
if ((r = ioctl(devfd, BIOCTRACEBUF, &size)) < 0) {
|
|
||||||
perror("ioctl(BIOCTRACEBUF)");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
ctl = BTCTL_START;
|
|
||||||
if ((r = ioctl(devfd, BIOCTRACECTL, &ctl)) < 0) {
|
|
||||||
perror("ioctl(BIOCTRACECTL)");
|
|
||||||
|
|
||||||
size = 0;
|
|
||||||
(void) ioctl(devfd, BIOCTRACEBUF, &size);
|
|
||||||
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
close(devfd);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void btrace_stop(char *device, char *file)
|
|
||||||
{
|
|
||||||
int r, ctl, devfd, outfd;
|
|
||||||
size_t size;
|
|
||||||
|
|
||||||
if ((devfd = open(device, O_RDONLY)) < 0) {
|
|
||||||
perror("device open");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((outfd = open(file, O_CREAT|O_TRUNC|O_WRONLY, 0600)) < 0) {
|
|
||||||
perror("file open");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
ctl = BTCTL_STOP;
|
|
||||||
if ((r = ioctl(devfd, BIOCTRACECTL, &ctl)) < 0) {
|
|
||||||
perror("ioctl(BIOCTRACECTL)");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
if ((r = ioctl(devfd, BIOCTRACEGET, buf)) < 0) {
|
|
||||||
perror("ioctl(BIOCTRACEGET)");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r == 0) break;
|
|
||||||
|
|
||||||
size = r * sizeof(buf[0]);
|
|
||||||
if ((r = write(outfd, (char *) buf, size)) != size) {
|
|
||||||
if (r < 0) perror("write");
|
|
||||||
else fputs("short write\n", stderr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
close(outfd);
|
|
||||||
|
|
||||||
size = 0;
|
|
||||||
if ((r = ioctl(devfd, BIOCTRACEBUF, &size)) < 0) {
|
|
||||||
perror("ioctl(BIOCTRACEBUF)");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
close(devfd);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void btrace_reset(char *device)
|
|
||||||
{
|
|
||||||
size_t size;
|
|
||||||
int r, ctl, devfd;
|
|
||||||
|
|
||||||
if ((devfd = open(device, O_RDONLY)) < 0) {
|
|
||||||
perror("device open");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
ctl = BTCTL_STOP;
|
|
||||||
(void) ioctl(devfd, BIOCTRACECTL, &ctl);
|
|
||||||
|
|
||||||
size = 0;
|
|
||||||
if ((r = ioctl(devfd, BIOCTRACEBUF, &size)) < 0) {
|
|
||||||
perror("ioctl(BIOCTRACEBUF)");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
close(devfd);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dump_entry(btrace_entry *entry)
|
|
||||||
{
|
|
||||||
switch (entry->request) {
|
|
||||||
case BTREQ_OPEN: printf("OPEN"); break;
|
|
||||||
case BTREQ_CLOSE: printf("CLOSE"); break;
|
|
||||||
case BTREQ_READ: printf("READ"); break;
|
|
||||||
case BTREQ_WRITE: printf("WRITE"); break;
|
|
||||||
case BTREQ_GATHER: printf("GATHER"); break;
|
|
||||||
case BTREQ_SCATTER: printf("SCATTER"); break;
|
|
||||||
case BTREQ_IOCTL: printf("IOCTL"); break;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf(" request\n");
|
|
||||||
|
|
||||||
switch (entry->request) {
|
|
||||||
case BTREQ_OPEN:
|
|
||||||
printf("- access:\t%x\n", entry->size);
|
|
||||||
break;
|
|
||||||
case BTREQ_READ:
|
|
||||||
case BTREQ_WRITE:
|
|
||||||
case BTREQ_GATHER:
|
|
||||||
case BTREQ_SCATTER:
|
|
||||||
printf("- position:\t%08lx%08lx\n",
|
|
||||||
ex64hi(entry->position), ex64lo(entry->position));
|
|
||||||
printf("- size:\t\t%u\n", entry->size);
|
|
||||||
printf("- flags:\t%x\n", entry->flags);
|
|
||||||
break;
|
|
||||||
case BTREQ_IOCTL:
|
|
||||||
printf("- request:\t%08x\n", entry->size);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("- start:\t%u us\n", entry->start_time);
|
|
||||||
printf("- finish:\t%u us\n", entry->finish_time);
|
|
||||||
if (entry->result == BTRES_INPROGRESS)
|
|
||||||
printf("- result:\t(in progress)\n");
|
|
||||||
else
|
|
||||||
printf("- result:\t%d\n", entry->result);
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void btrace_dump(char *file)
|
|
||||||
{
|
|
||||||
int i, r, infd;
|
|
||||||
|
|
||||||
if ((infd = open(file, O_RDONLY)) < 0) {
|
|
||||||
perror("open");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
if ((r = read(infd, (char *) buf, sizeof(buf))) <= 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
r /= sizeof(buf[0]);
|
|
||||||
|
|
||||||
for (i = 0; i < r; i++)
|
|
||||||
dump_entry(&buf[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r < 0) perror("read");
|
|
||||||
|
|
||||||
close(infd);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
int num;
|
|
||||||
char *name = argv[0];
|
|
||||||
|
|
||||||
if (argc < 3) usage(name);
|
|
||||||
|
|
||||||
if (!strcmp(argv[1], "start")) {
|
|
||||||
if (argc < 4) usage(name);
|
|
||||||
|
|
||||||
num = atoi(argv[3]);
|
|
||||||
|
|
||||||
if (num <= 0) usage(name);
|
|
||||||
|
|
||||||
btrace_start(argv[2], num);
|
|
||||||
}
|
|
||||||
else if (!strcmp(argv[1], "stop")) {
|
|
||||||
if (argc < 4) usage(name);
|
|
||||||
|
|
||||||
btrace_stop(argv[2], argv[3]);
|
|
||||||
}
|
|
||||||
else if (!strcmp(argv[1], "reset")) {
|
|
||||||
btrace_reset(argv[2]);
|
|
||||||
}
|
|
||||||
else if (!strcmp(argv[1], "dump")) {
|
|
||||||
btrace_dump(argv[2]);
|
|
||||||
}
|
|
||||||
else usage(name);
|
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
|
|
@ -1,4 +1,4 @@
|
||||||
MAN= add_route.8 backup.8 boot.8 btrace.8 \
|
MAN= add_route.8 backup.8 boot.8 \
|
||||||
cdprobe.8 cleantmp.8 config.8 cron.8 \
|
cdprobe.8 cleantmp.8 config.8 cron.8 \
|
||||||
dhcpd.8 diskctl.8 fbdctl.8 fdisk.8 \
|
dhcpd.8 diskctl.8 fbdctl.8 fdisk.8 \
|
||||||
getty.8 halt.8 hgfs.8 httpd.8 ifconfig.8 inet.8 init.8 \
|
getty.8 halt.8 hgfs.8 httpd.8 ifconfig.8 inet.8 init.8 \
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
.include <bsd.own.mk>
|
.include <bsd.own.mk>
|
||||||
|
|
||||||
|
SUBDIR+= btrace
|
||||||
SUBDIR+= mkfs.mfs
|
SUBDIR+= mkfs.mfs
|
||||||
SUBDIR+= mkproto
|
SUBDIR+= mkproto
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
PROG= btrace
|
PROG= btrace
|
||||||
MAN=
|
MAN= btrace.8
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
.include <bsd.prog.mk>
|
227
minix/usr.sbin/btrace/btrace.c
Normal file
227
minix/usr.sbin/btrace/btrace.c
Normal file
|
@ -0,0 +1,227 @@
|
||||||
|
/* Block trace command line tool - by D.C. van Moolenbroek */
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <minix/btrace.h>
|
||||||
|
#include <minix/u64.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
|
static btrace_entry buf[BTBUF_SIZE];
|
||||||
|
|
||||||
|
static void __dead
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage:\n"
|
||||||
|
"%s start <device> <nr_entries>\n"
|
||||||
|
"%s stop <device> <file>\n"
|
||||||
|
"%s reset <device>\n"
|
||||||
|
"%s dump <file>\n",
|
||||||
|
getprogname(), getprogname(), getprogname(), getprogname());
|
||||||
|
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
btrace_start(char * device, int nr_entries)
|
||||||
|
{
|
||||||
|
int r, ctl, devfd;
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
if ((devfd = open(device, O_RDONLY)) < 0) {
|
||||||
|
perror("device open");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
size = nr_entries;
|
||||||
|
if ((r = ioctl(devfd, BIOCTRACEBUF, &size)) < 0) {
|
||||||
|
perror("ioctl(BIOCTRACEBUF)");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
ctl = BTCTL_START;
|
||||||
|
if ((r = ioctl(devfd, BIOCTRACECTL, &ctl)) < 0) {
|
||||||
|
perror("ioctl(BIOCTRACECTL)");
|
||||||
|
|
||||||
|
size = 0;
|
||||||
|
(void)ioctl(devfd, BIOCTRACEBUF, &size);
|
||||||
|
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
close(devfd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
btrace_stop(char * device, char * file)
|
||||||
|
{
|
||||||
|
int r, ctl, devfd, outfd;
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
if ((devfd = open(device, O_RDONLY)) < 0) {
|
||||||
|
perror("device open");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((outfd = open(file, O_CREAT | O_TRUNC | O_WRONLY, 0600)) < 0) {
|
||||||
|
perror("file open");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
ctl = BTCTL_STOP;
|
||||||
|
if ((r = ioctl(devfd, BIOCTRACECTL, &ctl)) < 0) {
|
||||||
|
perror("ioctl(BIOCTRACECTL)");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
if ((r = ioctl(devfd, BIOCTRACEGET, buf)) < 0) {
|
||||||
|
perror("ioctl(BIOCTRACEGET)");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r == 0) break;
|
||||||
|
|
||||||
|
size = r * sizeof(buf[0]);
|
||||||
|
if ((r = write(outfd, (char *)buf, size)) != size) {
|
||||||
|
if (r < 0) perror("write");
|
||||||
|
else fputs("short write\n", stderr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close(outfd);
|
||||||
|
|
||||||
|
size = 0;
|
||||||
|
if ((r = ioctl(devfd, BIOCTRACEBUF, &size)) < 0) {
|
||||||
|
perror("ioctl(BIOCTRACEBUF)");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
close(devfd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
btrace_reset(char * device)
|
||||||
|
{
|
||||||
|
size_t size;
|
||||||
|
int r, ctl, devfd;
|
||||||
|
|
||||||
|
if ((devfd = open(device, O_RDONLY)) < 0) {
|
||||||
|
perror("device open");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
ctl = BTCTL_STOP;
|
||||||
|
(void)ioctl(devfd, BIOCTRACECTL, &ctl);
|
||||||
|
|
||||||
|
size = 0;
|
||||||
|
if ((r = ioctl(devfd, BIOCTRACEBUF, &size)) < 0) {
|
||||||
|
perror("ioctl(BIOCTRACEBUF)");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
close(devfd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dump_entry(btrace_entry * entry)
|
||||||
|
{
|
||||||
|
switch (entry->request) {
|
||||||
|
case BTREQ_OPEN: printf("OPEN"); break;
|
||||||
|
case BTREQ_CLOSE: printf("CLOSE"); break;
|
||||||
|
case BTREQ_READ: printf("READ"); break;
|
||||||
|
case BTREQ_WRITE: printf("WRITE"); break;
|
||||||
|
case BTREQ_GATHER: printf("GATHER"); break;
|
||||||
|
case BTREQ_SCATTER: printf("SCATTER"); break;
|
||||||
|
case BTREQ_IOCTL: printf("IOCTL"); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf(" request\n");
|
||||||
|
|
||||||
|
switch (entry->request) {
|
||||||
|
case BTREQ_OPEN:
|
||||||
|
printf("- access:\t%x\n", entry->size);
|
||||||
|
break;
|
||||||
|
case BTREQ_READ:
|
||||||
|
case BTREQ_WRITE:
|
||||||
|
case BTREQ_GATHER:
|
||||||
|
case BTREQ_SCATTER:
|
||||||
|
printf("- position:\t%08lx%08lx\n",
|
||||||
|
ex64hi(entry->position), ex64lo(entry->position));
|
||||||
|
printf("- size:\t\t%u\n", entry->size);
|
||||||
|
printf("- flags:\t%x\n", entry->flags);
|
||||||
|
break;
|
||||||
|
case BTREQ_IOCTL:
|
||||||
|
printf("- request:\t%08x\n", entry->size);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("- start:\t%u us\n", entry->start_time);
|
||||||
|
printf("- finish:\t%u us\n", entry->finish_time);
|
||||||
|
if (entry->result == BTRES_INPROGRESS)
|
||||||
|
printf("- result:\t(in progress)\n");
|
||||||
|
else
|
||||||
|
printf("- result:\t%d\n", entry->result);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
btrace_dump(char * file)
|
||||||
|
{
|
||||||
|
int i, r, infd;
|
||||||
|
|
||||||
|
if ((infd = open(file, O_RDONLY)) < 0) {
|
||||||
|
perror("open");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
if ((r = read(infd, (char *)buf, sizeof(buf))) <= 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
r /= sizeof(buf[0]);
|
||||||
|
|
||||||
|
for (i = 0; i < r; i++)
|
||||||
|
dump_entry(&buf[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r < 0) perror("read");
|
||||||
|
|
||||||
|
close(infd);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char ** argv)
|
||||||
|
{
|
||||||
|
int num;
|
||||||
|
|
||||||
|
setprogname(argv[0]);
|
||||||
|
|
||||||
|
if (argc < 3) usage();
|
||||||
|
|
||||||
|
if (!strcmp(argv[1], "start")) {
|
||||||
|
if (argc < 4) usage();
|
||||||
|
|
||||||
|
num = atoi(argv[3]);
|
||||||
|
|
||||||
|
if (num <= 0) usage();
|
||||||
|
|
||||||
|
btrace_start(argv[2], num);
|
||||||
|
|
||||||
|
} else if (!strcmp(argv[1], "stop")) {
|
||||||
|
if (argc < 4) usage();
|
||||||
|
|
||||||
|
btrace_stop(argv[2], argv[3]);
|
||||||
|
|
||||||
|
} else if (!strcmp(argv[1], "reset")) {
|
||||||
|
btrace_reset(argv[2]);
|
||||||
|
|
||||||
|
} else if (!strcmp(argv[1], "dump")) {
|
||||||
|
btrace_dump(argv[2]);
|
||||||
|
|
||||||
|
} else
|
||||||
|
usage();
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
Loading…
Reference in a new issue