+ if (lseek(fd, 0, SEEK_SET) == (off_t) -1) {
+ log_error("Failed to seek on %s: %m", tmp);
+ goto uncompressed;
+ }
+
+#ifdef HAVE_XZ
+ /* If we will remove the coredump anyway, do not compress. */
+ if (maybe_remove_external_coredump(NULL, st.st_size) == 0
+ && arg_compression == COREDUMP_COMPRESSION_XZ) {
+
+ _cleanup_free_ char *fn2 = NULL;
+ char *tmp2;
+ _cleanup_close_ int fd2 = -1;
+
+ tmp2 = strappenda(tmp, ".xz");
+ fd2 = open(tmp2, O_CREAT|O_EXCL|O_RDWR|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW, 0640);
+ if (fd2 < 0) {
+ log_error("Failed to create file %s: %m", tmp2);
+ goto uncompressed;
+ }
+
+ r = compress_stream(fd, fd2, LZMA_PRESET_DEFAULT, -1);
+ if (r < 0) {
+ log_error("Failed to compress %s: %s", tmp2, strerror(-r));
+ unlink_noerrno(tmp2);
+ goto fail2;
+ }
+
+ fn2 = strappend(fn, ".xz");
+ if (!fn2) {
+ log_oom();
+ goto fail2;
+ }
+
+ r = fix_permissions(fd2, tmp2, fn2, info, uid);
+ if (r < 0)
+ goto fail2;
+
+ *ret_filename = fn2; /* compressed */
+ *ret_fd = fd; /* uncompressed */
+ *ret_size = st.st_size; /* uncompressed */
+
+ fn2 = NULL;
+ fd = -1;
+
+ return 0;
+
+ fail2:
+ unlink_noerrno(tmp2);