pidgin/win32/untar.c

Wed, 21 Sep 2011 06:45:26 +0000

author
Elliott Sales de Andrade <qulogic@pidgin.im>
date
Wed, 21 Sep 2011 06:45:26 +0000
changeset 32575
eb4fc932fae9
parent 31105
b5d95fcb40e1
child 35858
ec92c3bfaf27
child 36171
89c89c449595
permissions
-rw-r--r--

Apply conversation theme when opening the GTK conversation. All the
parsing stuff was moved out of the theme code and into the conversation
code.

Someone (not me!) needs to check the code I commented out and see if
we really need that stuff (and then port it to WebKit/styling).

We also need to determine where to place Template.html and the rest
of our (not-yet-written) default theme.

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

mercurial