]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/ip/cifsd/error.c
separate MSCHAP(v2) and NTLM(v2) authentication
[plan9front.git] / sys / src / cmd / ip / cifsd / error.c
1 #include <u.h>
2 #include <libc.h>
3 #include "dat.h"
4 #include "fns.h"
5
6 enum {
7         /* error class */
8         ERRDOS = 1,
9         ERRSRV = 2,
10         ERRHRD = 3,
11         ERRCMD = 0xFF,
12
13         /* error codes */
14         ERRbadfunc = 0x1,
15         ERRbadfile = 0x2,
16         ERRbadpath = 0x3,
17         ERRnofids = 0x4,
18         ERRnoaccess = 0x5,
19         ERRbadfid = 0x6,
20         ERRbadmcp = 0x7,
21         ERRnomem = 0x8,
22         ERRbadmem = 0x9,
23         ERRbadenv = 0xA,
24         ERRbadformat = 0xB,
25         ERRbadaccess = 0xC,
26         ERRbaddata = 0xD,
27         ERRbaddrive = 0xF,
28         ERRremcd = 0x10,
29         ERRdiffdevice = 0x11,
30         ERRnofiles = 0x12,
31         ERRgeneral = 0x1F,
32         ERRbadshare = 0x20,
33         ERRlock = 0x21,
34         ERReof = 0x26,
35         ERRunsup = 0x32,
36         ERRfilexists = 0x50,
37         ERRinvalidparam = 0x57,
38         ERRunknownlevel = 0x7C,
39         ERRbadpipe = 0xE6,
40         ERRinvnetname = 0x06,
41         ERRreqnotaccep = 0x47,
42         ERRnosuchshare = 0x43,
43         ERRerror = 0x1,
44         ERRbadpw = 0x2,
45         ERRaccess = 0x4,
46         ERRinvtid = 0x5,
47         ERRinvdevice = 0x7,
48         ERRbaduid = 0x5b,
49 };
50
51 int
52 doserror(int err)
53 {
54 #define SE(c,e) e<<16 | c
55         static struct Ent {
56                 int error;
57                 int status;
58         } tab[] = {
59                 SE(ERRSRV, ERRerror), STATUS_INVALID_SMB,
60                 SE(ERRSRV, ERRinvtid), STATUS_SMB_BAD_TID,
61                 SE(ERRDOS, ERRbadfid), STATUS_SMB_BAD_FID,
62                 SE(ERRDOS, ERRbadaccess), STATUS_OS2_INVALID_ACCESS,
63                 SE(ERRSRV, ERRbaduid), STATUS_SMB_BAD_UID,
64                 SE(ERRDOS, ERRunknownlevel), STATUS_OS2_INVALID_LEVEL,
65                 SE(ERRDOS, ERRnofiles), STATUS_NO_MORE_FILES,
66                 SE(ERRDOS, ERRbadfid), STATUS_INVALID_HANDLE,
67                 SE(ERRDOS, ERRnoaccess), STATUS_ACCESS_DENIED,
68                 SE(ERRDOS, ERRbadfile), STATUS_OBJECT_NAME_NOT_FOUND,
69                 SE(ERRDOS, ERRfilexists), STATUS_OBJECT_NAME_COLLISION,
70                 SE(ERRDOS, ERRbadpath), STATUS_OBJECT_PATH_INVALID,
71                 SE(ERRDOS, ERRbadpath), STATUS_OBJECT_PATH_NOT_FOUND,
72                 SE(ERRDOS, ERRbadpath), STATUS_OBJECT_PATH_SYNTAX_BAD,
73                 SE(ERRDOS, ERRbadshare), STATUS_SHARING_VIOLATION,
74                 SE(ERRSRV, ERRbadpw), STATUS_LOGON_FAILURE,
75                 SE(ERRDOS, ERRnoaccess), STATUS_FILE_IS_A_DIRECTORY,
76                 SE(ERRDOS, ERRunsup), STATUS_NOT_SUPPORTED,
77                 SE(ERRSRV, ERRinvdevice), STATUS_BAD_DEVICE_TYPE,
78                 SE(ERRSRV, ERRinvnetname), STATUS_BAD_NETWORK_NAME,
79                 SE(ERRDOS, ERRdiffdevice), STATUS_NOT_SAME_DEVICE,
80                 SE(ERRDOS, ERRremcd), STATUS_DIRECTORY_NOT_EMPTY,
81                 SE(ERRSRV, ERRerror), 0,
82         };
83         struct Ent *p;
84
85         for(p=tab; p->status; p++)
86                 if(p->status == err)
87                         break;
88         return p->error;
89 }
90
91 int
92 smbmkerror(void)
93 {
94         static struct Ent {
95                 int status;
96                 char *str;
97         }  tab[] = {
98                 STATUS_ACCESS_DENIED, "permission denied",
99                 STATUS_ACCESS_DENIED, "access permission denied",
100                 STATUS_ACCESS_DENIED, "create prohibited",
101                 STATUS_ACCESS_DENIED, "mounted directory forbids creation",
102                 STATUS_DIRECTORY_NOT_EMPTY, "directory not empty",
103                 STATUS_NO_SUCH_FILE, "no such file",
104                 STATUS_OBJECT_NAME_NOT_FOUND, "name not found",
105                 STATUS_OBJECT_PATH_NOT_FOUND, "directory entry not found",
106                 STATUS_OBJECT_PATH_NOT_FOUND, "not a directory",
107                 STATUS_OBJECT_PATH_NOT_FOUND, "does not exist",
108                 STATUS_OBJECT_PATH_SYNTAX_BAD, "bad character",
109                 STATUS_OBJECT_PATH_SYNTAX_BAD, "file name syntax",
110                 STATUS_OBJECT_NAME_COLLISION, "file already exists",
111                 STATUS_FILE_IS_A_DIRECTORY, "is a directory",
112                 /* kenfs */
113                 STATUS_OBJECT_NAME_COLLISION, "create/wstat -- file exists",
114                 STATUS_ACCESS_DENIED, "wstat -- not owner",
115                 STATUS_ACCESS_DENIED, "wstat -- not in group",
116                 /* unknown error */
117                 STATUS_INVALID_SMB, nil,
118         };
119         char buf[ERRMAX];
120         struct Ent *p;
121
122         rerrstr(buf, sizeof(buf));
123         for(p = tab; p->str; p++)
124                 if(strstr(buf, p->str))
125                         break;
126         if(debug)
127                 fprint(2, "smbmkerror: %s -> %lux\n", buf, (ulong)p->status);
128         return p->status;
129 }