You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2013/12/05 21:34:21 UTC

svn commit: r1548279 - in /qpid/trunk/qpid/cpp/src: CMakeLists.txt qpid/acl/AclPlugin.cpp qpid/sys/Path.h qpid/sys/posix/Path.cpp qpid/sys/windows/Path.cpp

Author: aconway
Date: Thu Dec  5 20:34:21 2013
New Revision: 1548279

URL: http://svn.apache.org/r1548279
Log:
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.

Added:
    qpid/trunk/qpid/cpp/src/qpid/sys/Path.h   (with props)
    qpid/trunk/qpid/cpp/src/qpid/sys/posix/Path.cpp   (with props)
    qpid/trunk/qpid/cpp/src/qpid/sys/windows/Path.cpp   (with props)
Modified:
    qpid/trunk/qpid/cpp/src/CMakeLists.txt
    qpid/trunk/qpid/cpp/src/qpid/acl/AclPlugin.cpp

Modified: qpid/trunk/qpid/cpp/src/CMakeLists.txt
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/CMakeLists.txt?rev=1548279&r1=1548278&r2=1548279&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/CMakeLists.txt (original)
+++ qpid/trunk/qpid/cpp/src/CMakeLists.txt Thu Dec  5 20:34:21 2013
@@ -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

Modified: qpid/trunk/qpid/cpp/src/qpid/acl/AclPlugin.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/acl/AclPlugin.cpp?rev=1548279&r1=1548278&r2=1548279&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/acl/AclPlugin.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/acl/AclPlugin.cpp Thu Dec  5 20:34:21 2013
@@ -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));

Added: qpid/trunk/qpid/cpp/src/qpid/sys/Path.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/Path.h?rev=1548279&view=auto
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/Path.h (added)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/Path.h Thu Dec  5 20:34:21 2013
@@ -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*/

Propchange: qpid/trunk/qpid/cpp/src/qpid/sys/Path.h
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: qpid/trunk/qpid/cpp/src/qpid/sys/Path.h
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: qpid/trunk/qpid/cpp/src/qpid/sys/posix/Path.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/posix/Path.cpp?rev=1548279&view=auto
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/posix/Path.cpp (added)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/posix/Path.cpp Thu Dec  5 20:34:21 2013
@@ -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

Propchange: qpid/trunk/qpid/cpp/src/qpid/sys/posix/Path.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: qpid/trunk/qpid/cpp/src/qpid/sys/posix/Path.cpp
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: qpid/trunk/qpid/cpp/src/qpid/sys/windows/Path.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/windows/Path.cpp?rev=1548279&view=auto
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/windows/Path.cpp (added)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/windows/Path.cpp Thu Dec  5 20:34:21 2013
@@ -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

Propchange: qpid/trunk/qpid/cpp/src/qpid/sys/windows/Path.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: qpid/trunk/qpid/cpp/src/qpid/sys/windows/Path.cpp
------------------------------------------------------------------------------
    svn:keywords = Rev Date



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org