1
0
Fork 0
mirror of https://git.freebsd.org/ports.git synced 2025-06-26 07:00:31 -04:00
ports/devel/psptoolchain-newlib/files/patch-newlib-libc-sys-psp-netdb.c
Marcelo Araujo 1bd31e4bde - Update to 1.20.0.
Submitted by:	Tassilo Philipp <tphilipp@potion-studios.com> (maintainer via email)
2012-02-06 04:36:38 +00:00

106 lines
2.3 KiB
C

--- ./newlib/libc/sys/psp/netdb.c.orig 2012-01-25 19:33:12.000000000 +0000
+++ ./newlib/libc/sys/psp/netdb.c 2012-01-25 19:33:12.000000000 +0000
@@ -0,0 +1,103 @@
+/* Simple gethostbyname and gethostbyaddr replacements using the resolver lib */
+#include <stdio.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/socket.h>
+#include <pspkerneltypes.h>
+#include <pspnet_resolver.h>
+
+#define MAX_NAME 512
+
+#ifdef F_h_errno
+int h_errno = NETDB_SUCCESS;
+#endif
+
+#ifdef F_gethostbyaddr
+struct hostent *gethostbyaddr(const void *addr, int len, int type)
+{
+ static struct hostent ent;
+ static char * aliases[1] = { NULL };
+ char buf[1024];
+ static char sname[MAX_NAME] = "";
+ static struct in_addr saddr = { 0 };
+ static char *addrlist[2] = { (char *) &saddr, NULL };
+ int rid;
+ int err;
+
+ if((len != sizeof(struct in_addr)) || (type != AF_INET) || (addr == NULL))
+ {
+ h_errno = HOST_NOT_FOUND;
+ return NULL;
+ }
+
+ memcpy(&saddr, addr, len);
+
+ if(sceNetResolverCreate(&rid, buf, sizeof(buf)) < 0)
+ {
+ h_errno = NO_RECOVERY;
+ return NULL;
+ }
+
+ err = sceNetResolverStartAtoN(rid, &saddr, sname, sizeof(sname), 2, 3);
+ sceNetResolverStop(rid);
+ sceNetResolverDelete(rid);
+ if(err < 0)
+ {
+ h_errno = HOST_NOT_FOUND;
+ return NULL;
+ }
+
+ ent.h_name = sname;
+ ent.h_aliases = aliases;
+ ent.h_addrtype = AF_INET;
+ ent.h_length = sizeof(struct in_addr);
+ ent.h_addr_list = addrlist;
+ ent.h_addr = (char *) &saddr;
+
+ return &ent;
+}
+#endif
+
+#ifdef F_gethostbyname
+struct hostent *gethostbyname(const char *name)
+{
+ static struct hostent ent;
+ char buf[1024];
+ static char sname[MAX_NAME] = "";
+ static struct in_addr saddr = { 0 };
+ static char *addrlist[2] = { (char *) &saddr, NULL };
+ int rid;
+
+ if(sceNetInetInetAton(name, &saddr) == 0)
+ {
+ int err;
+
+ if(sceNetResolverCreate(&rid, buf, sizeof(buf)) < 0)
+ {
+ h_errno = NO_RECOVERY;
+ return NULL;
+ }
+
+ err = sceNetResolverStartNtoA(rid, name, &saddr, 2, 3);
+ sceNetResolverDelete(rid);
+ if(err < 0)
+ {
+ h_errno = HOST_NOT_FOUND;
+ return NULL;
+ }
+
+ }
+
+ snprintf(sname, MAX_NAME, "%s", name);
+ ent.h_name = sname;
+ ent.h_aliases = 0;
+ ent.h_addrtype = AF_INET;
+ ent.h_length = sizeof(struct in_addr);
+ ent.h_addr_list = addrlist;
+ ent.h_addr = (char *) &saddr;
+
+ return &ent;
+}
+
+#endif