Mercurial > pidgin.yaz
annotate src/win32/untar.c @ 11279:ed5302df41b0
[gaim-migrate @ 13474]
Patch by Sadrul Habib Chowdhury to fix tab dragging. Many thanks also to
Cae for helping to track down the exact behavior, and for helping to test
this patch so that Sadrul could provide a version that actually fixes the
bug. :-)
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Tue, 16 Aug 2005 18:54:40 +0000 |
parents | 0f7452b1f777 |
children |
rev | line source |
---|---|
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
1 /* untar.c */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
2 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
3 /*#define VERSION "1.4"*/ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
4 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
5 /* DESCRIPTION: |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
6 * Untar extracts files from an uncompressed tar archive, or one which |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
7 * has been compressed with gzip. Usually such archives will have file |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
8 * names that end with ".tar" or ".tgz" respectively, although untar |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
9 * doesn't depend on any naming conventions. For a summary of the |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
10 * command-line options, run untar with no arguments. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
11 * |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
12 * HOW TO COMPILE: |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
13 * Untar doesn't require any special libraries or compile-time flags. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
14 * A simple "cc untar.c -o untar" (or the local equivalent) is |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
15 * sufficient. Even "make untar" works, without needing a Makefile. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
16 * For Microsoft Visual C++, the command is "cl /D_WEAK_POSIX untar.c" |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
17 * (for 32 bit compilers) or "cl /F 1400 untar.c" (for 16-bit). |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
18 * |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
19 * IF YOU SEE COMPILER WARNINGS, THAT'S NORMAL; you can ignore them. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
20 * Most of the warnings could be eliminated by adding #include <string.h> |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
21 * but that isn't portable -- some systems require <strings.h> and |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
22 * <malloc.h>, for example. Because <string.h> isn't quite portable, |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
23 * and isn't really necessary in the context of this program, it isn't |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
24 * included. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
25 * |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
26 * PORTABILITY: |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
27 * Untar only requires the <stdio.h> header. It uses old-style function |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
28 * definitions. It opens all files in binary mode. Taken together, |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
29 * this means that untar should compile & run on just about anything. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
30 * |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
31 * If your system supports the POSIX chmod(2), utime(2), link(2), and |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
32 * symlink(2) calls, then you may wish to compile with -D_POSIX_SOURCE, |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
33 * which will enable untar to use those system calls to restore the |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
34 * timestamp and permissions of the extracted files, and restore links. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
35 * (For Linux, _POSIX_SOURCE is always defined.) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
36 * |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
37 * For systems which support some POSIX features but not enough to support |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
38 * -D_POSIX_SOURCE, you might be able to use -D_WEAK_POSIX. This allows |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
39 * untar to restore time stamps and file permissions, but not links. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
40 * This should work for Microsoft systems, and hopefully others as well. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
41 * |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
42 * AUTHOR & COPYRIGHT INFO: |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
43 * Written by Steve Kirkendall, kirkenda@cs.pdx.edu |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
44 * Placed in public domain, 6 October 1995 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
45 * |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
46 * Portions derived from inflate.c -- Not copyrighted 1992 by Mark Adler |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
47 * version c10p1, 10 January 1993 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
48 * |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
49 * Altered by Herman Bloggs <hermanator12002@yahoo.com> |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
50 * April 4, 2003 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
51 * Changes: Stripped out gz compression code, added better interface for |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
52 * untar. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
53 */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
54 #include <windows.h> |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
55 #include <stdio.h> |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
56 #include <io.h> |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
57 #include <string.h> |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
58 #include <stdlib.h> |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
59 #ifndef SEEK_SET |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
60 # define SEEK_SET 0 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
61 #endif |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
62 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
63 #ifdef _WEAK_POSIX |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
64 # ifndef _POSIX_SOURCE |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
65 # define _POSIX_SOURCE |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
66 # endif |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
67 #endif |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
68 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
69 #ifdef _POSIX_SOURCE |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
70 # include <sys/types.h> |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
71 # include <sys/stat.h> |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
72 # include <sys/utime.h> |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
73 # ifdef _WEAK_POSIX |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
74 # define mode_t int |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
75 # else |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
76 # include <unistd.h> |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
77 # endif |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
78 #endif |
6425
26b739bc9f1a
[gaim-migrate @ 6933]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5005
diff
changeset
|
79 #include "debug.h" |
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
80 #include "untar.h" |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
7242
diff
changeset
|
81 #include <glib.h> |
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
82 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
7242
diff
changeset
|
83 #if GLIB_CHECK_VERSION(2,6,0) |
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
7242
diff
changeset
|
84 # include <glib/gstdio.h> |
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
7242
diff
changeset
|
85 #else |
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
86 #define mkdir(a,b) _mkdir((a)) |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
7242
diff
changeset
|
87 #define g_mkdir mkdir |
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
7242
diff
changeset
|
88 #define g_fopen fopen |
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
7242
diff
changeset
|
89 #define g_unlink unlink |
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
7242
diff
changeset
|
90 #endif |
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
7242
diff
changeset
|
91 |
7242
59ffe137176d
[gaim-migrate @ 7817]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
6425
diff
changeset
|
92 #define untar_error( error, args... ) gaim_debug(GAIM_DEBUG_ERROR, "untar", error, ## args ) |
59ffe137176d
[gaim-migrate @ 7817]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
6425
diff
changeset
|
93 #define untar_warning( warning, args... ) gaim_debug(GAIM_DEBUG_WARNING, "untar", warning, ## args ) |
6425
26b739bc9f1a
[gaim-migrate @ 6933]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5005
diff
changeset
|
94 #define untar_verbose( args... ) gaim_debug(GAIM_DEBUG_INFO, "untar", ## args ) |
26b739bc9f1a
[gaim-migrate @ 6933]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5005
diff
changeset
|
95 |
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
96 #define WSIZE 32768 /* size of decompression buffer */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
97 #define TSIZE 512 /* size of a "tape" block */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
98 #define CR 13 /* carriage-return character */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
99 #define LF 10 /* line-feed character */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
100 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
101 typedef unsigned char Uchar_t; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
102 typedef unsigned short Ushort_t; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
103 typedef unsigned long Ulong_t; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
104 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
105 typedef struct |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
106 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
107 char filename[100]; /* 0 name of next file */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
108 char mode[8]; /* 100 Permissions and type (octal digits) */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
109 char owner[8]; /* 108 Owner ID (ignored) */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
110 char group[8]; /* 116 Group ID (ignored) */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
111 char size[12]; /* 124 Bytes in file (octal digits) */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
112 char mtime[12]; /* 136 Modification time stamp (octal digits)*/ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
113 char checksum[8]; /* 148 Header checksum (ignored) */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
114 char type; /* 156 File type (see below) */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
115 char linkto[100]; /* 157 Linked-to name */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
116 char brand[8]; /* 257 Identifies tar version (ignored) */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
117 char ownername[32]; /* 265 Name of owner (ignored) */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
118 char groupname[32]; /* 297 Name of group (ignored) */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
119 char devmajor[8]; /* 329 Device major number (ignored) */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
120 char defminor[8]; /* 337 Device minor number (ignored) */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
121 char prefix[155]; /* 345 Prefix of name (optional) */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
122 char RESERVED[12]; /* 500 Pad header size to 512 bytes */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
123 } tar_t; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
124 #define ISREGULAR(hdr) ((hdr).type < '1' || (hdr).type > '6') |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
125 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
126 Uchar_t slide[WSIZE]; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
127 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
128 static const char *inname = NULL; /* name of input archive */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
129 static FILE *infp = NULL; /* input byte stream */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
130 static FILE *outfp = NULL; /* output stream, for file currently being extracted */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
131 static Ulong_t outsize = 0; /* number of bytes remainin in file currently being extracted */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
132 static char **only = NULL; /* array of filenames to extract/list */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
133 static int nonlys = 0; /* number of filenames in "only" array; 0=extract all */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
134 static int didabs = 0; /* were any filenames affected by the absence of -p? */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
135 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
136 static untar_opt untarops = 0; /* Untar options */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
137 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
138 /* Options checked during untar process */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
139 #define LISTING (untarops & UNTAR_LISTING) /* 1 if listing, 0 if extracting */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
140 #define QUIET (untarops & UNTAR_QUIET) /* 1 to write nothing to stdout, 0 for normal chatter */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
141 #define VERBOSE (untarops & UNTAR_VERBOSE) /* 1 to write extra information to stdout */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
142 #define FORCE (untarops & UNTAR_FORCE) /* 1 to overwrite existing files, 0 to skip them */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
143 #define ABSPATH (untarops & UNTAR_ABSPATH) /* 1 to allow leading '/', 0 to strip leading '/' */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
144 #define CONVERT (untarops & UNTAR_CONVERT) /* 1 to convert newlines, 0 to leave unchanged */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
145 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
146 /*----------------------------------------------------------------------------*/ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
147 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
148 /* create a file for writing. If necessary, create the directories leading up |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
149 * to that file as well. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
150 */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
151 static FILE *createpath(name) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
152 char *name; /* pathname of file to create */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
153 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
154 FILE *fp; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
155 int i; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
156 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
157 /* if we aren't allowed to overwrite and this file exists, return NULL */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
158 if (!FORCE && access(name, 0) == 0) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
159 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
160 untar_warning("%s: exists, will not overwrite without \"FORCE option\"\n", name); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
161 return NULL; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
162 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
163 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
164 /* first try creating it the easy way */ |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
7242
diff
changeset
|
165 fp = g_fopen(name, CONVERT ? "w" : "wb"); |
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
166 if (fp) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
167 return fp; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
168 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
169 /* Else try making all of its directories, and then try creating |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
170 * the file again. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
171 */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
172 for (i = 0; name[i]; i++) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
173 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
174 /* If this is a slash, then temporarily replace the '/' |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
175 * with a '\0' and do a mkdir() on the resulting string. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
176 * Ignore errors for now. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
177 */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
178 if (name[i] == '/') |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
179 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
180 name[i] = '\0'; |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
7242
diff
changeset
|
181 (void)g_mkdir(name, 0777); |
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
182 name[i] = '/'; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
183 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
184 } |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
7242
diff
changeset
|
185 fp = g_fopen(name, CONVERT ? "w" : "wb"); |
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
186 if (!fp) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
187 untar_error("Error opening: %s\n", name); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
188 return fp; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
189 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
190 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
191 /* Create a link, or copy a file. If the file is copied (not linked) then |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
192 * give a warning. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
193 */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
194 static void linkorcopy(src, dst, sym) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
195 char *src; /* name of existing source file */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
196 char *dst; /* name of new destination file */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
197 int sym; /* use symlink instead of link */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
198 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
199 FILE *fpsrc; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
200 FILE *fpdst; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
201 int c; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
202 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
203 /* Open the source file. We do this first to make sure it exists */ |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
7242
diff
changeset
|
204 fpsrc = g_fopen(src, "rb"); |
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
205 if (!fpsrc) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
206 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
207 untar_error("Error opening: %s\n", src); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
208 return; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
209 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
210 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
211 /* Create the destination file. On POSIX systems, this is just to |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
212 * make sure the directory path exists. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
213 */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
214 fpdst = createpath(dst); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
215 if (!fpdst) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
216 /* error message already given */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
217 return; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
218 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
219 #ifdef _POSIX_SOURCE |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
220 # ifndef _WEAK_POSIX |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
221 /* first try to link it over, instead of copying */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
222 fclose(fpdst); |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
7242
diff
changeset
|
223 g_unlink(dst); |
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
224 if (sym) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
225 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
226 if (symlink(src, dst)) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
227 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
228 perror(dst); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
229 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
230 fclose(fpsrc); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
231 return; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
232 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
233 if (!link(src, dst)) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
234 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
235 /* This story had a happy ending */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
236 fclose(fpsrc); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
237 return; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
238 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
239 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
240 /* Dang. Reopen the destination again */ |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
7242
diff
changeset
|
241 fpdst = g_fopen(dst, "wb"); |
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
242 /* This *can't* fail */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
243 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
244 # endif /* _WEAK_POSIX */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
245 #endif /* _POSIX_SOURCE */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
246 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
247 /* Copy characters */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
248 while ((c = getc(fpsrc)) != EOF) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
249 putc(c, fpdst); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
250 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
251 /* Close the files */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
252 fclose(fpsrc); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
253 fclose(fpdst); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
254 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
255 /* Give a warning */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
256 untar_warning("%s: copy instead of link\n", dst); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
257 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
258 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
259 /* This calls fwrite(), possibly after converting CR-LF to LF */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
260 static void cvtwrite(blk, size, fp) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
261 Uchar_t *blk; /* the block to be written */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
262 Ulong_t size; /* number of characters to be written */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
263 FILE *fp; /* file to write to */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
264 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
265 int i, j; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
266 static Uchar_t mod[TSIZE]; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
267 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
268 if (CONVERT) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
269 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
270 for (i = j = 0; i < size; i++) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
271 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
272 /* convert LF to local newline convention */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
273 if (blk[i] == LF) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
274 mod[j++] = '\n'; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
275 /* If CR-LF pair, then delete the CR */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
276 else if (blk[i] == CR && (i+1 >= size || blk[i+1] == LF)) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
277 ; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
278 /* other characters copied literally */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
279 else |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
280 mod[j++] = blk[i]; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
281 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
282 size = j; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
283 blk = mod; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
284 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
285 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
286 fwrite(blk, (size_t)size, sizeof(Uchar_t), fp); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
287 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
288 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
289 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
290 /* Compute the checksum of a tar header block, and return it as a long int. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
291 * The checksum can be computed using either POSIX rules (unsigned bytes) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
292 * or Sun rules (signed bytes). |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
293 */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
294 static long checksum(tblk, sunny) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
295 tar_t *tblk; /* buffer containing the tar header block */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
296 int sunny; /* Boolean: Sun-style checksums? (else POSIX) */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
297 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
298 long sum; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
299 char *scan; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
300 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
301 /* compute the sum of the first 148 bytes -- everything up to but not |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
302 * including the checksum field itself. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
303 */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
304 sum = 0L; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
305 for (scan = (char *)tblk; scan < tblk->checksum; scan++) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
306 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
307 sum += (*scan) & 0xff; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
308 if (sunny && (*scan & 0x80) != 0) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
309 sum -= 256; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
310 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
311 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
312 /* for the 8 bytes of the checksum field, add blanks to the sum */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
313 sum += ' ' * sizeof tblk->checksum; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
314 scan += sizeof tblk->checksum; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
315 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
316 /* finish counting the sum of the rest of the block */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
317 for (; scan < (char *)tblk + sizeof *tblk; scan++) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
318 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
319 sum += (*scan) & 0xff; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
320 if (sunny && (*scan & 0x80) != 0) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
321 sum -= 256; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
322 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
323 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
324 return sum; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
325 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
326 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
327 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
328 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
329 /* list files in an archive, and optionally extract them as well */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
330 static int untar_block(Uchar_t *blk) { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
331 static char nbuf[256];/* storage space for prefix+name, combined */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
332 static char *name,*n2;/* prefix and name, combined */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
333 static int first = 1;/* Boolean: first block of archive? */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
334 long sum; /* checksum for this block */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
335 int i; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
336 tar_t tblk[1]; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
337 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
338 #ifdef _POSIX_SOURCE |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
339 static mode_t mode; /* file permissions */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
340 static struct utimbuf timestamp; /* file timestamp */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
341 #endif |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
342 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
343 /* make a local copy of the block, and treat it as a tar header */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
344 tblk[0] = *(tar_t *)blk; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
345 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
346 /* process each type of tape block differently */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
347 if (outsize > TSIZE) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
348 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
349 /* data block, but not the last one */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
350 if (outfp) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
351 cvtwrite(blk, (Ulong_t)TSIZE, outfp); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
352 outsize -= TSIZE; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
353 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
354 else if (outsize > 0) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
355 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
356 /* last data block of current file */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
357 if (outfp) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
358 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
359 cvtwrite(blk, outsize, outfp); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
360 fclose(outfp); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
361 outfp = NULL; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
362 #ifdef _POSIX_SOURCE |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
363 utime(nbuf, ×tamp); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
364 chmod(nbuf, mode); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
365 #endif |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
366 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
367 outsize = 0; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
368 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
369 else if ((tblk)->filename[0] == '\0') |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
370 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
371 /* end-of-archive marker */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
372 if (didabs) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
373 untar_warning("Removed leading slashes because \"ABSPATH option\" wasn't given.\n"); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
374 return 1; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
375 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
376 else |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
377 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
378 /* file header */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
379 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
380 /* half-assed verification -- does it look like header? */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
381 if ((tblk)->filename[99] != '\0' |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
382 || ((tblk)->size[0] < '0' |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
383 && (tblk)->size[0] != ' ') |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
384 || (tblk)->size[0] > '9') |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
385 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
386 if (first) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
387 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
388 untar_error("%s: not a valid tar file\n", inname); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
389 return 0; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
390 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
391 else |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
392 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
393 untar_error("Garbage detected; preceding file may be damaged\n"); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
394 return 0; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
395 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
396 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
397 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
398 /* combine prefix and filename */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
399 memset(nbuf, 0, sizeof nbuf); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
400 name = nbuf; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
401 if ((tblk)->prefix[0]) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
402 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
403 strncpy(name, (tblk)->prefix, sizeof (tblk)->prefix); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
404 strcat(name, "/"); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
405 strncat(name + strlen(name), (tblk)->filename, |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
406 sizeof (tblk)->filename); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
407 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
408 else |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
409 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
410 strncpy(name, (tblk)->filename, |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
411 sizeof (tblk)->filename); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
412 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
413 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
414 /* Convert any backslashes to forward slashes, and guard |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
415 * against doubled-up slashes. (Some DOS versions of "tar" |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
416 * get this wrong.) Also strip off leading slashes. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
417 */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
418 if (!ABSPATH && (*name == '/' || *name == '\\')) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
419 didabs = 1; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
420 for (n2 = nbuf; *name; name++) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
421 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
422 if (*name == '\\') |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
423 *name = '/'; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
424 if (*name != '/' |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
425 || (ABSPATH && n2 == nbuf) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
426 || (n2 != nbuf && n2[-1] != '/')) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
427 *n2++ = *name; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
428 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
429 if (n2 == nbuf) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
430 *n2++ = '/'; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
431 *n2 = '\0'; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
432 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
433 /* verify the checksum */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
434 for (sum = 0L, i = 0; i < sizeof((tblk)->checksum); i++) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
435 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
436 if ((tblk)->checksum[i] >= '0' |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
437 && (tblk)->checksum[i] <= '7') |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
438 sum = sum * 8 + (tblk)->checksum[i] - '0'; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
439 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
440 if (sum != checksum(tblk, 0) && sum != checksum(tblk, 1)) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
441 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
442 if (!first) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
443 untar_error("Garbage detected; preceding file may be damaged\n"); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
444 untar_error("%s: header has bad checksum for %s\n", inname, nbuf); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
445 return 0; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
446 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
447 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
448 /* From this point on, we don't care whether this is the first |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
449 * block or not. Might as well reset the "first" flag now. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
450 */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
451 first = 0; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
452 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
453 /* if last character of name is '/' then assume directory */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
454 if (*nbuf && nbuf[strlen(nbuf) - 1] == '/') |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
455 (tblk)->type = '5'; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
456 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
457 /* convert file size */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
458 for (outsize = 0L, i = 0; i < sizeof((tblk)->size); i++) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
459 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
460 if ((tblk)->size[i] >= '0' && (tblk)->size[i] <= '7') |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
461 outsize = outsize * 8 + (tblk)->size[i] - '0'; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
462 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
463 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
464 #ifdef _POSIX_SOURCE |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
465 /* convert file timestamp */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
466 for (timestamp.modtime=0L, i=0; i < sizeof((tblk)->mtime); i++) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
467 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
468 if ((tblk)->mtime[i] >= '0' && (tblk)->mtime[i] <= '7') |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
469 timestamp.modtime = timestamp.modtime * 8 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
470 + (tblk)->mtime[i] - '0'; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
471 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
472 timestamp.actime = timestamp.modtime; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
473 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
474 /* convert file permissions */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
475 for (mode = i = 0; i < sizeof((tblk)->mode); i++) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
476 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
477 if ((tblk)->mode[i] >= '0' && (tblk)->mode[i] <= '7') |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
478 mode = mode * 8 + (tblk)->mode[i] - '0'; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
479 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
480 #endif |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
481 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
482 /* If we have an "only" list, and this file isn't in it, |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
483 * then skip it. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
484 */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
485 if (nonlys > 0) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
486 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
487 for (i = 0; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
488 i < nonlys |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
489 && strcmp(only[i], nbuf) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
490 && (strncmp(only[i], nbuf, strlen(only[i])) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
491 || nbuf[strlen(only[i])] != '/'); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
492 i++) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
493 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
494 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
495 if (i >= nonlys) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
496 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
497 outfp = NULL; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
498 return 1; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
499 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
500 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
501 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
502 /* list the file */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
503 if (VERBOSE) |
6425
26b739bc9f1a
[gaim-migrate @ 6933]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5005
diff
changeset
|
504 untar_verbose("%c %s", |
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
505 ISREGULAR(*tblk) ? '-' : ("hlcbdp"[(tblk)->type - '1']), |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
506 nbuf); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
507 else if (!QUIET) |
6425
26b739bc9f1a
[gaim-migrate @ 6933]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5005
diff
changeset
|
508 untar_verbose("%s\n", nbuf); |
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
509 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
510 /* if link, then do the link-or-copy thing */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
511 if (tblk->type == '1' || tblk->type == '2') |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
512 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
513 if (VERBOSE) |
6425
26b739bc9f1a
[gaim-migrate @ 6933]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5005
diff
changeset
|
514 untar_verbose(" -> %s\n", tblk->linkto); |
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
515 if (!LISTING) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
516 linkorcopy(tblk->linkto, nbuf, tblk->type == '2'); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
517 outsize = 0L; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
518 return 1; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
519 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
520 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
521 /* If directory, then make a weak attempt to create it. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
522 * Ideally we would do the "create path" thing, but that |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
523 * seems like more trouble than it's worth since traditional |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
524 * tar archives don't contain directories anyway. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
525 */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
526 if (tblk->type == '5') |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
527 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
528 if (LISTING) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
529 n2 = " directory"; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
530 #ifdef _POSIX_SOURCE |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
531 else if (mkdir(nbuf, mode) == 0) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
532 #else |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
7242
diff
changeset
|
533 else if (g_mkdir(nbuf, 0755) == 0) |
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
534 #endif |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
535 n2 = " created"; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
536 else |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
537 n2 = " ignored"; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
538 if (VERBOSE) |
6425
26b739bc9f1a
[gaim-migrate @ 6933]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5005
diff
changeset
|
539 untar_verbose("%s\n", n2); |
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
540 return 1; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
541 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
542 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
543 /* if not a regular file, then skip it */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
544 if (!ISREGULAR(*tblk)) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
545 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
546 if (VERBOSE) |
6425
26b739bc9f1a
[gaim-migrate @ 6933]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5005
diff
changeset
|
547 untar_verbose(" ignored\n"); |
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
548 outsize = 0L; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
549 return 1; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
550 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
551 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
552 /* print file statistics */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
553 if (VERBOSE) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
554 { |
6425
26b739bc9f1a
[gaim-migrate @ 6933]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5005
diff
changeset
|
555 untar_verbose(" (%ld byte%s, %ld tape block%s)\n", |
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
556 outsize, |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
557 outsize == 1 ? "" : "s", |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
558 (outsize + TSIZE - 1) / TSIZE, |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
559 (outsize > 0 && outsize <= TSIZE) ? "" : "s"); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
560 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
561 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
562 /* if extracting, then try to create the file */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
563 if (!LISTING) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
564 outfp = createpath(nbuf); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
565 else |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
566 outfp = NULL; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
567 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
568 /* if file is 0 bytes long, then we're done already! */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
569 if (outsize == 0 && outfp) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
570 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
571 fclose(outfp); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
572 #ifdef _POSIX_SOURCE |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
573 utime(nbuf, ×tamp); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
574 chmod(nbuf, mode); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
575 #endif |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
576 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
577 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
578 return 1; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
579 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
580 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
581 /* Process an archive file. This involves reading the blocks one at a time |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
582 * and passing them to a untar() function. |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
583 */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
584 int untar(const char *filename, const char* destdir, untar_opt options) { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
585 int ret=1; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
586 char curdir[_MAX_PATH]; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
587 untarops = options; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
588 /* open the archive */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
589 inname = filename; |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
7242
diff
changeset
|
590 infp = g_fopen(filename, "rb"); |
5005
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
591 if (!infp) |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
592 { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
593 untar_error("Error opening: %s\n", filename); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
594 return 0; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
595 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
596 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
597 /* Set current directory */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
598 if(!GetCurrentDirectory(_MAX_PATH, curdir)) { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
599 untar_error("Could not get current directory (error %d).\n", GetLastError()); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
600 fclose(infp); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
601 return 0; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
602 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
603 if(!SetCurrentDirectory(destdir)) { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
604 untar_error("Could not set current directory to (error %d): %s\n", GetLastError(), destdir); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
605 fclose(infp); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
606 return 0; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
607 } else { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
608 /* UNCOMPRESSED */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
609 /* send each block to the untar_block() function */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
610 while (fread(slide, 1, TSIZE, infp) == TSIZE) { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
611 if(!untar_block(slide)) { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
612 untar_error("untar failure: %s\n", filename); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
613 fclose(infp); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
614 ret=0; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
615 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
616 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
617 if (outsize > 0 && ret) { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
618 untar_warning("Last file might be truncated!\n"); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
619 fclose(outfp); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
620 outfp = NULL; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
621 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
622 if(!SetCurrentDirectory(curdir)) { |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
623 untar_error("Could not set current dir back to original (error %d).\n", GetLastError()); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
624 ret=0; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
625 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
626 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
627 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
628 /* close the archive file. */ |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
629 fclose(infp); |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
630 |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
631 return ret; |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
632 } |
a1f9725f4816
[gaim-migrate @ 5340]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
633 |