|
25.3.1 Text vs Binary Modes
As discussed in 15.3.5.1 Text and Binary Files, text and binary files are
different on Windows. Lines in a Windows text files end in a
carriage return/line feed pair, but a C program reading the file in text
mode will see a single line feed.
Cygwin has several ways to hide this dichotomy, and the solution(s) you
choose will depend on how you plan to use your program. I will outline
the relative tradeoffs you make with each choice:
- mounting
-
Before installing an operating system to your hard drive, you must first
organise the disk into partitions. Under Windows, you might only
have a single partition on the disk, which would be called
`C:'(63). Provided that some
media is present, Windows allows you to access the contents of any drive
letter -- that is you can access `A:' when there is a floppy disk in
the drive, and `F:' provided you divided you available drives into
sufficient partitions for that letter to be in use. With Unix, things
are somewhat different: hard disks are still divided into partitions
(typically several), but there is only a single filesystem mounted
under the root directory. You can use the
mount command to
hook a partition (or floppy drive or CD-ROM, etc.) into a
subdirectory of the root filesystem:
|
$ mount /dev/fd0 /mnt/floppy
$ cd /mnt/floppy
|
Until the directory is unmount ed, the contents of the floppy
disk will be available as part of the single Unix filesystem in the
directory, `/mnt/floppy'. This is in contrast with Windows'
multiple root directories which can be accessed by changing filesystem
root -- to access the contents of a floppy disk:
|
C:\WINDOWS\> A:
A:> DIR
...
|
Cygwin has a mounting facility to allow Cygwin applications to see a
single unified file system starting at the root directory, by
mount ing drive letters to subdirectories. When mounting a
directory you can set a flag to determine whether the files in that
partition should be treated the same whether they are TEXT or
BINARY mode files. Mounting a file system to treat TEXT files
the same as BINARY files, means that Cygwin programs can behave in
the same way as they might on Unix and treat all files as equal.
Mounting a file system to treat TEXT files properly, will cause
Cygwin programs to translate between Windows CR-LF line end
sequences and Unix CR line endings, which plays havoc with
file seeking, and many programs which make assumptions about the size of
a char in a FILE stream. However `binmode' is the
default method because it is the only way to interoperate between
Windows binaries and Cygwin binaries. You can get a list of which drive
letters are mounted to which directories, and the modes they are mounted
with by running the mount command without arguments:
|
BASH.EXE-2.04$ mount
Device Directory Type flags
C:\cygwin / user binmode
C:\cygwin\bin /usr/bin user binmode
C:\cygwin\lib /usr/lib user binmode
D:\home /home user binmode
|
As you can see, the Cygwin mount command allows you to
`mount' arbitrary Windows directories as well as simple drive letters
into the single filesystem seen by Cygwin apllications.
- binmode
-
The
CYGWIN environment variable holds a space separated list of
setup options which exert some minor control over the way the
`cygwin1.dll' (or `cygwinb19.dll' etc.) behaves. One such
option is the `binmode' setting; if CYGWIN contains the
`binmode' option, files which are opened through `cygwin1.dll'
without an explicit text or binary mode,
will default to binary mode which is closest to how Unix behaves.
- system calls
-
`cygwin1.dll', GNU libc and other modern C API
implementations accept extra flags for
fopen and open calls to
determine in which mode a file is opened. On Unix it makes no
difference, and sadly most Unix programmers are not aware of this
subtlety, so this tends to be the first thing that needs to be fixed when
porting a Unix program to Cygwin. The best way to use these calls
portably is to use the following macros with a package's `configure.in'
to be sure that the extra arguments are available:
Add the following preprocessor code to a common header file that will be
included by any sources that use fopen calls:
Save the following function to a file, and link that into your program
so that in combination with the preprocessor magic above, you can always
specify text or binary mode to open and fopen , and let
this code take care of removing the flags on machines which do not
support them:
The correct operation of the file above relies on several things having
been checked by the configure script, so you will also need to
ensure that the following macros are present in your `configure.in'
before you use this code:
|