static char* find_mount_point(char *block)
{
- FILE *fp = fopen("/proc/mounts", "r");
+ FILE *fp = fopen("/proc/self/mountinfo", "r");
static char line[256];
int len = strlen(block);
- char *point = NULL;
+ char *point = NULL, *pos, *tmp, *cpoint, *devname;
+ struct stat s;
+ int rstat;
+ unsigned int minor, major;
- if(!fp)
+ if (!fp)
return NULL;
+ rstat = stat(block, &s);
+
while (fgets(line, sizeof(line), fp)) {
- if (!strncmp(line, block, len)) {
- char *p = &line[len + 1];
- char *t = strstr(p, " ");
+ pos = strchr(line, ' ');
+ if (!pos)
+ continue;
- if (!t) {
- fclose(fp);
- return NULL;
- }
- *t = '\0';
- point = p;
+ pos = strchr(pos + 1, ' ');
+ if (!pos)
+ continue;
+
+ tmp = ++pos;
+ pos = strchr(pos, ':');
+ if (!pos)
+ continue;
+
+ *pos = '\0';
+ major = atoi(tmp);
+ tmp = ++pos;
+ pos = strchr(pos, ' ');
+ if (!pos)
+ continue;
+
+ *pos = '\0';
+ minor = atoi(tmp);
+ pos = strchr(pos + 1, ' ');
+ if (!pos)
+ continue;
+ tmp = ++pos;
+
+ pos = strchr(pos, ' ');
+ if (!pos)
+ continue;
+ *pos = '\0';
+ cpoint = tmp;
+
+ pos = strchr(pos + 1, ' ');
+ if (!pos)
+ continue;
+
+ pos = strchr(pos + 1, ' ');
+ if (!pos)
+ continue;
+
+ pos = strchr(pos + 1, ' ');
+ if (!pos)
+ continue;
+
+ tmp = ++pos;
+ pos = strchr(pos, ' ');
+ if (!pos)
+ continue;
+
+ *pos = '\0';
+ devname = tmp;
+ if (!strncmp(block, devname, len)) {
+ point = strdup(cpoint);
+ break;
+ }
+
+ if (rstat)
+ continue;
+
+ if (!S_ISBLK(s.st_mode))
+ continue;
+
+ if (major == major(s.st_rdev) &&
+ minor == minor(s.st_rdev)) {
+ point = strdup(cpoint);
break;
}
}
{
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);
+ free(mp);
return -1;
}
}
if (anon_mount) {
- char target[] = "/mnt/mmcblk123";
+ char target[32];
int err = 0;
snprintf(target, sizeof(target), "/mnt/%s", device);
ULOG_INFO("unmounted %s (%s)\n",
pr->dev, mp);
+ free(mp);
return err;
}
ULOG_ERR("umount of %s failed (%d) - %s\n",
mount_point, err, strerror(err));
+ free(mount_point);
return 0;
} else if (strcmp(action, "add")) {
ULOG_ERR("Unkown action %s\n", action);
tag, errno, strerror(errno));
fclose(fp);
- if (*uuid || !strcasecmp(uuid, pr->uuid))
+ if (*uuid && !strcasecmp(uuid, pr->uuid))
return 0;
ULOG_ERR("extroot: UUID mismatch (root: %s, %s: %s)\n",