]>
Dogcows Code - chaz/tar/blob - src/xheader.c
1 /* This file is part of GNU Tar
3 Copyright (C) 2003 Free Software Foundation, Inc.
5 This program is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by the
7 Free Software Foundation; either version 2, or (at your option) any later
10 This program is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
13 Public License for more details.
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
28 #define obstack_chunk_alloc xmalloc
29 #define obstack_chunk_free free
32 /* Forward declarations */
33 static void dummy_coder (struct tar_stat_info
*st
, char *keyword
,
34 struct xheader
*xhdr
);
35 static void dummy_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
);
37 static void atime_coder (struct tar_stat_info
*st
, char *keyword
,
38 struct xheader
*xhdr
);
39 static void atime_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
);
41 static void gid_coder (struct tar_stat_info
*st
, char *keyword
,
42 struct xheader
*xhdr
);
43 static void gid_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
);
45 static void gname_coder (struct tar_stat_info
*st
, char *keyword
,
46 struct xheader
*xhdr
);
47 static void gname_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
);
49 static void linkpath_coder (struct tar_stat_info
*st
, char *keyword
,
50 struct xheader
*xhdr
);
51 static void linkpath_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
);
53 static void mtime_coder (struct tar_stat_info
*st
, char *keyword
,
54 struct xheader
*xhdr
);
55 static void mtime_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
);
57 static void ctime_coder (struct tar_stat_info
*st
, char *keyword
,
58 struct xheader
*xhdr
);
59 static void ctime_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
);
61 static void path_coder (struct tar_stat_info
*st
, char *keyword
,
62 struct xheader
*xhdr
);
63 static void path_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
);
65 static void size_coder (struct tar_stat_info
*st
, char *keyword
,
66 struct xheader
*xhdr
);
67 static void size_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
);
69 static void uid_coder (struct tar_stat_info
*st
, char *keyword
,
70 struct xheader
*xhdr
);
71 static void uid_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
);
73 static void uname_coder (struct tar_stat_info
*st
, char *keyword
,
74 struct xheader
*xhdr
);
75 static void uname_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
);
77 /* General Interface */
82 void (*coder
) (struct tar_stat_info
*st
, char *keyword
, struct xheader
*xhdr
);
83 void (*decoder
) (struct tar_stat_info
*st
, char *keyword
, char *arg
);
86 struct xhdr_tab xhdr_tab
[] = {
87 { "atime", atime_coder
, atime_decoder
},
88 { "comment", dummy_coder
, dummy_decoder
},
89 { "charset", dummy_coder
, dummy_decoder
},
90 { "ctime", ctime_coder
, ctime_decoder
},
91 { "gid", gid_coder
, gid_decoder
},
92 { "gname", gname_coder
, gname_decoder
},
93 { "linkpath", linkpath_coder
, linkpath_decoder
},
94 { "mtime", mtime_coder
, mtime_decoder
},
95 { "path", path_coder
, path_decoder
},
96 { "size", size_coder
, size_decoder
},
97 { "uid", uid_coder
, uid_decoder
},
98 { "uname", uname_coder
, uname_decoder
},
102 static struct xhdr_tab
*
103 locate_handler (char *keyword
)
107 for (p
= xhdr_tab
; p
->keyword
; p
++)
108 if (strcmp (p
->keyword
, keyword
) == 0)
114 decode_record (char **p
, struct tar_stat_info
*st
)
124 len
= strtoul (*p
, p
, 10);
127 ERROR ((0, 0, _("Malformed extended headed")));
132 for (;*p
< start
+ len
; ++*p
)
138 ERROR ((0, 0, _("Malformed extended headed")));
144 t
= locate_handler (keyword
);
154 t
->decoder (st
, keyword
, value
);
163 xheader_decode (struct tar_stat_info
*st
)
167 p
= extended_header
.buffer
;
168 endp
= &extended_header
.buffer
[extended_header
.size
-1];
171 if (decode_record (&p
, st
))
176 xheader_store (char *keyword
, struct tar_stat_info
*st
)
180 if (extended_header
.buffer
)
182 t
= locate_handler (keyword
);
185 if (!extended_header
.stk
)
187 extended_header
.stk
= xmalloc (sizeof (*extended_header
.stk
));
188 obstack_init (extended_header
.stk
);
190 t
->coder (st
, keyword
, &extended_header
);
194 xheader_read (union block
*p
, size_t size
)
199 free (extended_header
.buffer
);
200 extended_header
.size
= size
;
201 nblocks
= (size
+ BLOCKSIZE
- 1) / BLOCKSIZE
;
202 extended_header
.buffer
= xmalloc (size
+ 1);
204 set_next_block_after (p
);
205 for (i
= j
= 0; i
< nblocks
; i
++)
209 p
= find_next_block ();
213 memcpy (&extended_header
.buffer
[j
], p
->buffer
, len
);
214 set_next_block_after (p
);
222 format_uintmax (uintmax_t val
, char *buf
, size_t s
)
229 while ((val
/= 10) != 0);
233 char *p
= buf
+ s
- 1;
237 *p
-- = val
% 10 + '0';
239 while ((val
/= 10) != 0);
248 xheader_print (struct xheader
*xhdr
, char *keyword
, char *value
)
250 size_t len
= strlen (keyword
) + strlen (value
) + 3; /* ' ' + '=' + '\n' */
257 n
= format_uintmax (len
+ p
, NULL
, 0);
261 format_uintmax (len
+ n
, nbuf
, n
);
262 obstack_grow (xhdr
->stk
, nbuf
, n
);
263 obstack_1grow (xhdr
->stk
, ' ');
264 obstack_grow (xhdr
->stk
, keyword
, strlen (keyword
));
265 obstack_1grow (xhdr
->stk
, '=');
266 obstack_grow (xhdr
->stk
, value
, strlen (value
));
267 obstack_1grow (xhdr
->stk
, '\n');
271 xheader_finish (struct xheader
*xhdr
)
273 obstack_1grow (xhdr
->stk
, 0);
274 xhdr
->buffer
= obstack_finish (xhdr
->stk
);
275 xhdr
->size
= strlen (xhdr
->buffer
);
279 xheader_destroy (struct xheader
*xhdr
)
283 obstack_free (xhdr
->stk
, NULL
);
294 /* Implementations */
296 code_string (char *string
, char *keyword
, struct xheader
*xhdr
)
298 xheader_print (xhdr
, keyword
, string
);
302 code_time (time_t t
, char *keyword
, struct xheader
*xhdr
)
305 size_t s
= format_uintmax (t
, NULL
, 0);
306 format_uintmax (t
, sbuf
, s
);
308 format_uintmax (0, sbuf
+ s
, 9);
310 xheader_print (xhdr
, keyword
, sbuf
);
314 code_num (uintmax_t value
, char *keyword
, struct xheader
*xhdr
)
317 size_t s
= format_uintmax (value
, NULL
, 0);
318 format_uintmax (value
, sbuf
, s
);
320 xheader_print (xhdr
, keyword
, sbuf
);
324 dummy_coder (struct tar_stat_info
*st
, char *keyword
, struct xheader
*xhdr
)
329 dummy_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
)
334 atime_coder (struct tar_stat_info
*st
, char *keyword
, struct xheader
*xhdr
)
336 code_time (st
->stat
.st_atime
, keyword
, xhdr
);
340 atime_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
)
342 st
->stat
.st_atime
= strtoul (arg
, NULL
, 0);
346 gid_coder (struct tar_stat_info
*st
, char *keyword
, struct xheader
*xhdr
)
348 code_num (st
->stat
.st_gid
, keyword
, xhdr
);
352 gid_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
)
354 st
->stat
.st_gid
= strtoul (arg
, NULL
, 0);
358 gname_coder (struct tar_stat_info
*st
, char *keyword
, struct xheader
*xhdr
)
360 code_string (st
->gname
, keyword
, xhdr
);
364 gname_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
)
366 assign_string (&st
->gname
, arg
);
370 linkpath_coder (struct tar_stat_info
*st
, char *keyword
, struct xheader
*xhdr
)
372 code_string (st
->link_name
, keyword
, xhdr
);
376 linkpath_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
)
378 assign_string (&st
->link_name
, arg
);
382 ctime_coder (struct tar_stat_info
*st
, char *keyword
, struct xheader
*xhdr
)
384 code_time (st
->stat
.st_ctime
, keyword
, xhdr
);
388 ctime_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
)
390 st
->stat
.st_ctime
= strtoul (arg
, NULL
, 0);
394 mtime_coder (struct tar_stat_info
*st
, char *keyword
, struct xheader
*xhdr
)
396 code_time (st
->stat
.st_mtime
, keyword
, xhdr
);
400 mtime_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
)
402 st
->stat
.st_mtime
= strtoul (arg
, NULL
, 0);
406 path_coder (struct tar_stat_info
*st
, char *keyword
, struct xheader
*xhdr
)
408 code_string (st
->orig_file_name
, keyword
, xhdr
);
412 path_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
)
414 assign_string (&st
->orig_file_name
, arg
);
415 assign_string (&st
->file_name
, arg
);
416 st
->had_trailing_slash
= strip_trailing_slashes (st
->file_name
);
420 size_coder (struct tar_stat_info
*st
, char *keyword
, struct xheader
*xhdr
)
422 code_num (st
->stat
.st_size
, keyword
, xhdr
);
426 size_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
)
428 st
->stat
.st_size
= strtoul (arg
, NULL
, 0);
432 uid_coder (struct tar_stat_info
*st
, char *keyword
, struct xheader
*xhdr
)
434 code_num (st
->stat
.st_uid
, keyword
, xhdr
);
438 uid_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
)
440 st
->stat
.st_uid
= strtoul (arg
, NULL
, 0);
444 uname_coder (struct tar_stat_info
*st
, char *keyword
, struct xheader
*xhdr
)
446 code_string (st
->uname
, keyword
, xhdr
);
450 uname_decoder (struct tar_stat_info
*st
, char *keyword
, char *arg
)
452 assign_string (&st
->uname
, arg
);
This page took 0.052749 seconds and 4 git commands to generate.