<- Prev | Next
->
Windows vs. Linux Gotchas
There are some gotchas and headaches that come with working
with uploading and downloading files through CGI. The problem
is based on when and how to set a file stream to binary
mode and when to set it (or keep it) in text mode.
If you send a binary file (one that might contain NULL
characters and newlines/CRLF's that aren't meant to be
CRLF's) to a file stream in text mode oni a windows machine,
CRLF's are going to get converted to the local CRLF sequence,
which corrupts the file. Likewise, if you download a text
file in binary mode, there are times when the browser
will add, keep, or delete newline characters. In these
cases, the text file might have a mysterious blank line
between every line in the file, or the newlines might
get erased, and you just have one long line. Anyway, you
get the idea. The problem is exacerbated when you have
a script working on one platform and try to port it to
another - linux vs. windows.
I recently installed the latest version of Red Hat Linux,
and use it as my main computer. I was writing an upload
script, and was trying in vain to figure out how to convert
stdin and stdout to binary mode. To make a long story
short, all linux files are in binary mode by default.
The "b" flag used to set binary mode in fopen(), fdopen(),
and freopen() is ignored in linux. If I would have read
the man pages closer I would have discovered that all
POSIX compliant OS's treat text and binary files the same,
so there is no need to worry about text vs binary mode
on my machine. Windows is a different story.
In windows, if a file uploaded is content type "text/.....",
then you want to use Ascii mode whenever you deal with
the file. Otherwise, you want to use Binary mode whenever
you deal with the file. By dealing with the file, I mean
- sending it to stdout, reading it from stdin, writing
it to a file, reading it from a file, etc....
Anyway, here's the code you need in windows to set stdin
or stdout to binary mode:
- First - you need to include this header in Windows:
#include <io.h>
- Then, when you want to set stdout (or stdin) to binary
mode, use this code:
int result = setmode(
fileno( stdout ), O_BINARY );
if(result != -1)
{
// yay! - successfully set it binary mode
}
else
{
// I hate windows
}
END OF TUTORIAL
<- Prev | Next
->