1*37da2899SCharles.Forsyth #include "lib9.h"
2*37da2899SCharles.Forsyth #include <Windows.h>
3*37da2899SCharles.Forsyth
4*37da2899SCharles.Forsyth static char errstring[ERRMAX];
5*37da2899SCharles.Forsyth
6*37da2899SCharles.Forsyth enum
7*37da2899SCharles.Forsyth {
8*37da2899SCharles.Forsyth Magic = 0xffffff
9*37da2899SCharles.Forsyth };
10*37da2899SCharles.Forsyth
11*37da2899SCharles.Forsyth static void
winerror(int e,char * buf,uint nerr)12*37da2899SCharles.Forsyth winerror(int e, char *buf, uint nerr)
13*37da2899SCharles.Forsyth {
14*37da2899SCharles.Forsyth int r;
15*37da2899SCharles.Forsyth char buf2[ERRMAX], *p, *q;
16*37da2899SCharles.Forsyth
17*37da2899SCharles.Forsyth r = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
18*37da2899SCharles.Forsyth 0, e, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
19*37da2899SCharles.Forsyth buf2, sizeof(buf2), 0);
20*37da2899SCharles.Forsyth
21*37da2899SCharles.Forsyth if(r == 0)
22*37da2899SCharles.Forsyth snprint(buf2, ERRMAX, "windows error %d", e);
23*37da2899SCharles.Forsyth
24*37da2899SCharles.Forsyth q = buf2;
25*37da2899SCharles.Forsyth for(p = buf2; *p; p++) {
26*37da2899SCharles.Forsyth if(*p == '\r')
27*37da2899SCharles.Forsyth continue;
28*37da2899SCharles.Forsyth if(*p == '\n')
29*37da2899SCharles.Forsyth *q++ = ' ';
30*37da2899SCharles.Forsyth else
31*37da2899SCharles.Forsyth *q++ = *p;
32*37da2899SCharles.Forsyth }
33*37da2899SCharles.Forsyth *q = '\0';
34*37da2899SCharles.Forsyth utfecpy(buf, buf+nerr, buf2);
35*37da2899SCharles.Forsyth }
36*37da2899SCharles.Forsyth
37*37da2899SCharles.Forsyth void
werrstr(char * fmt,...)38*37da2899SCharles.Forsyth werrstr(char *fmt, ...)
39*37da2899SCharles.Forsyth {
40*37da2899SCharles.Forsyth va_list arg;
41*37da2899SCharles.Forsyth
42*37da2899SCharles.Forsyth va_start(arg, fmt);
43*37da2899SCharles.Forsyth vseprint(errstring, errstring+sizeof(errstring), fmt, arg);
44*37da2899SCharles.Forsyth va_end(arg);
45*37da2899SCharles.Forsyth SetLastError(Magic);
46*37da2899SCharles.Forsyth }
47*37da2899SCharles.Forsyth
48*37da2899SCharles.Forsyth int
errstr(char * buf,uint nerr)49*37da2899SCharles.Forsyth errstr(char *buf, uint nerr)
50*37da2899SCharles.Forsyth {
51*37da2899SCharles.Forsyth DWORD le;
52*37da2899SCharles.Forsyth
53*37da2899SCharles.Forsyth le = GetLastError();
54*37da2899SCharles.Forsyth if(le == Magic)
55*37da2899SCharles.Forsyth utfecpy(buf, buf+nerr, errstring);
56*37da2899SCharles.Forsyth else
57*37da2899SCharles.Forsyth winerror(le, buf, nerr);
58*37da2899SCharles.Forsyth return 1;
59*37da2899SCharles.Forsyth }
60*37da2899SCharles.Forsyth
61*37da2899SCharles.Forsyth void
oserrstr(char * buf,uint nerr)62*37da2899SCharles.Forsyth oserrstr(char *buf, uint nerr)
63*37da2899SCharles.Forsyth {
64*37da2899SCharles.Forsyth winerror(GetLastError(), buf, nerr);
65*37da2899SCharles.Forsyth }
66