libc: Add __errno_location() for language binding benefits.
authorzrj <rimvydas.jasinskas@gmail.com>
Sat, 5 Oct 2019 10:04:12 +0000 (13:04 +0300)
committerzrj <rimvydas.jasinskas@gmail.com>
Sat, 5 Oct 2019 18:33:08 +0000 (21:33 +0300)
 Some languages have restrictions when it comes to C style TLS handling
 (thread local might be feature-gated) or simply it is inconvenient to
 add various OS specific binding wrappers just to access C errno values.

 The __errno_location() symbol provides externally callable version of
 __error() inline function.

 While there, add __WANT_NO_INLINED___ERROR guard for few python parsers
 in DPorts that are unable to parse inlined __error() code yet.

lib/libc/gen/Makefile.inc
lib/libc/gen/Symbol.map
lib/libc/gen/__errno_location.c [new file with mode: 0644]
sys/sys/errno.h

index 3217611..838feaf 100644 (file)
@@ -8,8 +8,9 @@ CFLAGS+=-I${.CURDIR}/../libc/sysvipc
 
 CMAPS+=        ${.CURDIR}/gen/Symbol.map
 
-SRCS+=  _once_stub.c _pthread_stubs.c _rand48.c _spinlock_stub.c \
-       _thread_init.c alarm.c arc4random.c assert.c basename.c \
+SRCS+=  __errno_location.c _once_stub.c _pthread_stubs.c _rand48.c \
+       _spinlock_stub.c _thread_init.c \
+       alarm.c arc4random.c assert.c basename.c \
        clock.c clock_getcpuclockid.c closedir.c confstr.c creat.c \
        ctermid.c daemon.c devname.c dirfd.c dirname.c disklabel.c disktab.c \
        dlfcn.c drand48.c dup3.c elf_utils.c erand48.c err.c errlst.c exec.c \
index 5648888..72423e5 100644 (file)
@@ -490,6 +490,7 @@ DF506.0 {
 };
 
 DF508.0 {
+    __errno_location;
     getutxuser;
 };
 
diff --git a/lib/libc/gen/__errno_location.c b/lib/libc/gen/__errno_location.c
new file mode 100644 (file)
index 0000000..163f26f
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2019 The DragonFly Project.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/errno.h>
+
+/*
+ * This function to fetch errno is provided for language binding only.
+ */
+int *
+__errno_location(void)
+{
+  return (__error());
+}
index 657e5ec..2bfa6a9 100644 (file)
 #if !defined(_KERNEL) || defined(_KERNEL_VIRTUAL)
 __BEGIN_DECLS
 extern __thread int    errno;
+
+int * __errno_location(void);          /* For language bindings only */
 __END_DECLS
 
+/*
+ * Some python parsers unable to parse such __error() inline.
+ */
+#ifdef __WANT_NO_INLINED___ERROR
+#define        errno           (* __errno_location())
+#else
 static __inline int *__error(void)
 {
        return (&errno);
 }
-
 #define        errno           (* __error())
 #endif
+#endif
 
 #define        EPERM           1               /* Operation not permitted */
 #define        ENOENT          2               /* No such file or directory */