mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-19 13:48:06 +00:00
busybox: lock: implement -n "Fail rather than wait"
lock -n is similiar to flock -n. If the lock was already taken, fail with exit code = 1 and write error message to stderr. example: if ! lock -n /tmp/foo ; then echo lock exits. else echo lock was free. But is locked now. fi > lock was free. But is locked now. > lock exists. Signed-off-by: Alexander Couzens <lynxis@fe80.eu> SVN-Revision: 46836
This commit is contained in:
parent
5fcafa319d
commit
3670f4128d
@ -35,7 +35,7 @@
|
|||||||
lib-$(CONFIG_MICROCOM) += microcom.o
|
lib-$(CONFIG_MICROCOM) += microcom.o
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/miscutils/lock.c
|
+++ b/miscutils/lock.c
|
||||||
@@ -0,0 +1,135 @@
|
@@ -0,0 +1,144 @@
|
||||||
+/*
|
+/*
|
||||||
+ * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
|
+ * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
|
||||||
+ *
|
+ *
|
||||||
@ -56,6 +56,7 @@
|
|||||||
+static int unlock = 0;
|
+static int unlock = 0;
|
||||||
+static int shared = 0;
|
+static int shared = 0;
|
||||||
+static int waitonly = 0;
|
+static int waitonly = 0;
|
||||||
|
+static int try_lock = 0;
|
||||||
+static int fd;
|
+static int fd;
|
||||||
+static char *file;
|
+static char *file;
|
||||||
+
|
+
|
||||||
@ -65,6 +66,7 @@
|
|||||||
+ " -s Use shared locking\n"
|
+ " -s Use shared locking\n"
|
||||||
+ " -u Unlock\n"
|
+ " -u Unlock\n"
|
||||||
+ " -w Wait for the lock to become free, don't acquire lock\n"
|
+ " -w Wait for the lock to become free, don't acquire lock\n"
|
||||||
|
+ " -n Don't wait for the lock to become free. Fail with exit code\n"
|
||||||
+ "\n", name);
|
+ "\n", name);
|
||||||
+ exit(1);
|
+ exit(1);
|
||||||
+}
|
+}
|
||||||
@ -95,6 +97,7 @@
|
|||||||
+static int do_lock(void)
|
+static int do_lock(void)
|
||||||
+{
|
+{
|
||||||
+ int pid;
|
+ int pid;
|
||||||
|
+ int flags;
|
||||||
+ char pidstr[8];
|
+ char pidstr[8];
|
||||||
+
|
+
|
||||||
+ if ((fd = open(file, O_RDWR | O_CREAT | O_EXCL, 0700)) < 0) {
|
+ if ((fd = open(file, O_RDWR | O_CREAT | O_EXCL, 0700)) < 0) {
|
||||||
@ -104,7 +107,10 @@
|
|||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ if (flock(fd, (shared ? LOCK_SH : LOCK_EX)) < 0) {
|
+ flags = shared ? LOCK_SH : LOCK_EX;
|
||||||
|
+ flags |= try_lock ? LOCK_NB : 0;
|
||||||
|
+
|
||||||
|
+ if (flock(fd, flags) < 0) {
|
||||||
+ fprintf(stderr, "Can't lock %s\n", file);
|
+ fprintf(stderr, "Can't lock %s\n", file);
|
||||||
+ return 1;
|
+ return 1;
|
||||||
+ }
|
+ }
|
||||||
@ -156,6 +162,9 @@
|
|||||||
+ case 'u':
|
+ case 'u':
|
||||||
+ unlock = 1;
|
+ unlock = 1;
|
||||||
+ break;
|
+ break;
|
||||||
|
+ case 'n':
|
||||||
|
+ try_lock = 1;
|
||||||
|
+ break;
|
||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+ c--;
|
+ c--;
|
||||||
|
Loading…
Reference in New Issue
Block a user