changeset 172:019120585a1c

etmsend hack-utility written, compiles
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Wed, 20 Nov 2013 06:25:05 +0000
parents 4d8e4c58df71
children f42854da4563
files .hgignore rvinterf/Makefile rvinterf/etmsend.c
diffstat 3 files changed, 86 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Wed Nov 20 05:39:31 2013 +0000
+++ b/.hgignore	Wed Nov 20 06:25:05 2013 +0000
@@ -15,6 +15,7 @@
 ^loadtools/fc-loadtool
 ^loadtools/fc-xram
 
+^rvinterf/etmsend$
 ^rvinterf/rvtdump$
 
 ^target-utils/.*/crt0\.S$
--- a/rvinterf/Makefile	Wed Nov 20 05:39:31 2013 +0000
+++ b/rvinterf/Makefile	Wed Nov 20 06:25:05 2013 +0000
@@ -1,19 +1,23 @@
 CC=	gcc
 CFLAGS=	-O2
 PROGS=	rvtdump
+XPROGS=	etmsend
 INSTBIN=/usr/local/bin
 
 RVTDUMP_OBJS=	log.o openport.o packetrx.o packettx.o rvtdump.o rvtdump_tx.o \
 		trdump.o
 
-all:	${PROGS}
+all:	${PROGS} ${XPROGS}
 
 rvtdump:	${RVTDUMP_OBJS}
 	${CC} ${CFLAGS} -o $@ ${RVTDUMP_OBJS}
 
+etmsend:	etmsend.c
+	${CC} ${CFLAGS} -o $@ $@.c
+
 install:	${PROGS}
 	mkdir -p ${INSTBIN}
 	install -c ${PROGS} ${INSTBIN}
 
 clean:
-	rm -f *.o *.out *errs ${PROGS}
+	rm -f *.o *.out *errs ${PROGS} ${XPROGS}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rvinterf/etmsend.c	Wed Nov 20 06:25:05 2013 +0000
@@ -0,0 +1,79 @@
+/*
+ * This program is a hack that sends a hand-crafted ETM packet
+ * to the UNIX-local dgram socket established by rvtdump with -s option.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "pktmux.h"
+#include "txpkt.h"
+
+char sockpath[] = "/tmp/rvt_send_socket";
+
+u_char packet[MAX_PKT_TO_TARGET];
+int payload_len;
+
+main(argc, argv)
+	char **argv;
+{
+	int i, c, s;
+	struct sockaddr_un local;
+	unsigned int namelen;
+
+	if (argc < 2) {
+		fprintf(stderr, "usage: %s hexbytes...\n", argv[0]);
+		exit(1);
+	}
+	payload_len = argc - 1;
+	if (payload_len > MAX_PKT_TO_TARGET-2) {
+		fprintf(stderr,
+			"%s: too many bytes (packet length limit exceeded)\n",
+			argv[0]);
+		exit(1);
+	}
+
+	packet[0] = RVT_TM_HEADER;
+	for (i = 1; i <= payload_len; i++)
+		packet[i] = strtoul(argv[i], 0, 16);
+	c = 0;
+	for (i = 1; i <= payload_len; i++)
+		c ^= packet[i];
+	packet[payload_len+1] = c;
+
+	s = socket(AF_UNIX, SOCK_DGRAM, 0);
+	if (s < 0) {
+		perror("socket(AF_UNIX, SOCK_DGRAM, 0)");
+		exit(1);
+	}
+
+	local.sun_family = AF_UNIX;
+	strncpy(local.sun_path, sockpath, sizeof(local.sun_path));
+	local.sun_path[sizeof(local.sun_path) - 1] = '\0';
+
+	/* we use the same magic that X11 uses in Xtranssock.c for
+	 * calculating the proper length of the sockaddr */
+#if defined(BSD44SOCKETS) || defined(__UNIXWARE__)
+	local.sun_len = strlen(local.sun_path);
+#endif
+#if defined(BSD44SOCKETS) || defined(SUN_LEN)
+	namelen = SUN_LEN(&local);
+#else
+	namelen = strlen(local.sun_path) +
+		  offsetof(struct sockaddr_un, sun_path);
+#endif
+
+	i = sendto(s, packet, payload_len+2, 0,
+			(struct sockaddr *) &local, namelen);
+	if (i < 0) {
+		perror("sendto");
+		exit(1);
+	}
+
+	exit(0);
+}