masqmail-0.2

annotate src/libident/ident.c @ 3:8c55886cacd8

man pages will be maintained in troff now
author meillo@marmaro.de
date Fri, 26 Sep 2008 21:40:10 +0200
parents
children 26e34ae9a3e3
rev   line source
meillo@0 1 /*
meillo@0 2 ** ident.c High-level calls to the ident lib
meillo@0 3 **
meillo@0 4 ** Author: Pär Emanuelsson <pell@lysator.liu.se>
meillo@0 5 ** Hacked by: Peter Eriksson <pen@lysator.liu.se>
meillo@0 6 */
meillo@0 7
meillo@0 8 #ifdef NeXT3
meillo@0 9 # include <libc.h>
meillo@0 10 #endif
meillo@0 11
meillo@0 12 #include <stdio.h>
meillo@0 13
meillo@0 14 #ifdef HAVE_ANSIHEADERS
meillo@0 15 # include <stdlib.h>
meillo@0 16 # include <string.h>
meillo@0 17 #endif
meillo@0 18
meillo@0 19 #include <errno.h>
meillo@0 20
meillo@0 21 #include <sys/types.h>
meillo@0 22 #include <sys/socket.h>
meillo@0 23
meillo@0 24 #define IN_LIBIDENT_SRC
meillo@0 25 #include "ident.h"
meillo@0 26
meillo@0 27 #include <arpa/inet.h>
meillo@0 28
meillo@0 29
meillo@0 30
meillo@0 31
meillo@0 32 /* Do a complete ident query and return result */
meillo@0 33
meillo@0 34 IDENT *ident_lookup __P2(int, fd,
meillo@0 35 int, timeout)
meillo@0 36 {
meillo@0 37 struct sockaddr_in localaddr, remoteaddr;
meillo@0 38 int len;
meillo@0 39
meillo@0 40 len = sizeof(remoteaddr);
meillo@0 41 if (getpeername(fd, (struct sockaddr*) &remoteaddr, &len) < 0)
meillo@0 42 return 0;
meillo@0 43
meillo@0 44 len = sizeof(localaddr);
meillo@0 45 if (getsockname(fd, (struct sockaddr *) &localaddr, &len) < 0)
meillo@0 46 return 0;
meillo@0 47
meillo@0 48 return ident_query( &localaddr.sin_addr, &remoteaddr.sin_addr,
meillo@0 49 ntohs(localaddr.sin_port), ntohs(remoteaddr.sin_port),
meillo@0 50 timeout);
meillo@0 51 }
meillo@0 52
meillo@0 53
meillo@0 54 IDENT *ident_query __P5(struct in_addr *, laddr,
meillo@0 55 struct in_addr *, raddr,
meillo@0 56 int, lport,
meillo@0 57 int, rport,
meillo@0 58 int, timeout)
meillo@0 59 {
meillo@0 60 int res;
meillo@0 61 ident_t *id;
meillo@0 62 struct timeval timout;
meillo@0 63 IDENT *ident=0;
meillo@0 64
meillo@0 65
meillo@0 66 timout.tv_sec = timeout;
meillo@0 67 timout.tv_usec = 0;
meillo@0 68
meillo@0 69 if (timeout)
meillo@0 70 id = id_open( laddr, raddr, &timout);
meillo@0 71 else
meillo@0 72 id = id_open( laddr, raddr, (struct timeval *)0);
meillo@0 73
meillo@0 74 if (!id)
meillo@0 75 {
meillo@0 76 errno = EINVAL;
meillo@0 77 return 0;
meillo@0 78 }
meillo@0 79
meillo@0 80 if (timeout)
meillo@0 81 res = id_query(id, rport, lport, &timout);
meillo@0 82 else
meillo@0 83 res = id_query(id, rport, lport, (struct timeval *) 0);
meillo@0 84
meillo@0 85 if (res < 0)
meillo@0 86 {
meillo@0 87 id_close(id);
meillo@0 88 return 0;
meillo@0 89 }
meillo@0 90
meillo@0 91 ident = (IDENT *) malloc(sizeof(IDENT));
meillo@0 92 if (!ident) {
meillo@0 93 id_close(id);
meillo@0 94 return 0;
meillo@0 95 }
meillo@0 96
meillo@0 97 if (timeout)
meillo@0 98 res = id_parse(id, &timout,
meillo@0 99 &ident->lport,
meillo@0 100 &ident->fport,
meillo@0 101 &ident->identifier,
meillo@0 102 &ident->opsys,
meillo@0 103 &ident->charset);
meillo@0 104 else
meillo@0 105 res = id_parse(id, (struct timeval *) 0,
meillo@0 106 &ident->lport,
meillo@0 107 &ident->fport,
meillo@0 108 &ident->identifier,
meillo@0 109 &ident->opsys,
meillo@0 110 &ident->charset);
meillo@0 111
meillo@0 112 if (res != 1)
meillo@0 113 {
meillo@0 114 free(ident);
meillo@0 115 id_close(id);
meillo@0 116 return 0;
meillo@0 117 }
meillo@0 118
meillo@0 119 id_close(id);
meillo@0 120 return ident; /* At last! */
meillo@0 121 }
meillo@0 122
meillo@0 123
meillo@0 124 char *ident_id __P2(int, fd,
meillo@0 125 int, timeout)
meillo@0 126 {
meillo@0 127 IDENT *ident;
meillo@0 128 char *id=0;
meillo@0 129
meillo@0 130 ident = ident_lookup(fd, timeout);
meillo@0 131 if (ident && ident->identifier && *ident->identifier)
meillo@0 132 {
meillo@0 133 id = id_strdup(ident->identifier);
meillo@0 134 if (id == NULL)
meillo@0 135 return NULL;
meillo@0 136 }
meillo@0 137
meillo@0 138 ident_free(ident);
meillo@0 139 return id;
meillo@0 140 }
meillo@0 141
meillo@0 142
meillo@0 143 void ident_free __P1(IDENT *, id)
meillo@0 144 {
meillo@0 145 if (!id)
meillo@0 146 return;
meillo@0 147 if (id->identifier)
meillo@0 148 free(id->identifier);
meillo@0 149 if (id->opsys)
meillo@0 150 free(id->opsys);
meillo@0 151 if (id->charset)
meillo@0 152 free(id->charset);
meillo@0 153 free(id);
meillo@0 154 }
meillo@0 155