You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Jeff Trawick <tr...@attglobal.net> on 2002/10/01 21:50:34 UTC
[PATCH] mod_cgid tells APR that an os file is a pipe
mod_cgid has an AF_UNIX socket which it uses to create an apr_file_t
which it uses to create a pipe bucket which it passes down the filter
chain
but it gets to a filter (content-length filter) which wants to play
with the I/O timeout and APR fails the timeout manipulation because it
doesn't think the apr_file_t represents a pipe (or something close
enough to a pipe)
Thus the content-length filter's code to allow streaming output
doesn't work with mod_cgid because of the socket/file/pipe confusion.
The following patch adds a way for an APR app to say that the
apr_file_t being created from an os file should be treated as a pipe.
Index: modules/generators/mod_cgid.c
===================================================================
RCS file: /cvs/phoenix/2.0.42/modules/generators/mod_cgid.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 mod_cgid.c
--- modules/generators/mod_cgid.c 19 Sep 2002 12:20:17 -0000 1.1.1.1
+++ modules/generators/mod_cgid.c 1 Oct 2002 18:57:49 -0000
@@ -1101,7 +1101,7 @@
* Note that this does not register a cleanup for the socket. We did
* that explicitly right after we created the socket.
*/
- apr_os_file_put(&tempsock, &sd, 0, r->pool);
+ apr_os_file_put_ex(&tempsock, &sd, 1, 0, r->pool);
if ((argv0 = strrchr(r->filename, '/')) != NULL)
argv0++;
@@ -1422,7 +1422,7 @@
* Note that this does not register a cleanup for the socket. We did
* that explicitly right after we created the socket.
*/
- apr_os_file_put(&tempsock, &sd, 0, r->pool);
+ apr_os_file_put_ex(&tempsock, &sd, 1, 0, r->pool);
if ((retval = ap_setup_client_block(r, REQUEST_CHUNKED_ERROR)))
return retval;
Index: srclib/apr/file_io/unix/open.c
===================================================================
RCS file: /cvs/phoenix/2.0.42/srclib/apr/file_io/unix/open.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 open.c
--- srclib/apr/file_io/unix/open.c 19 Sep 2002 12:20:20 -0000 1.1.1.1
+++ srclib/apr/file_io/unix/open.c 1 Oct 2002 18:57:49 -0000
@@ -219,15 +219,18 @@
return APR_SUCCESS;
}
-APR_DECLARE(apr_status_t) apr_os_file_put(apr_file_t **file,
- apr_os_file_t *thefile,
- apr_int32_t flags, apr_pool_t *pool)
+APR_DECLARE(apr_status_t) apr_os_file_put_ex(apr_file_t **file,
+ apr_os_file_t *thefile,
+ int is_pipe,
+ apr_int32_t flags,
+ apr_pool_t *pool)
{
int *dafile = thefile;
(*file) = apr_pcalloc(pool, sizeof(apr_file_t));
(*file)->pool = pool;
(*file)->eof_hit = 0;
+ (*file)->is_pipe = is_pipe != 0;
(*file)->blocking = BLK_UNKNOWN; /* in case it is a pipe */
(*file)->timeout = -1;
(*file)->ungetchar = -1; /* no char avail */
@@ -250,6 +253,14 @@
}
return APR_SUCCESS;
}
+
+APR_DECLARE(apr_status_t) apr_os_file_put(apr_file_t **file,
+ apr_os_file_t *thefile,
+ apr_int32_t flags,
+ apr_pool_t *pool)
+{
+ return apr_os_file_put_ex(file, thefile, 0, flags, pool);
+}
APR_DECLARE(apr_status_t) apr_file_eof(apr_file_t *fptr)
{
Index: srclib/apr/include/apr_portable.h
===================================================================
RCS file: /cvs/phoenix/2.0.42/srclib/apr/include/apr_portable.h,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 apr_portable.h
--- srclib/apr/include/apr_portable.h 19 Sep 2002 12:20:21 -0000 1.1.1.1
+++ srclib/apr/include/apr_portable.h 1 Oct 2002 18:57:49 -0000
@@ -364,6 +364,20 @@
apr_int32_t flags, apr_pool_t *cont);
/**
+ * convert the file from os specific type to apr type.
+ * @param file The apr file we are converting to.
+ * @param thefile The os specific file to convert
+ * @param ispipe Whether or not the descriptor should be treated as a pipe
+ * @param flags The flags that were used to open this file.
+ * @param cont The pool to use if it is needed.
+ * @remark On Unix, it is only possible to put a file descriptor into
+ * an apr file type.
+ */
+APR_DECLARE(apr_status_t) apr_os_file_put_ex(apr_file_t **file,
+ apr_os_file_t *thefile, int is_pipe,
+ apr_int32_t flags, apr_pool_t *cont);
+
+/**
* convert the dir from os specific type to apr type.
* @param dir The apr dir we are converting to.
* @param thedir The os specific dir to convert
--
Jeff Trawick | trawick@attglobal.net
Born in Roswell... married an alien...
Re: [PATCH] mod_cgid tells APR that an os file is a pipe
Posted by Jeff Trawick <tr...@attglobal.net>.
Jeff Trawick <tr...@attglobal.net> writes:
> The following patch adds a way for an APR app to say that the
> apr_file_t being created from an os file should be treated as a pipe.
c'mon folks, I was counting on somebody to tell me how stupid this
patch was :) I have a bad attitude about the file/pipe/socket games
in APR which may prevent me from seeing the "right" fix given the
current API.
mod_cgid does:
> - apr_os_file_put(&tempsock, &sd, 0, r->pool);
> + apr_os_file_put_ex(&tempsock, &sd, 1, 0, r->pool);
APR provides:
> /**
> + * convert the file from os specific type to apr type.
> + * @param file The apr file we are converting to.
> + * @param thefile The os specific file to convert
> + * @param ispipe Whether or not the descriptor should be treated as a pipe
> + * @param flags The flags that were used to open this file.
> + * @param cont The pool to use if it is needed.
> + * @remark On Unix, it is only possible to put a file descriptor into
> + * an apr file type.
> + */
> +APR_DECLARE(apr_status_t) apr_os_file_put_ex(apr_file_t **file,
> + apr_os_file_t *thefile, int is_pipe,
> + apr_int32_t flags, apr_pool_t *cont);
--
Jeff Trawick | trawick@attglobal.net
Born in Roswell... married an alien...
Re: [PATCH] mod_cgid tells APR that an os file is a pipe
Posted by Jeff Trawick <tr...@attglobal.net>.
Jeff Trawick <tr...@attglobal.net> writes:
> The following patch adds a way for an APR app to say that the
> apr_file_t being created from an os file should be treated as a pipe.
c'mon folks, I was counting on somebody to tell me how stupid this
patch was :) I have a bad attitude about the file/pipe/socket games
in APR which may prevent me from seeing the "right" fix given the
current API.
mod_cgid does:
> - apr_os_file_put(&tempsock, &sd, 0, r->pool);
> + apr_os_file_put_ex(&tempsock, &sd, 1, 0, r->pool);
APR provides:
> /**
> + * convert the file from os specific type to apr type.
> + * @param file The apr file we are converting to.
> + * @param thefile The os specific file to convert
> + * @param ispipe Whether or not the descriptor should be treated as a pipe
> + * @param flags The flags that were used to open this file.
> + * @param cont The pool to use if it is needed.
> + * @remark On Unix, it is only possible to put a file descriptor into
> + * an apr file type.
> + */
> +APR_DECLARE(apr_status_t) apr_os_file_put_ex(apr_file_t **file,
> + apr_os_file_t *thefile, int is_pipe,
> + apr_int32_t flags, apr_pool_t *cont);
--
Jeff Trawick | trawick@attglobal.net
Born in Roswell... married an alien...