masqmail

annotate src/libident/ident.h @ 281:ea5f86e0a81c

modes are now enforced exclusive Other MTAs (exim, postfix) are more relaxing, but as combinations of exclusive modes are senseless we behave more obvious if we fail early. This makes understanding the behavior easier too.
author markus schnalke <meillo@marmaro.de>
date Tue, 07 Dec 2010 14:04:56 -0300
parents 08114f7dcc23
children
rev   line source
meillo@0 1 /*
meillo@0 2 ** ident.h
meillo@0 3 **
meillo@0 4 ** Author: Peter Eriksson <pen@lysator.liu.se>
meillo@0 5 ** Intruder: Pär Emanuelsson <pell@lysator.liu.se>
meillo@0 6 */
meillo@0 7
meillo@0 8 #ifndef __IDENT_H__
meillo@0 9 #define __IDENT_H__
meillo@0 10
meillo@10 11 #ifdef __cplusplus
meillo@0 12 extern "C" {
meillo@0 13 #endif
meillo@0 14
meillo@0 15 /* Sigh */
meillo@0 16 #ifdef __STDC__
meillo@0 17 # if __STDC__ == 1
meillo@0 18 # define IS_STDC 1
meillo@0 19 # endif
meillo@0 20 #endif
meillo@0 21
meillo@0 22 #ifdef __P
meillo@0 23 # undef __P
meillo@0 24 #endif
meillo@10 25
meillo@0 26 #ifdef IS_STDC
meillo@10 27 # define __P(AL) AL
meillo@0 28
meillo@0 29 #ifdef IN_LIBIDENT_SRC
meillo@10 30
meillo@0 31 # define __P1(t1,a1) \
meillo@0 32 (t1 a1)
meillo@10 33
meillo@0 34 # define __P2(t1,a1,t2,a2) \
meillo@0 35 (t1 a1, t2 a2)
meillo@10 36
meillo@0 37 # define __P3(t1,a1,t2,a2,t3,a3) \
meillo@0 38 (t1 a1, t2 a2, t3 a3)
meillo@10 39
meillo@0 40 # define __P4(t1,a1,t2,a2,t3,a3,t4,a4) \
meillo@0 41 (t1 a1, t2 a2, t3 a3, t4 a4)
meillo@0 42
meillo@0 43 # define __P5(t1,a1,t2,a2,t3,a3,t4,a4,t5,a5) \
meillo@0 44 (t1 a1, t2 a2, t3 a3, t4 a4, t5 a5)
meillo@0 45
meillo@0 46 # define __P7(t1,a1,t2,a2,t3,a3,t4,a4,t5,a5,t6,a6,t7,a7) \
meillo@0 47 (t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7)
meillo@0 48 #endif
meillo@10 49
meillo@0 50 #else
meillo@0 51
meillo@10 52 # define __P(AL) ()
meillo@0 53
meillo@0 54 #ifdef IN_LIBIDENT_SRC
meillo@10 55
meillo@0 56 # define __P1(t1,a1) (a1) \
meillo@0 57 t1 a1;
meillo@0 58 # define __P2(t1,a1,t2,a2) (a1, a2) \
meillo@0 59 t1 a1; \
meillo@0 60 t2 a2;
meillo@0 61 # define __P3(t1,a1,t2,a2,t3,a3) (a1, a2, a3) \
meillo@0 62 t1 a1; \
meillo@0 63 t2 a2; \
meillo@0 64 t3 a3;
meillo@0 65 # define __P4(t1,a1,t2,a2,t3,a3,t4,a4) (a1, a2, a3, a4) \
meillo@0 66 t1 a1; \
meillo@0 67 t2 a2; \
meillo@0 68 t3 a3; \
meillo@0 69 t4 a4;
meillo@0 70 # define __P5(t1,a1,t2,a2,t3,a3,t4,a4,t5,a5) (a1, a2, a3, a4, a5) \
meillo@0 71 t1 a1; \
meillo@0 72 t2 a2; \
meillo@0 73 t3 a3; \
meillo@0 74 t4 a4; \
meillo@0 75 t5 a5;
meillo@0 76 # define __P7(t1,a1,t2,a2,t3,a3,t4,a4,t5,a5,t6,a6,t7,a7) \
meillo@0 77 (a1, a2, a3, a4, a5, a6, a7) \
meillo@0 78 t1 a1; \
meillo@0 79 t2 a2; \
meillo@0 80 t3 a3; \
meillo@0 81 t4 a4; \
meillo@0 82 t5 a5; \
meillo@0 83 t6 a6; \
meillo@0 84 t7 a7;
meillo@0 85 #endif
meillo@0 86 #endif
meillo@0 87
meillo@0 88 #ifdef IS_STDC
meillo@0 89 # undef IS_STDC
meillo@0 90 #endif
meillo@0 91
meillo@0 92 #ifdef _AIX
meillo@0 93 # include <sys/select.h>
meillo@0 94 #endif
meillo@0 95 #ifdef __sgi
meillo@0 96 # include <bstring.h>
meillo@0 97 #endif
meillo@0 98 #include <sys/types.h>
meillo@0 99 #include <netinet/in.h>
meillo@0 100 #include <sys/time.h>
meillo@0 101
meillo@0 102 #if defined(VMS) && !defined(FD_SETSIZE)
meillo@0 103 # define FD_SETSIZE 64
meillo@0 104 #endif
meillo@0 105
meillo@0 106 /*
meillo@0 107 * Sigh, GCC v2 complains when using undefined struct tags
meillo@0 108 * in function prototypes...
meillo@0 109 */
meillo@0 110 #if defined(__GNUC__) && !defined(INADDR_ANY)
meillo@10 111 # define __STRUCT_IN_ADDR_P void *
meillo@0 112 #else
meillo@10 113 # define __STRUCT_IN_ADDR_P struct in_addr *
meillo@0 114 #endif
meillo@0 115
meillo@0 116 #if defined(__GNUC__) && !defined(DST_NONE)
meillo@10 117 # define __STRUCT_TIMEVAL_P void *
meillo@0 118 #else
meillo@10 119 # define __STRUCT_TIMEVAL_P struct timeval *
meillo@0 120 #endif
meillo@0 121
meillo@0 122 #if defined(__sgi) && defined(_POSIX_SOURCE)
meillo@0 123 # undef __STRUCT_TIMEVAL_P
meillo@10 124 # define __STRUCT_TIMEVAL_P void *
meillo@0 125 #endif
meillo@10 126
meillo@0 127 #ifndef IDBUFSIZE
meillo@0 128 # define IDBUFSIZE 2048
meillo@0 129 #endif
meillo@0 130
meillo@0 131 #ifndef IDPORT
meillo@10 132 # define IDPORT 113
meillo@0 133 #endif
meillo@0 134
meillo@10 135 typedef struct {
meillo@10 136 int fd;
meillo@10 137 char buf[IDBUFSIZE];
meillo@10 138 } ident_t;
meillo@0 139
meillo@10 140 typedef struct {
meillo@10 141 int lport; /* Local port */
meillo@10 142 int fport; /* Far (remote) port */
meillo@10 143 char *identifier; /* Normally user name */
meillo@10 144 char *opsys; /* OS */
meillo@10 145 char *charset; /* Charset (what did you expect?) */
meillo@10 146 } IDENT; /* For higher-level routines */
meillo@0 147
meillo@0 148 /* Low-level calls and macros */
meillo@10 149 #define id_fileno(ID) ((ID)->fd)
meillo@0 150
meillo@10 151 extern ident_t *id_open __P((__STRUCT_IN_ADDR_P laddr, __STRUCT_IN_ADDR_P faddr, __STRUCT_TIMEVAL_P timeout));
meillo@10 152
meillo@10 153 extern int id_close __P((ident_t * id));
meillo@10 154
meillo@10 155 extern int id_query __P((ident_t * id, int lport, int fport, __STRUCT_TIMEVAL_P timeout));
meillo@10 156
meillo@10 157 extern int id_parse __P((ident_t * id, __STRUCT_TIMEVAL_P timeout, int *lport, int *fport, char **identifier, char **opsys, char **charset));
meillo@10 158
meillo@0 159 /* High-level calls */
meillo@0 160
meillo@10 161 extern IDENT *ident_lookup __P((int fd, int timeout));
meillo@0 162
meillo@10 163 extern char *ident_id __P((int fd, int timeout));
meillo@0 164
meillo@10 165 extern IDENT *ident_query __P((__STRUCT_IN_ADDR_P laddr, __STRUCT_IN_ADDR_P raddr, int lport, int rport, int timeout));
meillo@0 166
meillo@10 167 extern void ident_free __P((IDENT * id));
meillo@0 168
meillo@10 169 extern char id_version[];
meillo@0 170
meillo@0 171 #ifdef IN_LIBIDENT_SRC
meillo@0 172
meillo@10 173 extern char *id_strdup __P((char *str));
meillo@10 174 extern char *id_strtok __P((char *cp, char *cs, char *dc));
meillo@0 175
meillo@0 176 #endif
meillo@0 177
meillo@10 178 #ifdef __cplusplus
meillo@0 179 }
meillo@0 180 #endif
meillo@0 181 #endif