summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/bfstd.c57
-rw-r--r--tests/mksock.c22
-rw-r--r--tests/xtouch.c1
3 files changed, 65 insertions, 15 deletions
diff --git a/tests/bfstd.c b/tests/bfstd.c
new file mode 100644
index 0000000..4a8181b
--- /dev/null
+++ b/tests/bfstd.c
@@ -0,0 +1,57 @@
+/****************************************************************************
+ * bfs *
+ * Copyright (C) 2022 Tavian Barnes <tavianator@tavianator.com> *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted. *
+ * *
+ * 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 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 "../src/bfstd.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/** Check the result of xdirname()/xbasename(). */
+static void check_base_dir(const char *path, const char *dir, const char *base) {
+ char *xdir = xdirname(path);
+ if (!xdir) {
+ perror("xdirname()");
+ abort();
+ } else if (strcmp(xdir, dir) != 0) {
+ fprintf(stderr, "xdirname(\"%s\") == \"%s\" (!= \"%s\")\n", path, xdir, dir);
+ abort();
+ }
+ free(xdir);
+
+ char *xbase = xbasename(path);
+ if (!xbase) {
+ perror("xbasename()");
+ abort();
+ } else if (strcmp(xbase, base) != 0) {
+ fprintf(stderr, "xbasename(\"%s\") == \"%s\" (!= \"%s\")\n", path, xbase, base);
+ abort();
+ }
+ free(xbase);
+}
+
+int main(void) {
+ // From man 3p basename
+ check_base_dir("usr", ".", "usr");
+ check_base_dir("usr/", ".", "usr");
+ check_base_dir("", ".", ".");
+ check_base_dir("/", "/", "/");
+ // check_base_dir("//", "/" or "//", "/" or "//");
+ check_base_dir("///", "/", "/");
+ check_base_dir("/usr/", "/", "usr");
+ check_base_dir("/usr/lib", "/usr", "lib");
+ check_base_dir("//usr//lib//", "//usr", "lib");
+ check_base_dir("/home//dwc//test", "/home//dwc", "test");
+}
diff --git a/tests/mksock.c b/tests/mksock.c
index d1776b3..5068bc8 100644
--- a/tests/mksock.c
+++ b/tests/mksock.c
@@ -19,8 +19,8 @@
* program does the job.
*/
+#include "../src/bfstd.h"
#include <errno.h>
-#include <libgen.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@@ -41,18 +41,13 @@ static void errmsg(const char *cmd, const char *path) {
* file name is not.
*/
static int chdir_parent(const char *path) {
- char *copy = strdup(path);
- if (!copy) {
+ char *dir = xdirname(path);
+ if (!dir) {
return -1;
}
- const char *dir = dirname(copy);
int ret = chdir(dir);
-
- int error = errno;
- free(copy);
- errno = error;
-
+ free(dir);
return ret;
}
@@ -66,22 +61,21 @@ static int init_sun(struct sockaddr_un *sock, const char *path) {
return -1;
}
- char *copy = strdup(path);
- if (!copy) {
+ char *base = xbasename(path);
+ if (!base) {
return -1;
}
- const char *base = basename(copy);
len = strlen(base);
if (len >= sizeof(sock->sun_path)) {
- free(copy);
+ free(base);
errno = ENAMETOOLONG;
return -1;
}
sock->sun_family = AF_UNIX;
memcpy(sock->sun_path, base, len + 1);
- free(copy);
+ free(base);
return 0;
}
diff --git a/tests/xtouch.c b/tests/xtouch.c
index 9a91ec7..262fc33 100644
--- a/tests/xtouch.c
+++ b/tests/xtouch.c
@@ -14,7 +14,6 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
****************************************************************************/
-#include "../src/bfstd.h"
#include "../src/xtime.h"
#include <errno.h>
#include <fcntl.h>