1 |
/* Copyright (C) 1998,2001, 2002 Free Software Foundation, Inc. |
/* Copyright (C) 1998, 2001, 2002, 2004x Free Software Foundation, Inc. |
2 |
|
|
3 |
This file is part of GNU Inetutils. |
This file is part of GNU Inetutils. |
4 |
|
|
275 |
void |
void |
276 |
telnetd_setup (int fd) |
telnetd_setup (int fd) |
277 |
{ |
{ |
278 |
|
#ifdef IPV6 |
279 |
|
struct sockaddr_storage saddr; |
280 |
|
char buf[256], buf2[256]; /* FIXME: We should use dynamic allocation. */ |
281 |
|
int err; |
282 |
|
#else |
283 |
struct sockaddr_in saddr; |
struct sockaddr_in saddr; |
284 |
|
struct hostent *hp; |
285 |
|
#endif |
286 |
int true = 1; |
int true = 1; |
287 |
socklen_t len; |
socklen_t len; |
|
struct hostent *hp; |
|
288 |
char uname[256]; /*FIXME*/ |
char uname[256]; /*FIXME*/ |
289 |
int level; |
int level; |
290 |
|
|
295 |
exit (1); |
exit (1); |
296 |
} |
} |
297 |
|
|
298 |
syslog (LOG_INFO, "Connect from %s", inet_ntoa (saddr.sin_addr)); |
#ifdef IPV6 |
299 |
|
err = getnameinfo ((struct sockaddr *) &saddr, sizeof (saddr), buf, |
300 |
|
sizeof (buf), NULL, 0, NI_NUMERICHOST); |
301 |
|
if (err) |
302 |
|
{ |
303 |
|
const char *errmsg; |
304 |
|
|
305 |
|
if (err == EAI_SYSTEM) |
306 |
|
errmsg = strerror (errno); |
307 |
|
else |
308 |
|
errmsg = gai_strerror (err); |
309 |
|
|
310 |
|
syslog (LOG_AUTH|LOG_NOTICE, "Cannot get address: %s", errmsg); |
311 |
|
fatal (fd, "Cannot get address."); |
312 |
|
} |
313 |
|
|
314 |
|
/* We use a second buffer so we don't have to call getnameinfo again |
315 |
|
if we need the numeric host below. */ |
316 |
|
err = getnameinfo ((struct sockaddr *) &saddr, sizeof (saddr), buf2, |
317 |
|
sizeof (buf2), NULL, 0, NI_NAMEREQD); |
318 |
|
|
319 |
|
if (reverse_lookup) |
320 |
|
{ |
321 |
|
struct addrinfo *result, *aip; |
322 |
|
|
323 |
|
if (err) |
324 |
|
{ |
325 |
|
const char *errmsg; |
326 |
|
|
327 |
|
if (err == EAI_SYSTEM) |
328 |
|
errmsg = strerror (errno); |
329 |
|
else |
330 |
|
errmsg = gai_strerror (err); |
331 |
|
|
332 |
|
syslog (LOG_AUTH|LOG_NOTICE, "Can't resolve %s: %s", buf, errmsg); |
333 |
|
fatal (fd, "Cannot resolve address."); |
334 |
|
} |
335 |
|
|
336 |
|
remote_hostname = xstrdup (buf2); |
337 |
|
|
338 |
|
err = getaddrinfo (remote_hostname, NULL, NULL, &result); |
339 |
|
if (err) |
340 |
|
{ |
341 |
|
const char *errmsg; |
342 |
|
|
343 |
|
if (err == EAI_SYSTEM) |
344 |
|
errmsg = strerror (errno); |
345 |
|
else |
346 |
|
errmsg = gai_strerror (err); |
347 |
|
|
348 |
|
syslog (LOG_AUTH|LOG_NOTICE, "Forward resolve of %s failed: %s", |
349 |
|
remote_hostname, errmsg); |
350 |
|
fatal (fd, "Cannot resolve address."); |
351 |
|
} |
352 |
|
|
353 |
|
for (aip = result; aip; aip = aip->ai_next) |
354 |
|
if (!memcmp (aip->ai_addr, &saddr, aip->ai_addrlen)) |
355 |
|
break; |
356 |
|
|
357 |
|
if (aip == NULL) |
358 |
|
{ |
359 |
|
syslog (LOG_AUTH|LOG_NOTICE, |
360 |
|
"None of addresses of %s matched %s", |
361 |
|
remote_hostname, |
362 |
|
buf); |
363 |
|
exit (0); |
364 |
|
} |
365 |
|
|
366 |
|
freeaddrinfo (result); |
367 |
|
} |
368 |
|
else |
369 |
|
{ |
370 |
|
if (!err) |
371 |
|
remote_hostname = xstrdup (buf2); |
372 |
|
else |
373 |
|
remote_hostname = xstrdup (buf); |
374 |
|
} |
375 |
|
#else |
376 |
hp = gethostbyaddr ((char*)&saddr.sin_addr.s_addr, |
hp = gethostbyaddr ((char*)&saddr.sin_addr.s_addr, |
377 |
sizeof (saddr.sin_addr.s_addr), AF_INET); |
sizeof (saddr.sin_addr.s_addr), AF_INET); |
378 |
if (reverse_lookup) |
if (reverse_lookup) |
419 |
else |
else |
420 |
remote_hostname = xstrdup (inet_ntoa (saddr.sin_addr)); |
remote_hostname = xstrdup (inet_ntoa (saddr.sin_addr)); |
421 |
} |
} |
422 |
|
#endif |
423 |
|
|
424 |
/* Set socket options */ |
/* Set socket options */ |
425 |
|
|