#include <u.h>#include <libc.h>#include "dat.h"#include "fns.h" enum { /* error class */ ERRDOS = 1, ERRSRV = 2, ERRHRD = 3, ERRCMD = 0xFF, /* error codes */ ERRbadfunc = 0x1, ERRbadfile = 0x2, ERRbadpath = 0x3, ERRnofids = 0x4, ERRnoaccess = 0x5, ERRbadfid = 0x6, ERRbadmcp = 0x7, ERRnomem = 0x8, ERRbadmem = 0x9, ERRbadenv = 0xA, ERRbadformat = 0xB, ERRbadaccess = 0xC, ERRbaddata = 0xD, ERRbaddrive = 0xF, ERRremcd = 0x10, ERRdiffdevice = 0x11, ERRnofiles = 0x12, ERRgeneral = 0x1F, ERRbadshare = 0x20, ERRlock = 0x21, ERReof = 0x26, ERRunsup = 0x32, ERRfilexists = 0x50, ERRinvalidparam = 0x57, ERRunknownlevel = 0x7C, ERRbadpipe = 0xE6, ERRinvnetname = 0x06, ERRreqnotaccep = 0x47, ERRnosuchshare = 0x43, ERRerror = 0x1, ERRbadpw = 0x2, ERRaccess = 0x4, ERRinvtid = 0x5, ERRinvdevice = 0x7, ERRbaduid = 0x5b,}; intdoserror(int err){#define SE(c,e) e<<16 | c static struct Ent { int error; int status; } tab[] = { SE(ERRSRV, ERRerror), STATUS_INVALID_SMB, SE(ERRSRV, ERRinvtid), STATUS_SMB_BAD_TID, SE(ERRDOS, ERRbadfid), STATUS_SMB_BAD_FID, SE(ERRDOS, ERRbadaccess), STATUS_OS2_INVALID_ACCESS, SE(ERRSRV, ERRbaduid), STATUS_SMB_BAD_UID, SE(ERRDOS, ERRunknownlevel), STATUS_OS2_INVALID_LEVEL, SE(ERRDOS, ERRnofiles), STATUS_NO_MORE_FILES, SE(ERRDOS, ERRbadfid), STATUS_INVALID_HANDLE, SE(ERRDOS, ERRnoaccess), STATUS_ACCESS_DENIED, SE(ERRDOS, ERRbadfile), STATUS_OBJECT_NAME_NOT_FOUND, SE(ERRDOS, ERRfilexists), STATUS_OBJECT_NAME_COLLISION, SE(ERRDOS, ERRbadpath), STATUS_OBJECT_PATH_INVALID, SE(ERRDOS, ERRbadpath), STATUS_OBJECT_PATH_NOT_FOUND, SE(ERRDOS, ERRbadpath), STATUS_OBJECT_PATH_SYNTAX_BAD, SE(ERRDOS, ERRbadshare), STATUS_SHARING_VIOLATION, SE(ERRSRV, ERRbadpw), STATUS_LOGON_FAILURE, SE(ERRDOS, ERRnoaccess), STATUS_FILE_IS_A_DIRECTORY, SE(ERRDOS, ERRunsup), STATUS_NOT_SUPPORTED, SE(ERRSRV, ERRinvdevice), STATUS_BAD_DEVICE_TYPE, SE(ERRSRV, ERRinvnetname), STATUS_BAD_NETWORK_NAME, SE(ERRDOS, ERRdiffdevice), STATUS_NOT_SAME_DEVICE, SE(ERRDOS, ERRremcd), STATUS_DIRECTORY_NOT_EMPTY, SE(ERRSRV, ERRerror), 0, }; struct Ent *p; for(p=tab; p->status; p++) if(p->status == err) break; return p->error;} intsmbmkerror(void){ static struct Ent { int status; char *str; } tab[] = { STATUS_ACCESS_DENIED, "permission denied", STATUS_ACCESS_DENIED, "access permission denied", STATUS_ACCESS_DENIED, "create prohibited", STATUS_ACCESS_DENIED, "mounted directory forbids creation", STATUS_DIRECTORY_NOT_EMPTY, "directory not empty", STATUS_NO_SUCH_FILE, "no such file", STATUS_OBJECT_NAME_NOT_FOUND, "name not found", STATUS_OBJECT_PATH_NOT_FOUND, "directory entry not found", STATUS_OBJECT_PATH_NOT_FOUND, "not a directory", STATUS_OBJECT_PATH_NOT_FOUND, "does not exist", STATUS_OBJECT_PATH_SYNTAX_BAD, "bad character", STATUS_OBJECT_PATH_SYNTAX_BAD, "file name syntax", STATUS_OBJECT_NAME_COLLISION, "file already exists", STATUS_FILE_IS_A_DIRECTORY, "is a directory", /* kenfs */ STATUS_OBJECT_NAME_COLLISION, "create/wstat -- file exists", STATUS_ACCESS_DENIED, "wstat -- not owner", STATUS_ACCESS_DENIED, "wstat -- not in group", /* unknown error */ STATUS_INVALID_SMB, nil, }; char buf[ERRMAX]; struct Ent *p; rerrstr(buf, sizeof(buf)); for(p = tab; p->str; p++) if(strstr(buf, p->str)) break; if(debug) fprint(2, "smbmkerror: %s -> %lux\n", buf, (ulong)p->status); return p->status;}
#include <u.h>
#include <libc.h>
#include "dat.h"
#include "fns.h"
enum {
/* error class */
ERRDOS = 1,
ERRSRV = 2,
ERRHRD = 3,
ERRCMD = 0xFF,
/* error codes */
ERRbadfunc = 0x1,
ERRbadfile = 0x2,
ERRbadpath = 0x3,
ERRnofids = 0x4,
ERRnoaccess = 0x5,
ERRbadfid = 0x6,
ERRbadmcp = 0x7,
ERRnomem = 0x8,
ERRbadmem = 0x9,
ERRbadenv = 0xA,
ERRbadformat = 0xB,
ERRbadaccess = 0xC,
ERRbaddata = 0xD,
ERRbaddrive = 0xF,
ERRremcd = 0x10,
ERRdiffdevice = 0x11,
ERRnofiles = 0x12,
ERRgeneral = 0x1F,
ERRbadshare = 0x20,
ERRlock = 0x21,
ERReof = 0x26,
ERRunsup = 0x32,
ERRfilexists = 0x50,
ERRinvalidparam = 0x57,
ERRunknownlevel = 0x7C,
ERRbadpipe = 0xE6,
ERRinvnetname = 0x06,
ERRreqnotaccep = 0x47,
ERRnosuchshare = 0x43,
ERRerror = 0x1,
ERRbadpw = 0x2,
ERRaccess = 0x4,
ERRinvtid = 0x5,
ERRinvdevice = 0x7,
ERRbaduid = 0x5b,
};
int
doserror(int err)
{
#define SE(c,e) e<<16 | c
static struct Ent {
int error;
int status;
} tab[] = {
SE(ERRSRV, ERRerror), STATUS_INVALID_SMB,
SE(ERRSRV, ERRinvtid), STATUS_SMB_BAD_TID,
SE(ERRDOS, ERRbadfid), STATUS_SMB_BAD_FID,
SE(ERRDOS, ERRbadaccess), STATUS_OS2_INVALID_ACCESS,
SE(ERRSRV, ERRbaduid), STATUS_SMB_BAD_UID,
SE(ERRDOS, ERRunknownlevel), STATUS_OS2_INVALID_LEVEL,
SE(ERRDOS, ERRnofiles), STATUS_NO_MORE_FILES,
SE(ERRDOS, ERRbadfid), STATUS_INVALID_HANDLE,
SE(ERRDOS, ERRnoaccess), STATUS_ACCESS_DENIED,
SE(ERRDOS, ERRbadfile), STATUS_OBJECT_NAME_NOT_FOUND,
SE(ERRDOS, ERRfilexists), STATUS_OBJECT_NAME_COLLISION,
SE(ERRDOS, ERRbadpath), STATUS_OBJECT_PATH_INVALID,
SE(ERRDOS, ERRbadpath), STATUS_OBJECT_PATH_NOT_FOUND,
SE(ERRDOS, ERRbadpath), STATUS_OBJECT_PATH_SYNTAX_BAD,
SE(ERRDOS, ERRbadshare), STATUS_SHARING_VIOLATION,
SE(ERRSRV, ERRbadpw), STATUS_LOGON_FAILURE,
SE(ERRDOS, ERRnoaccess), STATUS_FILE_IS_A_DIRECTORY,
SE(ERRDOS, ERRunsup), STATUS_NOT_SUPPORTED,
SE(ERRSRV, ERRinvdevice), STATUS_BAD_DEVICE_TYPE,
SE(ERRSRV, ERRinvnetname), STATUS_BAD_NETWORK_NAME,
SE(ERRDOS, ERRdiffdevice), STATUS_NOT_SAME_DEVICE,
SE(ERRDOS, ERRremcd), STATUS_DIRECTORY_NOT_EMPTY,
SE(ERRSRV, ERRerror), 0,
};
struct Ent *p;
for(p=tab; p->status; p++)
if(p->status == err)
break;
return p->error;
}
int
smbmkerror(void)
{
static struct Ent {
int status;
char *str;
} tab[] = {
STATUS_ACCESS_DENIED, "permission denied",
STATUS_ACCESS_DENIED, "access permission denied",
STATUS_ACCESS_DENIED, "create prohibited",
STATUS_ACCESS_DENIED, "mounted directory forbids creation",
STATUS_DIRECTORY_NOT_EMPTY, "directory not empty",
STATUS_NO_SUCH_FILE, "no such file",
STATUS_OBJECT_NAME_NOT_FOUND, "name not found",
STATUS_OBJECT_PATH_NOT_FOUND, "directory entry not found",
STATUS_OBJECT_PATH_NOT_FOUND, "not a directory",
STATUS_OBJECT_PATH_NOT_FOUND, "does not exist",
STATUS_OBJECT_PATH_SYNTAX_BAD, "bad character",
STATUS_OBJECT_PATH_SYNTAX_BAD, "file name syntax",
STATUS_OBJECT_NAME_COLLISION, "file already exists",
STATUS_FILE_IS_A_DIRECTORY, "is a directory",
/* kenfs */
STATUS_OBJECT_NAME_COLLISION, "create/wstat -- file exists",
STATUS_ACCESS_DENIED, "wstat -- not owner",
STATUS_ACCESS_DENIED, "wstat -- not in group",
/* unknown error */
STATUS_INVALID_SMB, nil,
};
char buf[ERRMAX];
struct Ent *p;
rerrstr(buf, sizeof(buf));
for(p = tab; p->str; p++)
if(strstr(buf, p->str))
break;
if(debug)
fprint(2, "smbmkerror: %s -> %lux\n", buf, (ulong)p->status);
return p->status;
}