#include #include #include #include #include "card.h" /* Read a 16-bit unsigned int from a pci id file */ unsigned short read_pci_id(char *device_path, char *field) { char buf[16]; char file_path[PATH_MAX]; strcpy(file_path, device_path); strcat(file_path, field); FILE *fp = fopen(file_path, "r"); if (fp == NULL) return 0; if (fgets(buf, sizeof(buf), fp) == NULL) { fclose(fp); return 0; } fclose(fp); return (unsigned short)strtoul(buf, NULL, 16); } char *read_nvidia_pci_address(char *device_path) { char file_path[PATH_MAX]; char *ret = calloc(16 + 1, sizeof(char)); /* assuming pci ids could look as large as 00000000:0C:00.0 */ strcpy(file_path, device_path); strcat(file_path, "/name"); FILE *fp = fopen(file_path, "r"); if (fp == NULL) { free(ret); return NULL; } fscanf(fp, "NVIDIA i2c adapter %*u at %16s", ret); fclose(fp); if (strlen(ret) == 0) { free(ret); return NULL; } return ret; }