lock.c (686B)
1 #include <fcntl.h> 2 #include <limits.h> 3 #include <stdio.h> 4 #include <unistd.h> 5 6 int 7 lockrepo(char *repo) 8 { 9 char path[PATH_MAX]; 10 struct flock fl; 11 int fd; 12 13 if (snprintf(path, sizeof(path), "%s/lock", repo) >= 14 sizeof(path)) 15 return -1; 16 17 fd = open(path, O_RDWR | O_CREAT, 0600); 18 if (fd < 0) 19 return -1; 20 fl.l_type = F_WRLCK; 21 fl.l_whence = SEEK_SET; 22 fl.l_start = 0; 23 fl.l_len = 0; 24 if (fcntl(fd, F_SETLK, &fl) < 0) { 25 close(fd); 26 return -1; 27 } 28 return fd; 29 } 30 31 int 32 unlockrepo(int fd) 33 { 34 struct flock fl; 35 36 fl.l_type = F_UNLCK; 37 fl.l_whence = SEEK_SET; 38 fl.l_start = 0; 39 fl.l_len = 0; 40 if (fcntl(fd, F_SETLK, &fl) < 0) 41 return -1; 42 if (close(fd) < 0) 43 return -1; 44 return 0; 45 }