Short: xerq: new request ERQ_INET6_ATON From: mai94cch@studserv.uni-leipzig.de Date: Wed, 5 Jan 2000 19:24:12 +0100 (MEZ) To: Lars Duening <lars@bearnip.com> Hallo, ich hab mal in der erq/xerq eine neue Funktion eingebaut: ERQ_INET6_ATON : liefert die addresse eines rechners in der network-byte order. Ich weis nicht, ob das teil ueberhaupt gebraucht wird, wenn ja wuerde ich noch ERQ_INET6_NTOA : liefert die ip eines rechners als string machen. Wenns nicht gebraucht wird schmeiss den patch auf den muell :-) MfG Uwe ------------ diff -r -u ldmud-164:0/INSTALL ldmud-164/INSTALL --- ldmud-164:0/INSTALL Sat Nov 27 17:31:04 1999 +++ ldmud-164/INSTALL Wed Jan 5 09:11:25 2000 @@ -93,7 +93,7 @@ Furthermore you need a connection to the 6bone (<URL:http://www.join.uni-muenster.de/>). - Newer versions of AIX also come with IPv6 support. + IPv6 support is also availible for aix 4.3, solaris 8, bsd, HPUX 11 and Windows NT. BeOS diff -r -u ldmud-164:0/src/util/erq/erq.c ldmud-164/src/util/erq/erq.c --- ldmud-164:0/src/util/erq/erq.c Wed Nov 17 21:02:02 1999 +++ ldmud-164/src/util/erq/erq.c Wed Jan 5 11:54:15 2000 @@ -2367,8 +2367,8 @@ strcat(mbuff, "invalid-format"); msglen = strlen(mbuff) + 1; } - write_32(header, msglen + 9); - write1(header, 9); + write_32(header, msglen + 8); + write1(header, 8); write1(mbuff, msglen); free(mbuff); if (!i) @@ -2376,6 +2376,28 @@ break; } #endif /* ERQ_RLOOKUPV6 */ + +#ifdef ERQ_INET6_ATON + case ERQ_INET6_ATON: + { + struct hostent *sh; + + /* handle stays in header[4..7] */ + header[8] = CHILD_FREE; + buf[msglen] = 0; + + sh = gethostbyname2(buf, AF_INET6); + if(!sh) gethostbyname2(buf, AF_INET); + + msglen = strlen(buf) + (sh ? sh->h_length : strlen("not-found")+1) + 1; + write_32(header, msglen + 8); + write1(header, 8); + write1(buf, strlen(buf)); + write1(" ", 1); + write1(sh ? sh->h_addr_list[0] : "not-found", sh ? sh->h_length : strlen("not-found")+1); + endhostent(); + } +#endif /* ERQ_INET6_ATON */ } /* switch() */ } /* if (num_ready > 0 && FD_ISSET(1, &readfds)) */ diff -r -u ldmud-164:0/src/util/erq/erq.h ldmud-164/src/util/erq/erq.h --- ldmud-164:0/src/util/erq/erq.h Tue Oct 12 15:56:30 1999 +++ ldmud-164/src/util/erq/erq.h Wed Jan 5 10:47:19 2000 @@ -19,7 +19,8 @@ #define ERQ_LOOKUP 11 /* Lookup name -> ip */ #ifdef __IPV6__ -#define ERQ_RLOOKUPV6 12 /* Lookup name/ip6 */ +#define ERQ_RLOOKUPV6 12 /* Lookup ip -> name */ +#define ERQ_INET6_ATON 13 /* Lookup name/ip -> network-byte-order */ #endif diff -r -u ldmud-164:0/src/util/xerq/defs.h ldmud-164/src/util/xerq/defs.h --- ldmud-164:0/src/util/xerq/defs.h Wed Nov 17 15:12:56 1999 +++ ldmud-164/src/util/xerq/defs.h Wed Jan 5 11:51:16 2000 @@ -221,6 +221,7 @@ extern void erq_lookup(char *, int); #ifdef USE_IPV6 extern void erq_rlookupv6(char *, int); +extern void erq_inet6_aton(char *, int); #endif extern void close_socket(socket_t *); diff -r -u ldmud-164:0/src/util/xerq/erq.h ldmud-164/src/util/xerq/erq.h --- ldmud-164:0/src/util/xerq/erq.h Tue Oct 12 15:56:34 1999 +++ ldmud-164/src/util/xerq/erq.h Wed Jan 5 10:55:12 2000 @@ -19,7 +19,8 @@ #define ERQ_LOOKUP 11 /* Lookup name -> ip */ #ifdef __IPV6__ -#define ERQ_RLOOKUPV6 12 /* Lookup name/ip6 */ +#define ERQ_RLOOKUPV6 12 /* Lookup ip -> name */ +#define ERQ_INET6_ATON 13 /* Lookup name/ip -> network-byte-order */ #endif diff -r -u ldmud-164:0/src/util/xerq/lookup.c ldmud-164/src/util/xerq/lookup.c --- ldmud-164:0/src/util/xerq/lookup.c Wed Nov 17 21:42:06 1999 +++ ldmud-164/src/util/xerq/lookup.c Wed Jan 5 11:53:45 2000 @@ -90,9 +90,6 @@ void erq_rlookupv6(char *mesg, int msglen) -/* ERQ_RLOOKUPV6: look up an IPv6 address by a hostname. - */ - { int i; char *mbuff, *buf; @@ -146,6 +143,36 @@ free(buf); } /* erq_rlookupv6() */ + +/*-------------------------------------------------------------------------*/ + + +void +erq_inet6_aton(char *mesg, int msglen) +{ + static char *msg_nomem = "out-of-memory"; + struct hostent *sh; + char *mbuff; + + sh = gethostbyname2(mesg, AF_INET6); + if(!sh) gethostbyname2(mesg, AF_INET); + + mesg[msglen] = 0; + msglen = strlen(mesg) + (sh ? sh->h_length : strlen("not-found")+1) + 1; + mbuff = malloc(msglen); + if(!mbuff) + { + reply1(get_handle(mesg), msg_nomem, strlen(msg_nomem)+1); + return; + } + strcpy(mbuff, mesg); + strcat(mbuff, " "); + if(sh) memcpy(mbuff+strlen(mbuff), sh->h_addr_list[0], sh->h_length); + else strcat(mbuff, "not-found"); + reply1(get_handle(mesg), mbuff, msglen); + free(mbuff); + endhostent(); +} #endif /* USE_IPV6 */ ------------