After a respectable lunch at Boudin's, Ryan and I think we have the general 
answers
to child handles.

The apr_foo_open/create calls need an APR_INHERIT flag bit to mark resources as
inheritable.  This offers two advantages;

  1. the app doesn't need to worry about fork/exec cleanups v.s. inherit bits 
for
     createprocess() based Win32 (and other non-forks.)

  2. mainline code is more readable, as the user no longer registers their own
     cleanup_for_exec handlers to simply close handles.

The patch, for apr_file_open, follows.  Rbb is working on a similar for 
Sockets, and
calls that generate 'handles' will need to be reviewed as well...

I obviously have the much larger job of applying the APR_INHERIT flag 
judiciously
throughout the entire server and removing child cleanups where appropriate ...

Bill
Index: file_io/unix/open.c
===================================================================
RCS file: /home/cvs/apr/file_io/unix/open.c,v
retrieving revision 1.77
diff -u -r1.77 open.c
--- file_io/unix/open.c 2001/06/27 19:40:34     1.77
+++ file_io/unix/open.c 2001/07/13 20:41:08
@@ -167,7 +167,8 @@
     (*new)->dataRead = 0;
     (*new)->direction = 0;
     apr_pool_cleanup_register((*new)->cntxt, (void *)(*new), 
apr_unix_file_cleanup,
-                        apr_pool_cleanup_null);
+                              (flag & APR_INHERIT) ? apr_pool_cleanup_null 
+                                                   : apr_unix_file_cleanup);
     return APR_SUCCESS;
 }
 
Index: file_io/win32/open.c
===================================================================
RCS file: /home/cvs/apr/file_io/win32/open.c,v
retrieving revision 1.77
diff -u -r1.77 open.c
--- file_io/win32/open.c        2001/06/27 19:40:41     1.77
+++ file_io/win32/open.c        2001/07/13 20:41:10
@@ -173,6 +173,7 @@
                                    apr_int32_t flag, apr_fileperms_t perm,
                                    apr_pool_t *cont)
 {
+    SECURITY_ATTRIBUTES sa, *psa = NULL;
     /* XXX: The default FILE_FLAG_SEQUENTIAL_SCAN is _wrong_ for
      *      sdbm and any other random files!  We _must_ rethink
      *      this approach.
@@ -236,6 +237,12 @@
          */
         attributes |= FILE_FLAG_OVERLAPPED;
     }
+    if (flag & APR_INHERIT) {
+        sa.nLength = sizeof(sa);
+        sa.bInheritHandle = TRUE;
+        sa.lpSecurityDescriptor = NULL;
+        psa = &sa;
+    }
 
 #if APR_HAS_UNICODE_FS
     if (os_level >= APR_WIN_NT) {
@@ -244,12 +251,12 @@
                                                / sizeof(apr_wchar_t), fname))
             return rv;
         handle = CreateFileW(wfname, oflags, sharemode,
-                             NULL, createflags, attributes, 0);
+                             psa, createflags, attributes, 0);
     }
     else
 #endif
         handle = CreateFileA(fname, oflags, sharemode,
-                             NULL, createflags, attributes, 0);
+                             psa, createflags, attributes, 0);
 
     if (handle == INVALID_HANDLE_VALUE) {
         return apr_get_os_error();
Index: include/apr_file_io.h
===================================================================
RCS file: /home/cvs/apr/include/apr_file_io.h,v
retrieving revision 1.103
diff -u -r1.103 apr_file_io.h
--- include/apr_file_io.h       2001/06/27 19:40:46     1.103
+++ include/apr_file_io.h       2001/07/13 20:41:13
@@ -89,6 +89,10 @@
 #define APR_SHARELOCK  1024        /* Platform dependent support for higher
                                       level locked read/write access to support
                                       writes across process/machines */
+#define APR_INHERIT    4096        /* Create the file inheritable by the child
+                                      process. fork()ed implementations 
+                                      automatically register a child cleanup
+                                      in the _absence_ of this flag. */
 
 /* flags for apr_file_seek */
 #define APR_SET SEEK_SET
@@ -141,6 +145,10 @@
  *           APR_SHARELOCK        Platform dependent support for higher
  *                                level locked read/write access to support
  *                                writes across process/machines
+ *           APR_INHERIT          Create the file inheritable by the child
+ *                                processes.  fork()ed implementations 
+ *                                automatically register a child cleanup
+ *                                in the _absence_ of this flag.
  * </PRE>
  * @param perm Access permissions for file.
  * @param cont The pool to use.

Reply via email to