Sometimes it happens. I intend to send a binary file to an FTP server and forget to change the mode to BINARY before starting the transfer.
It’s really easy to do… and it was a natural habit type of thing back in the day when I used FTP frequently…
ftp www.xyz.com
user
pass
hash
binary
Simple and straight forward. Anyway, I screwed up the other day and thought all was lost after a few .tgz files I transferred over to a server via FTP were not extractable. I deleted my source before verifying my file transfers, stupid me.
Anyway, a tool that worked like a champ, Windows and Linux, is fixgz. fixgz attempts to fix a binary file transferred in ascii mode by
* removing each extra CR when it followed by LF. So if you ever get a corrupted file after transferring via FTP in the wrong format, give this a whirl.
fixgz.c
/* fixgz attempts to fix a binary file transferred in ascii mode by
* removing each extra CR when it followed by LF.
* usage: fixgz bad.gz fixed.gz
* WARNING: the output file name must be different from the input file name!
* Copyright 1998 Jean-loup Gailly <jloup@gzip.org>
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the author be held liable for any damages
* arising from the use of this software.
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely.
*/
#include
int main(argc, argv)
int argc;
char **argv;
{
int c1, c2; /* input bytes */
FILE *in; /* corrupted input file */
FILE *out; /* fixed output file */
if (argc <= 2) {
fprintf(stderr, "usage: fixgz bad.gz fixed.gz
");
exit(1);
}
if (!strcmp(argv[1], argv[2])) {
fprintf(stderr, "input and output files must be different
");
exit(1);
}
in = fopen(argv[1], "rb");
if (in == NULL) {
fprintf(stderr, "fixgz: cannot open %s
", argv[1]);
exit(1);
}
out = fopen(argv[2], "wb");
if (in == NULL) {
fprintf(stderr, "fixgz: cannot create %s
", argv[2]);
exit(1);
}
c1 = fgetc(in);
while ((c2 = fgetc(in)) != EOF) {
if (c1 != '
' || c2 != '
') {
fputc(c1, out);
}
c1 = c2;
}
if (c1 != EOF) {
fputc(c1, out);
}
exit(0);
return 0; /* avoid warning */
}