static int readlink_recursive(const char *path, char *buf, size_t bufsize) { char temp[PATH_MAX + 1]; char *ptemp; int ret; ret = readlink(path, buf, bufsize-1); if (ret > 0) { buf[ret] = 0; if (*buf != '/') { strncpy(temp, path, sizeof(temp)); ptemp = temp + strlen(temp); while (*ptemp != '/' && ptemp != temp) ptemp--; ptemp++; strncpy(ptemp, buf, bufsize + temp - ptemp); } else strncpy(temp, buf, sizeof(temp)); return readlink_recursive(temp, buf, bufsize); } else { strncpy(buf, path, bufsize); return strlen(buf); } }
libusb_device *get_usb_device(libusb_context *ctx, const char *path) { libusb_device **list; libusb_device *dev; ssize_t num_devs, i; char device_path[PATH_MAX + 1]; char absolute_path[PATH_MAX + 1]; readlink_recursive(path, device_path, sizeof(device_path)); get_absolute_path(device_path, absolute_path, sizeof(absolute_path)); dev = NULL; num_devs = libusb_get_device_list(ctx, &list); for (i = 0; i < num_devs; ++i) { uint8_t bnum = libusb_get_bus_number(list[i]); uint8_t dnum = libusb_get_device_address(list[i]); snprintf(device_path, sizeof(device_path), "%s/%03u/%03u", devbususb, bnum, dnum); if (!strcmp(device_path, absolute_path)) { dev = list[i]; break; } } libusb_free_device_list(list, 0); return dev; }
struct usb_device *get_usb_device(const char *path) { struct usb_bus *bus; struct usb_device *dev; char device_path[PATH_MAX + 1]; char absolute_path[PATH_MAX + 1]; readlink_recursive(path, device_path, sizeof(device_path)); get_absolute_path(device_path, absolute_path, sizeof(absolute_path)); for (bus = usb_busses; bus; bus = bus->next) { for (dev = bus->devices; dev; dev = dev->next) { snprintf(device_path, sizeof(device_path), "%s/%s/%s", devbususb, bus->dirname, dev->filename); if (!strcmp(device_path, absolute_path)) return dev; } } return NULL; }
struct fstab *fstab_load(const char *path) { FILE *f = fopen(path, "r"); if(!f) { ERROR("Failed to open fstab %s\n", path); return NULL; } struct fstab *t = mzalloc(sizeof(struct fstab)); t->version = -1; const char *delim = " \t"; char *saveptr = NULL; char *p; char line[1024]; int len; struct fstab_part *part = NULL; while((p = fgets(line, sizeof(line), f))) { len = strlen(line); if(line[len-1] == '\n') line[len-1] = 0; while(isspace(*p)) ++p; if(*p == '#' || *p == 0) continue; part = mzalloc(sizeof(struct fstab_part)); if(!(p = strtok_r(line, delim, &saveptr))) { ERROR("Error first token\n"); goto fail; } if(t->version == -1) { if(strstr(p, "/dev/") == p) t->version = 2; else t->version = 1; } if(t->version == 2) part->device = readlink_recursive(p); else part->path = strdup (p); if(!(p = strtok_r(NULL, delim, &saveptr))) { ERROR("Error second token\n"); goto fail; } if(t->version == 2) part->path = strdup(p); else part->type = strdup(p); if(!(p = strtok_r(NULL, delim, &saveptr))) { ERROR("Error third token\n"); goto fail; } if(t->version == 2) part->type = strdup(p); else part->device = readlink_recursive(p); if((p = strtok_r(NULL, delim, &saveptr))) fstab_parse_options(p, part); if((p = strtok_r(NULL, delim, &saveptr))) part->options2 = strdup(p); // Check device if(!part->device) { if (strcmp(part->path, "/data") == 0 || strcmp(part->path, "/system") == 0 || strcmp(part->path, "/boot") == 0 || strcmp(part->path, "/cache") == 0) { ERROR("fstab: device for part %s does not exist!\n", part->path); } fstab_destroy_part(part); part = NULL; continue; } list_add(part, &t->parts); ++t->count; part = NULL; } fclose(f); return t; fail: fclose(f); free(part); fstab_destroy(t); return NULL; }