lockfile.c
上传用户:xu_441
上传日期:2007-01-04
资源大小:1640k
文件大小:2k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
  3.  * All rights reserved.
  4.  * Copyright (c) 1983, 1995-1997 Eric P. Allman.  All rights reserved.
  5.  * Copyright (c) 1988, 1993
  6.  * The Regents of the University of California.  All rights reserved.
  7.  *
  8.  * By using this file, you agree to the terms and conditions set
  9.  * forth in the LICENSE file which can be found at the top level of
  10.  * the sendmail distribution.
  11.  *
  12.  */
  13. #ifndef lint
  14. static char id[] = "@(#)$Id: lockfile.c,v 8.3 1999/08/31 15:38:27 ca Exp $";
  15. #endif /* ! lint */
  16. #include <sendmail.h>
  17. /*
  18. **  LOCKFILE -- lock a file using flock or (shudder) fcntl locking
  19. **
  20. ** Parameters:
  21. ** fd -- the file descriptor of the file.
  22. ** filename -- the file name (for error messages). [unused]
  23. ** ext -- the filename extension. [unused]
  24. ** type -- type of the lock.  Bits can be:
  25. ** LOCK_EX -- exclusive lock.
  26. ** LOCK_NB -- non-blocking.
  27. **
  28. ** Returns:
  29. ** TRUE if the lock was acquired.
  30. ** FALSE otherwise.
  31. */
  32. bool
  33. lockfile(fd, filename, ext, type)
  34. int fd;
  35. char *filename;
  36. char *ext;
  37. int type;
  38. {
  39. #if !HASFLOCK
  40. int action;
  41. struct flock lfd;
  42. extern int errno;
  43. memset(&lfd, '', sizeof lfd);
  44. if (bitset(LOCK_UN, type))
  45. lfd.l_type = F_UNLCK;
  46. else if (bitset(LOCK_EX, type))
  47. lfd.l_type = F_WRLCK;
  48. else
  49. lfd.l_type = F_RDLCK;
  50. if (bitset(LOCK_NB, type))
  51. action = F_SETLK;
  52. else
  53. action = F_SETLKW;
  54. if (fcntl(fd, action, &lfd) >= 0)
  55. return TRUE;
  56. /*
  57. **  On SunOS, if you are testing using -oQ/tmp/mqueue or
  58. **  -oA/tmp/aliases or anything like that, and /tmp is mounted
  59. **  as type "tmp" (that is, served from swap space), the
  60. **  previous fcntl will fail with "Invalid argument" errors.
  61. **  Since this is fairly common during testing, we will assume
  62. **  that this indicates that the lock is successfully grabbed.
  63. */
  64. if (errno == EINVAL)
  65. return TRUE;
  66. #else /* !HASFLOCK */
  67. if (flock(fd, type) >= 0)
  68. return TRUE;
  69. #endif /* !HASFLOCK */
  70. return FALSE;
  71. }