tarruby 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. data/README.txt +99 -0
  2. data/ext/extconf.rb +19 -0
  3. data/ext/libtar/COPYRIGHT +35 -0
  4. data/ext/libtar/ChangeLog +243 -0
  5. data/ext/libtar/ChangeLog-1.0.x +141 -0
  6. data/ext/libtar/INSTALL +183 -0
  7. data/ext/libtar/Makefile.in +51 -0
  8. data/ext/libtar/README +121 -0
  9. data/ext/libtar/TODO +10 -0
  10. data/ext/libtar/autoconf/ac_path_generic.m4 +136 -0
  11. data/ext/libtar/autoconf/aclocal.m4 +199 -0
  12. data/ext/libtar/autoconf/encap.m4 +133 -0
  13. data/ext/libtar/autoconf/install-sh +251 -0
  14. data/ext/libtar/autom4te.cache/output.0 +8102 -0
  15. data/ext/libtar/autom4te.cache/requests +112 -0
  16. data/ext/libtar/autom4te.cache/traces.0 +382 -0
  17. data/ext/libtar/compat/ChangeLog +31 -0
  18. data/ext/libtar/compat/README +12 -0
  19. data/ext/libtar/compat/TODO +4 -0
  20. data/ext/libtar/compat/basename.c +91 -0
  21. data/ext/libtar/compat/compat.h +260 -0
  22. data/ext/libtar/compat/dirname.c +96 -0
  23. data/ext/libtar/compat/fnmatch.c +237 -0
  24. data/ext/libtar/compat/gethostbyname_r.c +41 -0
  25. data/ext/libtar/compat/gethostname.c +36 -0
  26. data/ext/libtar/compat/getservbyname_r.c +41 -0
  27. data/ext/libtar/compat/glob.c +898 -0
  28. data/ext/libtar/compat/inet_aton.c +27 -0
  29. data/ext/libtar/compat/module.ac +591 -0
  30. data/ext/libtar/compat/snprintf.c +788 -0
  31. data/ext/libtar/compat/strdup.c +62 -0
  32. data/ext/libtar/compat/strlcat.c +72 -0
  33. data/ext/libtar/compat/strlcpy.c +68 -0
  34. data/ext/libtar/compat/strmode.c +199 -0
  35. data/ext/libtar/compat/strrstr.c +40 -0
  36. data/ext/libtar/compat/strsep.c +87 -0
  37. data/ext/libtar/config.h.in +187 -0
  38. data/ext/libtar/configure +8102 -0
  39. data/ext/libtar/configure.ac +114 -0
  40. data/ext/libtar/doc/Makefile.in +152 -0
  41. data/ext/libtar/doc/tar_append_file.3 +50 -0
  42. data/ext/libtar/doc/tar_block_read.3 +24 -0
  43. data/ext/libtar/doc/tar_extract_all.3 +43 -0
  44. data/ext/libtar/doc/tar_extract_file.3 +84 -0
  45. data/ext/libtar/doc/tar_open.3 +97 -0
  46. data/ext/libtar/doc/th_get_pathname.3 +63 -0
  47. data/ext/libtar/doc/th_print_long_ls.3 +22 -0
  48. data/ext/libtar/doc/th_read.3 +34 -0
  49. data/ext/libtar/doc/th_set_from_stat.3 +45 -0
  50. data/ext/libtar/lib/Makefile.in +92 -0
  51. data/ext/libtar/lib/append.c +272 -0
  52. data/ext/libtar/lib/block.c +384 -0
  53. data/ext/libtar/lib/decode.c +130 -0
  54. data/ext/libtar/lib/encode.c +237 -0
  55. data/ext/libtar/lib/extract.c +656 -0
  56. data/ext/libtar/lib/handle.c +150 -0
  57. data/ext/libtar/lib/internal.h +46 -0
  58. data/ext/libtar/lib/libtar.h +311 -0
  59. data/ext/libtar/lib/output.c +146 -0
  60. data/ext/libtar/lib/util.c +153 -0
  61. data/ext/libtar/lib/wrapper.c +175 -0
  62. data/ext/libtar/libtar/Makefile.in +73 -0
  63. data/ext/libtar/libtar/libtar.c +363 -0
  64. data/ext/libtar/listhash/ChangeLog +15 -0
  65. data/ext/libtar/listhash/TODO +21 -0
  66. data/ext/libtar/listhash/hash.c.in +344 -0
  67. data/ext/libtar/listhash/hash_new.3.in +74 -0
  68. data/ext/libtar/listhash/list.c.in +458 -0
  69. data/ext/libtar/listhash/list_new.3.in +86 -0
  70. data/ext/libtar/listhash/listhash.h.in +196 -0
  71. data/ext/libtar/listhash/module.ac +21 -0
  72. data/ext/libtar/win32/config.h +190 -0
  73. data/ext/libtar/win32/dirent.c +115 -0
  74. data/ext/libtar/win32/dirent.h +24 -0
  75. data/ext/libtar/win32/grp.h +4 -0
  76. data/ext/libtar/win32/listhash/libtar_hash.c +344 -0
  77. data/ext/libtar/win32/listhash/libtar_list.c +458 -0
  78. data/ext/libtar/win32/listhash/libtar_listhash.h +196 -0
  79. data/ext/libtar/win32/pwd.h +4 -0
  80. data/ext/libtar/win32/sys/param.h +8 -0
  81. data/ext/libtar/win32/tar.h +35 -0
  82. data/ext/libtar/win32/utime.h +6 -0
  83. data/ext/libtar/win32/win32/types.h +10 -0
  84. data/ext/tarruby.c +648 -0
  85. metadata +150 -0
