io: use proper base struct types for method implementations
parent
695a2f8231
commit
6996b1ea75
22
src/apk_io.h
22
src/apk_io.h
|
@ -53,10 +53,14 @@ struct apk_file_info {
|
|||
struct apk_xattr_array *xattrs;
|
||||
};
|
||||
|
||||
struct apk_istream;
|
||||
struct apk_bstream;
|
||||
struct apk_ostream;
|
||||
|
||||
struct apk_istream_ops {
|
||||
void (*get_meta)(void *stream, struct apk_file_meta *meta);
|
||||
ssize_t (*read)(void *stream, void *ptr, size_t size);
|
||||
void (*close)(void *stream);
|
||||
void (*get_meta)(struct apk_istream *is, struct apk_file_meta *meta);
|
||||
ssize_t (*read)(struct apk_istream *is, void *ptr, size_t size);
|
||||
void (*close)(struct apk_istream *is);
|
||||
};
|
||||
|
||||
struct apk_istream {
|
||||
|
@ -67,9 +71,9 @@ struct apk_istream {
|
|||
#define APK_BSTREAM_EOF 0x0002
|
||||
|
||||
struct apk_bstream_ops {
|
||||
void (*get_meta)(void *stream, struct apk_file_meta *meta);
|
||||
apk_blob_t (*read)(void *stream, apk_blob_t token);
|
||||
void (*close)(void *stream, size_t *size);
|
||||
void (*get_meta)(struct apk_bstream *bs, struct apk_file_meta *meta);
|
||||
apk_blob_t (*read)(struct apk_bstream *bs, apk_blob_t token);
|
||||
void (*close)(struct apk_bstream *bs, size_t *size);
|
||||
};
|
||||
|
||||
struct apk_bstream {
|
||||
|
@ -78,8 +82,8 @@ struct apk_bstream {
|
|||
};
|
||||
|
||||
struct apk_ostream_ops {
|
||||
ssize_t (*write)(void *stream, const void *buf, size_t size);
|
||||
int (*close)(void *stream);
|
||||
ssize_t (*write)(struct apk_ostream *os, const void *buf, size_t size);
|
||||
int (*close)(struct apk_ostream *os);
|
||||
};
|
||||
|
||||
struct apk_ostream {
|
||||
|
@ -110,7 +114,7 @@ struct apk_istream *apk_istream_from_url_gz(const char *url);
|
|||
ssize_t apk_istream_skip(struct apk_istream *istream, size_t size);
|
||||
|
||||
#define APK_SPLICE_ALL 0xffffffff
|
||||
ssize_t apk_istream_splice(void *stream, int fd, size_t size,
|
||||
ssize_t apk_istream_splice(struct apk_istream *is, int fd, size_t size,
|
||||
apk_progress_cb cb, void *cb_ctx);
|
||||
|
||||
static inline struct apk_istream *apk_istream_from_fd(int fd)
|
||||
|
|
|
@ -89,20 +89,18 @@ struct apk_tar_entry_istream {
|
|||
time_t mtime;
|
||||
};
|
||||
|
||||
static void tar_entry_get_meta(void *stream, struct apk_file_meta *meta)
|
||||
static void tar_entry_get_meta(struct apk_istream *is, struct apk_file_meta *meta)
|
||||
{
|
||||
struct apk_tar_entry_istream *teis =
|
||||
container_of(stream, struct apk_tar_entry_istream, is);
|
||||
struct apk_tar_entry_istream *teis = container_of(is, struct apk_tar_entry_istream, is);
|
||||
*meta = (struct apk_file_meta) {
|
||||
.atime = teis->mtime,
|
||||
.mtime = teis->mtime,
|
||||
};
|
||||
}
|
||||
|
||||
static ssize_t tar_entry_read(void *stream, void *ptr, size_t size)
|
||||
static ssize_t tar_entry_read(struct apk_istream *is, void *ptr, size_t size)
|
||||
{
|
||||
struct apk_tar_entry_istream *teis =
|
||||
container_of(stream, struct apk_tar_entry_istream, is);
|
||||
struct apk_tar_entry_istream *teis = container_of(is, struct apk_tar_entry_istream, is);
|
||||
ssize_t r;
|
||||
|
||||
if (size > teis->bytes_left)
|
||||
|
@ -131,7 +129,7 @@ static ssize_t tar_entry_read(void *stream, void *ptr, size_t size)
|
|||
return r;
|
||||
}
|
||||
|
||||
static void tar_entry_close(void *stream)
|
||||
static void tar_entry_close(struct apk_istream *is)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
25
src/gunzip.c
25
src/gunzip.c
|
@ -30,10 +30,9 @@ struct apk_gzip_istream {
|
|||
apk_blob_t cbarg;
|
||||
};
|
||||
|
||||
static void gzi_get_meta(void *stream, struct apk_file_meta *meta)
|
||||
static void gzi_get_meta(struct apk_istream *is, struct apk_file_meta *meta)
|
||||
{
|
||||
struct apk_gzip_istream *gis =
|
||||
container_of(stream, struct apk_gzip_istream, is);
|
||||
struct apk_gzip_istream *gis = container_of(is, struct apk_gzip_istream, is);
|
||||
apk_bstream_get_meta(gis->bs, meta);
|
||||
}
|
||||
|
||||
|
@ -47,10 +46,9 @@ static int gzi_boundary_change(struct apk_gzip_istream *gis)
|
|||
return r;
|
||||
}
|
||||
|
||||
static ssize_t gzi_read(void *stream, void *ptr, size_t size)
|
||||
static ssize_t gzi_read(struct apk_istream *is, void *ptr, size_t size)
|
||||
{
|
||||
struct apk_gzip_istream *gis =
|
||||
container_of(stream, struct apk_gzip_istream, is);
|
||||
struct apk_gzip_istream *gis = container_of(is, struct apk_gzip_istream, is);
|
||||
int r;
|
||||
|
||||
if (gis->err != 0) {
|
||||
|
@ -134,10 +132,9 @@ ret:
|
|||
return size - gis->zs.avail_out;
|
||||
}
|
||||
|
||||
static void gzi_close(void *stream)
|
||||
static void gzi_close(struct apk_istream *is)
|
||||
{
|
||||
struct apk_gzip_istream *gis =
|
||||
container_of(stream, struct apk_gzip_istream, is);
|
||||
struct apk_gzip_istream *gis = container_of(is, struct apk_gzip_istream, is);
|
||||
|
||||
inflateEnd(&gis->zs);
|
||||
apk_bstream_close(gis->bs, NULL);
|
||||
|
@ -184,9 +181,9 @@ struct apk_gzip_ostream {
|
|||
z_stream zs;
|
||||
};
|
||||
|
||||
static ssize_t gzo_write(void *stream, const void *ptr, size_t size)
|
||||
static ssize_t gzo_write(struct apk_ostream *os, const void *ptr, size_t size)
|
||||
{
|
||||
struct apk_gzip_ostream *gos = (struct apk_gzip_ostream *) stream;
|
||||
struct apk_gzip_ostream *gos = container_of(os, struct apk_gzip_ostream, os);
|
||||
unsigned char buffer[1024];
|
||||
ssize_t have, r;
|
||||
|
||||
|
@ -209,9 +206,9 @@ static ssize_t gzo_write(void *stream, const void *ptr, size_t size)
|
|||
return size;
|
||||
}
|
||||
|
||||
static int gzo_close(void *stream)
|
||||
static int gzo_close(struct apk_ostream *os)
|
||||
{
|
||||
struct apk_gzip_ostream *gos = (struct apk_gzip_ostream *) stream;
|
||||
struct apk_gzip_ostream *gos = container_of(os, struct apk_gzip_ostream, os);
|
||||
unsigned char buffer[1024];
|
||||
size_t have;
|
||||
int r, rc = 0;
|
||||
|
@ -229,7 +226,7 @@ static int gzo_close(void *stream)
|
|||
rc = r;
|
||||
|
||||
deflateEnd(&gos->zs);
|
||||
free(stream);
|
||||
free(gos);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
83
src/io.c
83
src/io.c
|
@ -63,17 +63,15 @@ struct apk_fd_istream {
|
|||
int (*translate_status)(int status);
|
||||
};
|
||||
|
||||
static void fdi_get_meta(void *stream, struct apk_file_meta *meta)
|
||||
static void fdi_get_meta(struct apk_istream *is, struct apk_file_meta *meta)
|
||||
{
|
||||
struct apk_fd_istream *fis =
|
||||
container_of(stream, struct apk_fd_istream, is);
|
||||
struct apk_fd_istream *fis = container_of(is, struct apk_fd_istream, is);
|
||||
apk_file_meta_from_fd(fis->fd, meta);
|
||||
}
|
||||
|
||||
static ssize_t fdi_read(void *stream, void *ptr, size_t size)
|
||||
static ssize_t fdi_read(struct apk_istream *is, void *ptr, size_t size)
|
||||
{
|
||||
struct apk_fd_istream *fis =
|
||||
container_of(stream, struct apk_fd_istream, is);
|
||||
struct apk_fd_istream *fis = container_of(is, struct apk_fd_istream, is);
|
||||
ssize_t i = 0, r;
|
||||
|
||||
if (ptr == NULL) {
|
||||
|
@ -100,10 +98,9 @@ static ssize_t fdi_read(void *stream, void *ptr, size_t size)
|
|||
return i;
|
||||
}
|
||||
|
||||
static void fdi_close(void *stream)
|
||||
static void fdi_close(struct apk_istream *is)
|
||||
{
|
||||
struct apk_fd_istream *fis =
|
||||
container_of(stream, struct apk_fd_istream, is);
|
||||
struct apk_fd_istream *fis = container_of(is, struct apk_fd_istream, is);
|
||||
int status;
|
||||
|
||||
close(fis->fd);
|
||||
|
@ -165,11 +162,10 @@ ssize_t apk_istream_skip(struct apk_istream *is, size_t size)
|
|||
return done;
|
||||
}
|
||||
|
||||
ssize_t apk_istream_splice(void *stream, int fd, size_t size,
|
||||
ssize_t apk_istream_splice(struct apk_istream *is, int fd, size_t size,
|
||||
apk_progress_cb cb, void *cb_ctx)
|
||||
{
|
||||
static void *splice_buffer = NULL;
|
||||
struct apk_istream *is = (struct apk_istream *) stream;
|
||||
unsigned char *buf, *mmapbase = MAP_FAILED;
|
||||
size_t bufsz, done = 0, togo;
|
||||
ssize_t r;
|
||||
|
@ -234,17 +230,15 @@ struct apk_istream_bstream {
|
|||
size_t size;
|
||||
};
|
||||
|
||||
static void is_bs_get_meta(void *stream, struct apk_file_meta *meta)
|
||||
static void is_bs_get_meta(struct apk_bstream *bs, struct apk_file_meta *meta)
|
||||
{
|
||||
struct apk_istream_bstream *isbs =
|
||||
container_of(stream, struct apk_istream_bstream, bs);
|
||||
struct apk_istream_bstream *isbs = container_of(bs, struct apk_istream_bstream, bs);
|
||||
return apk_istream_get_meta(isbs->is, meta);
|
||||
}
|
||||
|
||||
static apk_blob_t is_bs_read(void *stream, apk_blob_t token)
|
||||
static apk_blob_t is_bs_read(struct apk_bstream *bs, apk_blob_t token)
|
||||
{
|
||||
struct apk_istream_bstream *isbs =
|
||||
container_of(stream, struct apk_istream_bstream, bs);
|
||||
struct apk_istream_bstream *isbs = container_of(bs, struct apk_istream_bstream, bs);
|
||||
ssize_t size;
|
||||
apk_blob_t ret;
|
||||
|
||||
|
@ -296,10 +290,9 @@ ret:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void is_bs_close(void *stream, size_t *size)
|
||||
static void is_bs_close(struct apk_bstream *bs, size_t *size)
|
||||
{
|
||||
struct apk_istream_bstream *isbs =
|
||||
container_of(stream, struct apk_istream_bstream, bs);
|
||||
struct apk_istream_bstream *isbs = container_of(bs, struct apk_istream_bstream, bs);
|
||||
|
||||
if (size != NULL)
|
||||
*size = isbs->size;
|
||||
|
@ -341,17 +334,15 @@ struct apk_mmap_bstream {
|
|||
apk_blob_t left;
|
||||
};
|
||||
|
||||
static void mmap_get_meta(void *stream, struct apk_file_meta *meta)
|
||||
static void mmap_get_meta(struct apk_bstream *bs, struct apk_file_meta *meta)
|
||||
{
|
||||
struct apk_mmap_bstream *mbs =
|
||||
container_of(stream, struct apk_mmap_bstream, bs);
|
||||
struct apk_mmap_bstream *mbs = container_of(bs, struct apk_mmap_bstream, bs);
|
||||
return apk_file_meta_from_fd(mbs->fd, meta);
|
||||
}
|
||||
|
||||
static apk_blob_t mmap_read(void *stream, apk_blob_t token)
|
||||
static apk_blob_t mmap_read(struct apk_bstream *bs, apk_blob_t token)
|
||||
{
|
||||
struct apk_mmap_bstream *mbs =
|
||||
container_of(stream, struct apk_mmap_bstream, bs);
|
||||
struct apk_mmap_bstream *mbs = container_of(bs, struct apk_mmap_bstream, bs);
|
||||
apk_blob_t ret;
|
||||
|
||||
if (!APK_BLOB_IS_NULL(token) && !APK_BLOB_IS_NULL(mbs->left)) {
|
||||
|
@ -366,10 +357,9 @@ static apk_blob_t mmap_read(void *stream, apk_blob_t token)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void mmap_close(void *stream, size_t *size)
|
||||
static void mmap_close(struct apk_bstream *bs, size_t *size)
|
||||
{
|
||||
struct apk_mmap_bstream *mbs =
|
||||
container_of(stream, struct apk_mmap_bstream, bs);
|
||||
struct apk_mmap_bstream *mbs = container_of(bs, struct apk_mmap_bstream, bs);
|
||||
|
||||
if (size != NULL)
|
||||
*size = mbs->size;
|
||||
|
@ -448,17 +438,15 @@ struct apk_tee_bstream {
|
|||
void *cb_ctx;
|
||||
};
|
||||
|
||||
static void tee_get_meta(void *stream, struct apk_file_meta *meta)
|
||||
static void tee_get_meta(struct apk_bstream *bs, struct apk_file_meta *meta)
|
||||
{
|
||||
struct apk_tee_bstream *tbs =
|
||||
container_of(stream, struct apk_tee_bstream, bs);
|
||||
struct apk_tee_bstream *tbs = container_of(bs, struct apk_tee_bstream, bs);
|
||||
apk_bstream_get_meta(tbs->inner_bs, meta);
|
||||
}
|
||||
|
||||
static apk_blob_t tee_read(void *stream, apk_blob_t token)
|
||||
static apk_blob_t tee_read(struct apk_bstream *bs, apk_blob_t token)
|
||||
{
|
||||
struct apk_tee_bstream *tbs =
|
||||
container_of(stream, struct apk_tee_bstream, bs);
|
||||
struct apk_tee_bstream *tbs = container_of(bs, struct apk_tee_bstream, bs);
|
||||
apk_blob_t blob;
|
||||
|
||||
blob = apk_bstream_read(tbs->inner_bs, token);
|
||||
|
@ -470,11 +458,10 @@ static apk_blob_t tee_read(void *stream, apk_blob_t token)
|
|||
return blob;
|
||||
}
|
||||
|
||||
static void tee_close(void *stream, size_t *size)
|
||||
static void tee_close(struct apk_bstream *bs, size_t *size)
|
||||
{
|
||||
struct apk_file_meta meta;
|
||||
struct apk_tee_bstream *tbs =
|
||||
container_of(stream, struct apk_tee_bstream, bs);
|
||||
struct apk_tee_bstream *tbs = container_of(bs, struct apk_tee_bstream, bs);
|
||||
|
||||
if (tbs->copy_meta) {
|
||||
apk_bstream_get_meta(tbs->inner_bs, &meta);
|
||||
|
@ -831,10 +818,9 @@ static ssize_t fdo_flush(struct apk_fd_ostream *fos)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t fdo_write(void *stream, const void *ptr, size_t size)
|
||||
static ssize_t fdo_write(struct apk_ostream *os, const void *ptr, size_t size)
|
||||
{
|
||||
struct apk_fd_ostream *fos =
|
||||
container_of(stream, struct apk_fd_ostream, os);
|
||||
struct apk_fd_ostream *fos = container_of(os, struct apk_fd_ostream, os);
|
||||
ssize_t r;
|
||||
|
||||
if (size + fos->bytes >= sizeof(fos->buffer)) {
|
||||
|
@ -855,10 +841,9 @@ static ssize_t fdo_write(void *stream, const void *ptr, size_t size)
|
|||
return size;
|
||||
}
|
||||
|
||||
static int fdo_close(void *stream)
|
||||
static int fdo_close(struct apk_ostream *os)
|
||||
{
|
||||
struct apk_fd_ostream *fos =
|
||||
container_of(stream, struct apk_fd_ostream, os);
|
||||
struct apk_fd_ostream *fos = container_of(os, struct apk_fd_ostream, os);
|
||||
int rc;
|
||||
|
||||
fdo_flush(fos);
|
||||
|
@ -937,19 +922,17 @@ struct apk_counter_ostream {
|
|||
off_t *counter;
|
||||
};
|
||||
|
||||
static ssize_t co_write(void *stream, const void *ptr, size_t size)
|
||||
static ssize_t co_write(struct apk_ostream *os, const void *ptr, size_t size)
|
||||
{
|
||||
struct apk_counter_ostream *cos =
|
||||
container_of(stream, struct apk_counter_ostream, os);
|
||||
struct apk_counter_ostream *cos = container_of(os, struct apk_counter_ostream, os);
|
||||
|
||||
*cos->counter += size;
|
||||
return size;
|
||||
}
|
||||
|
||||
static int co_close(void *stream)
|
||||
static int co_close(struct apk_ostream *os)
|
||||
{
|
||||
struct apk_counter_ostream *cos =
|
||||
container_of(stream, struct apk_counter_ostream, os);
|
||||
struct apk_counter_ostream *cos = container_of(os, struct apk_counter_ostream, os);
|
||||
|
||||
free(cos);
|
||||
return 0;
|
||||
|
|
12
src/url.c
12
src/url.c
|
@ -67,9 +67,9 @@ static int fetch_maperror(int ec)
|
|||
return map[ec];
|
||||
}
|
||||
|
||||
static void fetch_get_meta(void *stream, struct apk_file_meta *meta)
|
||||
static void fetch_get_meta(struct apk_istream *is, struct apk_file_meta *meta)
|
||||
{
|
||||
struct apk_fetch_istream *fis = container_of(stream, struct apk_fetch_istream, is);
|
||||
struct apk_fetch_istream *fis = container_of(is, struct apk_fetch_istream, is);
|
||||
|
||||
*meta = (struct apk_file_meta) {
|
||||
.atime = fis->urlstat.atime,
|
||||
|
@ -77,9 +77,9 @@ static void fetch_get_meta(void *stream, struct apk_file_meta *meta)
|
|||
};
|
||||
}
|
||||
|
||||
static ssize_t fetch_read(void *stream, void *ptr, size_t size)
|
||||
static ssize_t fetch_read(struct apk_istream *is, void *ptr, size_t size)
|
||||
{
|
||||
struct apk_fetch_istream *fis = container_of(stream, struct apk_fetch_istream, is);
|
||||
struct apk_fetch_istream *fis = container_of(is, struct apk_fetch_istream, is);
|
||||
ssize_t i = 0, r;
|
||||
|
||||
if (ptr == NULL) return apk_istream_skip(&fis->is, size);
|
||||
|
@ -94,9 +94,9 @@ static ssize_t fetch_read(void *stream, void *ptr, size_t size)
|
|||
return i;
|
||||
}
|
||||
|
||||
static void fetch_close(void *stream)
|
||||
static void fetch_close(struct apk_istream *is)
|
||||
{
|
||||
struct apk_fetch_istream *fis = container_of(stream, struct apk_fetch_istream, is);
|
||||
struct apk_fetch_istream *fis = container_of(is, struct apk_fetch_istream, is);
|
||||
|
||||
fetchIO_close(fis->fetchIO);
|
||||
free(fis);
|
||||
|
|
Loading…
Reference in New Issue