flock.c
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:4k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: flock.c,v 1.1.1.1 2005/11/11 21:32:03 faxguy Exp $
  2. /*
  3.  * Copyright (c) 1994-1996 Sam Leffler
  4.  * Copyright (c) 1994-1996 Silicon Graphics, Inc.
  5.  * HylaFAX is a trademark of Silicon Graphics, Inc.
  6.  *
  7.  * Permission to use, copy, modify, distribute, and sell this software and 
  8.  * its documentation for any purpose is hereby granted without fee, provided
  9.  * that (i) the above copyright notices and this permission notice appear in
  10.  * all copies of the software and related documentation, and (ii) the names of
  11.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  12.  * publicity relating to the software without the specific, prior written
  13.  * permission of Sam Leffler and Silicon Graphics.
  14.  * 
  15.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  16.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  17.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  18.  * 
  19.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  20.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  21.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  22.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  23.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  24.  * OF THIS SOFTWARE.
  25.  */
  26. #include "port.h"
  27. #if HAS_FCNTL
  28. /*
  29.  * flock emulation for System V using fcntl
  30.  *
  31.  * flock is just mapped to fcntl 
  32.  */
  33. #include <unistd.h>
  34. #include <fcntl.h>
  35. #include <sys/file.h>
  36. #include <errno.h>
  37. #if HAS_NETERRNO_H
  38. #include <net/errno.h>
  39. #endif
  40. #if defined(F_WRLCK) && defined(F_RDLCK) && defined(F_UNLCK)
  41. int
  42. flock(int fd, int operation)
  43. {
  44.     struct flock flock;
  45.     int r;
  46.     
  47.     memset(&flock, '', sizeof(flock));
  48.     if (operation & LOCK_EX)
  49. flock.l_type = F_WRLCK;
  50.     else if (operation & LOCK_SH)
  51. flock.l_type = F_RDLCK;
  52.     else
  53. flock.l_type = F_UNLCK;
  54.     flock.l_whence = SEEK_SET;
  55.     
  56.     if (((r=fcntl(fd, (operation & LOCK_NB) ? F_SETLK:F_SETLKW, &flock)) == -1)
  57. && (errno == EACCES || errno == EAGAIN))
  58. errno = EWOULDBLOCK;
  59.     return r;
  60. }
  61. #define FCNTL_EMULATED 1
  62. #endif /* F_WRLCK && F_RDLCK && F_UNLCK */
  63. #endif /* HAS_FCNTL */
  64. #if HAS_LOCKF && !FCNTL_EMULATED
  65. /*
  66.  * flock (fd, operation)
  67.  *
  68.  * This routine performs some file locking like the BSD 'flock'
  69.  * on the object described by the int file descriptor 'fd',
  70.  * which must already be open.
  71.  *
  72.  * The operations that are available are:
  73.  *
  74.  * LOCK_SH  -  get a shared lock.
  75.  * LOCK_EX  -  get an exclusive lock.
  76.  * LOCK_NB  -  don't block (must be ORed with LOCK_SH or LOCK_EX).
  77.  * LOCK_UN  -  release a lock.
  78.  *
  79.  * Return value: 0 if lock successful, -1 if failed.
  80.  *
  81.  * Note that whether the locks are enforced or advisory is
  82.  * controlled by the presence or absence of the SETGID bit on
  83.  * the executable.
  84.  *
  85.  * Note that there is no difference between shared and exclusive
  86.  * locks, since the 'lockf' system call in SYSV doesn't make any
  87.  * distinction.
  88.  *
  89.  * The file "<sys/file.h>" should be modified to contain the definitions
  90.  * of the available operations, which must be added manually (see below
  91.  * for the values).
  92.  *
  93.  * This comes from a regular post in comp.sys.hp.  /lars-owe
  94.  */
  95. #include <unistd.h>
  96. #include <sys/file.h>
  97. #include <errno.h>
  98. extern int errno;
  99. int
  100. flock(int fd, int operation)
  101. {
  102.     int i;
  103.     switch (operation) {
  104.     case LOCK_SH: /* get a shared lock */
  105.     case LOCK_EX: /* get an exclusive lock */
  106.     i = lockf(fd, F_LOCK, 0);
  107.     break;
  108.     case LOCK_SH|LOCK_NB: /* get a non-blocking shared lock */
  109.     case LOCK_EX|LOCK_NB: /* get a non-blocking exclusive lock */
  110. i = lockf(fd, F_TLOCK, 0);
  111. if (i == -1)
  112.     if ((errno == EAGAIN) || (errno == EACCES))
  113. errno = EWOULDBLOCK;
  114. break;
  115.     case LOCK_UN: /* LOCK_UN - unlock */
  116. i = lockf(fd, F_ULOCK, 0);
  117. break;
  118.     default: /* Default - can't decipher operation */
  119. i = -1;
  120. errno = EINVAL;
  121. break;
  122.     }
  123.     return (i);
  124. }
  125. #define FCNTL_EMULATED 1
  126. #endif
  127. #if !FCNTL_EMULATED
  128. HELP NO FLOCK EMULATION FOR YOUR SYSTEM
  129. #endif