]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - sysfs.c
Change way of printing name of a process
[thirdparty/mdadm.git] / sysfs.c
diff --git a/sysfs.c b/sysfs.c
index b7d41a579902d1dba3be49604336a391c1a068c5..ceab27f5eb1eb22f544bfc504e093eb2f08f6d43 100644 (file)
--- a/sysfs.c
+++ b/sysfs.c
@@ -413,8 +413,8 @@ int sysfs_set_str(struct mdinfo *sra, struct mdinfo *dev,
        n = write(fd, val, strlen(val));
        close(fd);
        if (n != strlen(val)) {
-               dprintf(Name ": failed to write '%s' to '%s' (%s)\n",
-                       val, fname, strerror(errno));
+               dprintf("%s: failed to write '%s' to '%s' (%s)\n",
+                       Name, val, fname, strerror(errno));
                return -1;
        }
        return 0;
@@ -450,8 +450,8 @@ int sysfs_uevent(struct mdinfo *sra, char *event)
        n = write(fd, event, strlen(event));
        close(fd);
        if (n != (int)strlen(event)) {
-               dprintf(Name ": failed to write '%s' to '%s' (%s)\n",
-                       event, fname, strerror(errno));
+               dprintf("%s: failed to write '%s' to '%s' (%s)\n",
+                       Name, event, fname, strerror(errno));
                return -1;
        }
        return 0;
@@ -513,6 +513,49 @@ int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev,
        return n;
 }
 
+int sysfs_fd_get_two(int fd, unsigned long long *v1, unsigned long long *v2)
+{
+       /* two numbers in this sysfs file, either
+        *  NNN (NNN)
+        * or
+        *  NNN / NNN
+        */
+       char buf[80];
+       int n;
+       char *ep, *ep2;
+
+       lseek(fd, 0, 0);
+       n = read(fd, buf, sizeof(buf));
+       if (n <= 0)
+               return -2;
+       buf[n] = 0;
+       *v1 = strtoull(buf, &ep, 0);
+       if (ep == buf || (*ep != 0 && *ep != '\n' && *ep != ' '))
+               return -1;
+       while (*ep == ' ' || *ep == '/' || *ep == '(')
+               ep++;
+       *v2 = strtoull(ep, &ep2, 0);
+       if (ep2 == ep || (*ep2 != 0 && *ep2 != '\n' && *ep2 != ' ' && *ep2 != ')')) {
+               *v2 = *v1;
+               return 1;
+       }
+       return 2;
+}
+
+int sysfs_get_two(struct mdinfo *sra, struct mdinfo *dev,
+                 char *name, unsigned long long *v1, unsigned long long *v2)
+{
+       int n;
+       int fd;
+
+       fd = sysfs_get_fd(sra, dev, name);
+       if (fd < 0)
+               return -1;
+       n = sysfs_fd_get_two(fd, v1, v2);
+       close(fd);
+       return n;
+}
+
 int sysfs_fd_get_str(int fd, char *val, int size)
 {
        int n;
@@ -639,7 +682,7 @@ int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd, int resume)
                return rv;
 
        memset(nm, 0, sizeof(nm));
-       dname = devid2devnm(makedev(sd->disk.major, sd->disk.minor));
+       dname = devid2kname(makedev(sd->disk.major, sd->disk.minor));
        strcpy(sd->sys_name, "dev-");
        strcpy(sd->sys_name+4, dname);
 
@@ -861,15 +904,18 @@ int sysfs_wait(int fd, int *msec)
        else {
                struct timeval start, end, tv;
                gettimeofday(&start, NULL);
-               if (*msec < 1000)
+               if (*msec < 1000) {
+                       tv.tv_sec = 0;
                        tv.tv_usec = (*msec)*1000;
-               else
+               } else {
                        tv.tv_sec = (*msec)/1000;
+                       tv.tv_usec = 0;
+               }
                n = select(fd+1, NULL, NULL, &fds, &tv);
                gettimeofday(&end, NULL);
                end.tv_sec -= start.tv_sec;
                *msec -= (end.tv_sec * 1000 + end.tv_usec/1000
-                         - start.tv_usec/100) + 1;
+                         - start.tv_usec/1000) + 1;
        }
        return n;
 }