2 b2cfc4e2 2003-09-30 devnull * We assume there's only one error buffer for the whole system.
3 b2cfc4e2 2003-09-30 devnull * If you use ffork, you need to provide a _syserrstr. Since most
4 b2cfc4e2 2003-09-30 devnull * people will use libthread (which provides a _syserrstr), this is
8 8ad51794 2004-03-25 devnull #include <u.h>
9 b2cfc4e2 2003-09-30 devnull #include <errno.h>
10 b2cfc4e2 2003-09-30 devnull #include <string.h>
11 8ad51794 2004-03-25 devnull #include <libc.h>
15 cbeb0b26 2006-04-01 devnull EPLAN9 = 0x19283745
18 b2cfc4e2 2003-09-30 devnull char *(*_syserrstr)(void);
19 b2cfc4e2 2003-09-30 devnull static char xsyserr[ERRMAX];
20 b2cfc4e2 2003-09-30 devnull static char*
21 b2cfc4e2 2003-09-30 devnull getsyserr(void)
26 b2cfc4e2 2003-09-30 devnull if(_syserrstr)
27 b2cfc4e2 2003-09-30 devnull s = (*_syserrstr)();
28 b2cfc4e2 2003-09-30 devnull if(s == nil)
29 b2cfc4e2 2003-09-30 devnull s = xsyserr;
30 b2cfc4e2 2003-09-30 devnull return s;
34 b2cfc4e2 2003-09-30 devnull errstr(char *err, uint n)
36 b2cfc4e2 2003-09-30 devnull char tmp[ERRMAX];
37 b2cfc4e2 2003-09-30 devnull char *syserr;
39 66c10f02 2005-01-04 devnull strecpy(tmp, tmp+ERRMAX, err);
40 66c10f02 2005-01-04 devnull rerrstr(err, n);
41 b2cfc4e2 2003-09-30 devnull syserr = getsyserr();
42 66c10f02 2005-01-04 devnull strecpy(syserr, syserr+ERRMAX, tmp);
43 b2cfc4e2 2003-09-30 devnull errno = EPLAN9;
44 b2cfc4e2 2003-09-30 devnull return 0;
48 b2cfc4e2 2003-09-30 devnull rerrstr(char *err, uint n)
50 b2cfc4e2 2003-09-30 devnull char *syserr;
52 b2cfc4e2 2003-09-30 devnull syserr = getsyserr();
53 66c10f02 2005-01-04 devnull if(errno == EINTR)
54 66c10f02 2005-01-04 devnull strcpy(syserr, "interrupted");
55 66c10f02 2005-01-04 devnull else if(errno != EPLAN9)
56 b2cfc4e2 2003-09-30 devnull strcpy(syserr, strerror(errno));
57 b2cfc4e2 2003-09-30 devnull strecpy(err, err+n, syserr);
60 b2cfc4e2 2003-09-30 devnull /* replaces __errfmt in libfmt */
63 b2cfc4e2 2003-09-30 devnull __errfmt(Fmt *f)
65 b2cfc4e2 2003-09-30 devnull if(errno == EPLAN9)
66 b2cfc4e2 2003-09-30 devnull return fmtstrcpy(f, getsyserr());
67 b2cfc4e2 2003-09-30 devnull return fmtstrcpy(f, strerror(errno));
71 169aba14 2003-10-14 devnull werrstr(char *fmt, ...)
73 169aba14 2003-10-14 devnull va_list arg;
74 169aba14 2003-10-14 devnull char buf[ERRMAX];
76 169aba14 2003-10-14 devnull va_start(arg, fmt);
77 169aba14 2003-10-14 devnull vseprint(buf, buf+ERRMAX, fmt, arg);
78 169aba14 2003-10-14 devnull va_end(arg);
79 169aba14 2003-10-14 devnull errstr(buf, ERRMAX);