summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/Url.cpp
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2008-01-31 23:14:49 +0000
committerAlan Conway <aconway@apache.org>2008-01-31 23:14:49 +0000
commitd4ccea4185f111970d8bb6144040caa0402720d9 (patch)
treeea1aee1f35b47bd03d99b754a65d2fe7589fcc65 /cpp/src/qpid/Url.cpp
parentf1ba7709347e5282438dbec5bed5e55c861092cd (diff)
downloadqpid-python-d4ccea4185f111970d8bb6144040caa0402720d9.tar.gz
Generate URLs for local host.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@617286 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/Url.cpp')
-rw-r--r--cpp/src/qpid/Url.cpp41
1 files changed, 40 insertions, 1 deletions
diff --git a/cpp/src/qpid/Url.cpp b/cpp/src/qpid/Url.cpp
index d52fc71870..1e0e0b3603 100644
--- a/cpp/src/qpid/Url.cpp
+++ b/cpp/src/qpid/Url.cpp
@@ -16,16 +16,55 @@
*
*/
-#include "Url.h"
+#include "qpid/Url.h"
+#include "qpid/Exception.h"
+#include "qpid/Msg.h"
+
#include <sstream>
#include <boost/spirit.hpp>
#include <boost/spirit/actor.hpp>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <unistd.h>
+#include <arpa/inet.h>
+#include <stdio.h>
+#include <errno.h>
+
using namespace boost::spirit;
using namespace std;
namespace qpid {
+Url Url::getHostnameUrl(uint16_t port) {
+ char name[HOST_NAME_MAX];
+ if (::gethostname(name, sizeof(name)) != 0)
+ throw Exception(QPID_MSG("Cannot get host name: " << strError(errno)));
+ return Url(TcpAddress(name, port));
+}
+
+static const string LOCALHOST("127.0.0.1");
+
+Url Url::getIpAddressesUrl(uint16_t port) {
+ Url url;
+ int s = socket (PF_INET, SOCK_STREAM, 0);
+ for (int i=1;;i++) {
+ struct ifreq ifr;
+ ifr.ifr_ifindex = i;
+ if (::ioctl (s, SIOCGIFNAME, &ifr) < 0)
+ break;
+ /* now ifr.ifr_name is set */
+ if (::ioctl (s, SIOCGIFADDR, &ifr) < 0)
+ continue;
+ struct sockaddr_in *sin = (struct sockaddr_in *) &ifr.ifr_addr;
+ string addr(inet_ntoa(sin->sin_addr));
+ if (addr != LOCALHOST)
+ url.push_back(TcpAddress(addr, port));
+ }
+ close (s);
+ return url;
+}
+
string Url::str() const {
ostringstream os;
os << *this;