|
|
1.1 ! root 1: /* ! 2: * libc/gen/lockf.c ! 3: * File locking. ! 4: */ ! 5: ! 6: #include <fcntl.h> ! 7: #include <unistd.h> ! 8: #include <errno.h> ! 9: ! 10: lockf(fd, cmd, size) register int fd, cmd; long size; ! 11: { ! 12: struct flock fl; ! 13: register int fcmd; ! 14: ! 15: fl.l_type = F_WRLCK; ! 16: fl.l_whence = SEEK_CUR; ! 17: fl.l_start = 0; ! 18: fl.l_len = size; ! 19: ! 20: switch (cmd) { ! 21: ! 22: case F_ULOCK: ! 23: fl.l_type = F_UNLCK; ! 24: /* fall through... */ ! 25: ! 26: case F_TLOCK: ! 27: fcmd = F_SETLK; ! 28: lab: ! 29: if (fcntl(fd, fcmd, &fl) == -1) { ! 30: if (errno == ENOLCK) ! 31: errno = EDEADLK; ! 32: return -1; ! 33: } ! 34: break; ! 35: ! 36: case F_LOCK: ! 37: fcmd = F_SETLKW; ! 38: goto lab; ! 39: break; ! 40: ! 41: case F_TEST: ! 42: if (fcntl(fd, F_GETLK, &fl) == -1) ! 43: return -1; ! 44: if (fl.l_type != F_UNLCK) { ! 45: errno = EAGAIN; ! 46: return -1; ! 47: } ! 48: break; ! 49: ! 50: default: ! 51: errno = EINVAL; ! 52: return -1; ! 53: ! 54: } ! 55: return 0; ! 56: } ! 57: ! 58: /* end of lockf.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.