Annotation of embedaddon/strongswan/src/swanctl/commands/list_pols.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2014 Martin Willi
! 3: * Copyright (C) 2014 revosec AG
! 4: *
! 5: * This program is free software; you can redistribute it and/or modify it
! 6: * under the terms of the GNU General Public License as published by the
! 7: * Free Software Foundation; either version 2 of the License, or (at your
! 8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 9: *
! 10: * This program is distributed in the hope that it will be useful, but
! 11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 13: * for more details.
! 14: */
! 15:
! 16: #define _GNU_SOURCE
! 17: #include <stdio.h>
! 18: #include <errno.h>
! 19:
! 20: #include "command.h"
! 21:
! 22: #include <collections/hashtable.h>
! 23:
! 24: /**
! 25: * Free hashtable with contained strings
! 26: */
! 27: static void free_hashtable(hashtable_t *hashtable)
! 28: {
! 29: enumerator_t *enumerator;
! 30: char *str;
! 31:
! 32: enumerator = hashtable->create_enumerator(hashtable);
! 33: while (enumerator->enumerate(enumerator, NULL, &str))
! 34: {
! 35: free(str);
! 36: }
! 37: enumerator->destroy(enumerator);
! 38:
! 39: hashtable->destroy(hashtable);
! 40: }
! 41:
! 42: CALLBACK(policy_values, int,
! 43: hashtable_t *pol, vici_res_t *res, char *name, void *value, int len)
! 44: {
! 45: chunk_t chunk;
! 46: char *str;
! 47:
! 48: chunk = chunk_create(value, len);
! 49: if (chunk_printable(chunk, NULL, ' '))
! 50: {
! 51: if (asprintf(&str, "%.*s", len, value) >= 0)
! 52: {
! 53: free(pol->put(pol, name, str));
! 54: }
! 55: }
! 56: return 0;
! 57: }
! 58:
! 59: CALLBACK(policy_list, int,
! 60: hashtable_t *pol, vici_res_t *res, char *name, void *value, int len)
! 61: {
! 62: chunk_t chunk;
! 63: char *str;
! 64:
! 65: chunk = chunk_create(value, len);
! 66: if (chunk_printable(chunk, NULL, ' '))
! 67: {
! 68: str = pol->get(pol, name);
! 69: if (asprintf(&str, "%s%s%.*s",
! 70: str ?: "", str ? " " : "", len, value) >= 0)
! 71: {
! 72: free(pol->put(pol, name, str));
! 73: }
! 74: }
! 75: return 0;
! 76: }
! 77:
! 78: CALLBACK(policies, int,
! 79: void *null, vici_res_t *res, char *name)
! 80: {
! 81: hashtable_t *pol;
! 82: int ret;
! 83:
! 84: pol = hashtable_create(hashtable_hash_str, hashtable_equals_str, 1);
! 85: ret = vici_parse_cb(res, NULL, policy_values, policy_list, pol);
! 86:
! 87: printf("%s, %s\n", name, pol->get(pol, "mode"));
! 88: printf(" local: %s\n", pol->get(pol, "local-ts"));
! 89: printf(" remote: %s\n", pol->get(pol, "remote-ts"));
! 90:
! 91: free_hashtable(pol);
! 92: return ret;
! 93: }
! 94:
! 95: CALLBACK(list_cb, void,
! 96: command_format_options_t *format, char *name, vici_res_t *res)
! 97: {
! 98: if (*format & COMMAND_FORMAT_RAW)
! 99: {
! 100: vici_dump(res, "list-policy event", *format & COMMAND_FORMAT_PRETTY,
! 101: stdout);
! 102: }
! 103: else
! 104: {
! 105: if (vici_parse_cb(res, policies, NULL, NULL, NULL) != 0)
! 106: {
! 107: fprintf(stderr, "parsing policy event failed: %s\n", strerror(errno));
! 108: }
! 109: }
! 110: }
! 111:
! 112: static int list_pols(vici_conn_t *conn)
! 113: {
! 114: vici_req_t *req;
! 115: vici_res_t *res;
! 116: bool trap = FALSE, drop = FALSE, pass = FALSE;
! 117: command_format_options_t format = COMMAND_FORMAT_NONE;
! 118: char *arg, *child = NULL;
! 119: int ret;
! 120:
! 121: while (TRUE)
! 122: {
! 123: switch (command_getopt(&arg))
! 124: {
! 125: case 'h':
! 126: return command_usage(NULL);
! 127: case 'c':
! 128: child = arg;
! 129: continue;
! 130: case 't':
! 131: trap = TRUE;
! 132: continue;
! 133: case 'd':
! 134: drop = TRUE;
! 135: continue;
! 136: case 'p':
! 137: pass = TRUE;
! 138: continue;
! 139: case 'P':
! 140: format |= COMMAND_FORMAT_PRETTY;
! 141: /* fall through to raw */
! 142: case 'r':
! 143: format |= COMMAND_FORMAT_RAW;
! 144: continue;
! 145: case EOF:
! 146: break;
! 147: default:
! 148: return command_usage("invalid --list-pols option");
! 149: }
! 150: break;
! 151: }
! 152: if (!trap && !drop && !pass)
! 153: {
! 154: trap = drop = pass = TRUE;
! 155: }
! 156: if (vici_register(conn, "list-policy", list_cb, &format) != 0)
! 157: {
! 158: ret = errno;
! 159: fprintf(stderr, "registering for policies failed: %s\n",
! 160: strerror(errno));
! 161: return ret;
! 162: }
! 163: req = vici_begin("list-policies");
! 164: if (child)
! 165: {
! 166: vici_add_key_valuef(req, "child", "%s", child);
! 167: }
! 168: if (trap)
! 169: {
! 170: vici_add_key_valuef(req, "trap", "yes");
! 171: }
! 172: if (drop)
! 173: {
! 174: vici_add_key_valuef(req, "drop", "yes");
! 175: }
! 176: if (pass)
! 177: {
! 178: vici_add_key_valuef(req, "pass", "yes");
! 179: }
! 180: res = vici_submit(req, conn);
! 181: if (!res)
! 182: {
! 183: ret = errno;
! 184: fprintf(stderr, "list-policies request failed: %s\n", strerror(errno));
! 185: return ret;
! 186: }
! 187: if (format & COMMAND_FORMAT_RAW)
! 188: {
! 189: vici_dump(res, "list-policies reply", format & COMMAND_FORMAT_PRETTY, stdout);
! 190: }
! 191: vici_free_res(res);
! 192: return 0;
! 193: }
! 194:
! 195: /**
! 196: * Register the command.
! 197: */
! 198: static void __attribute__ ((constructor))reg()
! 199: {
! 200: command_register((command_t) {
! 201: list_pols, 'P', "list-pols", "list currently installed policies",
! 202: {"[--child <name>] [--trap] [--drop] [--pass] [--raw|--pretty]"},
! 203: {
! 204: {"help", 'h', 0, "show usage information"},
! 205: {"child", 'c', 1, "filter policies by CHILD_SA config name"},
! 206: {"trap", 't', 0, "list trap policies"},
! 207: {"drop", 'd', 0, "list drop policies"},
! 208: {"pass", 'p', 0, "list bypass policies"},
! 209: {"raw", 'r', 0, "dump raw response message"},
! 210: {"pretty", 'P', 0, "dump raw response message in pretty print"},
! 211: }
! 212: });
! 213: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>