aboutsummaryrefslogtreecommitdiffstats
path: root/package/libs/gettext-full/patches/120-uclibc-nolocale.patch
blob: 40ca10edd04a528c9f0a5261a6aedb8ade188ceb (plain)
1
2
3
4
5
6
7
8
9
10
11
--- a/gettext-runtime/intl/localename.c
+++ b/gettext-runtime/intl/localename.c
@@ -2790,7 +2790,7 @@ gl_locale_name_posix (int category, cons
 {
   /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'.
      On some systems this can be done by the 'setlocale' function itself.  */
-#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL
+#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL && (!defined __UCLIBC__ || defined __UCLIBC_HAS_LOCALE__)
   return setlocale (category, NULL);
 #else
   /* On other systems we ignore what setlocale reports and instead look at the
ight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
--- /dev/null
+++ b/miscutils/lock.c
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2006 Felix Fietkau <nbd@nbd.name>
+ *
+ * This is free software, licensed under the GNU General Public License v2.
+ */
+
+//config:config LOCK
+//config:	bool "lock"
+//config:	default n
+//config:	help
+//config:	  Small utility for using locks in scripts
+
+//applet:IF_LOCK(APPLET(lock, BB_DIR_BIN, BB_SUID_DROP))
+
+//kbuild:lib-$(CONFIG_LOCK) += lock.o
+
+//usage:#define lock_trivial_usage NOUSAGE_STR
+//usage:#define lock_full_usage ""
+
+#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"
+
+static int unlock = 0;
+static int shared = 0;
+static int waitonly = 0;
+static int try_lock = 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	Don't wait for the lock to become free. Fail with exit code\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;
+	int flags;
+	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;
+		}
+	}
+
+	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);
+		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;
+				case 'n':
+					try_lock = 1;
+					break;
+			}
+		}
+		c--;
+		args++;
+	}
+
+	if (c != 1)
+		usage(argv[0]);
+
+	file = *args;
+	if (unlock)
+		return do_unlock();
+	else
+		return do_lock();
+}