+ unit = unit_name_from_path(where, ".mount");
+ if (!unit)
+ return log_oom();
+
+ p = strjoin(arg_dest, "/", unit, NULL);
+ if (!p)
+ return log_oom();
+
+ f = fopen(p, "wxe");
+ if (!f) {
+ log_error("Failed to create unit file %s: %m", unit);
+ return -errno;
+ }
+
+ fprintf(f,
+ "# Automatically generated by systemd-gpt-auto-generator\n\n"
+ "[Unit]\n"
+ "Description=%s\n"
+ "Documentation=man:systemd-gpt-auto-generator(8)\n",
+ description);
+
+ if (post)
+ fprintf(f, "Before=%s\n", post);
+
+ r = generator_write_fsck_deps(f, arg_dest, what, where, fstype);
+ if (r < 0)
+ return r;
+
+ fprintf(f,
+ "\n"
+ "[Mount]\n"
+ "What=%s\n"
+ "Where=%s\n",
+ what, where);
+
+ if (fstype)
+ fprintf(f, "Type=%s\n", fstype);
+
+ fprintf(f, "Options=%s\n", rw ? "rw" : "ro");
+
+ fflush(f);
+ if (ferror(f)) {
+ log_error("Failed to write unit file %s: %m", p);
+ return -errno;
+ }
+
+ if (post) {
+ lnk = strjoin(arg_dest, "/", post, ".requires/", unit, NULL);
+ if (!lnk)
+ return log_oom();
+
+ mkdir_parents_label(lnk, 0755);
+ if (symlink(p, lnk) < 0) {
+ log_error("Failed to create symlink %s: %m", lnk);
+ return -errno;
+ }
+ }
+
+ return 0;
+}
+
+static int probe_and_add_mount(
+ const char *id,
+ const char *what,
+ const char *where,
+ bool rw,
+ const char *description,
+ const char *post) {
+
+ _cleanup_blkid_free_probe_ blkid_probe b = NULL;
+ const char *fstype;
+ int r;
+
+ assert(id);
+ assert(what);
+ assert(where);
+ assert(description);
+
+ if (path_is_mount_point(where, true) <= 0 &&
+ dir_is_empty(where) <= 0) {
+ log_debug("%s already populated, ignoring.", where);
+ return 0;
+ }
+
+ /* Let's check the partition type here, so that we know
+ * whether to do LUKS magic. */
+
+ errno = 0;
+ b = blkid_new_probe_from_filename(what);
+ if (!b) {
+ if (errno == 0)
+ return log_oom();
+ log_error("Failed to allocate prober: %m");
+ return -errno;
+ }
+
+ blkid_probe_enable_superblocks(b, 1);
+ blkid_probe_set_superblocks_flags(b, BLKID_SUBLKS_TYPE);
+
+ errno = 0;
+ r = blkid_do_safeprobe(b);
+ if (r == -2 || r == 1) /* no result or uncertain */
+ return 0;
+ else if (r != 0) {
+ if (errno == 0)
+ errno = EIO;
+ log_error("Failed to probe %s: %m", what);
+ return -errno;