diff options
Diffstat (limited to 'package/busybox/patches/340-lock_util.patch')
-rw-r--r-- | package/busybox/patches/340-lock_util.patch | 172 |
1 files changed, 0 insertions, 172 deletions
diff --git a/package/busybox/patches/340-lock_util.patch b/package/busybox/patches/340-lock_util.patch deleted file mode 100644 index eb346421a4..0000000000 --- a/package/busybox/patches/340-lock_util.patch +++ /dev/null @@ -1,172 +0,0 @@ ---- a/include/applets.src.h -+++ b/include/applets.src.h -@@ -218,6 +218,7 @@ IF_LN(APPLET_NOEXEC(ln, ln, BB_DIR_BIN, - IF_LOAD_POLICY(APPLET(load_policy, BB_DIR_USR_SBIN, BB_SUID_DROP)) - IF_LOADFONT(APPLET(loadfont, BB_DIR_USR_SBIN, BB_SUID_DROP)) - IF_LOADKMAP(APPLET(loadkmap, BB_DIR_SBIN, BB_SUID_DROP)) -+IF_LOCK(APPLET(lock, BB_DIR_BIN, BB_SUID_DROP)) - IF_LOGGER(APPLET(logger, BB_DIR_USR_BIN, BB_SUID_DROP)) - /* Needs to be run by root or be suid root - needs to change uid and gid: */ - IF_LOGIN(APPLET(login, BB_DIR_BIN, BB_SUID_REQUIRE)) ---- a/miscutils/Config.src -+++ b/miscutils/Config.src -@@ -419,6 +419,11 @@ config FEATURE_HDPARM_HDIO_GETSET_DMA - help - Enables the 'hdparm -d' option to get/set using_dma flag. - -+config LOCK -+ bool "lock" -+ help -+ Small utility for using locks in scripts -+ - config MAKEDEVS - bool "makedevs" - default y ---- a/miscutils/Kbuild.src -+++ b/miscutils/Kbuild.src -@@ -29,6 +29,7 @@ lib-$(CONFIG_INOTIFYD) += inotifyd.o - lib-$(CONFIG_FEATURE_LAST_SMALL)+= last.o - lib-$(CONFIG_FEATURE_LAST_FANCY)+= last_fancy.o - lib-$(CONFIG_LESS) += less.o -+lib-$(CONFIG_LOCK) += lock.o - lib-$(CONFIG_MAKEDEVS) += makedevs.o - lib-$(CONFIG_MAN) += man.o - lib-$(CONFIG_MICROCOM) += microcom.o ---- /dev/null -+++ b/miscutils/lock.c -@@ -0,0 +1,135 @@ -+/* -+ * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org> -+ * -+ * This is free software, licensed under the GNU General Public License v2. -+ */ -+#include <sys/types.h> -+#include <sys/file.h> -+#include <sys/stat.h> -+#include <signal.h> -+#include <fcntl.h> -+#include <unistd.h> -+#include <stdio.h> -+#include "busybox.h" -+ -+//usage:#define lock_trivial_usage NOUSAGE_STR -+//usage:#define lock_full_usage "" -+ -+static int unlock = 0; -+static int shared = 0; -+static int waitonly = 0; -+static int fd; -+static char *file; -+ -+static void usage(char *name) -+{ -+ fprintf(stderr, "Usage: %s [-suw] <filename>\n" -+ " -s Use shared locking\n" -+ " -u Unlock\n" -+ " -w Wait for the lock to become free, don't acquire lock\n" -+ "\n", name); -+ exit(1); -+} -+ -+static void exit_unlock(int sig) -+{ -+ flock(fd, LOCK_UN); -+ exit(0); -+} -+ -+static int do_unlock(void) -+{ -+ FILE *f; -+ int i; -+ -+ if ((f = fopen(file, "r")) == NULL) -+ return 0; -+ -+ fscanf(f, "%d", &i); -+ if (i > 0) -+ kill(i, SIGTERM); -+ -+ fclose(f); -+ -+ return 0; -+} -+ -+static int do_lock(void) -+{ -+ int pid; -+ char pidstr[8]; -+ -+ if ((fd = open(file, O_RDWR | O_CREAT | O_EXCL, 0700)) < 0) { -+ if ((fd = open(file, O_RDWR)) < 0) { -+ fprintf(stderr, "Can't open %s\n", file); -+ return 1; -+ } -+ } -+ -+ if (flock(fd, (shared ? LOCK_SH : LOCK_EX)) < 0) { -+ fprintf(stderr, "Can't lock %s\n", file); -+ return 1; -+ } -+ -+ pid = fork(); -+ -+ if (pid < 0) -+ return -1; -+ -+ if (pid == 0) { -+ signal(SIGKILL, exit_unlock); -+ signal(SIGTERM, exit_unlock); -+ signal(SIGINT, exit_unlock); -+ if (waitonly) -+ exit_unlock(0); -+ else -+ while (1) -+ sleep(1); -+ } else { -+ if (!waitonly) { -+ lseek(fd, 0, SEEK_SET); -+ ftruncate(fd, 0); -+ sprintf(pidstr, "%d\n", pid); -+ write(fd, pidstr, strlen(pidstr)); -+ close(fd); -+ } -+ -+ return 0; -+ } -+ return 0; -+} -+ -+int lock_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; -+int lock_main(int argc, char **argv) -+{ -+ char **args = &argv[1]; -+ int c = argc - 1; -+ -+ while ((*args != NULL) && (*args)[0] == '-') { -+ char *ch = *args; -+ while (*(++ch) > 0) { -+ switch(*ch) { -+ case 'w': -+ waitonly = 1; -+ break; -+ case 's': -+ shared = 1; -+ break; -+ case 'u': -+ unlock = 1; -+ break; -+ } -+ } -+ c--; -+ args++; -+ } -+ -+ if (c != 1) -+ usage(argv[0]); -+ -+ file = *args; -+ if (unlock) -+ return do_unlock(); -+ else -+ return do_lock(); -+} |