+
+ if (!isempty(argv[ARG_UID]))
+ if (fsetxattr(fd, "user.coredump.uid", argv[ARG_UID], strlen(argv[ARG_UID]), XATTR_CREATE) < 0)
+ r = -errno;
+
+ if (!isempty(argv[ARG_GID]))
+ if (fsetxattr(fd, "user.coredump.gid", argv[ARG_GID], strlen(argv[ARG_GID]), XATTR_CREATE) < 0)
+ r = -errno;
+
+ if (!isempty(argv[ARG_SIGNAL]))
+ if (fsetxattr(fd, "user.coredump.signal", argv[ARG_SIGNAL], strlen(argv[ARG_SIGNAL]), XATTR_CREATE) < 0)
+ r = -errno;
+
+ if (!isempty(argv[ARG_TIMESTAMP]))
+ if (fsetxattr(fd, "user.coredump.timestamp", argv[ARG_TIMESTAMP], strlen(argv[ARG_TIMESTAMP]), XATTR_CREATE) < 0)
+ r = -errno;
+
+ if (!isempty(argv[ARG_COMM]))
+ if (fsetxattr(fd, "user.coredump.comm", argv[ARG_COMM], strlen(argv[ARG_COMM]), XATTR_CREATE) < 0)
+ r = -errno;
+
+ return r;
+}
+
+#define filename_escape(s) xescape((s), "./")
+
+static int save_external_coredump(char **argv, uid_t uid, char **ret_filename, int *ret_fd, off_t *ret_size) {
+ _cleanup_free_ char *p = NULL, *t = NULL, *c = NULL, *fn = NULL, *tmp = NULL;
+ _cleanup_close_ int fd = -1;
+ sd_id128_t boot;
+ struct stat st;
+ int r;
+
+ assert(argv);
+ assert(ret_filename);
+ assert(ret_fd);
+ assert(ret_size);
+
+ c = filename_escape(argv[ARG_COMM]);
+ if (!c)
+ return log_oom();
+
+ p = filename_escape(argv[ARG_PID]);
+ if (!p)
+ return log_oom();
+
+ t = filename_escape(argv[ARG_TIMESTAMP]);
+ if (!t)
+ return log_oom();
+
+ r = sd_id128_get_boot(&boot);
+ if (r < 0) {
+ log_error("Failed to determine boot ID: %s", strerror(-r));
+ return r;