Make set_errstr take a printf-like format
authorRonald G. Minnich <rminnich@gmail.com>
Sun, 15 Sep 2013 21:08:34 +0000 (14:08 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jan 2014 01:59:33 +0000 (17:59 -0800)
One of the things I really disliked about Plan 9 was that we
could return an errstr, and we only ever returned 52 errors
even though errstr was called in over 112 places. It gets
even more confusing if a program or library transforms the args:
what did the args look like precisely? Hard to say.

So on Plan 9 we get errors no more informative than errno. That's a very
low bar, to say the least.

This change allows for more useful error messages. We include an
example -- not a great one, but hey, it already cleared something
up for me.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
kern/include/syscall.h
kern/src/syscall.c

index f4ca925..13bf72b 100644 (file)
@@ -45,7 +45,7 @@ void run_local_syscall(struct syscall *sysc);
 intreg_t syscall(struct proc *p, uintreg_t sc_num, uintreg_t a0, uintreg_t a1,
                  uintreg_t a2, uintreg_t a3, uintreg_t a4, uintreg_t a5);
 void set_errno(int errno);
-void set_errstr(char *errstr);
+void set_errstr(char *errstr, ...);
 char *current_errstr(void);
 struct errbuf *get_cur_errbuf(void);
 void set_cur_errbuf(struct errbuf *ebuf);
index e506d76..0991245 100644 (file)
@@ -102,13 +102,17 @@ void set_errno(int errno)
                pcpui->cur_sysc->err = errno;
 }
 
-void set_errstr(char *errstr)
+void set_errstr(char *fmt, ...)
 {
+       va_list ap;
+       int rc;
        struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
        if (!pcpui->cur_sysc)
                return;
-       strncpy(pcpui->cur_sysc->errstr, errstr, MAX_ERRSTR_LEN);
-       /* enforce null termination */
+       va_start(ap, fmt);
+       rc = vsnprintf(pcpui->cur_sysc->errstr, MAX_ERRSTR_LEN, fmt, ap);
+       va_end(ap);
+       /* TODO: likely not needed */
        pcpui->cur_sysc->errstr[MAX_ERRSTR_LEN - 1] = '\0';
 }