pidgin/win32/untar.c

Mon, 27 Sep 2021 20:42:30 -0500

author
Elliott Sales de Andrade <quantum.analyst@gmail.com>
date
Mon, 27 Sep 2021 20:42:30 -0500
changeset 41058
18f3ea2e7e6d
parent 40765
a5381c20e802
permissions
-rw-r--r--

Remove pidgin_dialog* helper functions

Since `homogeneous` on boxes is `FALSE` by default, I didn't bother setting it.

Testing Done:
Compile-only, mostly. I did check the Accounts windows, but requests are harder to check.

Reviewed at https://reviews.imfreedom.org/r/949/

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
40669
48dfed6f4f1f Fix Windows builds and tests
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40361
diff changeset
79 #include <glib.h>
48dfed6f4f1f Fix Windows builds and tests
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40361
diff changeset
80 #include <glib/gstdio.h>
48dfed6f4f1f Fix Windows builds and tests
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40361
diff changeset
81
48dfed6f4f1f Fix Windows builds and tests
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40361
diff changeset
82 #include <purple.h>
48dfed6f4f1f Fix Windows builds and tests
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40361
diff changeset
83
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
84 #include "untar.h"
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
85
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
86 #define WSIZE 32768 /* size of decompression buffer */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
87 #define TSIZE 512 /* size of a "tape" block */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
88 #define CR 13 /* carriage-return character */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
89 #define LF 10 /* line-feed character */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
90
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
91 typedef unsigned char Uchar_t;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
92 typedef unsigned short Ushort_t;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
93 typedef unsigned long Ulong_t;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
94
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
95 typedef struct
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
96 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
97 char filename[100]; /* 0 name of next file */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
98 char mode[8]; /* 100 Permissions and type (octal digits) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
99 char owner[8]; /* 108 Owner ID (ignored) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
100 char group[8]; /* 116 Group ID (ignored) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
101 char size[12]; /* 124 Bytes in file (octal digits) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
102 char mtime[12]; /* 136 Modification time stamp (octal digits)*/
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
103 char checksum[8]; /* 148 Header checksum (ignored) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
104 char type; /* 156 File type (see below) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
105 char linkto[100]; /* 157 Linked-to name */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
106 char brand[8]; /* 257 Identifies tar version (ignored) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
107 char ownername[32]; /* 265 Name of owner (ignored) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
108 char groupname[32]; /* 297 Name of group (ignored) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
109 char devmajor[8]; /* 329 Device major number (ignored) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
110 char defminor[8]; /* 337 Device minor number (ignored) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
111 char prefix[155]; /* 345 Prefix of name (optional) */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
112 char RESERVED[12]; /* 500 Pad header size to 512 bytes */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
113 } tar_t;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
114 #define ISREGULAR(hdr) ((hdr).type < '1' || (hdr).type > '6')
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
115
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
116 Uchar_t slide[WSIZE];
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
117
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
118 static const char *inname = NULL; /* name of input archive */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
119 static FILE *infp = NULL; /* input byte stream */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
120 static FILE *outfp = NULL; /* output stream, for file currently being extracted */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
121 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
122 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
123
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
124 static untar_opt untarops = 0; /* Untar options */
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 /* Options checked during untar process */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
127 #define LISTING (untarops & UNTAR_LISTING) /* 1 if listing, 0 if extracting */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
128 #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
129 #define VERBOSE (untarops & UNTAR_VERBOSE) /* 1 to write extra information to stdout */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
130 #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
131 #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
132 #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
133
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
134 /*----------------------------------------------------------------------------*/
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 /* create a file for writing. If necessary, create the directories leading up
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
137 * to that file as well.
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 static FILE *createpath(name)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
140 char *name; /* pathname of file to create */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
141 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
142 FILE *fp;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
143 int i;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
144
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
145 /* 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
146 if (!FORCE && access(name, 0) == 0)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
147 {
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
148 purple_debug_warning("untar", "%s: exists, will not overwrite without \"FORCE option\"", name);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
149 return NULL;
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
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
152 /* first try creating it the easy way */
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
153 fp = g_fopen(name, CONVERT ? "w" : "wb");
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
154 if (fp)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
155 return fp;
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 /* Else try making all of its directories, and then try creating
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
158 * the file again.
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 for (i = 0; name[i]; i++)
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 /* If this is a slash, then temporarily replace the '/'
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
163 * with a '\0' and do a mkdir() on the resulting string.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
164 * Ignore errors for now.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
165 */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
166 if (name[i] == '/')
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
167 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
168 name[i] = '\0';
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
169 (void)g_mkdir(name, 0777);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
170 name[i] = '/';
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 }
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
173 fp = g_fopen(name, CONVERT ? "w" : "wb");
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
174 if (!fp)
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
175 purple_debug_error("untar", "Error opening: %s", name);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
176 return fp;
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
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
179 /* 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
180 * give a warning.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
181 */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
182 static void linkorcopy(src, dst, sym)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
183 char *src; /* name of existing source file */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
184 char *dst; /* name of new destination file */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
185 int sym; /* use symlink instead of link */
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 FILE *fpsrc;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
188 FILE *fpdst;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
189 int c;
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 /* 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
192 fpsrc = g_fopen(src, "rb");
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
193 if (!fpsrc)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
194 {
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
195 purple_debug_error("untar", "Error opening: %s", src);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
196 return;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
197 }
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 /* Create the destination file. On POSIX systems, this is just to
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
200 * make sure the directory path exists.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
201 */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
202 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
203 if (!fpdst) {
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
204 /* 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
205 fclose(fpsrc);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
206 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
207 }
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
208
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
209 #ifdef _POSIX_SOURCE
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
210 # ifndef _WEAK_POSIX
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
211 /* first try to link it over, instead of copying */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
212 fclose(fpdst);
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
213 g_unlink(dst);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
214 if (sym)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
215 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
216 if (symlink(src, dst))
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
217 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
218 perror(dst);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
219 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
220 fclose(fpsrc);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
221 return;
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 if (!link(src, 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 /* This story had a happy ending */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
226 fclose(fpsrc);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
227 return;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
228 }
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 /* Dang. Reopen the destination again */
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
231 fpdst = g_fopen(dst, "wb");
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
232 /* This *can't* fail */
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 # endif /* _WEAK_POSIX */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
235 #endif /* _POSIX_SOURCE */
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 /* Copy characters */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
238 while ((c = getc(fpsrc)) != EOF)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
239 putc(c, fpdst);
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 /* Close the files */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
242 fclose(fpsrc);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
243 fclose(fpdst);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
244
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
245 /* Give a warning */
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
246 purple_debug_warning("untar", "%s: copy instead of link", dst);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
247 }
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 /* This calls fwrite(), possibly after converting CR-LF to LF */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
250 static void cvtwrite(blk, size, fp)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
251 Uchar_t *blk; /* the block to be written */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
252 Ulong_t size; /* number of characters to be written */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
253 FILE *fp; /* file to write to */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
254 {
35858
ec92c3bfaf27 cross-win32: fix remaining warnings
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 31105
diff changeset
255 Ulong_t i, j;
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
256 static Uchar_t mod[TSIZE];
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
257
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
258 if (CONVERT)
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 for (i = j = 0; i < size; i++)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
261 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
262 /* convert LF to local newline convention */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
263 if (blk[i] == LF)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
264 mod[j++] = '\n';
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
265 /* If CR-LF pair, then delete the CR */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
266 else if (blk[i] == CR && (i+1 >= size || blk[i+1] == LF))
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
267 ;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
268 /* other characters copied literally */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
269 else
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
270 mod[j++] = blk[i];
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 size = j;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
273 blk = mod;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
274 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
275
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
276 fwrite(blk, (size_t)size, sizeof(Uchar_t), fp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
277 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
278
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 /* 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
281 * The checksum can be computed using either POSIX rules (unsigned bytes)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
282 * or Sun rules (signed bytes).
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 static long checksum(tblk, sunny)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
285 tar_t *tblk; /* buffer containing the tar header block */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
286 int sunny; /* Boolean: Sun-style checksums? (else POSIX) */
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 long sum;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
289 char *scan;
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 /* 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
292 * including the checksum field itself.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
293 */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
294 sum = 0L;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
295 for (scan = (char *)tblk; scan < tblk->checksum; scan++)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
296 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
297 sum += (*scan) & 0xff;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
298 if (sunny && (*scan & 0x80) != 0)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
299 sum -= 256;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
300 }
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 /* 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
303 sum += ' ' * sizeof tblk->checksum;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
304 scan += sizeof tblk->checksum;
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 /* finish counting the sum of the rest of the block */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
307 for (; scan < (char *)tblk + sizeof *tblk; 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 return sum;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
315 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
316
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 /* list files in an archive, and optionally extract them as well */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
320 static int untar_block(Uchar_t *blk) {
36171
89c89c449595 Use a larger buffer size for untarred filenames.
Mark Doliner <mark@kingant.net>
parents: 31105
diff changeset
321 static char nbuf[4096];/* storage space for prefix+name, combined */
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
322 static char *name,*n2;/* prefix and name, combined */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
323 static int first = 1;/* Boolean: first block of archive? */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
324 long sum; /* checksum for this block */
35858
ec92c3bfaf27 cross-win32: fix remaining warnings
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 31105
diff changeset
325 guint i;
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
326 tar_t tblk[1];
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 #ifdef _POSIX_SOURCE
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
329 static mode_t mode; /* file permissions */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
330 static struct utimbuf timestamp; /* file timestamp */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
331 #endif
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 /* 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
334 tblk[0] = *(tar_t *)blk;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
335
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
336 /* process each type of tape block differently */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
337 if (outsize > TSIZE)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
338 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
339 /* data block, but not the last one */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
340 if (outfp)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
341 cvtwrite(blk, (Ulong_t)TSIZE, outfp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
342 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 else if (outsize > 0)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
345 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
346 /* last data block of current file */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
347 if (outfp)
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 cvtwrite(blk, outsize, outfp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
350 fclose(outfp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
351 outfp = NULL;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
352 #ifdef _POSIX_SOURCE
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
353 utime(nbuf, &timestamp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
354 chmod(nbuf, mode);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
355 #endif
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
356 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
357 outsize = 0;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
358 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
359 else if ((tblk)->filename[0] == '\0')
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 /* end-of-archive marker */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
362 if (didabs)
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
363 purple_debug_warning("untar", "Removed leading slashes because \"ABSPATH option\" wasn't given.");
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
364 return 1;
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 else
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
367 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
368 /* file header */
22687
3cb9f701d421 printf format warning fixes.
Daniel Atallah <datallah@pidgin.im>
parents: 15884
diff changeset
369
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
370 /* half-assed verification -- does it look like header? */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
371 if ((tblk)->filename[99] != '\0'
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
372 || ((tblk)->size[0] < '0'
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
373 && (tblk)->size[0] != ' ')
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
374 || (tblk)->size[0] > '9')
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
375 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
376 if (first)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
377 {
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
378 purple_debug_error("untar", "%s: not a valid tar file", inname);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
379 return 0;
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 else
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
382 {
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
383 purple_debug_error("untar", "Garbage detected; preceding file may be damaged");
5005
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 }
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 /* combine prefix and filename */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
389 memset(nbuf, 0, sizeof nbuf);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
390 if ((tblk)->prefix[0])
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
391 {
40094
8e6d91e4dd8f Use g_(v)snprintf so we need less wrappers.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 36183
diff changeset
392 g_snprintf(nbuf, sizeof(nbuf), "%s/%s", (tblk)->prefix,
8e6d91e4dd8f Use g_(v)snprintf so we need less wrappers.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 36183
diff changeset
393 (tblk)->filename);
5005
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 else
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
396 {
36174
38653c63a0d2 Fix sizeof calls.
Mark Doliner <mark@kingant.net>
parents: 36173
diff changeset
397 g_strlcpy(nbuf, (tblk)->filename,
38653c63a0d2 Fix sizeof calls.
Mark Doliner <mark@kingant.net>
parents: 36173
diff changeset
398 sizeof (nbuf));
5005
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
36177
68b8eb10977f Fix a bug in the untar code that we use on Windows where we
Mark Doliner <mark@kingant.net>
parents: 36176
diff changeset
401 /* Possibly strip the drive from the path */
68b8eb10977f Fix a bug in the untar code that we use on Windows where we
Mark Doliner <mark@kingant.net>
parents: 36176
diff changeset
402 if (!ABSPATH) {
68b8eb10977f Fix a bug in the untar code that we use on Windows where we
Mark Doliner <mark@kingant.net>
parents: 36176
diff changeset
403 /* If the path contains a colon, assume everything before the
68b8eb10977f Fix a bug in the untar code that we use on Windows where we
Mark Doliner <mark@kingant.net>
parents: 36176
diff changeset
404 * colon is intended to be a drive name and ignore it. This
68b8eb10977f Fix a bug in the untar code that we use on Windows where we
Mark Doliner <mark@kingant.net>
parents: 36176
diff changeset
405 * should be just a single drive letter, but it should be safe
68b8eb10977f Fix a bug in the untar code that we use on Windows where we
Mark Doliner <mark@kingant.net>
parents: 36176
diff changeset
406 * to drop it even if it's longer. */
68b8eb10977f Fix a bug in the untar code that we use on Windows where we
Mark Doliner <mark@kingant.net>
parents: 36176
diff changeset
407 const char *lastcolon = strrchr(nbuf, ':');
68b8eb10977f Fix a bug in the untar code that we use on Windows where we
Mark Doliner <mark@kingant.net>
parents: 36176
diff changeset
408 if (lastcolon) {
68b8eb10977f Fix a bug in the untar code that we use on Windows where we
Mark Doliner <mark@kingant.net>
parents: 36176
diff changeset
409 memmove(nbuf, lastcolon, strlen(lastcolon) + 1);
68b8eb10977f Fix a bug in the untar code that we use on Windows where we
Mark Doliner <mark@kingant.net>
parents: 36176
diff changeset
410 didabs = 1; /* Path was changed from absolute to relative */
68b8eb10977f Fix a bug in the untar code that we use on Windows where we
Mark Doliner <mark@kingant.net>
parents: 36176
diff changeset
411 }
5005
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
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
414 /* Convert any backslashes to forward slashes, and guard
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
415 * against doubled-up slashes. (Some DOS versions of "tar"
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
416 * get this wrong.) Also strip off leading slashes.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
417 */
36174
38653c63a0d2 Fix sizeof calls.
Mark Doliner <mark@kingant.net>
parents: 36173
diff changeset
418 name = nbuf;
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
419 if (!ABSPATH && (*name == '/' || *name == '\\'))
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
420 didabs = 1;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
421 for (n2 = nbuf; *name; name++)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
422 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
423 if (*name == '\\')
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
424 *name = '/';
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
425 if (*name != '/'
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
426 || (ABSPATH && n2 == nbuf)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
427 || (n2 != nbuf && n2[-1] != '/'))
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
428 *n2++ = *name;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
429 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
430 if (n2 == nbuf)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
431 *n2++ = '/';
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
432 *n2 = '\0';
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
433
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
434 /* verify the checksum */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
435 for (sum = 0L, i = 0; i < sizeof((tblk)->checksum); i++)
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 ((tblk)->checksum[i] >= '0'
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
438 && (tblk)->checksum[i] <= '7')
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
439 sum = sum * 8 + (tblk)->checksum[i] - '0';
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
440 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
441 if (sum != checksum(tblk, 0) && sum != checksum(tblk, 1))
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
442 {
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
443 if (!first) {
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
444 purple_debug_error("untar", "Garbage detected; preceding file may be damaged");
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
445 }
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
446 purple_debug_error("untar", "%s: header has bad checksum for %s", inname, nbuf);
5005
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 /* list the file */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
485 if (VERBOSE)
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
486 purple_debug_info("untar", "%c %s",
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
487 ISREGULAR(*tblk) ? '-' : ("hlcbdp"[(tblk)->type - '1']),
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
488 nbuf);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
489 else if (!QUIET)
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
490 purple_debug_info("untar", "%s", nbuf);
5005
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 /* if link, then do the link-or-copy thing */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
493 if (tblk->type == '1' || tblk->type == '2')
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 if (VERBOSE)
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
496 purple_debug_info("untar", " -> %s", tblk->linkto);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
497 if (!LISTING)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
498 linkorcopy(tblk->linkto, nbuf, tblk->type == '2');
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
499 outsize = 0L;
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 /* If directory, then make a weak attempt to create it.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
504 * Ideally we would do the "create path" thing, but that
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
505 * seems like more trouble than it's worth since traditional
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
506 * tar archives don't contain directories anyway.
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 (tblk->type == '5')
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
509 {
36176
f38a5005e8a8 Don't reuse the n2 variable.
Mark Doliner <mark@kingant.net>
parents: 36175
diff changeset
510 char *tmp;
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
511 if (LISTING)
36176
f38a5005e8a8 Don't reuse the n2 variable.
Mark Doliner <mark@kingant.net>
parents: 36175
diff changeset
512 tmp = " directory";
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
513 #ifdef _POSIX_SOURCE
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
514 else if (mkdir(nbuf, mode) == 0)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
515 #else
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
516 else if (g_mkdir(nbuf, 0755) == 0)
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
517 #endif
36176
f38a5005e8a8 Don't reuse the n2 variable.
Mark Doliner <mark@kingant.net>
parents: 36175
diff changeset
518 tmp = " created";
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
519 else
36176
f38a5005e8a8 Don't reuse the n2 variable.
Mark Doliner <mark@kingant.net>
parents: 36175
diff changeset
520 tmp = " ignored";
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
521 if (VERBOSE)
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
522 purple_debug_info("untar", "%s", tmp);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
523 return 1;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
524 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
525
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
526 /* if not a regular file, then skip it */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
527 if (!ISREGULAR(*tblk))
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
528 {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
529 if (VERBOSE)
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
530 purple_debug_info("untar", " ignored");
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
531 outsize = 0L;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
532 return 1;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
533 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
534
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
535 /* print file statistics */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
536 if (VERBOSE)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
537 {
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
538 purple_debug_info("untar", " (%ld byte%s, %ld tape block%s)",
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
539 outsize,
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
540 outsize == 1 ? "" : "s",
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
541 (outsize + TSIZE - 1) / TSIZE,
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
542 (outsize > 0 && outsize <= TSIZE) ? "" : "s");
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 extracting, then try to create the file */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
546 if (!LISTING)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
547 outfp = createpath(nbuf);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
548 else
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
549 outfp = NULL;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
550
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
551 /* if file is 0 bytes long, then we're done already! */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
552 if (outsize == 0 && outfp)
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 fclose(outfp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
555 #ifdef _POSIX_SOURCE
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
556 utime(nbuf, &timestamp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
557 chmod(nbuf, mode);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
558 #endif
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
559 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
560 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
561 return 1;
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 /* 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
565 * and passing them to a untar() function.
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
566 */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
567 int untar(const char *filename, const char* destdir, untar_opt options) {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
568 int ret=1;
31105
b5d95fcb40e1 Make untarring work for non-ASCII destination dirs on Windows.
Daniel Atallah <datallah@pidgin.im>
parents: 29492
diff changeset
569 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
570 wchar_t *w_destdir;
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
571 untarops = options;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
572 /* open the archive */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
573 inname = filename;
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 7242
diff changeset
574 infp = g_fopen(filename, "rb");
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
575 if (!infp)
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
576 {
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
577 purple_debug_error("untar", "Error opening: %s", filename);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
578 return 0;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
579 }
22687
3cb9f701d421 printf format warning fixes.
Daniel Atallah <datallah@pidgin.im>
parents: 15884
diff changeset
580
31105
b5d95fcb40e1 Make untarring work for non-ASCII destination dirs on Windows.
Daniel Atallah <datallah@pidgin.im>
parents: 29492
diff changeset
581 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
582
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
583 /* Set current directory */
31105
b5d95fcb40e1 Make untarring work for non-ASCII destination dirs on Windows.
Daniel Atallah <datallah@pidgin.im>
parents: 29492
diff changeset
584 if(!GetCurrentDirectoryW(_MAX_PATH, curdir)) {
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
585 purple_debug_error("untar", "Could not get current directory (error %lu).", GetLastError());
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
586 fclose(infp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
587 return 0;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
588 }
31105
b5d95fcb40e1 Make untarring work for non-ASCII destination dirs on Windows.
Daniel Atallah <datallah@pidgin.im>
parents: 29492
diff changeset
589 if(!SetCurrentDirectoryW(w_destdir)) {
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
590 purple_debug_error("untar", "Could not set current directory to (error %lu): %s", GetLastError(), destdir);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
591 fclose(infp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
592 return 0;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
593 } else {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
594 /* UNCOMPRESSED */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
595 /* send each block to the untar_block() function */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
596 while (fread(slide, 1, TSIZE, infp) == TSIZE) {
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
597 if(!untar_block(slide)) {
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
598 purple_debug_error("untar", "untar failure: %s", filename);
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
599 fclose(infp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
600 ret=0;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
601 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
602 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
603 if (outsize > 0 && ret) {
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
604 purple_debug_warning("untar", "Last file might be truncated!");
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
605 fclose(outfp);
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
606 outfp = NULL;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
607 }
31105
b5d95fcb40e1 Make untarring work for non-ASCII destination dirs on Windows.
Daniel Atallah <datallah@pidgin.im>
parents: 29492
diff changeset
608 if(!SetCurrentDirectoryW(curdir)) {
40765
a5381c20e802 Use specific purple_debug_* functions
Arkadiy Illarionov <qarkai@gmail.com>
parents: 40669
diff changeset
609 purple_debug_error("untar", "Could not set current dir back to original (error %lu).", GetLastError());
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
610 ret=0;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
611 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
612 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
613
31105
b5d95fcb40e1 Make untarring work for non-ASCII destination dirs on Windows.
Daniel Atallah <datallah@pidgin.im>
parents: 29492
diff changeset
614 g_free(w_destdir);
b5d95fcb40e1 Make untarring work for non-ASCII destination dirs on Windows.
Daniel Atallah <datallah@pidgin.im>
parents: 29492
diff changeset
615
5005
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
616 /* close the archive file. */
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
617 fclose(infp);
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 return ret;
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
620 }
43720615dffc [gaim-migrate @ 5340]
Herman Bloggs <herman@bluedigits.com>
parents:
diff changeset
621

mercurial