summaryrefslogtreecommitdiff
path: root/programs/lwdnsq/lwdnsq.c
diff options
context:
space:
mode:
Diffstat (limited to 'programs/lwdnsq/lwdnsq.c')
-rw-r--r--programs/lwdnsq/lwdnsq.c506
1 files changed, 0 insertions, 506 deletions
diff --git a/programs/lwdnsq/lwdnsq.c b/programs/lwdnsq/lwdnsq.c
deleted file mode 100644
index 2684a7d45..000000000
--- a/programs/lwdnsq/lwdnsq.c
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
- * DNS KEY lookup helper
- * Copyright (C) 2002 Michael Richardson <mcr@freeswan.org>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * for more details.
- */
-
-char tncfg_c_version[] = "RCSID $Id: lwdnsq.c,v 1.1 2004/03/15 20:35:28 as Exp $";
-
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include <freeswan.h>
-
-#include <errno.h>
-#include <getopt.h>
-#include <setjmp.h>
-#include <ctype.h>
-#include <signal.h>
-
-#include <isc/lang.h>
-#include <isc/magic.h>
-#include <isc/types.h>
-#include <isc/result.h>
-#include <isc/mem.h>
-#include <isc/buffer.h>
-#include <isc/region.h>
-#include <dns/name.h>
-#include <dns/rdata.h>
-#include <dns/rdatastruct.h>
-#include <lwres/netdb.h>
-#include <lwres/async.h>
-
-#include "lwdnsq.h"
-
-static void
-usage(char *name)
-{
- fprintf(stdout,"%s --attach --virtual <virtual-device> --physical <physical-device>\n",
- name);
- exit(1);
-}
-
-static struct option const longopts[] =
-{
- {"prompt", 0, 0, 'i'},
- {"serial", 0, 0, 's'},
- {"debug", 0, 0, 'g'},
- {"regress",0, 0, 'X'},
- {"ignoreeof",0, 0, 'Z'},
- {0, 0, 0, 0}
-};
-
-/* globals */
-jmp_buf getMeOut;
-
-void sig_handler(int sig)
-{
- fprintf(stderr, "Caught signal %d, cleaning up and exiting\n", sig);
- longjmp(getMeOut, 1);
-}
-
-void cmdprompt(dnskey_glob *gs)
-{
- if(gs->prompt) {
- printf("lwdnsq> ");
- }
- fflush(gs->cmdproto_out);
-}
-
-void quitprog(dnskey_glob *gs,
- int argc,
- char **argv)
-{
- gs->done=1;
-}
-
-void setdebug(dnskey_glob *gs,
- int argc,
- char **argv)
-{
- if(argc > 1) {
- gs->debug=strtoul(argv[1],NULL,0);
- }
- printf("0 DEBUG is %d\n",gs->debug);
-}
-
-
-int cmdparse(dnskey_glob *gs,
- char *cmdline)
-{
- char *argv[256];
- int argc;
- char *arg;
- static const struct cmd_entry {
- const char *cmdname;
- void (*cmdfunc)(dnskey_glob *, int, char **);
- } cmds[]={
- {"key", lookup_key},
- {"key4", lookup_key4},
- {"key6", lookup_key6},
- {"txt", lookup_txt},
- {"txt4", lookup_txt4},
- {"txt6", lookup_txt6},
- {"ipseckey", lookup_ipseckey},
- {"ipseckey4", lookup_ipseckey4},
- {"ipseckey6", lookup_ipseckey6},
- {"oe4", lookup_oe4},
- {"oe6", lookup_oe6},
- {"vpn4", lookup_key4},
- {"vpn6", lookup_key6},
- {"quit", quitprog},
- {"a", lookup_a},
- {"aaaa", lookup_aaaa},
- {"debug", setdebug},
- {NULL, NULL}};
- const struct cmd_entry *ce = cmds;
-
- argc=0;
-
- /* skip initial spaces */
- while(cmdline && isspace(*cmdline)) {
- cmdline++;
- }
-
- while(cmdline && *cmdline!='\0' &&
- (arg=strsep(&cmdline, " \t\n"))!=NULL) {
- if (argc < sizeof(argv)/sizeof(*argv - 1)) {
- /* ignore arguments that would overflow.
- * XXX should generate a diagnostic.
- */
- argv[argc++]=arg;
- }
- while(cmdline && isspace(*cmdline)) {
- cmdline++;
- }
- }
- argv[argc]=NULL;
-
- if(argc==0 || argv[0][0]=='\0') {
- /* ignore empty line */
- } else if(strcasecmp("help", argv[0]) == 0) {
- fprintf(gs->cmdproto_out, "0 HELP\n");
- for (; ce->cmdname != NULL; ce++)
- fprintf(gs->cmdproto_out, "0 HELP %s\n", ce->cmdname);
- } else {
- for (;; ce++) {
- if (ce->cmdname == NULL) {
- fprintf(gs->cmdproto_out, "0 FATAL unknown command \"%s\"\n", argv[0]);
- break;
- }
- if(strcasecmp(ce->cmdname, argv[0])==0) {
- (*ce->cmdfunc)(gs, argc, argv);
- break;
- }
- }
- }
-
- if (!gs->done)
- cmdprompt(gs);
- return 0;
-}
-
-int cmdread(dnskey_glob *gs,
- char *buf,
- int len)
-{
- unsigned char *nl;
- int cmdlen;
-
- cmdlen=0;
-
- /*
- * have to handle partial reads and multiple commands
- * per read, since this may in fact be a file or a pipe.
- */
- if((gs->cmdloc + len + 1) > sizeof(gs->cmdbuf)) {
- fprintf(stderr, "command '%.*s...' is too long, discarding!\n",
- 40, buf);
- fflush(stdout);
-
- gs->cmdloc=0;
- return 0;
- }
- memcpy(gs->cmdbuf+gs->cmdloc, buf, len);
- gs->cmdloc+=len;
- gs->cmdbuf[gs->cmdloc]='\0';
-
- while((nl = strchr(gs->cmdbuf, '\n')) != NULL) {
- /* found a newline, so turn it into a \0, and process the
- * command, and then we will pull the rest of the buffer
- * up.
- */
- *nl='\0';
- cmdlen= nl - gs->cmdbuf +1;
-
- cmdparse(gs, gs->cmdbuf);
-
- gs->cmdloc -= cmdlen;
- memmove(gs->cmdbuf, gs->cmdbuf+cmdlen, gs->cmdloc);
- }
- return 1;
-}
-
-int
-main(int argc, char *argv[])
-{
- char *program_name;
- dnskey_glob gs;
- int c;
- static int ignoreeof=0; /* static to avoid longjmp clobber */
- int ineof;
-
- memset(&gs, 0, sizeof(dnskey_glob));
-
-#if 0
- printf("PID: %d\n", getpid());
- sleep(60);
-#endif
-
- program_name = argv[0];
- gs.concurrent = 1;
-
- if(lwres_async_init(&gs.lwctx) != ERRSET_SUCCESS) {
- fprintf(stderr, "Can not initialize async context\n");
- exit(3);
- }
-
- if(isc_mem_create(0,0,&gs.iscmem) != ISC_R_SUCCESS) {
- fprintf(stderr, "Can not initialize isc memory allocator\n");
- exit(4);
- }
-
- if(isc_buffer_allocate(gs.iscmem, &gs.iscbuf, LWDNSQ_RESULT_LEN_MAX)) {
- fprintf(stderr, "Can not allocate a result buffer\n");
- exit(5);
- }
-
- while((c = getopt_long_only(argc, argv, "dgsiXZ", longopts, 0)) != EOF) {
- switch(c) {
- case 'd':
- gs.debug+=2;
- break;
-
- case 'g':
- gs.debug++;
- break;
- case 's':
- gs.concurrent=0;
- break;
- case 'i':
- gs.prompt=1;
- break;
- case 'X':
- gs.regress++;
- break;
-
- case 'Z':
- ignoreeof=1;
- break;
-
- default:
- usage(program_name);
- break;
- }
- }
-
- if(gs.debug && ignoreeof) {
- fprintf(stderr, "Ignoring end of file\n");
- }
-
- if(isatty(0)) {
- gs.prompt=1;
- }
-
- /* do various bits of setup */
- if(setjmp(getMeOut)!=0) {
- signal(SIGINT, SIG_DFL);
- signal(SIGPIPE, SIG_IGN);
-
- /* cleanup_crap(); */
-
- exit(1);
- }
-
- if(signal(SIGINT, sig_handler) < 0)
- perror("Setting handler for SIGINT");
-
- if(signal(SIGPIPE, sig_handler) < 0)
- perror("Setting handler for SIGINT");
-
- cmdprompt(&gs);
-
- ineof = 0;
- gs.done = 0;
- gs.cmdproto_out = stdout;
- gs.l_fds[0].events = POLLIN|POLLHUP;
- gs.l_fds[0].fd=0;
-
- gs.l_fds[1].events = POLLIN|POLLHUP|POLLERR;
- gs.l_fds[1].fd = lwres_async_fd(gs.lwctx);
-
- gs.l_nfds= 2;
-
- while(!gs.done)
- {
- int timeout;
- char buf[128];
- int n;
- int rlen;
-
- timeout=-1;
-
- gs.l_fds[0].revents = 0;
-
- gs.l_fds[1].events = POLLIN|POLLHUP|POLLERR;
- gs.l_fds[1].revents = 0;
- gs.l_fds[1].fd = lwres_async_fd(gs.lwctx);
-
- if(gs.debug > 1) {
- fprintf(stderr, "=== invoking poll(,%d,) with %s\n",
- gs.l_nfds,
- timeout>0 ? "waittime" : "no wait");
- for(n = 0; n < gs.l_nfds; n++) {
- fprintf(stderr, "=== waiting on fd#%d\n",
- gs.l_fds[n].fd);
- }
- fprintf(stderr, "=== inflight: %d\n", gs.dns_inflight);
- }
-
- n = poll(gs.l_fds, gs.l_nfds, timeout);
-
- if(n == 0) {
- /* timeout! */
- }
-
- if(n < 0) {
- perror("poll");
- }
-
- if(gs.debug > 1) {
- fprintf(stderr, "=== poll returned with %d\n", n);
- }
-
- while(n>0) {
- if((gs.l_fds[0].revents & POLLERR) == POLLERR ||
- (gs.l_fds[1].revents & POLLERR) == POLLERR)
- {
- break;
- }
-
- /* see if there are DNS events coming back */
- if((gs.l_fds[1].revents & POLLIN) == POLLIN) {
- if(gs.debug > 1) {
- fprintf(stderr,
- "=== new responses from lwdnsd\n");
- }
-
- process_dns_reply(&gs);
- fflush(stdout);
- n--;
- }
-
- if(!ignoreeof &&
- (gs.l_fds[0].revents & POLLHUP) == POLLHUP)
- {
- break;
- }
-
- if((gs.l_fds[0].revents & POLLIN) == POLLIN) {
-
- rlen=read(0, buf, sizeof(buf));
-
- if(gs.debug > 1) {
- if(rlen > 0) {
- buf[rlen]='\0';
- }
- fprintf(stderr,
- "=== new commands on fd 0: %d: %s\n",
- rlen, buf);
- }
-
- if(rlen > 0) {
- cmdread(&gs, buf, rlen);
- } else if(rlen == 0) {
- ineof = 1;
- if(!ignoreeof) {
- /* EOF, die */
- gs.done=1;
- }
- }
- n--;
- }
-
- }
-
- if((gs.l_fds[0].revents & POLLHUP) == POLLHUP)
- {
- ineof = 1;
- if(!ignoreeof)
- {
- gs.done=1;
- }
- }
-
- if(ignoreeof) {
- /* if we have exhausted the input,
- * and there are none in flight,
- * then exit, finally.
- */
- if(ineof) {
- if(gs.dns_inflight == 0) {
- gs.done=1;
- }
- }
- }
-
- if(gs.debug) {
- fprintf(stderr, "=== ineof: %d inflight: %d\n",
- ineof, gs.dns_inflight);
- }
-
- }
-
- signal(SIGINT, SIG_DFL);
- signal(SIGPIPE, SIG_IGN);
-
- exit(0);
-}
-
-/*
- * $Log: lwdnsq.c,v $
- * Revision 1.1 2004/03/15 20:35:28 as
- * added files from freeswan-2.04-x509-1.5.3
- *
- * Revision 1.12 2003/09/16 05:01:14 mcr
- * prefix all debugging with === so that it can be easily removed.
- *
- * Revision 1.11 2003/09/10 04:43:52 mcr
- * final fixes to lwdnsq to exit only when all requests are done,
- * and we have been told to wait, *OR* if there is an EOF in stdin.
- *
- * Revision 1.10 2003/09/03 01:13:24 mcr
- * first attempt at async capable lwdnsq.
- *
- * Revision 1.9 2003/04/02 07:37:57 dhr
- *
- * lwdnsq: fix non-deterministic bug in handling batched input
- *
- * Revision 1.8 2003/02/08 04:03:06 mcr
- * renamed --single to --serial.
- *
- * Revision 1.7 2003/01/14 03:01:14 dhr
- *
- * improve diagnostics; tidy
- *
- * Revision 1.6 2002/12/19 07:29:47 dhr
- *
- * - avoid (improbable) buffer overflow
- * - suppress prompt after "quit" command
- * - add space to prompt to match aesthetics and man page
- * - elminate a magic number
- *
- * Revision 1.5 2002/12/19 07:08:42 dhr
- *
- * continue renaming dnskey => lwdnsq
- *
- * Revision 1.4 2002/12/12 06:03:41 mcr
- * added --regress option to force times to be regular
- *
- * Revision 1.3 2002/11/25 18:37:48 mcr
- * make sure that we exit cleanly upon EOF.
- *
- * Revision 1.2 2002/11/16 02:53:53 mcr
- * lwdnsq - with new contract added.
- *
- * Revision 1.1 2002/10/30 02:25:31 mcr
- * renamed version of files from dnskey/
- *
- * Revision 1.3 2002/10/09 20:14:16 mcr
- * make sure to flush stdout at the right time - do it regardless
- * of whether or not we are printing prompts.
- *
- * Revision 1.2 2002/09/30 18:55:54 mcr
- * skeleton for dnskey helper program.
- *
- * Revision 1.1 2002/09/30 16:50:23 mcr
- * documentation for "dnskey" helper
- *
- * Local variables:
- * c-file-style: "linux"
- * c-basic-offset: 2
- * End:
- *
- */