00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "defs.h"
00022 #ifdef SOLARIS
00023 #define __EXTENSIONS__
00024 #endif
00025 #include <sys/socket.h>
00026 #include <netdb.h>
00027 #undef __EXTENSIONS__
00028 #include <netinet/in.h>
00029 #include <arpa/inet.h>
00030 #include <net/if.h>
00031
00032
00033 static void ifdb(void)
00034 {
00035 struct if_nameindex *ni;
00036 int i;
00037
00038 ec_null( ni = if_nameindex() )
00039 for (i = 0; ni[i].if_index != 0 || ni[i].if_name != NULL; i++)
00040 printf("index: %d; name: %s\n", ni[i].if_index, ni[i].if_name);
00041 if_freenameindex(ni);
00042 return;
00043
00044 EC_CLEANUP_BGN
00045 EC_FLUSH("ifdb")
00046 EC_CLEANUP_END
00047 }
00048
00049 static void display_hostent(struct hostent *h)
00050 {
00051 int i;
00052
00053 printf("name: %s; type: %d; len: %d\n", h->h_name, h->h_addrtype,
00054 h->h_length);
00055 for (i = 0; h->h_aliases[i] != NULL; i++)
00056 printf("\t%s\n", h->h_aliases[i]);
00057 if (h->h_addrtype == AF_INET) {
00058 for (i = 0; h->h_addr_list[i] != NULL; i++)
00059 printf("\t%s\n",
00060 inet_ntoa(*((struct in_addr *)h->h_addr_list[i])));
00061 }
00062 }
00063
00064 static void hostdb(void)
00065 {
00066 struct hostent *h;
00067
00068 sethostent(true);
00069 while ((h = gethostent()) != NULL)
00070 display_hostent(h);
00071 endhostent();
00072 }
00073
00074 static void gethostbyname_ex(void)
00075 {
00076 struct hostent *h;
00077
00078 if ((h = gethostbyname("www.yahoo.com")) == NULL) {
00079 if (h_errno == HOST_NOT_FOUND)
00080 printf("host not found\n");
00081 else
00082 printf("h_errno = %d\n", h_errno);
00083 }
00084 else
00085 display_hostent(h);
00086 }
00087
00088 static void gethostbyaddr_ex(void)
00089 {
00090 struct hostent *h;
00091 in_addr_t a;
00092
00093 ec_neg1( a = inet_addr("66.218.71.94") )
00094
00095
00096
00097
00098 if ((h = gethostbyaddr((const char *)&a, sizeof(a), AF_INET))
00099 == NULL) {
00100 if (h_errno == HOST_NOT_FOUND)
00101 printf("address not found\n");
00102 else
00103 printf("h_errno = %d\n", h_errno);
00104 }
00105 else
00106 display_hostent(h);
00107 return;
00108
00109 EC_CLEANUP_BGN
00110 EC_FLUSH("gethostbyaddr_ex")
00111 EC_CLEANUP_END
00112 }
00113
00114 static void getnameinfo_ex(void)
00115 {
00116 struct sockaddr_in sa;
00117 char nodename[200], servname[200];
00118
00119 sa.sin_family = AF_INET;
00120 sa.sin_port = htons(80);
00121 sa.sin_addr.s_addr = inet_addr("216.109.125.70");
00122 ec_ai( getnameinfo((struct sockaddr *)&sa, sizeof(sa), nodename,
00123 sizeof(nodename), servname, sizeof(servname), 0) )
00124 printf("node: %s; service: %s\n", nodename, servname);
00125 return;
00126
00127 EC_CLEANUP_BGN
00128 EC_FLUSH("getnameinfo_ex")
00129 EC_CLEANUP_END
00130 }
00131
00132 static void display_netent(struct netent *n)
00133 {
00134 int i;
00135
00136 printf("name: %s; type: %d; number: %lu\n", n->n_name, n->n_addrtype,
00137 (unsigned long)n->n_net);
00138 for (i = 0; n->n_aliases[i] != NULL; i++)
00139 printf("\t%s\n", n->n_aliases[i]);
00140 }
00141
00142 static void netdb(void)
00143 {
00144 struct netent *n;
00145
00146 setnetent(true);
00147 while ((n = getnetent()) != NULL)
00148 display_netent(n);
00149 endnetent();
00150 }
00151
00152 static void display_protoent(struct protoent *p)
00153 {
00154 int i;
00155
00156 printf("name: %s; number: %d\n", p->p_name, p->p_proto);
00157 for (i = 0; p->p_aliases[i] != NULL; i++)
00158 printf("\t%s\n", p->p_aliases[i]);
00159 }
00160
00161 static void protodb(void)
00162 {
00163 struct protoent *p;
00164
00165 setprotoent(true);
00166 while ((p = getprotoent()) != NULL)
00167 display_protoent(p);
00168 endprotoent();
00169 }
00170
00171 static void display_servent(struct servent *s)
00172 {
00173 int i;
00174
00175 printf("name: %s; port: %d; protocol: %s\n", s->s_name, s->s_port,
00176 s->s_proto);
00177 for (i = 0; s->s_aliases[i] != NULL; i++)
00178 printf("\t%s\n", s->s_aliases[i]);
00179 }
00180
00181 static void servdb(void)
00182 {
00183 struct servent *s;
00184
00185 setservent(true);
00186 while ((s = getservent()) != NULL)
00187 display_servent(s);
00188 endservent();
00189 }
00190
00191 static void cvt(void)
00192 {
00193 char ipv6[16], ipv6str[INET6_ADDRSTRLEN], ipv4str[INET_ADDRSTRLEN];
00194 uint32_t ipv4;
00195 int r;
00196
00197 ec_neg1( r = inet_pton(AF_INET, "66.218.71.94", &ipv4) )
00198 if (r == 0)
00199 printf("Can't convert\n");
00200 else {
00201 ec_null( inet_ntop(AF_INET, &ipv4, ipv4str, sizeof(ipv4str)) )
00202 printf("%s\n", ipv4str);
00203 }
00204 ec_neg1( r = inet_pton(AF_INET6,
00205 "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210", &ipv6) )
00206 if (r == 0)
00207 printf("Can't convert\n");
00208 else {
00209 ec_null( inet_ntop(AF_INET6, &ipv6, ipv6str, sizeof(ipv6str)) )
00210 printf("%s\n", ipv6str);
00211 }
00212 return;
00213
00214 EC_CLEANUP_BGN
00215 EC_FLUSH("cvt")
00216 EC_CLEANUP_END
00217 }
00218
00219 int main(void)
00220 {
00221 #if 0
00222 struct in_addr in;
00223
00224 in.s_addr = (in_addr_t)gethostid();
00225 printf("hostid: %ld %lx %s\n", gethostid(), gethostid(),
00226 inet_ntoa(in));
00227 hostdb();
00228 gethostbyaddr_ex();
00229 gethostbyname_ex();
00230 getnameinfo_ex();
00231 netdb();
00232 protodb();
00233 servdb();
00234 #endif
00235 ifdb();
00236 cvt();
00237 exit(EXIT_SUCCESS);
00238 }