summaryrefslogtreecommitdiff
path: root/src/libknot/util/utils.c
diff options
context:
space:
mode:
authorOndřej Surý <ondrej@sury.org>2011-11-02 22:44:12 +0100
committerOndřej Surý <ondrej@sury.org>2011-11-02 22:44:12 +0100
commitc8d5977bb546dae9ed59d81556639c49badd8121 (patch)
tree4c86750db26c1c3502b60f2cd78ca9611cfa01d6 /src/libknot/util/utils.c
downloadknot-upstream/0.8.0_pre1.tar.gz
Imported Upstream version 0.8.0~pre1upstream/0.8.0_pre1
Diffstat (limited to 'src/libknot/util/utils.c')
-rw-r--r--src/libknot/util/utils.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/src/libknot/util/utils.c b/src/libknot/util/utils.c
new file mode 100644
index 0000000..17b33a7
--- /dev/null
+++ b/src/libknot/util/utils.c
@@ -0,0 +1,127 @@
+/* Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <string.h>
+#include <pthread.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "common.h"
+#include "util/utils.h"
+#include "common/WELL1024a.h"
+
+/*----------------------------------------------------------------------------*/
+
+knot_lookup_table_t *knot_lookup_by_name(knot_lookup_table_t *table,
+ const char *name)
+{
+ while (table->name != NULL) {
+ if (strcasecmp(name, table->name) == 0) {
+ return table;
+ }
+ table++;
+ }
+
+ return NULL;
+}
+
+/*----------------------------------------------------------------------------*/
+
+knot_lookup_table_t *knot_lookup_by_id(knot_lookup_table_t *table,
+ int id)
+{
+ while (table->name != NULL) {
+ if (table->id == id) {
+ return table;
+ }
+ table++;
+ }
+
+ return NULL;
+}
+
+/*----------------------------------------------------------------------------*/
+
+size_t knot_strlcpy(char *dst, const char *src, size_t size)
+{
+ char *d = dst;
+ const char *s = src;
+ size_t n = size;
+
+ /* Copy as many bytes as will fit */
+ if (n != 0 && --n != 0) {
+ do {
+ if ((*d++ = *s++) == 0) {
+ break;
+ }
+ } while (--n != 0);
+ }
+
+ /* Not enough room in dst, add NUL and traverse rest of src */
+ if (n == 0) {
+ if (size != 0) {
+ *d = '\0'; /* NUL-terminate dst */
+ }
+ while (*s++)
+ ;
+ }
+
+ return(s - src - 1); /* count does not include NUL */
+}
+
+/*! \brief TLS key for rand seed. */
+static pthread_key_t _qr_key;
+static pthread_once_t _qr_once = PTHREAD_ONCE_INIT;
+
+/*! \brief TLS key initializer. */
+static void _qr_init()
+{
+ (void) pthread_key_create(&_qr_key, NULL);
+ (void) pthread_setspecific(_qr_key, (void*)time(0));
+}
+
+size_t knot_quick_rand()
+{
+ (void) pthread_once(&_qr_once, _qr_init);
+ size_t x = (size_t)pthread_getspecific(_qr_key);
+
+ /* Numerical Recipes in C.
+ * The Art of Scientific Computing, 2nd Edition,
+ * 1992, ISBN 0-521-43108-5.
+ * Page 284.
+ */
+ x = 1664525L * x + 1013904223L;
+ (void) pthread_setspecific(_qr_key, (void*)x);
+ return x;
+}
+
+uint16_t knot_random_id()
+{
+ return (uint16_t)(tls_rand() * ((uint16_t)~0));
+}
+
+struct flock* knot_file_lock(short type, short whence)
+{
+ static struct flock ret;
+ ret.l_type = type;
+ ret.l_start = 0;
+ ret.l_whence = whence;
+ ret.l_len = 0;
+ ret.l_pid = getpid();
+ return &ret;
+}
+