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

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: 
        !            19: /* $Id: flock_compat.c 321634 2012-01-01 13:15:04Z felipe $ */
        !            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>