0006-ifconfig-Symbolic-name-as-peer-address.patch 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. From 1003145f9370553f2a7c061a9b001e9f6231687f Mon Sep 17 00:00:00 2001
  2. From: Mats Erik Andersson <gnu@gisladisker.se>
  3. Date: Sat, 25 Jul 2015 23:39:26 +0200
  4. Subject: [PATCH 06/60] ifconfig: Symbolic name as peer address.
  5. ---
  6. ChangeLog | 9 +++++++
  7. ifconfig/changeif.c | 58 ++++++++++++++++++++++++++++++++++++++++++---
  8. 2 files changed, 64 insertions(+), 3 deletions(-)
  9. diff --git a/ChangeLog b/ChangeLog
  10. index c194a545..72806b79 100644
  11. --- a/ChangeLog
  12. +++ b/ChangeLog
  13. @@ -1,3 +1,12 @@
  14. +2015-07-25 Mats Erik Andersson <gnu@gisladisker.se>
  15. +
  16. + ifconfig: Symbolic name as peer address.
  17. +
  18. + * ifconfig/changeif.c (set_dstaddr): Adapt code block used
  19. + by set_address(), thereby first using either getaddrinfo()
  20. + or gethostbyname() to resolve a possibly symbolic peer
  21. + destination, then setting the established address.
  22. +
  23. 2015-07-25 Mats Erik Andersson <gnu@gisladisker.se>
  24. ifconfig: Support changing of hardware address.
  25. diff --git a/ifconfig/changeif.c b/ifconfig/changeif.c
  26. index dfcae9ff..a040587b 100644
  27. --- a/ifconfig/changeif.c
  28. +++ b/ifconfig/changeif.c
  29. @@ -163,13 +163,65 @@ set_dstaddr (int sfd, struct ifreq *ifr, char *dstaddr)
  30. error (0, 0,
  31. "don't know how to set an interface peer address on this system");
  32. return -1;
  33. -#else
  34. - SIOCSIF (DSTADDR, dstaddr)
  35. +#else /* !SIOCSIFDSTADDR */
  36. +# if HAVE_DECL_GETADDRINFO
  37. + int rc;
  38. + char addr[INET_ADDRSTRLEN];
  39. + struct addrinfo hints, *ai, *res;
  40. +
  41. + memset (&hints, 0, sizeof (hints));
  42. + hints.ai_family = AF_INET;
  43. +
  44. + rc = getaddrinfo (dstaddr, NULL, &hints, &res);
  45. + if (rc)
  46. + {
  47. + error (0, 0, "cannot resolve `%s': %s", dstaddr, gai_strerror (rc));
  48. + return -1;
  49. + }
  50. + for (ai = res; ai; ai = ai->ai_next)
  51. + if (ai->ai_family == AF_INET)
  52. + break;
  53. +
  54. + if (ai == NULL)
  55. + {
  56. + error (0, 0, "`%s' refers to an unknown address type", dstaddr);
  57. + freeaddrinfo (res);
  58. + return -1;
  59. + }
  60. +
  61. + rc = getnameinfo (ai->ai_addr, ai->ai_addrlen,
  62. + addr, sizeof (addr), NULL, 0,
  63. + NI_NUMERICHOST);
  64. + freeaddrinfo (res);
  65. + if (rc)
  66. + {
  67. + error (0, 0, "cannot resolve `%s': %s", dstaddr, gai_strerror (rc));
  68. + return -1;
  69. + }
  70. +# else /* !HAVE_DECL_GETADDRINFO */
  71. + char *addr;
  72. + struct hostent *host = gethostbyname (dstaddr);
  73. +
  74. + if (!host)
  75. + {
  76. + error (0, 0, "cannot resolve `%s': %s", dstaddr, hstrerror (h_errno));
  77. + return -1;
  78. + }
  79. + if (host->h_addrtype != AF_INET)
  80. + {
  81. + error (0, 0, "`%s' refers to an unknown address type", dstaddr);
  82. + return -1;
  83. + }
  84. +
  85. + addr = inet_ntoa (*((struct in_addr *) host->h_addr));
  86. +# endif /* !HAVE_DECL_GETADDRINFO */
  87. +
  88. + SIOCSIF (DSTADDR, addr)
  89. if (verbose)
  90. printf ("Set interface peer address of `%s' to %s.\n",
  91. ifr->ifr_name, inet_ntoa (sin->sin_addr));
  92. return 0;
  93. -#endif
  94. +#endif /* SIOCSIFDSTADDR */
  95. }
  96. int
  97. --
  98. 2.26.0.292.g33ef6b2f38