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

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