summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/sys
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
commitad246c1d855b619604233f579ca6515899eacc02 (patch)
treeb7cac804983230c4eaa2689832d985f138557eff /cpp/src/qpid/sys
parent8e9390e1d25393553fa8fc3cdc397e7fd37a01f9 (diff)
downloadqpid-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.h61
-rw-r--r--cpp/src/qpid/sys/posix/Path.cpp64
-rw-r--r--cpp/src/qpid/sys/windows/Path.cpp65
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