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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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, &timestamp);
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, &timestamp);
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