Add user helpers save_err and restore_err (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 11 Apr 2016 20:53:37 +0000 (16:53 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 15 Apr 2016 14:29:13 +0000 (10:29 -0400)
These save and restore errno and errstr.  Programs will want to use these
when they need to perform syscalls and want to preserve the original error.
Normally this is easy with errno, but you should save/restore errstr too.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/Versions
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/bits/errno.h
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/errno.c

index 37b9f7d..797f57e 100644 (file)
@@ -13,6 +13,8 @@ libc {
     __ros_scp_simple_evq;
     __ros_syscall_noerrno;
     __ros_syscall_errno;
+    save_err;
+    restore_err;
 
     set_tls_desc;
     get_tls_desc;
index 1a16c16..6ba0d89 100644 (file)
@@ -12,6 +12,8 @@ int *__errno_location(void);
 char *errstr(void);    /* can't macro, errstr is used internally in libc */
 /* this is defined in init-first.c, but declared here for easy #includes */
 void werrstr(const char *fmt, ...);
+void save_err(int *no, char *str);
+void restore_err(int *no, char *str);
 
 # ifdef libc_hidden_proto
 libc_hidden_proto(__errno_location_tls)
index 3004bc0..5d8436b 100644 (file)
@@ -66,6 +66,27 @@ char *errstr(void)
        return ros_errstr_loc();
 }
 
+/* Using this instead of strcpy/memcpy to avoid dependencies. */
+static void simple_strcpy(char *dst, char *src, size_t size)
+{
+       for (size_t i = 0; (i < size) && *src; i++)
+               *dst++ = *src++;
+}
+
+/* Helpers to save and restore errno and errstr into temporary locations.  Make
+ * sure str is MAX_ERRSTR_LEN bytes long. */
+void save_err(int *no, char *str)
+{
+       *no = errno;
+       simple_strcpy(str, errstr(), MAX_ERRSTR_LEN);
+}
+
+void restore_err(int *no, char *str)
+{
+       errno = *no;
+       simple_strcpy(errstr(), str, MAX_ERRSTR_LEN);
+}
+
 /* Don't try to hidden_data_def the function pointers.  Won't allow us to
  * switch, or otherwise track the right location. */
 libc_hidden_def(__errno_location_tls)