From ad246c1d855b619604233f579ca6515899eacc02 Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Thu, 5 Dec 2013 20:34:21 +0000 Subject: 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 --- cpp/src/qpid/sys/windows/Path.cpp | 65 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 cpp/src/qpid/sys/windows/Path.cpp (limited to 'cpp/src/qpid/sys/windows/Path.cpp') 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 +#include +#include +#include +#include +#include + + +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 -- cgit v1.2.1