Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/doc/pathnames.sgml')
-rw-r--r--winsup/doc/pathnames.sgml272
1 files changed, 272 insertions, 0 deletions
diff --git a/winsup/doc/pathnames.sgml b/winsup/doc/pathnames.sgml
new file mode 100644
index 000000000..2338b18ff
--- /dev/null
+++ b/winsup/doc/pathnames.sgml
@@ -0,0 +1,272 @@
+<sect1 id="using-pathnames"><title>Mapping path names</title>
+
+<sect2><title>Introduction</title>
+
+<para>Cygwin supports both Win32- and POSIX-style paths, where
+directory delimiters may be either forward or back slashes. UNC
+pathnames (starting with two slashes and a network name) are also
+supported.</para>
+
+<para>POSIX operating systems (such as Linux) do not have the concept
+of drive letters. Instead, all absolute paths begin with a
+slash (instead of a drive letter such as "c:") and all file systems
+appear as subdirectories (for example, you might buy a new disk and
+make it be the <filename>/disk2</filename> directory).</para>
+
+<para>Because many programs written to run on UNIX systems assume
+the existance of a single unified POSIX file system structure, Cygwin
+maintains a special internal POSIX view of the Win32 file system
+that allows these programs to successfully run under Windows. Cygwin
+uses this mapping to translate between Win32 and POSIX paths as
+necessary.</para>
+
+</sect2>
+
+<sect2 id="mount-table"><title>The Cygwin Mount Table</title>
+
+<para>The <command>mount</command> utility program is used to
+to map Win32 drives and network shares into Cygwin's internal POSIX
+directory tree. This is a similar concept to the typical UNIX mount
+program. For those people coming from a Windows background, the
+<command>mount</command> utility is very similar to the old DOS
+<command>join</command>, in that it makes your drive letters appear as
+subdirectories somewhere else.</para>
+
+<para>The mapping is stored in the current user's Cygwin
+<FirstTerm>mount table</FirstTerm> in the Windows registry so that the
+information will be retrieved next time the user logs in. Because it
+is sometimes desirable to have system-wide as well as user-specific
+mounts, there is also a system-wide mount table that all Cygwin users
+inherit. The system-wide table may only be modified by a user with
+the appropriate priviledges (Administrator priviledges in Windows
+NT).</para>
+
+<para>The current user's table is located under
+"HKEY_CURRENT_USER/Software/Cygnus Solutions/Cygwin/mounts
+v&lt;version&gt;"
+where &lt;version&gt; is the latest registry version associated with
+the Cygwin library (this version is not the same as the release
+number). The system-wide table is located under the same subkeys
+under HKEY_LOCAL_SYSTEM.</para>
+
+<para>By default, the POSIX root <filename>/</filename> points to the
+system partition but it can be relocated to any directory in the
+Windows file system using the <command>mount</command> command.
+Whenever Cygwin generates a POSIX path from a Win32 one, it uses the
+longest matching prefix in the mount table. Thus, if
+<filename>C:</filename> is mounted as <filename>/c</filename> and also
+as <filename>/</filename>, then Cygwin would translate
+<filename>C:/foo/bar</filename> to <filename>/c/foo/bar</filename>.</para>
+
+<para>Invoking <command>mount</command> without any arguments displays
+Cygwin's current set of mount points.
+In the following example, the C
+drive is the POSIX root and D drive is mapped to
+<filename>/d</filename>. Note that in this case, the root mount is a
+system-wide mount point that is visible to all users running Cygwin
+programs, whereas the <filename>/d</filename> mount is only visible
+to the current user.</para>
+
+<example>
+<title>Displaying the current set of mount points</title>
+<screen>
+<prompt>c:\cygnus\&gt;</prompt> <userinput>mount</userinput>
+Device Directory Type Flags
+D: /d user textmode
+C: / system textmode
+</screen>
+</example>
+
+<para>You can also use the <command>mount</command> command to add
+new mount points, and the <command>umount</command> to delete
+them. See <Xref Linkend="mount"> and <Xref Linkend="umount"> for more
+information on how to use these utilities to set up your Cygwin POSIX
+file system.</para>
+
+<para>Whenever Cygwin cannot use any of the existing mounts to convert
+from a particular Win32 path to a POSIX one, Cygwin will
+automatically default to an imaginary mount point under the default POSIX
+path <filename>/cygdrive</filename>. For example, if Cygwin accesses
+<filename>Z:\foo</filename> and the Z drive is not currently in the
+mount table, then <filename>Z:\</filename> would be automatically
+converted to <filename>/cygdrive/Z</filename>. The default
+prefix of <filename>/cygdrive</filename> may be changed (see the
+<Xref Linkend="mount"> for more information).</para>
+
+<para>It is possible to assign some special attributes to each mount
+point. Automatically mounted partitions are displayed as "auto"
+mounts. Mounts can also be marked as either "textmode" or "binmode"
+-- whether text files are read in the same manner as binary files by
+default or not (see <Xref Linkend="using-textbinary"> for more
+information on text and binary modes.</para>
+
+</sect2>
+
+<sect2><title>Cygwin Mount Table Strategies</title>
+
+<para>Which set of mounts is right for a given Cygwin user depends
+largely on how closely you want to simulate a POSIX environment,
+whether you mix Windows and Cygwin programs, and how many drive
+letters you are using. If you want to be very POSIX-like (assuming
+"CygwinRoot" is the top directory of your Cygwin distribution), you may
+want to do something like this:
+
+<example><title>POSIX-like mount setup</title>
+<screen>
+<prompt>C:\&gt;</prompt> <userinput>mount c:\Cygnus\CygwinRoot /</userinput>
+<prompt>C:\&gt;</prompt> <userinput>mount c:\ /c</userinput>
+<prompt>C:\&gt;</prompt> <userinput>mount d:\ /d</userinput>
+<prompt>C:\&gt;</prompt> <userinput>mount e:\ /cdrom</userinput>
+</screen>
+</example>
+
+<para>However, if you mix Windows and Cygwin programs a lot, you might
+want to create an "identity" mapping, so that conversions between the
+two (see <Xref Linkend="cygpath">) can be eliminated:</para>
+
+<example><title>Identity mount setup</title>
+<screen>
+<prompt>C:\&gt;</prompt> <userinput>mount c:\ \</userinput>
+<prompt>C:\&gt;</prompt> <userinput>mount d:\foo /foo</userinput>
+<prompt>C:\&gt;</prompt> <userinput>mount d:\bar /bar</userinput>
+<prompt>C:\&gt;</prompt> <userinput>mount e:\grill /grill</userinput>
+</screen>
+</example>
+
+<para>You'd have to repeat this for all top-level subdirectories on
+all drives, but then you'd always have the top-level directories
+available as the same names in both systems.</para>
+
+</sect2>
+
+<sect2><title>Additional Path-related Information</title>
+
+<para>The <command>cygpath</command> program provides the ability to
+translate between Win32 and POSIX pathnames in shell scripts. See
+<Xref Linkend="cygpath"> for the details.</para>
+
+<para>The <EnVar>HOME</EnVar>, <EnVar>PATH</EnVar>, and
+<EnVar>LD_LIBRARY_PATH</EnVar> environment variables are automatically
+converted from Win32 format to POSIX format (e.g. from
+<filename>C:\cygnus\cygwin-b20\H-i586-cygwin32\bin</filename> to
+<filename>/bin</filename>, if there was a mount from that Win32 path to
+that POSIX path) when a Cygwin process first starts.</para>
+
+<para>Symbolic links can also be used to map Win32 pathnames to POSIX.
+For example, the command
+<command>ln -s //pollux/home/joe/data /data</command> would have about
+the same effect as creating a mount point from
+<filename>//pollux/home/joe/data</filename> to <filename>/data</filename>
+using <command>mount</command>, except that symbolic links cannot set
+the default file access mode. Other differences are that the mapping is
+distributed throughout the file system and proceeds by iteratively
+walking the directory tree instead of matching the longest prefix in a
+kernel table. Note that symbolic links will only work on network
+drives that are properly configured to support the "system" file
+attribute. Many do not do so by default (the Unix Samba server does
+not by default, for example).</para>
+
+</sect2>
+
+</sect1>
+
+<sect1 id="using-specialnames"><title>Special filenames</title>
+
+<sect2> <title>DOS devices</title>
+
+<para>Windows filenames invalid under Windows are also invalid under
+Cygwin. This means that base filenames such as
+<filename>AUX</filename>, <filename>COM1</filename>,
+<filename>LPT1</filename> or <filename>PRN</filename> (to name a few)
+cannot be used in a regular Cygwin Windows or POSIX path, even with an
+extension (<filename>prn.txt</filename>). However the special names can be
+used as filename extensions (<filename>file.aux</filename>). You can use
+the special names as you would under DOS, for example you can print on your
+default printer with the command <command>cat filename > PRN</command>
+(make sure to end with a Form Feed).
+</para>
+
+<sect2> <Title>POSIX devices</title>
+<para>There is no need to create a POSIX <filename>/dev</filename>
+directory as it is simulated within Cygwin automatically.
+It supports the following devices: <filename>/dev/null</filename>,
+<filename>/dev/tty</filename> and
+<filename>/dev/comX</filename> (the serial ports).
+These devices cannot be seen with the command <command>ls /dev</command>
+although commands such as <command>ls /dev/tty</command> work fine.
+<comment>
+FIXME: Are there other devices under /dev. What about the funny ones
+mounted by default, such as /dev/fd1. What do they really do?
+</comment>
+</para>
+
+<sect2><title>The .exe extension</title>
+
+<para> Executable program filenames end with .exe but the .exe need
+not be included in the command, so that traditional UNIX names can be
+used. However, for programs that end in ".bat" and ".com", you cannot
+omit the extension.
+</para>
+
+<para>As a side effect, the <command> ls filename</command> gives
+information about <filename>filename.exe</filename> if
+<filename>filename.exe</filename> exists and <filename>filename</filename>
+does not. In the same situation the function call
+<function>stat("filename",..)</function> gives information about
+<filename>filename.exe</filename>. The two files can be distinguished
+by examining their inodes, as demonstrated below.
+<screen>
+<prompt>C:\Cygnus\&gt;</prompt> <userinput>ls * </userinput>
+a a.exe b.exe
+<prompt>C:\Cygnus\&gt;</prompt> <userinput>ls -i a a.exe</userinput>
+445885548 a 435996602 a.exe
+<prompt>C:\Cygnus\&gt;</prompt> <userinput>ls -i b b.exe</userinput>
+432961010 b 432961010 b.exe
+</screen>
+If a shell script <filename>myprog</filename> and a program
+<filename>myprog.exe</filename> coexist in a directory, the program
+has precedence and is selected for execution of
+<command>myprog</command>.</para>
+
+<para>The <command>gcc</command> compiler produces an executable named
+<filename>filename.exe</filename> when asked to produce
+<filename>filename</filename>. This allows many makefiles written
+for UNIX systems to work well under Cygwin.</para>
+
+<para>Unfortunately, the <command>install</command> and
+<command>strip</command> commands do distinguish between
+<filename>filename</filename> and <filename>filename.exe</filename>. They
+fail when working on a non-existing <filename>filename</filename> even if
+<filename>filename.exe</filename> exists, thus breaking some makefiles.
+This problem can be solved by writing <command>install</command> and
+<command>strip</command> shell scripts to provide the extension ".exe"
+when needed.
+</para>
+</sect2>
+
+<sect2><title>The @pathnames</title>
+<para>To circumvent the limitations on shell line length in the native
+Windows command shells, Cygwin programs expand their arguments
+starting with "@" in a special way. If a file
+<filename>pathname</filename> exists, the argument
+<filename>@pathname</filename> expands recursively to the content of
+<filename>pathname</filename>. Double quotes can be used inside the
+file to delimit strings containing blank space.
+Embedded double quotes must be repeated.
+In the following example compare the behaviors of the bash built-in
+<command>echo</command> and of the program <command>/bin/echo</command>.
+
+<example><title> Using @pathname</title>
+<screen>
+<prompt>/Cygnus$</prompt> <userinput>echo 'This is "a long" line' > mylist</userinput>
+<prompt>/Cygnus$</prompt> <userinput>echo @mylist</userinput>
+@mylist
+<prompt>/Cygnus$</prompt> <userinput>/bin/echo @mylist</userinput>
+This is a long line
+<prompt>/Cygnus$</prompt> <userinput>rm mylist</userinput>
+<prompt>/Cygnus$</prompt> <userinput>/bin/echo @mylist</userinput>
+@mylist
+</screen>
+</example>
+</sect2>
+</sect1>