File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ipsec-tools / src / racoon / kmpstat.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:39:10 2012 UTC (12 years, 4 months ago) by misho
Branches: ipsec-tools, MAIN
CVS tags: v0_8_2p2, v0_8_1p0, v0_8_1, v0_8_0p0, v0_8_0, HEAD
ipsec-tools

    1: /*	$NetBSD: kmpstat.c,v 1.7 2010/11/12 09:08:26 tteras Exp $	*/
    2: 
    3: /*	$KAME: kmpstat.c,v 1.33 2004/08/16 08:20:28 itojun Exp $	*/
    4: 
    5: /*
    6:  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
    7:  * All rights reserved.
    8:  * 
    9:  * Redistribution and use in source and binary forms, with or without
   10:  * modification, are permitted provided that the following conditions
   11:  * are met:
   12:  * 1. Redistributions of source code must retain the above copyright
   13:  *    notice, this list of conditions and the following disclaimer.
   14:  * 2. Redistributions in binary form must reproduce the above copyright
   15:  *    notice, this list of conditions and the following disclaimer in the
   16:  *    documentation and/or other materials provided with the distribution.
   17:  * 3. Neither the name of the project nor the names of its contributors
   18:  *    may be used to endorse or promote products derived from this software
   19:  *    without specific prior written permission.
   20:  * 
   21:  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
   22:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   23:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   24:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
   25:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   26:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   27:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   28:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   29:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   30:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   31:  * SUCH DAMAGE.
   32:  */
   33: 
   34: #include "config.h"
   35: 
   36: #include <sys/types.h>
   37: #include <sys/param.h>
   38: #include <sys/socket.h>
   39: #include <sys/un.h>
   40: 
   41: #include <netinet/in.h>
   42: #include <arpa/inet.h>
   43: #include <net/pfkeyv2.h>
   44: 
   45: #include <stdlib.h>
   46: #include <stdio.h>
   47: #include <string.h>
   48: #include <errno.h>
   49: #if TIME_WITH_SYS_TIME
   50: # include <sys/time.h>
   51: # include <time.h>
   52: #else
   53: # if HAVE_SYS_TIME_H
   54: #  include <sys/time.h>
   55: # else
   56: #  include <time.h>
   57: # endif
   58: #endif
   59: #include <netdb.h>
   60: #ifdef HAVE_UNISTD_H
   61: #include <unistd.h>
   62: #endif
   63: #include <err.h>
   64: #include <sys/ioctl.h> 
   65: #include <resolv.h>
   66: 
   67: #include "libpfkey.h"
   68: 
   69: #include "var.h"
   70: #include "misc.h"
   71: #include "vmbuf.h"
   72: #include "plog.h"
   73: #include "debug.h"
   74: #include "sockmisc.h"
   75: 
   76: #include "racoonctl.h"
   77: #include "admin.h"
   78: #include "schedule.h"
   79: #include "isakmp_var.h"
   80: #include "isakmp.h"
   81: #include "isakmp_xauth.h"
   82: #include "isakmp_var.h"
   83: #include "isakmp_cfg.h"
   84: #include "oakley.h"
   85: #include "handler.h"
   86: #include "pfkey.h"
   87: #include "admin.h"
   88: #include "evt.h"
   89: #include "admin_var.h"
   90: #include "ipsec_doi.h"
   91: 
   92: u_int32_t racoonctl_interface = RACOONCTL_INTERFACE;
   93: u_int32_t racoonctl_interface_major = RACOONCTL_INTERFACE_MAJOR;
   94: 
   95: static int so;
   96: u_int32_t loglevel = 0;
   97: 
   98: int
   99: com_init()
  100: {
  101: 	struct sockaddr_un name;
  102: 
  103: 	memset(&name, 0, sizeof(name));
  104: 	name.sun_family = AF_UNIX;
  105: 	snprintf(name.sun_path, sizeof(name.sun_path),
  106: 		"%s", adminsock_path);
  107: 
  108: 	so = socket(AF_UNIX, SOCK_STREAM, 0);
  109: 	if (so < 0)
  110: 		return -1;
  111: 
  112: 	if (connect(so, (struct sockaddr *)&name, sizeof(name)) < 0) {
  113: 		(void)close(so);
  114: 		return -1;
  115: 	}
  116: 
  117: 	return 0;
  118: }
  119: 
  120: int
  121: com_send(combuf)
  122: 	vchar_t *combuf;
  123: {
  124: 	int len;
  125: 
  126: 	if ((len = send(so, combuf->v, combuf->l, 0)) == -1) {
  127: 		perror("send");
  128: 		(void)close(so);
  129: 		return -1;
  130: 	}
  131: 
  132: 	return 0;
  133: }
  134: 
  135: int
  136: com_recv(combufp) 
  137: 	vchar_t **combufp;
  138: {
  139: 	struct admin_com h, *com;
  140: 	caddr_t buf;
  141: 	int len, rlen;
  142: 	int l = 0;
  143: 	caddr_t p;
  144: 
  145: 	if (combufp == NULL)
  146: 		return -1;
  147: 
  148: 	/* receive by PEEK */ 
  149: 	if ((len = recv(so, &h, sizeof(h), MSG_PEEK)) == -1)
  150: 		goto bad1;
  151: 
  152: 	/* sanity check */
  153: 	if (len < sizeof(h))
  154: 		goto bad1;
  155: 
  156: 	if (h.ac_errno && !(h.ac_cmd & ADMIN_FLAG_LONG_REPLY)) {
  157: 		errno = h.ac_errno;
  158: 		goto bad1;
  159: 	}
  160: 
  161: 	/* real length */
  162: 	if (h.ac_cmd & ADMIN_FLAG_LONG_REPLY)
  163: 		rlen = ((u_int32_t)h.ac_len) + (((u_int32_t)h.ac_len_high) << 16);
  164: 	else
  165: 		rlen = h.ac_len;
  166: 
  167: 	/* allocate buffer */
  168: 	if ((*combufp = vmalloc(rlen)) == NULL)
  169: 		goto bad1;
  170: 
  171: 	/* read real message */
  172: 	p = (*combufp)->v;
  173: 	while (l < rlen) {
  174: 		if ((len = recv(so, p, rlen - l, 0)) < 0) {
  175: 			perror("recv");
  176: 			goto bad2;
  177: 		}
  178: 		l += len;
  179: 		p += len;
  180: 	}
  181: 	
  182: 	return 0;
  183: 
  184: bad2:
  185: 	vfree(*combufp);
  186: bad1:
  187: 	*combufp = NULL;
  188: 	return -1;
  189: }
  190: 
  191: /*
  192:  * Dumb plog functions (used by sockmisc.c) 
  193:  */
  194: void
  195: _plog(int pri, const char *func, struct sockaddr *sa, const char *fmt, ...)
  196: {
  197: 	va_list ap;
  198: 
  199: 	va_start(ap, fmt);
  200: 	vprintf(fmt, ap);
  201: 	va_end(ap);
  202: }
  203: 
  204: void
  205: plogdump(pri, data, len) 
  206: 	int pri;
  207: 	void *data;
  208: 	size_t len;
  209: {
  210: 	return;
  211: }
  212: 
  213: struct sockaddr *
  214: get_sockaddr(family, name, port)
  215: 	int family;
  216: 	char *name, *port;
  217: {
  218: 	struct addrinfo hint, *ai;
  219: 	int error;
  220: 
  221: 	memset(&hint, 0, sizeof(hint));
  222: 	hint.ai_family = PF_UNSPEC;
  223: 	hint.ai_family = family;
  224: 	hint.ai_socktype = SOCK_STREAM;
  225: 
  226: 	error = getaddrinfo(name, port, &hint, &ai);
  227: 	if (error != 0) {
  228: 		printf("%s: %s/%s\n", gai_strerror(error), name, port);
  229: 		return NULL;
  230: 	}
  231: 
  232: 	return ai->ai_addr;
  233: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>