diff src/libident/ident.c @ 0:08114f7dcc23 0.2.21

this is masqmail-0.2.21 from oliver kurth
author meillo@marmaro.de
date Fri, 26 Sep 2008 17:05:23 +0200
parents
children 26e34ae9a3e3
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/libident/ident.c	Fri Sep 26 17:05:23 2008 +0200
@@ -0,0 +1,155 @@
+/*
+** ident.c	High-level calls to the ident lib
+**
+** Author: Pär Emanuelsson <pell@lysator.liu.se>
+** Hacked by: Peter Eriksson <pen@lysator.liu.se>
+*/
+
+#ifdef NeXT3
+#  include <libc.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef HAVE_ANSIHEADERS
+#  include <stdlib.h>
+#  include <string.h>
+#endif
+
+#include <errno.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#define IN_LIBIDENT_SRC
+#include "ident.h"
+
+#include <arpa/inet.h>
+
+
+
+
+/* Do a complete ident query and return result */
+
+IDENT *ident_lookup __P2(int, fd,
+			 int, timeout)
+{
+    struct sockaddr_in localaddr, remoteaddr;
+    int len;
+    
+    len = sizeof(remoteaddr);
+    if (getpeername(fd, (struct sockaddr*) &remoteaddr, &len) < 0)
+	return 0;
+    
+    len = sizeof(localaddr);
+    if (getsockname(fd, (struct sockaddr *) &localaddr, &len) < 0)
+	return 0;
+
+    return ident_query( &localaddr.sin_addr, &remoteaddr.sin_addr,
+		       ntohs(localaddr.sin_port), ntohs(remoteaddr.sin_port),
+		       timeout);
+}
+
+
+IDENT *ident_query __P5(struct in_addr *, laddr,
+			struct in_addr *, raddr,
+			int, lport,
+			int, rport,
+			int, timeout)
+{
+    int res;
+    ident_t *id;
+    struct timeval timout;
+    IDENT *ident=0;
+
+    
+    timout.tv_sec = timeout;
+    timout.tv_usec = 0;
+    
+    if (timeout)
+	id = id_open( laddr, raddr, &timout);
+    else
+	id = id_open( laddr, raddr, (struct timeval *)0);
+    
+    if (!id)
+    {
+	errno = EINVAL;
+	return 0;
+    }
+  
+    if (timeout)
+	res = id_query(id, rport, lport, &timout);
+    else
+	res = id_query(id, rport, lport, (struct timeval *) 0);
+    
+    if (res < 0)
+    {
+	id_close(id);
+	return 0;
+    }
+    
+    ident = (IDENT *) malloc(sizeof(IDENT));
+    if (!ident) {
+	id_close(id);
+	return 0;
+    }
+    
+    if (timeout)
+	res = id_parse(id, &timout,
+		       &ident->lport,
+		       &ident->fport,
+		       &ident->identifier,
+		       &ident->opsys,
+		       &ident->charset);
+    else
+	res = id_parse(id, (struct timeval *) 0,
+		       &ident->lport,
+		       &ident->fport,
+		       &ident->identifier,
+		       &ident->opsys,
+		       &ident->charset);
+    
+    if (res != 1)
+    {
+	free(ident);
+	id_close(id);
+	return 0;
+    }
+    
+    id_close(id);
+    return ident;			/* At last! */
+}
+
+
+char *ident_id __P2(int, fd,
+		    int, timeout)
+{
+    IDENT *ident;
+    char *id=0;
+    
+    ident = ident_lookup(fd, timeout);
+    if (ident && ident->identifier && *ident->identifier)
+    {
+	id = id_strdup(ident->identifier);
+	if (id == NULL)
+	    return NULL;
+    }
+
+    ident_free(ident);
+    return id;
+}
+
+
+void ident_free __P1(IDENT *, id)
+{
+    if (!id)
+	return;
+    if (id->identifier)
+	free(id->identifier);
+    if (id->opsys)
+	free(id->opsys);
+    if (id->charset)
+	free(id->charset);
+    free(id);
+}
+