1/**
 2 * Copyright (c) 2017 rxi
 3 *
 4 * This library is free software; you can redistribute it and/or modify it
 5 * under the terms of the MIT license. See `microtar.c` for details.
 6 */
 7
 8#ifndef MICROTAR_H
 9#define MICROTAR_H
10
11#include <stdio.h>
12#include <stdlib.h>
13
14#define MTAR_VERSION "0.1.0"
15
16enum {
17  MTAR_ESUCCESS     =  0,
18  MTAR_EFAILURE     = -1,
19  MTAR_EOPENFAIL    = -2,
20  MTAR_EREADFAIL    = -3,
21  MTAR_EWRITEFAIL   = -4,
22  MTAR_ESEEKFAIL    = -5,
23  MTAR_EBADCHKSUM   = -6,
24  MTAR_ENULLRECORD  = -7,
25  MTAR_ENOTFOUND    = -8
26};
27
28enum {
29  MTAR_TREG   = '0',
30  MTAR_TLNK   = '1',
31  MTAR_TSYM   = '2',
32  MTAR_TCHR   = '3',
33  MTAR_TBLK   = '4',
34  MTAR_TDIR   = '5',
35  MTAR_TFIFO  = '6'
36};
37
38typedef struct {
39  unsigned mode;
40  unsigned owner;
41  unsigned size;
42  unsigned mtime;
43  unsigned type;
44  char name[100];
45  char linkname[100];
46} mtar_header_t;
47
48
49typedef struct mtar_t mtar_t;
50
51struct mtar_t {
52  int (*read)(mtar_t *tar, void *data, unsigned size);
53  int (*write)(mtar_t *tar, const void *data, unsigned size);
54  int (*seek)(mtar_t *tar, unsigned pos);
55  int (*close)(mtar_t *tar);
56  void *stream;
57  unsigned pos;
58  unsigned remaining_data;
59  unsigned last_header;
60};
61
62
63const char* mtar_strerror(int err);
64
65int mtar_open(mtar_t *tar, const char *filename, const char *mode);
66int mtar_close(mtar_t *tar);
67
68int mtar_seek(mtar_t *tar, unsigned pos);
69int mtar_rewind(mtar_t *tar);
70int mtar_next(mtar_t *tar);
71int mtar_find(mtar_t *tar, const char *name, mtar_header_t *h);
72int mtar_read_header(mtar_t *tar, mtar_header_t *h);
73int mtar_read_data(mtar_t *tar, void *ptr, unsigned size);
74
75int mtar_write_header(mtar_t *tar, const mtar_header_t *h);
76int mtar_write_file_header(mtar_t *tar, const char *name, unsigned size);
77int mtar_write_dir_header(mtar_t *tar, const char *name);
78int mtar_write_data(mtar_t *tar, const void *data, unsigned size);
79int mtar_finalize(mtar_t *tar);
80
81
82#endif