static struct blkid_struct_probe* _probe_path(char *path)
{
struct blkid_struct_probe *pr;
+ char tmppath[64];
+
+ /* skip ubi device if ubiblock device is present */
+ if (path[5] == 'u' && path[6] == 'b' && path[7] == 'i' &&
+ path[8] >= '0' && path[8] <= '9' ) {
+ snprintf(tmppath, sizeof(tmppath), "/dev/ubiblock%s", path + 8);
+ list_for_each_entry(pr, &devices, list)
+ if (!strcasecmp(pr->dev, tmppath))
+ return NULL;
+ }
pr = malloc(sizeof(*pr));
if (mtd) {
_cache_load("/dev/mtdblock*");
_cache_load("/dev/ubiblock*");
- _cache_load("/dev/ubi?*_?*");
+ _cache_load("/dev/ubi[0-9]*");
}
_cache_load("/dev/mmcblk*");
_cache_load("/dev/sd*");
static char* find_mount_point(char *block)
{
FILE *fp = fopen("/proc/mounts", "r");
- static char line[256];
+ static char line[256], *saveptr;
int len = strlen(block);
char *point = NULL;
+ struct stat s;
if(!fp)
return NULL;
fclose(fp);
+ if (point)
+ return point;
+
+ if (stat(block, &s))
+ return NULL;
+
+ if (!S_ISBLK(s.st_mode))
+ return NULL;
+
+ fp = fopen("/proc/self/mountinfo", "r");
+ if(!fp)
+ return NULL;
+
+ while (fgets(line, sizeof(line), fp)) {
+ strtok_r(line, " \t", &saveptr);
+ strtok_r(NULL, " \t", &saveptr);
+ if (atoi(strtok_r(NULL, ":", &saveptr)) == major(s.st_rdev) &&
+ atoi(strtok_r(NULL, " \t", &saveptr)) == minor(s.st_rdev)) {
+ strtok_r(NULL, " \t", &saveptr);
+ point = strtok_r(NULL, " \t", &saveptr);
+ break;
+ }
+ }
+
+ fclose(fp);
+
return point;
}
{
struct mount *m;
char *device;
+ char *mp;
if (!pr)
return -1;
if (hotplug && !auto_mount)
return -1;
- if (find_mount_point(pr->dev)) {
- ULOG_ERR("%s is already mounted\n", pr->dev);
+ mp = find_mount_point(pr->dev);
+ if (mp) {
+ ULOG_ERR("%s is already mounted on %s\n", pr->dev, mp);
return -1;
}
}
if (anon_mount) {
- char target[] = "/mnt/mmcblk123";
+ char target[32];
int err = 0;
snprintf(target, sizeof(target), "/mnt/%s", device);
ULOG_ERR("failed to stat %s\n", argv[i]);
continue;
}
- if (!S_ISBLK(s.st_mode)) {
+ if (!S_ISBLK(s.st_mode) && !(S_ISCHR(s.st_mode) && major(s.st_rdev) == 250)) {
ULOG_ERR("%s is not a block device\n", argv[i]);
continue;
}