Blame


1 b2cfc4e2 2003-09-30 devnull /*
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
5 b2cfc4e2 2003-09-30 devnull * okay.
6 b2cfc4e2 2003-09-30 devnull */
7 b2cfc4e2 2003-09-30 devnull
8 b2cfc4e2 2003-09-30 devnull #include <errno.h>
9 b2cfc4e2 2003-09-30 devnull #include <string.h>
10 b2cfc4e2 2003-09-30 devnull #include <lib9.h>
11 b2cfc4e2 2003-09-30 devnull
12 b2cfc4e2 2003-09-30 devnull enum
13 b2cfc4e2 2003-09-30 devnull {
14 b2cfc4e2 2003-09-30 devnull EPLAN9 = 0x19283745,
15 b2cfc4e2 2003-09-30 devnull };
16 b2cfc4e2 2003-09-30 devnull
17 b2cfc4e2 2003-09-30 devnull char *(*_syserrstr)(void);
18 b2cfc4e2 2003-09-30 devnull static char xsyserr[ERRMAX];
19 b2cfc4e2 2003-09-30 devnull static char*
20 b2cfc4e2 2003-09-30 devnull getsyserr(void)
21 b2cfc4e2 2003-09-30 devnull {
22 b2cfc4e2 2003-09-30 devnull char *s;
23 b2cfc4e2 2003-09-30 devnull
24 b2cfc4e2 2003-09-30 devnull s = nil;
25 b2cfc4e2 2003-09-30 devnull if(_syserrstr)
26 b2cfc4e2 2003-09-30 devnull s = (*_syserrstr)();
27 b2cfc4e2 2003-09-30 devnull if(s == nil)
28 b2cfc4e2 2003-09-30 devnull s = xsyserr;
29 b2cfc4e2 2003-09-30 devnull return s;
30 b2cfc4e2 2003-09-30 devnull }
31 b2cfc4e2 2003-09-30 devnull
32 b2cfc4e2 2003-09-30 devnull int
33 b2cfc4e2 2003-09-30 devnull errstr(char *err, uint n)
34 b2cfc4e2 2003-09-30 devnull {
35 b2cfc4e2 2003-09-30 devnull char tmp[ERRMAX];
36 b2cfc4e2 2003-09-30 devnull char *syserr;
37 b2cfc4e2 2003-09-30 devnull
38 b2cfc4e2 2003-09-30 devnull syserr = getsyserr();
39 b2cfc4e2 2003-09-30 devnull if(errno != EPLAN9)
40 b2cfc4e2 2003-09-30 devnull strcpy(syserr, strerror(errno));
41 b2cfc4e2 2003-09-30 devnull
42 b2cfc4e2 2003-09-30 devnull strecpy(tmp, tmp+ERRMAX, syserr);
43 b2cfc4e2 2003-09-30 devnull strecpy(syserr, syserr+ERRMAX, err);
44 b2cfc4e2 2003-09-30 devnull strecpy(err, err+n, tmp);
45 b2cfc4e2 2003-09-30 devnull errno = EPLAN9;
46 b2cfc4e2 2003-09-30 devnull return 0;
47 b2cfc4e2 2003-09-30 devnull }
48 b2cfc4e2 2003-09-30 devnull
49 b2cfc4e2 2003-09-30 devnull void
50 b2cfc4e2 2003-09-30 devnull rerrstr(char *err, uint n)
51 b2cfc4e2 2003-09-30 devnull {
52 b2cfc4e2 2003-09-30 devnull char *syserr;
53 b2cfc4e2 2003-09-30 devnull
54 b2cfc4e2 2003-09-30 devnull syserr = getsyserr();
55 b2cfc4e2 2003-09-30 devnull if(errno != EPLAN9)
56 b2cfc4e2 2003-09-30 devnull strcpy(syserr, strerror(errno));
57 b2cfc4e2 2003-09-30 devnull strecpy(err, err+n, syserr);
58 b2cfc4e2 2003-09-30 devnull }
59 b2cfc4e2 2003-09-30 devnull
60 b2cfc4e2 2003-09-30 devnull /* replaces __errfmt in libfmt */
61 b2cfc4e2 2003-09-30 devnull
62 b2cfc4e2 2003-09-30 devnull int
63 b2cfc4e2 2003-09-30 devnull __errfmt(Fmt *f)
64 b2cfc4e2 2003-09-30 devnull {
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));
68 b2cfc4e2 2003-09-30 devnull }
69 169aba14 2003-10-14 devnull
70 169aba14 2003-10-14 devnull void
71 169aba14 2003-10-14 devnull werrstr(char *fmt, ...)
72 169aba14 2003-10-14 devnull {
73 169aba14 2003-10-14 devnull va_list arg;
74 169aba14 2003-10-14 devnull char buf[ERRMAX];
75 169aba14 2003-10-14 devnull
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);
80 169aba14 2003-10-14 devnull }
81 fd04aace 2003-11-23 devnull
82 fd04aace 2003-11-23 devnull char*
83 fd04aace 2003-11-23 devnull gerrstr(void)
84 fd04aace 2003-11-23 devnull {
85 fd04aace 2003-11-23 devnull char *s;
86 fd04aace 2003-11-23 devnull
87 fd04aace 2003-11-23 devnull s = getsyserr();
88 fd04aace 2003-11-23 devnull if(errno != EPLAN9)
89 fd04aace 2003-11-23 devnull strcpy(s, strerror(errno));
90 fd04aace 2003-11-23 devnull return s;
91 fd04aace 2003-11-23 devnull }
92 fd04aace 2003-11-23 devnull
93 fd04aace 2003-11-23 devnull