Example #1
0
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);
	}
}
Example #2
0
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;
}
Example #3
0
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;
}	
Example #4
0
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;
}