2
* iptools.c -- Some useful TCP/IP utils
4
* iptools.c is a part of binkd project
6
* Copyright (C) 1997-1998 Dima Maloff, 5047/13
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published by
10
* the Free Software Foundation; either version 2 of the License, or
11
* (at your option) any later version. See COPYING.
15
* $Id: iptools.c,v 2.0 2001/01/10 12:12:38 gul Exp $
18
* Revision 2.0 2001/01/10 12:12:38 gul
19
* Binkd is under CVS again
21
* Revision 1.3 1998/06/19 05:19:33 mff
22
* changes in get_hostname()
24
* Revision 1.2 1997/10/23 04:01:29 mff
25
* +find_port(), minor changes for Amiga port
27
* Revision 1.1 1997/03/28 06:52:14 mff
37
#if !defined(WIN32) && !defined(DOS)
38
#include <sys/ioctl.h>
47
* Finds ASCIIZ address
49
const char *get_hostname (struct sockaddr_in *addr, char *host, int len)
54
memcpy(&s, addr, sizeof(s));
55
hp = ((backresolv == 0) ? 0 :
56
gethostbyaddr ((char *) &s.sin_addr,
60
strnzcpy (host, hp ? hp->h_name : inet_ntoa (s.sin_addr), len);
66
void copy_hostent(struct hostent *dest, struct hostent *src)
71
memcpy(dest, src, sizeof(struct hostent));
72
for (cp = src->h_addr_list, naddr = 0; cp && *cp; naddr++, cp++);
73
dest->h_addr_list = malloc((naddr+1)*sizeof(dest->h_addr_list[0]));
74
if (dest->h_addr_list)
76
dest->h_addr_list[0] = malloc(naddr*src->h_length);
77
if (dest->h_addr_list[0])
79
for (cp = src->h_addr_list, naddr=0; cp && *cp; cp++, naddr++)
81
dest->h_addr_list[naddr] = dest->h_addr_list[0]+naddr*src->h_length;
82
memcpy(dest->h_addr_list[naddr], *cp, src->h_length);
84
dest->h_addr_list[naddr] = NULL;
91
* Sets non-blocking mode for a given socket
93
void setsockopts (SOCKET s)
97
#if defined(UNIX) || defined(IBMTCPIP) || defined(AMIGA)
101
if (ioctl (s, FIONBIO, (char *) &arg, sizeof arg) < 0)
102
Log (1, "ioctl (FIONBIO): %s", TCPERR ());
108
if (ioctlsocket (s, FIONBIO, &arg) < 0)
109
Log (1, "ioctlsocket (FIONBIO): %s", TCPERR ());
113
#if defined(UNIX) || defined(EMX) || defined(AMIGA)
114
if (fcntl (s, F_SETFL, O_NONBLOCK) == -1)
115
Log (1, "fcntl: %s", strerror (errno));
120
* Find the port number (in the host byte order) by a port number string or
121
* a service name. Find_port ("") will return binkp's port from
122
* /etc/services or even (if there is no binkp entry) 24554.
123
* Returns 0 on error.
125
int find_port (char *s)
127
struct servent *entry = getservbyname (*s ? s : PRTCLNAME, "tcp");
130
return ntohs (entry->s_port);
136
Log (1, "%s: incorrect port", s);