summaryrefslogtreecommitdiff
path: root/qpid/cpp
diff options
context:
space:
mode:
authorAndrew Stitcher <astitcher@apache.org>2013-03-01 00:48:43 +0000
committerAndrew Stitcher <astitcher@apache.org>2013-03-01 00:48:43 +0000
commitbe493f8311fe7a7634a50f57fab5b00dfe329529 (patch)
treef39ccd4feed3c82c6111cfd633e4049bd7491854 /qpid/cpp
parent2e5734c62bb84c2500ef89937267e1a3df65366e (diff)
downloadqpid-python-be493f8311fe7a7634a50f57fab5b00dfe329529.tar.gz
QPID-4615: Allow unix qpidd to pass in existing socket fds on cmdline.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1451446 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp')
-rw-r--r--qpid/cpp/src/CMakeLists.txt1
-rw-r--r--qpid/cpp/src/Makefile.am4
-rw-r--r--qpid/cpp/src/qpid/broker/Broker.h2
-rw-r--r--qpid/cpp/src/qpid/broker/posix/SocketFDPlugin.cpp97
-rw-r--r--qpid/cpp/src/qpid/sys/posix/BSDSocket.h8
-rw-r--r--qpid/cpp/src/qpid/sys/posix/SocketAddress.cpp1
6 files changed, 107 insertions, 6 deletions
diff --git a/qpid/cpp/src/CMakeLists.txt b/qpid/cpp/src/CMakeLists.txt
index 1e891a93c8..9e9662ee38 100644
--- a/qpid/cpp/src/CMakeLists.txt
+++ b/qpid/cpp/src/CMakeLists.txt
@@ -873,6 +873,7 @@ else (CMAKE_SYSTEM_NAME STREQUAL Windows)
qpid/broker/SignalHandler.h
qpid/broker/SignalHandler.cpp
qpid/broker/posix/BrokerDefaults.cpp
+ qpid/broker/posix/SocketFDPlugin.cpp
)
set (qpidclient_platform_SOURCES
diff --git a/qpid/cpp/src/Makefile.am b/qpid/cpp/src/Makefile.am
index 326cacd9d1..0b5de50283 100644
--- a/qpid/cpp/src/Makefile.am
+++ b/qpid/cpp/src/Makefile.am
@@ -208,7 +208,9 @@ endif
libqpidcommon_la_SOURCES += $(poller) $(systeminfo)
posix_broker_src = \
- qpid/broker/posix/BrokerDefaults.cpp
+ qpid/broker/posix/BrokerDefaults.cpp \
+ qpid/broker/posix/SocketFDPlugin.cpp
+
lib_LTLIBRARIES = libqpidtypes.la libqpidcommon.la libqpidbroker.la libqpidclient.la libqpidmessaging.la
diff --git a/qpid/cpp/src/qpid/broker/Broker.h b/qpid/cpp/src/qpid/broker/Broker.h
index a896d9d70d..be2b9bef75 100644
--- a/qpid/cpp/src/qpid/broker/Broker.h
+++ b/qpid/cpp/src/qpid/broker/Broker.h
@@ -248,7 +248,7 @@ class Broker : public sys::Runnable, public Plugin::Target,
const std::string& name,
boost::shared_ptr<sys::TransportAcceptor>, boost::shared_ptr<sys::TransportConnector>,
uint16_t port);
-
+
/** Accept connections */
QPID_BROKER_EXTERN void accept();
diff --git a/qpid/cpp/src/qpid/broker/posix/SocketFDPlugin.cpp b/qpid/cpp/src/qpid/broker/posix/SocketFDPlugin.cpp
new file mode 100644
index 0000000000..f48198932d
--- /dev/null
+++ b/qpid/cpp/src/qpid/broker/posix/SocketFDPlugin.cpp
@@ -0,0 +1,97 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+#include "qpid/sys/TransportFactory.h"
+
+#include "qpid/Plugin.h"
+#include "qpid/broker/Broker.h"
+#include "qpid/log/Statement.h"
+#include "qpid/sys/AsynchIO.h"
+#include "qpid/sys/posix/BSDSocket.h"
+#include "qpid/sys/SocketTransport.h"
+
+#include <vector>
+
+#include <sys/stat.h>
+
+namespace qpid {
+namespace sys {
+
+namespace {
+
+struct SocketOptions : public Options {
+ std::vector<int> socketFds;
+
+ SocketOptions() :
+ socketFds(0)
+ {
+ addOptions()
+ ("socket-fd", optValue(socketFds, "FD"), "File descriptor for tcp listening socket");
+ }
+};
+
+bool isSocket(int fd)
+{
+ if (fd < 0 ) return false;
+
+ struct ::stat st_fd;
+ if (::fstat(fd, &st_fd) < 0) return false;
+
+ return S_ISSOCK(st_fd.st_mode);
+}
+
+}
+
+// Static instance to initialise plugin
+static class SocketFDPlugin : public Plugin {
+ SocketOptions options;
+
+ Options* getOptions() { return &options; }
+
+ void earlyInitialize(Target&) {
+ }
+
+ void initialize(Target& target) {
+ broker::Broker* broker = dynamic_cast<broker::Broker*>(&target);
+ // Only provide to a Broker
+ if (broker) {
+ if (!options.socketFds.empty()) {
+ const broker::Broker::Options& opts = broker->getOptions();
+ SocketAcceptor* sa = new SocketAcceptor(opts.tcpNoDelay, false, opts.maxNegotiateTime, broker->getTimer());
+ for (unsigned i = 0; i<options.socketFds.size(); ++i) {
+ int fd = options.socketFds[i];
+ if (!isSocket(fd)) {
+ QPID_LOG(error, "Imported socket fd " << fd << ": isn't a socket");
+ continue;
+ }
+ Socket* s = new BSDSocket(fd);
+ sa->addListener(s);
+ QPID_LOG(notice, "Listening on imported socket: " << s->getLocalAddress());
+ }
+ broker->registerTransport("socket", TransportAcceptor::shared_ptr(sa), TransportConnector::shared_ptr(), 0);
+ } else {
+ QPID_LOG(debug, "No Socket fd specified");
+ }
+ }
+ }
+} socketFdPlugin;
+
+}} // namespace qpid::sys
diff --git a/qpid/cpp/src/qpid/sys/posix/BSDSocket.h b/qpid/cpp/src/qpid/sys/posix/BSDSocket.h
index 862d36c1b9..ae73718d55 100644
--- a/qpid/cpp/src/qpid/sys/posix/BSDSocket.h
+++ b/qpid/cpp/src/qpid/sys/posix/BSDSocket.h
@@ -45,6 +45,10 @@ class QPID_COMMON_CLASS_EXTERN BSDSocket : public Socket
public:
/** Create a socket wrapper for descriptor. */
QPID_COMMON_EXTERN BSDSocket();
+
+ /** Construct socket with existing fd (posix specific and not in Socket interface) */
+ QPID_COMMON_EXTERN BSDSocket(int fd);
+
QPID_COMMON_EXTERN ~BSDSocket();
QPID_COMMON_EXTERN operator const IOHandle&() const;
@@ -103,10 +107,6 @@ protected:
mutable std::string peername;
mutable bool nonblocking;
mutable bool nodelay;
-
- /** Construct socket with existing handle */
- BSDSocket(int fd);
- friend class qpid::sys::ssl::SslMuxSocket; // Needed for this constructor
};
}}
diff --git a/qpid/cpp/src/qpid/sys/posix/SocketAddress.cpp b/qpid/cpp/src/qpid/sys/posix/SocketAddress.cpp
index cd23442226..1e5e52faab 100644
--- a/qpid/cpp/src/qpid/sys/posix/SocketAddress.cpp
+++ b/qpid/cpp/src/qpid/sys/posix/SocketAddress.cpp
@@ -76,6 +76,7 @@ std::string SocketAddress::asString(::sockaddr const * const addr, size_t addrle
switch (addr->sa_family) {
case AF_INET: s += dispName; break;
case AF_INET6: s += "["; s += dispName; s+= "]"; break;
+ case AF_UNIX: s += "UNIX:"; break;
default: throw Exception(QPID_MSG("Unexpected socket type"));
}
s += ":";