1c91307af2622f6625525f3c1f9c954376df950adChia-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 **));
107c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	int cmd;
1080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *str;
1090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} cmdtab[] = {
110c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_reload,	ADMIN_RELOAD_CONF,	"reload-config" },
111c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_reload,	ADMIN_RELOAD_CONF,	"rc" },
112c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_getsched,	ADMIN_SHOW_SCHED,	"show-schedule" },
113c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_getsched,	ADMIN_SHOW_SCHED,	"sc" },
114c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_getsa,	ADMIN_SHOW_SA,		"show-sa" },
115c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_getsa,	ADMIN_SHOW_SA,		"ss" },
116c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_flushsa,	ADMIN_FLUSH_SA,		"flush-sa" },
117c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_flushsa,	ADMIN_FLUSH_SA,		"fs" },
118c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_deletesa,	ADMIN_DELETE_SA,	"delete-sa" },
119c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_deletesa,	ADMIN_DELETE_SA,	"ds" },
120c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_exchangesa,	ADMIN_ESTABLISH_SA,	"establish-sa" },
121c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_exchangesa,	ADMIN_ESTABLISH_SA,	"es" },
122c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_vpnc,	ADMIN_ESTABLISH_SA,	"vpn-connect" },
123c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_vpnc,	ADMIN_ESTABLISH_SA,	"vc" },
124c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_vpnd,	ADMIN_DELETE_ALL_SA_DST,"vpn-disconnect" },
125c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_vpnd,	ADMIN_DELETE_ALL_SA_DST,"vd" },
126c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_getevt,	ADMIN_SHOW_EVT,		"show-event" },
127c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_getevt,	ADMIN_SHOW_EVT,		"se" },
1280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef ENABLE_HYBRID
129c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_logoutusr,	ADMIN_LOGOUT_USER,	"logout-user" },
130c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ f_logoutusr,	ADMIN_LOGOUT_USER,	"lu" },
1310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
132c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ NULL, 0, NULL },
1330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang};
1340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct evtmsg {
1360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int type;
1370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *msg;
138c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	enum { UNSPEC, ERROR, INFO } level;
1390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} evtmsg[] = {
140c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ EVTT_PHASE1_UP, "Phase 1 established", INFO },
141c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ EVTT_PHASE1_DOWN, "Phase 1 deleted", INFO },
142c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ EVTT_XAUTH_SUCCESS, "Xauth exchange passed", INFO },
143c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ EVTT_ISAKMP_CFG_DONE, "ISAKMP mode config done", INFO },
144c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ EVTT_PHASE2_UP, "Phase 2 established", INFO },
145c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ EVTT_PHASE2_DOWN, "Phase 2 deleted", INFO },
146c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ EVTT_DPD_TIMEOUT, "Peer not reachable anymore", ERROR },
147c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ EVTT_PEER_NO_RESPONSE, "Peer not responding", ERROR },
148c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ EVTT_PEER_DELETE, "Peer terminated security association", ERROR },
149c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ EVTT_RACOON_QUIT, "Raccon terminated", ERROR },
150c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ EVTT_OVERFLOW, "Event queue overflow", ERROR },
151c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ EVTT_XAUTH_FAILED, "Xauth exchange failed", ERROR },
152c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ EVTT_PEERPH1AUTH_FAILED, "Peer failed phase 1 authentication "
153c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	    "(certificate problem?)", ERROR },
154c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ EVTT_PEERPH1_NOPROP, "Peer failed phase 1 initiation "
155c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	    "(proposal problem?)", ERROR },
156c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ 0, NULL, UNSPEC },
157c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	{ 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;
196c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
197c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_NONE		0x0000	/* Ignore any events */
198c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_LOOP		0x0001	/* Loop awaiting for new events */
199c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_CFG_STOP		0x0002	/* Stop after ISAKMP mode config */
200c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_CFG		0x0004	/* Print ISAKMP mode config info */
201c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_ALL		0x0008	/* Print any events */
202c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_PURGE		0x0010	/* Print all available events */
203c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_PH1DOWN_STOP	0x0020	/* Stop when phase 1 SA gets down */
204c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_PH1DOWN		0x0040	/* Print that phase 1 SA got down */
205c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_ERR		0x0080	/* Print any error */
206c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_ERR_STOP		0x0100	/* Stop on any error */
207c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
208c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehint evt_filter = EVTF_NONE;
209c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehtime_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));
215c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehvoid print_evt __P((caddr_t, int));
216c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehvoid print_cfg __P((caddr_t, int));
217c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehvoid print_err __P((caddr_t, int));
218c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehvoid print_ph1down __P((caddr_t, int));
219c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehvoid print_ph1up __P((caddr_t, int));
220c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehint 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"
228c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh"  %s reload-config\n"
229c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh"  %s [-l [-l]] show-sa [protocol]\n"
230c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh"  %s flush-sa [protocol]\n"
231c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh"  %s delete-sa <saopts>\n"
232c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh"  %s establish-sa [-u identity] <saopts>\n"
233c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh"  %s vpn-connect [-u identity] vpn_gateway\n"
234c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh"  %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"
243c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh"    <ul_proto>: \"icmp\", \"tcp\", \"udp\" or \"any\"\n",
244c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	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
315c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (com_recv(&combuf) != 0)
316c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		goto bad;
317c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (handle_recv(combuf) != 0)
318c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		goto bad;
3190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
320c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	vfree(combuf);
321c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
322c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (evt_filter != EVTF_NONE)
323c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		if (evt_poll() != 0)
324c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh			goto bad;
325c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
3260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	exit(0);
3270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
328c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh    bad:
3290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	exit(1);
3300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
3310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
332c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehint
333c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehevt_poll(void) {
334c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	struct timeval tv;
335c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	vchar_t *recvbuf;
336c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	vchar_t *sendbuf;
337c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
338c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if ((sendbuf = f_getevt(0, NULL)) == NULL)
339c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		errx(1, "Cannot make combuf");
340c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
341c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
342c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	while (evt_filter & (EVTF_LOOP|EVTF_PURGE)) {
343c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		/* handle_recv closes the socket time, so open it each time */
344c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		com_init();
345c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
346c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		if (com_send(sendbuf) != 0)
347c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh			errx(1, "Cannot send combuf");
348c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
349c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		if (com_recv(&recvbuf) == 0) {
350c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh			handle_recv(recvbuf);
351c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh			vfree(recvbuf);
352c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		}
353c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
354c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		tv.tv_sec = 0;
355c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		tv.tv_usec = 10;
356c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		(void)select(0, NULL, NULL, NULL, &tv);
357c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	}
358c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
359c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	vfree(sendbuf);
360c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	return 0;
361c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh}
362c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
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 *
397c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehf_reload(ac, av)
398c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	int ac;
399c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	char **av;
4000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
4010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *buf;
4020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct admin_com *head;
4030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
404c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	buf = vmalloc(sizeof(*head));
4050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (buf == NULL)
4060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "not enough core");
4070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
408c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head = (struct admin_com *)buf->v;
4090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	head->ac_len = buf->l;
410c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_cmd = ADMIN_RELOAD_CONF;
411c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_errno = 0;
412c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_proto = 0;
4130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return buf;
4150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
4160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *
418f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yehf_getevt(ac, av)
419f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh	int ac;
420f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh	char **av;
421f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh{
422c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	vchar_t *buf;
423c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	struct admin_com *head;
424c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
425c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	/*
426c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	 * There are 3 ways of getting here
427c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	 * 1) racoonctl vc => evt_filter = (EVTF_LOOP|EVTF_CFG| ... )
428c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	 * 2) racoonctl es => evt_filter = EVTF_NONE
429c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	 * 3) racoonctl es -l => evt_filter = EVTF_LOOP
430c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	 * Catch the second case: show-event is here to purge all
431c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	 */
432c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (evt_filter == EVTF_NONE)
433c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		evt_filter = (EVTF_ALL|EVTF_PURGE);
434c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
435c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if ((ac >= 1) && (strcmp(av[0], "-l") == 0))
436c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		evt_filter |= EVTF_LOOP;
437c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
438c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (ac >= 2)
4390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "too many arguments");
4400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
441c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	buf = vmalloc(sizeof(*head));
442c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (buf == NULL)
443c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		errx(1, "not enough core");
444c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
445c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head = (struct admin_com *)buf->v;
446c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_len = buf->l;
447c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_cmd = ADMIN_SHOW_EVT;
448c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_errno = 0;
449c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_proto = 0;
450c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
451c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	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{
459c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	vchar_t *buf;
460c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	struct admin_com *head;
461c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
462c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	buf = vmalloc(sizeof(*head));
463c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (buf == NULL)
464c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		errx(1, "not enough core");
465c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
466c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head = (struct admin_com *)buf->v;
467c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_len = buf->l;
468c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_cmd = ADMIN_SHOW_SCHED;
469c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_errno = 0;
470c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_proto = 0;
471c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
472c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	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{
480c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	vchar_t *buf;
481c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	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
491c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	buf = vmalloc(sizeof(*head));
4920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (buf == NULL)
493c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		errx(1, "not enough core");
494f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh
495c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head = (struct admin_com *)buf->v;
496c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_len = buf->l;
497c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_cmd = ADMIN_SHOW_SA;
498c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_errno = 0;
499c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	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
520c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	buf = vmalloc(sizeof(*head));
521c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (buf == NULL)
522c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		errx(1, "not enough core");
523c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
524c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head = (struct admin_com *)buf->v;
525c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_len = buf->l;
526c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_cmd = ADMIN_FLUSH_SA;
527c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_errno = 0;
528c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_proto = proto;
529c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
530c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	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;
539c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	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
569c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	buf = vmalloc(sizeof(*head) + index->l);
5700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (buf == NULL)
5710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		goto out;
5720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
573c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head = (struct admin_com *)buf->v;
574c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_len = buf->l + index->l;
575c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_cmd = ADMIN_DELETE_SA;
576c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_errno = 0;
577c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_proto = proto;
578c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
579c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	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;
594c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	struct admin_com *head;
595c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	int proto;
596c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
597c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	/* need protocol */
598c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (ac < 1)
599c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		errx(1, "insufficient arguments");
600c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	proto = get_proto(*av);
601c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (proto == -1)
602c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		errx(1, "unknown protocol %s", *av);
6030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
604c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	/* get index(es) */
605c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	av++;
606c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	ac--;
607c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	switch (proto) {
608c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	case ADMIN_PROTO_ISAKMP:
609c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		index = get_index(ac, av);
610c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		if (index == NULL)
611c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh			return NULL;
612c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		break;
613c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	case ADMIN_PROTO_AH:
614c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	case ADMIN_PROTO_ESP:
615c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		index = get_index(ac, av);
616c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		if (index == NULL)
617c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh			return NULL;
618c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		break;
619c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	default:
620c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		errno = EPROTONOSUPPORT;
6210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return NULL;
622c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	}
6230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
624c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	buf = vmalloc(sizeof(*head) + index->l);
6250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (buf == NULL)
6260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		goto out;
6270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
628c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head = (struct admin_com *)buf->v;
629c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_len = buf->l + index->l;
630c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_cmd = ADMIN_DELETE_ALL_SA_DST;
631c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_errno = 0;
632c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_proto = proto;
633c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
634c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	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;
649c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	struct admin_com *head;
650c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	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
676c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	/* need protocol */
677c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (ac < 1)
678c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		errx(1, "insufficient arguments");
679c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if ((proto = get_proto(*av)) == -1)
680c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		errx(1, "unknown protocol %s", *av);
681f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh
682c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	/* get index(es) */
683c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	av++;
684c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	ac--;
685c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	switch (proto) {
686c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	case ADMIN_PROTO_ISAKMP:
687c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		index = get_index(ac, av);
688c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		if (index == NULL)
689f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh			return NULL;
690c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		break;
691c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	case ADMIN_PROTO_AH:
692c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	case ADMIN_PROTO_ESP:
693c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		index = get_index(ac, av);
694c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		if (index == NULL)
695c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh			return NULL;
696c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		break;
697c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	default:
698c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		errno = EPROTONOSUPPORT;
699c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		return NULL;
7000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
7010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
702c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	com_len += sizeof(*head) + index->l;
703c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if ((buf = vmalloc(com_len)) == NULL)
7040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "Cannot allocate buffer");
7050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
706c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head = (struct admin_com *)buf->v;
707c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_len = buf->l;
708c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_cmd = cmd;
709c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_errno = 0;
710c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_proto = proto;
711c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
712c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	memcpy(buf->v+sizeof(*head), index->v, index->l);
7130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
714c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (id && key) {
7150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		char *data;
7160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		acp = (struct admin_com_psk *)
717c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		    (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
752c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	evt_filter = (EVTF_LOOP|EVTF_CFG|EVTF_CFG_STOP|EVTF_ERR|EVTF_ERR_STOP);
753c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	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)
768c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		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)
813c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		errx(1, "VPN gateway required");
8140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac > 1)
8150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		warnx("Extra arguments");
8160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
817c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	evt_filter =
818c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	    (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;
835c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	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
847c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	buf = vmalloc(sizeof(*head) + userlen);
8480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (buf == NULL)
8490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return NULL;
8500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
851c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head = (struct admin_com *)buf->v;
852c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_len = buf->l;
853c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_cmd = ADMIN_LOGOUT_USER;
854c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_errno = 0;
855c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	head->ac_proto = 0;
856c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
857c91307af2622f6625525f3c1f9c954376df950adChia-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
1340c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehprint_evt(buf, len)
1341c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	caddr_t buf;
1342c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	int len;
13430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
1344c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	struct evtdump *evtdump = (struct evtdump *)buf;
13450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int i;
13460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *srcstr;
13470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *dststr;
13480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1349c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	for (i = 0; evtmsg[i].msg; i++)
1350c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		if (evtmsg[i].type == evtdump->type)
1351c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh			break;
1352c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
1353c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (evtmsg[i].msg == NULL)
1354c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		printf("Event %d: ", evtdump->type);
13550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	else
13560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s : ", evtmsg[i].msg);
13570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1358c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if ((srcstr = saddr2str((struct sockaddr *)&evtdump->src)) == NULL)
13590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("unknown");
1360c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	else
13610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s", srcstr);
13620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf(" -> ");
1363c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if ((dststr = saddr2str((struct sockaddr *)&evtdump->dst)) == NULL)
13640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("unknown");
1365c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	else
13660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s", dststr);
13670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("\n");
1368c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
1369c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	return;
1370c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh}
1371c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
1372c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehvoid
1373c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehprint_err(buf, len)
1374c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	caddr_t buf;
1375c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	int len;
1376c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh{
1377c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	struct evtdump *evtdump = (struct evtdump *)buf;
1378c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	int i;
1379c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
1380c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
1381c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	for (i = 0; evtmsg[i].msg; i++)
1382c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		if (evtmsg[i].type == evtdump->type)
1383c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh			break;
1384c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
1385c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (evtmsg[i].level != ERROR)
1386c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		return;
1387c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
1388c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (evtmsg[i].msg == NULL)
1389c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		printf("Error: Event %d\n", evtdump->type);
1390c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	else
1391c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		printf("Error: %s\n", evtmsg[i].msg);
1392c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
1393c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (evt_filter & EVTF_ERR_STOP)
1394c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		evt_filter &= ~EVTF_LOOP;
1395c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
1396c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	return;
1397c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh}
1398c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
1399c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh/*
1400c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh * Print a message when phase 1 SA goes down
1401c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh */
1402c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehvoid
1403c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehprint_ph1down(buf, len)
1404c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	caddr_t buf;
1405c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	int len;
1406c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh{
1407c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	struct evtdump *evtdump = (struct evtdump *)buf;
1408c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
1409c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (evtdump->type != EVTT_PHASE1_DOWN)
1410c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		return;
1411c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
1412c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	printf("VPN connexion terminated\n");
1413c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
1414c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (evt_filter & EVTF_PH1DOWN_STOP)
1415c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		evt_filter &= ~EVTF_LOOP;
1416c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
1417c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	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{
1428c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	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
1435c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (evtdump->type != EVTT_ISAKMP_CFG_DONE &&
1436c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	    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	}
1489c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
1490c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	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");
1494c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
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	}
1511c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
1512c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	if (evt_filter & EVTF_CFG_STOP)
1513c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		evt_filter &= ~EVTF_LOOP;
1514c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
1515c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	return;
15160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
1517c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
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{
1552c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh        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;
1557c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	len = com->ac_len - sizeof(*com);
15580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	buf = combuf->v + sizeof(*com);
15590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1560c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	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: {
1566c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		struct evtdump *evtdump;
15670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1568c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		/* We got no event */
1569c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		if (len == 0) {
1570c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh			/* If we were purging the queue, it is now done */
1571c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh			if (evt_filter & EVTF_PURGE)
1572c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh				evt_filter &= ~EVTF_PURGE;
15730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			break;
1574c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		}
15750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1576c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		if (len < sizeof(struct evtdump))
1577c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh			errx(1, "Short buffer\n");
15780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1579c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		/* Toss outdated events */
1580c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		evtdump = (struct evtdump *)buf;
1581c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		if (evtdump->timestamp < evt_start)
1582c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh			break;
15830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1584c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		if (evt_filter & EVTF_ALL)
1585c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh			print_evt(buf, len);
1586c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		if (evt_filter & EVTF_ERR)
1587c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh			print_err(buf, len);
1588c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		if (evt_filter & EVTF_CFG)
1589c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh			print_cfg(buf, len);
1590c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		if (evt_filter & EVTF_PH1DOWN)
1591c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh			print_ph1down(buf, len);
1592f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh		break;
1593c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	}
1594f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh
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
1648c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	close(so);
16490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return 0;
16500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1651c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh    bad:
1652c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	close(so);
16530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return -1;
16540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
1655