12018-12-03 Stuart Caie <kyzer@cabextract.org.uk>
2
3	* test: support builddir being on a path that includes spaces
4
52018-11-09 Stuart Caie <kyzer@cabextract.org.uk>
6
7	* test/case-utf8.test: Some environments (e.g. DJGPP) don't have a
8	UTF-8 locale, so won't pass the case.test testcase. Break it into
9	case-ascii.test and case-utf8.test, and skip the latter if
10	"cabextract -L" has no effect on non-ASCII filenames. Thanks to
11	Robert Riebisch for highlighting this.
12
132018-11-08 Stuart Caie <kyzer@cabextract.org.uk>
14
15	* src/cabextract.c: make multiple attempts at iconv_open() with
16	different names for the UTF-8 encoding: "UTF-8", "UTF8" and "UTF_8".
17
18	"UTF8" works with glibc, libiconv, newlib, Solaris libc and FreeBSD
19	libc, while "UTF-8" doesn't work with newlib. But if you have
20	libiconv >= 1.13, it removes "UTF8" support unless you define
21	USE_HPUX_ALIASES, or patch it back in (as Cygwin does).
22	Thanks to Ryan Schmidt for letting me know about this.
23
242018-11-03 Stuart Caie <kyzer@cabextract.org.uk>
25
26	* test: use the autotools test system instead of a custom makefile.
27	You can now use 'make check' to test cabextract, and the test files
28	are now distributed with cabextract.
29
302018-10-30  Stuart Caie <kyzer@cabextract.org.uk>
31
32	* configure.ac: remove obsolescent C library tests. AC_HEADER_STDC is
33	removed, and so are most checks for standard C headers. cabextract now
34	makes these assumptions:
35	- <ctype.h> <dirent.h> <errno.h> <limits.h> <locale.h> <stdarg.h>
36	  <stdlib.h> <string.h> <sys/stat.h> <sys/types.h> <time.h> exist
37	- <time.h> is protected from double-inclusion (AC_HEADER_TIME obsolete)
38	- if you have iconv(), towlower(), utime(), utimes(), you also
39	  have their header files
40	- BSD has memcpy(), memmove(), strrchr() in <string.h> and has
41	  strcasecmp() in <strings.h>
42
432018-10-26  Stuart Caie <kyzer@cabextract.org.uk>
44
45	* configure.ac, Makefile.am: use pkg-config's PKG_CHECK_MODULES
46	when looking for an external libmspack. You still need to supply
47	--with-external-libmspack to use an external libmspack. If you
48	don't like or use pkg-config, you can set the environment variables
49	libmspack_CFLAGS and libmspack_LIBS before running configure.
50
512018-10-26  Stuart Caie <kyzer@cabextract.org.uk>
52
53	* autogen.sh, distcheck.sh: I've introduced new build scripts.
54	Use cleanup.sh to remove all generated files, autogen.sh to
55	generate the configure script, rebuild.sh to (re)build and test
56	cabextract, and finally use distcheck.sh to both build and
57	distcheck cabextract, both with the --with-external-libmspack
58	configure option and without.
59
602018-10-22  Stuart Caie <kyzer@cabextract.org.uk>
61
62	* amibuild.sh: include cabinfo in the Amiga distribution. Thanks to
63	Stefan Haubenthal for the suggestion.
64
652018-10-16  Stuart Caie <kyzer@cabextract.org.uk>
66
67	* src/cabinfo.c: thanks to Micah Snyder for sending some very corrupt
68	files, where cabinet blocks can be found absolutely anywhere, not in
69	a continguous sequence after the file entries, I found cabinfo unfit
70	for purpose. I've updated it with a new output format, where the
71	blocks for a folder appear immediately after each folder, rather than
72	all at the end.
73
742018-10-16  Stuart Caie <kyzer@cabextract.org.uk>
75
76	* src/cabextract.c: use libmspack's new MSCABD_PARAM_SALVAGE mode
77	for cabextract -f, to allow extracting even more data from broken
78	cabinet files.
79
802018-07-31  Stuart Caie <kyzer@cabextract.org.uk>
81
82	* configure.ac: drop AC_FUNC_MKTIME. Looking into it, even C89 has
83	a mktime() function, the configure test is mostly checking if it
84	is POSIX-conformant or not, and substitutes mktime.c if not. But
85	even the replacement has no TZ handling, so it seems OK to me to
86	accept the system mktime() in any case. The fnmatch() and getopt()
87	substitutions remain because they enable GNU extensions that
88	cabextract uses (FNM_CASEFOLD and getopt_long() respectively).
89	Thanks to Stefan Haubenthal for bringing up the issue.
90
912018-07-28  Stuart Caie <kyzer@cabextract.org.uk>
92
93	* src/cabinfo.c: cabinfo now supports examining more than one file
94
952018-07-17  Stuart Caie <kyzer@cabextract.org.uk>
96
97	* amibuild.sh: support using setlocale()/iconv() in the OS4 version.
98
99	* amibuild.sh: build the 68K version with -noixemul so the resulting
100	executable doesn't need ixemul.library, libnix is used instead.
101	Because libnix has no umask(), add a HAVE_UMASK feature test.
102
103	* src/cabextract.c: add a new feature flag, LATIN1_FILENAMES,
104	which should be defined if the host environment expects ISO-8859-1
105	filenames rather than UTF-8. This adds in a step to translate
106	even UTF-8 filenames to ISO-8859-1.  It's only enabled for the
107	Amiga build so far.
108
1092018-03-07  Stuart Caie <kyzer@cabextract.org.uk>
110
111	* configure.ac, src/cabextract.c: add support for choosing the
112	character encoding of non-UTF8 filenames, using the iconv library.
113	This is based on a patch originally developed by Kevin Tardif.
114
115	* src/cabextract.c: try setting various UTF8 locales for LC_CTYPE,
116	in order to get tolower() / towlower() to lowercase non-ASCII
117	characters.  Again, thanks to Kevin Tardif for discussing this
118	and supplying a proposed patch.
119
1202016-04-16  Stuart Caie <kyzer@cabextract.org.uk>
121
122	* configure.ac: change my email address to kyzer@cabextract.org.uk
123
1242015-05-10  Stuart Caie <kyzer@4u.net>
125
126	* wince_rename, wince_info: allow the possibility that strings have
127	more than one null byte. Thanks to Stefan Riegler for the suggestion.
128
1292015-05-10  Stuart Caie <kyzer@4u.net>
130
131	* Makefile.am: Add subdir-objects option as suggested by autoreconf.
132
133	* configure.ac: Add AM_PROG_AR as suggested by autoreconf.
134
1352015-02-25  Stuart Caie <kyzer@4u.net>
136
137	* create_output_name(): Simplify code; do path checking only after
138	output name has been constructed. Use towlower to lowercase UTF-8
139	characters. Remove both leading '/' and '\' from cab filenames and
140	change both "../" and "..\" to "xx", for Cygwin and other Cygwin-like
141	environments that use both '/' and '\' as path separators. Thanks to
142	Alexander Cherepanov and the MITRE team.
143
1442015-02-18  Stuart Caie <kyzer@4u.net>
145
146	* create_output_name(): the check against leading slashes could be
147	evaded with malformed UTF-8. Thanks to Alexander Cherepanov for
148	reporting the issue.
149
1502015-01-18  Stuart Caie <kyzer@4u.net>
151
152	* wince_rename: installed files now include their install directories.
153	Thanks to Alfonso Acosta for sending a patch.
154
1552015-01-08  Stuart Caie <kyzer@4u.net>
156
157	* create_output_name: avoid invalid memory reads because of invalid
158	UTF-8 encodings. Use the Unicode substitution character for most
159	bad UTF-8 or Unicode encodings. Thanks to Hanno Böck.
160
161	* src/cabinfo.c: stop trying to convert UTF-8 to ASCII in filename.
162	Instead, prepend "UTF: " and print it to the terminal verbatim.
163
1642011-07-19  Stuart Caie <kyzer@4u.net>
165
166	* doc/ja/cabextract.1: Katsumi Saito updated the Japanese translation
167	of cabextract's manpage to include the -t option. Thanks again!
168
1692011-05-11  Stuart Caie <kyzer@4u.net>
170
171	* src/cabinfo.c: changed the largefile detection header to the same
172	as mspack/system.h
173
1742011-04-27  Stuart Caie <kyzer@4u.net>
175
176	* src/cabextract.c: changed char* to const char* in line with changes
177	in libmspack. See mspack/ChangeLog for more details.
178
1792011-04-25  Stuart Caie <kyzer@4u.net>
180
181	* load_spanning_cabinets(): Print the error code caused by a failed
182	cabinet merge, before ruining the error code by calling cabd->close().
183	Thanks to Drew D'Addesio for reporting the problem.
184
1852011-01-19  Stuart Caie <kyzer@4u.net>
186
187	* doc/wince_cab_format.html: Identified a new file flag in the WinCE
188	header file. Thanks to Paul Sokolovsky for asking me to look into it.
189
1902010-07-19  Stuart Caie <kyzer@4u.net>
191
192	* mspack: MS-ZIP recovery now recovers more bytes. Also, when a file
193	fails to unpack because of a read error during decompression, all
194	subsequent files in the same folder will give the same error, instead
195	of claiming to be OK. See mspack/ChangeLog for full details.
196
1972010-07-17  Stuart Caie <kyzer@4u.net>
198
199	* src/cabsplit: added new program, cabsplit, which splits cabinet
200	files into one cabinet file per folder. Useful for debugging.
201
2022010-06-17  Stuart Caie  <kyzer@4u.net>
203
204	* configure.ac: Added --external-libmspack option, which allows
205	you to use the libmspack library installed on your system rather
206	than the copy bundled with cabextract. Thanks to Patrice Dumas
207	for the patch.
208
2092010-06-10  Stuart Caie  <kyzer@4u.net>
210
211	* mspack: bugs in MS-ZIP and Quantum decoders have been fixed. See
212	mspack/ChangeLog for full details.
213
2142010-05-06  Stuart Caie  <kyzer@4u.net>
215
216	* configure.ac, cabextract.c: added support for the one-arg mkdir()
217	found in the MinGW32 environment. Thanks to Kevin O'Rourke for
218	reporting this.
219
2202009-09-24  Stuart Caie   <kyzer@4u.net>
221
222	*  doc/wince_cab_format.html, src/wince_info, src/wince_rename:
223	The files in Windows CE cabinets are numbered after the first
224	ID in the FILES section, rather than what I termed the "real ID".
225	Fixed the documentation and the wince tools to match. The purpose
226	of the field previously called "real ID" is now unknown. Thanks
227	to Marco Schindler for discovering this.
228
2292007-08-07  Stuart Caie   <kyzer@4u.net>
230
231	* all: cabextract and libmspack have moved to the domain
232	www.cabextract.org.uk. Updated the documentation to reflect this.
233
2342007-01-20  Stuart Caie   <kyzer@4u.net>
235
236	* create_output_name(): add UTF-8 support for 6-byte characters.
237	Apparently they go that far these days.
238
2392007-01-20  Stuart Caie   <kyzer@4u.net>
240
241	* doc/wince_cab_format.html, src/wince_info: The REGKEYS "unknown"
242	flag appears to be a boolean indicating whether variable
243	substitution should take place. Thanks to Dominique Gallot for
244	discovering it.
245
2462006-06-21  Stuart Caie   <kyzer@4u.net>
247
248	* create_output_name(): add UTF-8 support for 4-byte characters.
249
2502006-03-01  Stuart Caie   <kyzer@4u.net>
251
252	* process_cabinets(): on the advice of Mike Mohr, cabextract no
253	longer skips entire cabinets, when create_output_filename()
254	returns NULL, it only skips the affected files now.
255
2562005-10-30  Stuart Caie   <kyzer@4u.net>
257
258	* src/cabextract.c: added test mode to cabextract, wherein files
259	aren't extracted, only passed through an MD5 checksum generator.
260	cabextract then lists which files passed and which files failed.
261
262	* process_cabinets(): fixed the problem where filters don't match
263	when -d option is also used. The filters match on the full
264	output-file path, including the -d directory specified. We now
265	trim this off before matching.
266
2672005-10-29  Stuart Caie   <kyzer@4u.net>
268
269	* fnmatch.c, getopt.c: finally resolved problems with all the GNU
270	replacement functions. Obtained new versions of fnmatch and
271	getopt, removing the need for alloca.c, coded out the requirement
272	for mempcpy in getopt.c (I don't think it was needed anyway, but
273	just to be sure I changed it to use just memcpy). Tested on Mac OS X
274	(both native and using fink), Solaris 8 and Cygwin as well as Debian.
275
276	* configure.ac: Removed the AC_FUNC_ALLOCA and
277	AC_REPLACE_FUNCS([mempcpy])
278
2792005-07-05  Stuart Caie   <kyzer@4u.net>
280
281	* src/cabinfo.c: This can now search and print accurate output for
282	cabinets (and files containing cabinets) over 2GB.
283
2842005-04-21  Stuart Caie   <kyzer@4u.net>
285
286	* src/cabinfo.c: This now prints if the NAME_IS_UTF flag is set for
287	each file.
288
2892004-10-19  Stuart Caie   <kyzer@4u.net>
290
291	* create_output_name(): fixed out-by-one error in UTF-8 decoder. All
292	UTF-8 filenames would reach the "error in UTF-8 decode" section,
293	because the test for that section was "pointer >= last_character",
294	not "pointer > last_character".
295
2962004-10-18  Stuart Caie   <kyzer@4u.net>
297
298	* process_cabinet(): now accepts that failure of create_output_name()
299	is an error, and also lets that function print an error message
300	rather than printing one itself.
301
302	* create_output_name(): improved the two error messages that could
303	be printed.
304
3052004-10-15  Stuart Caie   <kyzer@4u.net>
306
307	* create_output_name(): removes leading "./" and "../" as well as
308	leading slashes from the input filename. Thanks to David Banz for
309	pointing this out, as well as http://www.securityfocus.com/bid/11376/
310
3112004-07-16  Stuart Caie   <kyzer@4u.net>
312
313	* Makefile.am: added -DMSPACK_NO_DEFAULT_SYSTEM. Why wasn't this in
314	earlier?
315
316	* src/cabextract.c: added prototypes of the cabx_ functions,
317	removed the prototype of cabextract_system and moved the real
318	cabextract_system to before main(). This is so AIX doesn't fail on
319	seeing an extern and a static definition of the same
320	global. That's messed up!
321
322	* alloca.c, fnmatch*, getopt*, mempcpy.c: imported these from
323	gcc's latest libiberty. This should fix problems with Cygwin.
324
3252004-03-18  Stuart Caie   <kyzer@4u.net>
326
327	* process_cabinet(): added missing printf argument when errors on
328	extracting to stdout occur. Thanks to Moritz Barsnick for finding
329	it.
330
3312004-03-08  Stuart Caie   <kyzer@4u.net>
332
333	* all: tidy-ups for 1.0 release
334
3352003-09-04  Stuart Caie   <kyzer@4u.net>
336
337	* set_date_and_perm(): implemented the utimes() alternative to
338	utime().
339
340	* set_date_and_perm(): sets the date before the permissions are set,
341	in case read-only files really do get -r--r--r-- permissions and
342	your dumb OS won't let the date can't be changed.
343
3442003-08-14  Stuart Caie   <kyzer@4u.net>
345
346	* wince_cab_format.html: Shaun Jackman worked out six more fields
347	in the header.
348
3492003-08-12  Stuart Caie   <kyzer@4u.net>
350
351	* cabextract.c: rewrote all function documentation in javadoc /
352	doxygen format.
353
354	* configure.ac: added AC_FUNC_ALLOCA / @ALLOCA@ / alloca.c because
355	I noticed that fnmatch.c uses alloca().
356
3572003-08-11  Stuart Caie   <kyzer@4u.net>
358
359	* main(): Removed the redundant args.list with args.view. I was
360	wondering why cabextract -l file.cab was trying to extract instead
361	of list...
362
3632003-08-06  Stuart Caie   <kyzer@4u.net>
364
365	* configure.in, Makefile.am: rewrote the configure and build
366	scripts, in the new style. fnmatch sources are now bundled, and
367	now all the support code and tools are in the top directory,
368	leaving src/ with nothing but cabextract code in it.
369
3702003-08-05  Stuart Caie   <kyzer@4u.net>
371
372	* wince_cab_format.html: converted the WinCE CAB format document
373	from text to HTML.
374
3752003-07-29  Stuart Caie   <kyzer@4u.net>
376
377	* cabextract.c: now rewritten to use libmspack.
378
379	* process_cabinet(): the cabinet listing now has space for 10
380	digits in the size field, for those really big compressed files.
381	The maximum size of a file is 4294967295 bytes.
382
3832003-07-18  Stuart Caie   <kyzer@4u.net>
384
385	* cabextract.c: started refactoring cabextract to use the
386	libmspack library. Moved everything out of cabextract.c and will
387	start moving things back in as necessary.
388
389	* doc, mspack: added a doc directory, where fun things like manual
390	pages, magic files and file format documents go. Made a directory for
391	libmspack files.
392
3932003-06-07  Stuart Caie   <kyzer@4u.net>
394
395	* mspack: started creation of the libmspack library, based on the
396	cabextract code. See http://www.kyz.uklinux.net/libmspack/ for more
397	details about the library.
398
3992003-05-14  Stuart Caie   <kyzer@4u.net>
400
401	* magic.cabinet: fixed errors in CAB magic definition
402
403	* magic.wince: added magic file entry for WinCE install format
404
405	* configure.in: added large file support
406
4072003-04-21  Stuart Caie   <kyzer@4u.net>
408
409	* ja/cabextract.1: Katsumi Saito kindly translated the updated
410	manual page into Japanese for me.
411
4122003-04-20  Stuart Caie   <kyzer@4u.net>
413
414	* cabextract.1: finally decided on feature set for cabextract 0.7,
415	so I updated the manual to reflect that.
416
4172003-03-12  Stuart Caie   <kyzer@4u.net>
418
419	* wince_cab_format.txt: reverse engineered most of the file format
420	for Windows CE installation CAB header files. Windows CE uses
421	normal cabinet files, but the files inside the cabinets use short
422	filenames and a special binary header to specify full filenames,
423	install directories, registry entries and symbolic links.  If
424	anyone wants to help fill in the remaining fields, I'm all ears.
425
4262002-11-19  Stuart Caie   <kyzer@4u.net>
427
428	* cabextract.c: moved the generation of the correct unix filename
429	for an extracted file out of file_open() and into the main
430	process_cabinet() function (it now has a helper function called
431	create_output_name()). This is to make the real filename available
432	outside of file_open(). (See below)
433
434	* file_close(): chmod() and utime() are now called on the correct
435	filename :)
436
4372002-11-13  Stuart Caie   <kyzer@4u.net>
438
439	* unix_directory_seperators(): this is a new function added to
440	determine whether the CAB file is using "wrong" UNIX-style forward
441	slashes as directory seperators. Microsoft CAB files use
442	MS-DOS backslashes, however the tools Cablinux and PowerArchiver
443	create CABs with forward-slashes.
444
4452002-09-12  Stuart Caie   <kyzer@4u.net>
446
447	* file_cabs_in_file(): if the file itself doesn't exist, we no
448	longer print "Not a Microsoft cabinet file" for not finding any
449	cabinets in that file.
450
4512002-09-08  Stuart Caie   <kyzer@4u.net>
452
453	* cabextract.c: cabextract used to segv if an LZX or Quantum
454	folder came after an MSZIP folder, because the window pointer
455	would be filled in by MSZIP's state. To solve this, I took the
456	window pointers and associated variables out of the state union,
457	and I also started clearing the state structure on startup. I also
458	removed the 'what was the old compression type / free window' code
459	and replaced it with a simple 'free LZX/QTM window if it exists'
460	before ZIP initialisation.
461
4622002-09-08  Stuart Caie   <kyzer@4u.net>
463
464	* find_cabs_in_file(): if a file begins with "ISc(", cabextract
465	now prints a message about how to unpack InstallShield '.cab'
466	files, which begin with this signature.
467
4682002-09-08  Stuart Caie   <kyzer@4u.net>
469
470	* cabextract.c: After seeing what some people think the command
471	line syntax is for cabextract is
472	(e.g. http://slashdot.org/comments.pl?sid=39401&cid=4210033) I
473	have decided to be nice to people who don't read manuals, and
474	refuse to extract files given on the command line if they've
475	already been extracted as part of another cabinet. This does
476	preclude the scenario where a file is not only part of a
477	multi-part set, but has a cabinet at offset 0 and _also_ has
478	embedded cabs later on. The new functionality is implemented by
479	the new functions remember_cabinet() and known_cabinet(), which
480	use a simple linked list. If you want the old behaviour of
481	cabextract back, do "find <cabs> -exec cabextract {} \;".
482
4832002-09-08  Stuart Caie   <kyzer@4u.net>
484
485	* configure.in: Upgraded my autoconf to one that has the AC_EXEEXT
486	bug fixed (look up AC_EXEEXT xSYM on the Internet :). Now it
487	complains about me writing to LIBOBJS directly, so I use the macro
488	AC_LIBOBJ twice to add getopt and getopt1 to LIBOBJS.
489
4902002-08-20  Stuart Caie   <kyzer@4u.net>
491
492	* AUTHORS, ChangeLog, NEWS, cabextract.c: fixed mis-spellings of
493	Matthew Russotto's name.
494
495	* ChangeLog: finished a half-completed changelog entry.
496
497
4982002-08-12  Stuart Caie   <kyzer@4u.net>
499
500	* cabextract.c: now prints all errors and warnings to stderr
501	rather that stdout. I finally noticed that perror() prints to
502	stderr, and I want to follow suit.
503
5042002-08-11  Stuart Caie   <kyzer@4u.net>
505
506	* extract_file(): now prints out the correct cabinet name in error
507	messages, in the case of files which are split over multiple
508	cabinet files and the 2nd or later split cabinet contains the
509	error.
510
511	* QTMdecompress(): fixed the QTM decoding error - basically, Matthew
512	used the bitstream reading macros from my LZX decompressor. Sadly,
513	these macros can only guarantee at maximum 17 bits available in the
514	bit buffer, and Quantum uses up to 19 bits. I rewrote the Quantum
515	bit buffer macros to be multi-pass (and therefore slower) so they
516	can get the requisite number of bits.
517
518	* QTMinit(): after fixing the decoding bug, I noticed that files
519	always failed extraction when going to a second folder. It turns out
520	that I forgot to reset QTM's window_posn.
521
522	* configure.in: added limits.h to the list of checked includes
523
524	* cabextract.c: ULONG_BITS now defined in terms of CHAR_BIT from
525	<limits.h> rather than fixed to 8 bits per char. Oddly, my system
526	seems to include <linux/limits.h> rather than <limits.h>.  So, for
527	people like me, I also define CHAR_BIT to be 8 if it's not already
528	defined.
529
5302002-07-29  Stuart Caie   <kyzer@4u.net>
531
532	* cabextract.c: The Ministry of Sensible Naming dictates that
533	load_cab() be renamed find_cabs_in_file(), and lose the 'search'
534	argument. Calls to load_cab() where the search argument = 0 (i.e.,
535	when loading spanning cabinets) be changed to load_cab_offset(x,0).
536
5372002-07-25  Stuart Caie  <kyzer@4u.net>
538
539	* load_cab(): Bah! off_t is defined as a signed long int, and
540	not an unsigned long int as I had previously thought. This means the
541	'valid cabinet' comparisions may fail. I have fixed this by making
542	these comparisons unsigned.
543
544	* cabinfo.c: added the new search mechanism to cabinfo.
545
5462002-07-25  Stuart Caie   <kyzer@4u.net>
547
548	* process_cabinet(): rewrote the loading mechanism. Uses the new
549	load_cab() to get a list of cabinets in the base file. Also does
550	bi-directional loading of spanning cabinets.
551
552	* load_cab(): now takes a 'search' parameter. if search=0, the old
553	loading behaviour is performed, but if search=1, it now does the
554	exhaustive search for all matching cabinets and tries to load
555	them. If a load succeeds, it skips that section of the
556	file. Therefore, all embedded cabinets are found, yet most of the
557	file does not need to be searched.
558
559	* cabinet_find_header(): removed, see above. Also, in shifting the
560	search, I altered the search mechanism. It now uses a state
561	machine to get around border cases, rather than the flaky 'save
562	the last 20 bytes and put them at the start the next time around'.
563
564	* cabinet_read_entries(): now checks the MSCF signature, as there
565	is no longer a cabinet_find_header() to do this.
566
5672002-07-23  Stuart Caie   <kyzer@4u.net>
568
569	* LZXdecompress(), QTMdecompress(): On systems where the LZ window
570	pointer is in "low memory", runsrc (window pointer - match offset)
571	could be below address 0, which wraps around to the end of memory,
572	so it appears runsrc is ahead of the LZ window, and so it does not
573	need 'fixing' before the match copy. Therefore the match data is
574	read from the incorrect, high address. Thanks to the NetBSD team
575	for discovering this and providing the patch.
576
5772002-07-22  Stuart Caie   <kyzer@4u.net>
578
579	* file_close(): now honours your umask settings when extracting
580	files. Thanks to the NetBSD team for the patch.
581
582	* cabinet_seek(), cabinet_skip(): these now print errors if
583	fseek() returns an error.
584
585	* QTMdecompress(): finally! Added an implementation of the Quantum
586	method which was researched and written by Matthew Russotto. Many
587	thanks to him for all the hard work he did to produce this. I
588	tidied up the code to be more my style (and to be quite a bit
589	faster by inlining the bit buffer, H, L and C), but it's still all
590	his code running.
591
592	* find_next_cabinet_file(): this is a new function which finds the
593	"next cabinet" by opening the directory it would be in and reading
594	each filename case-insensitively. It also handles any such "next
595	cabinets" with directory elements (delimited with MS-DOS
596	backslashes).
597
598	* process_cabinet(): now uses find_next_cabinet_file() to get the
599	next cabinet file. This function also replaces the hack that gets
600	any directory path which might be embedded in the base cabinet
601	filename (as mentioned on the command line).
602
6032002-07-21  Stuart Caie   <kyzer@4u.net>
604
605	* file_close(): fixed off-by-one error in setting the extracted
606	file date. Thanks to Claus Rasmussen.
607
6082002-07-20  Stuart Caie   <kyzer@4u.net>
609
610	* file_open(): now removes any leading slashes from the name of
611	the file to be extracted. Thanks to the James Henstridge and
612	David Leonard for patches.
613
614	* ensure_filepath(): now does not try to examine the directory ""
615	(i.e. no directory at all) if given an absolute path (one that
616	start with a slash). Thanks to the James Henstridge for the patch.
617
6182002-04-30  Stuart Caie   <kyzer@4u.net>
619
620	* cabextract.spec.in: changed the fixed version number to @VERSION@
621
6222002-04-06  Stuart Caie   <kyzer@4u.net>
623
624	* Makefile.am, configure.in: used the guide no_getopt_long.txt
625	included with the gengetopt package to add getopt_long
626	configuration to cabextract. Hopefully it all works now. Thanks to
627	the many people who pointed out this problem and to the many
628	people who offered solutions.
629
6302001-09-06  Stuart Caie   <kyzer@4u.net>
631
632	* Makefile.am, configure.in: made cabextract.spec one of the auto-
633	generated files. Now I can do 'make distcheck' here to build a
634	distribution which can be installed using 'rpm -tb
635	cabextract-0.6.tar.gz'. Thanks to Daniel Resare for the know-how.
636
6372001-08-20  Stuart Caie   <kyzer@4u.net>
638
639	* Makefile.am: added an LDADD line for cabextract's LIBOBJS
640	generated by configure. This means the AC_REPLACE_FUNCS line
641	should actually have an effect.
642
643	* configure.in: Removed getopt_long and mktime from the
644	AC_CHECK_FUNCS, as this is done anyway.
645
6462001-08-19  Stuart Caie   <kyzer@4u.net>
647
648	* Makefile.am, configure.in, cabextract.c: moved the GNU getopt
649	sources to become an automatically added dependency if
650	getopt_long() can't be found in the standard library, just like
651	mktime() is handled. The getopt_long(), struct option and optarg
652	and optind definitions are taken from getopt.h if possible. If
653	they're not there, but getopt_long() was found with standard
654	includes files, it's assumed they're defined in the standard
655	include files. Otherwise, we define them ourselves.
656
657	* cabextract.c: now gets VERSION defined from configure via
658	config.h.
659
660	* decompress(): if the 'fix' option was used, the output buffer
661	would always be cleared before block decompression. A nice idea,
662	but the MSZIP method likes to keep the output buffer between
663	blocks. Thanks to Fernando Trias for spotting this. Stopped
664	clearing the output buffer.
665
666	* main(): the 'fix' variable wasn't initialised to zero, so on
667	some architectures, where the stack-space allocated to the
668	variable isn't cleared to zero, you always got the 'fix' option
669	selected. See above for why this was bad.
670
671	* process_cabinet(): now prints "Finished processing cabinet" when
672	finished extracting, instead of just a blank line. Still prints
673	blank lines for listing files.
674
6752001-08-05  Stuart Caie   <kyzer@4u.net>
676
677	* Makefile.am: the manpage wasn't included in the distribution.
678	Fixed and re-issued the 0.3 release.
679
6802001-08-02  Stuart Caie   <kyzer@4u.net>
681
682	* decompress(): now takes a 'fix' flag, which causes MSZIP errors
683	to be ignored.
684
685	* cabinet_get_entries(): now keeps the printable information about
686	previous and next cabinet parts
687
688	* process_cabinet(): now prints the printable information about
689	the next cabinet part in a multi-part cabinet
690
691	* file_open(): now prepends a given directory if wanted, and can
692	make the filename lowercase if wanted.
693
694	* main(): changed to using getopt_long to parse arguments. Added
695	-L (lowercase), -d (output to directory), -f (fix corrupt cabs),
696	-h (help), -q (quiet) and -v was recycled to become --version,
697	when used on its own.
698
699	* LZXdecompress(): major bug fixed; the updated R0, R1 and R2 in
700	uncompressed blocks were being stored in the uncomp_state block,
701	not local variables. At the end of the function, the local values
702	are always written back to the uncomp_state block. So the values
703	placed there by the uncompressed block header were always
704	overwritten. Thanks to Pavel Turbin for providing an example of
705	this.
706
707	* rindex(): this is the BSD precursor of the ANSI standard
708	function strrchr(). Oops! Now uses strrchr(), or rindex() if
709	strrchr() isn't available.
710
711	* cabinet_find_header(): now prints an error message if it can't
712	find a header.
713
7142001-04-30  Stuart Caie   <kyzer@4u.net>
715
716	* fixed includes to include both <strings.h> and <string.h> if
717	they both exist, and made some signedness conversions explicit.
718	This should let cabextract compile with SGI's native
719	compiler. Thanks to Markus Nullmeier for the patch.
720
7212001-03-04  Stuart Caie   <kyzer@4u.net>
722
723	* main(): now prints the version of cabextract in the copyright
724	line.
725
726	* cabinet_find_header(): now searches any kind of file, not just
727	files beginning with 'MZ' header. Also, always searches entire
728	file.  This slows the search down, but increases the usefulness of
729	the search overall, IMHO. Thanks to Eric Sharkey for pointing this
730	out.
731
732	* LZXdecompress(): fixed problem in intel decoding: E8 must not
733	appear in the last 10 bytes, not the last 6 bytes... Thanks to Jae
734	Jung who pointed this out to me. I didn't believe him at first,
735	but he was quite right. Also thanks to Antoine Amanieux for
736	providing example files affected by this.
737
738	* process_cabinet(): now extends multipart cabinet filenames to be
739	in the same directory as the base cabinet.
740
741	* cabinet_open(): now only lowercases the filename part of a
742	cabinet name, not the path part.
743
7442001-03-03  Stuart Caie   <kyzer@4u.net>
745
746	* LZXdecompress(): fixed LZX bit buffer exhaustion in where
747	READ_HUFFSYM() requests more bits than the buffer actually
748	contains: top-of-loop overflow check now allows for the input
749	pointer to be 16 bits past the end of the buffer, but checks to
750	ensure none of those 16 bits are actually used. Also increased
751	decomp_state.inbuf by two bytes and clear the two bytes after
752	loaded block in decompress(). Thanks to Jae Jung for pointing out
753	this bug, and for providing example files which exposed the bug.
754
7552001-02-26  Stuart Caie <kyzer@4u.net>
756
757	* added configure script / makefile using automake.
758
759	* file_close(): now sets the timestamp on extracted files.
760