view rvinterf/misc/rvifsend.c @ 808:d3538ac6e321

aci: psa_f.c through psa_mmp.c done
author Space Falcon <falcon@ivan.Harhan.ORG>
date Sun, 05 Apr 2015 07:23:05 +0000
parents 5d9001f0c3aa
children
line wrap: on
line source

/*
 * 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);
}