From 3fe7b95fd0e24fe06e70fd7ba1313e42222f0443 Mon Sep 17 00:00:00 2001 From: Gautham <41098605+ahgamut@users.noreply.github.com> Date: Thu, 1 Jul 2021 20:25:11 +0530 Subject: [PATCH] Add gethostbyname and gethostbyaddr (#200) gethostbyname, gethostbyaddr follow simple implementations: they internally call getaddrinfo and getnameinfo respectively, and fill out the minimum details. remaining functions are stubs. --- libc/dns/ent.h | 27 ++++++++++++++++ libc/dns/gethostbyaddr.c | 70 ++++++++++++++++++++++++++++++++++++++++ libc/dns/gethostbyname.c | 69 +++++++++++++++++++++++++++++++++++++++ libc/dns/herror.c | 37 +++++++++++++++++++++ libc/dns/hostent.c | 38 ++++++++++++++++++++++ 5 files changed, 241 insertions(+) create mode 100644 libc/dns/ent.h create mode 100644 libc/dns/gethostbyaddr.c create mode 100644 libc/dns/gethostbyname.c create mode 100644 libc/dns/herror.c create mode 100644 libc/dns/hostent.c diff --git a/libc/dns/ent.h b/libc/dns/ent.h new file mode 100644 index 00000000000..806e5f65727 --- /dev/null +++ b/libc/dns/ent.h @@ -0,0 +1,27 @@ +#ifndef COSMOPOLITAN_LIBC_DNS_ENT_H_ +#define COSMOPOLITAN_LIBC_DNS_ENT_H_ +#include "libc/dns/dns.h" + +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ + +extern int h_errno; + +struct hostent { + char *h_name; /* official name of host */ + char **h_aliases; /* alias list */ + int h_addrtype; /* host address type */ + int h_length; /* length of address */ + char **h_addr_list; /* list of addresses */ +}; +#define h_addr h_addr_list[0] + +struct hostent *gethostent(void); +struct hostent *gethostbyname(const char *); +struct hostent *gethostbyaddr(const void *, socklen_t, int); +void sethostent(int); +void endhostent(void); + +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_LIBC_DNS_ENT_H_ */ diff --git a/libc/dns/gethostbyaddr.c b/libc/dns/gethostbyaddr.c new file mode 100644 index 00000000000..8f095f2d172 --- /dev/null +++ b/libc/dns/gethostbyaddr.c @@ -0,0 +1,70 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ This is free and unencumbered software released into the public domain. │ +│ │ +│ Anyone is free to copy, modify, publish, use, compile, sell, or │ +│ distribute this software, either in source code form or as a compiled │ +│ binary, for any purpose, commercial or non-commercial, and by any │ +│ means. │ +│ │ +│ In jurisdictions that recognize copyright laws, the author or authors │ +│ of this software dedicate any and all copyright interest in the │ +│ software to the public domain. We make this dedication for the benefit │ +│ of the public at large and to the detriment of our heirs and │ +│ successors. We intend this dedication to be an overt act of │ +│ relinquishment in perpetuity of all present and future rights to this │ +│ software under copyright law. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR │ +│ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │ +│ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR │ +│ OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/dns/ent.h" +#include "libc/mem/mem.h" +#include "libc/sysv/consts/af.h" + +struct hostent *gethostbyaddr(const void *s_addr, socklen_t len, int type) { + static struct hostent *ptr1, he1; + struct sockaddr_in addr; + char name[DNS_NAME_MAX + 1]; + + if (!ptr1) { + he1.h_name = NULL; + + he1.h_aliases = (char **)malloc(sizeof(char *) * 1); + if (!he1.h_aliases) return NULL; + he1.h_aliases[0] = NULL; + + he1.h_addrtype = AF_INET; + he1.h_length = 4; + he1.h_addr_list = (char **)malloc(sizeof(char *) * 2); + if (!he1.h_addr_list) return NULL; + + he1.h_addr_list[0] = (char *)malloc(sizeof(uint32_t)); + if (!he1.h_addr_list[0]) return NULL; + he1.h_addr_list[1] = NULL; + + ptr1 = &he1; + } + + if (type != AF_INET || len != sizeof(uint32_t)) return NULL; + addr.sin_family = AF_INET; + addr.sin_port = 0; + addr.sin_addr.s_addr = *(uint32_t *)(s_addr); + + if (getnameinfo((struct sockaddr *)&addr, sizeof(addr), name, sizeof(name), + NULL, 0, 0)) + return NULL; + + if (ptr1->h_name) free(ptr1->h_name); + ptr1->h_name = strdup(name); + *((uint32_t *)ptr1->h_addr_list[0]) = (addr.sin_addr.s_addr); + + return ptr1; +} diff --git a/libc/dns/gethostbyname.c b/libc/dns/gethostbyname.c new file mode 100644 index 00000000000..27e39a4388d --- /dev/null +++ b/libc/dns/gethostbyname.c @@ -0,0 +1,69 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ This is free and unencumbered software released into the public domain. │ +│ │ +│ Anyone is free to copy, modify, publish, use, compile, sell, or │ +│ distribute this software, either in source code form or as a compiled │ +│ binary, for any purpose, commercial or non-commercial, and by any │ +│ means. │ +│ │ +│ In jurisdictions that recognize copyright laws, the author or authors │ +│ of this software dedicate any and all copyright interest in the │ +│ software to the public domain. We make this dedication for the benefit │ +│ of the public at large and to the detriment of our heirs and │ +│ successors. We intend this dedication to be an overt act of │ +│ relinquishment in perpetuity of all present and future rights to this │ +│ software under copyright law. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR │ +│ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │ +│ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR │ +│ OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/dns/ent.h" +#include "libc/mem/mem.h" +#include "libc/sysv/consts/af.h" + +struct hostent *gethostbyname(const char *name) { + static struct hostent *ptr0, he0; + struct addrinfo *result = NULL; + + if (!ptr0) { + he0.h_name = NULL; + + he0.h_aliases = (char **)malloc(sizeof(char *) * 1); + if (!he0.h_aliases) return NULL; + he0.h_aliases[0] = NULL; + + he0.h_addrtype = AF_INET; + he0.h_length = 4; + he0.h_addr_list = (char **)malloc(sizeof(char *) * 2); + if (!he0.h_addr_list) return NULL; + + he0.h_addr_list[0] = (char *)malloc(sizeof(uint32_t)); + if (!he0.h_addr_list[0]) return NULL; + he0.h_addr_list[1] = NULL; + + ptr0 = &he0; + } + + if (getaddrinfo(name, NULL, NULL, &result) || result == NULL) return NULL; + + if (ptr0->h_name) free(ptr0->h_name); + if (result->ai_canonname) { + ptr0->h_name = strdup(result->ai_canonname); + } else { + ptr0->h_name = strdup(name); + } + + *((uint32_t *)ptr0->h_addr_list[0]) = (result->ai_addr4->sin_addr.s_addr); + /* TODO: if result has ai_next, fit multiple entries for h_addr_list */ + + freeaddrinfo(result); + return ptr0; +} diff --git a/libc/dns/herror.c b/libc/dns/herror.c new file mode 100644 index 00000000000..fc11db00b03 --- /dev/null +++ b/libc/dns/herror.c @@ -0,0 +1,37 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ This is free and unencumbered software released into the public domain. │ +│ │ +│ Anyone is free to copy, modify, publish, use, compile, sell, or │ +│ distribute this software, either in source code form or as a compiled │ +│ binary, for any purpose, commercial or non-commercial, and by any │ +│ means. │ +│ │ +│ In jurisdictions that recognize copyright laws, the author or authors │ +│ of this software dedicate any and all copyright interest in the │ +│ software to the public domain. We make this dedication for the benefit │ +│ of the public at large and to the detriment of our heirs and │ +│ successors. We intend this dedication to be an overt act of │ +│ relinquishment in perpetuity of all present and future rights to this │ +│ software under copyright law. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR │ +│ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │ +│ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR │ +│ OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/dns/ent.h" + +int h_errno = 0; + +void herror(const char *s) { +} + +const char *hstrerror(int err) { + return "unknown"; +} diff --git a/libc/dns/hostent.c b/libc/dns/hostent.c new file mode 100644 index 00000000000..b376c6ac034 --- /dev/null +++ b/libc/dns/hostent.c @@ -0,0 +1,38 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ This is free and unencumbered software released into the public domain. │ +│ │ +│ Anyone is free to copy, modify, publish, use, compile, sell, or │ +│ distribute this software, either in source code form or as a compiled │ +│ binary, for any purpose, commercial or non-commercial, and by any │ +│ means. │ +│ │ +│ In jurisdictions that recognize copyright laws, the author or authors │ +│ of this software dedicate any and all copyright interest in the │ +│ software to the public domain. We make this dedication for the benefit │ +│ of the public at large and to the detriment of our heirs and │ +│ successors. We intend this dedication to be an overt act of │ +│ relinquishment in perpetuity of all present and future rights to this │ +│ software under copyright law. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR │ +│ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │ +│ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR │ +│ OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/dns/ent.h" + +struct hostent *gethostent(void) { + return NULL; +} + +void sethostent(int stayopen) { +} + +void endhostent(void) { +}