File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / standard / flock_compat.c
Revision 1.1.1.3 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Jul 22 01:32:05 2013 UTC (11 years ago) by misho
Branches: php, MAIN
CVS tags: v5_4_29p0, v5_4_20p0, v5_4_20, v5_4_17, HEAD
5.4.17

    1: /*
    2:    +----------------------------------------------------------------------+
    3:    | PHP Version 5                                                        |
    4:    +----------------------------------------------------------------------+
    5:    | Copyright (c) 1997-2013 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,v 1.1.1.3 2013/07/22 01:32:05 misho Exp $ */
   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>