summaryrefslogtreecommitdiffstats
path: root/usr.bin/file/magic-common.c
diff options
context:
space:
mode:
authornicm <nicm@openbsd.org>2015-04-24 16:24:11 +0000
committernicm <nicm@openbsd.org>2015-04-24 16:24:11 +0000
commitff772f706f98a917ef77115483138a600bbc20e6 (patch)
treec833972ee7799bf8b7fee38d233f79f29fb50fde /usr.bin/file/magic-common.c
parentRevert back to using GCC builtins. This code triggers an off by one in (diff)
downloadwireguard-openbsd-ff772f706f98a917ef77115483138a600bbc20e6.tar.xz
wireguard-openbsd-ff772f706f98a917ef77115483138a600bbc20e6.zip
New implementation of the file(1) utility. This is a simplified,
modernised version with a nearly complete magic(5) parser but omits some of the complex builtin tests (notably ELF) and has a reduced set of options. ok deraadt
Diffstat (limited to 'usr.bin/file/magic-common.c')
-rw-r--r--usr.bin/file/magic-common.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/usr.bin/file/magic-common.c b/usr.bin/file/magic-common.c
new file mode 100644
index 00000000000..e84d113b962
--- /dev/null
+++ b/usr.bin/file/magic-common.c
@@ -0,0 +1,83 @@
+/* $OpenBSD: magic-common.c,v 1.1 2015/04/24 16:24:11 nicm Exp $ */
+
+/*
+ * Copyright (c) 2015 Nicholas Marriott <nicm@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
+ * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/types.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "magic.h"
+
+char *
+magic_strtoull(const char *s, uint64_t *u)
+{
+ char *endptr;
+
+ if (*s == '-')
+ return (NULL);
+ errno = 0;
+ *u = strtoull(s, &endptr, 0);
+ if (*s == '\0')
+ return (NULL);
+ if (errno == ERANGE && *u == ULLONG_MAX)
+ return (NULL);
+ if (*endptr == 'L')
+ endptr++;
+ return (endptr);
+}
+
+char *
+magic_strtoll(const char *s, int64_t *i)
+{
+ char *endptr;
+
+ errno = 0;
+ *i = strtoll(s, &endptr, 0);
+ if (*s == '\0')
+ return (NULL);
+ if (errno == ERANGE && *i == LLONG_MAX)
+ return (NULL);
+ if (*endptr == 'L')
+ endptr++;
+ return (endptr);
+}
+
+void
+magic_warn(struct magic_line *ml, const char *fmt, ...)
+{
+ va_list ap;
+ char *msg;
+
+ if (!ml->root->warnings)
+ return;
+
+ va_start(ap, fmt);
+ if (vasprintf(&msg, fmt, ap) == -1) {
+ va_end(ap);
+ return;
+ }
+ va_end(ap);
+
+ fprintf(stderr, "%s:%u: %s\n", ml->root->path, ml->line, msg);
+ free(msg);
+}