OSDN Git Service

* new-features.sgml (ov-new1.7.7): New section.
authorcorinna <corinna>
Thu, 19 Aug 2010 10:35:25 +0000 (10:35 +0000)
committercorinna <corinna>
Thu, 19 Aug 2010 10:35:25 +0000 (10:35 +0000)
* pathnames.sgml: Throughout, align style of screen elements.
Throughout, make all emphasis elements bold.
(pathnames-win32-api): Rewrite section.

winsup/doc/ChangeLog
winsup/doc/new-features.sgml
winsup/doc/pathnames.sgml

index d8f398a..48baf45 100644 (file)
@@ -1,3 +1,10 @@
+2010-08-19  Corinna Vinschen  <corinna@vinschen.de>
+
+       * new-features.sgml (ov-new1.7.7): New section.
+       * pathnames.sgml: Throughout, align style of screen elements.
+       Throughout, make all emphasis elements bold.
+       (pathnames-win32-api): Rewrite section.
+
 2010-08-18  Corinna Vinschen  <corinna@vinschen.de>
 
        * pathnames.sgml (pathnames-win32-api): Try to use a more clear wording.
index 0a1f9ac..9c23000 100644 (file)
@@ -1,5 +1,18 @@
 <sect1 id="ov-new1.7"><title>What's new and what changed in Cygwin 1.7</title>
 
+<sect2 id="ov-new1.7.7"><title>What's new and what changed from 1.7.6 to 1.7.7</title>
+
+<itemizedlist mark="bullet">
+
+<listitem><para>
+Add a new CW_SYNC_WINCWD command to the <function>cygwin_internal</function>
+call, to allow to synchronize the Win32 CWD with the Cygwin CWD.
+</para></listitem>
+
+</itemizedlist>
+
+</sect2>
+
 <sect2 id="ov-new1.7.6"><title>What's new and what changed from 1.7.5 to 1.7.6</title>
 
 <itemizedlist mark="bullet">
index 03c4ba0..492f9cd 100644 (file)
@@ -174,31 +174,31 @@ mount the root dir with special options (for instance, as text mount).</para>
 <itemizedlist spacing="compact">
 <listitem>
   <para>Just a normal mount point:</para>
-  <screen>c:/foo /bar fat32 binary 0 0</screen>
+  <screen>  c:/foo /bar fat32 binary 0 0</screen>
 </listitem>
 <listitem>
   <para>A mount point for a textmode mount with case sensitivity switched off:</para>
-  <screen>C:/foo /bar/baz ntfs text,posix=0 0 0</screen>
+  <screen>  C:/foo /bar/baz ntfs text,posix=0 0 0</screen>
 </listitem>
 <listitem>
   <para>A mount point for a Windows directory with spaces in it:</para>
-  <screen>C:/Documents\040and\040Settings /docs ext3 binary 0 0</screen>
+  <screen>  C:/Documents\040and\040Settings /docs ext3 binary 0 0</screen>
 </listitem>
 <listitem>
   <para>A mount point for a remote directory without ACL support:</para>
-  <screen>//server/share/subdir /srv/subdir smbfs binary,noacl 0 0</screen>
+  <screen>  //server/share/subdir /srv/subdir smbfs binary,noacl 0 0</screen>
 </listitem>
 <listitem>
   <para>This is just a comment:</para>
-  <screen># This is just a comment</screen>
+  <screen>  # This is just a comment</screen>
 </listitem>
 <listitem>
   <para>Set the cygdrive prefix to /mnt:</para>
-  <screen>none /mnt cygdrive binary 0 0</screen>
+  <screen>  none /mnt cygdrive binary 0 0</screen>
 </listitem>
 <listitem>
   <para>Remount /var to /usr/var:</para>
-  <screen>/var /usr/var none bind</screen>
+  <screen>  /var /usr/var none bind</screen>
   <para>Assuming <filename>/var</filename> points to
   <filename>C:/cygwin/var</filename>, <filename>/usr/var</filename> now
   also points to <filename>C:/cygwin/var</filename>.  This is equivalent
@@ -224,13 +224,13 @@ arguments:</para>
 <example id="pathnames-mount-ex">
 <title>Displaying the current set of mount points</title>
 <screen>
-<prompt>bash$</prompt> <userinput>mount</userinput>
-f:/cygwin/bin on /usr/bin type system (binary,auto)
-f:/cygwin/lib on /usr/lib type system (binary,auto)
-f:/cygwin on / type system (binary,auto)
-e:/src on /usr/src type system (binary)
-c: on /cygdrive/c type user (binary,posix=0,user,noumount,auto)
-e: on /cygdrive/e type user (binary,posix=0,user,noumount,auto)
+  <prompt>bash$</prompt> <userinput>mount</userinput>
+  f:/cygwin/bin on /usr/bin type system (binary,auto)
+  f:/cygwin/lib on /usr/lib type system (binary,auto)
+  f:/cygwin on / type system (binary,auto)
+  e:/src on /usr/src type system (binary)
+  c: on /cygdrive/c type user (binary,posix=0,user,noumount,auto)
+  e: on /cygdrive/e type user (binary,posix=0,user,noumount,auto)
 </screen>
 </example>
 
@@ -247,7 +247,8 @@ your old system mount points (stored in the HKEY_LOCAL_MACHINE branch
 of your registry) are read by a script and the <filename>/etc/fstab</filename>
 file is generated from these entries.  Note that entries for
 <filename>/</filename>, <filename>/usr/bin</filename>, and
-<filename>/usr/lib</filename> are <emphasis>never</emphasis> generated.
+<filename>/usr/lib</filename> are <emphasis role='bold'>never</emphasis>
+generated.
 </para>
 
 <para>
@@ -336,22 +337,22 @@ bypass the information given in the Cygwin mount table.</para>
 <itemizedlist spacing="compact">
   <listitem>
     <para>All paths starting with a drive specifier</para>
-    <screen>
-       C:\foo
-       C:/foo
-    </screen>
+<screen>
+  C:\foo
+  C:/foo
+</screen>
   </listitem>
   <listitem>
     <para>All paths containing at least one backslash as path component</para>
-    <screen>
-       C:/foo/bar<emphasis role='bold'>\</emphasis>baz/...
-    </screen>
+<screen>
+  C:/foo/bar<emphasis role='bold'>\</emphasis>baz/...
+</screen>
   </listitem>
   <listitem>
     <para>UNC paths using backslashes</para>
-    <screen>
-       \\server\share\...
-    </screen>
+<screen>
+  \\server\share\...
+</screen>
   </listitem>
 </itemizedlist>
 
@@ -366,33 +367,92 @@ permissions.</para>
 
 <sect2 id="pathnames-win32-api"><title>Using the Win32 file API in Cygwin applications</title>
 
-<para>Special care must be taken when your application uses Win32 file API
-functions like <function>CreateFile</function> to access files using relative
-pathnames.</para>
+<para>Special care must be taken if your application uses Win32 file API
+functions like <function>CreateFile</function> to access files using
+relative pathnames, or if your application uses functions like
+<function>CreateProcess</function> or <function>ShellExecute</function>
+to start other applications.</para>
 
 <para>When a Cygwin application is started, the Win32 idea of the current
-working directory (CWD) is set to an invalid directory.  This works around
-the problem that the Win32 CWD is locked in a way which restricts POSIX
-functionality.  However, the side effect is that a call to, for instance,
-<function>CreateFile ("foo", ...);</function> will fail, since the Win32
-notion of the CWD is <emphasis>not</emphasis> the same as the Cygwin notion
-of the CWD.</para>
+working directory (CWD) is set to an <emphasis role='bold'>invalid</emphasis>
+directory.  This works around the problem that the Win32 CWD is locked
+in a way which restricts certain POSIX functionality.  However, the side
+effect is that a call to, for instance, <function>CreateFile ("foo",
+...);</function> will fail, since the Win32 notion of the CWD is
+not the same as the Cygwin notion of the CWD, and worse, it's a
+directory entirely unsuitable for normal file operations.</para>
 
 <para>So, in general, don't use the Win32 file API in Cygwin applications.
-If you <emphasis>really</emphasis> need to access files using the Win32 API,
-and if you <emphasis>really</emphasis> have to use relative pathnames,
-you have two choices.</para>
+If you <emphasis role='bold'>really</emphasis> need to access files using
+the Win32 API, or if you <emphasis role='bold'>really</emphasis> have to use
+<function>CreateProcess</function> to start applications, rather than
+the POSIX <function>exec(3)</function> familiy of functions, you have to
+make sure that the Win32 CWD is set to some valid directory.  To
+accomplish that, you can choose from several methods.</para>
 
 <itemizedlist spacing="compact">
   <listitem>
