summaryrefslogtreecommitdiffstats
path: root/src/disk.c
diff options
context:
space:
mode:
authorPali Rohár <pali.rohar@gmail.com>2014-11-21 16:33:28 +0100
committerPali Rohár <pali.rohar@gmail.com>2014-11-21 16:33:28 +0100
commit5fd07554487c4383103372f4e12bf8f74d5f8171 (patch)
treec8b2bd6229aedb1c65eb094ddf992a7451be66a5 /src/disk.c
parentbebb608bc842060a58c1ad71ac0f22b6cd597364 (diff)
download0xFFFF-5fd07554487c4383103372f4e12bf8f74d5f8171.tar.bz2
disk: Find emmc device in disk_init()
Diffstat (limited to 'src/disk.c')
-rw-r--r--src/disk.c89
1 files changed, 88 insertions, 1 deletions
diff --git a/src/disk.c b/src/disk.c
index 1a63ae1..30d2d29 100644
--- a/src/disk.c
+++ b/src/disk.c
@@ -226,7 +226,94 @@ int disk_flash_dev(int fd, const char * file) {
int disk_init(struct usb_device_info * dev) {
- (void)dev;
+ int fd;
+ int maj;
+ int min;
+
+ maj = -1;
+ min = -1;
+
+ FILE * f;
+ DIR * dir;
+ struct dirent * dirent;
+ char buf[1024];
+ unsigned int devnum;
+ unsigned int busnum;
+
+ struct usb_device * device;
+
+ device = usb_device(dev->udev);
+ if ( ! device || ! device->bus ) {
+ ERROR_INFO("Cannot read usb devnum and busnum");
+ return -1;
+ }
+
+ dir = opendir("/sys/dev/block/");
+ if ( ! dir ) {
+ ERROR_INFO("Cannot open '/sys/dev/block/' directory");
+ return -1;
+ }
+
+ while ( ( dirent = readdir(dir) ) ) {
+
+ if ( strncmp(dirent->d_name, ".", sizeof(".")) == 0 || strncmp(dirent->d_name, "..", sizeof("..")) == 0 )
+ continue;
+
+ if ( snprintf(buf, sizeof(buf), "/sys/dev/block/%s/device/../../../../busnum", dirent->d_name) <= 0 )
+ continue;
+
+ f = fopen(buf, "r");
+ if ( ! f )
+ continue;
+
+ if ( fscanf(f, "%u", &busnum) != 1 ) {
+ fclose(f);
+ continue;
+ }
+
+ fclose(f);
+
+ if ( snprintf(buf, sizeof(buf), "/sys/dev/block/%s/device/../../../../devnum", dirent->d_name) <= 0 )
+ continue;
+
+ f = fopen(buf, "r");
+ if ( ! f )
+ continue;
+
+ if ( fscanf(f, "%u", &devnum) != 1 ) {
+ fclose(f);
+ continue;
+ }
+
+ fclose(f);
+
+ if ( devnum != device->devnum || device->bus->location != busnum )
+ continue;
+
+ if ( sscanf(dirent->d_name, "%d:%d", &maj, &min) != 2 ) {
+ maj = -1;
+ min = -1;
+ continue;
+ }
+
+ break;
+
+ }
+
+ closedir(dir);
+
+ if ( maj == -1 || min == -1 ) {
+ ERROR("Cannot find id for mmc block disk device");
+ return -1;
+ }
+
+ /* TODO: change 1 to 0 when disk_flash_dev will be implemented */
+ fd = disk_open_dev(maj, min, -1, 1);
+
+ if ( fd < 0 )
+ return -1;
+
+ dev->data = fd;
return 0;
}