bjh         99/06/04 06:13:21

  Modified:    apr/file_io/os2 filedup.c filestat.c maperrorcode.c open.c
                        readwrite.c seek.c
  Added:       apr/file_io/os2 dir.c fileacc.c pipe.c fileio.h
  Log:
  Update file_io lib for OS/2 to current spec.
  
  Revision  Changes    Path
  1.3       +14 -20    apache-apr/apr/file_io/os2/filedup.c
  
  Index: filedup.c
  ===================================================================
  RCS file: /home/cvs/apache-apr/apr/file_io/os2/filedup.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- filedup.c 1999/05/10 14:36:22     1.2
  +++ filedup.c 1999/06/04 13:13:16     1.3
  @@ -53,39 +53,33 @@
    *
    */
   
  +#include "fileio.h"
   #include "apr_file_io.h"
  -#include "apr_general.h"
  +#include "apr_lib.h"
   #include <string.h>
   
   #define INCL_DOS
   #include <os2.h>
   
  -ap_file_t *ap_dupfile(ap_file_t *old_file)
  +ap_status_t ap_dupfile(struct file_t *old_file, struct file_t **new_file)
   {
       int rv;
  -    ap_file_t * new_file = (ap_file_t *)malloc(sizeof(ap_file_t));
  +    struct file_t *dup_file = (struct file_t *)ap_palloc(old_file->cntxt, 
sizeof(struct file_t));
       
       if (new_file == NULL) {
  -        errno = ENOMEM;
  -        return NULL;
  +        return APR_ENOMEM;
       } 
       
  -    rv = DosDupHandle(old_file->filedes, (ULONG *)&new_file->filedes);
  +    rv = DosDupHandle(old_file->filedes, &dup_file->filedes);
       
  -    if ( rv ) {
  -        errno = os2errno(rv);
  -        free(new_file);
  -        return NULL;
  +    if (rv) {
  +        return os2errno(rv);
       }
       
  -    old_file->filedes = new_file->filedes; 
  -    old_file->fname = strdup(new_file->fname);
  -    old_file->buffered = new_file->buffered;
  -    old_file->protection = new_file->protection;
  -    old_file->user = new_file->user;
  -    old_file->group = new_file->group;
  -    old_file->size = new_file->size;
  -    old_file->atime = new_file->atime;    
  -    old_file->mtime = new_file->mtime;
  -    old_file->ctime = new_file->ctime;
  +    dup_file->cntxt = old_file->cntxt;
  +    dup_file->fname = ap_pstrdup(dup_file->cntxt, old_file->fname);
  +    dup_file->buffered = old_file->buffered;
  +    dup_file->status = old_file->status;
  +    *new_file = dup_file;
  +    return APR_SUCCESS;
   }
  
  
  
  1.3       +23 -36    apache-apr/apr/file_io/os2/filestat.c
  
  Index: filestat.c
  ===================================================================
  RCS file: /home/cvs/apache-apr/apr/file_io/os2/filestat.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- filestat.c        1999/05/10 14:36:22     1.2
  +++ filestat.c        1999/06/04 13:13:17     1.3
  @@ -53,9 +53,10 @@
    *
    */
   
  +#include "fileio.h"
   #include "apr_file_io.h"
  -#include "apr_general.h"
  -#include "apr_errno.h"
  +#include "apr_lib.h"
  +#include <sys/time.h>
   
   #define INCL_DOS
   #include <os2.h>
  @@ -90,47 +91,33 @@
     return mktime( &tmpdate );
   }
   
  -ap_status_t ap_getfileinfo(char * fname, ap_file_t *thefile)
  -{
  -    FILESTATUS3 info;
  -    int rv = DosQueryPathInfo(fname, FIL_STANDARD, &info, sizeof(info));
  +
   
  -    if (rv == 0) {
  -        thefile->protection = (info.attrFile & FILE_READONLY) ? 0555 : 0777;
  -        thefile->user = 0;
  -        thefile->group = 0;
  -        thefile->size = info.cbFile;
  -        thefile->atime = os2date2unix(info.fdateLastAccess, 
info.ftimeLastAccess);
  -        thefile->mtime = os2date2unix(info.fdateLastWrite, 
info.ftimeLastWrite);
  -        thefile->ctime = os2date2unix(info.fdateCreation, 
info.ftimeCreation);
  +ap_status_t ap_getfileinfo(struct file_t *thefile)
  +{
  +    ULONG rc = DosQueryPathInfo(thefile->fname, FIL_STANDARD, 
&thefile->status, sizeof(thefile->status));
  +    
  +    if (rc == 0) {
  +        thefile->validstatus = TRUE;
           return APR_SUCCESS;
       }
  -    else {
  -        errno = ENOSTAT;
  -        return APR_FAILURE;
  -    }
  +    
  +    thefile->validstatus = FALSE;
  +    return os2errno(rc);
   }
   
  -ap_status_t ap_updatefileinfo(ap_file_t *thefile)
  -{
  -    FILESTATUS3 info;
  -    int rv = DosQueryFileInfo(thefile->filedes, FIL_STANDARD, &info, 
sizeof(info));
   
  -    if (rv == 0) {
  -        thefile->protection = (info.attrFile & FILE_READONLY) ? 0555 : 0777;
  -        thefile->user = 0;
  -        thefile->group = 0;
  -        thefile->size = info.cbFile;
  -        thefile->atime = os2date2unix(info.fdateLastAccess, 
info.ftimeLastAccess);
  -        thefile->mtime = os2date2unix(info.fdateLastWrite, 
info.ftimeLastWrite);
  -        thefile->ctime = os2date2unix(info.fdateCreation, 
info.ftimeCreation);
  +
  +ap_status_t ap_updatefileinfo(struct file_t *thefile)
  +{
  +    ULONG rc = DosQueryFileInfo(thefile->filedes, FIL_STANDARD, 
&thefile->status, sizeof(thefile->status));
  +    
  +    if (rc == 0) {
  +        thefile->validstatus = TRUE;
           return APR_SUCCESS;
  -    }
  -    else {
  -        errno = ENOSTAT;
  -        return APR_FAILURE;
       }
  +    
  +    thefile->validstatus = FALSE;
  +    return os2errno(rc);
   }
  -
  -
   
  
  
  
  1.2       +13 -12    apache-apr/apr/file_io/os2/maperrorcode.c
  
  Index: maperrorcode.c
  ===================================================================
  RCS file: /home/cvs/apache-apr/apr/file_io/os2/maperrorcode.c,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- maperrorcode.c    1999/04/09 18:39:15     1.1
  +++ maperrorcode.c    1999/06/04 13:13:17     1.2
  @@ -61,18 +61,19 @@
   #include <os2.h>
   
   int errormap[][2] = {
  -    { ERROR_FILE_NOT_FOUND,       ENOENT       },
  -    { ERROR_PATH_NOT_FOUND,       ENOENT       },
  -    { ERROR_TOO_MANY_OPEN_FILES,  EMFILE       },
  -    { ERROR_ACCESS_DENIED,        EACCES       },
  -    { ERROR_SHARING_VIOLATION,    EACCES       },
  -    { ERROR_INVALID_PARAMETER,    EINVAL       },
  -    { ERROR_OPEN_FAILED,          ENOENT       },
  -    { ERROR_DISK_FULL,            ENOSPC       },
  -    { ERROR_FILENAME_EXCED_RANGE, ENAMETOOLONG },
  -    { ERROR_INVALID_FUNCTION,     EINVAL       },
  -    { ERROR_INVALID_HANDLE,       EBADF        },
  -    { ERROR_NEGATIVE_SEEK,        ESPIPE       }
  +    { NO_ERROR,                   APR_SUCCESS      },
  +    { ERROR_FILE_NOT_FOUND,       APR_ENOENT       },
  +    { ERROR_PATH_NOT_FOUND,       APR_ENOENT       },
  +    { ERROR_TOO_MANY_OPEN_FILES,  APR_EMFILE       },
  +    { ERROR_ACCESS_DENIED,        APR_EACCES       },
  +    { ERROR_SHARING_VIOLATION,    APR_EACCES       },
  +    { ERROR_INVALID_PARAMETER,    APR_EINVAL       },
  +    { ERROR_OPEN_FAILED,          APR_ENOENT       },
  +    { ERROR_DISK_FULL,            APR_ENOSPC       },
  +    { ERROR_FILENAME_EXCED_RANGE, APR_ENAMETOOLONG },
  +    { ERROR_INVALID_FUNCTION,     APR_EINVAL       },
  +    { ERROR_INVALID_HANDLE,       APR_EBADF        },
  +    { ERROR_NEGATIVE_SEEK,        APR_ESPIPE       }
   };
   
   #define MAPSIZE (sizeof(errormap)/sizeof(errormap[0]))
  
  
  
  1.3       +49 -42    apache-apr/apr/file_io/os2/open.c
  
  Index: open.c
  ===================================================================
  RCS file: /home/cvs/apache-apr/apr/file_io/os2/open.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- open.c    1999/05/10 14:36:22     1.2
  +++ open.c    1999/06/04 13:13:17     1.3
  @@ -53,22 +53,35 @@
    *
    */
   
  +#include "fileio.h"
   #include "apr_file_io.h"
  -#include <errno.h>
  +#include "apr_lib.h"
   #include <string.h>
   
   #define INCL_DOS
   #include <os2.h>
   
  -ap_file_t *ap_open(char *fname, ap_int32_t flag,  ap_fileperms_t mode)
  +ap_status_t file_cleanup(void *thefile)
   {
  +    struct file_t *file = thefile;
  +    return ap_close(file);
  +}
  +
  +
  +
  +ap_status_t ap_open(ap_context_t *cntxt, char *fname, ap_int32_t flag,  
ap_fileperms_t perm, struct file_t **new)
  +{
       int oflags = 0;
       int mflags = OPEN_FLAGS_FAIL_ON_ERROR|OPEN_SHARE_DENYNONE;
       int rv;
  -    ap_file_t *dafile = (ap_file_t *)malloc(sizeof(ap_file_t));
  -    struct stat info;
       ULONG action;
  +    ap_file_t *dafile = (struct file_t *)ap_palloc(cntxt, sizeof(struct 
file_t));
   
  +    *new = dafile;
  +    dafile->cntxt = cntxt;
  +    dafile->isopen = FALSE;
  +    dafile->validstatus = FALSE;
  +    
       if ((flag & APR_READ) && (flag & APR_WRITE)) {
           mflags |= OPEN_ACCESS_READWRITE;
       } else if (flag & APR_READ) {
  @@ -76,14 +89,11 @@
       } else if (flag & APR_WRITE) {
           mflags |= OPEN_ACCESS_WRITEONLY;
       } else {
  -        errno = EACCES;
  -        free(dafile);
  -        return NULL;
  +        dafile->filedes = -1;
  +        return APR_EACCES;
       }
   
  -    if (flag & APR_BUFFERED) {
  -        dafile->buffered = TRUE;
  -    }
  +    dafile->buffered = (flag & APR_BUFFERED) > 0;
   
       if (flag & APR_CREATE) {
           oflags |= OPEN_ACTION_CREATE_IF_NEW; 
  @@ -95,11 +105,8 @@
           }
       }
       
  -    if ((flag & APR_EXCL) && !(flag & APR_CREATE)) {
  -        errno = EACCES;
  -        free(dafile);
  -        return NULL;
  -    }
  +    if ((flag & APR_EXCL) && !(flag & APR_CREATE))
  +        return APR_EACCES;
   
       if (flag & APR_TRUNCATE) {
           oflags |= OPEN_ACTION_REPLACE_IF_EXISTS;
  @@ -110,42 +117,42 @@
       if (rv == 0 && (flag & APR_APPEND)) {
           ULONG newptr;
           rv = DosSetFilePtr(dafile->filedes, 0, FILE_END, &newptr );
  +        
  +        if (rv)
  +            DosClose(dafile->filedes);
       }
       
  -    if (rv != 0) {
  -        free(dafile);
  -        return NULL;
  -    }
  -
  -    if (ap_updatefileinfo(dafile) == APR_SUCCESS) {
  -        dafile->fname = strdup(fname);
  -        return dafile;
  -    } else {
  -        errno = ENOSTAT;
  -        free(dafile);
  -        return NULL;
  -    }
  +    if (rv != 0)
  +        return os2errno(rv);
  +    
  +    dafile->isopen = TRUE;
  +    dafile->fname = ap_pstrdup(cntxt, fname);
  +    return APR_SUCCESS;
   }
   
  +
  +
   ap_status_t ap_close(ap_file_t *file)
   {
  -    if (DosClose(file->filedes) == 0) {
  -        free(file->fname);
  -        free(file);
  -        return APR_SUCCESS;
  -    } else {
  -        return APR_FAILURE;
  -        /* Are there any error conditions other than EINTR or EBADF? */
  +    ULONG rc; 
  +    
  +    if (file && file->isopen) {
  +        rc = DosClose(file->filedes);
  +    
  +        if (rc == 0) {
  +            file->isopen = FALSE;
  +            return APR_SUCCESS;
  +        } else {
  +            return os2errno(rc);
  +        }
       }
   }
  +
  +
   
  -ap_status_t ap_remove_file(char *path)
  +ap_status_t ap_remove_file(ap_context_t *cntxt, char *path)
   {
  -    if (DosDelete(path) == 0) {
  -        return APR_SUCCESS;
  -    }
  -    else {
  -        return APR_FAILURE;
  -    }
  +    ULONG rc = DosDelete(path);
  +    return os2errno(rc);
   }
   
  
  
  
  1.3       +34 -24    apache-apr/apr/file_io/os2/readwrite.c
  
  Index: readwrite.c
  ===================================================================
  RCS file: /home/cvs/apache-apr/apr/file_io/os2/readwrite.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- readwrite.c       1999/05/10 14:36:23     1.2
  +++ readwrite.c       1999/06/04 13:13:18     1.3
  @@ -53,43 +53,53 @@
    *
    */
   
  +#include "fileio.h"
   #include "apr_file_io.h"
  -#include "apr_general.h"
  -#include "apr_errno.h"
  -#include <errno.h>
  -#include <unistd.h>
  +#include "apr_lib.h"
   
  -ap_ssize_t ap_read(ap_file_t *thefile, void *buf, ap_ssize_t nbytes)
  +#define INCL_DOS
  +#include <os2.h>
  +
  +ap_status_t ap_read(const struct file_t *thefile, void *buf, ap_ssize_t 
*nbytes)
   {
  -    ap_size_t rv;
  +    ULONG rc;
  +    ULONG bytesread;
   
  -    if (thefile->filedes < 0) {
  -        errno = EBADF;
  -        return -1;
  +    if (!thefile->isopen) {
  +        *nbytes = 0;
  +        return APR_EBADF;
       }
   
  -    rv = read(thefile->filedes, buf, nbytes);
  +    rc = DosRead(thefile->filedes, buf, *nbytes, &bytesread);
   
  -    return rv;
  +    if (rc) {
  +        *nbytes = 0;
  +        return os2errno(rc);
  +    }
  +    
  +    *nbytes = bytesread;
  +    return APR_SUCCESS;
   }
  +
  +
   
  -ap_ssize_t ap_write(ap_file_t *thefile, void * buf, ap_ssize_t nbytes)
  +ap_status_t ap_write(struct file_t *thefile, void *buf, ap_ssize_t *nbytes)
   {
  -    ap_size_t rv;
  -    struct stat info;
  +    ULONG rc;
  +    ULONG byteswritten;
   
  -    if (thefile->filedes < 0) {
  -        errno = EBADF;
  -        return -1;
  +    if (!thefile->isopen) {
  +        *nbytes = 0;
  +        return APR_EBADF;
       }
   
  -    rv = write(thefile->filedes, buf, nbytes);
  +    rc = DosWrite(thefile->filedes, buf, *nbytes, &byteswritten);
   
  -    if (stat(thefile->fname, &info) == 0) {
  -        thefile->size = info.st_size;
  -        thefile->atime = info.st_atime;
  -        thefile->mtime = info.st_mtime;
  -        thefile->ctime = info.st_ctime;
  +    if (rc) {
  +        *nbytes = 0;
  +        return os2errno(rc);
       }
  -    return rv;
  +    
  +    *nbytes = byteswritten;
  +    return APR_SUCCESS;
   }
  
  
  
  1.3       +11 -17    apache-apr/apr/file_io/os2/seek.c
  
  Index: seek.c
  ===================================================================
  RCS file: /home/cvs/apache-apr/apr/file_io/os2/seek.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- seek.c    1999/05/10 14:36:23     1.2
  +++ seek.c    1999/06/04 13:13:18     1.3
  @@ -53,8 +53,9 @@
    *
    */
   
  +#include "fileio.h"
   #include "apr_file_io.h"
  -#include <errno.h>
  +#include "apr_lib.h"
   #include <string.h>
   #include <io.h>
   
  @@ -63,32 +64,25 @@
   
   int os2errno( ULONG oserror );
   
  -ap_off_t ap_seek(ap_file_t *file, ap_off_t offset, ap_seek_where_t origin)
  +ap_status_t ap_seek(struct file_t *thefile, ap_seek_where_t where, ap_off_t 
*offset)
   {
  -    int rv;
  -    ULONG newpos;
  +    if (!thefile->isopen) {
  +        return APR_EBADF;
  +    }
       
  -    switch (origin) {
  +    switch (where) {
           case APR_SET:
  -            origin = FILE_BEGIN;
  +            where = FILE_BEGIN;
               break;
               
           case APR_CUR:
  -            origin = FILE_CURRENT;
  +            where = FILE_CURRENT;
               break;
               
           case APR_END:
  -            origin = FILE_END;
  +            where = FILE_END;
               break;
       }
               
  -    rv = DosSetFilePtr(file->filedes, offset, origin, &newpos);
  -    printf( "DosSetFilePtr()=%d\n", rv );
  -    
  -    if (rv) {
  -        errno = os2errno( rv );
  -        return -1;
  -    }
  -    
  -    return newpos;
  +    return os2errno(DosSetFilePtr(thefile->filedes, *offset, where, (ULONG 
*)&offset));
   }
  
  
  
  1.1                  apache-apr/apr/file_io/os2/dir.c
  
  Index: dir.c
  ===================================================================
  /* ====================================================================
   * Copyright (c) 1999 The Apache Group.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. All advertising materials mentioning features or use of this
   *    software must display the following acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * 4. The names "Apache Server" and "Apache Group" must not be used to
   *    endorse or promote products derived from this software without
   *    prior written permission. For written permission, please contact
   *    [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * 6. Redistributions of any form whatsoever must retain the following
   *    acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
   * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE APACHE GROUP OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Group.
   * For more information on the Apache Group and the Apache HTTP server
   * project, please see <http://www.apache.org/>.
   *
   */
  
  #include "fileio.h"
  #include "apr_file_io.h"
  #include "apr_lib.h"
  #include <string.h>
  
  #define INCL_DOS
  #include <os2.h>
  
  ap_status_t dir_cleanup(void *thedir)
  {
      struct dir_t *dir = thedir;
      return ap_closedir(dir);
  }
  
  
  
  ap_status_t ap_opendir(ap_context_t *cntxt, const char *dirname, struct dir_t 
**new)
  {
      struct dir_t *thedir = (struct dir_t *)ap_palloc(cntxt, sizeof(struct 
dir_t));
      
      if (thedir == NULL)
          return APR_ENOMEM;
      
      thedir->cntxt = cntxt;
      thedir->dirname = ap_pstrdup(cntxt, dirname);
      thedir->handle = 0;
      thedir->validentry = FALSE;
      *new = thedir;
      return APR_SUCCESS;
  }
  
  
  
  ap_status_t ap_closedir(struct dir_t *thedir)
  {
      int rv = 0;
      
      if (thedir->handle) {
          rv = DosFindClose(thedir->handle);
          
          if (rv == 0) {
              thedir->handle = 0;
          }
      }
  
      return os2errno(rv);
  } 
  
  
  
  ap_status_t ap_readdir(struct dir_t *thedir)
  {
      int rv;
      ULONG entries = 1;
      
      if (thedir->handle == 0) {
          thedir->handle = HDIR_CREATE;
          rv = DosFindFirst(ap_pstrcat(thedir->cntxt, thedir->dirname, "/*", 
NULL), &thedir->handle, 
                            
FILE_ARCHIVED|FILE_DIRECTORY|FILE_SYSTEM|FILE_HIDDEN|FILE_READONLY, 
                            &thedir->entry, sizeof(thedir->entry), &entries, 
FIL_STANDARD);
      } else {
          rv = DosFindNext(thedir->handle, &thedir->entry, 
sizeof(thedir->entry), &entries);
      }
  
      if (rv == 0 && entries == 1) {
          thedir->validentry = TRUE;
          return APR_SUCCESS;
      }
          
      thedir->validentry = FALSE;
      
      if (rv)
          return os2errno(rv);
      
      return APR_ENOENT;
  }
  
  
  
  ap_status_t ap_rewinddir(struct dir_t *thedir)
  {
      return ap_closedir(thedir);
  }
  
  
  
  ap_status_t ap_make_dir(ap_context_t *cont, const char *path, ap_fileperms_t 
perm)
  {
      return os2errno(DosCreateDir(path, NULL));
  }
  
  
  
  ap_status_t ap_remove_dir(ap_context_t *cont, const char *path)
  {
      return os2errno(DosDeleteDir(path));
  }
  
  
  
  ap_status_t ap_dir_entry_size(struct dir_t *thedir, ap_ssize_t *size)
  {
      if (thedir->validentry) {
          *size = thedir->entry.cbFile;
          return APR_SUCCESS;
      }
      
      return APR_ENOFILE;
  }
  
  
  
  ap_status_t ap_dir_entry_mtime(struct dir_t *thedir, time_t *time)
  {
      if (thedir->validentry) {
          *time = os2date2unix(thedir->entry.fdateLastWrite, 
thedir->entry.ftimeLastWrite);
          return APR_SUCCESS;
      }
  
      return APR_ENOFILE;
  }
  
  
  
  ap_status_t ap_dir_entry_ftype(struct dir_t *thedir, ap_filetype_e *type)
  {
      int rc;
      HFILE hFile;
      ULONG action, Type, Attr;
      ap_filetype_e typemap[8] = { APR_REG, APR_CHR, APR_PIPE };
  
      if (thedir->validentry) {
          if (thedir->entry.attrFile & FILE_DIRECTORY) {
              *type = APR_DIR;
              return APR_SUCCESS;
          } else {
              rc = DosOpen(ap_pstrcat(thedir->cntxt, thedir->dirname, "/", 
thedir->entry.achName, NULL) ,
                           &hFile, &action, 0, 0,
                           OPEN_ACTION_FAIL_IF_NEW|OPEN_ACTION_OPEN_IF_EXISTS, 
OPEN_SHARE_DENYNONE|OPEN_ACCESS_READONLY,
                           NULL);
  
              if ( rc == 0 ) {
                  rc = DosQueryHType( hFile, &Type, &Attr );
  
                  if ( rc == 0 ) {
              *type = typemap[(Type & 0x0007)];
                  }
                  DosClose( hFile );
              }
  
              return os2errno(rc);
          }
      }
  
      return APR_ENOFILE;
  }
  
  
  
  ap_status_t ap_get_dir_filename(struct dir_t *thedir, char **new)
  {
      if (thedir->validentry) {
          *new = thedir->entry.achName;
          return APR_SUCCESS;
      }
  
      return APR_ENOFILE;
  }
  
  
  
  1.1                  apache-apr/apr/file_io/os2/fileacc.c
  
  Index: fileacc.c
  ===================================================================
  /* ====================================================================
   * Copyright (c) 1999 The Apache Group.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. All advertising materials mentioning features or use of this
   *    software must display the following acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * 4. The names "Apache Server" and "Apache Group" must not be used to
   *    endorse or promote products derived from this software without
   *    prior written permission. For written permission, please contact
   *    [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * 6. Redistributions of any form whatsoever must retain the following
   *    acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
   * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE APACHE GROUP OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Group.
   * For more information on the Apache Group and the Apache HTTP server
   * project, please see <http://www.apache.org/>.
   *
   */
  
  #include "fileio.h"
  #include "apr_file_io.h"
  #include "apr_general.h"
  #include "apr_lib.h"
  #include <errno.h>
  #include <string.h>
  #include <sys/types.h>
  
  /* A file to put ALL of the accessor functions for struct file_t types. */
  
  ap_status_t ap_get_filename(struct file_t *thefile, char **new)
  {
      if (thefile != NULL) {
          *new = ap_pstrdup(thefile->cntxt, thefile->fname);
          return APR_SUCCESS;
      } else {
          *new = NULL;
          return APR_ENOFILE;
      }
  }
  
  
  
  ap_status_t ap_get_filesize(struct file_t *file, ap_ssize_t *size)
  {
      ap_status_t rv;
      
      if (file != NULL) {
          if (!file->validstatus) {
              rv = ap_updatefileinfo(file);
              
              if (rv)
                  return rv;
          }
          
          *size = file->status.cbFile;
          return APR_SUCCESS;
      } else {
          *size = -1;
          return APR_ENOFILE;
      }
  }
  
  
  
  ap_status_t ap_get_fileperms(struct file_t *file, ap_fileperms_t *perm)
  {
      ap_status_t rv;
    
      if (file != NULL) {
          if (!file->validstatus) {
              rv = ap_updatefileinfo(file);
              
              if (rv)
                  return rv;
          }
          
          *perm = (file->status.attrFile & FILE_READONLY) ? 0555 : 0777;
          return APR_SUCCESS;
      } else {
          *perm = -1;
          return APR_ENOFILE;
      }
  }
  
  
  
  ap_status_t ap_get_fileatime(struct file_t *file, time_t *time)
  {    
      ap_status_t rv;
  
      if (file != NULL) {
          if (!file->validstatus) {
              rv = ap_updatefileinfo(file);
              
              if (rv)
                  return rv;
          }
          
          *time = os2date2unix( file->status.fdateLastAccess, 
file->status.ftimeLastAccess );
          return APR_SUCCESS;
      } else {
          *time = -1;
          return APR_ENOFILE;
      }
  }
  
  
  
  ap_status_t ap_get_filectime(struct file_t *file, time_t *time)
  {    
      ap_status_t rv;
  
      if (file != NULL) {
          if (!file->validstatus) {
              rv = ap_updatefileinfo(file);
              
              if (rv)
                  return rv;
          }
          
          *time = os2date2unix( file->status.fdateCreation, 
file->status.ftimeCreation );
          return APR_SUCCESS;
      }
      else {
          *time = -1;
          return APR_ENOFILE;
      }
  }
  
  
  
  ap_status_t ap_get_filemtime(struct file_t *file, time_t *time)
  {    
      ap_status_t rv;
  
      if (file != NULL) {
          if (!file->validstatus) {
              rv = ap_updatefileinfo(file);
              
              if (rv)
                  return rv;
          }
          
          *time = os2date2unix( file->status.fdateLastWrite, 
file->status.ftimeLastWrite );
          return APR_SUCCESS;
      }
      else {
          *time = -1;
          return APR_ENOFILE;
      }
  }
  
  
  
  
  1.1                  apache-apr/apr/file_io/os2/pipe.c
  
  Index: pipe.c
  ===================================================================
  /* ====================================================================
   * Copyright (c) 1999 The Apache Group.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. All advertising materials mentioning features or use of this
   *    software must display the following acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * 4. The names "Apache Server" and "Apache Group" must not be used to
   *    endorse or promote products derived from this software without
   *    prior written permission. For written permission, please contact
   *    [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * 6. Redistributions of any form whatsoever must retain the following
   *    acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
   * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE APACHE GROUP OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Group.
   * For more information on the Apache Group and the Apache HTTP server
   * project, please see <http://www.apache.org/>.
   *
   */
  
  #include "fileio.h"
  #include "apr_file_io.h"
  #include "apr_general.h"
  #include "apr_lib.h"
  #include <string.h>
  
  ap_status_t ap_create_pipe(ap_context_t *cont, struct file_t **in, struct 
file_t **out)
  {
      ULONG filedes[2];
      ULONG rc;
  
      rc = DosCreatePipe(filedes, filedes+1, 4096);
          
      if (rc) {
          return os2errno(rc);
      }
      
      (*in) = (struct file_t *)ap_palloc(cont, sizeof(struct file_t));
      (*in)->cntxt = cont;
      (*in)->filedes = filedes[0];
      (*in)->fname = ap_pstrdup(cont, "PIPE");
  
      (*out) = (struct file_t *)ap_palloc(cont, sizeof(struct file_t));
      (*out)->cntxt = cont;
      (*out)->filedes = filedes[1];
      (*out)->fname = ap_pstrdup(cont, "PIPE");
  
      return APR_SUCCESS;
  }
  
  
  
  ap_status_t ap_create_namedpipe(ap_context_t *cont, char *dirpath, 
ap_fileperms_t perm, char **new)
  {
      /* Not yet implemented, interface not suitable */
      return -1;
  } 
  
   
  
  
  
  1.1                  apache-apr/apr/file_io/os2/fileio.h
  
  Index: fileio.h
  ===================================================================
  /* ====================================================================
   * Copyright (c) 1999 The Apache Group.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. All advertising materials mentioning features or use of this
   *    software must display the following acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * 4. The names "Apache Server" and "Apache Group" must not be used to
   *    endorse or promote products derived from this software without
   *    prior written permission. For written permission, please contact
   *    [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * 6. Redistributions of any form whatsoever must retain the following
   *    acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
   * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE APACHE GROUP OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Group.
   * For more information on the Apache Group and the Apache HTTP server
   * project, please see <http://www.apache.org/>.
   *
   */
  
  #ifndef FILE_IO_H
  #define FILE_IO_H
  
  #define INCL_DOS
  #include <os2.h>
  
  #include "apr_general.h"
  #include "apr_file_io.h"
  #include "apr_errno.h"
  
  struct file_t {
      ap_context_t *cntxt;
      ULONG filedes;
      char * fname;
      int isopen;
      int buffered;
      FILESTATUS3 status;
      int validstatus;
  };
  
  struct dir_t {
      ap_context_t *cntxt;
      char *dirname;
      ULONG handle;
      FILEFINDBUF3 entry;
      int validentry;
  };
  
  struct iovec_t {
      struct iovec *iovec;
  };
  
  ap_status_t file_cleanup(void *);
  mode_t get_fileperms(ap_fileperms_t);
  long os2date2unix( FDATE os2date, FTIME os2time );
  
  #endif  /* ! FILE_IO_H */
  
  
  
  

Reply via email to