ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libukcprog/src/ip.c
Revision: 1.1
Committed: Sat Mar 29 16:30:33 2003 UTC (21 years, 1 month ago) by tdb
Content type: text/plain
Branch: MAIN
CVS Tags: LIBUKCPROG_1_0_2, LIBUKCPROG_1_0_1, LIBUKCPROG_1_0
Log Message:
libukcprog is now a seperate package. I doubt this will be much use to
anyone other than us, but I see no reason why we can't package it up
and distribute it. Obviously we can't attach the GPL to this, as we
don't own it.

File Contents

# Content
1 /* ip.c - map hostnames */
2
3 /* Copyright 1992 Mark Russell, University of Kent at Canterbury.
4 *
5 * You can do what you like with this source code as long as
6 * you don't try to make money out of it and you include an
7 * unaltered copy of this message (including the copyright).
8 */
9
10 char ukcprog_ip_sccsid[] = "$Id: ip.c,v 1.7 1995/12/20 15:31:00 mtr Exp $ UKC";
11
12 #undef _POSIX_SOURCE
13
14 #ifndef MSDOS
15 #include <sys/types.h>
16 #else
17 #include <sys/tk_types.h>
18 #endif
19 #include <sys/socket.h>
20 #include <netinet/in.h>
21 #include <netdb.h>
22
23 #include <stdlib.h>
24 #include <string.h>
25 #include <stdio.h>
26
27 #include "ukcprog.h"
28
29 /* Map a hostname to an IP address. The address is returned in network
30 * byte order. Return 0 for success, -1 and an error message on failure.
31 *
32 * If the hostname looks like an IP quad we convert that to an IP address.
33 */
34 int
35 get_host_addr(hostname, p_addr)
36 const char *hostname;
37 struct in_addr *p_addr;
38 {
39 struct hostent *h;
40 int b3, b2, b1, b0;
41 char c;
42
43 if (sscanf(hostname, "%d.%d.%d.%d%c", &b3, &b2, &b1, &b0, &c) == 4) {
44 unsigned long val;
45
46 val = (b3 << 24) | (b2 << 16) | (b1 << 8) | b0;
47 p_addr->s_addr = htonl(val);
48 return 0;
49 }
50
51 if ((h = gethostbyname(hostname)) == NULL) {
52 errf("Can't find address of %s", hostname);
53 return -1;
54 }
55
56 if (h->h_addrtype != AF_INET) {
57 errf("%s has non-IP address (addrtype=%d)",
58 hostname, h->h_addrtype);
59 return -1;
60 }
61
62 memcpy((char *)p_addr, (char *)h->h_addr_list[0], sizeof(*p_addr));
63 return 0;
64 }
65
66 /* Map a service name to a port number in network byte order.
67 * If the service name looks like a number we return that.
68 */
69 int
70 get_service_port(servname, p_port)
71 const char *servname;
72 int *p_port;
73 {
74 struct servent *sp;
75 char *endstr;
76 unsigned short hport;
77
78 hport = strtol(servname, &endstr, 0);
79 if (endstr != servname && *endstr == '\0') {
80 *p_port = htons(hport);
81 return 0;
82 }
83
84 if ((sp = getservbyname(servname, "tcp")) == NULL) {
85 errf("Unknown service `%s'", servname);
86 return -1;
87 }
88
89 *p_port = sp->s_port;
90
91 return 0;
92 }