/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ #pragma once /*** This file is part of systemd. Copyright 2015 Lennart Poettering systemd is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. systemd is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with systemd; If not, see . ***/ #include #include #include #include #include "macro.h" #include "curl-util.h" typedef struct ImportJob ImportJob; typedef void (*ImportJobFinished)(ImportJob *job); typedef int (*ImportJobOpenDisk)(ImportJob *job); typedef int (*ImportJobHeader)(ImportJob *job, const char *header, size_t sz); typedef void (*ImportJobProgress)(ImportJob *job); typedef enum ImportJobState { IMPORT_JOB_INIT, IMPORT_JOB_ANALYZING, /* Still reading into ->payload, to figure out what we have */ IMPORT_JOB_RUNNING, /* Writing to destination */ IMPORT_JOB_DONE, IMPORT_JOB_FAILED, _IMPORT_JOB_STATE_MAX, _IMPORT_JOB_STATE_INVALID = -1, } ImportJobState; #define IMPORT_JOB_STATE_IS_COMPLETE(j) (IN_SET((j)->state, IMPORT_JOB_DONE, IMPORT_JOB_FAILED)) typedef enum ImportJobCompression { IMPORT_JOB_UNCOMPRESSED, IMPORT_JOB_XZ, IMPORT_JOB_GZIP, IMPORT_JOB_BZIP2, _IMPORT_JOB_COMPRESSION_MAX, _IMPORT_JOB_COMPRESSION_INVALID = -1, } ImportJobCompression; struct ImportJob { ImportJobState state; int error; char *url; void *userdata; ImportJobFinished on_finished; ImportJobOpenDisk on_open_disk; ImportJobHeader on_header; ImportJobProgress on_progress; CurlGlue *glue; CURL *curl; struct curl_slist *request_header; char *etag; char **old_etags; bool etag_exists; uint64_t content_length; uint64_t written_compressed; uint64_t written_uncompressed; uint64_t uncompressed_max; uint64_t compressed_max; uint8_t *payload; size_t payload_size; size_t payload_allocated; int disk_fd; usec_t mtime; ImportJobCompression compressed; lzma_stream xz; z_stream gzip; bz_stream bzip2; unsigned progress_percent; usec_t start_usec; usec_t last_status_usec; bool allow_sparse; bool calc_checksum; gcry_md_hd_t checksum_context; char *checksum; }; int import_job_new(ImportJob **job, const char *url, CurlGlue *glue, void *userdata); ImportJob* import_job_unref(ImportJob *job); int import_job_begin(ImportJob *j); void import_job_curl_on_finished(CurlGlue *g, CURL *curl, CURLcode result); DEFINE_TRIVIAL_CLEANUP_FUNC(ImportJob*, import_job_unref);