int import_make_read_only(const char *path) { _cleanup_close_ int fd = 1; fd = open(path, O_RDONLY|O_NOCTTY|O_CLOEXEC); if (fd < 0) return log_error_errno(errno, "Failed to open %s: %m", path); return import_make_read_only_fd(fd); }
static int raw_import_finish(RawImport *i) { int r; assert(i); assert(i->output_fd >= 0); assert(i->temp_path); assert(i->final_path); /* In case this was a sparse file, make sure the file system is right */ if (i->written_uncompressed > 0) { if (ftruncate(i->output_fd, i->written_uncompressed) < 0) return log_error_errno(errno, "Failed to truncate file: %m"); } r = raw_import_maybe_convert_qcow2(i); if (r < 0) return r; if (S_ISREG(i->st.st_mode)) { (void) copy_times(i->input_fd, i->output_fd); (void) copy_xattr(i->input_fd, i->output_fd); } if (i->read_only) { r = import_make_read_only_fd(i->output_fd); if (r < 0) return r; } if (i->force_local) (void) rm_rf(i->final_path, REMOVE_ROOT|REMOVE_PHYSICAL|REMOVE_SUBVOLUME); r = rename_noreplace(AT_FDCWD, i->temp_path, AT_FDCWD, i->final_path); if (r < 0) return log_error_errno(r, "Failed to move image into place: %m"); free(i->temp_path); i->temp_path = NULL; return 0; }
static void raw_pull_job_on_finished(PullJob *j) { RawPull *i; int r; assert(j); assert(j->userdata); i = j->userdata; if (j == i->roothash_job) { if (j->error != 0) log_info_errno(j->error, "Root hash file could not be retrieved, proceeding without."); } else if (j == i->settings_job) { if (j->error != 0) log_info_errno(j->error, "Settings file could not be retrieved, proceeding without."); } else if (j->error != 0 && j != i->signature_job) { if (j == i->checksum_job) log_error_errno(j->error, "Failed to retrieve SHA256 checksum, cannot verify. (Try --verify=no?)"); else log_error_errno(j->error, "Failed to retrieve image file. (Wrong URL?)"); r = j->error; goto finish; } /* This is invoked if either the download completed * successfully, or the download was skipped because we * already have the etag. In this case ->etag_exists is * true. * * We only do something when we got all three files */ if (!raw_pull_is_done(i)) return; if (i->signature_job && i->checksum_job->style == VERIFICATION_PER_DIRECTORY && i->signature_job->error != 0) { log_error_errno(j->error, "Failed to retrieve signature file, cannot verify. (Try --verify=no?)"); r = i->signature_job->error; goto finish; } if (i->roothash_job) i->roothash_job->disk_fd = safe_close(i->roothash_job->disk_fd); if (i->settings_job) i->settings_job->disk_fd = safe_close(i->settings_job->disk_fd); r = raw_pull_determine_path(i, ".raw", &i->final_path); if (r < 0) goto finish; if (!i->raw_job->etag_exists) { /* This is a new download, verify it, and move it into place */ assert(i->raw_job->disk_fd >= 0); raw_pull_report_progress(i, RAW_VERIFYING); r = pull_verify(i->raw_job, i->roothash_job, i->settings_job, i->checksum_job, i->signature_job); if (r < 0) goto finish; raw_pull_report_progress(i, RAW_UNPACKING); r = raw_pull_maybe_convert_qcow2(i); if (r < 0) goto finish; raw_pull_report_progress(i, RAW_FINALIZING); r = import_make_read_only_fd(i->raw_job->disk_fd); if (r < 0) goto finish; r = rename_noreplace(AT_FDCWD, i->temp_path, AT_FDCWD, i->final_path); if (r < 0) { log_error_errno(r, "Failed to rename raw file to %s: %m", i->final_path); goto finish; } i->temp_path = mfree(i->temp_path); if (i->roothash_job && i->roothash_job->error == 0) { r = raw_pull_rename_auxiliary_file(i, ".roothash", &i->roothash_temp_path, &i->roothash_path); if (r < 0) goto finish; } if (i->settings_job && i->settings_job->error == 0) { r = raw_pull_rename_auxiliary_file(i, ".nspawn", &i->settings_temp_path, &i->settings_path); if (r < 0) goto finish; } } raw_pull_report_progress(i, RAW_COPYING); r = raw_pull_make_local_copy(i); if (r < 0) goto finish; r = 0; finish: if (i->on_finished) i->on_finished(i, r, i->userdata); else sd_event_exit(i->event, r); }