+ vlist_for_each_element(&mounts, m, node)
+ {
+ if (m->type != TYPE_SWAP || !m->target)
+ continue;
+
+ if (stat(m->target, &s) || !S_ISREG(s.st_mode))
+ continue;
+
+ pr = _probe_path(m->target);
+
+ if (!pr)
+ continue;
+
+ if (!strcmp(pr->id->name, "swap")) {
+ if (on)
+ swapon(pr->dev, m->prio);
+ else
+ swapoff(pr->dev);
+ }
+
+ free(pr);
+ }
+}
+
+static int mount_device(struct blkid_struct_probe *pr, int hotplug)
+{
+ struct mount *m;
+ char *device;
+
+ if (!pr)
+ return -1;
+
+ device = basename(pr->dev);
+
+ if (!strcmp(pr->id->name, "swap")) {
+ if (hotplug && !auto_swap)
+ return -1;
+ m = find_swap(pr->uuid, pr->label, device);
+ if (m || anon_swap)
+ swapon(pr->dev, (m) ? (m->prio) : (0));
+
+ return 0;
+ }
+
+ if (hotplug && !auto_mount)
+ return -1;
+
+ if (find_mount_point(pr->dev)) {
+ fprintf(stderr, "%s is already mounted\n", pr->dev);
+ return -1;
+ }
+
+ m = find_block(pr->uuid, pr->label, device, NULL);
+ if (m && m->extroot)
+ return -1;
+
+ if (m) {
+ char *target = m->target;
+ char _target[32];
+ int err = 0;
+
+ if (!target) {
+ snprintf(_target, sizeof(_target), "/mnt/%s", device);
+ target = _target;
+ }
+ mkdir_p(target);
+
+ if (check_fs)
+ check_filesystem(pr);
+
+ err = mount(pr->dev, target, pr->id->name, m->flags,
+ (m->options) ? (m->options) : (""));
+ if (err)
+ fprintf(stderr, "mounting %s (%s) as %s failed (%d) - %s\n",
+ pr->dev, pr->id->name, target, err, strerror(err));
+ else
+ handle_swapfiles(true);
+ return err;
+ }
+
+ if (anon_mount) {
+ char target[] = "/mnt/mmcblk123";
+ int err = 0;
+
+ snprintf(target, sizeof(target), "/mnt/%s", device);
+ mkdir_p(target);
+
+ if (check_fs)
+ check_filesystem(pr);
+
+ err = mount(pr->dev, target, pr->id->name, 0, "");
+ if (err)
+ fprintf(stderr, "mounting %s (%s) as %s failed (%d) - %s\n",
+ pr->dev, pr->id->name, target, err, strerror(err));
+ else
+ handle_swapfiles(true);
+ return err;
+ }
+
+ return 0;
+}
+
+static int umount_device(struct blkid_struct_probe *pr)
+{
+ struct mount *m;
+ char *device = basename(pr->dev);
+ char *mp;
+ int err;
+
+ if (!pr)
+ return -1;
+
+ if (!strcmp(pr->id->name, "swap"))
+ return -1;
+
+ mp = find_mount_point(pr->dev);
+ if (!mp)
+ return -1;
+
+ m = find_block(pr->uuid, pr->label, device, NULL);
+ if (m && m->extroot)
+ return -1;
+
+ err = umount2(mp, MNT_DETACH);
+ if (err)
+ fprintf(stderr, "unmounting %s (%s) failed (%d) - %s\n",
+ pr->dev, mp, err, strerror(err));
+ else
+ fprintf(stderr, "unmounted %s (%s)\n",
+ pr->dev, mp);
+
+ return err;
+}
+
+static int main_hotplug(int argc, char **argv)
+{
+ char path[32];
+ char *action, *device, *mount_point;
+