-    <para>Either you call <function>SetCurrentDirectory</function> before
-    calling the Win32 function which requires a valid Win32 CWD
-    (<function>CreateFile</function>, <function>CreateProcess</function>,
-    etc).</para>
+    <para>The easiest method is to call</para>
+    
+<screen>
+  #include &lt;sys/cygwin.h&gt;
+
+  cygwin_internal (CW_SYNC_WINCWD);
+</screen>
+
+    <para>prior to calling the Win32 functions which require a valid Win32 CWD.
+    This function synchronizes the Win32 CWD with the Cygwin CWD.</para>
+
+    <para>Note that the <function>cygwin_internal (CW_SYNC_WINCWD)</function>
+    call may fail.  In that case, it returns with a non-zero value and
+    errno is set appropriately:</para>
+
+    <segmentedlist>
+      <?dbhtml list-presentation="table"?>
+      <seglistitem>
+       <seg><emphasis role='bold'>ENOTDIR</emphasis></seg>
+       <seg>The Cygwin CWD is a virtual path, like /proc, or //, which does not
+            exist as valid directory in the Win32 namespace.</seg>
+      </seglistitem>
+      <seglistitem>
+       <seg><emphasis role='bold'>EACCES</emphasis></seg>
+       <seg>The Cygwin CWD is a directory with restrictive permissions,
+            which make it unusable as Win32 directory.</seg>
+      </seglistitem>
+      <seglistitem>
+       <seg><emphasis role='bold'>ENAMETOOLONG</emphasis></seg>
+       <seg>The Cygwin CWD is too long to be used as Win32 CWD.
+            The Win32 CWD is restricted to 258 characters.</seg>
+      </seglistitem>
+    </segmentedlist>
+
+    <para>You should make sure that you test the return value of
+    <function>cygwin_internal (CW_SYNC_WINCWD)</function>, otherwise
+    your application will potentially not work correctly.  If the call
+    failed, you can use the Win32 call <function>SetCurrentDirectory</function>
+    to move to some well-known directory.</para>
+
+    <note><para>After you've synchronized the Win32 CWD with the Cygwin CWD,
+    be aware that the directory is locked, until the process exited, or
+    until the process set the Win32 CWD to some other directory.  During that
+    period it will not be possible to rename or remove the directory from
+    other Cygwin applications.</para></note>
+  </listitem>
+  <listitem>
+    <para>If you know where to go to, you can also just call the Win32 function
+    <function>SetCurrentDirectory</function> immediately.</para>
+  </listitem>
+  <listitem>
+    <para>If you need a valid Win32 CWD only for a child application started
+    via <function>CreateProcess</function> and friends, you don't have to
+    set your own Win32 CWD.  In that case, just utilize the lpCurrentDirectory
+    parameter.  See the description of the <function>CreateProcess</function>
+    function in the MSDN manual pages.</para>
   </listitem>
   <listitem>
-    <para>Or you compile your application as native Win32 (mingw) executable,
-    rather than as Cygwin executable.</para>
+    <para>Last, but not least, if you don't need any POSIX function from
+    Cygwin in your specific applciation, consider to compile your application
+    as native Win32 (mingw) executable, rather than as Cygwin executable.</para>
   </listitem>
 </itemizedlist>
 
@@ -557,9 +617,9 @@ Cygwin replaces the non-convertible character with a special character
 sequence.  The sequence starts with an ASCII CAN character (hex code
 0x18, equivalent Control-X), followed by the UTF-8 representation of the
 character.  The result is a filename containing some ugly looking
-characters.  While it doesn't <emphasis>look</emphasis> nice, it
-<emphasis>is</emphasis> nice, because Cygwin knows how to convert this
-filename back to UTF-16.  The filename will be converted using your
+characters.  While it doesn't <emphasis role='bold'>look</emphasis> nice, it
+<emphasis role='bold'>is</emphasis> nice, because Cygwin knows how to convert
+this filename back to UTF-16.  The filename will be converted using your
 usual character set.  However, when Cygwin recognizes an ASCII CAN
 character, it skips over the ASCII CAN and handles the following bytes as
 a UTF-8 character.  Thus, the filename is symmetrically converted back to