diff options
| author | Alan Conway <aconway@apache.org> | 2013-12-05 20:34:21 +0000 |
|---|---|---|
| committer | Alan Conway <aconway@apache.org> | 2013-12-05 20:34:21 +0000 |
| commit | f444f2faa779e612cb1d051d54ba26dadba1bf56 (patch) | |
| tree | 01fab96dc49e0bd876bff010c14049d251109283 /qpid/cpp | |
| parent | ae253369fa099345d3839a53227845e86827bfae (diff) | |
| download | qpid-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')
| -rw-r--r-- | qpid/cpp/src/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/acl/AclPlugin.cpp | 11 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/sys/Path.h | 61 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/sys/posix/Path.cpp | 64 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/sys/windows/Path.cpp | 65 |
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 |
