Page MenuHomeFreeBSD

D58059.id181372.diff
No OneTemporary

D58059.id181372.diff

diff --git a/lib/libc/gen/Symbol.map b/lib/libc/gen/Symbol.map
--- a/lib/libc/gen/Symbol.map
+++ b/lib/libc/gen/Symbol.map
@@ -482,6 +482,7 @@
posix_spawnattr_getprocdescp_np;
posix_spawnattr_setexecfd_np;
posix_spawnattr_setprocdescp_np;
+ uexterr_set;
};
FBSDprivate_1.0 {
diff --git a/lib/libc/gen/libc_interposing_table.c b/lib/libc/gen/libc_interposing_table.c
--- a/lib/libc/gen/libc_interposing_table.c
+++ b/lib/libc/gen/libc_interposing_table.c
@@ -43,6 +43,7 @@
SLOT(spinunlock, __libc_spinunlock_stub),
SLOT(map_stacks_exec, __libc_map_stacks_exec),
SLOT(uexterr_gettext, __libc_uexterr_gettext),
+ SLOT(uexterr_set, __libc_uexterr_set),
};
#undef SLOT
diff --git a/lib/libc/gen/uexterr_gettext.c b/lib/libc/gen/uexterr_gettext.c
--- a/lib/libc/gen/uexterr_gettext.c
+++ b/lib/libc/gen/uexterr_gettext.c
@@ -11,6 +11,7 @@
#define _WANT_P_OSREL
#include <sys/param.h>
#include <sys/exterrvar.h>
+#include <errno.h>
#include <exterr.h>
#include <string.h>
#include "libc_private.h"
@@ -41,3 +42,32 @@
return (((int (*)(char *, size_t))
__libc_interposing[INTERPOS_uexterr_gettext])(buf, bufsz));
}
+
+int
+__libc_uexterr_set(int error, int category, const char *mmsg, uint64ptr_t pp1,
+ uint64ptr_t pp2, int line)
+{
+ struct uexterror *uexterrp = &uexterr;
+
+ memset((char *)uexterrp + offsetof(struct uexterror, error), 0,
+ sizeof(struct uexterror) - offsetof(struct uexterror, error));
+ uexterrp->error = error;
+ uexterrp->cat = category;
+ uexterrp->src_line = line;
+ uexterrp->p1 = pp1;
+ uexterrp->p2 = pp2;
+ strlcpy(uexterrp->msg, mmsg, sizeof(uexterrp->msg));
+
+ errno = error;
+
+ return (0);
+}
+
+int
+uexterr_set(int error, int category, const char *mmsg, uint64ptr_t pp1,
+ uint64ptr_t pp2, int line)
+{
+ return (((int (*)(int, int, const char *, uint64ptr_t, uint64ptr_t,
+ int))__libc_interposing[INTERPOS_uexterr_set])(error,
+ category, mmsg, pp1, pp2, line));
+}
diff --git a/lib/libc/include/libc_private.h b/lib/libc/include/libc_private.h
--- a/lib/libc/include/libc_private.h
+++ b/lib/libc/include/libc_private.h
@@ -253,6 +253,7 @@
INTERPOS_pdfork,
INTERPOS_uexterr_gettext,
INTERPOS_pdwait,
+ INTERPOS_uexterr_set,
INTERPOS_MAX
};
@@ -383,5 +384,7 @@
struct uexterror;
int __uexterr_format(const struct uexterror *ue, char *buf, size_t bufsz);
int __libc_uexterr_gettext(char *buf, size_t bufsz);
+int __libc_uexterr_set(int eerror, int category, const char *mmsg,
+ uint64ptr_t pp1, uint64ptr_t pp2, int line);
#endif /* _LIBC_PRIVATE_H_ */
diff --git a/lib/libthr/thread/thr_syscalls.c b/lib/libthr/thread/thr_syscalls.c
--- a/lib/libthr/thread/thr_syscalls.c
+++ b/lib/libthr/thread/thr_syscalls.c
@@ -643,6 +643,31 @@
return (__uexterr_format(&curthread->uexterr, buf, bufsz));
}
+static int
+__thr_uexterr_set(int error, int category, const char *mmsg, uint64ptr_t pp1,
+ uint64ptr_t pp2, int line)
+{
+ struct pthread *curthread;
+ struct uexterror *uexterrp;
+
+ curthread = _get_curthread();
+
+ uexterrp = &curthread->uexterr;
+
+ memset((char *)uexterrp + sizeof(uexterrp->ver), 0,
+ sizeof(struct uexterror) - sizeof(uexterrp->ver));
+ uexterrp->error = error;
+ uexterrp->cat = category;
+ uexterrp->src_line = line;
+ uexterrp->p1 = pp1;
+ uexterrp->p2 = pp2;
+ strlcpy(uexterrp->msg, mmsg, sizeof(uexterrp->msg));
+
+ errno = error;
+
+ return (0);
+}
+
void
__thr_interpose_libc(void)
{
@@ -700,6 +725,7 @@
SLOT(pdfork);
SLOT(uexterr_gettext);
SLOT(pdwait);
+ SLOT(uexterr_set);
#undef SLOT
*(__libc_interposing_slot(
INTERPOS__pthread_mutex_init_calloc_cb)) =

File Metadata

Mime Type
text/plain
Expires
Tue, Aug 4, 5:24 AM (17 h, 44 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
35940190
Default Alt Text
D58059.id181372.diff (3 KB)

Event Timeline