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 | ad246c1d855b619604233f579ca6515899eacc02 (patch) | |
| tree | b7cac804983230c4eaa2689832d985f138557eff /cpp/src/qpid/sys | |
| parent | 8e9390e1d25393553fa8fc3cdc397e7fd37a01f9 (diff) | |
| download | qpid-python-ad246c1d855b619604233f579ca6515899eacc02.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/qpid@1548279 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/sys')
| -rw-r--r-- | cpp/src/qpid/sys/Path.h | 61 | ||||
| -rw-r--r-- | cpp/src/qpid/sys/posix/Path.cpp | 64 | ||||
| -rw-r--r-- | cpp/src/qpid/sys/windows/Path.cpp | 65 |
3 files changed, 190 insertions, 0 deletions
diff --git a/cpp/src/qpid/sys/Path.h b/cpp/src/qpid/sys/Path.h new file mode 100644 index 0000000000..9b440b3c00 --- /dev/null +++ b/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/cpp/src/qpid/sys/posix/Path.cpp b/cpp/src/qpid/sys/posix/Path.cpp new file mode 100644 index 0000000000..984551379c --- /dev/null +++ b/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/cpp/src/qpid/sys/windows/Path.cpp b/cpp/src/qpid/sys/windows/Path.cpp new file mode 100644 index 0000000000..ce04bb17fd --- /dev/null +++ b/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 |
