From f84dc62cc602eacb0daee3e9918a68b711ba94f0 Mon Sep 17 00:00:00 2001 From: Othmar Gsenger Date: Sat, 8 Dec 2007 20:59:57 +0000 Subject: removed isakmpd --- keyexchange/isakmpd-20041012/ui.c | 528 -------------------------------------- 1 file changed, 528 deletions(-) delete mode 100644 keyexchange/isakmpd-20041012/ui.c (limited to 'keyexchange/isakmpd-20041012/ui.c') diff --git a/keyexchange/isakmpd-20041012/ui.c b/keyexchange/isakmpd-20041012/ui.c deleted file mode 100644 index 7167873..0000000 --- a/keyexchange/isakmpd-20041012/ui.c +++ /dev/null @@ -1,528 +0,0 @@ -/* $OpenBSD: ui.c,v 1.42 2004/08/08 19:11:06 deraadt Exp $ */ -/* $EOM: ui.c,v 1.43 2000/10/05 09:25:12 niklas Exp $ */ - -/* - * Copyright (c) 1998, 1999, 2000 Niklas Hallqvist. All rights reserved. - * Copyright (c) 1999, 2000, 2001, 2002 Håkan Olsson. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * This code was written under funding by Ericsson Radio Systems. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "sysdep.h" - -#include "conf.h" -#include "connection.h" -#include "doi.h" -#include "exchange.h" -#include "init.h" -#include "isakmp.h" -#include "log.h" -#include "monitor.h" -#include "sa.h" -#include "timer.h" -#include "transport.h" -#include "ui.h" -#include "util.h" - -#define BUF_SZ 256 - -/* from isakmpd.c */ -void daemon_shutdown_now(int); - -/* Report all SA configuration information. */ -void ui_report_sa(char *); - -static FILE *ui_open_result(void); - -char *ui_fifo = FIFO; -int ui_socket; -struct event *ui_cr_event = NULL; - -/* Create and open the FIFO used for user control. */ -void -ui_init(void) -{ - struct stat st; - - /* -f- means control messages comes in via stdin. */ - if (strcmp(ui_fifo, "-") == 0) { - ui_socket = 0; - return; - } - - /* Don't overwrite a file, i.e '-f /etc/isakmpd/isakmpd.conf'. */ - if (lstat(ui_fifo, &st) == 0) { - if ((st.st_mode & S_IFMT) == S_IFREG) { - errno = EEXIST; - log_fatal("ui_init: could not create FIFO \"%s\"", - ui_fifo); - } - } - - /* No need to know about errors. */ - unlink(ui_fifo); - if (mkfifo(ui_fifo, 0600) == -1) - log_fatal("ui_init: mkfifo (\"%s\", 0600) failed", ui_fifo); - - ui_socket = open(ui_fifo, O_RDWR | O_NONBLOCK, 0); - if (ui_socket == -1) - log_fatal("ui_init: open (\"%s\", O_RDWR | O_NONBLOCK, 0) " - "failed", ui_fifo); -} - -/* - * Setup a phase 2 connection. - * XXX Maybe phase 1 works too, but teardown won't work then, fix? - */ -static void -ui_connect(char *cmd) -{ - char name[81]; - - if (sscanf(cmd, "c %80s", name) != 1) { - log_print("ui_connect: command \"%s\" malformed", cmd); - return; - } - LOG_DBG((LOG_UI, 10, "ui_connect: setup connection \"%s\"", name)); - connection_setup(name); -} - -/* Tear down a phase 2 connection. */ -static void -ui_teardown(char *cmd) -{ - char name[81]; - struct sa *sa; - - if (sscanf(cmd, "t %80s", name) != 1) { - log_print("ui_teardown: command \"%s\" malformed", cmd); - return; - } - LOG_DBG((LOG_UI, 10, "ui_teardown: teardown connection \"%s\"", name)); - connection_teardown(name); - while ((sa = sa_lookup_by_name(name, 2)) != 0) - sa_delete(sa, 1); -} - -/* Tear down all phase 2 connections. */ -static void -ui_teardown_all(char *cmd) -{ - /* Skip 'cmd' as arg. */ - sa_teardown_all(); -} - -static void -ui_conn_reinit_event(void *v) -{ - /* - * This event is required for isakmpd to reinitialize the connection - * and passive-connection lists. Otherwise a change to the - * "[Phase 2]:Connections" tag will not have any effect. - */ - connection_reinit(); - - ui_cr_event = NULL; -} - -static void -ui_conn_reinit(void) -{ - struct timeval tv; - - if (ui_cr_event) - timer_remove_event(ui_cr_event); - - gettimeofday(&tv, 0); - tv.tv_sec += 5; - - ui_cr_event = timer_add_event("ui_conn_reinit", ui_conn_reinit_event, - 0, &tv); - if (!ui_cr_event) - log_print("ui_conn_reinit: timer_add_event() failed. " - "Connections will not be updated."); -} - -/* - * Call the configuration API. - * XXX Error handling! How to do multi-line transactions? Too short arbitrary - * limit on the parameters? - */ -static void -ui_config(char *cmd) -{ - char subcmd[81], section[81], tag[81], value[81], tmp[81]; - char *v, *nv; - int trans = 0, items, nvlen; - FILE *fd; - - if (sscanf(cmd, "C %80s", subcmd) != 1) - goto fail; - - if (strcasecmp(subcmd, "get") == 0) { - if (sscanf(cmd, "C %*s [%80[^]]]:%80s", section, tag) != 2) - goto fail; - v = conf_get_str(section, tag); - fd = ui_open_result(); - if (fd) { - if (v) - fprintf(fd, "%s\n", v); - fclose(fd); - } - LOG_DBG((LOG_UI, 30, "ui_config: \"%s\"", cmd)); - return; - } - - trans = conf_begin(); - if (strcasecmp(subcmd, "set") == 0) { - items = sscanf(cmd, "C %*s [%80[^]]]:%80[^=]=%80s %80s", - section, tag, value, tmp); - if (!(items == 3 || items == 4)) - goto fail; - conf_set(trans, section, tag, value, items == 4 ? 1 : 0, 0); - if (strcasecmp(section, "Phase 2") == 0 && - (strcasecmp(tag, "Connections") == 0 || - strcasecmp(tag, "Passive-connections") == 0)) - ui_conn_reinit(); - } else if (strcasecmp(subcmd, "add") == 0) { - items = sscanf(cmd, "C %*s [%80[^]]]:%80[^=]=%80s %80s", - section, tag, value, tmp); - if (!(items == 3 || items == 4)) - goto fail; - v = conf_get_str(section, tag); - if (!v) - conf_set(trans, section, tag, value, 1, 0); - else { - /* Add the new value to the end of the 'v' list. */ - nvlen = strlen(v) + strlen(value) + 2; - nv = (char *)malloc(nvlen); - if (!nv) { - log_error("ui_config: malloc(%d) failed", - nvlen); - if (trans) - conf_end(trans, 0); - return; - } - snprintf(nv, nvlen, - v[strlen(v) - 1] == ',' ? "%s%s" : "%s,%s", v, - value); - conf_set(trans, section, tag, nv, 1, 0); - free(nv); - } - if (strcasecmp(section, "Phase 2") == 0 && - (strcasecmp(tag, "Connections") == 0 || - strcasecmp(tag, "Passive-connections") == 0)) - ui_conn_reinit(); - } else if (strcasecmp(subcmd, "rm") == 0) { - if (sscanf(cmd, "C %*s [%80[^]]]:%80s", section, tag) != 2) - goto fail; - conf_remove(trans, section, tag); - } else if (strcasecmp(subcmd, "rms") == 0) { - if (sscanf(cmd, "C %*s [%80[^]]]", section) != 1) - goto fail; - conf_remove_section(trans, section); - } else - goto fail; - - LOG_DBG((LOG_UI, 30, "ui_config: \"%s\"", cmd)); - conf_end(trans, 1); - return; - -fail: - if (trans) - conf_end(trans, 0); - log_print("ui_config: command \"%s\" malformed", cmd); -} - -static void -ui_delete(char *cmd) -{ - char cookies_str[ISAKMP_HDR_COOKIES_LEN * 2 + 1]; - char message_id_str[ISAKMP_HDR_MESSAGE_ID_LEN * 2 + 1]; - u_int8_t cookies[ISAKMP_HDR_COOKIES_LEN]; - u_int8_t message_id_buf[ISAKMP_HDR_MESSAGE_ID_LEN]; - u_int8_t *message_id = message_id_buf; - struct sa *sa; - - if (sscanf(cmd, "d %32s %8s", cookies_str, message_id_str) != 2) { - log_print("ui_delete: command \"%s\" malformed", cmd); - return; - } - if (strcmp(message_id_str, "-") == 0) - message_id = 0; - - if (hex2raw(cookies_str, cookies, ISAKMP_HDR_COOKIES_LEN) == -1 || - (message_id && hex2raw(message_id_str, message_id_buf, - ISAKMP_HDR_MESSAGE_ID_LEN) == -1)) { - log_print("ui_delete: command \"%s\" has bad arguments", cmd); - return; - } - sa = sa_lookup(cookies, message_id); - if (!sa) { - log_print("ui_delete: command \"%s\" found no SA", cmd); - return; - } - LOG_DBG((LOG_UI, 20, - "ui_delete: deleting SA for cookie \"%s\" msgid \"%s\"", - cookies_str, message_id_str)); - sa_delete(sa, 1); -} - -#ifdef USE_DEBUG -/* Parse the debug command found in CMD. */ -static void -ui_debug(char *cmd) -{ - int cls, level; - char subcmd[3]; - - if (sscanf(cmd, "D %d %d", &cls, &level) == 2) { - log_debug_cmd(cls, level); - return; - } else if (sscanf(cmd, "D %2s %d", subcmd, &level) == 2) { - switch (subcmd[0]) { - case 'A': - for (cls = 0; cls < LOG_ENDCLASS; cls++) - log_debug_cmd(cls, level); - return; - } - } else if (sscanf(cmd, "D %2s", subcmd) == 1) { - switch (subcmd[0]) { - case 'T': - log_debug_toggle(); - return; - } - } - log_print("ui_debug: command \"%s\" malformed", cmd); - return; -} - -static void -ui_packetlog(char *cmd) -{ - char subcmd[81]; - - if (sscanf(cmd, "p %80s", subcmd) != 1) - goto fail; - - if (strncasecmp(subcmd, "on=", 3) == 0) { - /* Start capture to a new file. */ - if (subcmd[strlen(subcmd) - 1] == '\n') - subcmd[strlen(subcmd) - 1] = 0; - log_packet_restart(subcmd + 3); - } else if (strcasecmp(subcmd, "on") == 0) - log_packet_restart(NULL); - else if (strcasecmp(subcmd, "off") == 0) - log_packet_stop(); - return; - -fail: - log_print("ui_packetlog: command \"%s\" malformed", cmd); -} -#endif /* USE_DEBUG */ - -static void -ui_shutdown_daemon(char *cmd) -{ - if (strlen(cmd) == 1) { - log_print("ui_shutdown_daemon: received shutdown command"); - daemon_shutdown_now(0); - } else - log_print("ui_shutdown_daemon: command \"%s\" malformed", cmd); -} - -/* Report SAs and ongoing exchanges. */ -void -ui_report(char *cmd) -{ - /* XXX Skip 'cmd' as arg? */ - sa_report(); - exchange_report(); - transport_report(); - connection_report(); - timer_report(); - conf_report(); -} - -/* Report all SA configuration information. */ -void -ui_report_sa(char *cmd) -{ - /* Skip 'cmd' as arg? */ - - FILE *fd = ui_open_result(); - if (!fd) - return; - - sa_report_all(fd); - - fclose(fd); -} - -/* - * Call the relevant command handler based on the first character of the - * line (the command). - */ -static void -ui_handle_command(char *line) -{ - /* Find out what one-letter command was sent. */ - switch (line[0]) { - case 'c': - ui_connect(line); - break; - - case 'C': - ui_config(line); - break; - - case 'd': - ui_delete(line); - break; - -#ifdef USE_DEBUG - case 'D': - ui_debug(line); - break; - - case 'p': - ui_packetlog(line); - break; -#endif - - case 'Q': - ui_shutdown_daemon(line); - break; - - case 'R': - reinit(); - break; - - case 'S': - ui_report_sa(line); - break; - - case 'r': - ui_report(line); - break; - - case 't': - ui_teardown(line); - break; - - case 'T': - ui_teardown_all(line); - break; - - default: - log_print("ui_handle_messages: unrecognized command: '%c'", - line[0]); - } -} - -/* - * A half-complex implementation of reading from a file descriptor - * line by line without resorting to stdio which apparently have - * troubles with non-blocking fifos. - */ -void -ui_handler(void) -{ - static char *buf = 0; - static char *p; - static size_t sz; - static size_t resid; - ssize_t n; - char *new_buf; - - /* If no buffer, set it up. */ - if (!buf) { - sz = BUF_SZ; - buf = malloc(sz); - if (!buf) { - log_print("ui_handler: malloc (%lu) failed", - (unsigned long)sz); - return; - } - p = buf; - resid = sz; - } - /* If no place left in the buffer reallocate twice as large. */ - if (!resid) { - new_buf = realloc(buf, sz * 2); - if (!new_buf) { - log_print("ui_handler: realloc (%p, %lu) failed", buf, - (unsigned long)sz * 2); - free(buf); - buf = 0; - return; - } - buf = new_buf; - p = buf + sz; - resid = sz; - sz *= 2; - } - n = read(ui_socket, p, resid); - if (n == -1) { - log_error("ui_handler: read (%d, %p, %lu)", ui_socket, p, - (unsigned long)resid); - return; - } - if (!n) - return; - resid -= n; - while (n--) { - /* - * When we find a newline, cut off the line and feed it to the - * command processor. Then move the rest up-front. - */ - if (*p == '\n') { - *p = '\0'; - ui_handle_command(buf); - memcpy(buf, p + 1, n); - p = buf; - resid = sz - n; - continue; - } - p++; - } -} - -static FILE * -ui_open_result(void) -{ - FILE *fd = monitor_fopen(RESULT_FILE, "w"); - if (!fd) - log_error("ui_open_result: fopen() failed"); - return fd; -} -- cgit v1.2.3