]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
lib/fs/readlink/: readlinknul(): Add function
authorAlejandro Colomar <alx@kernel.org>
Wed, 3 Jul 2024 01:00:49 +0000 (03:00 +0200)
committerSerge Hallyn <serge@hallyn.com>
Sat, 2 Nov 2024 02:25:50 +0000 (21:25 -0500)
Signed-off-by: Alejandro Colomar <alx@kernel.org>
lib/Makefile.am
lib/fs/readlink/readlinknul.c [new file with mode: 0644]
lib/fs/readlink/readlinknul.h [new file with mode: 0644]

index 89ccc0e35ba20b5cbad07018a019d63ef511f166..832c3ab3294509f90a1e7b4156c7f9e2201544b5 100644 (file)
@@ -103,6 +103,8 @@ libshadow_la_SOURCES = \
        find_new_sub_gids.c \
        find_new_sub_uids.c \
        fputsx.c \
+       fs/readlink/readlinknul.c \
+       fs/readlink/readlinknul.h \
        get_pid.c \
        getdate.h \
        getdate.y \
diff --git a/lib/fs/readlink/readlinknul.c b/lib/fs/readlink/readlinknul.c
new file mode 100644 (file)
index 0000000..4baea0d
--- /dev/null
@@ -0,0 +1,13 @@
+// SPDX-FileCopyrightText: 2024, Alejandro Colomar <alx@kernel.org>
+// SPDX-License-Identifier: BSD-3-Clause
+
+
+#include <config.h>
+
+#include "fs/readlink/readlinknul.h"
+
+#include <stddef.h>
+
+
+extern inline int readlinknul(const char *restrict link, char *restrict buf,
+    size_t size);
diff --git a/lib/fs/readlink/readlinknul.h b/lib/fs/readlink/readlinknul.h
new file mode 100644 (file)
index 0000000..d813e05
--- /dev/null
@@ -0,0 +1,46 @@
+// SPDX-FileCopyrightText: 2024, Alejandro Colomar <alx@kernel.org>
+// SPDX-License-Identifier: BSD-3-Clause
+
+
+#ifndef SHADOW_INCLUDE_LIB_FS_READLINK_READLINKNUL_H_
+#define SHADOW_INCLUDE_LIB_FS_READLINK_READLINKNUL_H_
+
+
+#include <config.h>
+
+#include <errno.h>
+#include <stddef.h>
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "attr.h"
+
+
+ATTR_STRING(1)
+inline int readlinknul(const char *restrict link, char *restrict buf,
+    size_t size);
+
+
+// Similar to readlink(2), but terminate the string.
+inline int
+readlinknul(const char *restrict link, char *restrict buf, size_t size)
+{
+       ssize_t  len;
+
+       len = readlink(link, buf, size);
+       if (len == -1)
+               return -1;
+
+       if (len == size) {
+               stpcpy(&buf[size-1], "");
+               errno = E2BIG;
+               return -1;
+       }
+
+       stpcpy(&buf[len], "");
+       return len;
+}
+
+
+#endif  // include guard