summaryrefslogtreecommitdiff
path: root/qpid/cpp/src
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2013-12-05 20:34:21 +0000
committerAlan Conway <aconway@apache.org>2013-12-05 20:34:21 +0000
commitf444f2faa779e612cb1d051d54ba26dadba1bf56 (patch)
tree01fab96dc49e0bd876bff010c14049d251109283 /qpid/cpp/src
parentae253369fa099345d3839a53227845e86827bfae (diff)
downloadqpid-python-f444f2faa779e612cb1d051d54ba26dadba1bf56.tar.gz
QPID-5398: qpidd --acl-file does not work with a drive-prefixed path on windows.
On windows, acl-file was not recognizing drive-prefixed paths (e.g. c:\foo) as absolute and was trying to interpret them relative to the brokers data-dir. This commit fixes the problem and adds a general-purpose Path class that can be a collection point for any other path-related portability problems that come up. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1548279 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src')
-rw-r--r--qpid/cpp/src/CMakeLists.txt2
-rw-r--r--qpid/cpp/src/qpid/acl/AclPlugin.cpp11
-rw-r--r--qpid/cpp/src/qpid/sys/Path.h61
-rw-r--r--qpid/cpp/src/qpid/sys/posix/Path.cpp64
-rw-r--r--qpid/cpp/src/qpid/sys/windows/Path.cpp65
5 files changed, 198 insertions, 5 deletions
diff --git a/qpid/cpp/src/CMakeLists.txt b/qpid/cpp/src/CMakeLists.txt
index 248798977f..822de0b77f 100644
--- a/qpid/cpp/src/CMakeLists.txt
+++ b/qpid/cpp/src/CMakeLists.txt
@@ -672,6 +672,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL Windows)
set (qpidcommon_platform_SOURCES
qpid/log/windows/SinkOptions.cpp
qpid/sys/windows/AsynchIO.cpp
+ qpid/sys/windows/Path.cpp
qpid/sys/windows/FileSysDir.cpp
qpid/sys/windows/IocpPoller.cpp
qpid/sys/windows/IOHandle.cpp
@@ -766,6 +767,7 @@ else (CMAKE_SYSTEM_NAME STREQUAL Windows)
set (qpidcommon_platform_SOURCES
qpid/sys/posix/AsynchIO.cpp
qpid/sys/posix/Fork.cpp
+ qpid/sys/posix/Path.cpp
qpid/sys/posix/FileSysDir.cpp
qpid/sys/posix/IOHandle.cpp
qpid/sys/posix/LockFile.cpp
diff --git a/qpid/cpp/src/qpid/acl/AclPlugin.cpp b/qpid/cpp/src/qpid/acl/AclPlugin.cpp
index c666eb5420..2e254f7a9a 100644
--- a/qpid/cpp/src/qpid/acl/AclPlugin.cpp
+++ b/qpid/cpp/src/qpid/acl/AclPlugin.cpp
@@ -21,6 +21,7 @@
#include "qpid/broker/Broker.h"
#include "qpid/Plugin.h"
#include "qpid/Options.h"
+#include "qpid/sys/Path.h"
#include "qpid/log/Statement.h"
#include <boost/shared_ptr.hpp>
@@ -68,11 +69,11 @@ struct AclPlugin : public Plugin {
if (acl) throw Exception("ACL plugin cannot be initialized twice in one process.");
- if (values.aclFile.at(0) != '/' && !b.getDataDir().getPath().empty()) {
- std::ostringstream oss;
- oss << b.getDataDir().getPath() << "/" << values.aclFile;
- values.aclFile = oss.str();
- }
+ sys::Path aclFile(values.aclFile);
+ sys::Path dataDir(b.getDataDir().getPath());
+ if (!aclFile.isAbsolute() && !dataDir.empty())
+ values.aclFile = (dataDir + aclFile).str();
+
acl = new Acl(values, b);
b.setAcl(acl.get());
b.addFinalizer(boost::bind(&AclPlugin::shutdown, this));
diff --git a/qpid/cpp/src/qpid/sys/Path.h b/qpid/cpp/src/qpid/sys/Path.h
new file mode 100644
index 0000000000..9b440b3c00
--- /dev/null
+++ b/qpid/cpp/src/qpid/sys/Path.h
@@ -0,0 +1,61 @@
+#ifndef QPID_SYS_PATH_H
+#define QPID_SYS_PATH_H
+
+/*
+ * 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/CommonImportExport.h"
+#include <string>
+
+namespace qpid {
+namespace sys {
+
+/**
+ * @class Path
+ *
+ * Represents a filesystem path with some basic operations. Can be extended.
+ */
+class QPID_COMMON_CLASS_EXTERN Path {
+
+ std::string path;
+
+ public:
+ // Path separator, forward or backslash
+ static const QPID_COMMON_EXTERN std::string separator;
+
+ Path(const std::string& path_=std::string()) : path(path_) {}
+
+ std::string str() const { return path; }
+ bool empty() const { return path.empty(); }
+
+ QPID_COMMON_EXTERN bool exists() const;
+ QPID_COMMON_EXTERN bool isFile() const;
+ QPID_COMMON_EXTERN bool isDirectory() const;
+ QPID_COMMON_EXTERN bool isAbsolute() const;
+
+ /** Join with appropriate path separator. */
+ Path& operator+=(const Path& tail) { path = path + separator + tail.path; return *this; }
+};
+
+inline Path operator+(const Path& head, const Path& tail) { Path p(head); return p += tail; }
+
+}} // namespace qpid::sys
+
+#endif /*!QPID_SYS_PATH_H*/
diff --git a/qpid/cpp/src/qpid/sys/posix/Path.cpp b/qpid/cpp/src/qpid/sys/posix/Path.cpp
new file mode 100644
index 0000000000..984551379c
--- /dev/null
+++ b/qpid/cpp/src/qpid/sys/posix/Path.cpp
@@ -0,0 +1,64 @@
+/*
+ *
+ * Copyright (c) 2006 The Apache Software Foundation
+ *
+ * Licensed 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/Path.h"
+#include "qpid/sys/StrError.h"
+#include "qpid/Exception.h"
+
+#include <sys/stat.h>
+#include <errno.h>
+
+#include <sys/types.h>
+
+
+
+namespace qpid {
+namespace sys {
+
+const std::string Path::separator("/");
+
+namespace {
+// Return true for success, false for ENOENT, throw otherwise.
+bool getStat(const std::string& path, struct ::stat& s) {
+ if (::stat(path.c_str(), &s)) {
+ if (errno == ENOENT) return false;
+ throw Exception(strError(errno) + ": Invalid path: " + path);
+ }
+ return true;
+}
+
+bool isFlag(const std::string& path, unsigned long flag) {
+ struct ::stat s;
+ return getStat(path, s) && (s.st_mode & flag);
+}
+}
+
+bool Path::exists () const {
+ struct ::stat s;
+ return getStat(path, s);
+}
+
+bool Path::isFile() const { return isFlag(path, S_IFREG); }
+bool Path::isDirectory() const { return isFlag(path, S_IFDIR); }
+
+bool Path::isAbsolute() const {
+ return (path.size() > 0 && (path[0] == separator[0] || path[0] == '/'))
+ || (path.size() > 1 && (isalpha(path[0]) && path[1] == ':'));
+}
+
+}} // namespace qpid::sys
diff --git a/qpid/cpp/src/qpid/sys/windows/Path.cpp b/qpid/cpp/src/qpid/sys/windows/Path.cpp
new file mode 100644
index 0000000000..ce04bb17fd
--- /dev/null
+++ b/qpid/cpp/src/qpid/sys/windows/Path.cpp
@@ -0,0 +1,65 @@
+/*
+ *
+ * Copyright (c) 2006 The Apache Software Foundation
+ *
+ * Licensed 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/Path.h"
+#include "qpid/sys/StrError.h"
+#include "qpid/Exception.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <direct.h>
+#include <errno.h>
+#include <windows.h>
+#include <strsafe.h>
+
+
+namespace qpid {
+namespace sys {
+
+const std::string Path::separator("\\");
+
+namespace {
+// Return true for success, false for ENOENT, throw otherwise.
+bool getStat(const std::string& path, struct _stat& s) {
+ if (::_stat(path.c_str(), &s)) {
+ if (errno == ENOENT) return false;
+ throw qpid::Exception (strError(errno) + ": Invalid path: " + path);
+ }
+ return true;
+}
+
+bool isFlag(const std::string& path, unsigned long flag) {
+ struct _stat s;
+ return getStat(path, s) && (s.st_mode & flag);
+}
+}
+
+bool Path::exists () const {
+ struct _stat s;
+ return getStat(path, s);
+}
+
+bool Path::isFile() const { return isFlag(path, _S_IFREG); }
+bool Path::isDirectory() const { return isFlag(path, _S_IFDIR); }
+
+bool Path::isAbsolute() const {
+ return (path.size() > 0 && (path[0] == separator[0] || path[0] == '/'))
+ || (path.size() > 1 && (isalpha(path[0]) && path[1] == ':'));
+}
+
+}} // namespace qpid::sys