racoonctl.c revision 1c71527b277e2dc256262da2ed2169c566c5bf4d
11c71527b277e2dc256262da2ed2169c566c5bf4dChia-chi Yeh/*	$NetBSD: racoonctl.c,v 1.7.6.2 2009/04/20 13:32:57 tteras Exp $	*/
20a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
30a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*	Id: racoonctl.c,v 1.11 2006/04/06 17:06:25 manubsd Exp */
40a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
50a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*
60a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
70a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * All rights reserved.
80a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *
90a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Redistribution and use in source and binary forms, with or without
100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * modification, are permitted provided that the following conditions
110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * are met:
120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 1. Redistributions of source code must retain the above copyright
130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    notice, this list of conditions and the following disclaimer.
140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 2. Redistributions in binary form must reproduce the above copyright
150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    notice, this list of conditions and the following disclaimer in the
160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    documentation and/or other materials provided with the distribution.
170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 3. Neither the name of the project nor the names of its contributors
180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    may be used to endorse or promote products derived from this software
190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    without specific prior written permission.
200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *
210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * SUCH DAMAGE.
320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */
330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "config.h"
350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/types.h>
370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/param.h>
380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/socket.h>
390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/un.h>
400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <netinet/in.h>
420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <arpa/inet.h>
430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <net/pfkeyv2.h>
440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdlib.h>
460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdio.h>
470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <string.h>
480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <errno.h>
490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#if TIME_WITH_SYS_TIME
500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# include <sys/time.h>
510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# include <time.h>
520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#else
530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# if HAVE_SYS_TIME_H
540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#  include <sys/time.h>
550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# else
560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#  include <time.h>
570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# endif
580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <netdb.h>
600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_UNISTD_H
610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <unistd.h>
620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <err.h>
640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/ioctl.h>
650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <resolv.h>
660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "var.h"
680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "vmbuf.h"
690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "misc.h"
700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "gcmalloc.h"
710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "racoonctl.h"
730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "admin.h"
740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "schedule.h"
750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "handler.h"
760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "sockmisc.h"
770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "vmbuf.h"
780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "plog.h"
790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp_var.h"
800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp.h"
810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp_xauth.h"
820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp_cfg.h"
830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp_unity.h"
840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "ipsec_doi.h"
850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "evt.h"
860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *adminsock_path = ADMINSOCK_PATH;
880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void usage __P((void));
900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *get_combuf __P((int, char **));
910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int handle_recv __P((vchar_t *));
920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_reload __P((int, char **));
930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_getsched __P((int, char **));
940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_getsa __P((int, char **));
950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_flushsa __P((int, char **));
960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_deletesa __P((int, char **));
970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_exchangesa __P((int, char **));
980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_vpnc __P((int, char **));
990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_vpnd __P((int, char **));
1000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_getevt __P((int, char **));
1010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef ENABLE_HYBRID
1020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_logoutusr __P((int, char **));
1030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
1040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct cmd_tag {
1060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *(*func) __P((int, char **));
1070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int cmd;
1080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *str;
1090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} cmdtab[] = {
1100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_reload,	ADMIN_RELOAD_CONF,	"reload-config" },
1110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_reload,	ADMIN_RELOAD_CONF,	"rc" },
1120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_getsched,	ADMIN_SHOW_SCHED,	"show-schedule" },
1130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_getsched,	ADMIN_SHOW_SCHED,	"sc" },
1140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_getsa,	ADMIN_SHOW_SA,		"show-sa" },
1150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_getsa,	ADMIN_SHOW_SA,		"ss" },
1160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_flushsa,	ADMIN_FLUSH_SA,		"flush-sa" },
1170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_flushsa,	ADMIN_FLUSH_SA,		"fs" },
1180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_deletesa,	ADMIN_DELETE_SA,	"delete-sa" },
1190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_deletesa,	ADMIN_DELETE_SA,	"ds" },
1200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_exchangesa,	ADMIN_ESTABLISH_SA,	"establish-sa" },
1210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_exchangesa,	ADMIN_ESTABLISH_SA,	"es" },
1220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_vpnc,	ADMIN_ESTABLISH_SA,	"vpn-connect" },
1230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_vpnc,	ADMIN_ESTABLISH_SA,	"vc" },
1240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_vpnd,	ADMIN_DELETE_ALL_SA_DST,"vpn-disconnect" },
1250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_vpnd,	ADMIN_DELETE_ALL_SA_DST,"vd" },
1260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_getevt,	ADMIN_SHOW_EVT,		"show-event" },
1270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_getevt,	ADMIN_SHOW_EVT,		"se" },
1280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef ENABLE_HYBRID
1290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_logoutusr,	ADMIN_LOGOUT_USER,	"logout-user" },
1300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ f_logoutusr,	ADMIN_LOGOUT_USER,	"lu" },
1310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
1320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ NULL, 0, NULL },
1330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang};
1340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct evtmsg {
1360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int type;
1370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *msg;
1380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	enum { UNSPEC, ERROR, INFO } level;
1390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} evtmsg[] = {
1400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ EVTT_PHASE1_UP, "Phase 1 established", INFO },
1410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ EVTT_PHASE1_DOWN, "Phase 1 deleted", INFO },
1420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ EVTT_XAUTH_SUCCESS, "Xauth exchange passed", INFO },
1430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ EVTT_ISAKMP_CFG_DONE, "ISAKMP mode config done", INFO },
1440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ EVTT_PHASE2_UP, "Phase 2 established", INFO },
1450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ EVTT_PHASE2_DOWN, "Phase 2 deleted", INFO },
1460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ EVTT_DPD_TIMEOUT, "Peer not reachable anymore", ERROR },
1470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ EVTT_PEER_NO_RESPONSE, "Peer not responding", ERROR },
1480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ EVTT_PEER_DELETE, "Peer terminated security association", ERROR },
1490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ EVTT_RACOON_QUIT, "Raccon terminated", ERROR },
1500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ EVTT_OVERFLOW, "Event queue overflow", ERROR },
1510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ EVTT_XAUTH_FAILED, "Xauth exchange failed", ERROR },
1520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ EVTT_PEERPH1AUTH_FAILED, "Peer failed phase 1 authentication "
1530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	    "(certificate problem?)", ERROR },
1540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ EVTT_PEERPH1_NOPROP, "Peer failed phase 1 initiation "
1550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	    "(proposal problem?)", ERROR },
1560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ 0, NULL, UNSPEC },
1570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ EVTT_NO_ISAKMP_CFG, "No need for ISAKMP mode config ", INFO },
1580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang};
1590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int get_proto __P((char *));
1610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *get_index __P((int, char **));
1620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int get_family __P((char *));
1630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *get_comindexes __P((int, int, char **));
1640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int get_comindex __P((char *, char **, char **, char **));
1650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int get_ulproto __P((char *));
1660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct proto_tag {
1680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int proto;
1690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *str;
1700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} prototab[] = {
1710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ ADMIN_PROTO_ISAKMP,	"isakmp" },
1720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ ADMIN_PROTO_IPSEC,	"ipsec" },
1730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ ADMIN_PROTO_AH,	"ah" },
1740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ ADMIN_PROTO_ESP,	"esp" },
1750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ ADMIN_PROTO_INTERNAL,	"internal" },
1760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ 0, NULL },
1770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang};
1780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct ulproto_tag {
1800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ul_proto;
1810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *str;
1820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} ulprototab[] = {
1830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ 0,		"any" },
1840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ IPPROTO_ICMP,	"icmp" },
1850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ IPPROTO_TCP,	"tcp" },
1860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ IPPROTO_UDP,	"udp" },
1870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ 0, NULL },
1880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang};
1890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint so;
1910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic char _addr1_[NI_MAXHOST], _addr2_[NI_MAXHOST];
1930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *pname;
1950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint long_format = 0;
1960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define EVTF_NONE		0x0000	/* Ignore any events */
1980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define EVTF_LOOP		0x0001	/* Loop awaiting for new events */
1990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define EVTF_CFG_STOP		0x0002	/* Stop after ISAKMP mode config */
2000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define EVTF_CFG		0x0004	/* Print ISAKMP mode config info */
2010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define EVTF_ALL		0x0008	/* Print any events */
2020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define EVTF_PURGE		0x0010	/* Print all available events */
2030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define EVTF_PH1DOWN_STOP	0x0020	/* Stop when phase 1 SA gets down */
2040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define EVTF_PH1DOWN		0x0040	/* Print that phase 1 SA got down */
2050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define EVTF_ERR		0x0080	/* Print any error */
2060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define EVTF_ERR_STOP		0x0100	/* Stop on any error */
2070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint evt_filter = EVTF_NONE;
2090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangtime_t evt_start;
2100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid dump_isakmp_sa __P((char *, int));
2120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid dump_internal __P((char *, int));
2130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *pindex_isakmp __P((isakmp_index *));
2140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid print_schedule __P((caddr_t, int));
2150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid print_evt __P((caddr_t, int));
2160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid print_cfg __P((caddr_t, int));
2170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid print_err __P((caddr_t, int));
2180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid print_ph1down __P((caddr_t, int));
2190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid print_ph1up __P((caddr_t, int));
2200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint evt_poll __P((void));
2210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar * fixed_addr __P((char *, char *, int));
2220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void
2240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangusage()
2250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
2260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf(
2270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"Usage:\n"
2280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"  %s reload-config\n"
2290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"  %s [-l [-l]] show-sa [protocol]\n"
2300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"  %s flush-sa [protocol]\n"
2310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"  %s delete-sa <saopts>\n"
2320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"  %s establish-sa [-u identity] <saopts>\n"
2330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"  %s vpn-connect [-u identity] vpn_gateway\n"
2340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"  %s vpn-disconnect vpn_gateway\n"
2350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"\n"
2360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"    <protocol>: \"isakmp\", \"esp\" or \"ah\".\n"
2370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"        In the case of \"show-sa\" or \"flush-sa\", you can use \"ipsec\".\n"
2380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"\n"
2390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"    <saopts>: \"isakmp\" <family> <src> <dst>\n"
2400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"            : {\"esp\",\"ah\"} <family> <src/prefixlen/port> <dst/prefixlen/port>\n"
2410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"                              <ul_proto>\n"
2420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"    <family>: \"inet\" or \"inet6\"\n"
2430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"    <ul_proto>: \"icmp\", \"tcp\", \"udp\" or \"any\"\n",
2440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	pname, pname, pname, pname, pname, pname, pname);
2450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
2460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*
2480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Check for proper racoonctl interface
2490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */
2500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#if ((RACOONCTL_INTERFACE_MAJOR != 1) || (RACOONCTL_INTERFACE < 20041230))
2510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#error	"Incompatible racoonctl interface"
2520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
2530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint
2550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangmain(ac, av)
2560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
2570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
2580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
2590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *combuf;
2600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int c;
2610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	pname = *av;
2630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/*
2650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	 * Check for proper racoonctl interface
2660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	 */
2670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if ((racoonctl_interface_major != RACOONCTL_INTERFACE_MAJOR) ||
2680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	    (racoonctl_interface < RACOONCTL_INTERFACE))
2690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "Incompatible racoonctl interface");
2700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef __linux__
2720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/*
2730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	 * Disable GNU extensions that will prevent racoonct vc -u login
2740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	 * from working (GNU getopt(3) does not like options after vc)
2750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	 */
2760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	setenv("POSIXLY_CORRECT", "1", 0);
2770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
2780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	while ((c = getopt(ac, av, "lds:")) != -1) {
2790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		switch(c) {
2800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		case 'l':
2810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			long_format++;
2820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			break;
2830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		case 'd':
2850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			loglevel++;
2860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			break;
2870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		case 's':
2890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			adminsock_path = optarg;
2900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			break;
2910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		default:
2930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			usage();
2940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			exit(0);
2950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
2960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
2970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ac -= optind;
2990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	av += optind;
3000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	combuf = get_combuf(ac, av);
3020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (!combuf)
3030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		err(1, "kmpstat");
3040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (loglevel)
3060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		racoon_hexdump(combuf, ((struct admin_com *)combuf)->ac_len);
3070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	com_init();
3090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (com_send(combuf) != 0)
3110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		goto bad;
3120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(combuf);
3140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (com_recv(&combuf) != 0)
3160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		goto bad;
3170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (handle_recv(combuf) != 0)
3180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		goto bad;
3190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(combuf);
3210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (evt_filter != EVTF_NONE)
3230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (evt_poll() != 0)
3240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			goto bad;
3250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	exit(0);
3270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang    bad:
3290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	exit(1);
3300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
3310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint
3330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangevt_poll(void) {
3340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct timeval tv;
3350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *recvbuf;
3360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *sendbuf;
3370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if ((sendbuf = f_getevt(0, NULL)) == NULL)
3390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "Cannot make combuf");
3400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	while (evt_filter & (EVTF_LOOP|EVTF_PURGE)) {
3430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		/* handle_recv closes the socket time, so open it each time */
3440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		com_init();
3450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (com_send(sendbuf) != 0)
3470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			errx(1, "Cannot send combuf");
3480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (com_recv(&recvbuf) == 0) {
3500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			handle_recv(recvbuf);
3510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			vfree(recvbuf);
3520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
3530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		tv.tv_sec = 0;
3550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		tv.tv_usec = 10;
3560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		(void)select(0, NULL, NULL, NULL, &tv);
3570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
3580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(sendbuf);
3600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return 0;
3610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
3620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* %%% */
3640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*
3650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * return command buffer.
3660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */
3670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *
3680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangget_combuf(ac, av)
3690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
3700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
3710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
3720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct cmd_tag *cp;
3730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac == 0) {
3750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		usage();
3760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		exit(0);
3770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
3780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* checking the string of command. */
3800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	for (cp = &cmdtab[0]; cp->str; cp++) {
3810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (strcmp(*av, cp->str) == 0) {
3820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			break;
3830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
3840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
3850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (!cp->str) {
3860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("Invalid command [%s]\n", *av);
3870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errno = EINVAL;
3880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return NULL;
3890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
3900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ac--;
3920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	av++;
3930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return (cp->func)(ac, av);
3940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
3950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *
3970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_reload(ac, av)
3980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
3990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
4000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
4010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *buf;
4020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct admin_com *head;
4030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	buf = vmalloc(sizeof(*head));
4050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (buf == NULL)
4060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "not enough core");
4070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head = (struct admin_com *)buf->v;
4090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_len = buf->l;
4100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_cmd = ADMIN_RELOAD_CONF;
4110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_errno = 0;
4120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_proto = 0;
4130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return buf;
4150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
4160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *
4180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_getevt(ac, av)
4190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
4200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
4210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
4220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *buf;
4230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct admin_com *head;
4240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/*
4260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	 * There are 3 ways of getting here
4270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	 * 1) racoonctl vc => evt_filter = (EVTF_LOOP|EVTF_CFG| ... )
4280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	 * 2) racoonctl es => evt_filter = EVTF_NONE
4290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	 * 3) racoonctl es -l => evt_filter = EVTF_LOOP
4300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	 * Catch the second case: show-event is here to purge all
4310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	 */
4320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (evt_filter == EVTF_NONE)
4330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		evt_filter = (EVTF_ALL|EVTF_PURGE);
4340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if ((ac >= 1) && (strcmp(av[0], "-l") == 0))
4360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		evt_filter |= EVTF_LOOP;
4370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac >= 2)
4390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "too many arguments");
4400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	buf = vmalloc(sizeof(*head));
4420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (buf == NULL)
4430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "not enough core");
4440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head = (struct admin_com *)buf->v;
4460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_len = buf->l;
4470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_cmd = ADMIN_SHOW_EVT;
4480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_errno = 0;
4490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_proto = 0;
4500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return buf;
4520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
4530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *
4550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_getsched(ac, av)
4560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
4570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
4580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
4590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *buf;
4600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct admin_com *head;
4610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	buf = vmalloc(sizeof(*head));
4630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (buf == NULL)
4640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "not enough core");
4650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head = (struct admin_com *)buf->v;
4670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_len = buf->l;
4680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_cmd = ADMIN_SHOW_SCHED;
4690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_errno = 0;
4700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_proto = 0;
4710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return buf;
4730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
4740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *
4760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_getsa(ac, av)
4770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
4780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
4790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
4800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *buf;
4810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct admin_com *head;
4820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int proto;
4830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* need protocol */
4850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac != 1)
4860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "insufficient arguments");
4870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	proto = get_proto(*av);
4880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (proto == -1)
4890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "unknown protocol %s", *av);
4900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	buf = vmalloc(sizeof(*head));
4920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (buf == NULL)
4930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "not enough core");
4940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head = (struct admin_com *)buf->v;
4960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_len = buf->l;
4970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_cmd = ADMIN_SHOW_SA;
4980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_errno = 0;
4990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_proto = proto;
5000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return buf;
5020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
5030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *
5050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_flushsa(ac, av)
5060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
5070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
5080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
5090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *buf;
5100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct admin_com *head;
5110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int proto;
5120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* need protocol */
5140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac != 1)
5150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "insufficient arguments");
5160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	proto = get_proto(*av);
5170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (proto == -1)
5180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "unknown protocol %s", *av);
5190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	buf = vmalloc(sizeof(*head));
5210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (buf == NULL)
5220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "not enough core");
5230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head = (struct admin_com *)buf->v;
5250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_len = buf->l;
5260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_cmd = ADMIN_FLUSH_SA;
5270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_errno = 0;
5280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_proto = proto;
5290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return buf;
5310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
5320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *
5340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_deletesa(ac, av)
5350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
5360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
5370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
5380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *buf, *index;
5390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct admin_com *head;
5400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int proto;
5410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* need protocol */
5430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac < 1)
5440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "insufficient arguments");
5450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	proto = get_proto(*av);
5460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (proto == -1)
5470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "unknown protocol %s", *av);
5480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* get index(es) */
5500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	av++;
5510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ac--;
5520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	switch (proto) {
5530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	case ADMIN_PROTO_ISAKMP:
5540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		index = get_index(ac, av);
5550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (index == NULL)
5560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			return NULL;
5570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		break;
5580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	case ADMIN_PROTO_AH:
5590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	case ADMIN_PROTO_ESP:
5600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		index = get_index(ac, av);
5610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (index == NULL)
5620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			return NULL;
5630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		break;
5640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	default:
5650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errno = EPROTONOSUPPORT;
5660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return NULL;
5670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
5680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	buf = vmalloc(sizeof(*head) + index->l);
5700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (buf == NULL)
5710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		goto out;
5720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head = (struct admin_com *)buf->v;
5740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_len = buf->l + index->l;
5750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_cmd = ADMIN_DELETE_SA;
5760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_errno = 0;
5770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_proto = proto;
5780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memcpy(buf->v+sizeof(*head), index->v, index->l);
5800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangout:
5820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (index != NULL)
5830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		vfree(index);
5840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return buf;
5860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
5870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *
5890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_deleteallsadst(ac, av)
5900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
5910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
5920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
5930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *buf, *index;
5940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct admin_com *head;
5950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int proto;
5960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* need protocol */
5980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac < 1)
5990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "insufficient arguments");
6000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	proto = get_proto(*av);
6010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (proto == -1)
6020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "unknown protocol %s", *av);
6030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* get index(es) */
6050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	av++;
6060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ac--;
6070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	switch (proto) {
6080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	case ADMIN_PROTO_ISAKMP:
6090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		index = get_index(ac, av);
6100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (index == NULL)
6110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			return NULL;
6120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		break;
6130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	case ADMIN_PROTO_AH:
6140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	case ADMIN_PROTO_ESP:
6150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		index = get_index(ac, av);
6160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (index == NULL)
6170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			return NULL;
6180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		break;
6190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	default:
6200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errno = EPROTONOSUPPORT;
6210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return NULL;
6220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
6230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	buf = vmalloc(sizeof(*head) + index->l);
6250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (buf == NULL)
6260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		goto out;
6270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head = (struct admin_com *)buf->v;
6290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_len = buf->l + index->l;
6300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_cmd = ADMIN_DELETE_ALL_SA_DST;
6310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_errno = 0;
6320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_proto = proto;
6330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memcpy(buf->v+sizeof(*head), index->v, index->l);
6350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangout:
6370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (index != NULL)
6380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		vfree(index);
6390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return buf;
6410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
6420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *
6440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_exchangesa(ac, av)
6450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
6460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
6470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
6480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *buf, *index;
6490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct admin_com *head;
6500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int proto;
6510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int cmd = ADMIN_ESTABLISH_SA;
6520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	size_t com_len = 0;
6530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *id = NULL;
6540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *key = NULL;
6550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct admin_com_psk *acp;
6560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac < 1)
6580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "insufficient arguments");
6590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* Optional -u identity */
6610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (strcmp(av[0], "-u") == 0) {
6620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (ac < 2)
6630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			errx(1, "-u require an argument");
6640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		id = av[1];
6660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if ((key = getpass("Password: ")) == NULL)
6670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			errx(1, "getpass() failed: %s", strerror(errno));
6680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		com_len += sizeof(*acp) + strlen(id) + 1 + strlen(key) + 1;
6700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		cmd = ADMIN_ESTABLISH_SA_PSK;
6710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		av += 2;
6730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		ac -= 2;
6740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
6750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* need protocol */
6770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac < 1)
6780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "insufficient arguments");
6790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if ((proto = get_proto(*av)) == -1)
6800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "unknown protocol %s", *av);
6810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* get index(es) */
6830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	av++;
6840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ac--;
6850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	switch (proto) {
6860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	case ADMIN_PROTO_ISAKMP:
6870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		index = get_index(ac, av);
6880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (index == NULL)
6890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			return NULL;
6900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		break;
6910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	case ADMIN_PROTO_AH:
6920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	case ADMIN_PROTO_ESP:
6930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		index = get_index(ac, av);
6940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (index == NULL)
6950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			return NULL;
6960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		break;
6970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	default:
6980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errno = EPROTONOSUPPORT;
6990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return NULL;
7000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
7010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	com_len += sizeof(*head) + index->l;
7030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if ((buf = vmalloc(com_len)) == NULL)
7040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "Cannot allocate buffer");
7050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head = (struct admin_com *)buf->v;
7070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_len = buf->l;
7080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_cmd = cmd;
7090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_errno = 0;
7100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_proto = proto;
7110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memcpy(buf->v+sizeof(*head), index->v, index->l);
7130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (id && key) {
7150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		char *data;
7160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		acp = (struct admin_com_psk *)
7170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		    (buf->v + sizeof(*head) + index->l);
7180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		acp->id_type = IDTYPE_USERFQDN;
7200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		acp->id_len = strlen(id) + 1;
7210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		acp->key_len = strlen(key) + 1;
7220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		data = (char *)(acp + 1);
7240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		strcpy(data, id);
7250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		data = (char *)(data + acp->id_len);
7270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		strcpy(data, key);
7280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
7290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(index);
7310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return buf;
7330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
7340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *
7360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_vpnc(ac, av)
7370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
7380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
7390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
7400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *nav[] = {NULL, NULL, NULL, NULL, NULL, NULL};
7410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int nac = 0;
7420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *isakmp = "isakmp";
7430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *inet = "inet";
7440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *srcaddr;
7450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct addrinfo hints, *res;
7460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct sockaddr *src;
7470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *idx;
7480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac < 1)
7500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "insufficient arguments");
7510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	evt_filter = (EVTF_LOOP|EVTF_CFG|EVTF_CFG_STOP|EVTF_ERR|EVTF_ERR_STOP);
7530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	time(&evt_start);
7540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* Optional -u identity */
7560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (strcmp(av[0], "-u") == 0) {
7570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (ac < 2)
7580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			errx(1, "-u require an argument");
7590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		nav[nac++] = av[0];
7610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		nav[nac++] = av[1];
7620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		ac -= 2;
7640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		av += 2;
7650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
7660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac < 1)
7680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "VPN gateway required");
7690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac > 1)
7700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		warnx("Extra arguments");
7710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/*
7730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	 * Find the source address
7740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	 */
7750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memset(&hints, 0, sizeof(hints));
7760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	hints.ai_family = PF_UNSPEC;
7770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	hints.ai_socktype = SOCK_DGRAM;
7780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (getaddrinfo(av[0], "4500", &hints, &res) != 0)
7790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "Cannot resolve destination address");
7800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if ((src = getlocaladdr(res->ai_addr)) == NULL)
7820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "cannot find source address");
7830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if ((srcaddr = saddr2str(src)) == NULL)
7850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "cannot read source address");
7860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* We get "ip[port]" strip the port */
7880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if ((idx = index(srcaddr, '[')) == NULL)
7890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "unexpected source address format");
7900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	*idx = '\0';
7910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	nav[nac++] = isakmp;
7930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	nav[nac++] = inet;
7940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	nav[nac++] = srcaddr;
7950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	nav[nac++] = av[0];
7960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return f_exchangesa(nac, nav);
7980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
7990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *
8010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_vpnd(ac, av)
8020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
8030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
8040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
8050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *nav[] = {NULL, NULL, NULL, NULL};
8060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int nac = 0;
8070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *isakmp = "isakmp";
8080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *inet = "inet";
8090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *anyaddr = "0.0.0.0";
8100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *idx;
8110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac < 1)
8130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "VPN gateway required");
8140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac > 1)
8150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		warnx("Extra arguments");
8160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	evt_filter =
8180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	    (EVTF_PH1DOWN|EVTF_PH1DOWN_STOP|EVTF_LOOP|EVTF_ERR|EVTF_ERR_STOP);
8190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	nav[nac++] = isakmp;
8210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	nav[nac++] = inet;
8220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	nav[nac++] = anyaddr;
8230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	nav[nac++] = av[0];
8240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return f_deleteallsadst(nac, nav);
8260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
8270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef ENABLE_HYBRID
8290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *
8300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_logoutusr(ac, av)
8310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
8320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
8330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
8340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *buf;
8350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct admin_com *head;
8360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *user;
8371c71527b277e2dc256262da2ed2169c566c5bf4dChia-chi Yeh	size_t userlen;
8380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* need username */
8400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac < 1)
8410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "insufficient arguments");
8420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	user = av[0];
8431c71527b277e2dc256262da2ed2169c566c5bf4dChia-chi Yeh	userlen = strlen(user);
8441c71527b277e2dc256262da2ed2169c566c5bf4dChia-chi Yeh	if ((user == NULL) || (userlen > LOGINLEN))
8450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "bad login (too long?)");
8460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8471c71527b277e2dc256262da2ed2169c566c5bf4dChia-chi Yeh	buf = vmalloc(sizeof(*head) + userlen);
8480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (buf == NULL)
8490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return NULL;
8500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head = (struct admin_com *)buf->v;
8520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_len = buf->l;
8530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_cmd = ADMIN_LOGOUT_USER;
8540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_errno = 0;
8550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_proto = 0;
8560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8571c71527b277e2dc256262da2ed2169c566c5bf4dChia-chi Yeh	strncpy((char *)(head + 1), user, userlen);
8580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return buf;
8600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
8610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif /* ENABLE_HYBRID */
8620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int
8650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangget_proto(str)
8660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *str;
8670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
8680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct proto_tag *cp;
8690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (str == NULL) {
8710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errno = EINVAL;
8720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return -1;
8730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
8740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* checking the string of command. */
8760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	for (cp = &prototab[0]; cp->str; cp++) {
8770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (strcmp(str, cp->str) == 0)
8780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			return cp->proto;
8790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
8800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	errno = EINVAL;
8820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return -1;
8830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
8840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *
8860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangget_index(ac, av)
8870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
8880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
8890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
8900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int family;
8910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac != 3 && ac != 4) {
8930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errno = EINVAL;
8940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return NULL;
8950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
8960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* checking the string of family */
8980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	family = get_family(*av);
8990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (family == -1)
9000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return NULL;
9010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	av++;
9020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ac--;
9030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return get_comindexes(family, ac, av);
9050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
9060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int
9080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangget_family(str)
9090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *str;
9100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
9110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (strcmp("inet", str) == 0)
9120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return AF_INET;
9130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef INET6
9140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	else if (strcmp("inet6", str) == 0)
9150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return AF_INET6;
9160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
9170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	errno = EAFNOSUPPORT;
9180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return -1;
9190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
9200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *
9220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangget_comindexes(family, ac, av)
9230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int family;
9240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
9250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
9260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
9270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *buf;
9280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct admin_com_indexes *ci;
9290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *p_name = NULL, *p_port = NULL;
9300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *p_prefs = NULL, *p_prefd = NULL;
9310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct sockaddr *src = NULL, *dst = NULL;
9320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ulproto;
9330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac != 2 && ac != 3) {
9350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errno = EINVAL;
9360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return NULL;
9370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
9380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (get_comindex(*av, &p_name, &p_port, &p_prefs) == -1)
9400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		goto bad;
9410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	src = get_sockaddr(family, p_name, p_port);
9420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (p_name) {
9430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		racoon_free(p_name);
9440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		p_name = NULL;
9450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
9460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (p_port) {
9470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		racoon_free(p_port);
9480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		p_port = NULL;
9490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
9500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (src == NULL)
9510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		goto bad;
9520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	av++;
9530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ac--;
9540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (get_comindex(*av, &p_name, &p_port, &p_prefd) == -1)
9550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		goto bad;
9560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	dst = get_sockaddr(family, p_name, p_port);
9570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (p_name) {
9580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		racoon_free(p_name);
9590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		p_name = NULL;
9600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
9610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (p_port) {
9620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		racoon_free(p_port);
9630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		p_port = NULL;
9640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
9650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (dst == NULL)
9660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		goto bad;
9670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	buf = vmalloc(sizeof(*ci));
9690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (buf == NULL)
9700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		goto bad;
9710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	av++;
9730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ac--;
9740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if(ac){
9750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		ulproto = get_ulproto(*av);
9760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (ulproto == -1)
9770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			goto bad;
9780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}else
9790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		ulproto=0;
9800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ci = (struct admin_com_indexes *)buf->v;
9820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if(p_prefs)
9830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		ci->prefs = (u_int8_t)atoi(p_prefs); /* XXX should be handled error. */
9840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	else
9850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		ci->prefs = 32;
9860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if(p_prefd)
9870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		ci->prefd = (u_int8_t)atoi(p_prefd); /* XXX should be handled error. */
9880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	else
9890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		ci->prefd = 32;
9900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ci->ul_proto = ulproto;
9910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memcpy(&ci->src, src, sysdep_sa_len(src));
9920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memcpy(&ci->dst, dst, sysdep_sa_len(dst));
9930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (p_name)
9950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		racoon_free(p_name);
9960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return buf;
9980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang   bad:
10000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (p_name)
10010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		racoon_free(p_name);
10020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (p_port)
10030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		racoon_free(p_port);
10040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (p_prefs)
10050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		racoon_free(p_prefs);
10060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (p_prefd)
10070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		racoon_free(p_prefd);
10080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return NULL;
10090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
10100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int
10120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangget_comindex(str, name, port, pref)
10130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *str, **name, **port, **pref;
10140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
10150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *p;
10160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	*name = *port = *pref = NULL;
10180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	*name = racoon_strdup(str);
10200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	STRDUP_FATAL(*name);
10210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	p = strpbrk(*name, "/[");
10220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (p != NULL) {
10230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (*(p + 1) == '\0')
10240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			goto bad;
10250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (*p == '/') {
10260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			*p = '\0';
10270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			*pref = racoon_strdup(p + 1);
10280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			STRDUP_FATAL(*pref);
10290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			p = strchr(*pref, '[');
10300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			if (p != NULL) {
10310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				if (*(p + 1) == '\0')
10320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang					goto bad;
10330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				*p = '\0';
10340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				*port = racoon_strdup(p + 1);
10350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				STRDUP_FATAL(*port);
10360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				p = strchr(*pref, ']');
10370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				if (p == NULL)
10380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang					goto bad;
10390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				*p = '\0';
10400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			}
10410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		} else if (*p == '[') {
10420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			if (*pref == NULL)
10430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				goto bad;
10440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			*p = '\0';
10450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			*port = racoon_strdup(p + 1);
10460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			STRDUP_FATAL(*port);
10470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			p = strchr(*pref, ']');
10480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			if (p == NULL)
10490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				goto bad;
10500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			*p = '\0';
10510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		} else {
10520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			/* XXX */
10530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
10540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
10550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return 0;
10570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang    bad:
10590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (*name)
10610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		racoon_free(*name);
10620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (*port)
10630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		racoon_free(*port);
10640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (*pref)
10650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		racoon_free(*pref);
10660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	*name = *port = *pref = NULL;
10670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return -1;
10680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
10690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int
10710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangget_ulproto(str)
10720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *str;
10730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
10740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct ulproto_tag *cp;
10750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if(str == NULL){
10770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errno = EINVAL;
10780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return -1;
10790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
10800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* checking the string of upper layer protocol. */
10820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	for (cp = &ulprototab[0]; cp->str; cp++) {
10830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (strcmp(str, cp->str) == 0)
10840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			return cp->ul_proto;
10850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
10860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	errno = EINVAL;
10880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return -1;
10890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
10900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* %%% */
10920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid
10930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangdump_isakmp_sa(buf, len)
10940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *buf;
10950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int len;
10960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
10970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct ph1dump *pd;
10980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct tm *tm;
10990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char tbuf[56];
11000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	caddr_t p = NULL;
11010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
11020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* isakmp status header */
11030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* short header;
11040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1234567890123456789012 0000000000000000:0000000000000000 000000000000
11050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang*/
11060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *header1 =
11070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"Destination            Cookies                           Created";
11080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
11090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* semi long header;
11100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1234567890123456789012 0000000000000000:0000000000000000 00 X 00 X 0000-00-00 00:00:00 000000
11110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang*/
11120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *header2 =
11130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"Destination            Cookies                           ST S  V E Created             Phase2";
11140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
11150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* long header;
11160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 0000:0000:0000:0000:0000:0000:0000:0000.00000 0000:0000:0000:0000:0000:0000:0000:0000.00000 0000000000000000:0000000000000000 00 X 00 X 0000-00-00 00:00:00 000000
11170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang*/
11180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *header3 =
11190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"Source                                        Destination                                   Cookies                           ST S  V E Created             Phase2";
11200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
11210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* phase status header */
11220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* short format;
11230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang   side stats source address         destination address
11240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang   xxx  xxxxx 1234567890123456789012 1234567890123456789012
11250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang*/
11260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
11270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	static char *estr[] = { "", "B", "M", "U", "A", "I", };
11280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
11290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	switch (long_format) {
11300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	case 0:
11310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s\n", header1);
11320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		break;
11330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	case 1:
11340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s\n", header2);
11350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		break;
11360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	case 2:
11370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	default:
11380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s\n", header3);
11390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		break;
11400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
11410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
11420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (len % sizeof(*pd))
11430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("invalid length %d\n", len);
11440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	len /= sizeof(*pd);
11450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
11460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	pd = (struct ph1dump *)buf;
11470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
11480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	while (len-- > 0) {
11490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		/* source address */
11500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (long_format >= 2) {
11510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			GETNAMEINFO((struct sockaddr *)&pd->local, _addr1_, _addr2_);
11520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			switch (long_format) {
11530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			case 0:
11540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				break;
11550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			case 1:
11560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				p = fixed_addr(_addr1_, _addr2_, 22);
11570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				break;
11580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			case 2:
11590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			default:
11600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				p = fixed_addr(_addr1_, _addr2_, 45);
11610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				break;
11620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			}
11630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			printf("%s ", p);
11640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
11650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
11660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		/* destination address */
11670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		GETNAMEINFO((struct sockaddr *)&pd->remote, _addr1_, _addr2_);
11680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		switch (long_format) {
11690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		case 0:
11700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		case 1:
11710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			p = fixed_addr(_addr1_, _addr2_, 22);
11720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			break;
11730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		case 2:
11740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		default:
11750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			p = fixed_addr(_addr1_, _addr2_, 45);
11760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			break;
11770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
11780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s ", p);
11790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
11800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s ", pindex_isakmp(&pd->index));
11810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
11820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		/* statuc, side and version */
11830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (long_format >= 1) {
11840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			printf("%2d %c %2x ",
11850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				pd->status,
11860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				pd->side == INITIATOR ? 'I' : 'R',
11870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				pd->version);
11880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			if (ARRAYLEN(estr) > pd->etype)
11890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				printf("%s ", estr[pd->etype]);
11900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
11910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
11920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		/* created date */
11930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (pd->created) {
11940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			tm = localtime(&pd->created);
11950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			strftime(tbuf, sizeof(tbuf), "%Y-%m-%d %T", tm);
11960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		} else
11970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			snprintf(tbuf, sizeof(tbuf), "                   ");
11980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s ", tbuf);
11990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		/* counter of phase 2 */
12010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (long_format >= 1)
12020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			printf("%6d ", pd->ph2cnt);
12030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("\n");
12050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		pd++;
12070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
12080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return;
12100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
12110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* %%% */
12130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid
12140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangdump_internal(buf, tlen)
12150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *buf;
12160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int tlen;
12170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
12180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct ph2handle *iph2;
12190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct sockaddr *addr;
12200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*
12220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangshort header;
12230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang source address         destination address
12240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1234567890123456789012 1234567890123456789012
12250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang*/
12260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *short_h1 =
12270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"Source                 Destination            ";
12280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*
12300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanglong header;
12310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang source address                                destination address
12320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 123456789012345678901234567890123456789012345 123456789012345678901234567890123456789012345
12330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 0000:0000:0000:0000:0000:0000:0000:0000.00000 0000:0000:0000:0000:0000:0000:0000:0000.00000 0000:0000:0000:0000:0000:0000:0000:0000.00000
12340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang*/
12350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *long_h1 =
12360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"Source                                        Destination                                  ";
12370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("%s\n", long_format ? long_h1 : short_h1);
12390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	while (tlen > 0) {
12410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		iph2 = (struct ph2handle *)buf;
12420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		addr = (struct sockaddr *)(++iph2);
12430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		GETNAMEINFO(addr, _addr1_, _addr2_);
12450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s ", long_format ?
12460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  fixed_addr(_addr1_, _addr2_, 45)
12470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			: fixed_addr(_addr1_, _addr2_, 22));
12480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		addr++;
12490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		tlen -= sysdep_sa_len(addr);
12500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		GETNAMEINFO(addr, _addr1_, _addr2_);
12520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s ", long_format ?
12530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  fixed_addr(_addr1_, _addr2_, 45)
12540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			: fixed_addr(_addr1_, _addr2_, 22));
12550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		addr++;
12560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		tlen -= sysdep_sa_len(addr);
12570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("\n");
12590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
12600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return;
12620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
12630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* %%% */
12650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *
12660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangpindex_isakmp(index)
12670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	isakmp_index *index;
12680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
12690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	static char buf[64];
12700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	u_char *p;
12710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int i, j;
12720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memset(buf, 0, sizeof(buf));
12740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* copy index */
12760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	p = (u_char *)index;
12770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	for (j = 0, i = 0; i < sizeof(isakmp_index); i++) {
12780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		snprintf((char *)&buf[j], sizeof(buf) - j, "%02x", p[i]);
12790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		j += 2;
12800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		switch (i) {
12810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		case 7:
12820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#if 0
12830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		case 15:
12840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
12850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			buf[j++] = ':';
12860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
12870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
12880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return buf;
12900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
12910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* print schedule */
12930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *str_sched_stat[] = {
12940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"off",
12950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"on",
12960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"dead",
12970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang};
12980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
12990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *str_sched_id[] = {
13000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"PH1resend",
13010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"PH1lifetime",
13020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"PH2resend",
13030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"PSTacquire",
13040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"PSTlifetime",
13050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang};
13060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid
13080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangprint_schedule(buf, len)
13090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	caddr_t buf;
13100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int len;
13110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
13120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct scheddump *sc = (struct scheddump *)buf;
13130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct tm *tm;
13140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char tbuf[56];
13150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (len % sizeof(*sc))
13170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("invalid length %d\n", len);
13180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	len /= sizeof(*sc);
13190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/*      00000000 00000000 00000000 xxx........*/
13210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("index    tick     xtime    created\n");
13220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	while (len-- > 0) {
13240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		tm = localtime(&sc->created);
13250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		strftime(tbuf, sizeof(tbuf), "%Y-%m-%d %T", tm);
13260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%-8ld %-8ld %-8ld %s\n",
13280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			sc->id,
13290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			(long)sc->tick,
13300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			(long)sc->xtime,
13310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			tbuf);
13320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		sc++;
13330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
13340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return;
13360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
13370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid
13400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangprint_evt(buf, len)
13410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	caddr_t buf;
13420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int len;
13430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
13440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct evtdump *evtdump = (struct evtdump *)buf;
13450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int i;
13460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *srcstr;
13470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *dststr;
13480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	for (i = 0; evtmsg[i].msg; i++)
13500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (evtmsg[i].type == evtdump->type)
13510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			break;
13520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (evtmsg[i].msg == NULL)
13540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("Event %d: ", evtdump->type);
13550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	else
13560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s : ", evtmsg[i].msg);
13570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if ((srcstr = saddr2str((struct sockaddr *)&evtdump->src)) == NULL)
13590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("unknown");
13600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	else
13610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s", srcstr);
13620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf(" -> ");
13630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if ((dststr = saddr2str((struct sockaddr *)&evtdump->dst)) == NULL)
13640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("unknown");
13650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	else
13660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s", dststr);
13670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("\n");
13680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return;
13700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
13710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid
13730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangprint_err(buf, len)
13740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	caddr_t buf;
13750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int len;
13760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
13770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct evtdump *evtdump = (struct evtdump *)buf;
13780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int i;
13790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	for (i = 0; evtmsg[i].msg; i++)
13820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (evtmsg[i].type == evtdump->type)
13830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			break;
13840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (evtmsg[i].level != ERROR)
13860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return;
13870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (evtmsg[i].msg == NULL)
13890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("Error: Event %d\n", evtdump->type);
13900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	else
13910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("Error: %s\n", evtmsg[i].msg);
13920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (evt_filter & EVTF_ERR_STOP)
13940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		evt_filter &= ~EVTF_LOOP;
13950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return;
13970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
13980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
13990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*
14000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Print a message when phase 1 SA goes down
14010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */
14020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid
14030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangprint_ph1down(buf, len)
14040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	caddr_t buf;
14050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int len;
14060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
14070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct evtdump *evtdump = (struct evtdump *)buf;
14080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
14090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (evtdump->type != EVTT_PHASE1_DOWN)
14100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return;
14110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
14120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("VPN connexion terminated\n");
14130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
14140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (evt_filter & EVTF_PH1DOWN_STOP)
14150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		evt_filter &= ~EVTF_LOOP;
14160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
14170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return;
14180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
14190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
14200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*
14210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Print ISAKMP mode config info (IP and banner)
14220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */
14230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid
14240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangprint_cfg(buf, len)
14250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	caddr_t buf;
14260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int len;
14270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
14280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct evtdump *evtdump = (struct evtdump *)buf;
14290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct isakmp_data *attr;
14300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *banner = NULL;
14310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct in_addr addr4;
14320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
14330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memset(&addr4, 0, sizeof(addr4));
14340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
14350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (evtdump->type != EVTT_ISAKMP_CFG_DONE &&
14360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	    evtdump->type != EVTT_NO_ISAKMP_CFG)
14370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return;
14380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
14390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	len -= sizeof(*evtdump);
14400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	attr = (struct isakmp_data *)(evtdump + 1);
14410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
14420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	while (len > 0) {
14430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (len < sizeof(*attr)) {
14440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			printf("short attribute too short\n");
14450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			break;
14460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
14470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
14480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if ((ntohs(attr->type) & ISAKMP_GEN_MASK) == ISAKMP_GEN_TV) {
14490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			/* Short attribute, skip */
14500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			len -= sizeof(*attr);
14510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			attr++;
14520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		} else { /* Long attribute */
14530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			char *n;
14540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
14550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			if (len < (sizeof(*attr) + ntohs(attr->lorv))) {
14560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				printf("long attribute too long\n");
14570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				break;
14580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			}
14590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
14600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			switch (ntohs(attr->type) & ~ISAKMP_GEN_MASK) {
14610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			case INTERNAL_IP4_ADDRESS:
14620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				if (ntohs(attr->lorv) < sizeof(addr4)) {
14630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang					printf("addr4 attribute too short\n");
14640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang					break;
14650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				}
14660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				memcpy(&addr4, attr + 1, sizeof(addr4));
14670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				break;
14680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
14690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			case UNITY_BANNER:
14700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				banner = racoon_malloc(ntohs(attr->lorv) + 1);
14710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				if (banner == NULL) {
14720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang					printf("malloc failed\n");
14730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang					break;
14740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				}
14750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				memcpy(banner, attr + 1, ntohs(attr->lorv));
14760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				banner[ntohs(attr->lorv)] = '\0';
14770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				break;
14780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
14790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			default:
14800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				break;
14810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			}
14820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
14830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			len -= (sizeof(*attr) + ntohs(attr->lorv));
14840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			n = (char *)attr;
14850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			attr = (struct isakmp_data *)
14860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			    (n + sizeof(*attr) + ntohs(attr->lorv));
14870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
14880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
14890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
14900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (evtdump->type == EVTT_ISAKMP_CFG_DONE)
14910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("Bound to address %s\n", inet_ntoa(addr4));
14920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	else
14930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("VPN connexion established\n");
14940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
14950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (banner) {
14960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		struct winsize win;
14970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		int col = 0;
14980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		int i;
14990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (ioctl(1, TIOCGWINSZ, &win) != 1)
15010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			col = win.ws_col;
15020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		for (i = 0; i < col; i++)
15040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			printf("%c", '=');
15050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("\n%s\n", banner);
15060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		for (i = 0; i < col; i++)
15070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			printf("%c", '=');
15080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("\n");
15090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		racoon_free(banner);
15100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
15110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (evt_filter & EVTF_CFG_STOP)
15130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		evt_filter &= ~EVTF_LOOP;
15140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return;
15160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
15170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *
15200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangfixed_addr(addr, port, len)
15210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *addr, *port;
15220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int len;
15230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
15240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	static char _addr_buf_[BUFSIZ];
15250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *p;
15260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int plen, i;
15270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* initialize */
15290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memset(_addr_buf_, ' ', sizeof(_addr_buf_));
15300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	plen = strlen(port);
15320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (len < plen + 1)
15330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return NULL;
15340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	p = _addr_buf_;
15360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	for (i = 0; i < len - plen - 1 && addr[i] != '\0'; /*noting*/)
15370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		*p++ = addr[i++];
15380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	*p++ = '.';
15390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	for (i = 0; i < plen && port[i] != '\0'; /*noting*/)
15410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		*p++ = port[i++];
15420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	_addr_buf_[len] = '\0';
15440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return _addr_buf_;
15460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
15470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int
15490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanghandle_recv(combuf)
15500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *combuf;
15510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
15520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang        struct admin_com h, *com;
15530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang        caddr_t buf;
15540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang        int len;
15550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	com = (struct admin_com *)combuf->v;
15570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	len = com->ac_len - sizeof(*com);
15580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	buf = combuf->v + sizeof(*com);
15590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	switch (com->ac_cmd) {
15610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	case ADMIN_SHOW_SCHED:
15620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		print_schedule(buf, len);
15630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		break;
15640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	case ADMIN_SHOW_EVT: {
15660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		struct evtdump *evtdump;
15670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		/* We got no event */
15690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (len == 0) {
15700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			/* If we were purging the queue, it is now done */
15710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			if (evt_filter & EVTF_PURGE)
15720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				evt_filter &= ~EVTF_PURGE;
15730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			break;
15740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
15750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (len < sizeof(struct evtdump))
15770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			errx(1, "Short buffer\n");
15780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		/* Toss outdated events */
15800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		evtdump = (struct evtdump *)buf;
15810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (evtdump->timestamp < evt_start)
15820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			break;
15830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (evt_filter & EVTF_ALL)
15850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			print_evt(buf, len);
15860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (evt_filter & EVTF_ERR)
15870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			print_err(buf, len);
15880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (evt_filter & EVTF_CFG)
15890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			print_cfg(buf, len);
15900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (evt_filter & EVTF_PH1DOWN)
15910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			print_ph1down(buf, len);
15920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		break;
15930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
15940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
15950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	case ADMIN_SHOW_SA:
15960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	   {
15970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		switch (com->ac_proto) {
15980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		case ADMIN_PROTO_ISAKMP:
15990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			dump_isakmp_sa(buf, len);
16000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			break;
16010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		case ADMIN_PROTO_IPSEC:
16020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		case ADMIN_PROTO_AH:
16030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		case ADMIN_PROTO_ESP:
16040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		    {
16050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			struct sadb_msg *msg = (struct sadb_msg *)buf;
16060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
16070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			switch (msg->sadb_msg_errno) {
16080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			case ENOENT:
16090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				switch (msg->sadb_msg_type) {
16100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				case SADB_DELETE:
16110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				case SADB_GET:
16120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang					printf("No entry.\n");
16130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang					break;
16140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				case SADB_DUMP:
16150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang					printf("No SAD entries.\n");
16160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang					break;
16170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				}
16180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				break;
16190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			case 0:
16200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				while (1) {
16210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang					pfkey_sadump(msg);
16220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang					if (msg->sadb_msg_seq == 0)
16230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang						break;
16240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang					msg = (struct sadb_msg *)((caddr_t)msg +
16250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang						     PFKEY_UNUNIT64(msg->sadb_msg_len));
16260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				}
16270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				break;
16280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			default:
16290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				printf("%s.\n", strerror(msg->sadb_msg_errno));
16300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			}
16310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		    }
16320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			break;
16330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		case ADMIN_PROTO_INTERNAL:
16340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			dump_internal(buf, len);
16350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			break;
16360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		default:
16370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			printf("Invalid proto [%d]\n", com->ac_proto);
16380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
16390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
16400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	    }
16410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		break;
16420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
16430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	default:
16440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		/* IGNORE */
16450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		break;
16460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
16470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
16480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	close(so);
16490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return 0;
16500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
16510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang    bad:
16520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	close(so);
16530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return -1;
16540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
1655