FreeCalypso > hg > freecalypso-sw
diff rvinterf/rvtdump_tx.c @ 171:4d8e4c58df71
rvtdump: implemented Tx extension hack, compiles
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Wed, 20 Nov 2013 05:39:31 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/rvtdump_tx.c Wed Nov 20 05:39:31 2013 +0000 @@ -0,0 +1,70 @@ +/* + * This module contains the implementation of the Tx extension to rvtdump + */ + +#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 "txpkt.h" + +static char sockpath[] = "/tmp/rvt_send_socket"; + +int sendsock_fd; +u_char sendsock_pkt[MAX_PKT_TO_TARGET]; +int sendsock_pktlen; + +create_send_socket() +{ + /* local socket binding voodoo copied from osmocon */ + struct sockaddr_un local; + unsigned int namelen; + int rc; + + sendsock_fd = socket(AF_UNIX, SOCK_DGRAM, 0); + if (sendsock_fd < 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'; + unlink(local.sun_path); + + /* 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 + + rc = bind(sendsock_fd, (struct sockaddr *) &local, namelen); + if (rc != 0) { + perror("bind on local dgram socket"); + exit(1); + } + + return(0); +} + +handle_sendsock() +{ + sendsock_pktlen = recv(sendsock_fd, sendsock_pkt, MAX_PKT_TO_TARGET, 0); + if (sendsock_pktlen <= 0) { + fprintf(stderr, "return value from recv on socket: %d\n", + sendsock_pktlen); + exit(1); + } + send_pkt_to_target(sendsock_pkt, sendsock_pktlen); + log_sent_packet(sendsock_pkt, sendsock_pktlen); +}