meillo@0: /* meillo@0: ** ident.h meillo@0: ** meillo@0: ** Author: Peter Eriksson meillo@0: ** Intruder: Pär Emanuelsson meillo@0: */ meillo@0: meillo@0: #ifndef __IDENT_H__ meillo@0: #define __IDENT_H__ meillo@0: meillo@10: #ifdef __cplusplus meillo@0: extern "C" { meillo@0: #endif meillo@0: meillo@0: /* Sigh */ meillo@0: #ifdef __STDC__ meillo@0: # if __STDC__ == 1 meillo@0: # define IS_STDC 1 meillo@0: # endif meillo@0: #endif meillo@0: meillo@0: #ifdef __P meillo@0: # undef __P meillo@0: #endif meillo@10: meillo@0: #ifdef IS_STDC meillo@10: # define __P(AL) AL meillo@0: meillo@0: #ifdef IN_LIBIDENT_SRC meillo@10: meillo@0: # define __P1(t1,a1) \ meillo@0: (t1 a1) meillo@10: meillo@0: # define __P2(t1,a1,t2,a2) \ meillo@0: (t1 a1, t2 a2) meillo@10: meillo@0: # define __P3(t1,a1,t2,a2,t3,a3) \ meillo@0: (t1 a1, t2 a2, t3 a3) meillo@10: meillo@0: # define __P4(t1,a1,t2,a2,t3,a3,t4,a4) \ meillo@0: (t1 a1, t2 a2, t3 a3, t4 a4) meillo@0: meillo@0: # define __P5(t1,a1,t2,a2,t3,a3,t4,a4,t5,a5) \ meillo@0: (t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) meillo@0: meillo@0: # define __P7(t1,a1,t2,a2,t3,a3,t4,a4,t5,a5,t6,a6,t7,a7) \ meillo@0: (t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7) meillo@0: #endif meillo@10: meillo@0: #else meillo@0: meillo@10: # define __P(AL) () meillo@0: meillo@0: #ifdef IN_LIBIDENT_SRC meillo@10: meillo@0: # define __P1(t1,a1) (a1) \ meillo@0: t1 a1; meillo@0: # define __P2(t1,a1,t2,a2) (a1, a2) \ meillo@0: t1 a1; \ meillo@0: t2 a2; meillo@0: # define __P3(t1,a1,t2,a2,t3,a3) (a1, a2, a3) \ meillo@0: t1 a1; \ meillo@0: t2 a2; \ meillo@0: t3 a3; meillo@0: # define __P4(t1,a1,t2,a2,t3,a3,t4,a4) (a1, a2, a3, a4) \ meillo@0: t1 a1; \ meillo@0: t2 a2; \ meillo@0: t3 a3; \ meillo@0: t4 a4; meillo@0: # define __P5(t1,a1,t2,a2,t3,a3,t4,a4,t5,a5) (a1, a2, a3, a4, a5) \ meillo@0: t1 a1; \ meillo@0: t2 a2; \ meillo@0: t3 a3; \ meillo@0: t4 a4; \ meillo@0: t5 a5; meillo@0: # define __P7(t1,a1,t2,a2,t3,a3,t4,a4,t5,a5,t6,a6,t7,a7) \ meillo@0: (a1, a2, a3, a4, a5, a6, a7) \ meillo@0: t1 a1; \ meillo@0: t2 a2; \ meillo@0: t3 a3; \ meillo@0: t4 a4; \ meillo@0: t5 a5; \ meillo@0: t6 a6; \ meillo@0: t7 a7; meillo@0: #endif meillo@0: #endif meillo@0: meillo@0: #ifdef IS_STDC meillo@0: # undef IS_STDC meillo@0: #endif meillo@0: meillo@0: #ifdef _AIX meillo@0: # include meillo@0: #endif meillo@0: #ifdef __sgi meillo@0: # include meillo@0: #endif meillo@0: #include meillo@0: #include meillo@0: #include meillo@0: meillo@0: #if defined(VMS) && !defined(FD_SETSIZE) meillo@0: # define FD_SETSIZE 64 meillo@0: #endif meillo@0: meillo@0: /* meillo@0: * Sigh, GCC v2 complains when using undefined struct tags meillo@0: * in function prototypes... meillo@0: */ meillo@0: #if defined(__GNUC__) && !defined(INADDR_ANY) meillo@10: # define __STRUCT_IN_ADDR_P void * meillo@0: #else meillo@10: # define __STRUCT_IN_ADDR_P struct in_addr * meillo@0: #endif meillo@0: meillo@0: #if defined(__GNUC__) && !defined(DST_NONE) meillo@10: # define __STRUCT_TIMEVAL_P void * meillo@0: #else meillo@10: # define __STRUCT_TIMEVAL_P struct timeval * meillo@0: #endif meillo@0: meillo@0: #if defined(__sgi) && defined(_POSIX_SOURCE) meillo@0: # undef __STRUCT_TIMEVAL_P meillo@10: # define __STRUCT_TIMEVAL_P void * meillo@0: #endif meillo@10: meillo@0: #ifndef IDBUFSIZE meillo@0: # define IDBUFSIZE 2048 meillo@0: #endif meillo@0: meillo@0: #ifndef IDPORT meillo@10: # define IDPORT 113 meillo@0: #endif meillo@0: meillo@10: typedef struct { meillo@10: int fd; meillo@10: char buf[IDBUFSIZE]; meillo@10: } ident_t; meillo@0: meillo@10: typedef struct { meillo@10: int lport; /* Local port */ meillo@10: int fport; /* Far (remote) port */ meillo@10: char *identifier; /* Normally user name */ meillo@10: char *opsys; /* OS */ meillo@10: char *charset; /* Charset (what did you expect?) */ meillo@10: } IDENT; /* For higher-level routines */ meillo@0: meillo@0: /* Low-level calls and macros */ meillo@10: #define id_fileno(ID) ((ID)->fd) meillo@0: meillo@10: extern ident_t *id_open __P((__STRUCT_IN_ADDR_P laddr, __STRUCT_IN_ADDR_P faddr, __STRUCT_TIMEVAL_P timeout)); meillo@10: meillo@10: extern int id_close __P((ident_t * id)); meillo@10: meillo@10: extern int id_query __P((ident_t * id, int lport, int fport, __STRUCT_TIMEVAL_P timeout)); meillo@10: meillo@10: extern int id_parse __P((ident_t * id, __STRUCT_TIMEVAL_P timeout, int *lport, int *fport, char **identifier, char **opsys, char **charset)); meillo@10: meillo@0: /* High-level calls */ meillo@0: meillo@10: extern IDENT *ident_lookup __P((int fd, int timeout)); meillo@0: meillo@10: extern char *ident_id __P((int fd, int timeout)); meillo@0: meillo@10: extern IDENT *ident_query __P((__STRUCT_IN_ADDR_P laddr, __STRUCT_IN_ADDR_P raddr, int lport, int rport, int timeout)); meillo@0: meillo@10: extern void ident_free __P((IDENT * id)); meillo@0: meillo@10: extern char id_version[]; meillo@0: meillo@0: #ifdef IN_LIBIDENT_SRC meillo@0: meillo@10: extern char *id_strdup __P((char *str)); meillo@10: extern char *id_strtok __P((char *cp, char *cs, char *dc)); meillo@0: meillo@0: #endif meillo@0: meillo@10: #ifdef __cplusplus meillo@0: } meillo@0: #endif meillo@0: #endif