thanks bill!
recommendation. use the actual expected format for pipename:
pass in "\\.\\PIPE\pipename" _not_ "pipename" and have it
hidden / constructed by apr.
apr should _check_ that it is of a valid format:
\\.*\\[PIPE|pipe]\\.*
but i think it really _should_ be directly exposed.
to be useful, to me, the unix implementation should actually
be a unix domain socket. pipename i suggest be 'redirected'
to /tmp/.apr/pipename.
yes, i know, that will create
/tmp/.apr/\\.\\PIPE\\pipename
and this isn't as big a deal as you might expect.
luke
On Wed, Jun 20, 2001 at 04:22:54PM -0400, Bill Stoddard wrote:
> This is NOT ready to be committed and in fact it may be a complete waste of
> time. I had a
> few minutes to hack around a couple of days back and came up with this. I
> did not even
> attempt to compile the unix implementation of ap_file_namedpipe_create() much
> less run it.
> The Windows implementation of ap_file_namedpipe_create() seems to work
>
> I am posting this because I will unlikely have time to work on this for quite
> a while and
> wanted to share what I have just in case it might prove useful to someone.
> Use or throw
> away at your leisure...
>
> Bill
>
> Index: file_io/unix/pipe.c
> ===================================================================
> RCS file: /home/cvs/apr/file_io/unix/pipe.c,v
> retrieving revision 1.46
> diff -u -r1.46 pipe.c
> --- file_io/unix/pipe.c 2001/02/16 04:15:37 1.46
> +++ file_io/unix/pipe.c 2001/06/20 18:31:01
> @@ -193,17 +193,20 @@
> apr_pool_cleanup_null);
> return APR_SUCCESS;
> }
> -
> -apr_status_t apr_file_namedpipe_create(const char *filename,
> - apr_fileperms_t perm, apr_pool_t *cont)
> +APR_DECLARE(apr_status_t) apr_file_namedpipe_create(apr_file_t **pipe,
> + const char *pipename,
> + apr_fileperms_t perm,
> + apr_pool_t *p)
> {
> mode_t mode = apr_unix_perms2mode(perm);
>
> if (mkfifo(filename, mode) == -1) {
> return errno;
> }
> - return APR_SUCCESS;
> -}
> +
> + return apr_file_open(pipe, pipename, flag, perm, p);
> +}
> +
>
>
>
> Index: file_io/win32/open.c
> ===================================================================
> RCS file: /home/cvs/apr/file_io/win32/open.c,v
> retrieving revision 1.76
> diff -u -r1.76 open.c
> --- file_io/win32/open.c 2001/06/07 14:32:21 1.76
> +++ file_io/win32/open.c 2001/06/20 18:31:01
> @@ -169,7 +169,7 @@
> return flush_rv;
> }
>
> -APR_DECLARE(apr_status_t) apr_file_open(apr_file_t **new, const char *fname,
> +APR_DECLARE(apr_status_t) apr_file_open(apr_file_t **new, const char *name,
> apr_int32_t flag, apr_fileperms_t perm,
> apr_pool_t *cont)
> {
> @@ -177,6 +177,7 @@
> * sdbm and any other random files! We _must_ rethink
> * this approach.
> */
> + char *fname;
> HANDLE handle = INVALID_HANDLE_VALUE;
> DWORD oflags = 0;
> DWORD createflags = 0;
> @@ -185,6 +186,13 @@
> apr_oslevel_e os_level;
> apr_status_t rv;
>
> + if (flag & APR_PIPE_OPEN) {
> + fname = apr_psprintf(cont, "\\\\.\\pipe\\%s", name);
> + }
> + else {
> + fname = name;
> + }
> +
> if (flag & APR_READ) {
> oflags |= GENERIC_READ;
> }
> @@ -293,8 +301,14 @@
> (*new)->pOverlapped = (OVERLAPPED*) apr_pcalloc(cont,
> sizeof(OVERLAPPED));
> (*new)->pOverlapped->hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
> }
> +
> + if (flag & APR_PIPE_OPEN) {
> + (*new)->pipe = 1;
> + }
> + else {
> + (*new)->pipe = 0;
> + }
>
> - (*new)->pipe = 0;
> (*new)->timeout = -1;
> (*new)->ungetchar = -1;
> (*new)->eof_hit = 0;
> Index: file_io/win32/pipe.c
> ===================================================================
> RCS file: /home/cvs/apr/file_io/win32/pipe.c,v
> retrieving revision 1.37
> diff -u -r1.37 pipe.c
> --- file_io/win32/pipe.c 2001/06/06 16:04:54 1.37
> +++ file_io/win32/pipe.c 2001/06/20 18:31:01
> @@ -232,3 +232,34 @@
>
> return APR_SUCCESS;
> }
> +
> +APR_DECLARE(apr_status_t) apr_file_namedpipe_create(apr_file_t **pipe,
> + const char *pipename,
> + apr_fileperms_t perm,
> + apr_pool_t *p)
> +{
> + SECURITY_ATTRIBUTES sa;
> +
> + (*pipe) = (apr_file_t *)apr_pcalloc(p, sizeof(apr_file_t));
> + (*pipe)->cntxt = p;
> + (*pipe)->fname = apr_psprintf(p, "\\\\.\\pipe\\%s", pipename);
> + (*pipe)->pipe = 1;
> +
> + sa.nLength = sizeof(sa);
> + sa.bInheritHandle = TRUE;
> + sa.lpSecurityDescriptor = NULL;
> +
> + (*pipe)->filehand = CreateNamedPipe((*pipe)->fname,
> + PIPE_ACCESS_DUPLEX,
> + PIPE_TYPE_BYTE,
> file://dwPipeMode,
> + 1,
> file://nMaxInstances,
> + 8182,
> file://nOutBufferSize,
> + 8192,
> file://nInBufferSize,
> + 1,
> file://nDefaultTimeOut,
> + &sa);
> +
> + if ((*pipe)->filehand == INVALID_HANDLE_VALUE)
> + return apr_get_os_error();
> +
> + return APR_SUCCESS;
> +}
> Index: include/apr_file_io.h
> ===================================================================
> RCS file: /home/cvs/apr/include/apr_file_io.h,v
> retrieving revision 1.102
> diff -u -r1.102 apr_file_io.h
> --- include/apr_file_io.h 2001/05/31 00:11:12 1.102
> +++ include/apr_file_io.h 2001/06/20 18:31:02
> @@ -89,6 +89,7 @@
> #define APR_SHARELOCK 1024 /* Platform dependent support for higher
> level locked read/write access to
> support
> writes across process/machines */
> +#define APR_PIPE_OPEN 2048
>
> /* flags for apr_file_seek */
> #define APR_SET SEEK_SET
> @@ -410,9 +411,10 @@
> * @param cont The pool to operate on.
> * @deffunc apr_status_t apr_file_namedpipe_create(const char *filename,
> apr_fileperms_t
> perm, apr_pool_t *cont)
> */
> -APR_DECLARE(apr_status_t) apr_file_namedpipe_create(const char *filename,
> - apr_fileperms_t perm,
> - apr_pool_t *cont);
> +APR_DECLARE(apr_status_t) apr_file_namedpipe_create(apr_file_t **in,
> + const char *filename,
> + apr_fileperms_t perm,
> + apr_pool_t *cont);
>
> /**
> * Get the timeout value for a pipe or manipulate the blocking state.
>