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