static int sysfs_get_string(struct pci_dev *d, char *object, char *buf, int mandatory) { struct pci_access *a = d->access; int fd, n; char namebuf[OBJNAMELEN]; void (*warn)(char *msg, ...) = (mandatory ? a->error : a->warning); sysfs_obj_name(d, object, namebuf); fd = open(namebuf, O_RDONLY); if (fd < 0) { if (mandatory || errno != ENOENT) warn("Cannot open %s: %s", namebuf, strerror(errno)); return 0; } n = read(fd, buf, OBJBUFSIZE); close(fd); if (n < 0) { warn("Error reading %s: %s", namebuf, strerror(errno)); return 0; } if (n >= OBJBUFSIZE) { warn("Value in %s too long", namebuf); return 0; } buf[n] = 0; return 1; }
static void sysfs_get_resources(struct pci_dev *d) { struct pci_access *a = d->access; char namebuf[OBJNAMELEN], buf[256]; FILE *file; int i; sysfs_obj_name(d, "resource", namebuf); file = fopen(namebuf, "r"); if (!file) a->error("Cannot open %s: %s", namebuf, strerror(errno)); for (i = 0; i < 7; i++) { unsigned long long start, end, size; if (!fgets(buf, sizeof(buf), file)) break; if (sscanf(buf, "%llx %llx", &start, &end) != 2) a->error("Syntax error in %s", namebuf); if (start != (unsigned long long)(pciaddr_t) start || end != (unsigned long long)(pciaddr_t) end) { a->warning("Resource %d in %s has a 64-bit address, ignoring", i, namebuf); start = end = 0; } if (start) size = end - start + 1; else size = 0; if (i < 6) { d->base_addr[i] = start; d->size[i] = size; } else { d->rom_base_addr = start; d->rom_size = size; } } fclose(file); }
static int sysfs_get_value(struct pci_dev *d, char *object) { struct pci_access *a = d->access; int fd, n; char namebuf[OBJNAMELEN], buf[256]; sysfs_obj_name(d, object, namebuf); fd = open(namebuf, O_RDONLY); if (fd < 0) a->error("Cannot open %s: %s", namebuf, strerror(errno)); n = read(fd, buf, sizeof(buf)); close(fd); if (n < 0) a->error("Error reading %s: %s", namebuf, strerror(errno)); if (n >= (int) sizeof(buf)) a->error("Value in %s too long", namebuf); buf[n] = 0; return strtol(buf, NULL, 0); }
static int sysfs_setup(struct pci_dev *d, int rw) { struct pci_access *a = d->access; if (a->cached_dev != d || a->fd_rw < rw) { char namebuf[OBJNAMELEN]; if (a->fd >= 0) close(a->fd); sysfs_obj_name(d, "config", namebuf); a->fd_rw = a->writeable || rw; a->fd = open(namebuf, a->fd_rw ? O_RDWR : O_RDONLY); if (a->fd < 0) a->warning("Cannot open %s", namebuf); a->cached_dev = d; a->fd_pos = 0; } return a->fd; }
static void sysfs_get_resources(struct pci_dev *d) { struct pci_access *a = d->access; char namebuf[OBJNAMELEN], buf[256]; FILE *file; int i; sysfs_obj_name(d, "resource", namebuf); file = fopen(namebuf, "r"); if (!file) a->error("Cannot open %s: %s", namebuf, strerror(errno)); for (i = 0; i < 7; i++) { unsigned long long start, end, size, flags; if (!fgets(buf, sizeof(buf), file)) break; if (sscanf(buf, "%llx %llx %llx", &start, &end, &flags) != 3) a->error("Syntax error in %s", namebuf); if (end > start) size = end - start + 1; else size = 0; flags &= PCI_ADDR_FLAG_MASK; if (i < 6) { d->base_addr[i] = start | flags; d->size[i] = size; } else { d->rom_base_addr = start | flags; d->rom_size = size; } } fclose(file); }