diff options
| author | Andrew Stitcher <astitcher@apache.org> | 2013-03-01 00:48:43 +0000 |
|---|---|---|
| committer | Andrew Stitcher <astitcher@apache.org> | 2013-03-01 00:48:43 +0000 |
| commit | be493f8311fe7a7634a50f57fab5b00dfe329529 (patch) | |
| tree | f39ccd4feed3c82c6111cfd633e4049bd7491854 /qpid/cpp | |
| parent | 2e5734c62bb84c2500ef89937267e1a3df65366e (diff) | |
| download | qpid-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.txt | 1 | ||||
| -rw-r--r-- | qpid/cpp/src/Makefile.am | 4 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/broker/Broker.h | 2 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/broker/posix/SocketFDPlugin.cpp | 97 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/sys/posix/BSDSocket.h | 8 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/sys/posix/SocketAddress.cpp | 1 |
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 += ":"; |
