File crypt-loop-file.patch of Package systemd

Index: systemd-195/src/cryptsetup/cryptsetup-generator.c
===================================================================
--- systemd-195.orig/src/cryptsetup/cryptsetup-generator.c
+++ systemd-195/src/cryptsetup/cryptsetup-generator.c
@@ -136,7 +136,7 @@ static int create_disk(
                 const char *password,
                 const char *options) {
 
-        char *p = NULL, *n = NULL, *d = NULL, *u = NULL, *from = NULL, *to = NULL, *e = NULL;
+        char *p = NULL, *n = NULL, *d = NULL, *u = NULL, *from = NULL, *to = NULL, *e = NULL, *path_file = NULL;
         int r;
         FILE *f = NULL;
         bool noauto, nofail;
@@ -168,11 +168,63 @@ static int create_disk(
                 goto fail;
         }
 
-        d = unit_name_from_path(u, ".device");
-        if (!d) {
-                r = -ENOMEM;
-                log_error("Failed to allocate device name.");
-                goto fail;
+        if (!startswith(device,"/dev/")) {
+               char *e;
+
+               d = strdup(n);
+               if (!d) {
+                       r = -ENOMEM;
+                       log_error("Failed to allocate path name.");
+                       goto fail;
+               }
+
+               e = endswith(d,".service");
+               if (!e) {
+                       r = -ENOMEM;
+                       log_error("Failed to modify path name.");
+                       goto fail;
+               }
+
+               *e = 0;
+
+               d = strcat(d,".path");
+               if (asprintf(&path_file, "%s/%s", arg_dest, d) < 0) {
+                       r = -ENOMEM;
+                       log_error("Failed to allocate unit file name.");
+                       goto fail;
+               }
+
+               f = fopen(path_file, "wxe");
+               if (!f) {
+                       r = -errno;
+                       log_error("Failed to create unit file %s: %m", path_file);
+                       goto fail;
+               }
+
+               fprintf(f,
+                       "[Unit]\n"
+                       "Description=Cryptography Setup for %s\n"
+                       "DefaultDependencies=no\n"
+                       "[Path]\n"
+                       "PathExists=%s\n",
+                       device, device);
+
+               fflush(f);
+
+               if (ferror(f)) {
+                       r = -errno;
+                       log_error("Failed to write file: %m");
+                       goto fail;
+               }
+
+               f = NULL;
+        } else {
+               d = unit_name_from_path(u, ".device");
+               if (!d) {
+                       r = -ENOMEM;
+                       log_error("Failed to allocate device name.");
+                       goto fail;
+               }
         }
 
         f = fopen(p, "wxe");
@@ -298,6 +350,7 @@ fail:
         free(n);
         free(d);
         free(e);
+        free(path_file);
 
         free(from);
         free(to);
openSUSE Build Service is sponsored by