ikeadm.c revision 9c2c14ab194d42014417b385d6bf226ba1a37995
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * CDDL HEADER START
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * The contents of this file are subject to the terms of the
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Common Development and Distribution License (the "License").
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * You may not use this file except in compliance with the License.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * or http://www.opensolaris.org/os/licensing.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * See the License for the specific language governing permissions
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * and limitations under the License.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * When distributing Covered Code, include this CDDL HEADER in each
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * If applicable, add the following below this CDDL HEADER, with the
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * fields enclosed by brackets "[]" replaced with your own identifying
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * information: Portions Copyright [yyyy] [name of copyright owner]
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * CDDL HEADER END
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister * Use is subject to license terms.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <unistd.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <stdio.h>
47b47c8ce30ead58d3d8a10f770a28fd1ca95047dh#include <stdarg.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <stdlib.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <sys/sysconf.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <string.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <strings.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <libintl.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <locale.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <ctype.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <time.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <sys/sysmacros.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <sys/stat.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <sys/mman.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <fcntl.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <sys/socket.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <netdb.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <errno.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <assert.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <netinet/in.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <arpa/inet.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <door.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <setjmp.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <ipsec_util.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <ikedoor.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int doorfd = -1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * These are additional return values for the command line parsing
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * function (parsecmd()). They are specific to this utility, but
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * need to share the same space as the IKE_SVC_* defs, without conflicts.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * So they're defined relative to the end of that range.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define IKEADM_HELP_GENERAL IKE_SVC_MAX + 1
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define IKEADM_HELP_GET IKE_SVC_MAX + 2
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define IKEADM_HELP_SET IKE_SVC_MAX + 3
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define IKEADM_HELP_ADD IKE_SVC_MAX + 4
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define IKEADM_HELP_DEL IKE_SVC_MAX + 5
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define IKEADM_HELP_DUMP IKE_SVC_MAX + 6
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define IKEADM_HELP_FLUSH IKE_SVC_MAX + 7
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define IKEADM_HELP_READ IKE_SVC_MAX + 8
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define IKEADM_HELP_WRITE IKE_SVC_MAX + 9
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define IKEADM_HELP_HELP IKE_SVC_MAX + 10
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define IKEADM_EXIT IKE_SVC_MAX + 11
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhcommand_complete(int s)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (interactive) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh longjmp(env, 1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh exit(s);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhusage()
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (!interactive) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) fprintf(stderr, gettext("Usage:\t"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "ikeadm [ -hnp ] cmd obj [cmd-specific options]\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) fprintf(stderr, gettext(" \tikeadm help\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh command_complete(1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_help()
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("Valid commands and objects:\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "\tget debug|priv|stats|p1|rule|preshared|defaults [%s]\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("identifier"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tset priv %s\n", gettext("level"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tset debug %s [%s]\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("level"), gettext("filename"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tadd rule|preshared {%s}|%s\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("definition"), gettext("filename"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tdel p1|rule|preshared %s\n", gettext("identifier"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tdump p1|rule|preshared\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tflush p1\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tread rule|preshared [%s]\n", gettext("filename"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\twrite rule|preshared %s\n", gettext("filename"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "\thelp [get|set|add|del|dump|flush|read|write|help]\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\texit %s\n", gettext("exit the program"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tquit %s\n", gettext("exit the program"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh command_complete(0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_get_help()
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("This command gets information from in.iked.\n\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("Objects that may be retrieved include:\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tdebug\t\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("the current debug level\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tpriv\t\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("the current privilege level\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tstats\t\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("current usage statistics\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tp1\t\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("a phase 1 SA, identified by\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("\t\t\t local_ip remote_ip OR\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("\t\t\t init_cookie resp_cookie\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\trule\t\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("a phase 1 rule, identified by its label\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tpreshared\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("a preshared key, identified by\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("\t\t\t local_ip remote_ip OR\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("\t\t\t local_id remote_id\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh command_complete(0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_set_help()
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("This command sets values in in.iked.\n\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("Objects that may be set include:\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tdebug\t\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("change the debug level\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tpriv\t\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("change the privilege level (may only be lowered)\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh command_complete(0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_add_help()
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("This command adds items to in.iked's tables.\n\n"));
837c1ac4e72b7d86278cca88b1075af557f7d161Stephen Hanson (void) printf(gettext("Objects that may be set include:\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\trule\t\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("a phase 1 policy rule\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tpreshared\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("a preshared key\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("\nObjects may be entered on the command-line, as a\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("series of keywords and tokens contained in curly\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("braces ('{', '}'); or the name of a file containing\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("the object definition may be provided.\n\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("For security purposes, preshared keys may only be\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("entered on the command-line if ikeadm is running in\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("interactive mode.\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh command_complete(0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_del_help()
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("This command deletes an item from in.iked's tables.\n\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("Objects that may be deleted include:\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tp1\t\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("a phase 1 SA, identified by\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("\t\t\t local_ip remote_ip OR\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("\t\t\t init_cookie resp_cookie\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\trule\t\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("a phase 1 rule, identified by its label\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tpreshared\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("a preshared key, identified by\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("\t\t\t local_ip remote_ip OR\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("\t\t\t local_id remote_id\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh command_complete(0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_dump_help()
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("This command dumps one of in.iked's tables.\n\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("Tables that may be dumped include:\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tp1\t\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("all phase 1 SAs\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\trule\t\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("all phase 1 rules\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tpreshared\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("all preshared keys\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh command_complete(0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_flush_help()
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("This command clears one of in.iked's tables.\n\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("Tables that may be flushed include:\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tp1\t\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("all phase 1 SAs\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh command_complete(0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_read_help()
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("This command reads a new configuration file into\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("in.iked, discarding the old configuration info.\n\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("Sets of data that may be read include:\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\trule\t\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("all phase 1 rules\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tpreshared\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("all preshared keys\n\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("A filename may be provided to specify a source file\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("other than the default.\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh command_complete(0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_write_help()
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("This command writes in.iked's current configuration\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("out to a config file.\n\n"));
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh (void) printf(gettext("Sets of data that may be written include:\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\trule\t\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("all phase 1 rules\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\tpreshared\t");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("all preshared keys\n\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("A filename must be provided to specify the file to\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("which the information should be written.\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh command_complete(0);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_help_help()
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("This command provides information about commands.\n\n"));
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("The 'help' command alone provides a list of valid\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("commands, along with the valid objects for each.\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("'help' followed by a valid command name provides\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("further information about that command.\n"));
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh (void) printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh command_complete(0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*PRINTFLIKE1*/
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhmessage(char *fmt, ...)
6745c559e4b531cf336a91f4653445c32ee46693Jesse Butler{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh va_list ap;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char msgbuf[BUFSIZ];
6745c559e4b531cf336a91f4653445c32ee46693Jesse Butler
6745c559e4b531cf336a91f4653445c32ee46693Jesse Butler va_start(ap, fmt);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) vsnprintf(msgbuf, BUFSIZ, fmt, ap);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) fprintf(stderr, gettext("ikeadm: %s\n"), msgbuf);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh va_end(ap);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhopen_door(void)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (doorfd >= 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) close(doorfd);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh doorfd = open(DOORNM, O_RDWR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (doorfd);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic ike_service_t *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhikedoor_call(char *reqp, int size, door_desc_t *descp, int ndesc)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh door_arg_t arg;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int retries = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh arg.data_ptr = reqp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh arg.data_size = size;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh arg.desc_ptr = descp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh arg.desc_num = ndesc;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh arg.rbuf = (char *)NULL;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh arg.rsize = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhretry:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (door_call(doorfd, &arg) < 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((errno == EBADF) && ((++retries < 2) &&
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (open_door() >= 0)))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto retry;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) fprintf(stderr,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("Unable to communicate with in.iked\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("door_call failed");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((ndesc > 0) && (descp->d_attributes & DOOR_RELEASE) &&
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ((errno == EBADF) || (errno == EFAULT))) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* callers assume passed fds will be closed no matter what */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) close(descp->d_data.d_desc.d_descriptor);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* LINTED E_BAD_PTR_CAST_ALIGN */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ((ike_service_t *)arg.rbuf);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * Parsing functions
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/* stolen from ipseckey.c, with a second tier added */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhparsecmd(char *cmdstr, char *objstr)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define MAXOBJS 10
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh struct objtbl {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh char *obj;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int token;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh };
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh static struct cmdtbl {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *cmd;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int null_obj_token;
145e0143b4896d03ce53b1af6787afa1a7e73959dh struct objtbl objt[MAXOBJS];
145e0143b4896d03ce53b1af6787afa1a7e73959dh } table[] = {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"get", IKE_SVC_ERROR, {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"debug", IKE_SVC_GET_DBG},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"priv", IKE_SVC_GET_PRIV},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"stats", IKE_SVC_GET_STATS},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"p1", IKE_SVC_GET_P1},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"rule", IKE_SVC_GET_RULE},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"preshared", IKE_SVC_GET_PS},
145e0143b4896d03ce53b1af6787afa1a7e73959dh {"defaults", IKE_SVC_GET_DEFS},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {NULL, IKE_SVC_ERROR}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh },
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"set", IKE_SVC_ERROR, {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"debug", IKE_SVC_SET_DBG},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"priv", IKE_SVC_SET_PRIV},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {NULL, IKE_SVC_ERROR}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh },
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"add", IKE_SVC_ERROR, {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"rule", IKE_SVC_NEW_RULE},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"preshared", IKE_SVC_NEW_PS},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {NULL, IKE_SVC_ERROR}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh },
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh {"del", IKE_SVC_ERROR, {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh {"p1", IKE_SVC_DEL_P1},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"rule", IKE_SVC_DEL_RULE},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"preshared", IKE_SVC_DEL_PS},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {NULL, IKE_SVC_ERROR}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh },
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"dump", IKE_SVC_ERROR, {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"p1", IKE_SVC_DUMP_P1S},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"rule", IKE_SVC_DUMP_RULES},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"preshared", IKE_SVC_DUMP_PS},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {NULL, IKE_SVC_ERROR}
6745c559e4b531cf336a91f4653445c32ee46693Jesse Butler }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh },
6745c559e4b531cf336a91f4653445c32ee46693Jesse Butler {"flush", IKE_SVC_ERROR, {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"p1", IKE_SVC_FLUSH_P1S},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {NULL, IKE_SVC_ERROR}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh },
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"read", IKE_SVC_ERROR, {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"rule", IKE_SVC_READ_RULES},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"preshared", IKE_SVC_READ_PS},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {NULL, IKE_SVC_ERROR}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh },
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"write", IKE_SVC_ERROR, {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"rule", IKE_SVC_WRITE_RULES},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"preshared", IKE_SVC_WRITE_PS},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {NULL, IKE_SVC_ERROR}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh },
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"help", IKEADM_HELP_GENERAL, {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"get", IKEADM_HELP_GET},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"set", IKEADM_HELP_SET},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"add", IKEADM_HELP_ADD},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"del", IKEADM_HELP_DEL},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"dump", IKEADM_HELP_DUMP},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"flush", IKEADM_HELP_FLUSH},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"read", IKEADM_HELP_READ},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"write", IKEADM_HELP_WRITE},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"help", IKEADM_HELP_HELP},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {NULL, IKE_SVC_ERROR}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh },
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"exit", IKEADM_EXIT, {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {NULL, IKE_SVC_ERROR}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh },
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"quit", IKEADM_EXIT, {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {NULL, IKE_SVC_ERROR}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh },
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"dbg", IKE_SVC_ERROR, {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {"rbdump", IKE_SVC_DBG_RBDUMP},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {NULL, IKE_SVC_ERROR}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh },
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {NULL, IKE_SVC_ERROR, {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {NULL, IKE_SVC_ERROR}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh };
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct cmdtbl *ct = table;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct objtbl *ot;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (cmdstr == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (IKE_SVC_ERROR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (ct->cmd != NULL && strcmp(ct->cmd, cmdstr) != 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ct++;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ot = ct->objt;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (ct->cmd == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh message(gettext("Unrecognized command '%s'"), cmdstr);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (ot->token);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (objstr == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (ct->null_obj_token);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (ot->obj != NULL && strcmp(ot->obj, objstr) != 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ot++;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (ot->obj == NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh message(gettext("Unrecognized object '%s'"), objstr);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (ot->token);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Parsing functions:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Parse command-line identification info. All return -1 on failure,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * or the number of cmd-line args "consumed" on success (though argc
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * and argv params are not actually modified).
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhparse_label(int argc, char **argv, char *label)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((argc < 1) || (argv == NULL))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (strlcpy(label, argv[0], MAX_LABEL_LEN) >= MAX_LABEL_LEN)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Parse an address off the command line. In the hpp param, either
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * return a hostent pointer (caller frees) or a pointer to a dummy_he_t
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * (must also be freed by the caller; both cases are handled by the
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * macro FREE_HE). The new getipnodebyname() call does the Right Thing
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * (TM), even with raw addresses (colon-separated IPv6 or dotted decimal
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * IPv4).
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * (mostly stolen from ipseckey.c, though some tweaks were made
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * to better serve our purposes here.)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhtypedef struct {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct hostent he;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *addtl[2];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh} dummy_he_t;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhparse_addr(int argc, char **argv, struct hostent **hpp)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int hp_errno;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct hostent *hp = NULL;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dummy_he_t *dhp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *addr1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((argc < 1) || (argv == NULL) || (argv[0] == NULL))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (!nflag) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Try name->address first. Assume AF_INET6, and
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * get IPV4s, plus IPv6s iff IPv6 is configured.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh hp = getipnodebyname(argv[0], AF_INET6, AI_DEFAULT | AI_ALL,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh &hp_errno);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Try a normal address conversion only. malloc a
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * dummy_he_t to construct a fake hostent. Caller
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * will know to free this one using free_he().
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dhp = (dummy_he_t *)malloc(sizeof (dummy_he_t));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh addr1 = (char *)malloc(sizeof (struct in6_addr));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (inet_pton(AF_INET6, argv[0], addr1) == 1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dhp->he.h_addr_list = dhp->addtl;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dhp->addtl[0] = addr1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dhp->addtl[1] = NULL;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh hp = &dhp->he;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dhp->he.h_addrtype = AF_INET6;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dhp->he.h_length = sizeof (struct in6_addr);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else if (inet_pton(AF_INET, argv[0], addr1) == 1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dhp->he.h_addr_list = dhp->addtl;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dhp->addtl[0] = addr1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dhp->addtl[1] = NULL;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh hp = &dhp->he;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dhp->he.h_addrtype = AF_INET;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dhp->he.h_length = sizeof (struct in_addr);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh hp = NULL;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *hpp = hp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (hp == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh message(gettext("Unknown address %s."), argv[0]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Free a dummy_he_t structure that was malloc'd in parse_addr().
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Unfortunately, callers of parse_addr don't want to know about
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * dummy_he_t structs, so all they have is a pointer to the struct
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * hostent; so that's what's passed in. To manage this, we make
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * the assumption that the struct hostent is the first field in
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * the dummy_he_t, and therefore a pointer to it is a pointer to
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * the dummy_he_t.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhfree_he(struct hostent *hep)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dummy_he_t *p = (dummy_he_t *)hep;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh assert(p != NULL);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (p->addtl[0])
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh free(p->addtl[0]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (p->addtl[1])
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh free(p->addtl[1]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh free(p);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define FREE_HE(x) \
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (nflag) \
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh free_he(x); \
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh else \
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh freehostent(x)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhheaddr2sa(char *hea, struct sockaddr_storage *sa, int len)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct sockaddr_in *sin;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct sockaddr_in6 *sin6;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (len == sizeof (struct in6_addr)) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh /* LINTED E_BAD_PTR_CAST_ALIGN */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (IN6_IS_ADDR_V4MAPPED((struct in6_addr *)hea)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sin = (struct sockaddr_in *)sa;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) memset(sin, 0, sizeof (*sin));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* LINTED E_BAD_PTR_CAST_ALIGN */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh IN6_V4MAPPED_TO_INADDR((struct in6_addr *)hea,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh &sin->sin_addr);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sin->sin_family = AF_INET;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh sin6 = (struct sockaddr_in6 *)sa;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh (void) memset(sin6, 0, sizeof (*sin6));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) memcpy(&sin6->sin6_addr, hea,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sizeof (struct in6_addr));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sin6->sin6_family = AF_INET6;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sin = (struct sockaddr_in *)sa;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) memset(sin, 0, sizeof (*sin));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) memcpy(&sin->sin_addr, hea, sizeof (struct in_addr));
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh sin->sin_family = AF_INET;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * The possible ident-type keywords that might be used on the command
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * line. This is a superset of the ones supported by ipseckey, those
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * in the ike config file, and those in ike.preshared.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic keywdtab_t idtypes[] = {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* ip, ipv4, and ipv6 are valid for preshared keys... */
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh {SADB_IDENTTYPE_RESERVED, "ip"},
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh {SADB_IDENTTYPE_RESERVED, "ipv4"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_IDENTTYPE_RESERVED, "ipv6"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_IDENTTYPE_PREFIX, "prefix"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_IDENTTYPE_PREFIX, "ipv4-prefix"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_IDENTTYPE_PREFIX, "ipv6-prefix"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_IDENTTYPE_PREFIX, "subnet"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_IDENTTYPE_PREFIX, "subnetv4"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_IDENTTYPE_PREFIX, "subnetv6"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_IDENTTYPE_FQDN, "fqdn"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_IDENTTYPE_FQDN, "dns"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_IDENTTYPE_FQDN, "domain"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_IDENTTYPE_FQDN, "domainname"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_IDENTTYPE_USER_FQDN, "user_fqdn"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_IDENTTYPE_USER_FQDN, "mbox"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_IDENTTYPE_USER_FQDN, "mailbox"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_X_IDENTTYPE_DN, "dn"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_X_IDENTTYPE_DN, "asn1dn"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_X_IDENTTYPE_GN, "gn"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_X_IDENTTYPE_GN, "asn1gn"},
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh {SADB_X_IDENTTYPE_ADDR_RANGE, "ipv4-range"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_X_IDENTTYPE_ADDR_RANGE, "ipv6-range"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_X_IDENTTYPE_ADDR_RANGE, "rangev4"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_X_IDENTTYPE_ADDR_RANGE, "rangev6"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {SADB_X_IDENTTYPE_KEY_ID, "keyid"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {NULL, 0}
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh};
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhparse_idtype(char *type, uint16_t *idnum)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh keywdtab_t *idp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (type == NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (idp = idtypes; idp->kw_str != NULL; idp++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (strcasecmp(idp->kw_str, type) == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (idnum != NULL)
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh *idnum = idp->kw_tag;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * The sadb_ident_t is malloc'd, since its length varies;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * so the caller must free() it when done with the data.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhparse_ident(int argc, char **argv, sadb_ident_t **idpp)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int alloclen, consumed;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sadb_ident_t *idp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((argc < 2) || (argv == NULL) || (argv[0] == NULL) ||
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (argv[1] == NULL))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh alloclen = sizeof (sadb_ident_t) + IKEDOORROUNDUP(strlen(argv[1]) + 1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *idpp = idp = (sadb_ident_t *)malloc(alloclen);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (idp == NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("parsing identity");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((consumed = parse_idtype(argv[0], &idp->sadb_ident_type)) < 0) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh message(gettext("unknown identity type %s."), argv[0]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idp->sadb_ident_len = SADB_8TO64(alloclen);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idp->sadb_ident_reserved = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idp->sadb_ident_id = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* now copy in identity param */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) strlcpy((char *)(idp + 1), argv[1],
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh alloclen - (sizeof (sadb_ident_t)));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (++consumed);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhparse_cky(int argc, char **argv, uint64_t *ckyp)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh u_longlong_t arg;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((argc < 1) || (argv[0] == NULL))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh errno = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh arg = strtoull(argv[0], NULL, 0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (errno != 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh message(gettext("failed to parse cookie %s."), argv[0]);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh return (-1);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *ckyp = (uint64_t)arg;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhparse_addr_pr(int argc, char **argv, struct hostent **h1pp,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct hostent **h2pp)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int rtn, consumed = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((rtn = parse_addr(argc, argv, h1pp)) < 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh consumed = rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh argc -= rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh argv += rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((rtn = parse_addr(argc, argv, h2pp)) < 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh FREE_HE(*h1pp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh consumed += rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (consumed);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * The sadb_ident_ts are malloc'd, since their length varies;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * so the caller must free() them when done with the data.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhparse_ident_pr(int argc, char **argv, sadb_ident_t **id1pp,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sadb_ident_t **id2pp)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int rtn, consumed = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((rtn = parse_ident(argc, argv, id1pp)) < 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh consumed = rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh argc -= rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh argv += rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (*id1pp)->sadb_ident_exttype = SADB_EXT_IDENTITY_SRC;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((rtn = parse_ident(argc, argv, id2pp)) < 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh free(*id1pp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh consumed += rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (*id2pp)->sadb_ident_exttype = SADB_EXT_IDENTITY_DST;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (consumed);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhparse_cky_pr(int argc, char **argv, ike_cky_pr_t *cpr)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int rtn, consumed = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((rtn = parse_cky(argc, argv, &cpr->cky_i)) < 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh consumed = rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh argc -= rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh argv += rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((rtn = parse_cky(argc, argv, &cpr->cky_r)) < 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh consumed += rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (consumed);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Preshared key field types...used for parsing preshared keys that
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * have been entered on the command line. The code to parse preshared
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * keys (parse_ps, parse_key, parse_psfldid, parse_ikmtype, ...) is
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * mostly duplicated from in.iked's readps.c.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define PSFLD_LOCID 1
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define PSFLD_LOCIDTYPE 2
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define PSFLD_REMID 3
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define PSFLD_REMIDTYPE 4
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define PSFLD_MODE 5
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define PSFLD_KEY 6
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic keywdtab_t psfldtypes[] = {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {PSFLD_LOCID, "localid"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {PSFLD_LOCIDTYPE, "localidtype"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {PSFLD_REMID, "remoteid"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {PSFLD_REMIDTYPE, "remoteidtype"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {PSFLD_MODE, "ike_mode"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {PSFLD_KEY, "key"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {NULL, 0}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh};
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhparse_psfldid(char *type, uint16_t *idnum)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh keywdtab_t *pfp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (type == NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (pfp = psfldtypes; pfp->kw_str != NULL; pfp++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (strcasecmp(pfp->kw_str, type) == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (idnum != NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *idnum = pfp->kw_tag;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic keywdtab_t ikemodes[] = {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {IKE_XCHG_IDENTITY_PROTECT, "main"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {IKE_XCHG_AGGRESSIVE, "aggressive"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {IKE_XCHG_IP_AND_AGGR, "both"},
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh {NULL, 0}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh};
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhparse_ikmtype(char *mode, uint16_t *modenum)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh keywdtab_t *ikmp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mode == NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (ikmp = ikemodes; ikmp->kw_str != NULL; ikmp++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (strcasecmp(ikmp->kw_str, mode) == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (modenum != NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *modenum = ikmp->kw_tag;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define hd2num(hd) (((hd) >= '0' && (hd) <= '9') ? ((hd) - '0') : \
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (((hd) >= 'a' && (hd) <= 'f') ? ((hd) - 'a' + 10) : ((hd) - 'A' + 10)))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic uint8_t *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhparse_key(char *input, uint_t *keybuflen, uint_t *lbits)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint8_t *keyp, *keybufp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint_t i, hexlen = 0, bits, alloclen;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (i = 0; input[i] != '\0' && input[i] != '/'; i++)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh hexlen++;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (input[i] == '\0') {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bits = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Have /nn. */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh input[i] = '\0';
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler if (sscanf((input + i + 1), "%u", &bits) != 1)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (NULL);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* hexlen is in nibbles */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (((bits + 3) >> 2) > hexlen)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (NULL);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Adjust hexlen down if user gave us too small of a bit
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * count.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((hexlen << 2) > bits + 3) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh hexlen = (bits + 3) >> 2;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh input[hexlen] = '\0';
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Allocate. Remember, hexlen is in nibbles.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh alloclen = (hexlen/2 + (hexlen & 0x1));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh keyp = malloc(alloclen);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (keyp == NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (NULL);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh keybufp = keyp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *keybuflen = alloclen;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (bits == 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *lbits = (hexlen + (hexlen & 0x1)) << 2;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh else
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *lbits = bits;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Read in nibbles. Read in odd-numbered as shifted high.
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * (e.g. 123 becomes 0x1230).
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (i = 0; input[i] != '\0'; i += 2) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh boolean_t second = (input[i + 1] != '\0');
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (!isxdigit(input[i]) ||
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (!isxdigit(input[i + 1]) && second)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh free(keyp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (NULL);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *keyp = (hd2num(input[i]) << 4);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (second)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *keyp |= hd2num(input[i + 1]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh else
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break; /* out of for loop. */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh keyp++;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* zero the remaining bits if we're a non-octet amount. */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (bits & 0x7)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *((input[i] == '\0') ? keyp - 1 : keyp) &=
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh 0xff << (8 - (bits & 0x7));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (keybufp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * the ike_ps_t struct (plus trailing data) will be allocated here,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * so it will need to be freed by the caller.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhparse_ps(int argc, char **argv, ike_ps_t **presharedpp, int *len)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint_t c = 0, locidlen, remidlen, keylen, keybits;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint_t a_locidtotal = 0, a_remidtotal = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *locid, *remid;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint8_t *keyp = NULL;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint16_t fldid, locidtype, remidtype, mtype;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct hostent *loche = NULL, *remhe = NULL;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_ps_t *psp = NULL;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sadb_ident_t *sidp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh boolean_t whacked = B_FALSE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((argv[c] == NULL) || (argv[c][0] != '{'))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (argv[c][1] != 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* no space between '{' and first token */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh argv[c]++;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh c++;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((argv[argc - 1][strlen(argv[argc - 1]) - 1] == '}') &&
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (argv[argc - 1][0] != '}')) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh /*
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * whack '}' without a space before it or parsers break.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Remember this trailing character for later
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh argv[argc - 1][strlen(argv[argc - 1]) - 1] = '\0';
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh whacked = B_TRUE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while ((c < argc) && (argv[c] != NULL) && (argv[c][0] != '}')) {
1b115575fbf0d7a1e3876e6886eaeffbeb8d2e61John Danielson if ((argv[c + 1] == NULL) || (argv[c + 1][0] == '}'))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto bail;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (parse_psfldid(argv[c++], &fldid) < 0)
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh goto bail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (fldid) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PSFLD_LOCID:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh locid = argv[c++];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh locidlen = strlen(locid) + 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PSFLD_LOCIDTYPE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (parse_idtype(argv[c++], &locidtype) < 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto bail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PSFLD_REMID:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh remid = argv[c++];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh remidlen = strlen(remid) + 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PSFLD_REMIDTYPE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (parse_idtype(argv[c++], &remidtype) < 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto bail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PSFLD_MODE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (parse_ikmtype(argv[c++], &mtype) < 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto bail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PSFLD_KEY:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh keyp = parse_key(argv[c++], &keylen, &keybits);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (keyp == NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto bail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Make sure the line was terminated with '}' */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (argv[c] == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (!whacked)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto bail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else if (argv[c][0] != '}') {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto bail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * make sure we got all the required fields. If no idtype, assume
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * ip addr; if that translation fails, we'll catch the error then.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (locid == NULL || remid == NULL || keyp == NULL || mtype == 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto bail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* figure out the size buffer we need */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *len = sizeof (ike_ps_t);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (locidtype != SADB_IDENTTYPE_RESERVED) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh a_locidtotal = IKEDOORROUNDUP(sizeof (sadb_ident_t) + locidlen);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *len += a_locidtotal;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (remidtype != SADB_IDENTTYPE_RESERVED) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh a_remidtotal = IKEDOORROUNDUP(sizeof (sadb_ident_t) + remidlen);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *len += a_remidtotal;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *len += keylen;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh psp = malloc(*len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (psp == NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto bail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) memset(psp, 0, *len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh psp->ps_ike_mode = mtype;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh psp->ps_localid_off = sizeof (ike_ps_t);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (locidtype == SADB_IDENTTYPE_RESERVED) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * this is an ip address, store in the sockaddr field;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * we won't use an sadb_ident_t.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh psp->ps_localid_len = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (parse_addr(1, &locid, &loche) < 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto bail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (loche->h_addr_list[1] != NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh message(gettext("preshared key identifier cannot "
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "match multiple IP addresses"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto bail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh headdr2sa(loche->h_addr_list[0], &psp->ps_ipaddrs.loc_addr,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh loche->h_length);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh FREE_HE(loche);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh psp->ps_localid_len = sizeof (sadb_ident_t) + locidlen;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sidp = (sadb_ident_t *)((int)psp + psp->ps_localid_off);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sidp->sadb_ident_len = psp->ps_localid_len;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sidp->sadb_ident_type = locidtype;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) strlcpy((char *)(sidp + 1), locid, a_locidtotal);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh psp->ps_remoteid_off = psp->ps_localid_off + a_locidtotal;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (remidtype == SADB_IDENTTYPE_RESERVED) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * this is an ip address, store in the sockaddr field;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * we won't use an sadb_ident_t.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh psp->ps_remoteid_len = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (parse_addr(1, &remid, &remhe) < 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto bail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (remhe->h_addr_list[1] != NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh message(gettext("preshared key identifier cannot "
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "match multiple IP addresses"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto bail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh headdr2sa(remhe->h_addr_list[0], &psp->ps_ipaddrs.rem_addr,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh remhe->h_length);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh FREE_HE(remhe);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh } else {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh /* make sure we have at least 16-bit alignment */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (remidlen & 0x1)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh remidlen++;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh psp->ps_remoteid_len = sizeof (sadb_ident_t) + remidlen;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sidp = (sadb_ident_t *)((int)psp + psp->ps_remoteid_off);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sidp->sadb_ident_len = psp->ps_remoteid_len;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sidp->sadb_ident_type = remidtype;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) strlcpy((char *)(sidp + 1), remid, a_remidtotal);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh psp->ps_key_off = psp->ps_remoteid_off + a_remidtotal;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh psp->ps_key_len = keylen;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh psp->ps_key_bits = keybits;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) memcpy((uint8_t *)((int)psp + psp->ps_key_off), keyp, keylen);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *presharedpp = psp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (c);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhbail:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (loche != NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh FREE_HE(loche);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (remhe != NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh FREE_HE(remhe);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (keyp != NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh free(keyp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (psp != NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh free(psp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *presharedpp = NULL;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (-1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * Printing functions
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * A potential point of confusion here is that the ikeadm-specific string-
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * producing functions do not match the ipsec_util.c versions in style: the
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * ikeadm-specific functions return a string (and are named foostr), while
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * the ipsec_util.c functions actually print the string to the file named
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * in the second arg to the function (and are named dump_foo).
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Localization for ikeadm seems more straightforward when complete
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * phrases are translated rather than: a part of a phrase, a call to
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * dump_foo(), and more of the phrase. It could also accommodate
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * non-English grammar more easily.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic char *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dherrstr(int err)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh static char rtn[MAXLINESIZE];
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh switch (err) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh case IKE_ERR_NO_OBJ:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("No data returned"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_ERR_NO_DESC:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("No destination provided"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_ERR_ID_INVALID:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("Id info invalid"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_ERR_LOC_INVALID:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("Destination invalid"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_ERR_CMD_INVALID:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("Command invalid"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_ERR_DATA_INVALID:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("Supplied data invalid"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_ERR_CMD_NOTSUP:
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh return (gettext("Unknown command"));
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh case IKE_ERR_REQ_INVALID:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("Request invalid"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_ERR_NO_PRIV:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("Not allowed at current privilege level"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_ERR_SYS_ERR:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("System error"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_ERR_DUP_IGNORED:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("One or more duplicate entries ignored"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) snprintf(rtn, MAXLINESIZE,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("<unknown error %d>"), err);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (rtn);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic char *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdbgstr(int bit)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh static char rtn[MAXLINESIZE];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (bit) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case D_CERT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("Certificate management"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case D_KEY:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("Key management"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case D_OP:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("Operational"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case D_P1:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("Phase 1 SA creation"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case D_P2:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("Phase 2 SA creation"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case D_PFKEY:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("PF_KEY interface"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case D_POL:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("Policy management"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case D_PROP:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("Proposal construction"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case D_DOOR:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("Door interface"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case D_CONFIG:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("Config file processing"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) snprintf(rtn, MAXLINESIZE,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("<unknown flag 0x%x>"), bit);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (rtn);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic char *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprivstr(int priv)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh static char rtn[MAXLINESIZE];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (priv) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_PRIV_MINIMUM:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("base privileges"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_PRIV_MODKEYS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("access to preshared key information"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_PRIV_KEYMAT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("access to keying material"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) snprintf(rtn, MAXLINESIZE,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("<unknown level %d>"), priv);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (rtn);
6745c559e4b531cf336a91f4653445c32ee46693Jesse Butler }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
6745c559e4b531cf336a91f4653445c32ee46693Jesse Butlerstatic char *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhxchgstr(int xchg)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh static char rtn[MAXLINESIZE];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (xchg) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_XCHG_NONE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("<unspecified>"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_XCHG_BASE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("base"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_XCHG_IDENTITY_PROTECT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("main mode (identity protect)"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_XCHG_AUTH_ONLY:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("authentication only"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_XCHG_AGGRESSIVE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("aggressive mode"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_XCHG_IP_AND_AGGR:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("main and aggressive mode"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_XCHG_ANY:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("any mode"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) snprintf(rtn, MAXLINESIZE,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("<unknown %d>"), xchg);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (rtn);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic char *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatestr(int state)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh static char rtn[MAXLINESIZE];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (state) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SA_STATE_INIT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("INITIALIZING"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SA_STATE_SENT_SA:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("SENT FIRST MSG (SA)"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SA_STATE_SENT_KE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("SENT SECOND MSG (KE)"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SA_STATE_SENT_LAST:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("SENT FINAL MSG"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SA_STATE_DONE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("ACTIVE"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SA_STATE_DELETED:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("DELETED"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SA_STATE_INVALID:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("<invalid>"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) snprintf(rtn, MAXLINESIZE,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("<unknown %d>"), state);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (rtn);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic char *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhauthmethstr(int meth)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh static char rtn[MAXLINESIZE];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (meth) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_AUTH_METH_PRE_SHARED_KEY:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("pre-shared key"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_AUTH_METH_DSS_SIG:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("DSS signatures"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_AUTH_METH_RSA_SIG:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("RSA signatures"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_AUTH_METH_RSA_ENCR:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("RSA Encryption"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_AUTH_METH_RSA_ENCR_REVISED:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("Revised RSA Encryption"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) snprintf(rtn, MAXLINESIZE,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("<unknown %d>"), meth);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (rtn);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic char *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprfstr(int prf)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh static char rtn[MAXLINESIZE];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (prf) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_PRF_NONE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("<none/unavailable>"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_PRF_HMAC_MD5:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("HMAC MD5");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_PRF_HMAC_SHA1:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("HMAC SHA1");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_PRF_HMAC_SHA256:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("HMAC SHA256");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_PRF_HMAC_SHA384:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("HMAC SHA384");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_PRF_HMAC_SHA512:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("HMAC SHA512");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) snprintf(rtn, MAXLINESIZE,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("<unknown %d>"), prf);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (rtn);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic char *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdhstr(int grp)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh static char rtn[MAXLINESIZE];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (grp) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case 0:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("<unavailable>"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_GRP_DESC_MODP_768:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("768-bit MODP (group 1)"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_GRP_DESC_MODP_1024:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("1024-bit MODP (group 2)"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_GRP_DESC_EC2N_155:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("EC2N group on GP[2^155]"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_GRP_DESC_EC2N_185:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("EC2N group on GP[2^185]"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_GRP_DESC_MODP_1536:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("1536-bit MODP (group 5)"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_GRP_DESC_MODP_2048:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("2048-bit MODP (group 14)"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_GRP_DESC_MODP_3072:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("3072-bit MODP (group 15)"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_GRP_DESC_MODP_4096:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("4096-bit MODP (group 16)"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_GRP_DESC_MODP_6144:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("6144-bit MODP (group 17)"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_GRP_DESC_MODP_8192:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (gettext("8192-bit MODP (group 18)"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) snprintf(rtn, MAXLINESIZE, gettext("<unknown %d>"), grp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (rtn);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_hdr(char *prefix, ike_p1_hdr_t *hdrp)
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char sbuf[TBUF_SIZE];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char tbuf[TBUF_SIZE];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("%s Cookies: Initiator 0x%llx Responder 0x%llx\n"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prefix, ntohll(hdrp->p1hdr_cookies.cky_i),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ntohll(hdrp->p1hdr_cookies.cky_r));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s The local host is the %s.\n"), prefix,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh hdrp->p1hdr_isinit ? gettext("initiator") : gettext("responder"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s ISAKMP version %d.%d; %s exchange\n"), prefix,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh hdrp->p1hdr_major, hdrp->p1hdr_minor, xchgstr(hdrp->p1hdr_xchg));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s Current state is %s\n"), prefix,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh statestr(hdrp->p1hdr_state));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (hdrp->p1hdr_support_dpd == B_FALSE) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s Dead Peer Detection (RFC 3706)"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " enabled"), prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (hdrp->p1hdr_dpd_state < DPD_IN_PROGRESS) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (strftime(tbuf, TBUF_SIZE, NULL,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh localtime(&hdrp->p1hdr_dpd_time)) == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) strlcpy(tbuf, gettext("<time conversion failed>"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh TBUF_SIZE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("\n%s Dead Peer Detection handshake "), prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (hdrp->p1hdr_dpd_state) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case DPD_SUCCESSFUL:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) strlcpy(sbuf, gettext("was successful at "), TBUF_SIZE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("%s %s", sbuf, tbuf);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh case DPD_FAILURE:
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh (void) strlcpy(sbuf, gettext("failed at "), TBUF_SIZE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("%s %s", sbuf, tbuf);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case DPD_IN_PROGRESS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) strlcpy(sbuf, gettext("is in progress."), TBUF_SIZE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_lt_limits(char *prefix, ike_p1_xform_t *xfp)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s Lifetime limits:\n"), prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s %u seconds; %u kbytes protected; "),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prefix, xfp->p1xf_max_secs, xfp->p1xf_max_kbytes);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%u keymat provided.\n"), xfp->p1xf_max_keyuses);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh#define LT_USAGE_LEN 16 /* 1 uint64 + 2 uint32s */
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_lt_usage(char *prefix, ike_p1_stats_t *sp)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh time_t scratch;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char tbuf[TBUF_SIZE];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s Current usage:\n"), prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh scratch = (time_t)sp->p1stat_start;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (strftime(tbuf, TBUF_SIZE, NULL, localtime(&scratch)) == 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) strlcpy(tbuf, gettext("<time conversion failed>"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh TBUF_SIZE);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh (void) printf(gettext("%s SA was created at %s\n"), prefix, tbuf);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh (void) printf(gettext("%s %u kbytes protected; %u keymat provided.\n"),
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh prefix, sp->p1stat_kbytes, sp->p1stat_keyuses);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_xform(char *prefix, ike_p1_xform_t *xfp, boolean_t print_lifetimes)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s Authentication method: %s"), prefix,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh authmethstr(xfp->p1xf_auth_meth));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("\n%s Encryption alg: "), prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) dump_ealg(xfp->p1xf_encr_alg, stdout);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (xfp->p1xf_encr_low_bits != 0) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh (void) printf(gettext("(%d..%d)"), xfp->p1xf_encr_low_bits,
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh xfp->p1xf_encr_high_bits);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh } else if ((xfp->p1xf_encr_low_bits == 0) &&
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (xfp->p1xf_encr_high_bits != 0)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * High bits is a placeholder for
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * negotiated algorithm strength
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("(%d)"), xfp->p1xf_encr_high_bits);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("; Authentication alg: "));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) dump_aalg(xfp->p1xf_auth_alg, stdout);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n%s ", prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (xfp->p1xf_prf != 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("PRF: %s ; "), prfstr(xfp->p1xf_prf));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("Oakley Group: %s\n"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dhstr(xfp->p1xf_dh_group));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (xfp->p1xf_pfs == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s Phase 2 PFS is not used\n"), prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "%s Phase 2 PFS is required (Oakley Group: %s)\n"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prefix, dhstr(xfp->p1xf_pfs));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (print_lifetimes)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_lt_limits(prefix, xfp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_lifetime(char *prefix, ike_p1_xform_t *xfp, ike_p1_stats_t *sp,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int statlen)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh time_t current, remain, exp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char tbuf[TBUF_SIZE];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh current = time(NULL);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_lt_limits(prefix, xfp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * make sure the stats struct we've been passed is as big
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * as we expect it to be. The usage stats are at the end,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * so anything less than the size we expect won't work.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (statlen >= sizeof (ike_p1_stats_t)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_lt_usage(prefix, sp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s Expiration info:\n"), prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (xfp->p1xf_max_kbytes != 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s %u more bytes can be protected.\n"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prefix, xfp->p1xf_max_kbytes - sp->p1stat_kbytes);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (xfp->p1xf_max_keyuses != 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s Keying material can be provided "
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "%u more times.\n"), prefix,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh xfp->p1xf_max_keyuses - sp->p1stat_keyuses);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (xfp->p1xf_max_secs != 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh exp = (time_t)sp->p1stat_start + (time_t)xfp->p1xf_max_secs;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh remain = exp - current;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (strftime(tbuf, TBUF_SIZE, NULL, localtime(&exp)) == 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) strlcpy(tbuf,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("<time conversion failed>"), TBUF_SIZE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * The SA may have expired but still exist because libike
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * has not freed it yet.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (remain > 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "%s SA expires in %lu seconds, at %s\n"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prefix, remain, tbuf);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh else
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s SA Expired at %s\n"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prefix, tbuf);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/* used to verify structure lengths... */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define COUNTER_32BIT 4
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define COUNTER_PAIR 8
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_p1stats(char *prefix, ike_p1_stats_t *sp, int statlen,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh boolean_t print_lifetimes)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (statlen < COUNTER_PAIR)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s %u Quick Mode SAs created; "), prefix,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sp->p1stat_new_qm_sas);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%u Quick Mode SAs deleted\n"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sp->p1stat_del_qm_sas);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh statlen -= COUNTER_PAIR;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((print_lifetimes) && (statlen >= LT_USAGE_LEN))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_lt_usage(prefix, sp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_errs(char *prefix, ike_p1_errors_t *errp, int errlen)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Don't try to break this one up; it's either all or nothing!
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (errlen < sizeof (ike_p1_errors_t))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s %u RX errors: "), prefix,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh errp->p1err_decrypt + errp->p1err_hash + errp->p1err_otherrx);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%u decryption, %u hash, %u other\n"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh errp->p1err_decrypt, errp->p1err_hash, errp->p1err_otherrx);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s %u TX errors\n"), prefix, errp->p1err_tx);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_addr_range(char *prefix, ike_addr_pr_t *pr)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh boolean_t range = B_TRUE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct sockaddr_storage *beg, *end;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct sockaddr_in *bsin, *esin;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct sockaddr_in6 *bsin6, *esin6;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh beg = &pr->beg_iprange;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh end = &pr->end_iprange;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (beg->ss_family != end->ss_family) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s invalid address range\n"), prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (beg->ss_family) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case AF_INET:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bsin = (struct sockaddr_in *)beg;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh esin = (struct sockaddr_in *)end;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((uint32_t)bsin->sin_addr.s_addr ==
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (uint32_t)esin->sin_addr.s_addr)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh range = B_FALSE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case AF_INET6:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bsin6 = (struct sockaddr_in6 *)beg;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh esin6 = (struct sockaddr_in6 *)end;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (IN6_ARE_ADDR_EQUAL(&bsin6->sin6_addr, &esin6->sin6_addr))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh range = B_FALSE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s invalid address range\n"), prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("%s ", prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) dump_sockaddr((struct sockaddr *)beg, 0, B_TRUE, stdout, nflag);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (range) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(" - ");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) dump_sockaddr((struct sockaddr *)end, 0, B_TRUE, stdout,
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler nflag);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * used to tell printing function if info should be identified
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * as belonging to initiator, responder, or neither
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define IS_INITIATOR 1
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define IS_RESPONDER 2
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define DONT_PRINT_INIT 3
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_addr(char *prefix, struct sockaddr_storage *sa, int init_instr)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s Address"), prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (init_instr != DONT_PRINT_INIT)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(" (%s):\n", (init_instr == IS_INITIATOR) ?
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("Initiator") : gettext("Responder"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh else
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(":\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("%s ", prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) dump_sockaddr((struct sockaddr *)sa, 0, B_FALSE, stdout, nflag);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_id(char *prefix, sadb_ident_t *idp, int init_instr)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh boolean_t canprint;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (init_instr) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IS_INITIATOR:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s Initiator identity, "), prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IS_RESPONDER:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s Responder identity, "), prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case DONT_PRINT_INIT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s Identity, "), prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("<invalid identity>\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("uid=%d, type "), idp->sadb_ident_id);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh canprint = dump_sadb_idtype(idp->sadb_ident_type, stdout, NULL);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (canprint) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n%s %s\n", prefix, (char *)(idp + 1));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("\n%s "), prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_asn1_name(stdout,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (const unsigned char *)(idp + 1),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh SADB_64TO8(idp->sadb_ident_len) - sizeof (sadb_ident_t));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_idspec(char *prefix, char *idp, int icnt, int ecnt)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int i;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh (void) printf(gettext("%s Identity descriptors:\n"), prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (i = 0; i < icnt; i++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (i == 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s Includes:\n"), prefix);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("%s %s\n", prefix, idp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idp += strlen(idp) + 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (i = 0; i < ecnt; i++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (i == 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s Excludes:\n"), prefix);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh (void) printf("%s %s\n", prefix, idp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idp += strlen(idp) + 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdhprint_keys(char *prefix, ike_p1_key_t *keyp, int size)
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint32_t *curp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_p1_key_t *p;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int ssize;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh curp = (uint32_t *)keyp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ssize = sizeof (ike_p1_key_t);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while ((intptr_t)curp - (intptr_t)keyp < size) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh size_t p1klen, len;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh p = (ike_p1_key_t *)curp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh p1klen = p->p1key_len;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh len = p1klen - ssize;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh p1klen = roundup(p1klen, sizeof (ike_p1_key_t));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (p1klen < ssize) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("Short key\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (p->p1key_type) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_KEY_PRESHARED:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s Pre-shared key (%d bytes): "),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prefix, len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) dump_key((uint8_t *)(p + 1), SADB_8TO1(len),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh stdout);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_KEY_SKEYID:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s SKEYID (%d bytes): "),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prefix, len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) dump_key((uint8_t *)(p + 1), SADB_8TO1(len),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh stdout);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_KEY_SKEYID_D:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s SKEYID_d (%d bytes): "),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prefix, len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) dump_key((uint8_t *)(p + 1), SADB_8TO1(len),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh stdout);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_KEY_SKEYID_A:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s SKEYID_a (%d bytes): "),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prefix, len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) dump_key((uint8_t *)(p + 1), SADB_8TO1(len),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh stdout);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_KEY_SKEYID_E:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s SKEYID_e (%d bytes): "),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prefix, len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) dump_key((uint8_t *)(p + 1), SADB_8TO1(len),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh stdout);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_KEY_ENCR:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s Encryption key (%d bytes): "),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prefix, len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) dump_key((uint8_t *)(p + 1), SADB_8TO1(len),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh stdout);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_KEY_IV:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana gettext("%s Initialization vector (%d bytes): "),
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana prefix, len);
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana (void) dump_key((uint8_t *)(p + 1), SADB_8TO1(len),
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana stdout);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("%s Unidentified key info %p %d"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prefix, p, p1klen);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh assert(IS_P2ALIGNED(p1klen, 8));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh curp += (p1klen >> 2);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_p1(ike_p1_sa_t *p1)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_p1_stats_t *sp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_p1_errors_t *ep;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_p1_key_t *kp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sadb_ident_t *lidp, *ridp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int lstat, rstat;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_hdr("IKESA:", &p1->p1sa_hdr);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_xform("XFORM:", &p1->p1sa_xform, B_FALSE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (p1->p1sa_hdr.p1hdr_isinit) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh lstat = IS_INITIATOR;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rstat = IS_RESPONDER;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh lstat = IS_RESPONDER;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rstat = IS_INITIATOR;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_addr("LOCIP:", &p1->p1sa_ipaddrs.loc_addr, lstat);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_addr("REMIP:", &p1->p1sa_ipaddrs.rem_addr, rstat);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * the stat len might be 0; but still make the call
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * to print_lifetime() to pick up the xform info
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sp = (ike_p1_stats_t *)((int)(p1) + p1->p1sa_stat_off);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_lifetime("LIFTM:", &p1->p1sa_xform, sp, p1->p1sa_stat_len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (p1->p1sa_stat_len > 0) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh print_p1stats("STATS:", sp, p1->p1sa_stat_len, B_FALSE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (p1->p1sa_error_len > 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ep = (ike_p1_errors_t *)((int)(p1) + p1->p1sa_error_off);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_errs("ERRS: ", ep, p1->p1sa_error_len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (p1->p1sa_localid_len > 0) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh lidp = (sadb_ident_t *)((int)(p1) + p1->p1sa_localid_off);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_id("LOCID:", lidp, lstat);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (p1->p1sa_remoteid_len > 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ridp = (sadb_ident_t *)((int)(p1) + p1->p1sa_remoteid_off);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_id("REMID:", ridp, rstat);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (p1->p1sa_key_len > 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh kp = (ike_p1_key_t *)((int)(p1) + p1->p1sa_key_off);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_keys("KEY: ", kp, p1->p1sa_key_len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_ps(ike_ps_t *ps)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sadb_ident_t *lidp, *ridp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint8_t *keyp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("PSKEY: For %s exchanges\n"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh xchgstr(ps->ps_ike_mode));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler if (ps->ps_key_len > 0) {
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler keyp = (uint8_t *)((int)(ps) + ps->ps_key_off);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler (void) printf(gettext("PSKEY: Pre-shared key (%d bytes): "),
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler ps->ps_key_len);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler (void) dump_key(keyp, ps->ps_key_bits, stdout);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler (void) printf("\n");
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler }
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler /*
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler * We get *either* and address or an ident, never both. So if
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler * the ident is there, don't try printing an address.
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler */
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler if (ps->ps_localid_len > 0) {
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler lidp = (sadb_ident_t *)
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler ((int)(ps) + ps->ps_localid_off);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler print_id("LOCID:", lidp, DONT_PRINT_INIT);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler } else {
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler print_addr("LOCIP:", &ps->ps_ipaddrs.loc_addr, DONT_PRINT_INIT);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler }
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler if (ps->ps_remoteid_len > 0) {
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler ridp = (sadb_ident_t *)
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler ((int)(ps) + ps->ps_remoteid_off);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler print_id("REMID:", ridp, DONT_PRINT_INIT);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler } else {
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler print_addr("REMIP:", &ps->ps_ipaddrs.rem_addr, DONT_PRINT_INIT);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler }
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler}
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler#define PREFIXLEN 16
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butlerstatic void
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butlerprint_rule(ike_rule_t *rp)
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler{
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler char prefix[PREFIXLEN];
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler int i;
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler ike_p1_xform_t *xfp;
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler ike_addr_pr_t *lipp, *ripp;
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler char *lidp, *ridp;
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler (void) printf("\n");
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler (void) printf(gettext("GLOBL: Label '%s', key manager cookie %u\n"),
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler rp->rule_label, rp->rule_kmcookie);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler (void) printf(gettext("GLOBL: local_idtype="));
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler (void) dump_sadb_idtype(rp->rule_local_idtype, stdout, NULL);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler (void) printf(gettext(", ike_mode=%s\n"), xchgstr(rp->rule_ike_mode));
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler (void) printf(gettext(
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler "GLOBL: p1_nonce_len=%u, p2_nonce_len=%u, p2_pfs=%s (group %u)\n"),
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler rp->rule_p1_nonce_len, rp->rule_p2_nonce_len,
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler (rp->rule_p2_pfs) ? gettext("true") : gettext("false"),
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler rp->rule_p2_pfs);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler (void) printf(
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler gettext("GLOBL: p2_lifetime=%u seconds, p2_softlife=%u seconds\n"),
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler rp->rule_p2_lifetime_secs, rp->rule_p2_softlife_secs);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler (void) printf(
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler gettext("GLOBL: p2_idletime=%u seconds\n"),
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler rp->rule_p2_idletime_secs);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler (void) printf(
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler gettext("GLOBL: p2_lifetime_kb=%u seconds,"
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler " p2_softlife_kb=%u seconds\n"),
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler rp->rule_p2_lifetime_kb, rp->rule_p2_softlife_kb);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler if (rp->rule_locip_cnt > 0) {
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler (void) printf(gettext("LOCIP: IP address range(s):\n"));
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler lipp = (ike_addr_pr_t *)((int)rp + rp->rule_locip_off);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler for (i = 0; i < rp->rule_locip_cnt; i++, lipp++) {
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler print_addr_range("LOCIP:", lipp);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (rp->rule_remip_cnt > 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("REMIP: IP address range(s):\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ripp = (ike_addr_pr_t *)((int)rp + rp->rule_remip_off);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (i = 0; i < rp->rule_remip_cnt; i++, ripp++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_addr_range("REMIP:", ripp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana if (rp->rule_locid_inclcnt + rp->rule_locid_exclcnt > 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh lidp = (char *)((int)rp + rp->rule_locid_off);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_idspec("LOCID:", lidp, rp->rule_locid_inclcnt,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rp->rule_locid_exclcnt);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (rp->rule_remid_inclcnt + rp->rule_remid_exclcnt > 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ridp = (char *)((int)rp + rp->rule_remid_off);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_idspec("REMID:", ridp, rp->rule_remid_inclcnt,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rp->rule_remid_exclcnt);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (rp->rule_xform_cnt > 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("XFRMS: Available Transforms:\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh xfp = (ike_p1_xform_t *)((int)rp + rp->rule_xform_off);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (i = 0; i < rp->rule_xform_cnt; i++, xfp++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) snprintf(prefix, PREFIXLEN, "XF %2u:", i);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_xform(prefix, xfp, B_TRUE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#undef PREFIXLEN
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define PRSACNTS(init, resp) \
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("initiator: %10u responder: %10u\n"), \
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (init), (resp))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_stats(ike_stats_t *sp, int len)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * before printing each line, make sure the structure we were
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * given is big enough to include the fields needed.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (len < COUNTER_PAIR)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("Phase 1 SA counts:\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("Current: "));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh PRSACNTS(sp->st_init_p1_current, sp->st_resp_p1_current);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh len -= COUNTER_PAIR;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (len < COUNTER_PAIR)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh (void) printf(gettext("Total: "));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh PRSACNTS(sp->st_init_p1_total, sp->st_resp_p1_total);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh len -= COUNTER_PAIR;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (len < COUNTER_PAIR)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("Attempted: "));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh PRSACNTS(sp->st_init_p1_attempts, sp->st_resp_p1_attempts);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh len -= COUNTER_PAIR;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (len < (COUNTER_PAIR + COUNTER_32BIT))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("Failed: "));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh PRSACNTS(sp->st_init_p1_noresp + sp->st_init_p1_respfail,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sp->st_resp_p1_fail);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext(" initiator fails include %u time-out(s)\n"),
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh sp->st_init_p1_noresp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (len < PATH_MAX)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (*(sp->st_pkcs11_libname) != '\0')
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("PKCS#11 library linked in from %s\n"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sp->st_pkcs11_libname);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_defaults(char *label, char *description, char *unit, boolean_t kbytes,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint_t current, uint_t def)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("%-18s%-10s%14u%s%-10s%-26s\n", label,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (current != def) ? gettext("config") : gettext("default"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (current != def) ? current : def, (kbytes) ? "K " : " ",
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh unit, description);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * Print out defaults used by in.iked, the argument is a buffer containing
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * two ike_defaults_t's, the first contains the hard coded defaults, the second
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * contains the actual values used. If these differ, then the defaults have been
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * changed via a config file entry. Note that "-" indicates this default
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * is not tunable.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdo_print_defaults(ike_defaults_t *dp)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_defaults_t *ddp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ddp = (ike_defaults_t *)(dp + 1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("\nGlobal defaults. Some values can be"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " over-ridden on a per rule basis.\n\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("%-18s%-10s%-16s%-10s%-26s\n\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("Token:"), gettext("Source:"), gettext("Value:"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("Unit:"), gettext("Description:"));
145e0143b4896d03ce53b1af6787afa1a7e73959dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_defaults("p1_lifetime_secs", gettext("phase 1 lifetime"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("seconds"), B_FALSE, ddp->rule_p1_lifetime_secs,
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh dp->rule_p1_lifetime_secs);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_defaults("-", gettext("minimum phase 1 lifetime"),
145e0143b4896d03ce53b1af6787afa1a7e73959dh gettext("seconds"), B_FALSE, ddp->rule_p1_minlife,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dp->rule_p1_minlife);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_defaults("p1_nonce_len", gettext("phase 1 nonce length"),
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh gettext("bytes"), B_FALSE, ddp->rule_p1_nonce_len,
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh dp->rule_p1_nonce_len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_defaults("p2_lifetime_secs", gettext("phase 2 lifetime"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("seconds"), B_FALSE, ddp->rule_p2_lifetime_secs,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dp->rule_p2_lifetime_secs);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_defaults("p2_softlife_secs", gettext("phase 2 soft lifetime"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("seconds"), B_FALSE, ddp->rule_p2_softlife_secs,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dp->rule_p2_softlife_secs);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_defaults("p2_idletime_secs", gettext("phase 2 idle time"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("seconds"), B_FALSE, ddp->rule_p2_idletime_secs,
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana dp->rule_p2_idletime_secs);
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana print_defaults("-", gettext("system phase 2 lifetime"),
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana gettext("seconds"), B_FALSE, ddp->sys_p2_lifetime_secs,
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana dp->sys_p2_lifetime_secs);
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_defaults("-", gettext("system phase 2 soft lifetime"),
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana gettext("seconds"), B_FALSE, ddp->sys_p2_softlife_secs,
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana dp->sys_p2_softlife_secs);
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana print_defaults("-", gettext("system phase 2 idle time"),
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana gettext("seconds"), B_FALSE, ddp->sys_p2_idletime_secs,
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana dp->sys_p2_idletime_secs);
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana print_defaults("p2_lifetime_kb", gettext("phase 2 lifetime"),
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana gettext("bytes"), B_TRUE, ddp->rule_p2_lifetime_kb,
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana dp->rule_p2_lifetime_kb);
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana print_defaults("p2_softlife_kb", gettext("phase 2 soft lifetime"),
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana gettext("bytes"), B_TRUE, ddp->rule_p2_softlife_kb,
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana dp->rule_p2_softlife_kb);
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana print_defaults("-", gettext("system phase 2 lifetime"),
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana gettext("bytes"), B_FALSE, ddp->sys_p2_lifetime_bytes,
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana dp->sys_p2_lifetime_bytes);
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana print_defaults("-", gettext("system phase 2 soft lifetime"),
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana gettext("bytes"), B_FALSE, ddp->sys_p2_softlife_bytes,
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana dp->sys_p2_softlife_bytes);
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana print_defaults("-", gettext("minimum phase 2 lifetime"),
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana gettext("seconds"), B_FALSE, ddp->rule_p2_minlife,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dp->rule_p2_minlife);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_defaults("p2_nonce_len", gettext("phase 2 nonce length"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("bytes"), B_FALSE, ddp->rule_p2_nonce_len,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dp->rule_p2_nonce_len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_defaults("-", gettext("default phase 2 lifetime"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("seconds"), B_FALSE, ddp->rule_p2_def_minlife,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dp->rule_p2_def_minlife);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_defaults("-", gettext("minimum phase 2 soft delta"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("seconds"), B_FALSE, ddp->rule_p2_minsoft,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dp->rule_p2_minsoft);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_defaults("p2_pfs", gettext("phase 2 PFS"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " ", B_FALSE, ddp->rule_p2_pfs, dp->rule_p2_pfs);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler print_defaults("max_certs", gettext("max certificates"),
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler " ", B_FALSE, ddp->rule_max_certs, dp->rule_max_certs);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler print_defaults("-", gettext("IKE port number"),
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler " ", B_FALSE, ddp->rule_ike_port, dp->rule_ike_port);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler print_defaults("-", gettext("NAT-T port number"),
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler " ", B_FALSE, ddp->rule_natt_port, dp->rule_natt_port);
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister}
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollisterstatic void
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollisterprint_categories(int level)
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister{
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister int mask;
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister if (level == 0) {
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister (void) printf(gettext("No debug categories enabled.\n"));
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return;
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister }
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister (void) printf(gettext("Debug categories enabled:"));
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister for (mask = 1; mask <= D_HIGHBIT; mask <<= 1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (level & mask)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n\t%s", dbgstr(mask));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*PRINTFLIKE2*/
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhikeadm_err_exit(ike_err_t *err, char *fmt, ...)
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh va_list ap;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char bailbuf[BUFSIZ];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh va_start(ap, fmt);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) vsnprintf(bailbuf, BUFSIZ, fmt, ap);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler va_end(ap);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((err != NULL) && (err->ike_err == IKE_ERR_SYS_ERR)) {
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler bail_msg("%s: %s", bailbuf, (err->ike_err_unix == 0) ?
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("<unknown error>") : strerror(err->ike_err_unix));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bail_msg("%s: %s", bailbuf, (err == NULL) ?
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("<unknown error>") : errstr(err->ike_err));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*PRINTFLIKE2*/
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhikeadm_err_msg(ike_err_t *err, char *fmt, ...)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh va_list ap;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char mbuf[BUFSIZ];
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh va_start(ap, fmt);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) vsnprintf(mbuf, BUFSIZ, fmt, ap);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh va_end(ap);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((err != NULL) && (err->ike_err == IKE_ERR_SYS_ERR)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh message("%s: %s", mbuf, (err->ike_err_unix == 0) ?
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("<unknown error>") :
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ((err->ike_err_unix == EEXIST) ?
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("Duplicate entry") :
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh strerror(err->ike_err_unix)));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh message("%s: %s", mbuf, (err == NULL) ?
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("<unknown error>") : errstr(err->ike_err));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Command functions
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Exploit the fact that ike_dbg_t and ike_priv_t have identical
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * formats in the following two functions.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdo_getvar(int cmd)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_service_t req, *rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_dbg_t *dreq;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *varname;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (cmd) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_GET_DBG:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh varname = gettext("debug");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_GET_PRIV:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh varname = gettext("privilege");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bail_msg(gettext("unrecognized get command (%d)"), cmd);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dreq = &req.svc_dbg;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dreq->cmd = cmd;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dreq->dbg_level = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rtn = ikedoor_call((char *)&req, sizeof (ike_dbg_t), NULL, 0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((rtn == NULL) || (rtn->svc_err.cmd == IKE_SVC_ERROR)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ikeadm_err_exit(&rtn->svc_err,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("error getting %s level"), varname);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dreq = &rtn->svc_dbg;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(gettext("Current %s level is 0x%x"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh varname, dreq->dbg_level);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (cmd == IKE_SVC_GET_DBG) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_categories(dreq->dbg_level);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh (void) printf(gettext(", %s enabled\n"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh privstr(dreq->dbg_level));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdhdo_setvar(int cmd, int argc, char **argv)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_service_t req, *rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_dbg_t *dreq;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh door_desc_t *descp = NULL, desc;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh int fd, ndesc = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint32_t reqlevel;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *varname;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (argc < 1)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("unspecified level");
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh reqlevel = strtoul(argv[0], NULL, 0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (cmd) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_SET_DBG:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (argc > 2)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("Too many arguments to \"set debug\"");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh varname = gettext("debug");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (reqlevel == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* check for a string... */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh reqlevel = parsedbgopts(argv[0]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (reqlevel == D_INVALID)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bail_msg(gettext("Bad debug flag: %s"), argv[0]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_SET_PRIV:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (argc > 1)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("Too many arguments to \"set priv\"");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh varname = gettext("privilege");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (reqlevel == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* check for a string... */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh reqlevel = privstr2num(argv[0]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (reqlevel > IKE_PRIV_MAXIMUM)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bail_msg(gettext("Bad privilege flag: %s"), argv[0]);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bail_msg(gettext("unrecognized set command (%d)"), cmd);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dreq = &req.svc_dbg;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dreq->cmd = cmd;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dreq->dbg_level = reqlevel;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((argc == 2) && (cmd == IKE_SVC_SET_DBG)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh fd = open(argv[1], O_RDWR | O_CREAT | O_APPEND,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh S_IRUSR | S_IWUSR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (fd < 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("open debug file");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh desc.d_data.d_desc.d_descriptor = fd;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh desc.d_attributes = DOOR_DESCRIPTOR;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh descp = &desc;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ndesc = 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rtn = ikedoor_call((char *)&req, sizeof (ike_dbg_t), descp, ndesc);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((rtn == NULL) || (rtn->svc_err.cmd == IKE_SVC_ERROR)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ikeadm_err_exit(&rtn->svc_err,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("error setting %s level"), varname);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dreq = &rtn->svc_dbg;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) printf(
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("Successfully changed %s level from 0x%x to 0x%x\n"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh varname, dreq->dbg_level, reqlevel);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (cmd == IKE_SVC_SET_DBG) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_categories(reqlevel);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh } else {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh (void) printf(gettext("New privilege level 0x%x enables %s\n"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh reqlevel, privstr(reqlevel));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdo_getstats(int cmd)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_service_t *rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_statreq_t sreq, *sreqp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_stats_t *sp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sreq.cmd = cmd;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rtn = ikedoor_call((char *)&sreq, sizeof (ike_statreq_t), NULL, 0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((rtn == NULL) || (rtn->svc_err.cmd == IKE_SVC_ERROR)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ikeadm_err_exit(&rtn->svc_err, gettext("error getting stats"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sreqp = &rtn->svc_stats;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sp = (ike_stats_t *)(sreqp + 1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_stats(sp, sreqp->stat_len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdo_getdefs(int cmd)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_service_t *rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_defreq_t dreq, *dreqp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_defaults_t *dp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dreq.cmd = cmd;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rtn = ikedoor_call((char *)&dreq, sizeof (ike_defreq_t), NULL, 0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((rtn == NULL) || (rtn->svc_err.cmd == IKE_SVC_ERROR)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ikeadm_err_exit(&rtn->svc_err,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("error getting defaults"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dreqp = &rtn->svc_defaults;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dp = (ike_defaults_t *)(dreqp + 1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Before printing each line, make sure the structure we were
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * given is big enough to include the fields needed.
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * Silently bail out of there is a version mismatch.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (dreqp->stat_len < ((2 * sizeof (ike_defaults_t))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh + sizeof (ike_defreq_t)) || dreqp->version != DOORVER) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh do_print_defaults(dp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdo_dump(int cmd)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *name;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_service_t req, *rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_dump_t *dreq, *dump;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (cmd) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_DUMP_P1S:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh name = gettext("phase 1 SA info");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_DUMP_RULES:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh name = gettext("policy rules");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_DUMP_PS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh name = gettext("preshared keys");
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bail_msg(gettext("unrecognized dump command (%d)"), cmd);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dreq = &req.svc_dump;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dreq->cmd = cmd;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dreq->dump_len = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dreq->dump_next = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh do {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rtn = ikedoor_call((char *)&req, sizeof (ike_dump_t),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NULL, 0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((rtn == NULL) || (rtn->svc_err.cmd == IKE_SVC_ERROR)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (rtn && (rtn->svc_err.ike_err == IKE_ERR_NO_OBJ)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* no entries to print */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ikeadm_err_exit(&rtn->svc_err,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("error getting %s"), name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dump = &rtn->svc_dump;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (cmd) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_DUMP_P1S:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_p1((ike_p1_sa_t *)(dump + 1));
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh break;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh case IKE_SVC_DUMP_RULES:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_rule((ike_rule_t *)(dump + 1));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_DUMP_PS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_ps((ike_ps_t *)(dump + 1));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dreq->dump_next = dump->dump_next;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) munmap((char *)rtn, dump->dump_len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } while (dreq->dump_next);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh (void) printf(gettext("\nCompleted dump of %s\n"), name);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdo_getdel_doorcall(int cmd, int idlen, int idtype, char *idp, char *name)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int totallen;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *p;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_service_t *reqp, *rtnp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_get_t *getp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh boolean_t getcmd;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh getcmd = ((cmd == IKE_SVC_GET_P1) || (cmd == IKE_SVC_GET_RULE) ||
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (cmd == IKE_SVC_GET_PS));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * WARNING: to avoid being redundant, this code takes advantage
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * of the fact that the ike_get_t and ike_del_t structures are
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * identical (only the field names differ, their function and
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * size are the same). If for some reason those structures
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * change, this code will need to be re-written to accomodate
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * that difference.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh totallen = sizeof (ike_get_t) + idlen;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((reqp = (ike_service_t *)malloc(totallen)) == NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("malloc(id)");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh getp = &reqp->svc_get;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh getp->cmd = cmd;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh getp->get_len = totallen;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh getp->get_idtype = idtype;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh p = (char *)(getp + 1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) memcpy(p, idp, idlen);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rtnp = ikedoor_call((char *)reqp, totallen, NULL, 0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((rtnp == NULL) || (rtnp->svc_err.cmd == IKE_SVC_ERROR)) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (rtnp && (rtnp->svc_err.ike_err == IKE_ERR_NO_OBJ)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh message(gettext("Could not find requested %s."), name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ikeadm_err_msg(&rtnp->svc_err, gettext("error %s %s"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (getcmd) ? gettext("getting") : gettext("deleting"),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh free(reqp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh getp = &rtnp->svc_get;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (getcmd) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (cmd) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_GET_P1:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_p1((ike_p1_sa_t *)(getp + 1));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_GET_PS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_ps((ike_ps_t *)(getp + 1));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_GET_RULE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_rule((ike_rule_t *)(getp + 1));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh message(gettext("Successfully deleted selected %s."), name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) munmap((char *)rtnp, getp->get_len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh free(reqp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdo_getdel(int cmd, int argc, char **argv)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int idlen, idtype = 0, i, j;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int bytelen1, bytelen2;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *name, *idp, *p, *p1, *p2;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_addr_pr_t apr;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_cky_pr_t cpr;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sadb_ident_t *sid1p, *sid2p;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct hostent *he1p, *he2p;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char label[MAX_LABEL_LEN];
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((argc < 1) || (argv[0] == NULL)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("not enough identification info");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (cmd) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_GET_P1:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_DEL_P1:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh name = gettext("phase 1 SA");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * The first token must either be an address (or hostname)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * or a cookie. We require cookies to be entered as hex
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * numbers, beginning with 0x; so if our token starts with
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * that, it's a cookie.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (strncmp(argv[0], "0x", 2) == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (parse_cky_pr(argc, argv, &cpr) >= 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idtype = IKE_ID_CKY_PAIR;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idlen = sizeof (ike_cky_pr_t);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idp = (char *)&cpr;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (parse_addr_pr(argc, argv, &he1p, &he2p) >= 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idtype = IKE_ID_ADDR_PAIR;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idlen = sizeof (ike_addr_pr_t);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_GET_RULE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_DEL_RULE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh name = gettext("policy rule");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (parse_label(argc, argv, label) >= 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idtype = IKE_ID_LABEL;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idlen = MAX_LABEL_LEN;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idp = label;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_GET_PS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_DEL_PS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh name = gettext("preshared key");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * The first token must either be an address or an ident
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * type. Check for an ident type to determine which it is.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (parse_idtype(argv[0], NULL) >= 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (parse_ident_pr(argc, argv, &sid1p, &sid2p) >= 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idtype = IKE_ID_IDENT_PAIR;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idlen = SADB_64TO8(sid1p->sadb_ident_len) +
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh SADB_64TO8(sid2p->sadb_ident_len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (parse_addr_pr(argc, argv, &he1p, &he2p) >= 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idtype = IKE_ID_ADDR_PAIR;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idlen = sizeof (ike_addr_pr_t);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bail_msg(gettext("unrecognized get/del command (%d)"), cmd);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (idtype) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_ID_ADDR_PAIR:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * we might have exploding addrs here; do every possible
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * combination.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh i = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh j = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while ((p1 = he1p->h_addr_list[i++]) != NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh headdr2sa(p1, &apr.loc_addr, he1p->h_length);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while ((p2 = he2p->h_addr_list[j++]) != NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh headdr2sa(p2, &apr.rem_addr, he2p->h_length);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh do_getdel_doorcall(cmd, idlen, idtype,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (char *)&apr, name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh FREE_HE(he1p);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh FREE_HE(he2p);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_ID_IDENT_PAIR:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bytelen1 = SADB_64TO8(sid1p->sadb_ident_len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bytelen2 = SADB_64TO8(sid2p->sadb_ident_len);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (idlen != bytelen1 + bytelen2)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("ident syntax error");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idp = p = (char *)malloc(idlen);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (p == NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("malloc(id)");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) memcpy(p, (char *)sid1p, bytelen1);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh p += bytelen1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) memcpy(p, (char *)sid2p, bytelen2);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh do_getdel_doorcall(cmd, idlen, idtype, idp, name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh free(idp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh free(sid1p);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh free(sid2p);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_ID_CKY_PAIR:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_ID_LABEL:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh do_getdel_doorcall(cmd, idlen, idtype, idp, name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case 0:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bail_msg(gettext("invalid %s identification\n"), name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Copy source into target, inserting an escape character ('\') before
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * any quotes that appear. Return true on success, false on failure.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic boolean_t
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhescapequotes(char *target, char *source, int tlen)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int s, t, len = strlen(source) + 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (tlen < len)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (B_FALSE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (s = 0, t = 0; s < len && t < tlen; s++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (source[s] == '\"')
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh target[t++] = '\\';
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh target[t++] = source[s];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((t == tlen) && (s < len))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (B_FALSE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (B_TRUE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Return true if the arg following the given keyword should
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * be in quotes (i.e. is a string), false if not.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic boolean_t
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhquotedfield(char *keywd)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((strncmp(keywd, "label", strlen("label") + 1) == 0) ||
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (strncmp(keywd, "local_id", strlen("local_id") + 1) == 0) ||
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (strncmp(keywd, "remote_id", strlen("remote_id") + 1) == 0))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (B_TRUE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (B_FALSE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdo_new(int cmd, int argc, char **argv)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_service_t *rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_new_t new, *newp = NULL;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh door_desc_t desc, *descp = NULL;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int i, fd, ndesc = 0, buflen;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *name, tmpfilepath[32];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh FILE *tmpfile;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (cmd) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_NEW_PS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh name = gettext("preshared key");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_NEW_RULE:
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh name = gettext("policy rule");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bail_msg(gettext("unrecognized new command (%d)"), cmd);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (argc == 1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* We've been given a file to read from */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh fd = open(argv[0], O_RDONLY);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (fd < 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("open source file");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh desc.d_data.d_desc.d_descriptor = fd;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh desc.d_attributes = DOOR_DESCRIPTOR | DOOR_RELEASE;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh descp = &desc;
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler ndesc = 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh new.cmd = cmd;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh new.new_len = 0;
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler newp = &new;
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler buflen = sizeof (ike_new_t);
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler } else if ((argc > 1) && (cmd == IKE_SVC_NEW_PS)) {
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler /*
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler * This is an alternative to using the tmpfile method
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler * for preshared keys. It means we're duplicating the
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler * parsing effort that happens in readps.c; but it
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler * does avoid having the key sitting in a file.
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler */
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler ike_ps_t *psp;
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler int pslen;
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * must be in interactive mode; don't want keys in
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * the process args.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (!interactive)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("Must be in interactive mode to add key info.");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (parse_ps(argc, argv, &psp, &pslen) < 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh errno = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("invalid preshared key definition");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh newp = malloc(sizeof (ike_new_t) + pslen);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (newp == NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("alloc pskey");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh newp->cmd = cmd;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh newp->new_len = sizeof (ike_new_t) + pslen;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) memcpy((char *)(newp + 1), psp, pslen);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh buflen = newp->new_len;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* parse_ps allocated the ike_ps_t buffer; free it now */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh free(psp);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else if ((argc > 1) && (cmd == IKE_SVC_NEW_RULE)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * We've been given the item in argv. However, parsing
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * rules can get more than a little messy, and in.iked
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * already has a great parser for this stuff! So don't
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * fool around with trying to do the parsing here. Just
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * write it out to a tempfile, and send the fd to in.iked.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * We could conceivably do this for preshared keys,
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * rather than duplicating the parsing effort; but that
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * would mean the key would be written out to a file,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * which isn't such a good idea.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh boolean_t doquotes = B_FALSE;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh int rtn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((argv[0][0] != '{') ||
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (argv[argc - 1][strlen(argv[argc - 1]) - 1] != '}'))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bail_msg(gettext("improperly formatted %s"), name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* attempt to use a fairly unpredictable file name... */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) sprintf(tmpfilepath, "/var/run/%x", (int)gethrtime());
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh fd = open(tmpfilepath, O_RDWR | O_CREAT | O_EXCL,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh S_IRUSR | S_IWUSR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (fd < 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("cannot open tmpfile");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* and make it inaccessible asap */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (unlink(tmpfilepath) < 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) close(fd);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("tmpfile error");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh tmpfile = fdopen(fd, "w");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (tmpfile == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) close(fd);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("cannot write to tmpfile");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (i = 0; i < argc; i++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * We have to do some gyrations with our string here,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * to properly handle quotes. There are two issues:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * - some of the fields of a rule may have embedded
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * whitespace, and thus must be quoted on the cmd
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * line. The shell removes the quotes, and gives
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * us a single argv string; but we need to put the
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * quotes back in when we write the string out to
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * file. The doquotes boolean is set when we
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * process a keyword which will be followed by a
b18a19c275d2531444fcd2f66664cbe3c6897f6aJesse Butler * string value (so the NEXT argv element will be
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * quoted).
b18a19c275d2531444fcd2f66664cbe3c6897f6aJesse Butler * - there might be a quote character in a field,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * that was escaped on the cmdline. The shell
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * removes the escape char, and leaves the quote
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * in the string it gives us. We need to put the
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * escape char back in before writing to file.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char field[MAXLINESIZE];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (!escapequotes(field, argv[i], MAXLINESIZE))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("write to tmpfile failed (arg too big)");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (doquotes) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rtn = fprintf(tmpfile, "\"%s\"\n", field);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh doquotes = B_FALSE;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rtn = fprintf(tmpfile, "%s\n", field);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (rtn < 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("write to tmpfile failed");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * check if this is a keyword identifying
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * a field that needs to be quoted.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh doquotes = quotedfield(argv[i]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (fflush(tmpfile) == EOF)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("write to tmpfile failed");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* rewind so that the daemon will get the beginning */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rewind(tmpfile);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh desc.d_data.d_desc.d_descriptor = fd;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh desc.d_attributes = DOOR_DESCRIPTOR | DOOR_RELEASE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh descp = &desc;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ndesc = 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh new.cmd = cmd;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh new.new_len = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh newp = &new;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh buflen = sizeof (ike_new_t);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* not enough information! */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bail_msg(gettext("missing %s description or file name"), name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rtn = ikedoor_call((char *)newp, buflen, descp, ndesc);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((rtn == NULL) || (rtn->svc_err.cmd == IKE_SVC_ERROR)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ikeadm_err_msg(&rtn->svc_err,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("error creating new %s"), name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh message(gettext("Successfully created new %s."), name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdo_flush(int cmd)
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh{
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh ike_service_t *rtnp;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh ike_flush_t flush;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (cmd != IKE_SVC_FLUSH_P1S) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh bail_msg(gettext("unrecognized flush command (%d)."), cmd);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh flush.cmd = cmd;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh rtnp = ikedoor_call((char *)&flush, sizeof (ike_flush_t), NULL, 0);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if ((rtnp == NULL) || (rtnp->svc_err.cmd == IKE_SVC_ERROR)) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh ikeadm_err_exit(&rtnp->svc_err, gettext("error doing flush"));
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh message(gettext("Successfully flushed P1 SAs."));
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh}
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdhstatic void
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdhdo_rw(int cmd, int argc, char **argv)
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh{
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh ike_service_t *rtnp;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh ike_rw_t rw;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh door_desc_t desc, *descp = NULL;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh int oflag, omode, fd, ndesc = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *op, *obj = NULL;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh boolean_t writing = B_FALSE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (cmd) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_READ_PS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh obj = gettext("preshared key");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* FALLTHRU */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_READ_RULES:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (obj == NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh obj = gettext("policy rule");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh op = gettext("read");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh oflag = O_RDONLY;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh omode = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_WRITE_PS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh obj = gettext("preshared key");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* FALLTHRU */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_WRITE_RULES:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (obj == NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh obj = gettext("policy rule");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh op = gettext("write");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh oflag = O_RDWR | O_CREAT | O_EXCL;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh omode = S_IRUSR | S_IWUSR;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* for write commands, dest location must be specified */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (argc < 1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bail_msg(gettext("destination location required "
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "to write %ss"), obj);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh writing = B_TRUE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bail_msg(gettext("unrecognized read/write command (%d)."), cmd);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rw.cmd = cmd;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (argc >= 1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rw.rw_loc = IKE_RW_LOC_USER_SPEC;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh fd = open(argv[0], oflag, omode);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (fd < 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("open user-specified file");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh desc.d_data.d_desc.d_descriptor = fd;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh desc.d_attributes = DOOR_DESCRIPTOR | DOOR_RELEASE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh descp = &desc;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ndesc = 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rw.rw_loc = IKE_RW_LOC_DEFAULT;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rtnp = ikedoor_call((char *)&rw, sizeof (ike_rw_t), descp, ndesc);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((rtnp == NULL) || (rtnp->svc_err.cmd == IKE_SVC_ERROR)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Need to remove the target file in the
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * case of a failed write command.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (writing) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * argv[0] must be valid if we're writing; we
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * exit before setting this boolean if not.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) unlink(argv[0]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) close(fd);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((rtnp != NULL) &&
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (rtnp->svc_err.ike_err == IKE_ERR_NO_OBJ)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh message(gettext("No %s information to write."),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh obj);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ikeadm_err_exit(&rtnp->svc_err, gettext("error doing %s"), op);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh message(gettext("Completed %s of %s configuration information."),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh op, obj);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdo_rbdump()
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_cmd_t req;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ike_service_t *rtnp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh req.cmd = IKE_SVC_DBG_RBDUMP;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh rtnp = ikedoor_call((char *)&req, sizeof (ike_cmd_t), NULL, 0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((rtnp == NULL) || (rtnp->svc_err.cmd == IKE_SVC_ERROR)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ikeadm_err_exit(&rtnp->svc_err, gettext("error doing flush"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh message(gettext("Successfully dumped rulebase; check iked dbg"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define REQ_ARG_CNT 1
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*ARGSUSED*/
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhparseit(int argc, char **argv, char *notused, boolean_t notused_either)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int cmd, cmd_obj_args = 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *cmdstr, *objstr;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (interactive) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (argc == 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (argc < REQ_ARG_CNT) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh usage();
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh cmdstr = argv[0];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (argc > REQ_ARG_CNT) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh cmd_obj_args++;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh objstr = argv[1];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh objstr = NULL;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh cmd = parsecmd(cmdstr, objstr);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* skip over args specifying command/object */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh argc -= cmd_obj_args;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh argv += cmd_obj_args;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (cmd) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_GET_DEFS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh do_getdefs(cmd);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_GET_DBG:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_GET_PRIV:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh do_getvar(cmd);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_GET_STATS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh do_getstats(cmd);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_SET_DBG:
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh case IKE_SVC_SET_PRIV:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh do_setvar(cmd, argc, argv);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_DUMP_P1S:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_DUMP_RULES:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_DUMP_PS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh do_dump(cmd);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_GET_P1:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_GET_RULE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_GET_PS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_DEL_P1:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_DEL_RULE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_DEL_PS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh do_getdel(cmd, argc, argv);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_NEW_RULE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_NEW_PS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh do_new(cmd, argc, argv);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_FLUSH_P1S:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh do_flush(cmd);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_READ_RULES:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_READ_PS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_WRITE_RULES:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_WRITE_PS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh do_rw(cmd, argc, argv);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKEADM_HELP_GENERAL:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_help();
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKEADM_HELP_GET:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_get_help();
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKEADM_HELP_SET:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_set_help();
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKEADM_HELP_ADD:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_add_help();
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKEADM_HELP_DEL:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_del_help();
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKEADM_HELP_DUMP:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_dump_help();
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKEADM_HELP_FLUSH:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_flush_help();
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKEADM_HELP_READ:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_read_help();
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKEADM_HELP_WRITE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_write_help();
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKEADM_HELP_HELP:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_help_help();
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKEADM_EXIT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (interactive)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh exit(0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_DBG_RBDUMP:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh do_rbdump();
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case IKE_SVC_ERROR:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh usage();
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh exit(0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhint
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhmain(int argc, char **argv)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char ch;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) setlocale(LC_ALL, "");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#if !defined(TEXT_DOMAIN)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define TEXT_DOMAIN "SYS_TEST"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#endif
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) textdomain(TEXT_DOMAIN);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while ((ch = getopt(argc, argv, "hpn")) != EOF) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (ch) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case 'h':
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_help();
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case 'p':
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pflag = B_TRUE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case 'n':
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh nflag = B_TRUE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh usage();
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh argc -= optind;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh argv += optind;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (open_door() < 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) fprintf(stderr,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh gettext("Unable to communicate with in.iked\n"));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh Bail("open_door failed");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (*argv == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* no cmd-line args, do interactive mode */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh do_interactive(stdin, NULL, "ikeadm> ", NULL, parseit);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh parseit(argc, argv, NULL, B_FALSE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh