337 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			XML
		
	
	
	
			
		
		
	
	
			337 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			XML
		
	
	
	
| <?xml version="1.0" encoding='UTF-8'?>
 | |
| <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.5//EN"
 | |
| 		"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
 | |
| 
 | |
| <qandadiv id="faq.api">
 | |
| <title>Cygwin API Questions</title>
 | |
| 
 | |
| <!-- faq-api.xml --> 
 | |
| <qandaentry id="faq.api.everything">
 | |
| <question><para>How does everything work?</para></question>
 | |
| <answer>
 | |
| 
 | |
| <para>There's a C library which provides a POSIX-style API.  The
 | |
| applications are linked with it and voila - they run on Windows.
 | |
| </para>
 | |
| <para>The aim is to add all the goop necessary to make your apps run on
 | |
| Windows into the C library.  Then your apps should (ideally) run on POSIX
 | |
| systems (Unix/Linux) and Windows with no changes at the source level.
 | |
| </para>
 | |
| <para>The C library is in a DLL, which makes basic applications quite small.
 | |
| And it allows relatively easy upgrades to the Win32/POSIX translation
 | |
| layer, providing that DLL changes stay backward-compatible.
 | |
| </para>
 | |
| <para>For a good overview of Cygwin, you may want to read the Cygwin
 | |
| User's Guide.
 | |
| </para>
 | |
| </answer></qandaentry>
 | |
| 
 | |
| <qandaentry id="faq.api.snapshots">
 | |
| <question><para>Are development snapshots for the Cygwin library available?</para></question>
 | |
| <answer>
 | |
| 
 | |
| <para>Yes.  They're made whenever anything interesting happens inside the
 | |
| Cygwin library (usually roughly on a nightly basis, depending on how much
 | |
| is going on).  They are only intended for those people who wish to
 | |
| contribute code to the project.  If you aren't going to be happy
 | |
| debugging problems in a buggy snapshot, avoid these and wait for a real
 | |
| release.  The snapshots are available from
 | |
| <ulink url="https://cygwin.com/snapshots/"/>.
 | |
| </para>
 | |
| </answer></qandaentry>
 | |
| 
 | |
| <qandaentry id="faq.api.cr-lf">
 | |
| <question><para>How is the DOS/Unix CR/LF thing handled?</para></question>
 | |
| <answer>
 | |
| 
 | |
| <para>Let's start with some background.
 | |
| </para>
 | |
| <para>On POSIX systems, a file is a file and what the file contains is
 | |
| whatever the program/programmer/user told it to put into it.  In Windows,
 | |
| a file is also a file and what the file contains depends not only on the
 | |
| program/programmer/user but also the file processing mode.
 | |
| </para>
 | |
| <para>When processing in text mode, certain values of data are treated
 | |
| specially.  A \n (new line, NL) written to the file will prepend a \r
 | |
| (carriage return, CR) so that if you `printf("Hello\n") you in fact get
 | |
| "Hello\r\n".  Upon reading this combination, the \r is removed and the
 | |
| number of bytes returned by the read is 1 less than was actually read.
 | |
| This tends to confuse programs dependent on ftell() and fseek().  A
 | |
| Ctrl-Z encountered while reading a file sets the End Of File flags even
 | |
| though it truly isn't the end of file.
 | |
| </para>
 | |
| <para>One of Cygwin's goals is to make it possible to mix Cygwin-ported
 | |
| POSIX programs with generic Windows programs.  As a result, Cygwin allows
 | |
| to open files in text mode.  In the accompanying tools, tools that deal
 | |
| with binaries (e.g. objdump) operate in POSIX binary mode and many (but
 | |
| not all) tools that deal with text files (e.g. bash) operate in text mode.
 | |
| There are also some text tools which operate in a mixed mode.  They read
 | |
| files always in text mode, but write files in binary mode, or they write
 | |
| in the mode (text or binary) which is specified by the underlying mount
 | |
| point.  For a description of mount points, see the Cygwin User's Guide.
 | |
| </para>
 | |
| <para>Actually there's no really good reason to do text mode processing
 | |
| since it only slows down reading and writing files.  Additionally many
 | |
| Windows applications can deal with POSIX \n line endings just fine
 | |
| (unfortunate exception: Notepad).  So we suggest to use binary mode
 | |
| as much as possible and only convert files from or to DOS text mode
 | |
| using tools specifically created to do that job, for instance, dos2unix and
 | |
| unix2dos from the dos2unix package.
 | |
| </para>
 | |
| <para>It is rather easy for the porter of a Unix package to fix the source
 | |
| code by supplying the appropriate file processing mode switches to the
 | |
| open/fopen functions.  Treat all text files as text and treat all binary
 | |
| files as binary.  To be specific, you can select binary mode by adding
 | |
| <literal>O_BINARY</literal> to the second argument of an
 | |
| <literal>open</literal> call, or <literal>"b"</literal> to second argument
 | |
| of an <literal>fopen</literal> call.  You can also call
 | |
| <literal>setmode (fd, O_BINARY)</literal>.  To select text mode add
 | |
| <literal>O_TEXT</literal> to the second argument of an <literal>open</literal>
 | |
| call, or <literal>"t"</literal> to second argument of an
 | |
| <literal>fopen</literal> call, or just call
 | |
| <literal>setmode (fd, O_TEXT)</literal>.
 | |
| </para>
 | |
| <para>You can also avoid to change the source code at all by linking
 | |
| an additional object file to your executable.  Cygwin provides various
 | |
| object files in the <filename>/usr/lib</filename> directory which,
 | |
| when linked to an executable, changes the default open modes of any
 | |
| file opened within the executed process itself.  The files are
 | |
| <screen>
 | |
|   binmode.o      - Open all files in binary mode.
 | |
|   textmode.o     - Open all files in text mode.
 | |
|   textreadmode.o - Open all files opened for reading in text mode.
 | |
|   automode.o     - Open all files opened for reading in text mode,
 | |
|                    all files opened for writing in binary mode.
 | |
| </screen>
 | |
| </para>
 | |
| <para>
 | |
| <note>
 | |
|   Linking against these object files does <emphasis>not</emphasis> change
 | |
|   the open mode of files propagated to a process by its parent process,
 | |
|   for instance, if the process is part of a shell pipe expression.
 | |
| </note>
 | |
| </para>
 | |
| <para>Note that of the above flags only the "b" fopen flags are defined by
 | |
| ANSI.  They exist under most flavors of Unix.  However, using O_BINARY,
 | |
| O_TEXT, or the "t" flag is non-portable.
 | |
| </para>
 | |
| </answer></qandaentry>
 | |
| 
 | |
| <qandaentry id="faq.api.threads">
 | |
| <question><para>Is the Cygwin library multi-thread-safe?</para></question>
 | |
| <answer>
 | |
| 
 | |
| <para>Yes.
 | |
| </para>
 | |
| <para>There is also extensive support for 'POSIX threads', see the file
 | |
| <literal>cygwin.din</literal> for the list of POSIX thread functions provided.
 | |
| </para>
 | |
| </answer></qandaentry>
 | |
| 
 | |
| <qandaentry id="faq.api.fork">
 | |
| <question><para>How is fork() implemented?</para></question>
 | |
| <answer>
 | |
| 
 | |
| <para>Cygwin fork() essentially works like a non-copy on write version
 | |
| of fork() (like old Unix versions used to do).  Because of this it
 | |
| can be a little slow.  In most cases, you are better off using the
 | |
| spawn family of calls if possible.
 | |
| </para>
 | |
| <para>Here's how it works:
 | |
| </para>
 | |
| <para>Parent initializes a space in the Cygwin process table for child.
 | |
| Parent creates child suspended using Win32 CreateProcess call, giving
 | |
| the same path it was invoked with itself.  Parent calls setjmp to save
 | |
| its own context and then sets a pointer to this in the Cygwin shared
 | |
| memory area (shared among all Cygwin tasks).  Parent fills in the child's
 | |
| .data and .bss subsections by copying from its own address space into
 | |
| the suspended child's address space.  Parent then starts the child.
 | |
| Parent waits on mutex for child to get to safe point.  Child starts and
 | |
| discovers if has been forked and then longjumps using the saved jump
 | |
| buffer.  Child sets mutex parent is waiting on and then blocks on
 | |
| another mutex waiting for parent to fill in its stack and heap.  Parent
 | |
| notices child is in safe area, copies stack and heap from itself into
 | |
| child, releases the mutex the child is waiting on and returns from the
 | |
| fork call.  Child wakes from blocking on mutex, recreates any mmapped
 | |
| areas passed to it via shared area and then returns from fork itself.
 | |
| </para>
 | |
| <para>When the executable or any dll in use by the parent was renamed or
 | |
| moved into the hidden recycle bin, fork retries with creating hardlinks
 | |
| for the old executable and any dll into per-user subdirectories in the
 | |
| /var/run/cygfork/ directory, when that one exists and resides on NTFS.
 | |
| </para>
 | |
| </answer></qandaentry>
 | |
| 
 | |
| <qandaentry id="faq.api.globbing">
 | |
| <question><para>How does wildcarding (globbing) work?</para></question>
 | |
| <answer>
 | |
| 
 | |
| <para>If the DLL thinks it was invoked from a DOS style prompt, it runs a
 | |
| `globber' over the arguments provided on the command line.  This means
 | |
