diff rvinterf/etmsync/fdcmd.c @ 0:e7502631a0f9

initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 11 Jun 2016 00:13:35 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rvinterf/etmsync/fdcmd.c	Sat Jun 11 00:13:35 2016 +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, 16), &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);
+}