summaryrefslogtreecommitdiff
path: root/sysfs.c
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2006-12-21 17:10:52 +1100
committerNeil Brown <neilb@suse.de>2006-12-21 17:10:52 +1100
commit8382f19bdcc6d2d1de92154e11129acdcaab10fa (patch)
tree3b3c93a6ad6189d6354de81714fc8959de8378f5 /sysfs.c
parent350f29f90d1f6bb3ddfafea368327911f9e8b27c (diff)
Add new mode: --incremental
--incremental allows arrays to be assembled one device at a time. This is expected to be used with udev.
Diffstat (limited to 'sysfs.c')
-rw-r--r--sysfs.c30
1 files changed, 24 insertions, 6 deletions
diff --git a/sysfs.c b/sysfs.c
index 25ede6b7..16744f1b 100644
--- a/sysfs.c
+++ b/sysfs.c
@@ -42,6 +42,18 @@ int load_sys(char *path, char *buf)
return 0;
}
+void sysfs_free(struct sysarray *sra)
+{
+ if (!sra)
+ return;
+ while (sra->devs) {
+ struct sysdev *d = sra->devs;
+ sra->devs = d->next;
+ free(d);
+ }
+ free(sra);
+}
+
struct sysarray *sysfs_read(int fd, int devnum, unsigned long options)
{
/* Longest possible name in sysfs, mounted at /sys, is
@@ -81,6 +93,16 @@ struct sysarray *sysfs_read(int fd, int devnum, unsigned long options)
base = fname + strlen(fname);
sra->devs = NULL;
+ if (options & GET_VERSION) {
+ strcpy(base, "metadata_version");
+ if (load_sys(fname, buf))
+ goto abort;
+ if (strncmp(buf, "none", 4) == 0)
+ sra->major_version = sra->minor_version = -1;
+ else
+ sscanf(buf, "%d.%d",
+ &sra->major_version, &sra->minor_version);
+ }
if (options & GET_LEVEL) {
strcpy(base, "level");
if (load_sys(fname, buf))
@@ -144,6 +166,7 @@ struct sysarray *sysfs_read(int fd, int devnum, unsigned long options)
goto abort;
dev->next = sra->devs;
sra->devs = dev;
+ strcpy(dev->name, de->d_name);
/* Always get slot, major, minor */
strcpy(dbase, "slot");
@@ -191,12 +214,7 @@ struct sysarray *sysfs_read(int fd, int devnum, unsigned long options)
return sra;
abort:
- while (sra && sra->devs) {
- dev = sra->devs;
- sra->devs = dev->next;
- free(dev);
- }
- if(sra) free(sra);
+ sysfs_free(sra);
return NULL;
}