FreeCalypso > hg > freecalypso-sw
changeset 328:5d9001f0c3aa
fc-sendsp: written, compiles
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sun, 20 Apr 2014 23:14:35 +0000 |
parents | 05874f1ddacb |
children | d9f5630e900d |
files | .hgignore rvinterf/misc/Makefile rvinterf/misc/rvifsend.c rvinterf/misc/sendsp.c |
diffstat | 4 files changed, 156 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgignore Sun Apr 20 20:39:53 2014 +0000 +++ b/.hgignore Sun Apr 20 23:14:35 2014 +0000 @@ -25,6 +25,7 @@ ^rvinterf/etmsync/fc-fsio$ ^rvinterf/lowlevel/rvinterf$ ^rvinterf/lowlevel/rvtdump$ +^rvinterf/misc/fc-sendsp$ ^rvinterf/old/etmsend$ ^rvinterf/old/rvtdump$ ^rvinterf/tmsh/fc-tmsh$
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/misc/Makefile Sun Apr 20 23:14:35 2014 +0000 @@ -0,0 +1,18 @@ +CC= gcc +CFLAGS= -O2 -I../include +PROGS= fc-sendsp +INSTBIN=/usr/local/bin + +SENDSP_OBJS= rvifsend.o sendsp.o + +all: ${PROGS} + +fc-sendsp: ${SENDSP_OBJS} + ${CC} ${CFLAGS} -o $@ ${SENDSP_OBJS} + +install: ${PROGS} + mkdir -p ${INSTBIN} + install -c ${PROGS} ${INSTBIN} + +clean: + rm -f *.o *.out *errs ${PROGS}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/misc/rvifsend.c Sun Apr 20 23:14:35 2014 +0000 @@ -0,0 +1,66 @@ +/* + * This module is currently linked by fc-sendsp, and may be used by + * other similar hack-utilities in the future. Here we connect to + * rvinterf, send one packet to the target, and call it done. + */ + +#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 "localsock.h" + +extern char *socket_pathname; + +send_pkt_to_target(pkt, pktlen) + u_char *pkt; + unsigned pktlen; +{ + /* local socket binding voodoo copied from osmocon */ + struct sockaddr_un local; + unsigned int namelen; + int sock, rc; + u_char hdrbuf[3]; + int len1; + + sock = socket(AF_UNIX, SOCK_STREAM, 0); + if (sock < 0) { + perror("socket(AF_UNIX, SOCK_STREAM, 0)"); + exit(1); + } + + local.sun_family = AF_UNIX; + strncpy(local.sun_path, socket_pathname, 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) + 1; +#endif + + rc = connect(sock, (struct sockaddr *) &local, namelen); + if (rc != 0) { + perror(socket_pathname); + exit(1); + } + + len1 = pktlen + 1; + hdrbuf[0] = len1 >> 8; + hdrbuf[1] = len1 & 0xFF; + hdrbuf[2] = CLI2RVI_PKT_TO_TARGET; + write(sock, hdrbuf, 3); + write(sock, pkt, pktlen); + close(sock); + return(0); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/misc/sendsp.c Sun Apr 20 23:14:35 2014 +0000 @@ -0,0 +1,71 @@ +/* + * This hack-utility sends a GPF System Primitive given on the command line + * to a target GSM device via rvinterf. + */ + +#include <sys/types.h> +#include <stdio.h> +#include <string.h> +#include <strings.h> +#include <stdlib.h> +#include "pktmux.h" +#include "limits.h" + +char *socket_pathname = "/tmp/rvinterf_socket"; + +main(argc, argv) + char **argv; +{ + char *stackdest, *primarg; + unsigned intlen; + u_char sendpkt[MAX_PKT_TO_TARGET]; + unsigned pktlen; + + if (argc < 3) { +usage: fprintf(stderr, "usage: %s [-s socket] stackdest primarg\n", + argv[0]); + exit(1); + } + if (strcmp(argv[1], "-s")) { + if (argc != 3) + goto usage; + stackdest = argv[1]; + primarg = argv[2]; + } else { + if (argc != 5) + goto usage; + socket_pathname = argv[2]; + stackdest = argv[3]; + primarg = argv[4]; + } + if (strlen(stackdest) > 4) { + fprintf(stderr, + "error: stack destination arg may not exceed 4 characters\n"); + exit(1); + } + intlen = 12 + strlen(primarg) + 1; + pktlen = intlen + 4; + if (pktlen > MAX_PKT_TO_TARGET) { + fprintf(stderr, "error: max pkt to target limit exceeded\n"); + exit(1); + } + /* fill out the packet */ + sendpkt[0] = RVT_L23_HEADER; + sendpkt[1] = 0xB7; /* system prim */ + sendpkt[2] = intlen; + sendpkt[3] = intlen >> 8; + /* send zeros for the timestamp */ + sendpkt[4] = 0; + sendpkt[5] = 0; + sendpkt[6] = 0; + sendpkt[7] = 0; + /* as far as TI's sw is concerned, we are PCO */ + sendpkt[8] = 'P'; + sendpkt[9] = 'C'; + sendpkt[10] = 'O'; + sendpkt[11] = ' '; + sprintf(sendpkt + 12, "%-4s%s", stackdest, primarg); + /* send it! */ + send_pkt_to_target(sendpkt, pktlen); + exit(0); +}