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.
> 

Reply via email to