diff options
author | Matt Spinler <spinler@us.ibm.com> | 2017-02-28 10:02:16 -0600 |
---|---|---|
committer | Matt Spinler <spinler@us.ibm.com> | 2017-03-14 13:21:34 -0500 |
commit | 4e97ebea445eb89280f9c2745ccc87d0857f00c0 (patch) | |
tree | fa681085df961289b9f62d67d7bb306bb9c8fd63 | |
parent | 597e05c9cdd6c5dc767ec0b811e842bb48bda948 (diff) | |
download | openpower-proc-control-4e97ebea445eb89280f9c2745ccc87d0857f00c0.tar.gz openpower-proc-control-4e97ebea445eb89280f9c2745ccc87d0857f00c0.zip |
Add FileDescriptor class
A simple class to wrap a file descriptor so it can
be opened on construction and closed on destruction.
Change-Id: I16d481fdc91e99720acd9cabff3a3a4690d8a573
Signed-off-by: Matt Spinler <spinler@us.ibm.com>
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | filedescriptor.cpp | 49 | ||||
-rw-r--r-- | filedescriptor.hpp | 57 |
3 files changed, 107 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am index ef50fa1..cc2374a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -6,6 +6,7 @@ sbin_PROGRAMS = \ openpower_proc_control_SOURCES = \ proc_control.cpp \ p9_procedures.cpp \ + filedescriptor.cpp \ targeting.cpp openpower_proc_control_LDFLAGS = $(PHOSPHOR_LOGGING_LIBS) -lstdc++fs diff --git a/filedescriptor.cpp b/filedescriptor.cpp new file mode 100644 index 0000000..3b1b096 --- /dev/null +++ b/filedescriptor.cpp @@ -0,0 +1,49 @@ +/** + * Copyright © 2017 IBM Corporation + * + * 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 <stdexcept> +#include <unistd.h> +#include "filedescriptor.hpp" + +namespace openpower +{ +namespace p9_util +{ + +FileDescriptor::FileDescriptor(const std::string& path) +{ + fd = open(path.c_str(), O_RDWR | O_SYNC); + + if (fd < 0) + { + //Future: use a different exception to create an error log + char msg[200]; + sprintf(msg, "Failed to open FSI device path %s. errno = %d", + path.c_str(), errno); + throw std::runtime_error(msg); + } +} + + +FileDescriptor::~FileDescriptor() +{ + if (fd >= 0) + { + close(fd); + } +} + +} +} diff --git a/filedescriptor.hpp b/filedescriptor.hpp new file mode 100644 index 0000000..b03d314 --- /dev/null +++ b/filedescriptor.hpp @@ -0,0 +1,57 @@ +#pragma once + +#include <fcntl.h> +#include <string> + +namespace openpower +{ +namespace p9_util +{ + +/** + * Class to wrap a file descriptor. + * + * Opens the descriptor in the constructor, and + * then closes it when destroyed. + */ +class FileDescriptor +{ + public: + + FileDescriptor() = delete; + FileDescriptor(const FileDescriptor&) = delete; + FileDescriptor(FileDescriptor&&) = default; + FileDescriptor& operator=(const FileDescriptor) = delete; + FileDescriptor& operator=(FileDescriptor&&) = default; + + /** + * Creates a file descriptor by opening the device + * path passed in. + * + * @param path[in] - the device path that will be open + */ + FileDescriptor(const std::string& path); + + /** + * Closes the file. + */ + ~FileDescriptor(); + + /** + * The method to access the file descriptor value + */ + inline int operator()() const + { + return fd; + } + + private: + + /** + * The actual file descriptor + */ + int fd; +}; + +} +} |