io: use proper base struct types for method implementations

cute-signatures
Timo Teräs 2019-12-18 10:00:29 +02:00
parent 695a2f8231
commit 6996b1ea75
5 changed files with 68 additions and 86 deletions

View File

@ -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)

View File

@ -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)
{
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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);