tarruby 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.txt +99 -0
- data/ext/extconf.rb +19 -0
- data/ext/libtar/COPYRIGHT +35 -0
- data/ext/libtar/ChangeLog +243 -0
- data/ext/libtar/ChangeLog-1.0.x +141 -0
- data/ext/libtar/INSTALL +183 -0
- data/ext/libtar/Makefile.in +51 -0
- data/ext/libtar/README +121 -0
- data/ext/libtar/TODO +10 -0
- data/ext/libtar/autoconf/ac_path_generic.m4 +136 -0
- data/ext/libtar/autoconf/aclocal.m4 +199 -0
- data/ext/libtar/autoconf/encap.m4 +133 -0
- data/ext/libtar/autoconf/install-sh +251 -0
- data/ext/libtar/autom4te.cache/output.0 +8102 -0
- data/ext/libtar/autom4te.cache/requests +112 -0
- data/ext/libtar/autom4te.cache/traces.0 +382 -0
- data/ext/libtar/compat/ChangeLog +31 -0
- data/ext/libtar/compat/README +12 -0
- data/ext/libtar/compat/TODO +4 -0
- data/ext/libtar/compat/basename.c +91 -0
- data/ext/libtar/compat/compat.h +260 -0
- data/ext/libtar/compat/dirname.c +96 -0
- data/ext/libtar/compat/fnmatch.c +237 -0
- data/ext/libtar/compat/gethostbyname_r.c +41 -0
- data/ext/libtar/compat/gethostname.c +36 -0
- data/ext/libtar/compat/getservbyname_r.c +41 -0
- data/ext/libtar/compat/glob.c +898 -0
- data/ext/libtar/compat/inet_aton.c +27 -0
- data/ext/libtar/compat/module.ac +591 -0
- data/ext/libtar/compat/snprintf.c +788 -0
- data/ext/libtar/compat/strdup.c +62 -0
- data/ext/libtar/compat/strlcat.c +72 -0
- data/ext/libtar/compat/strlcpy.c +68 -0
- data/ext/libtar/compat/strmode.c +199 -0
- data/ext/libtar/compat/strrstr.c +40 -0
- data/ext/libtar/compat/strsep.c +87 -0
- data/ext/libtar/config.h.in +187 -0
- data/ext/libtar/configure +8102 -0
- data/ext/libtar/configure.ac +114 -0
- data/ext/libtar/doc/Makefile.in +152 -0
- data/ext/libtar/doc/tar_append_file.3 +50 -0
- data/ext/libtar/doc/tar_block_read.3 +24 -0
- data/ext/libtar/doc/tar_extract_all.3 +43 -0
- data/ext/libtar/doc/tar_extract_file.3 +84 -0
- data/ext/libtar/doc/tar_open.3 +97 -0
- data/ext/libtar/doc/th_get_pathname.3 +63 -0
- data/ext/libtar/doc/th_print_long_ls.3 +22 -0
- data/ext/libtar/doc/th_read.3 +34 -0
- data/ext/libtar/doc/th_set_from_stat.3 +45 -0
- data/ext/libtar/lib/Makefile.in +92 -0
- data/ext/libtar/lib/append.c +272 -0
- data/ext/libtar/lib/block.c +384 -0
- data/ext/libtar/lib/decode.c +130 -0
- data/ext/libtar/lib/encode.c +237 -0
- data/ext/libtar/lib/extract.c +656 -0
- data/ext/libtar/lib/handle.c +150 -0
- data/ext/libtar/lib/internal.h +46 -0
- data/ext/libtar/lib/libtar.h +311 -0
- data/ext/libtar/lib/output.c +146 -0
- data/ext/libtar/lib/util.c +153 -0
- data/ext/libtar/lib/wrapper.c +175 -0
- data/ext/libtar/libtar/Makefile.in +73 -0
- data/ext/libtar/libtar/libtar.c +363 -0
- data/ext/libtar/listhash/ChangeLog +15 -0
- data/ext/libtar/listhash/TODO +21 -0
- data/ext/libtar/listhash/hash.c.in +344 -0
- data/ext/libtar/listhash/hash_new.3.in +74 -0
- data/ext/libtar/listhash/list.c.in +458 -0
- data/ext/libtar/listhash/list_new.3.in +86 -0
- data/ext/libtar/listhash/listhash.h.in +196 -0
- data/ext/libtar/listhash/module.ac +21 -0
- data/ext/libtar/win32/config.h +190 -0
- data/ext/libtar/win32/dirent.c +115 -0
- data/ext/libtar/win32/dirent.h +24 -0
- data/ext/libtar/win32/grp.h +4 -0
- data/ext/libtar/win32/listhash/libtar_hash.c +344 -0
- data/ext/libtar/win32/listhash/libtar_list.c +458 -0
- data/ext/libtar/win32/listhash/libtar_listhash.h +196 -0
- data/ext/libtar/win32/pwd.h +4 -0
- data/ext/libtar/win32/sys/param.h +8 -0
- data/ext/libtar/win32/tar.h +35 -0
- data/ext/libtar/win32/utime.h +6 -0
- data/ext/libtar/win32/win32/types.h +10 -0
- data/ext/tarruby.c +648 -0
- metadata +150 -0
@@ -0,0 +1,458 @@
|
|
1
|
+
/* listhash/libtar_list.c. Generated from list.c.in by configure. */
|
2
|
+
|
3
|
+
/*
|
4
|
+
** Copyright 1998-2002 University of Illinois Board of Trustees
|
5
|
+
** Copyright 1998-2002 Mark D. Roth
|
6
|
+
** All rights reserved.
|
7
|
+
**
|
8
|
+
** libtar_list.c - linked list routines
|
9
|
+
**
|
10
|
+
** Mark D. Roth <roth@uiuc.edu>
|
11
|
+
** Campus Information Technologies and Educational Services
|
12
|
+
** University of Illinois at Urbana-Champaign
|
13
|
+
*/
|
14
|
+
|
15
|
+
#include <config.h>
|
16
|
+
#include <compat.h>
|
17
|
+
|
18
|
+
#include <libtar_listhash.h>
|
19
|
+
|
20
|
+
#include <stdio.h>
|
21
|
+
#include <errno.h>
|
22
|
+
#include <sys/param.h>
|
23
|
+
|
24
|
+
#ifdef STDC_HEADERS
|
25
|
+
# include <string.h>
|
26
|
+
# include <stdlib.h>
|
27
|
+
#endif
|
28
|
+
|
29
|
+
|
30
|
+
/*
|
31
|
+
** libtar_listptr_reset() - reset a list pointer
|
32
|
+
*/
|
33
|
+
void
|
34
|
+
libtar_listptr_reset(libtar_listptr_t *lp)
|
35
|
+
{
|
36
|
+
*lp = NULL;
|
37
|
+
}
|
38
|
+
|
39
|
+
|
40
|
+
/*
|
41
|
+
** libtar_listptr_data() - retrieve the data pointed to by lp
|
42
|
+
*/
|
43
|
+
void *
|
44
|
+
libtar_listptr_data(libtar_listptr_t *lp)
|
45
|
+
{
|
46
|
+
return (*lp)->data;
|
47
|
+
}
|
48
|
+
|
49
|
+
|
50
|
+
/*
|
51
|
+
** libtar_list_new() - create a new, empty list
|
52
|
+
*/
|
53
|
+
libtar_list_t *
|
54
|
+
libtar_list_new(int flags, libtar_cmpfunc_t cmpfunc)
|
55
|
+
{
|
56
|
+
libtar_list_t *newlist;
|
57
|
+
|
58
|
+
#ifdef DS_DEBUG
|
59
|
+
printf("in libtar_list_new(%d, 0x%lx)\n", flags, cmpfunc);
|
60
|
+
#endif
|
61
|
+
|
62
|
+
if (flags != LIST_USERFUNC
|
63
|
+
&& flags != LIST_STACK
|
64
|
+
&& flags != LIST_QUEUE)
|
65
|
+
{
|
66
|
+
errno = EINVAL;
|
67
|
+
return NULL;
|
68
|
+
}
|
69
|
+
|
70
|
+
newlist = (libtar_list_t *)calloc(1, sizeof(libtar_list_t));
|
71
|
+
if (cmpfunc != NULL)
|
72
|
+
newlist->cmpfunc = cmpfunc;
|
73
|
+
else
|
74
|
+
newlist->cmpfunc = (libtar_cmpfunc_t)strcmp;
|
75
|
+
newlist->flags = flags;
|
76
|
+
|
77
|
+
return newlist;
|
78
|
+
}
|
79
|
+
|
80
|
+
|
81
|
+
/*
|
82
|
+
** libtar_list_iterate() - call a function for every element
|
83
|
+
** in a list
|
84
|
+
*/
|
85
|
+
int
|
86
|
+
libtar_list_iterate(libtar_list_t *l,
|
87
|
+
libtar_iterate_func_t plugin,
|
88
|
+
void *state)
|
89
|
+
{
|
90
|
+
libtar_listptr_t n;
|
91
|
+
|
92
|
+
if (l == NULL)
|
93
|
+
return -1;
|
94
|
+
|
95
|
+
for (n = l->first; n != NULL; n = n->next)
|
96
|
+
{
|
97
|
+
if ((*plugin)(n->data, state) == -1)
|
98
|
+
return -1;
|
99
|
+
}
|
100
|
+
|
101
|
+
return 0;
|
102
|
+
}
|
103
|
+
|
104
|
+
|
105
|
+
/*
|
106
|
+
** libtar_list_empty() - empty the list
|
107
|
+
*/
|
108
|
+
void
|
109
|
+
libtar_list_empty(libtar_list_t *l, libtar_freefunc_t freefunc)
|
110
|
+
{
|
111
|
+
libtar_listptr_t n;
|
112
|
+
|
113
|
+
for (n = l->first; n != NULL; n = l->first)
|
114
|
+
{
|
115
|
+
l->first = n->next;
|
116
|
+
if (freefunc != NULL)
|
117
|
+
(*freefunc)(n->data);
|
118
|
+
free(n);
|
119
|
+
}
|
120
|
+
|
121
|
+
l->nents = 0;
|
122
|
+
}
|
123
|
+
|
124
|
+
|
125
|
+
/*
|
126
|
+
** libtar_list_free() - remove and free() the whole list
|
127
|
+
*/
|
128
|
+
void
|
129
|
+
libtar_list_free(libtar_list_t *l, libtar_freefunc_t freefunc)
|
130
|
+
{
|
131
|
+
libtar_list_empty(l, freefunc);
|
132
|
+
free(l);
|
133
|
+
}
|
134
|
+
|
135
|
+
|
136
|
+
/*
|
137
|
+
** libtar_list_nents() - return number of elements in the list
|
138
|
+
*/
|
139
|
+
unsigned int
|
140
|
+
libtar_list_nents(libtar_list_t *l)
|
141
|
+
{
|
142
|
+
return l->nents;
|
143
|
+
}
|
144
|
+
|
145
|
+
|
146
|
+
/*
|
147
|
+
** libtar_list_add() - adds an element to the list
|
148
|
+
** returns:
|
149
|
+
** 0 success
|
150
|
+
** -1 (and sets errno) failure
|
151
|
+
*/
|
152
|
+
int
|
153
|
+
libtar_list_add(libtar_list_t *l, void *data)
|
154
|
+
{
|
155
|
+
libtar_listptr_t n, m;
|
156
|
+
|
157
|
+
#ifdef DS_DEBUG
|
158
|
+
printf("==> libtar_list_add(\"%s\")\n", (char *)data);
|
159
|
+
#endif
|
160
|
+
|
161
|
+
n = (libtar_listptr_t)malloc(sizeof(struct libtar_node));
|
162
|
+
if (n == NULL)
|
163
|
+
return -1;
|
164
|
+
n->data = data;
|
165
|
+
l->nents++;
|
166
|
+
|
167
|
+
#ifdef DS_DEBUG
|
168
|
+
printf(" libtar_list_add(): allocated data\n");
|
169
|
+
#endif
|
170
|
+
|
171
|
+
/* if the list is empty */
|
172
|
+
if (l->first == NULL)
|
173
|
+
{
|
174
|
+
l->last = l->first = n;
|
175
|
+
n->next = n->prev = NULL;
|
176
|
+
#ifdef DS_DEBUG
|
177
|
+
printf("<== libtar_list_add(): list was empty; "
|
178
|
+
"added first element and returning 0\n");
|
179
|
+
#endif
|
180
|
+
return 0;
|
181
|
+
}
|
182
|
+
|
183
|
+
#ifdef DS_DEBUG
|
184
|
+
printf(" libtar_list_add(): list not empty\n");
|
185
|
+
#endif
|
186
|
+
|
187
|
+
if (l->flags == LIST_STACK)
|
188
|
+
{
|
189
|
+
n->prev = NULL;
|
190
|
+
n->next = l->first;
|
191
|
+
if (l->first != NULL)
|
192
|
+
l->first->prev = n;
|
193
|
+
l->first = n;
|
194
|
+
#ifdef DS_DEBUG
|
195
|
+
printf("<== libtar_list_add(): LIST_STACK set; "
|
196
|
+
"added in front\n");
|
197
|
+
#endif
|
198
|
+
return 0;
|
199
|
+
}
|
200
|
+
|
201
|
+
if (l->flags == LIST_QUEUE)
|
202
|
+
{
|
203
|
+
n->prev = l->last;
|
204
|
+
n->next = NULL;
|
205
|
+
if (l->last != NULL)
|
206
|
+
l->last->next = n;
|
207
|
+
l->last = n;
|
208
|
+
#ifdef DS_DEBUG
|
209
|
+
printf("<== libtar_list_add(): LIST_QUEUE set; "
|
210
|
+
"added at end\n");
|
211
|
+
#endif
|
212
|
+
return 0;
|
213
|
+
}
|
214
|
+
|
215
|
+
for (m = l->first; m != NULL; m = m->next)
|
216
|
+
if ((*(l->cmpfunc))(data, m->data) < 0)
|
217
|
+
{
|
218
|
+
/*
|
219
|
+
** if we find one that's bigger,
|
220
|
+
** insert data before it
|
221
|
+
*/
|
222
|
+
#ifdef DS_DEBUG
|
223
|
+
printf(" libtar_list_add(): gotcha..."
|
224
|
+
"inserting data\n");
|
225
|
+
#endif
|
226
|
+
if (m == l->first)
|
227
|
+
{
|
228
|
+
l->first = n;
|
229
|
+
n->prev = NULL;
|
230
|
+
m->prev = n;
|
231
|
+
n->next = m;
|
232
|
+
#ifdef DS_DEBUG
|
233
|
+
printf("<== libtar_list_add(): "
|
234
|
+
"added first, returning 0\n");
|
235
|
+
#endif
|
236
|
+
return 0;
|
237
|
+
}
|
238
|
+
m->prev->next = n;
|
239
|
+
n->prev = m->prev;
|
240
|
+
m->prev = n;
|
241
|
+
n->next = m;
|
242
|
+
#ifdef DS_DEBUG
|
243
|
+
printf("<== libtar_list_add(): added middle,"
|
244
|
+
" returning 0\n");
|
245
|
+
#endif
|
246
|
+
return 0;
|
247
|
+
}
|
248
|
+
|
249
|
+
#ifdef DS_DEBUG
|
250
|
+
printf(" libtar_list_add(): new data larger than current "
|
251
|
+
"list elements\n");
|
252
|
+
#endif
|
253
|
+
|
254
|
+
/* if we get here, data is bigger than everything in the list */
|
255
|
+
l->last->next = n;
|
256
|
+
n->prev = l->last;
|
257
|
+
l->last = n;
|
258
|
+
n->next = NULL;
|
259
|
+
#ifdef DS_DEBUG
|
260
|
+
printf("<== libtar_list_add(): added end, returning 0\n");
|
261
|
+
#endif
|
262
|
+
return 0;
|
263
|
+
}
|
264
|
+
|
265
|
+
|
266
|
+
/*
|
267
|
+
** libtar_list_del() - remove the element pointed to by n
|
268
|
+
** from the list l
|
269
|
+
*/
|
270
|
+
void
|
271
|
+
libtar_list_del(libtar_list_t *l, libtar_listptr_t *n)
|
272
|
+
{
|
273
|
+
libtar_listptr_t m;
|
274
|
+
|
275
|
+
#ifdef DS_DEBUG
|
276
|
+
printf("==> libtar_list_del()\n");
|
277
|
+
#endif
|
278
|
+
|
279
|
+
l->nents--;
|
280
|
+
|
281
|
+
m = (*n)->next;
|
282
|
+
|
283
|
+
if ((*n)->prev)
|
284
|
+
(*n)->prev->next = (*n)->next;
|
285
|
+
else
|
286
|
+
l->first = (*n)->next;
|
287
|
+
if ((*n)->next)
|
288
|
+
(*n)->next->prev = (*n)->prev;
|
289
|
+
else
|
290
|
+
l->last = (*n)->prev;
|
291
|
+
|
292
|
+
free(*n);
|
293
|
+
*n = m;
|
294
|
+
}
|
295
|
+
|
296
|
+
|
297
|
+
/*
|
298
|
+
** libtar_list_next() - get the next element in the list
|
299
|
+
** returns:
|
300
|
+
** 1 success
|
301
|
+
** 0 end of list
|
302
|
+
*/
|
303
|
+
int
|
304
|
+
libtar_list_next(libtar_list_t *l,
|
305
|
+
libtar_listptr_t *n)
|
306
|
+
{
|
307
|
+
if (*n == NULL)
|
308
|
+
*n = l->first;
|
309
|
+
else
|
310
|
+
*n = (*n)->next;
|
311
|
+
|
312
|
+
return (*n != NULL ? 1 : 0);
|
313
|
+
}
|
314
|
+
|
315
|
+
|
316
|
+
/*
|
317
|
+
** libtar_list_prev() - get the previous element in the list
|
318
|
+
** returns:
|
319
|
+
** 1 success
|
320
|
+
** 0 end of list
|
321
|
+
*/
|
322
|
+
int
|
323
|
+
libtar_list_prev(libtar_list_t *l,
|
324
|
+
libtar_listptr_t *n)
|
325
|
+
{
|
326
|
+
if (*n == NULL)
|
327
|
+
*n = l->last;
|
328
|
+
else
|
329
|
+
*n = (*n)->prev;
|
330
|
+
|
331
|
+
return (*n != NULL ? 1 : 0);
|
332
|
+
}
|
333
|
+
|
334
|
+
|
335
|
+
/*
|
336
|
+
** libtar_str_match() - string matching function
|
337
|
+
** returns:
|
338
|
+
** 1 match
|
339
|
+
** 0 no match
|
340
|
+
*/
|
341
|
+
int
|
342
|
+
libtar_str_match(char *check, char *data)
|
343
|
+
{
|
344
|
+
return !strcmp(check, data);
|
345
|
+
}
|
346
|
+
|
347
|
+
|
348
|
+
/*
|
349
|
+
** libtar_list_add_str() - splits string str into delim-delimited
|
350
|
+
** elements and adds them to list l
|
351
|
+
** returns:
|
352
|
+
** 0 success
|
353
|
+
** -1 (and sets errno) failure
|
354
|
+
*/
|
355
|
+
int
|
356
|
+
libtar_list_add_str(libtar_list_t *l,
|
357
|
+
char *str, char *delim)
|
358
|
+
{
|
359
|
+
char tmp[10240];
|
360
|
+
char *tokp, *nextp = tmp;
|
361
|
+
|
362
|
+
strlcpy(tmp, str, sizeof(tmp));
|
363
|
+
while ((tokp = strsep(&nextp, delim)) != NULL)
|
364
|
+
{
|
365
|
+
if (*tokp == '\0')
|
366
|
+
continue;
|
367
|
+
if (libtar_list_add(l, strdup(tokp)))
|
368
|
+
return -1;
|
369
|
+
}
|
370
|
+
|
371
|
+
return 0;
|
372
|
+
}
|
373
|
+
|
374
|
+
|
375
|
+
/*
|
376
|
+
** libtar_list_search() - find an entry in a list
|
377
|
+
** returns:
|
378
|
+
** 1 match found
|
379
|
+
** 0 no match
|
380
|
+
*/
|
381
|
+
int
|
382
|
+
libtar_list_search(libtar_list_t *l,
|
383
|
+
libtar_listptr_t *n, void *data,
|
384
|
+
libtar_matchfunc_t matchfunc)
|
385
|
+
{
|
386
|
+
#ifdef DS_DEBUG
|
387
|
+
printf("==> libtar_list_search(l=0x%lx, n=0x%lx, \"%s\")\n",
|
388
|
+
l, n, (char *)data);
|
389
|
+
#endif
|
390
|
+
|
391
|
+
if (matchfunc == NULL)
|
392
|
+
matchfunc = (libtar_matchfunc_t)libtar_str_match;
|
393
|
+
|
394
|
+
if (*n == NULL)
|
395
|
+
*n = l->first;
|
396
|
+
else
|
397
|
+
*n = (*n)->next;
|
398
|
+
|
399
|
+
for (; *n != NULL; *n = (*n)->next)
|
400
|
+
{
|
401
|
+
#ifdef DS_DEBUG
|
402
|
+
printf("checking against \"%s\"\n", (char *)(*n)->data);
|
403
|
+
#endif
|
404
|
+
if ((*(matchfunc))(data, (*n)->data) != 0)
|
405
|
+
return 1;
|
406
|
+
}
|
407
|
+
|
408
|
+
#ifdef DS_DEBUG
|
409
|
+
printf("no matches found\n");
|
410
|
+
#endif
|
411
|
+
return 0;
|
412
|
+
}
|
413
|
+
|
414
|
+
|
415
|
+
/*
|
416
|
+
** libtar_list_dup() - copy an existing list
|
417
|
+
*/
|
418
|
+
libtar_list_t *
|
419
|
+
libtar_list_dup(libtar_list_t *l)
|
420
|
+
{
|
421
|
+
libtar_list_t *newlist;
|
422
|
+
libtar_listptr_t n;
|
423
|
+
|
424
|
+
newlist = libtar_list_new(l->flags, l->cmpfunc);
|
425
|
+
for (n = l->first; n != NULL; n = n->next)
|
426
|
+
libtar_list_add(newlist, n->data);
|
427
|
+
|
428
|
+
#ifdef DS_DEBUG
|
429
|
+
printf("returning from libtar_list_dup()\n");
|
430
|
+
#endif
|
431
|
+
return newlist;
|
432
|
+
}
|
433
|
+
|
434
|
+
|
435
|
+
/*
|
436
|
+
** libtar_list_merge() - merge two lists into a new list
|
437
|
+
*/
|
438
|
+
libtar_list_t *
|
439
|
+
libtar_list_merge(libtar_cmpfunc_t cmpfunc, int flags,
|
440
|
+
libtar_list_t *list1,
|
441
|
+
libtar_list_t *list2)
|
442
|
+
{
|
443
|
+
libtar_list_t *newlist;
|
444
|
+
libtar_listptr_t n;
|
445
|
+
|
446
|
+
newlist = libtar_list_new(flags, cmpfunc);
|
447
|
+
|
448
|
+
n = NULL;
|
449
|
+
while (libtar_list_next(list1, &n) != 0)
|
450
|
+
libtar_list_add(newlist, n->data);
|
451
|
+
n = NULL;
|
452
|
+
while (libtar_list_next(list2, &n) != 0)
|
453
|
+
libtar_list_add(newlist, n->data);
|
454
|
+
|
455
|
+
return newlist;
|
456
|
+
}
|
457
|
+
|
458
|
+
|
@@ -0,0 +1,196 @@
|
|
1
|
+
/* listhash/libtar_listhash.h. Generated from listhash.h.in by configure. */
|
2
|
+
|
3
|
+
/*
|
4
|
+
** Copyright 1998-2002 University of Illinois Board of Trustees
|
5
|
+
** Copyright 1998-2002 Mark D. Roth
|
6
|
+
** All rights reserved.
|
7
|
+
**
|
8
|
+
** libtar_listhash.h - header file for listhash module
|
9
|
+
**
|
10
|
+
** Mark D. Roth <roth@uiuc.edu>
|
11
|
+
** Campus Information Technologies and Educational Services
|
12
|
+
** University of Illinois at Urbana-Champaign
|
13
|
+
*/
|
14
|
+
|
15
|
+
#ifndef libtar_LISTHASH_H
|
16
|
+
#define libtar_LISTHASH_H
|
17
|
+
|
18
|
+
|
19
|
+
/***** list.c **********************************************************/
|
20
|
+
|
21
|
+
/*
|
22
|
+
** Comparison function (used to determine order of elements in a list)
|
23
|
+
** returns less than, equal to, or greater than 0
|
24
|
+
** if data1 is less than, equal to, or greater than data2
|
25
|
+
*/
|
26
|
+
typedef int (*libtar_cmpfunc_t)(void *, void *);
|
27
|
+
|
28
|
+
/*
|
29
|
+
** Free function (for freeing allocated memory in each element)
|
30
|
+
*/
|
31
|
+
typedef void (*libtar_freefunc_t)(void *);
|
32
|
+
|
33
|
+
/*
|
34
|
+
** Plugin function for libtar_list_iterate()
|
35
|
+
*/
|
36
|
+
typedef int (*libtar_iterate_func_t)(void *, void *);
|
37
|
+
|
38
|
+
/*
|
39
|
+
** Matching function (used to find elements in a list)
|
40
|
+
** first argument is the data to search for
|
41
|
+
** second argument is the list element it's being compared to
|
42
|
+
** returns 0 if no match is found, non-zero otherwise
|
43
|
+
*/
|
44
|
+
typedef int (*libtar_matchfunc_t)(void *, void *);
|
45
|
+
|
46
|
+
|
47
|
+
struct libtar_node
|
48
|
+
{
|
49
|
+
void *data;
|
50
|
+
struct libtar_node *next;
|
51
|
+
struct libtar_node *prev;
|
52
|
+
};
|
53
|
+
typedef struct libtar_node *libtar_listptr_t;
|
54
|
+
|
55
|
+
struct libtar_list
|
56
|
+
{
|
57
|
+
libtar_listptr_t first;
|
58
|
+
libtar_listptr_t last;
|
59
|
+
libtar_cmpfunc_t cmpfunc;
|
60
|
+
int flags;
|
61
|
+
unsigned int nents;
|
62
|
+
};
|
63
|
+
typedef struct libtar_list libtar_list_t;
|
64
|
+
|
65
|
+
|
66
|
+
/* values for flags */
|
67
|
+
#define LIST_USERFUNC 0 /* use cmpfunc() to order */
|
68
|
+
#define LIST_STACK 1 /* new elements go in front */
|
69
|
+
#define LIST_QUEUE 2 /* new elements go at the end */
|
70
|
+
|
71
|
+
|
72
|
+
/* reset a list pointer */
|
73
|
+
void libtar_listptr_reset(libtar_listptr_t *);
|
74
|
+
|
75
|
+
/* retrieve the data being pointed to */
|
76
|
+
void *libtar_listptr_data(libtar_listptr_t *);
|
77
|
+
|
78
|
+
/* creates a new, empty list */
|
79
|
+
libtar_list_t *libtar_list_new(int, libtar_cmpfunc_t);
|
80
|
+
|
81
|
+
/* call a function for every element in a list */
|
82
|
+
int libtar_list_iterate(libtar_list_t *,
|
83
|
+
libtar_iterate_func_t, void *);
|
84
|
+
|
85
|
+
/* empty the list */
|
86
|
+
void libtar_list_empty(libtar_list_t *,
|
87
|
+
libtar_freefunc_t);
|
88
|
+
|
89
|
+
/* remove and free() the entire list */
|
90
|
+
void libtar_list_free(libtar_list_t *,
|
91
|
+
libtar_freefunc_t);
|
92
|
+
|
93
|
+
/* add elements */
|
94
|
+
int libtar_list_add(libtar_list_t *, void *);
|
95
|
+
|
96
|
+
/* removes an element from the list - returns -1 on error */
|
97
|
+
void libtar_list_del(libtar_list_t *,
|
98
|
+
libtar_listptr_t *);
|
99
|
+
|
100
|
+
/* returns 1 when valid data is returned, or 0 at end of list */
|
101
|
+
int libtar_list_next(libtar_list_t *,
|
102
|
+
libtar_listptr_t *);
|
103
|
+
|
104
|
+
/* returns 1 when valid data is returned, or 0 at end of list */
|
105
|
+
int libtar_list_prev(libtar_list_t *,
|
106
|
+
libtar_listptr_t *);
|
107
|
+
|
108
|
+
/* return 1 if the data matches a list entry, 0 otherwise */
|
109
|
+
int libtar_list_search(libtar_list_t *,
|
110
|
+
libtar_listptr_t *, void *,
|
111
|
+
libtar_matchfunc_t);
|
112
|
+
|
113
|
+
/* return number of elements from list */
|
114
|
+
unsigned int libtar_list_nents(libtar_list_t *);
|
115
|
+
|
116
|
+
/* adds elements from a string delimited by delim */
|
117
|
+
int libtar_list_add_str(libtar_list_t *, char *, char *);
|
118
|
+
|
119
|
+
/* string matching function */
|
120
|
+
int libtar_str_match(char *, char *);
|
121
|
+
|
122
|
+
|
123
|
+
/***** hash.c **********************************************************/
|
124
|
+
|
125
|
+
/*
|
126
|
+
** Hashing function (determines which bucket the given key hashes into)
|
127
|
+
** first argument is the key to hash
|
128
|
+
** second argument is the total number of buckets
|
129
|
+
** returns the bucket number
|
130
|
+
*/
|
131
|
+
typedef unsigned int (*libtar_hashfunc_t)(void *, unsigned int);
|
132
|
+
|
133
|
+
|
134
|
+
struct libtar_hashptr
|
135
|
+
{
|
136
|
+
int bucket;
|
137
|
+
libtar_listptr_t node;
|
138
|
+
};
|
139
|
+
typedef struct libtar_hashptr libtar_hashptr_t;
|
140
|
+
|
141
|
+
struct libtar_hash
|
142
|
+
{
|
143
|
+
int numbuckets;
|
144
|
+
libtar_list_t **table;
|
145
|
+
libtar_hashfunc_t hashfunc;
|
146
|
+
unsigned int nents;
|
147
|
+
};
|
148
|
+
typedef struct libtar_hash libtar_hash_t;
|
149
|
+
|
150
|
+
|
151
|
+
/* reset a hash pointer */
|
152
|
+
void libtar_hashptr_reset(libtar_hashptr_t *);
|
153
|
+
|
154
|
+
/* retrieve the data being pointed to */
|
155
|
+
void *libtar_hashptr_data(libtar_hashptr_t *);
|
156
|
+
|
157
|
+
/* default hash function, optimized for 7-bit strings */
|
158
|
+
unsigned int libtar_str_hashfunc(char *, unsigned int);
|
159
|
+
|
160
|
+
/* return number of elements from hash */
|
161
|
+
unsigned int libtar_hash_nents(libtar_hash_t *);
|
162
|
+
|
163
|
+
/* create a new hash */
|
164
|
+
libtar_hash_t *libtar_hash_new(int, libtar_hashfunc_t);
|
165
|
+
|
166
|
+
/* empty the hash */
|
167
|
+
void libtar_hash_empty(libtar_hash_t *,
|
168
|
+
libtar_freefunc_t);
|
169
|
+
|
170
|
+
/* delete all the libtar_nodes of the hash and clean up */
|
171
|
+
void libtar_hash_free(libtar_hash_t *,
|
172
|
+
libtar_freefunc_t);
|
173
|
+
|
174
|
+
/* returns 1 when valid data is returned, or 0 at end of list */
|
175
|
+
int libtar_hash_next(libtar_hash_t *,
|
176
|
+
libtar_hashptr_t *);
|
177
|
+
|
178
|
+
/* return 1 if the data matches a list entry, 0 otherwise */
|
179
|
+
int libtar_hash_search(libtar_hash_t *,
|
180
|
+
libtar_hashptr_t *, void *,
|
181
|
+
libtar_matchfunc_t);
|
182
|
+
|
183
|
+
/* return 1 if the key matches a list entry, 0 otherwise */
|
184
|
+
int libtar_hash_getkey(libtar_hash_t *,
|
185
|
+
libtar_hashptr_t *, void *,
|
186
|
+
libtar_matchfunc_t);
|
187
|
+
|
188
|
+
/* inserting data */
|
189
|
+
int libtar_hash_add(libtar_hash_t *, void *);
|
190
|
+
|
191
|
+
/* delete an entry */
|
192
|
+
int libtar_hash_del(libtar_hash_t *,
|
193
|
+
libtar_hashptr_t *);
|
194
|
+
|
195
|
+
#endif /* ! libtar_LISTHASH_H */
|
196
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#ifndef __TAR_H__
|
2
|
+
#define __TAR_H__
|
3
|
+
|
4
|
+
/* General definitions */
|
5
|
+
#define TMAGIC "ustar" // ustar plus null byte.
|
6
|
+
#define TMAGLEN 6 // Length of the above.
|
7
|
+
#define TVERSION "00" // 00 without a null byte.
|
8
|
+
#define TVERSLEN 2 // Length of the above.
|
9
|
+
|
10
|
+
/* Typeflag field definitions */
|
11
|
+
#define REGTYPE '0' // Regular file.
|
12
|
+
#define AREGTYPE '\0' // Regular file.
|
13
|
+
#define LNKTYPE '1' // Link.
|
14
|
+
#define SYMTYPE '2' // Symbolic link.
|
15
|
+
#define CHRTYPE '3' // Character special.
|
16
|
+
#define BLKTYPE '4' // Block special.
|
17
|
+
#define DIRTYPE '5' // Directory.
|
18
|
+
#define FIFOTYPE '6' // FIFO special.
|
19
|
+
#define CONTTYPE '7' // Reserved.
|
20
|
+
|
21
|
+
/* Mode field bit definitions (octal) */
|
22
|
+
#define TSUID 04000 // Set UID on execution.
|
23
|
+
#define TSGID 02000 // Set GID on execution.
|
24
|
+
#define TSVTX 01000 // On directories, restricted deletion flag.
|
25
|
+
#define TUREAD 00400 // Read by owner.
|
26
|
+
#define TUWRITE 00200 // Write by owner special.
|
27
|
+
#define TUEXEC 00100 // Execute/search by owner.
|
28
|
+
#define TGREAD 00040 // Read by group.
|
29
|
+
#define TGWRITE 00020 // Write by group.
|
30
|
+
#define TGEXEC 00010 // Execute/search by group.
|
31
|
+
#define TOREAD 00004 // Read by other.
|
32
|
+
#define TOWRITE 00002 // Write by other.
|
33
|
+
#define TOEXEC 00001 // Execute/search by other.
|
34
|
+
|
35
|
+
#endif
|