Annotation of embedaddon/php/ext/standard/flock_compat.c, revision 1.1.1.2

1.1       misho       1: /*
                      2:    +----------------------------------------------------------------------+
                      3:    | PHP Version 5                                                        |
                      4:    +----------------------------------------------------------------------+
                      5:    | Copyright (c) 1997-2012 The PHP Group                                |
                      6:    +----------------------------------------------------------------------+
                      7:    | This source file is subject to version 3.01 of the PHP license,      |
                      8:    | that is bundled with this package in the file LICENSE, and is        |
                      9:    | available through the world-wide-web at the following url:           |
                     10:    | http://www.php.net/license/3_01.txt                                  |
                     11:    | If you did not receive a copy of the PHP license and are unable to   |
                     12:    | obtain it through the world-wide-web, please send a note to          |
                     13:    | license@php.net so we can mail you a copy immediately.               |
                     14:    +----------------------------------------------------------------------+
                     15:    | Author: Sascha Schumann <sascha@schumann.cx>                         |
                     16:    +----------------------------------------------------------------------+
                     17: */
                     18: 
1.1.1.2 ! misho      19: /* $Id$ */
1.1       misho      20: 
                     21: #include "php.h"
                     22: #include <errno.h>
                     23: #include "ext/standard/flock_compat.h"
                     24: 
                     25: #if HAVE_STRUCT_FLOCK
                     26: #include <unistd.h>
                     27: #include <fcntl.h>
                     28: #include <sys/file.h>
                     29: #endif
                     30: 
                     31: #ifdef PHP_WIN32
                     32: #include <io.h>
                     33: #include "config.w32.h"
                     34: #endif
                     35: 
                     36: #ifdef NETWARE
                     37: #include <netinet/in.h>
                     38: #endif
                     39: 
                     40: #ifndef HAVE_FLOCK
                     41: PHPAPI int flock(int fd, int operation)
                     42: {
                     43:        return php_flock(fd, operation);
                     44: }
                     45: #endif /* !defined(HAVE_FLOCK) */
                     46: 
                     47: PHPAPI int php_flock(int fd, int operation)
                     48: #if HAVE_STRUCT_FLOCK /* {{{ */
                     49: {
                     50:        struct flock flck;
                     51:        int ret;
                     52: 
                     53:        flck.l_start = flck.l_len = 0;
                     54:        flck.l_whence = SEEK_SET;
                     55:        
                     56:        if (operation & LOCK_SH)
                     57:                flck.l_type = F_RDLCK;
                     58:        else if (operation & LOCK_EX)
                     59:                flck.l_type = F_WRLCK;
                     60:        else if (operation & LOCK_UN)
                     61:                flck.l_type = F_UNLCK;
                     62:        else {
                     63:                errno = EINVAL;
                     64:                return -1;
                     65:        }
                     66: 
                     67:        ret = fcntl(fd, operation & LOCK_NB ? F_SETLK : F_SETLKW, &flck);
                     68: 
                     69:        if (operation & LOCK_NB && ret == -1 && 
                     70:                        (errno == EACCES || errno == EAGAIN))
                     71:                errno = EWOULDBLOCK;
                     72: 
                     73:        if (ret != -1) ret = 0;
                     74: 
                     75:        return ret;
                     76: }
                     77: /* }}} */
                     78: #elif defined(PHP_WIN32) /* {{{ */
                     79: /*
                     80:  * Program:   Unix compatibility routines
                     81:  *
                     82:  * Author:  Mark Crispin
                     83:  *      Networks and Distributed Computing
                     84:  *      Computing & Communications
                     85:  *      University of Washington
                     86:  *      Administration Building, AG-44
                     87:  *      Seattle, WA  98195
                     88:  *      Internet: MRC@CAC.Washington.EDU
                     89:  *
                     90:  * Date:    14 September 1996
                     91:  * Last Edited: 14 August 1997
                     92:  *
                     93:  * Copyright 1997 by the University of Washington
                     94:  *
                     95:  *  Permission to use, copy, modify, and distribute this software and its
                     96:  * documentation for any purpose and without fee is hereby granted, provided
                     97:  * that the above copyright notice appears in all copies and that both the
                     98:  * above copyright notice and this permission notice appear in supporting
                     99:  * documentation, and that the name of the University of Washington not be
                    100:  * used in advertising or publicity pertaining to distribution of the software
                    101:  * without specific, written prior permission.  This software is made available
                    102:  * "as is", and
                    103:  * THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
                    104:  * WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN
                    105:  * NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL,
                    106:  * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
                    107:  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT
                    108:  * (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION
                    109:  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                    110:  *
                    111:  */
                    112: /*              DEDICATION
                    113: 
                    114:  *  This file is dedicated to my dog, Unix, also known as Yun-chan and
                    115:  * Unix J. Terwilliker Jehosophat Aloysius Monstrosity Animal Beast.  Unix
                    116:  * passed away at the age of 11 1/2 on September 14, 1996, 12:18 PM PDT, after
                    117:  * a two-month bout with cirrhosis of the liver.
                    118:  *
                    119:  *  He was a dear friend, and I miss him terribly.
                    120:  *
                    121:  *  Lift a leg, Yunie.  Luv ya forever!!!!
                    122:  */
                    123: {
                    124:     HANDLE hdl = (HANDLE) _get_osfhandle(fd);
                    125:     DWORD low = 1, high = 0;
                    126:     OVERLAPPED offset =
                    127:     {0, 0, 0, 0, NULL};
                    128:     if (hdl < 0)
                    129:         return -1;              /* error in file descriptor */
                    130:     /* bug for bug compatible with Unix */
                    131:     UnlockFileEx(hdl, 0, low, high, &offset);
                    132:     switch (operation & ~LOCK_NB) {    /* translate to LockFileEx() op */
                    133:         case LOCK_EX:           /* exclusive */
                    134:             if (LockFileEx(hdl, LOCKFILE_EXCLUSIVE_LOCK +
                    135:                         ((operation & LOCK_NB) ? LOCKFILE_FAIL_IMMEDIATELY : 0),
                    136:                            0, low, high, &offset))
                    137:                 return 0;
                    138:             break;
                    139:         case LOCK_SH:           /* shared */
                    140:             if (LockFileEx(hdl, ((operation & LOCK_NB) ? LOCKFILE_FAIL_IMMEDIATELY : 0),
                    141:                            0, low, high, &offset))
                    142:                 return 0;
                    143:             break;
                    144:         case LOCK_UN:           /* unlock */
                    145:             return 0;           /* always succeeds */
                    146:         default:                /* default */
                    147:             break;
                    148:     }
                    149:        /* Under Win32 MT library, errno is not a variable but a function call,
                    150:         * which cannot be assigned to.
                    151:         */
                    152: #if !defined(PHP_WIN32)
                    153:     errno = EINVAL;             /* bad call */
                    154: #endif
                    155:     return -1;
                    156: }
                    157: /* }}} */
                    158: #else
                    159: #warning no proper flock support for your site
                    160: {
                    161:        errno = 0;
                    162:        return 0;
                    163: }
                    164: #endif
                    165: 
                    166: #ifndef PHP_WIN32
                    167: #if !(HAVE_INET_ATON)
                    168: /* {{{ inet_aton
                    169:  * Check whether "cp" is a valid ascii representation
                    170:  * of an Internet address and convert to a binary address.
                    171:  * Returns 1 if the address is valid, 0 if not.
                    172:  * This replaces inet_addr, the return value from which
                    173:  * cannot distinguish between failure and a local broadcast address.
                    174:  */
                    175: int inet_aton(const char *cp, struct in_addr *ap)
                    176: {
                    177:     int dots = 0;
                    178:     register unsigned long acc = 0, addr = 0;
                    179: 
                    180:     do {
                    181:         register char cc = *cp;
                    182: 
                    183:         switch (cc) {
                    184:         case '0':
                    185:         case '1':
                    186:         case '2':
                    187:         case '3':
                    188:         case '4':
                    189:         case '5':
                    190:         case '6':
                    191:         case '7':
                    192:         case '8':
                    193:         case '9':
                    194:             acc = acc * 10 + (cc - '0');
                    195:             break;
                    196: 
                    197:         case '.':
                    198:             if (++dots > 3) {
                    199:                 return 0;
                    200:             }
                    201:             /* Fall through */
                    202: 
                    203:         case '\0':
                    204:             if (acc > 255) {
                    205:                 return 0;
                    206:             }
                    207:             addr = addr << 8 | acc;
                    208:             acc = 0;
                    209:             break;
                    210: 
                    211:         default:
                    212:             return 0;
                    213:         }
                    214:     } while (*cp++) ;
                    215: 
                    216:     /* Normalize the address */
                    217:     if (dots < 3) {
                    218:         addr <<= 8 * (3 - dots) ;
                    219:     }
                    220: 
                    221:     /* Store it if requested */
                    222:     if (ap) {
                    223:         ap->s_addr = htonl(addr);
                    224:     }
                    225: 
                    226:     return 1;    
                    227: }
                    228: /* }}} */
                    229: #endif /* !HAVE_INET_ATON */
                    230: #endif
                    231: 
                    232: /*
                    233:  * Local variables:
                    234:  * tab-width: 4
                    235:  * c-basic-offset: 4
                    236:  * End:
                    237:  * vim600: sw=4 ts=4 fdm=marker
                    238:  * vim<600: sw=4 ts=4
                    239:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>