Annotation of parser3/src/lib/sdbm/apr_file_io.C, revision 1.3

1.1       paf         1: /** @file
                      2:        Parser: implementation of apr functions.
                      3: 
                      4:        Copyright(c) 2003 ArtLebedev Group (http://www.artlebedev.com)
                      5:        Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
                      6: */
                      7: 
1.3     ! paf         8: static const char * const IDENT="$Date: 2003/11/20 15:35:30 $";
1.1       paf         9: 
                     10: #include "apr_file_io.h"
                     11: 
                     12: #include "pa_memory.h"
                     13: #include "pa_os.h"
                     14: 
                     15: struct apr_file_t {
                     16:     int handle;
                     17: };
                     18: 
                     19: APR_DECLARE(apr_status_t) apr_file_open(apr_file_t **new_file, const char *fname,
                     20:                                    apr_int32_t flag, apr_fileperms_t perm,
1.2       paf        21:                                                                   apr_pool_t *)
1.1       paf        22: {
                     23:     int oflags = 0;
                     24: #if APR_HAS_THREADS
                     25:     apr_status_t rv;
                     26: #endif
                     27: 
                     28:     (*new_file) = (apr_file_t*)pa_malloc_atomic(sizeof(apr_file_t));
                     29: //    (*new_file)->flags = flag;
                     30:     (*new_file)->handle = -1;
                     31: 
                     32:     if ((flag & APR_READ) && (flag & APR_WRITE)) {
                     33:         oflags = O_RDWR;
                     34:     }
                     35:     else if (flag & APR_READ) {
                     36:         oflags = O_RDONLY;
                     37:     }
                     38:     else if (flag & APR_WRITE) {
                     39:         oflags = O_WRONLY;
                     40:     }
                     41:     else {
                     42:         return APR_EACCES; 
                     43:     }
                     44: 
                     45:        if (flag & APR_CREATE) {
                     46:         oflags |= O_CREAT; 
                     47:         if (flag & APR_EXCL) {
                     48:             oflags |= O_EXCL;
                     49:         }
                     50:     }
                     51:     if ((flag & APR_EXCL) && !(flag & APR_CREATE)) {
                     52:         return APR_EACCES;
                     53:     }   
                     54: 
                     55:     if (flag & APR_APPEND) {
                     56:         oflags |= O_APPEND;
                     57:     }
                     58:     if (flag & APR_TRUNCATE) {
                     59:         oflags |= O_TRUNC;
                     60:     }
                     61: #ifdef O_BINARY
                     62:     if (flag & APR_BINARY) {
                     63:         oflags |= O_BINARY;
                     64:     }
                     65: #endif
                     66:     
                     67:        (*new_file)->handle = open(fname, oflags, /*apr_unix_perms2mode*/(perm));
                     68:     return APR_SUCCESS;
                     69: }
                     70: 
                     71: APR_DECLARE(apr_status_t) apr_file_close(apr_file_t *file)
                     72: {
                     73:        return close(file->handle);
                     74: }
                     75: 
                     76: APR_DECLARE(apr_status_t) apr_file_lock(apr_file_t *file, int type)
                     77: {
                     78:        if(type & APR_FLOCK_NONBLOCK)
                     79:                pa_lock_exclusive_nonblocking(file->handle);
                     80: 
                     81:        if ((type & APR_FLOCK_TYPEMASK) == APR_FLOCK_SHARED)
                     82:                return pa_lock_shared_blocking(file->handle);
                     83: 
                     84:        return pa_lock_exclusive_blocking(file->handle);
                     85: }
                     86: 
                     87: APR_DECLARE(apr_status_t) apr_file_unlock(apr_file_t *file)
                     88: {
                     89:        return pa_unlock(file->handle);
                     90: }
                     91: 
                     92: APR_DECLARE(apr_status_t) apr_file_info_get(apr_finfo_t *finfo, 
1.2       paf        93:                                           apr_int32_t /*wanted*/,
1.1       paf        94:                                           apr_file_t *file)
                     95: {
                     96:     struct stat info;
                     97: 
                     98:     if (fstat(file->handle, &info) == 0) {
                     99:                finfo->size=info.st_size;
                    100:         return APR_SUCCESS;
                    101:     }
                    102:     else {
                    103:         return errno;
                    104:     }
                    105: }
                    106: 
                    107: 
                    108: APR_DECLARE(apr_status_t) apr_file_seek(apr_file_t *file, 
                    109:                                    apr_seek_where_t where,
                    110:                                    apr_off_t *offset)
                    111: {
                    112:        return lseek(file->handle, *offset, where);
                    113: }
                    114: 
                    115: 
                    116: APR_DECLARE(apr_status_t) apr_file_read_full(apr_file_t *file, void *buf,
                    117:                                         apr_size_t nbytes,
1.2       paf       118:                                         apr_size_t *p_bytes_read)
1.1       paf       119: {
1.2       paf       120:        int l_bytes_read = read(file->handle, buf, nbytes);
                    121:     if (l_bytes_read == 0)
1.1       paf       122:         return APR_EOF;
1.2       paf       123:     else if (l_bytes_read == -1)
1.1       paf       124:         return errno;
1.2       paf       125: 
                    126:        if(p_bytes_read)
                    127:                *p_bytes_read=(apr_size_t)l_bytes_read;
1.1       paf       128: 
                    129:        return APR_SUCCESS;
                    130: }
                    131: 
                    132: 
                    133: APR_DECLARE(apr_status_t) apr_file_write_full(apr_file_t *file, const void *buf,
                    134:                                          apr_size_t nbytes, 
                    135:                                          apr_size_t *bytes_written)
                    136: {
                    137:     apr_size_t rv;
                    138:     do {
                    139:         rv = write(file->handle, buf, nbytes);
                    140:     } while (rv == (apr_size_t)-1 && errno == EINTR);
                    141: 
                    142:     if (rv == (apr_size_t)-1) {
                    143:                if(bytes_written)
                    144:                        *bytes_written = 0;
                    145:         return errno;
                    146:     }
                    147:        if(bytes_written)
                    148:                *bytes_written=rv;
                    149:        return APR_SUCCESS;
                    150: }

E-mail: