X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fdevice-handler.c;h=142f6a490028508056415ab99e78f020f035b309;hp=fc280af186fb9d8e400bd59ef6a5b42b9118a39b;hb=03d135e3d7528184062cc16949febd76c393c30d;hpb=e28232f4b8941ccd151abaaae3f18c32400436f3 diff --git a/discover/device-handler.c b/discover/device-handler.c index fc280af..142f6a4 100644 --- a/discover/device-handler.c +++ b/discover/device-handler.c @@ -650,9 +650,10 @@ static struct discover_boot_option *find_boot_option_by_id( void device_handler_boot(struct device_handler *handler, struct boot_command *cmd) { - struct discover_boot_option *opt; + struct discover_boot_option *opt = NULL; - opt = find_boot_option_by_id(handler, cmd->option_id); + if (cmd->option_id && strlen(cmd->option_id)) + opt = find_boot_option_by_id(handler, cmd->option_id); boot(handler, opt, cmd, handler->dry_run, boot_status, handler); } @@ -721,12 +722,15 @@ static bool check_existing_mount(struct discover_device *dev) continue; if (mntstat.st_rdev == devstat.st_rdev) { - pb_debug("%s: %s is already mounted at %s\n" - __func__, dev->device_path, - mnt->mnt_dir); dev->mount_path = talloc_strdup(dev, mnt->mnt_dir); + dev->mounted_rw = !!hasmntopt(mnt, "rw"); dev->mounted = true; dev->unmount = false; + + pb_debug("%s: %s is already mounted (r%c) at %s\n", + __func__, dev->device_path, + dev->mounted_rw ? 'w' : 'o', + mnt->mnt_dir); break; } } @@ -763,6 +767,7 @@ static int mount_device(struct discover_device *dev) "-o", "ro", NULL); if (!rc) { dev->mounted = true; + dev->mounted_rw = false; dev->unmount = true; return 0; } @@ -773,6 +778,7 @@ static int mount_device(struct discover_device *dev) if (!rc) { dev->mounted = true; + dev->mounted_rw = true; dev->unmount = true; return 0; } @@ -798,13 +804,47 @@ static int umount_device(struct discover_device *dev) return -1; dev->mounted = false; + + pb_rmdir_recursive(mount_base(), dev->mount_path); + talloc_free(dev->mount_path); dev->mount_path = NULL; - pb_rmdir_recursive(mount_base(), dev->mount_path); + return 0; +} + +int device_request_write(struct discover_device *dev, bool *release) +{ + int rc; + + *release = false; + + if (!dev->mounted) + return -1; + if (dev->mounted_rw) + return 0; + + rc = process_run_simple(dev, pb_system_apps.mount, dev->mount_path, + "-o", "remount,rw", NULL); + if (rc) + return -1; + + dev->mounted_rw = true; + *release = true; return 0; } + +void device_release_write(struct discover_device *dev, bool release) +{ + if (!release) + return; + + process_run_simple(dev, pb_system_apps.mount, dev->mount_path, + "-o", "remount,ro", NULL); + dev->mounted_rw = false; +} + #else static int umount_device(struct discover_device *dev __attribute__((unused))) @@ -818,5 +858,17 @@ static int __attribute__((unused)) mount_device( return 0; } +int device_request_write(struct discover_device *dev __attribute__((unused)), + bool *release) +{ + *release = true; + return 0; +} + +void device_release_write(struct discover_device *dev __attribute__((unused)), + bool release __attribute__((unused))) +{ +} + #endif