cinap_lenrekadd cifsd111fce615 years agoHistory
129 lines · 3.4 KB · C
RawDownload
#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;}