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