You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

POSIX.m 1.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #import "POSIX.h"
  2. #include <arpa/inet.h>
  3. #include <netdb.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. @implementation POSIX
  7. RCT_EXPORT_MODULE();
  8. RCT_EXPORT_METHOD(getaddrinfo:(NSString *)hostname
  9. resolve:(RCTPromiseResolveBlock)resolve
  10. reject:(RCTPromiseRejectBlock)reject) {
  11. int err;
  12. struct addrinfo *res;
  13. NSString *rejectCode;
  14. if (0 == (err = getaddrinfo(hostname.UTF8String, NULL, NULL, &res))) {
  15. int af = res->ai_family;
  16. struct sockaddr *sa = res->ai_addr;
  17. void *addr;
  18. switch (af) {
  19. case AF_INET:
  20. addr = &(((struct sockaddr_in *) sa)->sin_addr);
  21. break;
  22. case AF_INET6:
  23. addr = &(((struct sockaddr_in6 *) sa)->sin6_addr);
  24. break;
  25. default:
  26. addr = NULL;
  27. break;
  28. }
  29. if (addr) {
  30. char v[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
  31. if (inet_ntop(af, addr, v, sizeof(v))) {
  32. resolve([NSString stringWithUTF8String:v]);
  33. } else {
  34. err = errno;
  35. rejectCode = @"inet_ntop";
  36. }
  37. } else {
  38. err = EAFNOSUPPORT;
  39. rejectCode = @"EAFNOSUPPORT";
  40. }
  41. freeaddrinfo(res);
  42. } else {
  43. rejectCode = @"getaddrinfo";
  44. }
  45. if (0 != err) {
  46. NSError *error
  47. = [NSError errorWithDomain:NSPOSIXErrorDomain
  48. code:err
  49. userInfo:nil];
  50. reject(rejectCode, error.localizedDescription, error);
  51. }
  52. }
  53. @end