@@ -0,0 +1,150 @@
1
+ /*
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
+
28
+ const char libtar_version[] = PACKAGE_VERSION;
29
+
30
+ static long libtar_open(const char *pathname, int oflags, int mode) {
31
+ return open(pathname, oflags, mode);
32
+ }
33
+
34
+ static long libtar_close(long fd) {
35
+ return close((int) fd);
36
+ }
37
+
38
+ static ssize_t libtar_read(long fd, void *buf, size_t len) {
39
+ return read((int) fd, buf, len);
40
+ }
41
+
42
+ static ssize_t libtar_write(long fd, const void *buf, size_t len) {
43
+ return write((int) fd, buf, len);
44
+ }
45
+
46
+ static tartype_t default_type = {
47
+ libtar_open,
48
+ libtar_close,
49
+ libtar_read,
50
+ libtar_write
51
+ };
52
+
53
+
54
+ static int
55
+ tar_init(TAR **t, char *pathname, tartype_t *type,
56
+ int oflags, int mode, int options)
57
+ {
58
+ if ((oflags & O_ACCMODE) == O_RDWR)
59
+ {
60
+ errno = EINVAL;
61
+ return -1;
62
+ }
63
+
64
+ *t = (TAR *)calloc(1, sizeof(TAR));
65
+ if (*t == NULL)
66
+ return -1;
67
+
68
+ (*t)->pathname = pathname;
69
+ (*t)->options = options;
70
+ (*t)->type = (type ? type : &default_type);
71
+ (*t)->oflags = oflags;
72
+
73
+ if ((oflags & O_ACCMODE) == O_RDONLY)
74
+ (*t)->h = libtar_hash_new(256,
75
+ (libtar_hashfunc_t)path_hashfunc);
76
+ else
77
+ (*t)->h = libtar_hash_new(16, (libtar_hashfunc_t)dev_hash);
78
+ if ((*t)->h == NULL)
79
+ {
80
+ free(*t);
81
+ return -1;
82
+ }
83
+
84
+ return 0;
85
+ }
86
+
87
+
88
+ /* open a new tarfile handle */
89
+ int
90
+ tar_open(TAR **t, char *pathname, tartype_t *type,
91
+ int oflags, int mode, int options)
92
+ {
93
+ if (tar_init(t, pathname, type, oflags, mode, options) == -1)
94
+ return -1;
95
+
96
+ if ((options & TAR_NOOVERWRITE) && (oflags & O_CREAT))
97
+ oflags |= O_EXCL;
98
+
99
+ #ifdef O_BINARY
100
+ oflags |= O_BINARY;
101
+ #endif
102
+
103
+ (*t)->fd = (*((*t)->type->openfunc))(pathname, oflags, mode);
104
+ if ((*t)->fd == -1)
105
+ {
106
+ free(*t);
107
+ return -1;
108
+ }
109
+
110
+ return 0;
111
+ }
112
+
113
+
114
+ int
115
+ tar_fdopen(TAR **t, int fd, char *pathname, tartype_t *type,
116
+ int oflags, int mode, int options)
117
+ {
118
+ if (tar_init(t, pathname, type, oflags, mode, options) == -1)
119
+ return -1;
120
+
121
+ (*t)->fd = fd;
122
+ return 0;
123
+ }
124
+
125
+
126
+ int
127
+ tar_fd(TAR *t)
128
+ {
129
+ return t->fd;
130
+ }
131
+
132
+
133
+ /* close tarfile handle */
134
+ int
135
+ tar_close(TAR *t)
136
+ {
137
+ int i;
138
+
139
+ i = (*(t->type->closefunc))(t->fd);
140
+
141
+ if (t->h != NULL)
142
+ libtar_hash_free(t->h, ((t->oflags & O_ACCMODE) == O_RDONLY
143
+ ? free
144
+ : (libtar_freefunc_t)tar_dev_free));
145
+ free(t);
146
+
147
+ return i;
148
+ }
149
+
150
+
@@ -0,0 +1,46 @@
1
+ /*
2
+ ** Copyright 2002-2003 University of Illinois Board of Trustees
3
+ ** Copyright 2002-2003 Mark D. Roth
4
+ ** All rights reserved.
5
+ **
6
+ ** internal.h - internal header file for libtar
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 <config.h>
14
+ #include <compat.h>
15
+
16
+ #include <libtar.h>
17
+
18
+ // modified by SUGAWARA Genki <sgwr_dts@yahoo.co.jp>
19
+ #ifdef _WIN32
20
+
21
+ #include <direct.h>
22
+ #include <io.h>
23
+ #include <string.h>
24
+ #include <sys/types.h>
25
+ #include <sys/stat.h>
26
+
27
+ #define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR)
28
+
29
+ #define S_ISREG(m) (((m) & (_S_IFMT)) == (_S_IFREG))
30
+ #define S_ISDIR(m) (((m) & (_S_IFMT)) == (_S_IFDIR))
31
+ #define S_ISCHR(m) (((m) & (_S_IFMT)) == (_S_IFCHR))
32
+ #define S_ISBLK(m) (0)
33
+ #define S_ISFIFO(m) (((m) & (_S_IFMT)) == (_S_IFIFO))
34
+ #define S_ISLNK(m) (0)
35
+ #define S_ISSOCK(m) (0)
36
+
37
+ #define chown(p, o, g) (0)
38
+ #define geteuid() (0)
39
+ #define lstat(p, b) stat((p), (b))
40
+ #define makedev(maj, min) (0)
41
+ #define mkdir(d, m) _mkdir(d)
42
+ #define mkfifo(p, m) (0)
43
+ #define mknod(p, m, d) (0)
44
+ #define snprintf(s, n, f, ...) do { _snprintf((s), (n), (f), __VA_ARGS__); (s)[(n) - 1] = '\0'; } while(0)
45
+
46
+ #endif
@@ -0,0 +1,311 @@
1
+ /*
2
+ ** Copyright 1998-2003 University of Illinois Board of Trustees
3
+ ** Copyright 1998-2003 Mark D. Roth
4
+ ** All rights reserved.
5
+ **
6
+ ** libtar.h - header file for libtar library
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
+ #ifndef LIBTAR_H
14
+ #define LIBTAR_H
15
+
16
+ #include <sys/types.h>
17
+ #include <sys/stat.h>
18
+ #include <tar.h>
19
+
20
+ #include <libtar_listhash.h>
21
+
22
+ // modified by SUGAWARA Genki <sgwr_dts@yahoo.co.jp>
23
+ #ifdef _WIN32
24
+ #include "win32/types.h"
25
+ #define S_ISDIR(m) (((m) & (_S_IFMT)) == (_S_IFDIR))
26
+ #define S_ISCHR(m) (((m) & (_S_IFMT)) == (_S_IFCHR))
27
+ #define S_ISLNK(m) (0)
28
+ #define S_ISBLK(m) (0)
29
+ #define S_ISFIFO(m) (((m) & (_S_IFMT)) == (_S_IFIFO))
30
+ #endif
31
+
32
+ #ifdef __cplusplus
33
+ extern "C"
34
+ {
35
+ #endif
36
+
37
+
38
+ /* useful constants */
39
+ #define T_BLOCKSIZE 512
40
+ #define T_NAMELEN 100
41
+ #define T_PREFIXLEN 155
42
+ #define T_MAXPATHLEN (T_NAMELEN + T_PREFIXLEN)
43
+
44
+ /* GNU extensions for typeflag */
45
+ #define GNU_LONGNAME_TYPE 'L'
46
+ #define GNU_LONGLINK_TYPE 'K'
47
+
48
+ /* our version of the tar header structure */
49
+ struct tar_header
50
+ {
51
+ char name[100];
52
+ char mode[8];
53
+ char uid[8];
54
+ char gid[8];
55
+ char size[12];
56
+ char mtime[12];
57
+ char chksum[8];
58
+ char typeflag;
59
+ char linkname[100];
60
+ char magic[6];
61
+ char version[2];
62
+ char uname[32];
63
+ char gname[32];
64
+ char devmajor[8];
65
+ char devminor[8];
66
+ char prefix[155];
67
+ char padding[12];
68
+ char *gnu_longname;
69
+ char *gnu_longlink;
70
+ };
71
+
72
+
73
+ /***** handle.c ************************************************************/
74
+
75
+ typedef long (*openfunc_t)(const char *, int, int);
76
+ typedef int (*closefunc_t)(long);
77
+ typedef ssize_t (*readfunc_t)(long, void *, size_t);
78
+ typedef ssize_t (*writefunc_t)(long, const void *, size_t);
79
+
80
+ typedef struct
81
+ {
82
+ openfunc_t openfunc;
83
+ closefunc_t closefunc;
84
+ readfunc_t readfunc;
85
+ writefunc_t writefunc;
86
+ }
87
+ tartype_t;
88
+
89
+ typedef struct
90
+ {
91
+ tartype_t *type;
92
+ char *pathname;
93
+ long fd;
94
+ int oflags;
95
+ int options;
96
+ struct tar_header th_buf;
97
+ libtar_hash_t *h;
98
+ }
99
+ TAR;
100
+
101
+ /* constant values for the TAR options field */
102
+ #define TAR_GNU 1 /* use GNU extensions */
103
+ #define TAR_VERBOSE 2 /* output file info to stdout */
104
+ #define TAR_NOOVERWRITE 4 /* don't overwrite existing files */
105
+ #define TAR_IGNORE_EOT 8 /* ignore double zero blocks as EOF */
106
+ #define TAR_CHECK_MAGIC 16 /* check magic in file header */
107
+ #define TAR_CHECK_VERSION 32 /* check version in file header */
108
+ #define TAR_IGNORE_CRC 64 /* ignore CRC in file header */
109
+
110
+ /* this is obsolete - it's here for backwards-compatibility only */
111
+ #define TAR_IGNORE_MAGIC 0
112
+
113
+ extern const char libtar_version[];
114
+
115
+
116
+ /* open a new tarfile handle */
117
+ int tar_open(TAR **t, char *pathname, tartype_t *type,
118
+ int oflags, int mode, int options);
119
+
120
+ /* make a tarfile handle out of a previously-opened descriptor */
121
+ int tar_fdopen(TAR **t, int fd, char *pathname, tartype_t *type,
122
+ int oflags, int mode, int options);
123
+
124
+ /* returns the descriptor associated with t */
125
+ int tar_fd(TAR *t);
126
+
127
+ /* close tarfile handle */
128
+ int tar_close(TAR *t);
129
+
130
+
131
+ /***** append.c ************************************************************/
132
+
133
+ /* forward declaration to appease the compiler */
134
+ struct tar_dev;
135
+
136
+ /* cleanup function */
137
+ void tar_dev_free(struct tar_dev *tdp);
138
+
139
+ /* Appends a file to the tar archive.
140
+ * Arguments:
141
+ * t = TAR handle to append to
142
+ * realname = path of file to append
143
+ * savename = name to save the file under in the archive
144
+ */
145
+ int tar_append_file(TAR *t, char *realname, char *savename);
146
+
147
+ /* write EOF indicator */
148
+ int tar_append_eof(TAR *t);
149
+
150
+ /* add file contents to a tarchive */
151
+ int tar_append_regfile(TAR *t, char *realname);
152
+
153
+
154
+ /***** block.c *************************************************************/
155
+
156
+ /* macros for reading/writing tarchive blocks */
157
+ #define tar_block_read(t, buf) \
158
+ (*((t)->type->readfunc))((t)->fd, (char *)(buf), T_BLOCKSIZE)
159
+ #define tar_block_write(t, buf) \
160
+ (*((t)->type->writefunc))((t)->fd, (char *)(buf), T_BLOCKSIZE)
161
+
162
+ /* read/write a header block */
163
+ int th_read(TAR *t);
164
+ int th_write(TAR *t);
165
+
166
+
167
+ /***** decode.c ************************************************************/
168
+
169
+ /* determine file type */
170
+ #define TH_ISREG(t) ((t)->th_buf.typeflag == REGTYPE \
171
+ || (t)->th_buf.typeflag == AREGTYPE \
172
+ || (t)->th_buf.typeflag == CONTTYPE \
173
+ || (S_ISREG((mode_t)oct_to_int((t)->th_buf.mode)) \
174
+ && (t)->th_buf.typeflag != LNKTYPE))
175
+ #define TH_ISLNK(t) ((t)->th_buf.typeflag == LNKTYPE)
176
+ #define TH_ISSYM(t) ((t)->th_buf.typeflag == SYMTYPE \
177
+ || S_ISLNK((mode_t)oct_to_int((t)->th_buf.mode)))
178
+ #define TH_ISCHR(t) ((t)->th_buf.typeflag == CHRTYPE \
179
+ || S_ISCHR((mode_t)oct_to_int((t)->th_buf.mode)))
180
+ #define TH_ISBLK(t) ((t)->th_buf.typeflag == BLKTYPE \
181
+ || S_ISBLK((mode_t)oct_to_int((t)->th_buf.mode)))
182
+ #define TH_ISDIR(t) ((t)->th_buf.typeflag == DIRTYPE \
183
+ || S_ISDIR((mode_t)oct_to_int((t)->th_buf.mode)) \
184
+ || ((t)->th_buf.typeflag == AREGTYPE \
185
+ && ((t)->th_buf.name[strlen((t)->th_buf.name) - 1] == '/')))
186
+ #define TH_ISFIFO(t) ((t)->th_buf.typeflag == FIFOTYPE \
187
+ || S_ISFIFO((mode_t)oct_to_int((t)->th_buf.mode)))
188
+ #define TH_ISLONGNAME(t) ((t)->th_buf.typeflag == GNU_LONGNAME_TYPE)
189
+ #define TH_ISLONGLINK(t) ((t)->th_buf.typeflag == GNU_LONGLINK_TYPE)
190
+
191
+ /* decode tar header info */
192
+ #define th_get_crc(t) oct_to_int((t)->th_buf.chksum)
193
+ #define th_get_size(t) oct_to_int((t)->th_buf.size)
194
+ #define th_get_mtime(t) oct_to_int((t)->th_buf.mtime)
195
+ #define th_get_devmajor(t) oct_to_int((t)->th_buf.devmajor)
196
+ #define th_get_devminor(t) oct_to_int((t)->th_buf.devminor)
197
+ #define th_get_linkname(t) ((t)->th_buf.gnu_longlink \
198
+ ? (t)->th_buf.gnu_longlink \
199
+ : (t)->th_buf.linkname)
200
+ char *th_get_pathname(TAR *t);
201
+ mode_t th_get_mode(TAR *t);
202
+ uid_t th_get_uid(TAR *t);
203
+ gid_t th_get_gid(TAR *t);
204
+
205
+
206
+ /***** encode.c ************************************************************/
207
+
208
+ /* encode file info in th_header */
209
+ void th_set_type(TAR *t, mode_t mode);
210
+ void th_set_path(TAR *t, char *pathname);
211
+ void th_set_link(TAR *t, char *linkname);
212
+ void th_set_device(TAR *t, dev_t device);
213
+ void th_set_user(TAR *t, uid_t uid);
214
+ void th_set_group(TAR *t, gid_t gid);
215
+ void th_set_mode(TAR *t, mode_t fmode);
216
+ #define th_set_mtime(t, fmtime) \
217
+ int_to_oct_nonull((fmtime), (t)->th_buf.mtime, 12)
218
+ #define th_set_size(t, fsize) \
219
+ int_to_oct_nonull((fsize), (t)->th_buf.size, 12)
220
+
221
+ /* encode everything at once (except the pathname and linkname) */
222
+ void th_set_from_stat(TAR *t, struct stat *s);
223
+
224
+ /* encode magic, version, and crc - must be done after everything else is set */
225
+ void th_finish(TAR *t);
226
+
227
+
228
+ /***** extract.c ***********************************************************/
229
+
230
+ /* sequentially extract next file from t */
231
+ int tar_extract_file(TAR *t, char *realname);
232
+
233
+ // modified by SUGAWARA Genki <sgwr_dts@yahoo.co.jp>
234
+ int tar_extract_function(TAR *t, void *data, int (*f)(char *b, int l, void *d));
235
+
236
+ /* extract different file types */
237
+ int tar_extract_dir(TAR *t, char *realname);
238
+ int tar_extract_hardlink(TAR *t, char *realname);
239
+ int tar_extract_symlink(TAR *t, char *realname);
240
+ int tar_extract_chardev(TAR *t, char *realname);
241
+ int tar_extract_blockdev(TAR *t, char *realname);
242
+ int tar_extract_fifo(TAR *t, char *realname);
243
+
244
+ /* for regfiles, we need to extract the content blocks as well */
245
+ int tar_extract_regfile(TAR *t, char *realname);
246
+ int tar_skip_regfile(TAR *t);
247
+
248
+
249
+ /***** output.c ************************************************************/
250
+
251
+ /* print the tar header */
252
+ void th_print(TAR *t);
253
+
254
+ /* print "ls -l"-like output for the file described by th */
255
+ void th_print_long_ls(TAR *t);
256
+
257
+
258
+ /***** util.c *************************************************************/
259
+
260
+ /* hashing function for pathnames */
261
+ int path_hashfunc(char *key, int numbuckets);
262
+
263
+ /* matching function for dev_t's */
264
+ int dev_match(dev_t *dev1, dev_t *dev2);
265
+
266
+ /* matching function for ino_t's */
267
+ int ino_match(ino_t *ino1, ino_t *ino2);
268
+
269
+ /* hashing function for dev_t's */
270
+ int dev_hash(dev_t *dev);
271
+
272
+ /* hashing function for ino_t's */
273
+ int ino_hash(ino_t *inode);
274
+
275
+ /* create any necessary dirs */
276
+ int mkdirhier(char *path);
277
+
278
+ /* calculate header checksum */
279
+ int th_crc_calc(TAR *t);
280
+ #define th_crc_ok(t) (th_get_crc(t) == th_crc_calc(t))
281
+
282
+ /* string-octal to integer conversion */
283
+ int oct_to_int(char *oct);
284
+
285
+ /* integer to NULL-terminated string-octal conversion */
286
+ // modified by SUGAWARA Genki <sgwr_dts@yahoo.co.jp>
287
+ //#define int_to_oct(num, oct, octlen) \
288
+ // snprintf((oct), (octlen), "%*lo ", (octlen) - 2, (unsigned long)(num))
289
+ #define int_to_oct(num, oct, octlen) \
290
+ snprintf((oct), (octlen), "%0*lo", (octlen) - 1, (unsigned long)(num))
291
+
292
+ /* integer to string-octal conversion, no NULL */
293
+ void int_to_oct_nonull(int num, char *oct, size_t octlen);
294
+
295
+
296
+ /***** wrapper.c **********************************************************/
297
+
298
+ /* extract groups of files */
299
+ int tar_extract_glob(TAR *t, char *globname, char *prefix);
300
+ int tar_extract_all(TAR *t, char *prefix);
301
+
302
+ /* add a whole tree of files */
303
+ int tar_append_tree(TAR *t, char *realdir, char *savedir);
304
+
305
+
306
+ #ifdef __cplusplus
307
+ }
308
+ #endif
309
+
310
+ #endif /* ! LIBTAR_H */
311
+
@@ -0,0 +1,146 @@
1
+ /*
2
+ ** Copyright 1998-2003 University of Illinois Board of Trustees
3
+ ** Copyright 1998-2003 Mark D. Roth
4
+ ** All rights reserved.
5
+ **
6
+ ** output.c - libtar code to print out tar header blocks
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 <pwd.h>
17
+ #include <grp.h>
18
+ #include <time.h>
19
+ #include <limits.h>
20
+ #include <sys/param.h>
21
+
22
+ #ifdef STDC_HEADERS
23
+ # include <string.h>
24
+ #endif
25
+
26
+
27
+ #ifndef _POSIX_LOGIN_NAME_MAX
28
+ # define _POSIX_LOGIN_NAME_MAX 9
29
+ #endif
30
+
31
+
32
+ void
33
+ th_print(TAR *t)
34
+ {
35
+ puts("\nPrinting tar header:");
36
+ printf(" name = \"%.100s\"\n", t->th_buf.name);
37
+ printf(" mode = \"%.8s\"\n", t->th_buf.mode);
38
+ printf(" uid = \"%.8s\"\n", t->th_buf.uid);
39
+ printf(" gid = \"%.8s\"\n", t->th_buf.gid);
40
+ printf(" size = \"%.12s\"\n", t->th_buf.size);
41
+ printf(" mtime = \"%.12s\"\n", t->th_buf.mtime);
42
+ printf(" chksum = \"%.8s\"\n", t->th_buf.chksum);
43
+ printf(" typeflag = \'%c\'\n", t->th_buf.typeflag);
44
+ printf(" linkname = \"%.100s\"\n", t->th_buf.linkname);
45
+ printf(" magic = \"%.6s\"\n", t->th_buf.magic);
46
+ /*printf(" version = \"%.2s\"\n", t->th_buf.version); */
47
+ printf(" version[0] = \'%c\',version[1] = \'%c\'\n",
48
+ t->th_buf.version[0], t->th_buf.version[1]);
49
+ printf(" uname = \"%.32s\"\n", t->th_buf.uname);
50
+ printf(" gname = \"%.32s\"\n", t->th_buf.gname);
51
+ printf(" devmajor = \"%.8s\"\n", t->th_buf.devmajor);
52
+ printf(" devminor = \"%.8s\"\n", t->th_buf.devminor);
53
+ printf(" prefix = \"%.155s\"\n", t->th_buf.prefix);
54
+ printf(" padding = \"%.12s\"\n", t->th_buf.padding);
55
+ printf(" gnu_longname = \"%s\"\n",
56
+ (t->th_buf.gnu_longname ? t->th_buf.gnu_longname : "[NULL]"));
57
+ printf(" gnu_longlink = \"%s\"\n",
58
+ (t->th_buf.gnu_longlink ? t->th_buf.gnu_longlink : "[NULL]"));
59
+ }
60
+
61
+
62
+ void
63
+ th_print_long_ls(TAR *t)
64
+ {
65
+ char *filename;
66
+ char modestring[12];
67
+ #ifndef _WIN32 // modified by SUGAWARA Genki <sgwr_dts@yahoo.co.jp>
68
+ struct passwd *pw;
69
+ struct group *gr;
70
+ #endif
71
+ uid_t uid;
72
+ gid_t gid;
73
+ char username[_POSIX_LOGIN_NAME_MAX];
74
+ char groupname[_POSIX_LOGIN_NAME_MAX];
75
+ time_t mtime;
76
+ struct tm *mtm;
77
+
78
+ #ifdef HAVE_STRFTIME
79
+ char timebuf[18];
80
+ #else
81
+ const char *months[] = {
82
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
83
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
84
+ };
85
+ #endif
86
+
87
+ uid = th_get_uid(t);
88
+ #ifndef _WIN32 // modified by SUGAWARA Genki <sgwr_dts@yahoo.co.jp>
89
+ pw = getpwuid(uid);
90
+ if (pw == NULL)
91
+ snprintf(username, sizeof(username), "%d", uid);
92
+ else
93
+ strlcpy(username, pw->pw_name, sizeof(username));
94
+ #else
95
+ snprintf(username, sizeof(username), "%d", uid);
96
+ #endif
97
+
98
+ gid = th_get_gid(t);
99
+ #ifndef _WIN32 // modified by SUGAWARA Genki <sgwr_dts@yahoo.co.jp>
100
+ gr = getgrgid(gid);
101
+ if (gr == NULL)
102
+ snprintf(groupname, sizeof(groupname), "%d", gid);
103
+ else
104
+ strlcpy(groupname, gr->gr_name, sizeof(groupname));
105
+ #else
106
+ snprintf(groupname, sizeof(groupname), "%d", gid);
107
+ #endif
108
+ strmode(th_get_mode(t), modestring);
109
+ printf("%.10s %-8.8s %-8.8s ", modestring, username, groupname);
110
+
111
+ if (TH_ISCHR(t) || TH_ISBLK(t))
112
+ printf(" %3d, %3d ", th_get_devmajor(t), th_get_devminor(t));
113
+ else
114
+ printf("%9ld ", (long)th_get_size(t));
115
+
116
+ mtime = th_get_mtime(t);
117
+ mtm = localtime(&mtime);
118
+ #ifdef HAVE_STRFTIME
119
+ strftime(timebuf, sizeof(timebuf), "%h %e %H:%M %Y", mtm);
120
+ printf("%s", timebuf);
121
+ #else
122
+ printf("%.3s %2d %2d:%02d %4d",
123
+ months[mtm->tm_mon],
124
+ mtm->tm_mday, mtm->tm_hour, mtm->tm_min, mtm->tm_year + 1900);
125
+ #endif
126
+
127
+ filename = th_get_pathname(t);
128
+ printf(" %s", filename);
129
+ free(filename);
130
+
131
+ if (TH_ISSYM(t) || TH_ISLNK(t))
132
+ {
133
+ if (TH_ISSYM(t))
134
+ printf(" -> ");
135
+ else
136
+ printf(" link to ");
137
+ if ((t->options & TAR_GNU) && t->th_buf.gnu_longlink != NULL)
138
+ printf("%s", t->th_buf.gnu_longlink);
139
+ else
140
+ printf("%.100s", t->th_buf.linkname);
141
+ }
142
+
143
+ putchar('\n');
144
+ }
145
+
146
+