1*671dfc47SDavid du Colombier #include <u.h>
2*671dfc47SDavid du Colombier #include <libc.h>
3*671dfc47SDavid du Colombier
4*671dfc47SDavid du Colombier /*
5*671dfc47SDavid du Colombier * This file is derrived from nterr.h in the samba distribution
6*671dfc47SDavid du Colombier */
7*671dfc47SDavid du Colombier
8*671dfc47SDavid du Colombier /*
9*671dfc47SDavid du Colombier Unix SMB/CIFS implementation.
10*671dfc47SDavid du Colombier DOS error code constants
11*671dfc47SDavid du Colombier Copyright (C) Andrew Tridgell 1992-2000
12*671dfc47SDavid du Colombier Copyright (C) John H Terpstra 1996-2000
13*671dfc47SDavid du Colombier Copyright (C) Luke Kenneth Casson Leighton 1996-2000
14*671dfc47SDavid du Colombier Copyright (C) Paul Ashton 1998-2000
15*671dfc47SDavid du Colombier
16*671dfc47SDavid du Colombier This program is free software; you can redistribute it and/or modify
17*671dfc47SDavid du Colombier it under the terms of the GNU General Public License as published by
18*671dfc47SDavid du Colombier the Free Software Foundation; either version 2 of the License, or
19*671dfc47SDavid du Colombier (at your option) any later version.
20*671dfc47SDavid du Colombier
21*671dfc47SDavid du Colombier This program is distributed in the hope that it will be useful,
22*671dfc47SDavid du Colombier but WITHOUT ANY WARRANTY; without even the implied warranty of
23*671dfc47SDavid du Colombier MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24*671dfc47SDavid du Colombier GNU General Public License for more details.
25*671dfc47SDavid du Colombier
26*671dfc47SDavid du Colombier You should have received a copy of the GNU General Public License
27*671dfc47SDavid du Colombier along with this program; if not, write to the Free Software
28*671dfc47SDavid du Colombier Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29*671dfc47SDavid du Colombier */
30*671dfc47SDavid du Colombier
31*671dfc47SDavid du Colombier
32*671dfc47SDavid du Colombier static struct {
33*671dfc47SDavid du Colombier int err;
34*671dfc47SDavid du Colombier char *msg;
35*671dfc47SDavid du Colombier } DOSerrs[] = {
36*671dfc47SDavid du Colombier /* smb x/open error codes for the errdos error class */
37*671dfc47SDavid du Colombier { (0<<16)|1, "no error" },
38*671dfc47SDavid du Colombier { (1<<16)|1, "invalid function" },
39*671dfc47SDavid du Colombier { (2<<16)|1, "file not found" },
40*671dfc47SDavid du Colombier { (3<<16)|1, "directory not found" },
41*671dfc47SDavid du Colombier { (4<<16)|1, "too many open files" },
42*671dfc47SDavid du Colombier { (5<<16)|1, "access denied" },
43*671dfc47SDavid du Colombier { (6<<16)|1, "invalid fid" },
44*671dfc47SDavid du Colombier { (7<<16)|1, "memory control blocks destroyed." },
45*671dfc47SDavid du Colombier { (8<<16)|1, "out of memory" },
46*671dfc47SDavid du Colombier { (9<<16)|1, "invalid memory block address" },
47*671dfc47SDavid du Colombier { (10<<16)|1, "invalid environment" },
48*671dfc47SDavid du Colombier { (12<<16)|1, "invalid open mode" },
49*671dfc47SDavid du Colombier { (13<<16)|1, "invalid data (only from ioctl call)" },
50*671dfc47SDavid du Colombier { (14<<16)|1, "reserved" },
51*671dfc47SDavid du Colombier { (15<<16)|1, "invalid drive" },
52*671dfc47SDavid du Colombier { (16<<16)|1, "attempt to delete current directory" },
53*671dfc47SDavid du Colombier { (17<<16)|1, "rename/move across filesystems" },
54*671dfc47SDavid du Colombier { (18<<16)|1, "no more files found" },
55*671dfc47SDavid du Colombier { (31<<16)|1, "general failure" },
56*671dfc47SDavid du Colombier { (32<<16)|1, "share mode conflict with open mode" },
57*671dfc47SDavid du Colombier { (33<<16)|1, "lock conflicts" },
58*671dfc47SDavid du Colombier { (50<<16)|1, "request unsupported" },
59*671dfc47SDavid du Colombier { (64<<16)|1, "network name not available" },
60*671dfc47SDavid du Colombier { (66<<16)|1, "ipc unsupported (guess)" },
61*671dfc47SDavid du Colombier { (67<<16)|1, "invalid share name" },
62*671dfc47SDavid du Colombier { (80<<16)|1, "file already exists" },
63*671dfc47SDavid du Colombier { (87<<16)|1, "invalid paramater" },
64*671dfc47SDavid du Colombier { (110<<16)|1, "cannot open" },
65*671dfc47SDavid du Colombier { (122<<16)|1, "insufficent buffer" },
66*671dfc47SDavid du Colombier { (123<<16)|1, "invalid name" },
67*671dfc47SDavid du Colombier { (124<<16)|1, "unknown level" },
68*671dfc47SDavid du Colombier { (158<<16)|1, "this region already locked" },
69*671dfc47SDavid du Colombier
70*671dfc47SDavid du Colombier { (183<<16)|1, "rename failed" },
71*671dfc47SDavid du Colombier
72*671dfc47SDavid du Colombier { (230<<16)|1, "named pipe invalid" },
73*671dfc47SDavid du Colombier { (231<<16)|1, "pipe busy" },
74*671dfc47SDavid du Colombier { (232<<16)|1, "close in progress" },
75*671dfc47SDavid du Colombier { (233<<16)|1, "no reader of named pipe" },
76*671dfc47SDavid du Colombier { (234<<16)|1, "more data to be returned" },
77*671dfc47SDavid du Colombier { (259<<16)|1, "no more items" },
78*671dfc47SDavid du Colombier { (267<<16)|1, "invalid directory name in a path" },
79*671dfc47SDavid du Colombier { (282<<16)|1, "extended attributes" },
80*671dfc47SDavid du Colombier { (1326<<16)|1, "authentication failed" },
81*671dfc47SDavid du Colombier { (2123<<16)|1, "buffer too small" },
82*671dfc47SDavid du Colombier { (2142<<16)|1, "unknown ipc" },
83*671dfc47SDavid du Colombier { (2151<<16)|1, "no such print job" },
84*671dfc47SDavid du Colombier { (2455<<16)|1, "invalid group" },
85*671dfc47SDavid du Colombier
86*671dfc47SDavid du Colombier /* Error codes for the ERRSRV class */
87*671dfc47SDavid du Colombier { (1<<16)|2, "non specific error" },
88*671dfc47SDavid du Colombier { (2<<16)|2, "bad password" },
89*671dfc47SDavid du Colombier { (3<<16)|2, "reserved" },
90*671dfc47SDavid du Colombier { (4<<16)|2, "permission denied" },
91*671dfc47SDavid du Colombier { (5<<16)|2, "tid invalid" },
92*671dfc47SDavid du Colombier { (6<<16)|2, "invalid server name" },
93*671dfc47SDavid du Colombier { (7<<16)|2, "invalid device" },
94*671dfc47SDavid du Colombier { (22<<16)|2, "unknown smb" },
95*671dfc47SDavid du Colombier { (49<<16)|2, "print queue full" },
96*671dfc47SDavid du Colombier { (50<<16)|2, "queued item too big" },
97*671dfc47SDavid du Colombier { (52<<16)|2, "fid invalid in print file" },
98*671dfc47SDavid du Colombier { (64<<16)|2, "unrecognised command" },
99*671dfc47SDavid du Colombier { (65<<16)|2, "smb server internal error" },
100*671dfc47SDavid du Colombier { (67<<16)|2, "fid/pathname invalid" },
101*671dfc47SDavid du Colombier { (68<<16)|2, "reserved 68" },
102*671dfc47SDavid du Colombier { (69<<16)|2, "access is invalid" },
103*671dfc47SDavid du Colombier { (70<<16)|2, "reserved 70" },
104*671dfc47SDavid du Colombier { (71<<16)|2, "attribute mode invalid" },
105*671dfc47SDavid du Colombier { (81<<16)|2, "message server paused" },
106*671dfc47SDavid du Colombier { (82<<16)|2, "not receiving messages" },
107*671dfc47SDavid du Colombier { (83<<16)|2, "no room for message" },
108*671dfc47SDavid du Colombier { (87<<16)|2, "too many remote usernames" },
109*671dfc47SDavid du Colombier { (88<<16)|2, "operation timed out" },
110*671dfc47SDavid du Colombier { (89<<16)|2, "no resources" },
111*671dfc47SDavid du Colombier { (90<<16)|2, "too many userids" },
112*671dfc47SDavid du Colombier { (91<<16)|2, "bad userid" },
113*671dfc47SDavid du Colombier { (250<<16)|2, "retry with mpx mode" },
114*671dfc47SDavid du Colombier { (251<<16)|2, "retry with standard mode" },
115*671dfc47SDavid du Colombier { (252<<16)|2, "resume mpx mode" },
116*671dfc47SDavid du Colombier { (0xffff<<16)|2, "function not supported" },
117*671dfc47SDavid du Colombier
118*671dfc47SDavid du Colombier /* Error codes for the ERRHRD class */
119*671dfc47SDavid du Colombier { (19<<16)|3, "read only media" },
120*671dfc47SDavid du Colombier { (20<<16)|3, "unknown device" },
121*671dfc47SDavid du Colombier { (21<<16)|3, "drive not ready" },
122*671dfc47SDavid du Colombier { (22<<16)|3, "unknown command" },
123*671dfc47SDavid du Colombier { (23<<16)|3, "data (CRC) error" },
124*671dfc47SDavid du Colombier { (24<<16)|3, "bad request length" },
125*671dfc47SDavid du Colombier { (25<<16)|3, "seek failed" },
126*671dfc47SDavid du Colombier { (26<<16)|3, "bad media" },
127*671dfc47SDavid du Colombier { (27<<16)|3, "bad sector" },
128*671dfc47SDavid du Colombier { (28<<16)|3, "no paper" },
129*671dfc47SDavid du Colombier { (29<<16)|3, "write fault" },
130*671dfc47SDavid du Colombier { (30<<16)|3, "read fault" },
131*671dfc47SDavid du Colombier { (31<<16)|3, "general hardware failure" },
132*671dfc47SDavid du Colombier { (34<<16)|3, "wrong disk" },
133*671dfc47SDavid du Colombier { (35<<16)|3, "FCB unavailable" },
134*671dfc47SDavid du Colombier { (36<<16)|3, "share buffer exceeded" },
135*671dfc47SDavid du Colombier { (39<<16)|3, "disk full" },
136*671dfc47SDavid du Colombier
137*671dfc47SDavid du Colombier };
138*671dfc47SDavid du Colombier
139*671dfc47SDavid du Colombier char *
doserrstr(uint err)140*671dfc47SDavid du Colombier doserrstr(uint err)
141*671dfc47SDavid du Colombier {
142*671dfc47SDavid du Colombier int i, match;
143*671dfc47SDavid du Colombier char *class;
144*671dfc47SDavid du Colombier static char buf[0xff];
145*671dfc47SDavid du Colombier
146*671dfc47SDavid du Colombier switch(err & 0xff){
147*671dfc47SDavid du Colombier case 1:
148*671dfc47SDavid du Colombier class = "dos";
149*671dfc47SDavid du Colombier break;
150*671dfc47SDavid du Colombier case 2:
151*671dfc47SDavid du Colombier class = "network";
152*671dfc47SDavid du Colombier break;
153*671dfc47SDavid du Colombier case 3:
154*671dfc47SDavid du Colombier class = "hardware";
155*671dfc47SDavid du Colombier break;
156*671dfc47SDavid du Colombier case 4:
157*671dfc47SDavid du Colombier class = "Xos";
158*671dfc47SDavid du Colombier break;
159*671dfc47SDavid du Colombier case 0xe1:
160*671dfc47SDavid du Colombier class = "mx1";
161*671dfc47SDavid du Colombier break;
162*671dfc47SDavid du Colombier case 0xe2:
163*671dfc47SDavid du Colombier class = "mx2";
164*671dfc47SDavid du Colombier break;
165*671dfc47SDavid du Colombier case 0xe3:
166*671dfc47SDavid du Colombier class = "mx3";
167*671dfc47SDavid du Colombier break;
168*671dfc47SDavid du Colombier case 0xff:
169*671dfc47SDavid du Colombier class = "packet";
170*671dfc47SDavid du Colombier break;
171*671dfc47SDavid du Colombier default:
172*671dfc47SDavid du Colombier class = "unknown";
173*671dfc47SDavid du Colombier break;
174*671dfc47SDavid du Colombier }
175*671dfc47SDavid du Colombier
176*671dfc47SDavid du Colombier match = -1;
177*671dfc47SDavid du Colombier for(i = 0; i < nelem(DOSerrs); i++)
178*671dfc47SDavid du Colombier if(DOSerrs[i].err == err)
179*671dfc47SDavid du Colombier match = i;
180*671dfc47SDavid du Colombier
181*671dfc47SDavid du Colombier if(match != -1)
182*671dfc47SDavid du Colombier snprint(buf, sizeof(buf), "%s, %s", class, DOSerrs[match].msg);
183*671dfc47SDavid du Colombier else
184*671dfc47SDavid du Colombier snprint(buf, sizeof(buf), "%s, %ud/0x%ux - unknown error",
185*671dfc47SDavid du Colombier class, err >> 16, err >> 16);
186*671dfc47SDavid du Colombier return buf;
187*671dfc47SDavid du Colombier }
188