iomem.c
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "klone_conf.h"
00012 #include <unistd.h>
00013 #include <u/libu.h>
00014 #include <klone/io.h>
00015 #include <klone/io.h>
00016 #include <klone/ioprv.h>
00017
00018 struct io_mem_s
00019 {
00020 struct io_s io;
00021 char *buf;
00022 size_t size;
00023 size_t off;
00024 int flags;
00025 };
00026
00027 typedef struct io_mem_s io_mem_t;
00028
00029 static ssize_t io_mem_read(io_mem_t *io, char *buf, size_t size);
00030 static ssize_t io_mem_write(io_mem_t *io, const char *buf, size_t size);
00031 static ssize_t io_mem_seek(io_mem_t *io, size_t off);
00032 static ssize_t io_mem_tell(io_mem_t *im);
00033 static int io_mem_close(io_mem_t *io);
00034 static int io_mem_free(io_mem_t *io);
00035
00036 static ssize_t io_mem_tell(io_mem_t *im)
00037 {
00038 dbg_return_if (im == NULL, -1);
00039
00040 return im->off;
00041 }
00042
00043 static ssize_t io_mem_seek(io_mem_t *im, size_t off)
00044 {
00045 dbg_return_if (im == NULL, -1);
00046
00047 if(off >= im->size)
00048 return -1;
00049
00050 im->off = off;
00051
00052 return off;
00053 }
00054
00055 static ssize_t io_mem_read(io_mem_t *im, char *buf, size_t size)
00056 {
00057 char *ptr;
00058 size_t sz;
00059
00060 dbg_return_if (im == NULL, -1);
00061 dbg_return_if (buf == NULL, -1);
00062
00063 sz = U_MIN(size, im->size - im->off);
00064 if(sz)
00065 {
00066 ptr = im->buf + im->off;
00067 memcpy(buf, ptr, sz);
00068 im->off += sz;
00069 }
00070
00071 return sz;
00072 }
00073
00074 static ssize_t io_mem_write(io_mem_t *im, const char *buf, size_t size)
00075 {
00076 char *ptr;
00077 size_t sz;
00078
00079 dbg_return_if (im == NULL, -1);
00080 dbg_return_if (buf == NULL, -1);
00081
00082 sz = U_MIN(size, im->size - im->off);
00083 if(sz)
00084 {
00085 ptr = im->buf + im->off;
00086 memcpy(ptr, buf, sz);
00087 im->off += sz;
00088 }
00089
00090 return sz;
00091 }
00092
00093 static int io_mem_close(io_mem_t *im)
00094 {
00095 return 0;
00096 }
00097
00098 static int io_mem_free(io_mem_t *im)
00099 {
00100 dbg_return_if (im == NULL, ~0);
00101
00102 if(im->flags & IO_MEM_FREE_BUF)
00103 {
00104 U_FREE(im->buf);
00105 im->buf = NULL;
00106 im->size = im->off = 0;
00107 }
00108
00109 return 0;
00110 }
00111
00112 size_t io_mem_get_bufsz(io_t *io)
00113 {
00114 io_mem_t *im = (io_mem_t*)io;
00115
00116 dbg_err_if(io == NULL);
00117 dbg_err_if(im->io.type != IO_TYPE_MEM);
00118
00119 return im->size;
00120 err:
00121 return 0;
00122 }
00123
00124 char *io_mem_get_buf(io_t *io)
00125 {
00126 io_mem_t *im = (io_mem_t*)io;
00127
00128 dbg_err_if(io == NULL);
00129 dbg_err_if(im->io.type != IO_TYPE_MEM);
00130
00131 return im->buf;
00132 err:
00133 return NULL;
00134 }
00135
00136 int io_mem_create(char *buf, size_t size, int flags, io_t **pio)
00137 {
00138 io_mem_t *im = NULL;
00139
00140 dbg_err_if (buf == NULL);
00141 dbg_err_if (pio == NULL);
00142
00143 dbg_err_if(io_create(io_mem_t, (io_t**)&im));
00144
00145 im->io.type = IO_TYPE_MEM;
00146
00147 im->buf = buf;
00148 im->size = size;
00149 im->flags = flags;
00150 im->off = 0;
00151 im->io.read = (io_read_op) io_mem_read;
00152 im->io.write = (io_write_op) io_mem_write;
00153 im->io.seek = (io_seek_op) io_mem_seek;
00154 im->io.tell = (io_tell_op) io_mem_tell;
00155 im->io.close = (io_close_op) io_mem_close;
00156 im->io.free = (io_free_op) io_mem_free;
00157
00158 *pio = (io_t*)im;
00159
00160 return 0;
00161 err:
00162 if(im)
00163 io_free((io_t *)im);
00164 return ~0;
00165 }