summaryrefslogtreecommitdiff
path: root/programs/pluto/adns.h
blob: 00fc4ad079e01464b6b39242c8efc73f0428d5d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/* Pluto Asynchronous DNS Helper Program's Header
 * Copyright (C) 2002  D. Hugh Redelmeier.
 *
 * 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.
 *
 * RCSID $Id: adns.h,v 1.1 2004/03/15 20:35:28 as Exp $
 */

#ifndef USE_LWRES	/* whole file! */

/* The interface in RHL6.x and BIND distribution 8.2.2 are different,
 * so we build some of our own :-(
 */

# ifndef NS_MAXDNAME
#   define NS_MAXDNAME MAXDNAME /* I hope this is long enough for IPv6 */
# endif

# ifndef NS_PACKETSZ
#   define NS_PACKETSZ PACKETSZ
# endif

/* protocol version */

#define ADNS_Q_MAGIC (((((('d' << 8) + 'n') << 8) + 's') << 8) + 4)
#define ADNS_A_MAGIC (((((('d' << 8) + 'n') << 8) + 's') << 8) + 128 + 4)

/* note: both struct adns_query and struct adns_answer must start with
 * size_t len;
 */

struct adns_query {
    size_t len;
    unsigned int qmagic;
    unsigned long serial;
    lset_t debugging;	/* only used #ifdef DEBUG, but don't want layout to change */
    u_char name_buf[NS_MAXDNAME + 2];
    int type;	/* T_KEY or T_TXT */
};

struct adns_answer {
    size_t len;
    unsigned int amagic;
    unsigned long serial;
    struct adns_continuation *continuation;
    int result;
    int h_errno_val;
    u_char ans[NS_PACKETSZ * 10];   /* very probably bigger than necessary */
};

enum helper_exit_status {
    HES_CONTINUE = -1,	/* not an exit */
    HES_OK = 0,	/* all's well that ends well (perhaps EOF) */
    HES_INVOCATION,	/* improper invocation */
    HES_IO_ERROR_SELECT,	/* IO error in select() */
    HES_MALLOC,	/* malloc failed */
    HES_IO_ERROR_IN,	/* error reading pipe */
    HES_IO_ERROR_OUT,	/* error reading pipe */
    HES_PIPE,	/* pipe(2) failed */
    HES_SYNC,	/* answer from worker doesn't match query */
    HES_FORK,	/* fork(2) failed */
    HES_RES_INIT,	/* resolver initialization failed */
    HES_BAD_LEN,	/* implausible .len field */
    HES_BAD_MAGIC,	/* .magic field wrong */
};

#endif /* !USE_LWRES */