diff rvinterf/etmsync/fdcmd.c @ 286:146e7bf3fa4e

fc-fsio: fd debug commands implemented
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Fri, 28 Feb 2014 06:45:10 +0000
parents
children 69e8ae2b5ba2
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rvinterf/etmsync/fdcmd.c	Fri Feb 28 06:45:10 2014 +0000
@@ -0,0 +1,87 @@
+/*
+ * File descriptor debug commands
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include "etm.h"
+#include "ffs.h"
+#include "tmffs2.h"
+#include "limits.h"
+#include "localtypes.h"
+#include "localstruct.h"
+#include "cmdtab.h"
+#include "exitcodes.h"
+
+cmd_fd_open(argc, argv)
+	char **argv;
+{
+	int rc, fd;
+
+	rc = fd_open(argv[1], strtoul(argv[2], 0, 0), &fd);
+	if (rc)
+		return(rc);
+	printf("%d\n", fd);
+	return(0);
+}
+
+cmd_fd_read(argc, argv)
+	char **argv;
+{
+	u_char databuf[MAX_READ_DATA];
+	int rc, sz, off, l;
+
+	rc = fd_read(strtoul(argv[1], 0, 0), databuf, strtoul(argv[2], 0, 0),
+			&sz);
+	if (rc)
+		return(rc);
+	printf("%d bytes read\n", sz);
+	for (off = 0; off < sz; off += 16) {
+		l = sz - off;
+		if (l > 16)
+			l = 16;
+		hexdump_line(off, databuf + off, l);
+	}
+	return(0);
+}
+
+cmd_fd_close(argc, argv)
+	char **argv;
+{
+	return fd_close(strtoul(argv[1], 0, 0));
+}
+
+struct cmdtab fd_cmds[] = {
+	{"close", 1, 1, cmd_fd_close},
+	{"open", 2, 2, cmd_fd_open},
+	{"read", 2, 2, cmd_fd_read},
+	{0, 0, 0, 0}
+};
+
+cmd_fd(argc, argv)
+	char **argv;
+{
+	struct cmdtab *tp;
+	int extargs;
+
+	for (tp = fd_cmds; tp->cmd; tp++)
+		if (!strcmp(tp->cmd, argv[1]))
+			break;
+	if (!tp->func) {
+		fprintf(stderr, "error: no such fd command\n");
+		return(ERROR_USAGE);
+	}
+	extargs = argc - 2;
+	if (extargs > tp->maxargs) {
+		fprintf(stderr, "error: too many arguments\n");
+		return(ERROR_USAGE);
+	}
+	if (extargs < tp->minargs) {
+		fprintf(stderr, "error: too few arguments\n");
+		return(ERROR_USAGE);
+	}
+	return tp->func(argc - 1, argv + 1);
+}