diff rvinterf/old/etmsend.c @ 173:f42854da4563

rvinterf: beginning of refactoring
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Fri, 22 Nov 2013 05:56:07 +0000
parents rvinterf/etmsend.c@019120585a1c
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rvinterf/old/etmsend.c	Fri Nov 22 05:56:07 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);
+}