blob: ae974b9f040b97a70f96337aa4c74db1035b8b7d [file] [log] [blame]
bigbiff bigbiff9c754052013-01-09 09:09:08 -05001/*
2** Copyright 1998-2003 University of Illinois Board of Trustees
3** Copyright 1998-2003 Mark D. Roth
4** All rights reserved.
5**
6** handle.c - libtar code for initializing a TAR handle
7**
8** Mark D. Roth <roth@uiuc.edu>
9** Campus Information Technologies and Educational Services
10** University of Illinois at Urbana-Champaign
11*/
12
13#include <internal.h>
14
15#include <stdio.h>
16#include <fcntl.h>
17#include <errno.h>
18
19#ifdef HAVE_UNISTD_H
20# include <unistd.h>
21#endif
22
23#ifdef STDC_HEADERS
24# include <stdlib.h>
25#endif
26
27
28const char libtar_version[] = PACKAGE_VERSION;
29
30static tartype_t default_type = { open, close, read, write };
31
32
33static int
34tar_init(TAR **t, char *pathname, tartype_t *type,
35 int oflags, int mode, int options)
36{
37 if ((oflags & O_ACCMODE) == O_RDWR)
38 {
39 errno = EINVAL;
40 return -1;
41 }
42
43 *t = (TAR *)calloc(1, sizeof(TAR));
44 if (*t == NULL)
45 return -1;
46
47 (*t)->pathname = pathname;
48 (*t)->options = options;
49 (*t)->type = (type ? type : &default_type);
50 (*t)->oflags = oflags;
51
52 if ((oflags & O_ACCMODE) == O_RDONLY)
53 (*t)->h = libtar_hash_new(256,
54 (libtar_hashfunc_t)path_hashfunc);
55 else
56 (*t)->h = libtar_hash_new(16, (libtar_hashfunc_t)dev_hash);
57 if ((*t)->h == NULL)
58 {
59 free(*t);
60 return -1;
61 }
62
63 return 0;
64}
65
66
67/* open a new tarfile handle */
68int
69tar_open(TAR **t, char *pathname, tartype_t *type,
70 int oflags, int mode, int options)
71{
72 if (tar_init(t, pathname, type, oflags, mode, options) == -1)
73 return -1;
74
75 if ((options & TAR_NOOVERWRITE) && (oflags & O_CREAT))
76 oflags |= O_EXCL;
77
78#ifdef O_BINARY
79 oflags |= O_BINARY;
80#endif
81
82 (*t)->fd = (*((*t)->type->openfunc))(pathname, oflags, mode);
83 if ((*t)->fd == -1)
84 {
85 free(*t);
86 return -1;
87 }
88
89 return 0;
90}
91
92
93int
94tar_fdopen(TAR **t, int fd, char *pathname, tartype_t *type,
95 int oflags, int mode, int options)
96{
97 if (tar_init(t, pathname, type, oflags, mode, options) == -1)
98 return -1;
99
100 (*t)->fd = fd;
101 return 0;
102}
103
104
105int
106tar_fd(TAR *t)
107{
108 return t->fd;
109}
110
111
112/* close tarfile handle */
113int
114tar_close(TAR *t)
115{
116 int i;
117
118 i = (*(t->type->closefunc))(t->fd);
119
120 if (t->h != NULL)
121 libtar_hash_free(t->h, ((t->oflags & O_ACCMODE) == O_RDONLY
122 ? free
123 : (libtar_freefunc_t)tar_dev_free));
124 free(t);
125
126 return i;
127}
128
129