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
|