summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/sys/posix
diff options
context:
space:
mode:
authorStephen D. Huston <shuston@apache.org>2008-10-07 15:19:50 +0000
committerStephen D. Huston <shuston@apache.org>2008-10-07 15:19:50 +0000
commit4eb2dca5b9ae07228f542cd798b44cc44ea96c09 (patch)
tree9d1de3abe8bca9ff0617432056217bfab12b00f5 /cpp/src/qpid/sys/posix
parentcdae2a877123056b69a91dd8ca2196577654de2d (diff)
downloadqpid-python-4eb2dca5b9ae07228f542cd798b44cc44ea96c09.tar.gz
Abstract native file-locking and directory detection/creation to portable classes LockFile and FileSysDir; resolves QPID-1148
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@702513 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/sys/posix')
-rwxr-xr-xcpp/src/qpid/sys/posix/FileSysDir.cpp54
-rwxr-xr-xcpp/src/qpid/sys/posix/LockFile.cpp89
-rw-r--r--cpp/src/qpid/sys/posix/LockFile.h58
3 files changed, 143 insertions, 58 deletions
diff --git a/cpp/src/qpid/sys/posix/FileSysDir.cpp b/cpp/src/qpid/sys/posix/FileSysDir.cpp
new file mode 100755
index 0000000000..22dc487e74
--- /dev/null
+++ b/cpp/src/qpid/sys/posix/FileSysDir.cpp
@@ -0,0 +1,54 @@
+/*
+ *
+ * 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/FileSysDir.h"
+#include "qpid/sys/StrError.h"
+#include "qpid/Exception.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <cerrno>
+#include <unistd.h>
+
+namespace qpid {
+namespace sys {
+
+bool FileSysDir::exists (void) const
+{
+ const char *cpath = dirPath.c_str ();
+ struct stat s;
+ if (::stat(cpath, &s)) {
+ if (errno == ENOENT) {
+ return false;
+ }
+ throw qpid::Exception (strError(errno) +
+ ": Can't check directory: " + dirPath);
+ }
+ if (S_ISDIR(s.st_mode))
+ return true;
+ throw qpid::Exception(dirPath + " is not a directory");
+}
+
+void FileSysDir::mkdir(void)
+{
+ if (::mkdir(dirPath.c_str(), 0755))
+ throw Exception ("Can't create directory: " + dirPath);
+}
+
+}} // namespace qpid::sys
diff --git a/cpp/src/qpid/sys/posix/LockFile.cpp b/cpp/src/qpid/sys/posix/LockFile.cpp
new file mode 100755
index 0000000000..af9ecd7d66
--- /dev/null
+++ b/cpp/src/qpid/sys/posix/LockFile.cpp
@@ -0,0 +1,89 @@
+/*
+ *
+ * Copyright (c) 2008 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/LockFile.h"
+
+#include <string>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "check.h"
+
+namespace qpid {
+namespace sys {
+
+class LockFilePrivate {
+ friend class LockFile;
+
+ int fd;
+
+public:
+ LockFilePrivate(int f) : fd(f) {}
+};
+
+LockFile::LockFile(const std::string& path_, bool create)
+ : path(path_), created(create) {
+
+ errno = 0;
+ int flags=create ? O_WRONLY|O_CREAT|O_NOFOLLOW : O_RDWR;
+ int fd = ::open(path.c_str(), flags, 0644);
+ if (fd < 0) throw ErrnoException("Cannot open " + path, errno);
+ if (::lockf(fd, F_TLOCK, 0) < 0) {
+ ::close(fd);
+ throw ErrnoException("Cannot lock " + path, errno);
+ }
+ impl.reset(new LockFilePrivate(fd));
+}
+
+LockFile::~LockFile() {
+ if (impl) {
+ int f = impl->fd;
+ if (f >= 0) {
+ (void) ::lockf(f, F_ULOCK, 0); // Suppress warnings about ignoring return value.
+ ::close(f);
+ impl->fd = -1;
+ }
+ }
+}
+
+pid_t LockFile::readPid(void) const {
+ if (!impl)
+ throw Exception("Lock file not open");
+
+ pid_t pid;
+ int desired_read = sizeof(pid_t);
+ if (desired_read > ::read(impl->fd, &pid, desired_read) ) {
+ throw Exception("Cannot read lock file " + path);
+ }
+ return pid;
+}
+
+void LockFile::writePid(void) {
+ if (!impl)
+ throw Exception("Lock file not open");
+
+ pid_t pid = getpid();
+ int desired_write = sizeof(pid_t);
+ if (desired_write > ::write(impl->fd, &pid, desired_write)) {
+ throw Exception("Cannot write lock file " + path);
+ }
+}
+
+}} /* namespace qpid::sys */
diff --git a/cpp/src/qpid/sys/posix/LockFile.h b/cpp/src/qpid/sys/posix/LockFile.h
deleted file mode 100644
index 027735e759..0000000000
--- a/cpp/src/qpid/sys/posix/LockFile.h
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef _sys_posix_LockFile_h
-#define _sys_posix_LockFile_h
-
-#include "check.h"
-
-#include <boost/noncopyable.hpp>
-#include <string>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-/*
- *
- * Copyright (c) 2008 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.
- *
- */
-namespace qpid {
-namespace sys {
-
-class LockFile : private boost::noncopyable {
-public:
- LockFile(const std::string& path_, bool create):
- path(path_), fd(-1), created(create) {
- errno = 0;
- int flags=create ? O_WRONLY|O_CREAT|O_NOFOLLOW : O_RDWR;
- fd = ::open(path.c_str(), flags, 0644);
- if (fd < 0) throw ErrnoException("Cannot open " + path, errno);
- if (::lockf(fd, F_TLOCK, 0) < 0) throw ErrnoException("Cannot lock " + path, errno);
- }
-
- ~LockFile() {
- if (fd >= 0) {
- (void) ::lockf(fd, F_ULOCK, 0); // Suppress warnings about ignoring return value.
- ::close(fd);
- }
- }
-
- std::string path;
- int fd;
- bool created;
-};
-
-}
-}
-#endif /*!_sys_posix_LockFile_h*/