On Tue 11 Jun 2024, Paul Slootman wrote:

> This works for me. Patch attached.

I see I missed the case lseek() fails with another errno.
Updated patch attached.


Paul
--- library/meminfo.c.orig	2023-07-11 11:09:18.436786212 +0200
+++ library/meminfo.c	2024-06-11 13:11:12.878627527 +0200
@@ -646,12 +646,20 @@
     // clear out the soon to be 'current' values
     memset(&info->hist.new, 0, sizeof(struct meminfo_data));
 
-    if (-1 == info->meminfo_fd
-    && (-1 == (info->meminfo_fd = open(MEMINFO_FILE, O_RDONLY))))
-        return 1;
-
-    if (lseek(info->meminfo_fd, 0L, SEEK_SET) == -1)
-        return 1;
+    if (-1 == info->meminfo_fd) {
+    	if (-1 == (info->meminfo_fd = open(MEMINFO_FILE, O_RDONLY)))
+	    return 1;
+    }
+    else {
+	if (lseek(info->meminfo_fd, 0L, SEEK_SET) == -1)
+	    if (ESPIPE == errno) {
+		close(info->meminfo_fd);
+		if (-1 == (info->meminfo_fd = open(MEMINFO_FILE, O_RDONLY)))
+		    return 1;
+	    }
+	    else
+		return 1;
+    }
 
     for (;;) {
         if ((size = read(info->meminfo_fd, buf, sizeof(buf)-1)) < 0) {

Reply via email to