| that if you type <literal>LS *.EXE</literal> from DOS, it will do what you might
 | |
| expect.
 | |
| </para>
 | |
| <para>Beware: globbing uses <literal>malloc</literal>.  If your application defines
 | |
| <literal>malloc</literal>, that will get used.  This may do horrible things to you.
 | |
| </para>
 | |
| </answer></qandaentry>
 | |
| 
 | |
| <qandaentry id="faq.api.symlinks">
 | |
| <question><para>How do symbolic links work?</para></question>
 | |
| <answer>
 | |
| 
 | |
| <para>Cygwin knows of two ways to create symlinks.
 | |
| </para>
 | |
| <para>The default method generates link files with a magic header.  When you
 | |
| open a file or directory that is a link to somewhere else, it opens the file
 | |
| or directory listed in the magic header.  Because we don't want to have to
 | |
| open every referenced file to check symlink status, Cygwin marks symlinks
 | |
| with the system attribute.  Files without the system attribute are not
 | |
| checked.  Because remote samba filesystems do not enable the system
 | |
| attribute by default, symlinks do not work on network drives unless you
 | |
| explicitly enable this attribute or use the second method to create symlinks.
 | |
| </para>
 | |
| 
 | |
| <para>The second method is enabled if `winsymlinks' is set in the environment
 | |
| variable CYGWIN.
 | |
| Using this method, Cygwin generates symlinks by creating Windows shortcuts.
 | |
| Cygwin created shortcuts have a special header (which is in that way never
 | |
| created by Explorer) and the R/O attribute set.  A DOS path is stored in
 | |
| the shortcut as usual and the description entry is used to store the POSIX
 | |
| path.  While the POSIX path is stored as is, the DOS path has perhaps to be
 | |
| rearranged to result in a valid path.  This may result in a divergence
 | |
| between the DOS and the POSIX path when symlinks are moved crossing mount
 | |
| points.  When a user changes the shortcut, this will be detected by Cygwin
 | |
| and it will only use the DOS path then.  While Cygwin shortcuts are shown
 | |
| without the ".lnk" suffix in `ls' output, non-Cygwin shortcuts are shown
 | |
| with the suffix.  However, both are treated as symlinks.
 | |
| </para>
 | |
| 
 | |
| <para>Both, types of symlinks can live peacefully together since Cygwin
 | |
