extern int sysfs_scanf(struct sysfs_cxt *cxt, const char *attr,
const char *fmt, ...)
__attribute__ ((format (scanf, 3, 4)));
-extern int64_t sysfs_read_s64(struct sysfs_cxt *cxt, const char *attr);
-extern uint64_t sysfs_read_u64(struct sysfs_cxt *cxt, const char *attr);
-extern int sysfs_read_int(struct sysfs_cxt *cxt, const char *attr);
+
+extern int sysfs_read_s64(struct sysfs_cxt *cxt, const char *attr, int64_t *res);
+extern int sysfs_read_u64(struct sysfs_cxt *cxt, const char *attr, uint64_t *res);
+extern int sysfs_read_int(struct sysfs_cxt *cxt, const char *attr, int *res);
+
extern char *sysfs_strdup(struct sysfs_cxt *cxt, const char *attr);
extern int sysfs_count_dirents(struct sysfs_cxt *cxt, const char *attr);
return rc;
}
-int64_t sysfs_read_s64(struct sysfs_cxt *cxt, const char *attr)
+int sysfs_read_s64(struct sysfs_cxt *cxt, const char *attr, int64_t *res)
{
- uint64_t x;
- return sysfs_scanf(cxt, attr, "%"SCNd64, &x) == 1 ? x : 0;
+ int64_t x = 0;
+
+ if (sysfs_scanf(cxt, attr, "%"SCNd64, &x) == 1) {
+ if (res)
+ *res = x;
+ return 0;
+ }
+ return -1;
}
-uint64_t sysfs_read_u64(struct sysfs_cxt *cxt, const char *attr)
+int sysfs_read_u64(struct sysfs_cxt *cxt, const char *attr, uint64_t *res)
{
- uint64_t x;
- return sysfs_scanf(cxt, attr, "%"SCNu64, &x) == 1 ? x : 0;
+ uint64_t x = 0;
+
+ if (sysfs_scanf(cxt, attr, "%"SCNu64, &x) == 1) {
+ if (res)
+ *res = x;
+ return 0;
+ }
+ return -1;
}
-int sysfs_read_int(struct sysfs_cxt *cxt, const char *attr)
+int sysfs_read_int(struct sysfs_cxt *cxt, const char *attr, int *res)
{
- int x;
- return sysfs_scanf(cxt, attr, "%d", &x) == 1 ? x : 0;
+ int x = 0;
+
+ if (sysfs_scanf(cxt, attr, "%d", &x) == 1) {
+ if (res)
+ *res = x;
+ return 0;
+ }
+ return -1;
}
char *sysfs_strdup(struct sysfs_cxt *cxt, const char *attr)
char *devname;
dev_t devno;
char path[PATH_MAX];
+ int i;
+ uint64_t u64;
if (argc != 2)
errx(EXIT_FAILURE, "usage: %s <devname>", argv[0]);
sysfs_init(&cxt, devno, NULL);
printf("SLAVES: %d\n", sysfs_count_dirents(&cxt, "slaves"));
- printf("SIZE: %jd\n", sysfs_read_u64(&cxt, "size"));
- printf("SECTOR: %d\n", sysfs_read_int(&cxt, "queue/hw_sector_size"));
+
+ if (sysfs_read_u64(&cxt, "size", &u64))
+ printf("read SIZE failed");
+ else
+ printf("SIZE: %jd\n", u64);
+
+ if (sysfs_read_int(&cxt, "queue/hw_sector_size", &i))
+ printf("read SECTOR failed");
+ else
+ printf("SECTOR: %d\n", i);
return EXIT_SUCCESS;
}
} else {
const char *type = cxt->partition ? "part" : "disk";
+ int x = 0;
- switch (sysfs_read_int(&cxt->sysfs, "device/type")) {
+ sysfs_read_int(&cxt->sysfs, "device/type", &x);
+
+ switch (x) {
case 0x0c: /* TYPE_RAID */
type = "raid"; break;
case 0x01: /* TYPE_TAPE */
type = "rbc"; break;
}
- res = xstrdup(type);
+ res = xstrdup(type);
}
for (p = res; p && *p; p++)
cxt->maj = major(devno);
cxt->min = minor(devno);
- cxt->size = sysfs_read_u64(&cxt->sysfs, "size") << 9;
- cxt->discard = sysfs_read_int(&cxt->sysfs, "queue/discard_granularity");
+ sysfs_read_u64(&cxt->sysfs, "size", &cxt->size); /* in sectors */
+ cxt->size <<= 9; /* in bytes */
+
+ sysfs_read_int(&cxt->sysfs, "queue/discard_granularity", &cxt->discard);
/* Ignore devices of zero size */
if (!lsblk->all_devices && cxt->size == 0)
while((d = readdir(dir))) {
struct sysfs_cxt sysfs;
- int removable;
+ int removable = 0;
dev_t devno;
#ifdef _DIRENT_HAVE_D_TYPE
continue;
sysfs_init(&sysfs, devno, NULL);
- removable = sysfs_read_int(&sysfs, "removable");
+ sysfs_read_int(&sysfs, "removable", &removable);
sysfs_deinit(&sysfs);
if (removable)
{
struct sysfs_cxt sysfs;
uint64_t start, size;
- int i;
+ int i, rc;
if (sysfs_init(&sysfs, devno, NULL))
return NULL;
- start = sysfs_read_u64(&sysfs, "start");
- size = sysfs_read_u64(&sysfs, "size");
+ rc = sysfs_read_u64(&sysfs, "start", &start);
+ if (!rc)
+ rc = sysfs_read_u64(&sysfs, "size", &size);
sysfs_deinit(&sysfs);
+ if (rc)
+ return NULL;
+
for (i = 0; i < ls->nparts; i++) {
blkid_partition par = &ls->parts[i];
}
if (val->set_ulong) {
- uint64_t data = sysfs_read_u64(&sysfs, val->attr);
+ uint64_t data;
+
+ if (sysfs_read_u64(&sysfs, val->attr, &data) != 0)
+ continue;
rc = val->set_ulong(pr, (unsigned long) data);
} else if (val->set_int) {
- int64_t data = sysfs_read_s64(&sysfs, val->attr);
+ int64_t data;
+
+ if (sysfs_read_s64(&sysfs, val->attr, &data) != 0)
+ continue;
rc = val->set_int(pr, (int) data);
}