2015-01-20 03:36:11 +03:00
/*-*- 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 < http : //www.gnu.org/licenses/>.
* * */
# include <lzma.h>
# include <zlib.h>
2015-01-21 15:43:55 +03:00
# include <bzlib.h>
2015-01-20 17:06:34 +03:00
# include <gcrypt.h>
2015-01-20 03:36:11 +03:00
# include "macro.h"
# include "curl-util.h"
typedef struct ImportJob ImportJob ;
typedef void ( * ImportJobFinished ) ( ImportJob * job ) ;
typedef int ( * ImportJobOpenDisk ) ( ImportJob * job ) ;
2015-01-21 22:03:57 +03:00
typedef int ( * ImportJobHeader ) ( ImportJob * job , const char * header , size_t sz ) ;
2015-01-20 03:36:11 +03:00
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 ;
2015-01-20 17:06:34 +03:00
# define IMPORT_JOB_STATE_IS_COMPLETE(j) (IN_SET((j)->state, IMPORT_JOB_DONE, IMPORT_JOB_FAILED))
2015-01-20 03:36:11 +03:00
typedef enum ImportJobCompression {
IMPORT_JOB_UNCOMPRESSED ,
IMPORT_JOB_XZ ,
IMPORT_JOB_GZIP ,
2015-01-21 15:43:55 +03:00
IMPORT_JOB_BZIP2 ,
2015-01-20 03:36:11 +03:00
_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 ;
2015-01-21 22:03:57 +03:00
ImportJobHeader on_header ;
2015-01-20 03:36:11 +03:00
CurlGlue * glue ;
CURL * curl ;
struct curl_slist * request_header ;
char * etag ;
char * * old_etags ;
2015-01-20 17:06:34 +03:00
bool etag_exists ;
2015-01-20 03:36:11 +03:00
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 ;
2015-01-21 15:43:55 +03:00
bz_stream bzip2 ;
2015-01-20 03:36:11 +03:00
unsigned progress_percent ;
usec_t start_usec ;
usec_t last_status_usec ;
bool allow_sparse ;
2015-01-20 17:06:34 +03:00
2015-01-21 05:46:01 +03:00
bool calc_checksum ;
gcry_md_hd_t checksum_context ;
2015-01-20 17:06:34 +03:00
2015-01-21 05:46:01 +03:00
char * checksum ;
2015-01-20 03:36:11 +03:00
} ;
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 ) ;
2015-01-21 05:46:01 +03:00
DEFINE_TRIVIAL_CLEANUP_FUNC ( ImportJob * , import_job_unref ) ;