xref: /inferno-os/lib9/errstr-Nt.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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