FreeCalypso > hg > freecalypso-sw
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); +}