106a0c2c4SMurulidhar Nataraju #pragma once
206a0c2c4SMurulidhar Nataraju 
306a0c2c4SMurulidhar Nataraju #include <unistd.h>
4*da79c9caSPatrick Venture 
5*da79c9caSPatrick Venture #include <sstream>
6*da79c9caSPatrick Venture 
706a0c2c4SMurulidhar Nataraju namespace openpower
806a0c2c4SMurulidhar Nataraju {
906a0c2c4SMurulidhar Nataraju namespace sbe
1006a0c2c4SMurulidhar Nataraju {
1106a0c2c4SMurulidhar Nataraju namespace internal
1206a0c2c4SMurulidhar Nataraju {
1306a0c2c4SMurulidhar Nataraju 
1406a0c2c4SMurulidhar Nataraju /** @class FileDescriptor
1506a0c2c4SMurulidhar Nataraju  *  @brief Provide RAII file descriptor
1606a0c2c4SMurulidhar Nataraju  */
1706a0c2c4SMurulidhar Nataraju class FileDescriptor
1806a0c2c4SMurulidhar Nataraju {
1906a0c2c4SMurulidhar Nataraju   private:
2006a0c2c4SMurulidhar Nataraju     /** @brief File descriptor for the SBE FIFO device */
2106a0c2c4SMurulidhar Nataraju     int fd = -1;
2206a0c2c4SMurulidhar Nataraju 
2306a0c2c4SMurulidhar Nataraju   public:
2406a0c2c4SMurulidhar Nataraju     FileDescriptor() = delete;
2506a0c2c4SMurulidhar Nataraju     FileDescriptor(const FileDescriptor&) = delete;
2606a0c2c4SMurulidhar Nataraju     FileDescriptor& operator=(const FileDescriptor&) = delete;
2706a0c2c4SMurulidhar Nataraju     FileDescriptor(FileDescriptor&&) = delete;
2806a0c2c4SMurulidhar Nataraju     FileDescriptor& operator=(FileDescriptor&&) = delete;
2906a0c2c4SMurulidhar Nataraju 
3006a0c2c4SMurulidhar Nataraju     /** @brief Opens the input file and saves the file descriptor
3106a0c2c4SMurulidhar Nataraju      *
3206a0c2c4SMurulidhar Nataraju      *  @param[in] devPath - Path of the file
3306a0c2c4SMurulidhar Nataraju      *  @para,[in] accessModes - File access modes
3406a0c2c4SMurulidhar Nataraju      */
FileDescriptor(const char * devPath,int accessModes)3506a0c2c4SMurulidhar Nataraju     FileDescriptor(const char* devPath, int accessModes)
3606a0c2c4SMurulidhar Nataraju     {
3706a0c2c4SMurulidhar Nataraju         fd = open(devPath, accessModes);
3806a0c2c4SMurulidhar Nataraju         if (fd < 0)
3906a0c2c4SMurulidhar Nataraju         {
4006a0c2c4SMurulidhar Nataraju             // TODO:use elog infrastructure
4106a0c2c4SMurulidhar Nataraju             std::ostringstream errMsg;
42*da79c9caSPatrick Venture             errMsg << "Opening the device with device path:" << devPath
43*da79c9caSPatrick Venture                    << " and access modes:" << accessModes
44*da79c9caSPatrick Venture                    << ",Failed with errno" << errno;
4506a0c2c4SMurulidhar Nataraju             throw std::runtime_error(errMsg.str().c_str());
4606a0c2c4SMurulidhar Nataraju         }
4706a0c2c4SMurulidhar Nataraju     }
4806a0c2c4SMurulidhar Nataraju 
4906a0c2c4SMurulidhar Nataraju     /** @brief Saves File descriptor and uses it to do file operation
5006a0c2c4SMurulidhar Nataraju      *
5106a0c2c4SMurulidhar Nataraju      *  @param[in] fd - File descriptor
5206a0c2c4SMurulidhar Nataraju      */
FileDescriptor(int fd)5306a0c2c4SMurulidhar Nataraju     FileDescriptor(int fd) : fd(fd)
5406a0c2c4SMurulidhar Nataraju     {
5506a0c2c4SMurulidhar Nataraju         // Nothing
5606a0c2c4SMurulidhar Nataraju     }
5706a0c2c4SMurulidhar Nataraju 
~FileDescriptor()5806a0c2c4SMurulidhar Nataraju     ~FileDescriptor()
5906a0c2c4SMurulidhar Nataraju     {
6006a0c2c4SMurulidhar Nataraju         if (fd >= 0)
6106a0c2c4SMurulidhar Nataraju         {
6206a0c2c4SMurulidhar Nataraju             close(fd);
6306a0c2c4SMurulidhar Nataraju         }
6406a0c2c4SMurulidhar Nataraju     }
6506a0c2c4SMurulidhar Nataraju 
operator ()()6606a0c2c4SMurulidhar Nataraju     int operator()()
6706a0c2c4SMurulidhar Nataraju     {
6806a0c2c4SMurulidhar Nataraju         return fd;
6906a0c2c4SMurulidhar Nataraju     }
7006a0c2c4SMurulidhar Nataraju };
7106a0c2c4SMurulidhar Nataraju 
7206a0c2c4SMurulidhar Nataraju } // namespace internal
7306a0c2c4SMurulidhar Nataraju } // namespace sbe
7406a0c2c4SMurulidhar Nataraju } // namespace openpower
75