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