pidgin/win32/untar.c

Mon, 08 Jun 2009 02:24:49 +0000

author
Elliott Sales de Andrade <qulogic@pidgin.im>
date
Mon, 08 Jun 2009 02:24:49 +0000
changeset 27314
402d25ce01da
parent 26573
24c7d3ba4e9b
child 29492
25c9a945380f
permissions
-rw-r--r--

Use the JID for adding a chat/buddy because the name is for descriptive
purpose only, and using it will not fill in the Add Chat dialog correctly.
Because the JID is not visible, the user will not know what to actually put
there instead.

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
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
83 #if GLIB_CHECK_VERSION(2,6,0)
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
84 # include <glib/gstdio.h>
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
85 #else
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
86 #define mkdir(a,b) _mkdir((a))
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
87 #define g_mkdir mkdir
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
88 #define g_fopen fopen
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
89 #define g_unlink unlink
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
90 #endif
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
91
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
92 #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
93 #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
94 #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
95
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
96 #define WSIZE 32768 /* size of decompression buffer */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
97 #define TSIZE 512 /* size of a "tape" block */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
98 #define CR 13 /* carriage-return character */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
99 #define LF 10 /* line-feed character */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
100
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
101 typedef unsigned char Uchar_t;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
102 typedef unsigned short Ushort_t;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
103 typedef unsigned long Ulong_t;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
104
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
105 typedef struct
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
106 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
107 char filename[100]; /* 0 name of next file */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
108 char mode[8]; /* 100 Permissions and type (octal digits) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
109 char owner[8]; /* 108 Owner ID (ignored) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
110 char group[8]; /* 116 Group ID (ignored) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
111 char size[12]; /* 124 Bytes in file (octal digits) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
112 char mtime[12]; /* 136 Modification time stamp (octal digits)*/
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
113 char checksum[8]; /* 148 Header checksum (ignored) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
114 char type; /* 156 File type (see below) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
115 char linkto[100]; /* 157 Linked-to name */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
116 char brand[8]; /* 257 Identifies tar version (ignored) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
117 char ownername[32]; /* 265 Name of owner (ignored) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
118 char groupname[32]; /* 297 Name of group (ignored) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
119 char devmajor[8]; /* 329 Device major number (ignored) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
120 char defminor[8]; /* 337 Device minor number (ignored) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
121 char prefix[155]; /* 345 Prefix of name (optional) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
122 char RESERVED[12]; /* 500 Pad header size to 512 bytes */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
123 } tar_t;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
124 #define ISREGULAR(hdr) ((hdr).type < '1' || (hdr).type > '6')
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
125
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
126 Uchar_t slide[WSIZE];
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
127
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
128 static const char *inname = NULL; /* name of input archive */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
129 static FILE *infp = NULL; /* input byte stream */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
130 static FILE *outfp = NULL; /* output stream, for file currently being extracted */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
131 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
132 static char **only = NULL; /* array of filenames to extract/list */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
133 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
134 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
135
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
136 static untar_opt untarops = 0; /* Untar options */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
137
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
138 /* Options checked during untar process */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
139 #define LISTING (untarops & UNTAR_LISTING) /* 1 if listing, 0 if extracting */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
140 #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
141 #define VERBOSE (untarops & UNTAR_VERBOSE) /* 1 to write extra information to stdout */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
142 #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
143 #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
144 #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
145
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
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
148 /* create a file for writing. If necessary, create the directories leading up
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
149 * to that file as well.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
150 */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
151 static FILE *createpath(name)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
152 char *name; /* pathname of file to create */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
153 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
154 FILE *fp;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
155 int i;
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 /* 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
158 if (!FORCE && access(name, 0) == 0)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
159 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
160 untar_warning("%s: exists, will not overwrite without \"FORCE option\"\n", name);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
161 return NULL;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
162 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
163
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
164 /* first try creating it the easy way */
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
165 fp = g_fopen(name, CONVERT ? "w" : "wb");
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
166 if (fp)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
167 return fp;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
168
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
169 /* Else try making all of its directories, and then try creating
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
170 * the file again.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
171 */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
172 for (i = 0; name[i]; i++)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
173 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
174 /* If this is a slash, then temporarily replace the '/'
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
175 * with a '\0' and do a mkdir() on the resulting string.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
176 * Ignore errors for now.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
177 */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
178 if (name[i] == '/')
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
179 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
180 name[i] = '\0';
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
181 (void)g_mkdir(name, 0777);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
182 name[i] = '/';
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 }
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
185 fp = g_fopen(name, CONVERT ? "w" : "wb");
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
186 if (!fp)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
187 untar_error("Error opening: %s\n", name);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
188 return fp;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
189 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
190
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
191 /* 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
192 * give a warning.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
193 */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
194 static void linkorcopy(src, dst, sym)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
195 char *src; /* name of existing source file */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
196 char *dst; /* name of new destination file */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
197 int sym; /* use symlink instead of link */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
198 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
199 FILE *fpsrc;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
200 FILE *fpdst;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
201 int c;
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 /* 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
204 fpsrc = g_fopen(src, "rb");
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
205 if (!fpsrc)
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 untar_error("Error opening: %s\n", src);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
208 return;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
209 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
210
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
211 /* Create the destination file. On POSIX systems, this is just to
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
212 * make sure the directory path exists.
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 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
215 if (!fpdst) {
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
216 /* 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
217 fclose(fpsrc);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
218 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
219 }
5005
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 #ifdef _POSIX_SOURCE
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
222 # ifndef _WEAK_POSIX
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
223 /* first try to link it over, instead of copying */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
224 fclose(fpdst);
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
225 g_unlink(dst);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
226 if (sym)
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 (symlink(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 perror(dst);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
231 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
232 fclose(fpsrc);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
233 return;
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 if (!link(src, dst))
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
236 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
237 /* This story had a happy ending */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
238 fclose(fpsrc);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
239 return;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
240 }
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 /* Dang. Reopen the destination again */
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
243 fpdst = g_fopen(dst, "wb");
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
244 /* This *can't* fail */
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 # endif /* _WEAK_POSIX */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
247 #endif /* _POSIX_SOURCE */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
248
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
249 /* Copy characters */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
250 while ((c = getc(fpsrc)) != EOF)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
251 putc(c, fpdst);
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 /* Close the files */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
254 fclose(fpsrc);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
255 fclose(fpdst);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
256
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
257 /* Give a warning */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
258 untar_warning("%s: copy instead of link\n", dst);
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
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
261 /* This calls fwrite(), possibly after converting CR-LF to LF */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
262 static void cvtwrite(blk, size, fp)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
263 Uchar_t *blk; /* the block to be written */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
264 Ulong_t size; /* number of characters to be written */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
265 FILE *fp; /* file to write to */
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 int i, j;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
268 static Uchar_t mod[TSIZE];
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
269
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
270 if (CONVERT)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
271 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
272 for (i = j = 0; i < size; i++)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
273 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
274 /* convert LF to local newline convention */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
275 if (blk[i] == LF)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
276 mod[j++] = '\n';
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
277 /* If CR-LF pair, then delete the CR */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
278 else if (blk[i] == CR && (i+1 >= size || blk[i+1] == LF))
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 /* other characters copied literally */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
281 else
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
282 mod[j++] = blk[i];
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 size = j;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
285 blk = mod;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
286 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
287
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
288 fwrite(blk, (size_t)size, sizeof(Uchar_t), fp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
289 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
290
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
291
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
292 /* 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
293 * The checksum can be computed using either POSIX rules (unsigned bytes)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
294 * or Sun rules (signed bytes).
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 static long checksum(tblk, sunny)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
297 tar_t *tblk; /* buffer containing the tar header block */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
298 int sunny; /* Boolean: Sun-style checksums? (else POSIX) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
299 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
300 long sum;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
301 char *scan;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
302
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
303 /* 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
304 * including the checksum field itself.
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 sum = 0L;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
307 for (scan = (char *)tblk; scan < tblk->checksum; scan++)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
308 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
309 sum += (*scan) & 0xff;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
310 if (sunny && (*scan & 0x80) != 0)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
311 sum -= 256;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
312 }
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 /* 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
315 sum += ' ' * sizeof tblk->checksum;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
316 scan += sizeof tblk->checksum;
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 /* finish counting the sum of the rest of the block */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
319 for (; scan < (char *)tblk + sizeof *tblk; scan++)
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 sum += (*scan) & 0xff;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
322 if (sunny && (*scan & 0x80) != 0)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
323 sum -= 256;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
324 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
325
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
326 return sum;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
327 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
328
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
329
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
330
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
331 /* list files in an archive, and optionally extract them as well */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
332 static int untar_block(Uchar_t *blk) {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
333 static char nbuf[256];/* storage space for prefix+name, combined */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
334 static char *name,*n2;/* prefix and name, combined */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
335 static int first = 1;/* Boolean: first block of archive? */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
336 long sum; /* checksum for this block */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
337 int i;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
338 tar_t tblk[1];
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
339
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
340 #ifdef _POSIX_SOURCE
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
341 static mode_t mode; /* file permissions */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
342 static struct utimbuf timestamp; /* file timestamp */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
343 #endif
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
344
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
345 /* 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
346 tblk[0] = *(tar_t *)blk;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
347
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
348 /* process each type of tape block differently */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
349 if (outsize > TSIZE)
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 /* data block, but not the last one */
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 cvtwrite(blk, (Ulong_t)TSIZE, outfp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
354 outsize -= TSIZE;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
355 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
356 else if (outsize > 0)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
357 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
358 /* last data block of current file */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
359 if (outfp)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
360 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
361 cvtwrite(blk, outsize, outfp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
362 fclose(outfp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
363 outfp = NULL;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
364 #ifdef _POSIX_SOURCE
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
365 utime(nbuf, &timestamp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
366 chmod(nbuf, mode);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
367 #endif
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
368 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
369 outsize = 0;
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 if ((tblk)->filename[0] == '\0')
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 /* end-of-archive marker */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
374 if (didabs)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
375 untar_warning("Removed leading slashes because \"ABSPATH option\" wasn't given.\n");
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
376 return 1;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
377 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
378 else
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
379 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
380 /* file header */
22687
3cb9f701d421 printf format warning fixes.
Daniel Atallah <datallah@pidgin.im>
parents: 15884
diff changeset
381
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
382 /* half-assed verification -- does it look like header? */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
383 if ((tblk)->filename[99] != '\0'
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
384 || ((tblk)->size[0] < '0'
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
385 && (tblk)->size[0] != ' ')
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
386 || (tblk)->size[0] > '9')
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 if (first)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
389 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
390 untar_error("%s: not a valid tar file\n", inname);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
391 return 0;
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 else
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
394 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
395 untar_error("Garbage detected; preceding file may be damaged\n");
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
396 return 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 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
399
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
400 /* combine prefix and filename */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
401 memset(nbuf, 0, sizeof nbuf);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
402 name = nbuf;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
403 if ((tblk)->prefix[0])
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)->prefix, sizeof (tblk)->prefix);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
406 strcat(name, "/");
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
407 strncat(name + strlen(name), (tblk)->filename,
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
408 sizeof (tblk)->filename);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
409 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
410 else
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
411 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
412 strncpy(name, (tblk)->filename,
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
413 sizeof (tblk)->filename);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
414 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
415
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
416 /* Convert any backslashes to forward slashes, and guard
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
417 * against doubled-up slashes. (Some DOS versions of "tar"
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
418 * get this wrong.) Also strip off leading slashes.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
419 */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
420 if (!ABSPATH && (*name == '/' || *name == '\\'))
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
421 didabs = 1;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
422 for (n2 = nbuf; *name; 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 (*name == '\\')
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
425 *name = '/';
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
426 if (*name != '/'
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
427 || (ABSPATH && n2 == nbuf)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
428 || (n2 != nbuf && n2[-1] != '/'))
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
429 *n2++ = *name;
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 (n2 == nbuf)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
432 *n2++ = '/';
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
433 *n2 = '\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 /* verify the checksum */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
436 for (sum = 0L, i = 0; i < sizeof((tblk)->checksum); i++)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
437 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
438 if ((tblk)->checksum[i] >= '0'
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
439 && (tblk)->checksum[i] <= '7')
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
440 sum = sum * 8 + (tblk)->checksum[i] - '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 if (sum != checksum(tblk, 0) && sum != checksum(tblk, 1))
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
443 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
444 if (!first)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
445 untar_error("Garbage detected; preceding file may be damaged\n");
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
446 untar_error("%s: header has bad checksum for %s\n", inname, nbuf);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
447 return 0;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
448 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
449
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
450 /* 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
451 * block or not. Might as well reset the "first" flag now.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
452 */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
453 first = 0;
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 last character of name is '/' then assume directory */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
456 if (*nbuf && nbuf[strlen(nbuf) - 1] == '/')
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
457 (tblk)->type = '5';
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 /* convert file size */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
460 for (outsize = 0L, i = 0; i < sizeof((tblk)->size); i++)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
461 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
462 if ((tblk)->size[i] >= '0' && (tblk)->size[i] <= '7')
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
463 outsize = outsize * 8 + (tblk)->size[i] - '0';
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
464 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
465
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
466 #ifdef _POSIX_SOURCE
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
467 /* convert file timestamp */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
468 for (timestamp.modtime=0L, i=0; i < sizeof((tblk)->mtime); i++)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
469 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
470 if ((tblk)->mtime[i] >= '0' && (tblk)->mtime[i] <= '7')
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
471 timestamp.modtime = timestamp.modtime * 8
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
472 + (tblk)->mtime[i] - '0';
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
473 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
474 timestamp.actime = timestamp.modtime;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
475
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
476 /* convert file permissions */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
477 for (mode = i = 0; i < sizeof((tblk)->mode); i++)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
478 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
479 if ((tblk)->mode[i] >= '0' && (tblk)->mode[i] <= '7')
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
480 mode = mode * 8 + (tblk)->mode[i] - '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 #endif
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
483
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
484 /* 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
485 * then skip it.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
486 */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
487 if (nonlys > 0)
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 for (i = 0;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
490 i < nonlys
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
491 && strcmp(only[i], nbuf)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
492 && (strncmp(only[i], nbuf, strlen(only[i]))
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
493 || nbuf[strlen(only[i])] != '/');
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
494 i++)
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 if (i >= nonlys)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
498 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
499 outfp = NULL;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
500 return 1;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
501 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
502 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
503
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
504 /* list the file */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
505 if (VERBOSE)
6425
3e86c949c98a [gaim-migrate @ 6933]
Herman Bloggs <herman@bluedigits.com>
parents: 5005
diff changeset
506 untar_verbose("%c %s",
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
507 ISREGULAR(*tblk) ? '-' : ("hlcbdp"[(tblk)->type - '1']),
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
508 nbuf);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
509 else if (!QUIET)
6425
3e86c949c98a [gaim-migrate @ 6933]
Herman Bloggs <herman@bluedigits.com>
parents: 5005
diff changeset
510 untar_verbose("%s\n", nbuf);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
511
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
512 /* if link, then do the link-or-copy thing */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
513 if (tblk->type == '1' || tblk->type == '2')
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 if (VERBOSE)
6425
3e86c949c98a [gaim-migrate @ 6933]
Herman Bloggs <herman@bluedigits.com>
parents: 5005
diff changeset
516 untar_verbose(" -> %s\n", tblk->linkto);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
517 if (!LISTING)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
518 linkorcopy(tblk->linkto, nbuf, tblk->type == '2');
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
519 outsize = 0L;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
520 return 1;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
521 }
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 directory, then make a weak attempt to create it.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
524 * Ideally we would do the "create path" thing, but that
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
525 * seems like more trouble than it's worth since traditional
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
526 * tar archives don't contain directories anyway.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
527 */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
528 if (tblk->type == '5')
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
529 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
530 if (LISTING)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
531 n2 = " directory";
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
532 #ifdef _POSIX_SOURCE
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
533 else if (mkdir(nbuf, mode) == 0)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
534 #else
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
535 else if (g_mkdir(nbuf, 0755) == 0)
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
536 #endif
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
537 n2 = " created";
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
538 else
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
539 n2 = " ignored";
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
540 if (VERBOSE)
6425
3e86c949c98a [gaim-migrate @ 6933]
Herman Bloggs <herman@bluedigits.com>
parents: 5005
diff changeset
541 untar_verbose("%s\n", n2);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
542 return 1;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
543 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
544
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
545 /* if not a regular file, then skip it */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
546 if (!ISREGULAR(*tblk))
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
547 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
548 if (VERBOSE)
6425
3e86c949c98a [gaim-migrate @ 6933]
Herman Bloggs <herman@bluedigits.com>
parents: 5005
diff changeset
549 untar_verbose(" ignored\n");
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
550 outsize = 0L;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
551 return 1;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
552 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
553
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
554 /* print file statistics */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
555 if (VERBOSE)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
556 {
6425
3e86c949c98a [gaim-migrate @ 6933]
Herman Bloggs <herman@bluedigits.com>
parents: 5005
diff changeset
557 untar_verbose(" (%ld byte%s, %ld tape block%s)\n",
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
558 outsize,
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
559 outsize == 1 ? "" : "s",
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
560 (outsize + TSIZE - 1) / TSIZE,
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
561 (outsize > 0 && outsize <= TSIZE) ? "" : "s");
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
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
564 /* if extracting, then try to create the file */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
565 if (!LISTING)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
566 outfp = createpath(nbuf);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
567 else
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
568 outfp = NULL;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
569
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
570 /* if file is 0 bytes long, then we're done already! */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
571 if (outsize == 0 && outfp)
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 fclose(outfp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
574 #ifdef _POSIX_SOURCE
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
575 utime(nbuf, &timestamp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
576 chmod(nbuf, mode);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
577 #endif
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 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
580 return 1;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
581 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
582
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
583 /* 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
584 * and passing them to a untar() function.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
585 */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
586 int untar(const char *filename, const char* destdir, untar_opt options) {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
587 int ret=1;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
588 char curdir[_MAX_PATH];
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
589 untarops = options;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
590 /* open the archive */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
591 inname = filename;
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
592 infp = g_fopen(filename, "rb");
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
593 if (!infp)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
594 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
595 untar_error("Error opening: %s\n", filename);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
596 return 0;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
597 }
22687
3cb9f701d421 printf format warning fixes.
Daniel Atallah <datallah@pidgin.im>
parents: 15884
diff changeset
598
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
599 /* Set current directory */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
600 if(!GetCurrentDirectory(_MAX_PATH, curdir)) {
22687
3cb9f701d421 printf format warning fixes.
Daniel Atallah <datallah@pidgin.im>
parents: 15884
diff changeset
601 untar_error("Could not get current directory (error %lu).\n", GetLastError());
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
602 fclose(infp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
603 return 0;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
604 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
605 if(!SetCurrentDirectory(destdir)) {
22687
3cb9f701d421 printf format warning fixes.
Daniel Atallah <datallah@pidgin.im>
parents: 15884
diff changeset
606 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
607 fclose(infp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
608 return 0;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
609 } else {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
610 /* UNCOMPRESSED */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
611 /* send each block to the untar_block() function */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
612 while (fread(slide, 1, TSIZE, infp) == TSIZE) {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
613 if(!untar_block(slide)) {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
614 untar_error("untar failure: %s\n", filename);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
615 fclose(infp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
616 ret=0;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
617 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
618 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
619 if (outsize > 0 && ret) {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
620 untar_warning("Last file might be truncated!\n");
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
621 fclose(outfp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
622 outfp = NULL;
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 if(!SetCurrentDirectory(curdir)) {
22687
3cb9f701d421 printf format warning fixes.
Daniel Atallah <datallah@pidgin.im>
parents: 15884
diff changeset
625 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
626 ret=0;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
627 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
628 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
629
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
630 /* close the archive file. */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
631 fclose(infp);
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 return ret;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
634 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
635

mercurial