* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/****************************************************************
+/*****************************************************************************
*
* Program Flock.c:
* Program to test file locking
*
* Usage: flock -h give all info's
*
- * $Id: Flock.c,v 1.1 2002/11/16 14:11:55 piccardi Exp $
+ * $Id: Flock.c,v 1.5 2003/05/02 09:55:13 piccardi Exp $
*
- ****************************************************************/
+ *****************************************************************************/
/*
* Include needed headers
*/
#include <unistd.h> /* unix standard library */
#include <stdio.h> /* standard I/O library */
#include <string.h> /* string functions */
-#include <fcntl.h> /* string functions */
-
-
-#include "macros.h"
+#include <fcntl.h> /* string functions */
+/* user defined header */
+#include "macros.h" /* some useful macros */
/* Help printing routine */
void usage(void);
/*
* Variables definition
*/
- int type = F_UNLCK;
- off_t start;
- off_t len;
- int fd, res, i;
- int cmd = F_SETLK ;
- struct flock lock;
+ int type = F_UNLCK; /* lock type: default to unlock (invalid) */
+ off_t start = 0; /* start of the locked region: default to 0 */
+ off_t len = 0; /* length of the locked region: default to 0 */
+ int fd, res, i; /* internal variables */
+ int bsd = 0; /* semantic type: default to POSIX */
+ int cmd = F_SETLK; /* lock command: default to non-blocking */
+ struct flock lock; /* file lock structure */
/*
* Input section: decode command line parameters
* Use getopt function
*/
opterr = 0; /* don't want writing to stderr */
- while ( (i = getopt(argc, argv, "hs:l:wrb")) != -1) {
+ while ( (i = getopt(argc, argv, "hs:l:wrbf")) != -1) {
switch (i) {
/*
* Handling options
*/
- case 'h': /* help option */
+ case 'h': /* help option */
printf("Wrong -h option use\n");
usage();
return -1;
break;
- case 's': /* take wait time for childen */
- start = strtol(optarg, NULL, 10); /* convert input */
+ case 's': /* take start point of the lock */
+ start = strtol(optarg, NULL, 10); /* convert input */
break;
- case 'l': /* take wait time for childen */
- len = strtol(optarg, NULL, 10); /* convert input */
+ case 'l': /* take length of the lock */
+ len = strtol(optarg, NULL, 10); /* convert input */
break;
- case 'w':
+ case 'w': /* set type to write lock */
type = F_WRLCK;
break;
- case 'r':
+ case 'r': /* set type to read lock */
type = F_RDLCK;
break;
- case 'b':
+ case 'b': /* set lock to blocking */
cmd = F_SETLKW;
break;
- case '?': /* unrecognized options */
+ case 'f': /* enable BSD semantic */
+ bsd = 1;
+ break;
+ case '?': /* unrecognized options */
printf("Unrecognized options -%c\n",optopt);
usage();
- default: /* should not reached */
+ default: /* should not reached */
usage();
}
}
* Main code beginning
*
* ***********************************************************/
- /* There must be remaing parameters */
- if (type == F_UNLCK) {
- printf("You should set a read or a write lock\n");
- usage();
- }
- if ((argc - optind) != 1) {
+ if ((argc - optind) != 1) { /* There must be remaing parameters */
printf("Wrong number of arguments %d\n", argc - optind);
usage();
}
- fd = open(argv[optind], O_RDWR);
- if (fd < 0) {
+ if (type == F_UNLCK) { /* There must be a -w or -r option set */
+ printf("You should set a read or a write lock\n");
+ usage();
+ }
+ fd = open(argv[optind], O_RDONLY); /* open the file to be locked */
+ if (fd < 0) { /* on error exit */
perror("Wrong filename");
exit(1);
}
- /* setting lock structure */
- lock.l_type = type;
- lock.l_whence = SEEK_SET;
- lock.l_start = start;
- lock.l_len = len;
/* do lock */
- res = fcntl(fd, cmd, &lock);
- if (res) {
+ if (bsd) { /* if BSD locking */
+ /* rewrite cmd for suitables flock operation values */
+ if (cmd == F_SETLK) { /* if no-blocking */
+ cmd = LOCK_NB; /* set the value for flock operation */
+ } else { /* else */
+ cmd = 0; /* default is null */
+ }
+ if (type == F_RDLCK) cmd |= LOCK_SH; /* set for shared lock */
+ if (type == F_WRLCK) cmd |= LOCK_EX; /* set for exclusive lock */
+ res = flock(fd, cmd); /* esecute lock */
+ } else { /* if POSIX locking */
+ /* setting flock structure */
+ lock.l_type = type; /* set type: read or write */
+ lock.l_whence = SEEK_SET; /* start from the beginning of the file */
+ lock.l_start = start; /* set the start of the locked region */
+ lock.l_len = len; /* set the length of the locked region */
+ res = fcntl(fd, cmd, &lock); /* do lock */
+ }
+ /* check lock results */
+ if (res) { /* on error exit */
perror("Failed lock");
exit(1);
+ } else { /* else write message */
+ printf("Lock acquired\n");
}
- pause();
+ pause(); /* stop the process, use a signal to exit */
return 0;
}
/*
printf(" -w write lock\n");
printf(" -r read lock\n");
printf(" -b block when locking impossible\n");
-
+ printf(" -f enable BSD semantic\n");
exit(1);
}