]> git.ozlabs.org Git - petitboot/blobdiff - discover/device-handler.c
po: Update help string and add untranslated strings
[petitboot] / discover / device-handler.c
index 9868e5112c419d2c8faad2ec34e9fdd25919830f..9de2a1901ea16b41f1f78513bec59cfbfc302f87 100644 (file)
@@ -897,7 +897,7 @@ out:
         * TRANSLATORS: the format specifier in this string is a Linux
         * device identifier, like 'sda1'
         */
-       status->message = talloc_asprintf(status,_("Processing %s complete\n"),
+       status->message = talloc_asprintf(status,_("Processing %s complete"),
                                dev->device->id);
        boot_status(handler, status);
 
@@ -936,7 +936,7 @@ int device_handler_dhcp(struct device_handler *handler,
         * TRANSLATORS: this format specifier will be the name of a network
         * device, like 'eth0'.
         */
-       status->message = talloc_asprintf(status,_("Processing %s complete\n"),
+       status->message = talloc_asprintf(status,_("Processing %s complete"),
                                dev->device->id);
        boot_status(handler, status);
 
@@ -1099,10 +1099,12 @@ static char *device_from_addr(void *ctx, struct pb_url *url)
 
        rc = process_run_sync(p);
 
-       if (rc) {
+       if (rc || p->exit_status) {
                /* ip has complained for some reason; most likely
                 * there is no route to the host - bail out */
-               pb_debug("%s: No route to %s\n",__func__,url->host);
+               pb_debug("%s: `ip` returns non-zero exit status\n", __func__);
+               pb_debug("ip buf: %s\n", p->stdout_buf);
+               process_release(p);
                return NULL;
        }
 
@@ -1125,9 +1127,8 @@ static char *device_from_addr(void *ctx, struct pb_url *url)
        return dev;
 }
 
-
 void device_handler_process_url(struct device_handler *handler,
-               const char *url)
+               const char *url, const char *mac, const char *ip)
 {
        struct discover_context *ctx;
        struct discover_device *dev;
@@ -1153,11 +1154,25 @@ void device_handler_process_url(struct device_handler *handler,
        event->type = EVENT_TYPE_USER;
        event->action = EVENT_ACTION_CONF;
 
-       event->params = talloc_array(event, struct param, 1);
-       param = &event->params[0];
-       param->name = talloc_strdup(event, "pxeconffile");
-       param->value = talloc_strdup(event, url);
-       event->n_params = 1;
+       if (url[strlen(url) - 1] == '/') {
+               event->params = talloc_array(event, struct param, 3);
+               param = &event->params[0];
+               param->name = talloc_strdup(event, "pxepathprefix");
+               param->value = talloc_strdup(event, url);
+               param = &event->params[1];
+               param->name = talloc_strdup(event, "mac");
+               param->value = talloc_strdup(event, mac);
+               param = &event->params[2];
+               param->name = talloc_strdup(event, "ip");
+               param->value = talloc_strdup(event, ip);
+               event->n_params = 3;
+       } else {
+               event->params = talloc_array(event, struct param, 1);
+               param = &event->params[0];
+               param->name = talloc_strdup(event, "pxeconffile");
+               param->value = talloc_strdup(event, url);
+               event->n_params = 1;
+       }
 
        pb_url = pb_url_parse(event, event->params->value);
        if (!pb_url || !pb_url->host) {
@@ -1272,6 +1287,28 @@ static inline const char *get_device_path(struct discover_device *dev)
        return dev->ramdisk ? dev->ramdisk->snapshot : dev->device_path;
 }
 
+static char *check_subvols(struct discover_device *dev)
+{
+       const char *fstype = discover_device_get_param(dev, "ID_FS_TYPE");
+       struct stat sb;
+       char *path;
+       int rc;
+
+       if (strncmp(fstype, "btrfs", strlen("btrfs")))
+               return dev->mount_path;
+
+       /* On btrfs a device's root may be under a subvolume path */
+       path = join_paths(dev, dev->mount_path, "@");
+       rc = stat(path, &sb);
+       if (!rc && S_ISDIR(sb.st_mode)) {
+               pb_debug("Using '%s' for btrfs root path\n", path);
+               return path;
+       }
+
+       talloc_free(path);
+       return dev->mount_path;
+}
+
 static bool check_existing_mount(struct discover_device *dev)
 {
        struct stat devstat, mntstat;
@@ -1313,6 +1350,7 @@ static bool check_existing_mount(struct discover_device *dev)
 
                if (mntstat.st_rdev == devstat.st_rdev) {
                        dev->mount_path = talloc_strdup(dev, mnt->mnt_dir);
+                       dev->root_path = check_subvols(dev);
                        dev->mounted_rw = !!hasmntopt(mnt, "rw");
                        dev->mounted = true;
                        dev->unmount = false;
@@ -1375,6 +1413,7 @@ static int mount_device(struct discover_device *dev)
                dev->mounted = true;
                dev->mounted_rw = false;
                dev->unmount = true;
+               dev->root_path = check_subvols(dev);
                return 0;
        }
 
@@ -1413,6 +1452,7 @@ static int umount_device(struct discover_device *dev)
 
        talloc_free(dev->mount_path);
        dev->mount_path = NULL;
+       dev->root_path = NULL;
 
        return 0;
 }
@@ -1472,7 +1512,6 @@ mount_ro:
 void device_release_write(struct discover_device *dev, bool release)
 {
        const char *fstype, *device_path;
-       int rc = 0;
 
        if (!release)
                return;
@@ -1495,10 +1534,9 @@ void device_release_write(struct discover_device *dev, bool release)
                device_path = get_device_path(dev);
        }
 
-       mount(device_path, dev->mount_path, fstype,
+       if (mount(device_path, dev->mount_path, fstype,
                        MS_RDONLY | MS_SILENT,
-                       fs_parameters(dev, MS_RDONLY));
-       if (rc)
+                       fs_parameters(dev, MS_RDONLY)))
                pb_log("Failed to remount %s read-only: %s\n",
                       device_path, strerror(errno));
        else