Return to flock_compat.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / standard |
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: */