| treats both as symlinks regardless of the setting of `(no)winsymlinks' in
 | |
| the environment variable CYGWIN.
 | |
| </para>
 | |
| </answer></qandaentry>
 | |
| 
 | |
| <qandaentry id="faq.api.executables">
 | |
| <question><para>Why do some files, which are not executables have the 'x' type.</para></question>
 | |
| <answer>
 | |
| 
 | |
| <para>When working out the POSIX-style attribute bits on a file stored on
 | |
| certain filesystems (FAT, FAT32), the library has to fill out some information
 | |
| not provided by these filesystems.
 | |
| </para>
 | |
| <para>It guesses that files ending in .exe and .bat are executable, as are
 | |
| ones which have a "#!" as their first characters.  This guessing doesn't
 | |
| take place on filesystems providing real permission information (NTFS, NFS),
 | |
| unless you switch the permission handling off using the mount flag "noacl"
 | |
| on these filesystems.
 | |
| </para>
 | |
| </answer></qandaentry>
 | |
| 
 | |
| <qandaentry id="faq.api.secure">
 | |
| <question><para>How secure is Cygwin in a multi-user environment?</para></question>
 | |
| <answer>
 | |
| 
 | |
| <para>As of version 1.5.13, the Cygwin developers are not aware of any feature
 | |
| in the cygwin dll that would allow users to gain privileges or to access
 | |
| objects to which they have no rights under Windows. However there is no
 | |
| guarantee that Cygwin is as secure as the Windows it runs on.  Cygwin
 | |
| processes share some variables and are thus easier targets of denial of
 | |
| service type of attacks.
 | |
| </para>
 | |
| </answer></qandaentry>
 | |
| 
 | |
| <qandaentry id="faq.api.net-functions">
 | |
| <question><para>How do the net-related functions work?</para></question>
 | |
| <answer>
 | |
| 
 | |
| <para>The network support in Cygwin is supposed to provide the POSIX API, not
 | |
| the Winsock API.
 | |
| </para>
 | |
| <para>There are differences between the semantics of functions with the same
 | |
| name under the API.
 | |
| </para>
 | |
| <para>E.g., the POSIX select system call can wait on a standard file handles
 | |
| and handles to sockets.  The select call in Winsock can only wait on
 | |
| sockets.  Because of this, the Cygwin dll does a lot of nasty stuff behind
 | |
| the scenes, trying to persuade various Winsock/Win32 functions to do what
 | |
| a Unix select would do.
 | |
| </para>
 | |
| <para>If you are porting an application which already uses Winsock, then
 | |
| porting the application to Cygwin means to port the application to using
 | |
| the POSIX net functions.  You should never mix Cygwin net functions with
 | |
| direct calls to Winsock functions.  If you use Cygwin, use the POSIX API.
 | |
| </para>
 | |
| </answer></qandaentry>
 | |
| 
 | |
| <qandaentry id="faq.api.winsock">
 | |
| <question><para>I don't want Unix sockets, how do I use normal Win32 winsock?</para></question>
 | |
| <answer>
 | |
| 
 | |
| <para>You don't.  Look for the Mingw-w64 project to port applications using
 | |
| native Win32/Winsock functions.  Cross compilers packages to build Mingw-w64
 | |
| targets are available in the Cygwin distro.
 | |
| </para>
 | |
| </answer></qandaentry>
 | |
| 
 | |
| <qandaentry id="faq.api.versions">
 | |
| <question><para>What version numbers are associated with Cygwin?</para></question>
 | |
| <answer>
 | |
| 
 | |
| <para>Cygwin versioning is relatively complicated because of its status as a
 | |
| shared library.  First of all, since October 1998 every Cygwin DLL has
 | |
| been named <literal>cygwin1.dll</literal> and has a 1 in the release name.
 | |
| Additionally, there are DLL major and minor numbers that correspond to
 | |
| the name of the release, and a release number. In other words,
 | |
| cygwin-2.4.1-1 is <literal>cygwin1.dll</literal>, major version 2, minor
 | |
| version 4, release 1.  -1 is a subrelease number required by the distro
 | |
| versioning scheme.  It's not actually part of the Cygwin DLL version number.
 | |
| </para>
 | |
| <para>The <literal>cygwin1.dll</literal> major version number gets incremented
 | |
| only when a change is made that makes existing software incompatible. For
 | |
| example, the first major version 5 release, cygwin-1.5.0-1, added 64-bit
 | |
| file I/O operations, which required many libraries to be recompiled and
 | |
| relinked.  The minor version changes every time we make a new backward
 | |
| compatible Cygwin release available.  There is also a
 | |
| <literal>cygwin1.dll</literal> release version number.  The release number
 | |
| is only incremented if we update an existing release in a way that does not
 | |
| effect the DLL (like a missing header file).
 | |
| </para>
 | |
| <para>There are also Cygwin API major and minor numbers.  The major number
 | |
| tracks important non-backward-compatible interface changes to the API.
 | |
| An executable linked with an earlier major number will not be compatible
 | |
| with the latest DLL.  The minor number tracks significant API additions
 | |
| or changes that will not break older executables but may be required by
 | |
| newly compiled ones.
 | |
| </para>
 | |
| <para>Then there is a shared memory region compatibility version number.  It is
 | |
| incremented when incompatible changes are made to the shared memory
 | |
| region or to any named shared mutexes, semaphores, etc.  For more exciting
 | |
| Cygwin version number details, check out the
 | |
| <literal>/usr/include/cygwin/version.h</literal> file.
 | |
| </para>
 | |
| </answer></qandaentry>
 | |
| 
 | |
| <qandaentry id="faq.api.timezone">
 | |
| <question><para>Why isn't timezone set correctly?</para></question>
 | |
| <answer>
 | |
| 
 | |
| <para><emphasis role='bold'>(Please note: This section has not yet been updated for the latest net release.)</emphasis>
 | |
| </para>
 | |
| <para>Did you explicitly call tzset() before checking the value of timezone?
 | |
| If not, you must do so.
 | |
| </para>
 | |
| </answer></qandaentry>
 | |
| 
 | |
| <qandaentry id="faq.api.mouse">
 | |
| <question><para>Is there a mouse interface?</para></question>
 | |
| <answer>
 | |
| 
 | |
| <para>If you're using X then use the X API to handle mouse events.
 | |
| In a Windows console window you can enable and capture mouse events
 | |
| using the xterm escape sequences for mouse events.
 | |
| </para>
 | |
| </answer></qandaentry>
 | |
| </qandadiv>
 |