Seek to file offset 0 after reading error file

For a fd watching for data in sysfs file, a poll would return
immediately after read unless file is closed and re-opened OR
stream is seeked to 0. This commit chooses latter.

From stackoverflow:

Once poll/select indicates that the value has changed, you need to close and
re-open the file, or seek to 0 and read again.

Also, use EPOLLPRI | EPOLLERR than EPOLLIN as needed by sysfs_inotify

Change-Id: I243cdfd9a09c567eac5e52abd9980ebf90b94f89
Signed-off-by: Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com>
diff --git a/occ_errors.cpp b/occ_errors.cpp
index fe81f17..bc01c91 100644
--- a/occ_errors.cpp
+++ b/occ_errors.cpp
@@ -42,7 +42,7 @@
 {
     decltype(eventSource.get()) sourcePtr = nullptr;
     auto r = sd_event_add_io(event.get(), &sourcePtr, fd,
-                             EPOLLIN, processEvents, this);
+                             EPOLLPRI | EPOLLERR, processEvents, this);
     eventSource.reset(sourcePtr);
 
     if (r < 0)
@@ -150,6 +150,19 @@
             phosphor::logging::org::open_power::OCC::Device::
                 ReadFailure::CALLOUT_DEVICE_PATH(file.c_str()));
     }
+
+    // Need to seek to START, else the poll returns immediately telling
+    // there is data to be read
+    r = lseek(fd, 0, SEEK_SET);
+    if (r < 0)
+    {
+        log<level::ERR>("Failure seeking error file to START");
+        elog<ConfigFailure>(
+            phosphor::logging::org::open_power::OCC::Device::
+                ConfigFailure::CALLOUT_ERRNO(errno),
+            phosphor::logging::org::open_power::OCC::Device::
+                ConfigFailure::CALLOUT_DEVICE_PATH(file.c_str()));
+    }
     return std::string(data.get());
 }