44 static unsigned round_up(
unsigned n,
unsigned incr) {
45 return n + (incr - n % incr) % incr;
51 unsigned char *p = (
unsigned char*) rh;
64 int err = tar->
read(tar, data, size);
71 int err = tar->
write(tar, data, size);
80 for (i = 0; i < n; i++) {
81 err =
twrite(tar, &nul, 1);
91 unsigned chksum1, chksum2;
100 sscanf(rh->
checksum,
"%o", &chksum2);
101 if (chksum1 != chksum2) {
122 memset(rh, 0,
sizeof(*rh));
133 sprintf(rh->
checksum,
"%06o", chksum);
152 return "unknown error";
157 unsigned res = fwrite(data, 1, size, reinterpret_cast<FILE *>(tar->
stream));
162 unsigned res = fread(data, 1, size, reinterpret_cast<FILE *>(tar->
stream));
167 int res = fseek(reinterpret_cast<FILE *>(tar->
stream), offset, SEEK_SET);
172 fclose(reinterpret_cast<FILE *>(tar->
stream));
182 memset(tar, 0,
sizeof(*tar));
189 if ( strchr(mode,
'r') ) mode =
"rb";
190 if ( strchr(mode,
'w') ) mode =
"wb";
191 if ( strchr(mode,
'a') ) mode =
"ab";
193 tar->
stream = fopen(filename, mode);
212 return tar->
close(tar);
217 int err = tar->
seek(tar, pos);
254 if ( !strcmp(header.
name, name) ) {
276 err =
tread(tar, &rh,
sizeof(rh));
309 err =
tread(tar, ptr, size);
328 return twrite(tar, &rh,
sizeof(rh));
335 memset(&h, 0,
sizeof(h));
336 strcpy(h.
name, name);
348 memset(&h, 0,
sizeof(h));
349 strcpy(h.
name, name);
360 err =
twrite(tar, data, size);
static int file_write(mtar_t *tar, const void *data, unsigned size)
int mtar_next(mtar_t *tar)
int mtar_write_dir_header(mtar_t *tar, const char *name)
int mtar_write_file_header(mtar_t *tar, const char *name, unsigned size)
static int raw_to_header(mtar_header_t *h, const mtar_raw_header_t *rh)
int(* read)(mtar_t *tar, void *data, unsigned size)
int mtar_rewind(mtar_t *tar)
int mtar_write_header(mtar_t *tar, const mtar_header_t *h)
const char * mtar_strerror(int err)
static int file_seek(mtar_t *tar, unsigned offset)
static unsigned checksum(const mtar_raw_header_t *rh)
int mtar_finalize(mtar_t *tar)
static int file_close(mtar_t *tar)
int mtar_read_header(mtar_t *tar, mtar_header_t *h)
int mtar_find(mtar_t *tar, const char *name, mtar_header_t *h)
static int tread(mtar_t *tar, void *data, unsigned size)
static int write_null_bytes(mtar_t *tar, int n)
int(* close)(mtar_t *tar)
#define offsetof(type, member)
The offsetof macro is part of ANSI C, but many compilers lack it, for example "gcc -ansi"...
static int twrite(mtar_t *tar, const void *data, unsigned size)
int mtar_write_data(mtar_t *tar, const void *data, unsigned size)
static int file_read(mtar_t *tar, void *data, unsigned size)
int(* seek)(mtar_t *tar, unsigned pos)
int(* write)(mtar_t *tar, const void *data, unsigned size)
int mtar_read_data(mtar_t *tar, void *ptr, unsigned size)
static unsigned round_up(unsigned n, unsigned incr)
int mtar_open(mtar_t *tar, const char *filename, const char *mode)
int mtar_seek(mtar_t *tar, unsigned pos)
static int header_to_raw(mtar_raw_header_t *rh, const mtar_header_t *h)
int mtar_close(mtar_t *tar)