Annotation of embedaddon/strongswan/src/stroke/stroke.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2007-2015 Tobias Brunner
                      3:  * Copyright (C) 2006 Martin Willi
                      4:  * HSR Hochschule fuer Technik Rapperswil
                      5:  *
                      6:  * This program is free software; you can redistribute it and/or modify it
                      7:  * under the terms of the GNU General Public License as published by the
                      8:  * Free Software Foundation; either version 2 of the License, or (at your
                      9:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                     10:  *
                     11:  * This program is distributed in the hope that it will be useful, but
                     12:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     13:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     14:  * for more details.
                     15:  */
                     16: 
                     17: #include <stdlib.h>
                     18: #include <unistd.h>
                     19: #include <stdio.h>
                     20: #include <stdint.h>
                     21: #include <string.h>
                     22: #include <getopt.h>
                     23: 
                     24: #include <library.h>
                     25: 
                     26: #include "stroke_msg.h"
                     27: #include "stroke_keywords.h"
                     28: 
                     29: struct stroke_token {
                     30:     char *name;
                     31:     stroke_keyword_t kw;
                     32: };
                     33: 
                     34: static char *daemon_name = "charon";
                     35: static int output_verbosity = 1; /* CONTROL */
                     36: 
                     37: static stroke_msg_t *create_stroke_msg(int type)
                     38: {
                     39:        stroke_msg_t *msg;
                     40: 
                     41:        INIT(msg,
                     42:                .type = type,
                     43:                .length = offsetof(stroke_msg_t, buffer),
                     44:        );
                     45:        return msg;
                     46: }
                     47: 
                     48: #define push_string(msg, field, str) \
                     49:        push_string_impl(msg, offsetof(stroke_msg_t, field), str)
                     50: 
                     51: static void push_string_impl(stroke_msg_t **msg, size_t offset, char *string)
                     52: {
                     53:        size_t cur_len = (*msg)->length, str_len;
                     54: 
                     55:        if (!string)
                     56:        {
                     57:                return;
                     58:        }
                     59:        str_len = strlen(string) + 1;
                     60:        if (cur_len + str_len >= UINT16_MAX)
                     61:        {
                     62:                (*msg)->length = UINT16_MAX;
                     63:                return;
                     64:        }
                     65:        while (cur_len + str_len > sizeof(stroke_msg_t) + (*msg)->buflen)
                     66:        {
                     67:                *msg = realloc(*msg, sizeof(stroke_msg_t) + (*msg)->buflen +
                     68:                                           STROKE_BUF_LEN_INC);
                     69:                (*msg)->buflen += STROKE_BUF_LEN_INC;
                     70:        }
                     71:        (*msg)->length += str_len;
                     72:        strcpy((char*)*msg + cur_len, string);
                     73:        *(char**)((char*)*msg + offset) = (char*)cur_len;
                     74: }
                     75: 
                     76: static int send_stroke_msg(stroke_msg_t *msg)
                     77: {
                     78:        stream_t *stream;
                     79:        char *uri, buffer[512], *pass;
                     80:        int count;
                     81: 
                     82:        if (msg->length == UINT16_MAX)
                     83:        {
                     84:                fprintf(stderr, "stroke message exceeds maximum buffer size");
                     85:                free(msg);
                     86:                return -1;
                     87:        }
                     88: 
                     89:        msg->output_verbosity = output_verbosity;
                     90: 
                     91:        uri = lib->settings->get_str(lib->settings, "%s.plugins.stroke.socket",
                     92:                                                                 "unix://" STROKE_SOCKET, daemon_name);
                     93:        stream = lib->streams->connect(lib->streams, uri);
                     94:        if (!stream)
                     95:        {
                     96:                fprintf(stderr, "failed to connect to stroke socket '%s'\n", uri);
                     97:                free(msg);
                     98:                return -1;
                     99:        }
                    100: 
                    101:        if (!stream->write_all(stream, msg, msg->length))
                    102:        {
                    103:                fprintf(stderr, "sending stroke message failed\n");
                    104:                stream->destroy(stream);
                    105:                free(msg);
                    106:                return -1;
                    107:        }
                    108: 
                    109:        while ((count = stream->read(stream, buffer, sizeof(buffer)-1, TRUE)) > 0)
                    110:        {
                    111:                buffer[count] = '\0';
                    112: 
                    113:                /* we prompt if we receive a magic keyword */
                    114:                if ((count >= 12 && streq(buffer + count - 12, "Passphrase:\n")) ||
                    115:                        (count >= 10 && streq(buffer + count - 10, "Password:\n")) ||
                    116:                        (count >=  5 && streq(buffer + count -  5, "PIN:\n")))
                    117:                {
                    118:                        /* remove trailing newline */
                    119:                        pass = strrchr(buffer, '\n');
                    120:                        if (pass)
                    121:                        {
                    122:                                *pass = ' ';
                    123:                        }
                    124: #ifdef HAVE_GETPASS
                    125:                        pass = getpass(buffer);
                    126: #else
                    127:                        pass = "";
                    128: #endif
                    129:                        if (pass)
                    130:                        {
                    131:                                stream->write_all(stream, pass, strlen(pass));
                    132:                                stream->write_all(stream, "\n", 1);
                    133:                        }
                    134:                }
                    135:                else
                    136:                {
                    137:                        printf("%s", buffer);
                    138:                }
                    139:        }
                    140:        if (count < 0)
                    141:        {
                    142:                fprintf(stderr, "reading stroke response failed\n");
                    143:        }
                    144:        stream->destroy(stream);
                    145:        free(msg);
                    146:        return 0;
                    147: }
                    148: 
                    149: static int add_connection(char *name,
                    150:                                                  char *my_id, char *other_id,
                    151:                                                  char *my_addr, char *other_addr,
                    152:                                                  char *my_nets, char *other_nets)
                    153: {
                    154:        stroke_msg_t *msg;
                    155: 
                    156:        msg = create_stroke_msg(STR_ADD_CONN);
                    157: 
                    158:        push_string(&msg, add_conn.name, name);
                    159:        msg->add_conn.version = 2;
                    160:        msg->add_conn.mode = 1;
                    161:        msg->add_conn.mobike = 1;
                    162:        msg->add_conn.dpd.action = 1;
                    163:        msg->add_conn.install_policy = 1;
                    164: 
                    165:        push_string(&msg, add_conn.me.id, my_id);
                    166:        push_string(&msg, add_conn.me.address, my_addr);
                    167:        msg->add_conn.me.ikeport = 500;
                    168:        push_string(&msg, add_conn.me.subnets, my_nets);
                    169:        msg->add_conn.me.sendcert = 1;
                    170:        msg->add_conn.me.to_port = 65535;
                    171: 
                    172:        push_string(&msg, add_conn.other.id, other_id);
                    173:        push_string(&msg, add_conn.other.address, other_addr);
                    174:        msg->add_conn.other.ikeport = 500;
                    175:        push_string(&msg, add_conn.other.subnets, other_nets);
                    176:        msg->add_conn.other.sendcert = 1;
                    177:        msg->add_conn.other.to_port = 65535;
                    178: 
                    179:        return send_stroke_msg(msg);
                    180: }
                    181: 
                    182: static int del_connection(char *name)
                    183: {
                    184:        stroke_msg_t *msg;
                    185: 
                    186:        msg = create_stroke_msg(STR_DEL_CONN);
                    187:        push_string(&msg, initiate.name, name);
                    188:        return send_stroke_msg(msg);
                    189: }
                    190: 
                    191: static int initiate_connection(char *name)
                    192: {
                    193:        stroke_msg_t *msg;
                    194: 
                    195:        msg = create_stroke_msg(STR_INITIATE);
                    196:        push_string(&msg, initiate.name, name);
                    197:        return send_stroke_msg(msg);
                    198: }
                    199: 
                    200: static int terminate_connection(char *name)
                    201: {
                    202:        stroke_msg_t *msg;
                    203: 
                    204:        msg = create_stroke_msg(STR_TERMINATE);
                    205:        push_string(&msg, initiate.name, name);
                    206:        return send_stroke_msg(msg);
                    207: }
                    208: 
                    209: static int terminate_connection_srcip(char *start, char *end)
                    210: {
                    211:        stroke_msg_t *msg;
                    212: 
                    213:        msg = create_stroke_msg(STR_TERMINATE_SRCIP);
                    214:        push_string(&msg, terminate_srcip.start, start);
                    215:        push_string(&msg, terminate_srcip.end, end);
                    216:        return send_stroke_msg(msg);
                    217: }
                    218: 
                    219: static int rekey_connection(char *name)
                    220: {
                    221:        stroke_msg_t *msg;
                    222: 
                    223:        msg = create_stroke_msg(STR_REKEY);
                    224:        push_string(&msg, rekey.name, name);
                    225:        return send_stroke_msg(msg);
                    226: }
                    227: 
                    228: static int route_connection(char *name)
                    229: {
                    230:        stroke_msg_t *msg;
                    231: 
                    232:        msg = create_stroke_msg(STR_ROUTE);
                    233:        push_string(&msg, route.name, name);
                    234:        return send_stroke_msg(msg);
                    235: }
                    236: 
                    237: static int unroute_connection(char *name)
                    238: {
                    239:        stroke_msg_t *msg;
                    240: 
                    241:        msg = create_stroke_msg(STR_UNROUTE);
                    242:        push_string(&msg, unroute.name, name);
                    243:        return send_stroke_msg(msg);
                    244: }
                    245: 
                    246: static int show_status(stroke_keyword_t kw, char *connection)
                    247: {
                    248:        stroke_msg_t *msg;
                    249: 
                    250:        switch (kw)
                    251:        {
                    252:                case STROKE_STATUSALL:
                    253:                        msg = create_stroke_msg(STR_STATUS_ALL);
                    254:                        break;
                    255:                case STROKE_STATUSALL_NOBLK:
                    256:                        msg = create_stroke_msg(STR_STATUS_ALL_NOBLK);
                    257:                        break;
                    258:                default:
                    259:                        msg = create_stroke_msg(STR_STATUS);
                    260:                        break;
                    261:        }
                    262:        push_string(&msg, status.name, connection);
                    263:        return send_stroke_msg(msg);
                    264: }
                    265: 
                    266: static int list_flags[] = {
                    267:        LIST_PUBKEYS,
                    268:        LIST_CERTS,
                    269:        LIST_CACERTS,
                    270:        LIST_OCSPCERTS,
                    271:        LIST_AACERTS,
                    272:        LIST_ACERTS,
                    273:        LIST_GROUPS,
                    274:        LIST_CAINFOS,
                    275:        LIST_CRLS,
                    276:        LIST_OCSP,
                    277:        LIST_ALGS,
                    278:        LIST_PLUGINS,
                    279:        LIST_ALL
                    280: };
                    281: 
                    282: static int list(stroke_keyword_t kw, bool utc)
                    283: {
                    284:        stroke_msg_t *msg;
                    285: 
                    286:        msg = create_stroke_msg(STR_LIST);
                    287:        msg->list.utc = utc;
                    288:        msg->list.flags = list_flags[kw - STROKE_LIST_FIRST];
                    289:        return send_stroke_msg(msg);
                    290: }
                    291: 
                    292: static int reread_flags[] = {
                    293:        REREAD_SECRETS,
                    294:        REREAD_CACERTS,
                    295:        REREAD_OCSPCERTS,
                    296:        REREAD_AACERTS,
                    297:        REREAD_ACERTS,
                    298:        REREAD_CRLS,
                    299:        REREAD_ALL
                    300: };
                    301: 
                    302: static int reread(stroke_keyword_t kw)
                    303: {
                    304:        stroke_msg_t *msg;
                    305: 
                    306:        msg = create_stroke_msg(STR_REREAD);
                    307:        msg->reread.flags = reread_flags[kw - STROKE_REREAD_FIRST];
                    308:        return send_stroke_msg(msg);
                    309: }
                    310: 
                    311: static int purge_flags[] = {
                    312:        PURGE_OCSP,
                    313:        PURGE_CRLS,
                    314:        PURGE_CERTS,
                    315:        PURGE_IKE,
                    316: };
                    317: 
                    318: static int purge(stroke_keyword_t kw)
                    319: {
                    320:        stroke_msg_t *msg;
                    321: 
                    322:        msg = create_stroke_msg(STR_PURGE);
                    323:        msg->purge.flags = purge_flags[kw - STROKE_PURGE_FIRST];
                    324:        return send_stroke_msg(msg);
                    325: }
                    326: 
                    327: static int export_flags[] = {
                    328:        EXPORT_X509,
                    329:        EXPORT_CONN_CERT,
                    330:        EXPORT_CONN_CHAIN,
                    331: };
                    332: 
                    333: static int export(stroke_keyword_t kw, char *selector)
                    334: {
                    335:        stroke_msg_t *msg;
                    336: 
                    337:        msg = create_stroke_msg(STR_EXPORT);
                    338:        push_string(&msg, export.selector, selector);
                    339:        msg->export.flags = export_flags[kw - STROKE_EXPORT_FIRST];
                    340:        return send_stroke_msg(msg);
                    341: }
                    342: 
                    343: static int leases(stroke_keyword_t kw, char *pool, char *address)
                    344: {
                    345:        stroke_msg_t *msg;
                    346: 
                    347:        msg = create_stroke_msg(STR_LEASES);
                    348:        push_string(&msg, leases.pool, pool);
                    349:        push_string(&msg, leases.address, address);
                    350:        return send_stroke_msg(msg);
                    351: }
                    352: 
                    353: static int memusage()
                    354: {
                    355:        stroke_msg_t *msg;
                    356: 
                    357:        msg = create_stroke_msg(STR_MEMUSAGE);
                    358:        return send_stroke_msg(msg);
                    359: }
                    360: 
                    361: static int user_credentials(char *name, char *user, char *pass)
                    362: {
                    363:        stroke_msg_t *msg;
                    364: 
                    365:        msg = create_stroke_msg(STR_USER_CREDS);
                    366:        push_string(&msg, user_creds.name, name);
                    367:        push_string(&msg, user_creds.username, user);
                    368:        push_string(&msg, user_creds.password, pass);
                    369:        return send_stroke_msg(msg);
                    370: }
                    371: 
                    372: static int counters(int reset, char *name)
                    373: {
                    374:        stroke_msg_t *msg;
                    375: 
                    376:        msg = create_stroke_msg(STR_COUNTERS);
                    377:        push_string(&msg, counters.name, name);
                    378:        msg->counters.reset = reset;
                    379:        return send_stroke_msg(msg);
                    380: }
                    381: 
                    382: static int set_loglevel(char *type, u_int level)
                    383: {
                    384:        stroke_msg_t *msg;
                    385: 
                    386:        msg = create_stroke_msg(STR_LOGLEVEL);
                    387:        push_string(&msg, loglevel.type, type);
                    388:        msg->loglevel.level = level;
                    389:        return send_stroke_msg(msg);
                    390: }
                    391: 
                    392: static int usage(char *error)
                    393: {
                    394:        FILE *out = error ? stderr : stdout;
                    395: 
                    396:        fprintf(out, "stroke [OPTIONS] command [ARGUMENTS]\n\n");
                    397:        fprintf(out, "Options:\n");
                    398:        fprintf(out, "  -h, --help             print this information.\n");
                    399:        fprintf(out, "  -d, --daemon=NAME      name of the daemon.\n");
                    400:        fprintf(out, "Commands:\n");
                    401:        fprintf(out, "  Add a connection:\n");
                    402:        fprintf(out, "    stroke add NAME MY_ID OTHER_ID MY_ADDR OTHER_ADDR\\\n");
                    403:        fprintf(out, "           MY_NET OTHER_NET\n");
                    404:        fprintf(out, "    where: ID is any IKEv2 ID \n");
                    405:        fprintf(out, "           ADDR is a IPv4 address\n");
                    406:        fprintf(out, "           NET is a IPv4 subnet in CIDR notation\n");
                    407:        fprintf(out, "  Delete a connection:\n");
                    408:        fprintf(out, "    stroke delete NAME\n");
                    409:        fprintf(out, "    where: NAME is a connection name added with \"stroke add\"\n");
                    410:        fprintf(out, "  Initiate a connection:\n");
                    411:        fprintf(out, "    stroke up NAME\n");
                    412:        fprintf(out, "    where: NAME is a connection name added with \"stroke add\"\n");
                    413:        fprintf(out, "  Initiate a connection without blocking:\n");
                    414:        fprintf(out, "    stroke up-nb NAME\n");
                    415:        fprintf(out, "    where: NAME is a connection name added with \"stroke add\"\n");
                    416:        fprintf(out, "  Terminate a connection:\n");
                    417:        fprintf(out, "    stroke down NAME\n");
                    418:        fprintf(out, "    where: NAME is a connection name added with \"stroke add\"\n");
                    419:        fprintf(out, "  Terminate a connection without blocking:\n");
                    420:        fprintf(out, "    stroke down-nb NAME\n");
                    421:        fprintf(out, "    where: NAME is a connection name added with \"stroke add\"\n");
                    422:        fprintf(out, "  Terminate a connection by remote srcip:\n");
                    423:        fprintf(out, "    stroke down-srcip START [END]\n");
                    424:        fprintf(out, "    where: START and optional END define the clients source IP\n");
                    425:        fprintf(out, "  Set loglevel for a logging type:\n");
                    426:        fprintf(out, "    stroke loglevel TYPE LEVEL\n");
                    427:        fprintf(out, "    where: TYPE is any|dmn|mgr|ike|chd|job|cfg|knl|net|asn|enc|tnc|imc|imv|pts|tls|esp|lib\n");
                    428:        fprintf(out, "           LEVEL is -1|0|1|2|3|4\n");
                    429:        fprintf(out, "  Show connection status:\n");
                    430:        fprintf(out, "    stroke status\n");
                    431:        fprintf(out, "  Show extended status information:\n");
                    432:        fprintf(out, "    stroke statusall\n");
                    433:        fprintf(out, "  Show extended status information without blocking:\n");
                    434:        fprintf(out, "    stroke statusall-nb\n");
                    435:        fprintf(out, "  Show list of authority and attribute certificates:\n");
                    436:        fprintf(out, "    stroke listcacerts|listocspcerts|listaacerts|listacerts [--utc]\n");
                    437:        fprintf(out, "  Show list of end entity certificates, ca info records  and crls:\n");
                    438:        fprintf(out, "    stroke listcerts|listcainfos|listcrls|listall [--utc]\n");
                    439:        fprintf(out, "  Show list of supported algorithms:\n");
                    440:        fprintf(out, "    stroke listalgs\n");
                    441:        fprintf(out, "  Reload authority and attribute certificates:\n");
                    442:        fprintf(out, "    stroke rereadcacerts|rereadocspcerts|rereadaacerts|rereadacerts\n");
                    443:        fprintf(out, "  Reload secrets and crls:\n");
                    444:        fprintf(out, "    stroke rereadsecrets|rereadcrls|rereadall\n");
                    445:        fprintf(out, "  Purge ocsp cache entries:\n");
                    446:        fprintf(out, "    stroke purgeocsp\n");
                    447:        fprintf(out, "  Purge CRL cache entries:\n");
                    448:        fprintf(out, "    stroke purgecrls\n");
                    449:        fprintf(out, "  Purge X509 cache entries:\n");
                    450:        fprintf(out, "    stroke purgecerts\n");
                    451:        fprintf(out, "  Purge IKE_SAs without a CHILD_SA:\n");
                    452:        fprintf(out, "    stroke purgeike\n");
                    453:        fprintf(out, "  Export credentials to the console:\n");
                    454:        fprintf(out, "    stroke exportx509 DN\n");
                    455:        fprintf(out, "    stroke exportconncert connname\n");
                    456:        fprintf(out, "    stroke exportconnchain connname\n");
                    457:        fprintf(out, "  Show current memory usage:\n");
                    458:        fprintf(out, "    stroke memusage\n");
                    459:        fprintf(out, "  Show leases of a pool:\n");
                    460:        fprintf(out, "    stroke leases [POOL [ADDRESS]]\n");
                    461:        fprintf(out, "  Set username and password for a connection:\n");
                    462:        fprintf(out, "    stroke user-creds NAME USERNAME [PASSWORD]\n");
                    463:        fprintf(out, "    where: NAME is a connection name added with \"stroke add\"\n");
                    464:        fprintf(out, "           USERNAME is the username\n");
                    465:        fprintf(out, "           PASSWORD is the optional password, you'll be asked to enter it if not given\n");
                    466:        fprintf(out, "  Show IKE counters:\n");
                    467:        fprintf(out, "    stroke listcounters [connection-name]\n");
                    468: 
                    469:        if (error)
                    470:        {
                    471:                fprintf(out, "\nError: %s\n", error);
                    472:                return -1;
                    473:        }
                    474:        return 0;
                    475: }
                    476: 
                    477: int main(int argc, char *argv[])
                    478: {
                    479:        const stroke_token_t *token;
                    480:        char *cmd;
                    481:        bool utc = FALSE;
                    482:        int res = 0;
                    483: 
                    484:        library_init(NULL, "stroke");
                    485:        atexit(library_deinit);
                    486: 
                    487:        while (true)
                    488:        {
                    489:                struct option long_opts[] = {
                    490:                        {"help",                no_argument,            NULL,   'h' },
                    491:                        {"utc",                 no_argument,            NULL,   'u' },
                    492:                        {"daemon",              required_argument,      NULL,   'd' },
                    493:                        {0,0,0,0},
                    494:                };
                    495:                switch (getopt_long(argc, argv, "hd:", long_opts, NULL))
                    496:                {
                    497:                        case EOF:
                    498:                                break;
                    499:                        case 'h':
                    500:                                return usage(NULL);
                    501:                        case 'd':
                    502:                                daemon_name = optarg;
                    503:                                continue;
                    504:                        case 'u':
                    505:                                utc = TRUE;
                    506:                                continue;
                    507:                        default:
                    508:                                return usage("invalid option");
                    509:                }
                    510:                break;
                    511:        }
                    512: 
                    513:        if (optind == argc)
                    514:        {
                    515:                return usage("command missing");
                    516:        }
                    517: 
                    518:        cmd = argv[optind++];
                    519:        token = in_word_set(cmd, strlen(cmd));
                    520:        if (token == NULL)
                    521:        {
                    522:                return usage("unknown command");
                    523:        }
                    524: 
                    525:        /* make argv/argc only cover positional arguments */
                    526:        argv = &argv[optind];
                    527:        argc = argc - optind;
                    528: 
                    529:        switch (token->kw)
                    530:        {
                    531:                case STROKE_ADD:
                    532:                        if (argc < 7)
                    533:                        {
                    534:                                return usage("\"add\" needs more arguments...");
                    535:                        }
                    536:                        res = add_connection(argv[0], argv[1], argv[2], argv[3], argv[4],
                    537:                                                                 argv[5], argv[6]);
                    538:                        break;
                    539:                case STROKE_DELETE:
                    540:                case STROKE_DEL:
                    541:                        if (argc < 1)
                    542:                        {
                    543:                                return usage("\"delete\" needs a connection name");
                    544:                        }
                    545:                        res = del_connection(argv[0]);
                    546:                        break;
                    547:                case STROKE_UP_NOBLK:
                    548:                        output_verbosity = -1;
                    549:                        /* fall-through */
                    550:                case STROKE_UP:
                    551:                        if (argc < 1)
                    552:                        {
                    553:                                return usage("\"up\" needs a connection name");
                    554:                        }
                    555:                        res = initiate_connection(argv[0]);
                    556:                        break;
                    557:                case STROKE_DOWN_NOBLK:
                    558:                        output_verbosity = -1;
                    559:                        /* fall-through */
                    560:                case STROKE_DOWN:
                    561:                        if (argc < 1)
                    562:                        {
                    563:                                return usage("\"down\" needs a connection name");
                    564:                        }
                    565:                        res = terminate_connection(argv[0]);
                    566:                        break;
                    567:                case STROKE_DOWN_SRCIP:
                    568:                        if (argc < 1)
                    569:                        {
                    570:                                return usage("\"down-srcip\" needs start and optional end address");
                    571:                        }
                    572:                        res = terminate_connection_srcip(argv[0], argc > 1 ? argv[1] : NULL);
                    573:                        break;
                    574:                case STROKE_REKEY:
                    575:                        if (argc < 1)
                    576:                        {
                    577:                                return usage("\"rekey\" needs a connection name");
                    578:                        }
                    579:                        res = rekey_connection(argv[0]);
                    580:                        break;
                    581:                case STROKE_ROUTE:
                    582:                        if (argc < 1)
                    583:                        {
                    584:                                return usage("\"route\" needs a connection name");
                    585:                        }
                    586:                        res = route_connection(argv[0]);
                    587:                        break;
                    588:                case STROKE_UNROUTE:
                    589:                        if (argc < 1)
                    590:                        {
                    591:                                return usage("\"unroute\" needs a connection name");
                    592:                        }
                    593:                        res = unroute_connection(argv[0]);
                    594:                        break;
                    595:                case STROKE_LOGLEVEL:
                    596:                        if (argc < 2)
                    597:                        {
                    598:                                return usage("\"logtype\" needs more parameters...");
                    599:                        }
                    600:                        res = set_loglevel(argv[0], atoi(argv[1]));
                    601:                        break;
                    602:                case STROKE_STATUS:
                    603:                case STROKE_STATUSALL:
                    604:                case STROKE_STATUSALL_NOBLK:
                    605:                        res = show_status(token->kw, argc ? argv[0] : NULL);
                    606:                        break;
                    607:                case STROKE_LIST_PUBKEYS:
                    608:                case STROKE_LIST_CERTS:
                    609:                case STROKE_LIST_CACERTS:
                    610:                case STROKE_LIST_OCSPCERTS:
                    611:                case STROKE_LIST_AACERTS:
                    612:                case STROKE_LIST_ACERTS:
                    613:                case STROKE_LIST_CAINFOS:
                    614:                case STROKE_LIST_CRLS:
                    615:                case STROKE_LIST_OCSP:
                    616:                case STROKE_LIST_ALGS:
                    617:                case STROKE_LIST_PLUGINS:
                    618:                case STROKE_LIST_ALL:
                    619:                        res = list(token->kw, utc);
                    620:                        break;
                    621:                case STROKE_REREAD_SECRETS:
                    622:                case STROKE_REREAD_CACERTS:
                    623:                case STROKE_REREAD_OCSPCERTS:
                    624:                case STROKE_REREAD_AACERTS:
                    625:                case STROKE_REREAD_ACERTS:
                    626:                case STROKE_REREAD_CRLS:
                    627:                case STROKE_REREAD_ALL:
                    628:                        res = reread(token->kw);
                    629:                        break;
                    630:                case STROKE_PURGE_OCSP:
                    631:                case STROKE_PURGE_CRLS:
                    632:                case STROKE_PURGE_CERTS:
                    633:                case STROKE_PURGE_IKE:
                    634:                        res = purge(token->kw);
                    635:                        break;
                    636:                case STROKE_EXPORT_X509:
                    637:                case STROKE_EXPORT_CONN_CERT:
                    638:                case STROKE_EXPORT_CONN_CHAIN:
                    639:                        if (argc < 1)
                    640:                        {
                    641:                                return usage("\"export\" needs a name");
                    642:                        }
                    643:                        res = export(token->kw, argv[0]);
                    644:                        break;
                    645:                case STROKE_LEASES:
                    646:                        res = leases(token->kw, argc ? argv[0] : NULL,
                    647:                                                 argc > 1 ? argv[1] : NULL);
                    648:                        break;
                    649:                case STROKE_MEMUSAGE:
                    650:                        res = memusage();
                    651:                        break;
                    652:                case STROKE_USER_CREDS:
                    653:                        if (argc < 2)
                    654:                        {
                    655:                                return usage("\"user-creds\" needs a connection name, "
                    656:                                                   "username and optionally a password");
                    657:                        }
                    658:                        res = user_credentials(argv[0], argv[1], argc > 2 ? argv[2] : NULL);
                    659:                        break;
                    660:                case STROKE_COUNTERS:
                    661:                case STROKE_COUNTERS_RESET:
                    662:                        res = counters(token->kw == STROKE_COUNTERS_RESET,
                    663:                                                   argc ? argv[0] : NULL);
                    664:                        break;
                    665:                default:
                    666:                        return usage(NULL);
                    667:        }
                    668:        return res;
                    669: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>