⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netmisc.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/* *   fs/cifs/netmisc.c * *   Copyright (c) International Business Machines  Corp., 2002 *   Author(s): Steve French (sfrench@us.ibm.com) * *   Error mapping routines from Samba libsmb/errormap.c *   Copyright (C) Andrew Tridgell 2001 * *   This program is free software;  you can redistribute it and/or modify *   it under the terms of the GNU General Public License as published by *   the Free Software Foundation; either version 2 of the License, or *   (at your option) any later version. * *   This program is distributed in the hope that it will be useful, *   but WITHOUT ANY WARRANTY;  without even the implied warranty of *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See *   the GNU General Public License for more details. * *   You should have received a copy of the GNU General Public License *   along with this program;  if not, write to the Free Software *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#include <linux/net.h>#include <linux/string.h>#include <linux/in.h>#include <linux/ctype.h>#include <linux/fs.h>#include <asm/div64.h>#include <asm/byteorder.h>#include <linux/inet.h>#include "cifsfs.h"#include "cifspdu.h"#include "cifsglob.h"#include "cifsproto.h"#include "smberr.h"#include "cifs_debug.h"#include "nterr.h"struct smb_to_posix_error {	__u16 smb_err;	int posix_code;};static const struct smb_to_posix_error mapping_table_ERRDOS[] = {	{ERRbadfunc, -EINVAL},	{ERRbadfile, -ENOENT},	{ERRbadpath, -ENOTDIR},	{ERRnofids, -EMFILE},	{ERRnoaccess, -EACCES},	{ERRbadfid, -EBADF},	{ERRbadmcb, -EIO},	{ERRnomem, -ENOMEM},	{ERRbadmem, -EFAULT},	{ERRbadenv, -EFAULT},	{ERRbadformat, -EINVAL},	{ERRbadaccess, -EACCES},	{ERRbaddata, -EIO},	{ERRbaddrive, -ENXIO},	{ERRremcd, -EACCES},	{ERRdiffdevice, -EXDEV},	{ERRnofiles, -ENOENT},	{ERRbadshare, -ETXTBSY},	{ERRlock, -EACCES},	{ERRunsup, -EINVAL},	{ERRnosuchshare, -ENXIO},	{ERRfilexists, -EEXIST},	{ERRinvparm, -EINVAL},	{ERRdiskfull, -ENOSPC},	{ERRinvname, -ENOENT},	{ERRinvlevel, -EOPNOTSUPP},	{ERRdirnotempty, -ENOTEMPTY},	{ERRnotlocked, -ENOLCK},	{ERRcancelviolation, -ENOLCK},	{ERRalreadyexists, -EEXIST},	{ERRmoredata, -EOVERFLOW},	{ERReasnotsupported, -EOPNOTSUPP},	{ErrQuota, -EDQUOT},	{ErrNotALink, -ENOLINK},	{ERRnetlogonNotStarted, -ENOPROTOOPT},	{ErrTooManyLinks, -EMLINK},	{0, 0}};static const struct smb_to_posix_error mapping_table_ERRSRV[] = {	{ERRerror, -EIO},	{ERRbadpw, -EACCES},  /* was EPERM */	{ERRbadtype, -EREMOTE},	{ERRaccess, -EACCES},	{ERRinvtid, -ENXIO},	{ERRinvnetname, -ENXIO},	{ERRinvdevice, -ENXIO},	{ERRqfull, -ENOSPC},	{ERRqtoobig, -ENOSPC},	{ERRqeof, -EIO},	{ERRinvpfid, -EBADF},	{ERRsmbcmd, -EBADRQC},	{ERRsrverror, -EIO},	{ERRbadBID, -EIO},	{ERRfilespecs, -EINVAL},	{ERRbadLink, -EIO},	{ERRbadpermits, -EINVAL},	{ERRbadPID, -ESRCH},	{ERRsetattrmode, -EINVAL},	{ERRpaused, -EHOSTDOWN},	{ERRmsgoff, -EHOSTDOWN},	{ERRnoroom, -ENOSPC},	{ERRrmuns, -EUSERS},	{ERRtimeout, -ETIME},	{ERRnoresource, -ENOBUFS},	{ERRtoomanyuids, -EUSERS},	{ERRbaduid, -EACCES},	{ERRusempx, -EIO},	{ERRusestd, -EIO},	{ERR_NOTIFY_ENUM_DIR, -ENOBUFS},	{ERRnoSuchUser, -EACCES},/*	{ERRaccountexpired, -EACCES},	{ERRbadclient, -EACCES},	{ERRbadLogonTime, -EACCES},	{ERRpasswordExpired, -EACCES},*/	{ERRaccountexpired, -EKEYEXPIRED},	{ERRbadclient, -EACCES},	{ERRbadLogonTime, -EACCES},	{ERRpasswordExpired, -EKEYEXPIRED},	{ERRnosupport, -EINVAL},	{0, 0}};static const struct smb_to_posix_error mapping_table_ERRHRD[] = {	{0, 0}};/* if the mount helper is missing we need to reverse the 1st slash   from '/' to backslash in order to format the UNC properly for   ip address parsing and for tree connect (unless the user   remembered to put the UNC name in properly). Fortunately we do   not have to call this twice (we check for IPv4 addresses   first, so it is already converted by the time we   try IPv6 addresses */static int canonicalize_unc(char *cp){	int i;	for (i = 0; i <= 46 /* INET6_ADDRSTRLEN */ ; i++) {		if (cp[i] == 0)			break;		if (cp[i] == '\\')			break;		if (cp[i] == '/') {#ifdef CONFIG_CIFS_DEBUG2			cFYI(1, ("change slash to backslash in malformed UNC"));#endif			cp[i] = '\\';			return 1;		}	}	return 0;}/* Convert string containing dotted ip address to binary form *//* returns 0 if invalid address */intcifs_inet_pton(int address_family, char *cp, void *dst){	int ret = 0;	/* calculate length by finding first slash or NULL */	if (address_family == AF_INET) {		ret = in4_pton(cp, -1 /* len */, dst, '\\', NULL);		if (ret == 0) {			if (canonicalize_unc(cp))				ret = in4_pton(cp, -1, dst, '\\', NULL);		}	} else if (address_family == AF_INET6) {		ret = in6_pton(cp, -1 /* len */, dst , '\\', NULL);	}#ifdef CONFIG_CIFS_DEBUG2	cFYI(1, ("address conversion returned %d for %s", ret, cp));#endif	if (ret > 0)		ret = 1;	return ret;}/*****************************************************************************convert a NT status code to a dos class/code *****************************************************************************//* NT status -> dos error map */static const struct {	__u8 dos_class;	__u16 dos_code;	__u32 ntstatus;} ntstatus_to_dos_map[] = {	{	ERRDOS, ERRgeneral, NT_STATUS_UNSUCCESSFUL}, {	ERRDOS, ERRbadfunc, NT_STATUS_NOT_IMPLEMENTED}, {	ERRDOS, ERRinvlevel, NT_STATUS_INVALID_INFO_CLASS}, {	ERRDOS, 24, NT_STATUS_INFO_LENGTH_MISMATCH}, {	ERRHRD, ERRgeneral, NT_STATUS_ACCESS_VIOLATION}, {	ERRHRD, ERRgeneral, NT_STATUS_IN_PAGE_ERROR}, {	ERRHRD, ERRgeneral, NT_STATUS_PAGEFILE_QUOTA}, {	ERRDOS, ERRbadfid, NT_STATUS_INVALID_HANDLE}, {	ERRHRD, ERRgeneral, NT_STATUS_BAD_INITIAL_STACK}, {	ERRDOS, 193, NT_STATUS_BAD_INITIAL_PC}, {	ERRDOS, 87, NT_STATUS_INVALID_CID}, {	ERRHRD, ERRgeneral, NT_STATUS_TIMER_NOT_CANCELED}, {	ERRDOS, 87, NT_STATUS_INVALID_PARAMETER}, {	ERRDOS, ERRbadfile, NT_STATUS_NO_SUCH_DEVICE}, {	ERRDOS, ERRbadfile, NT_STATUS_NO_SUCH_FILE}, {	ERRDOS, ERRbadfunc, NT_STATUS_INVALID_DEVICE_REQUEST}, {	ERRDOS, 38, NT_STATUS_END_OF_FILE}, {	ERRDOS, 34, NT_STATUS_WRONG_VOLUME}, {	ERRDOS, 21, NT_STATUS_NO_MEDIA_IN_DEVICE}, {	ERRHRD, ERRgeneral, NT_STATUS_UNRECOGNIZED_MEDIA}, {	ERRDOS, 27, NT_STATUS_NONEXISTENT_SECTOR},/*	{ This NT error code was 'sqashed'	 from NT_STATUS_MORE_PROCESSING_REQUIRED to NT_STATUS_OK	 during the session setup } */	{	ERRDOS, ERRnomem, NT_STATUS_NO_MEMORY}, {	ERRDOS, 487, NT_STATUS_CONFLICTING_ADDRESSES}, {	ERRDOS, 487, NT_STATUS_NOT_MAPPED_VIEW}, {	ERRDOS, 87, NT_STATUS_UNABLE_TO_FREE_VM}, {	ERRDOS, 87, NT_STATUS_UNABLE_TO_DELETE_SECTION}, {	ERRDOS, 2142, NT_STATUS_INVALID_SYSTEM_SERVICE}, {	ERRHRD, ERRgeneral, NT_STATUS_ILLEGAL_INSTRUCTION}, {	ERRDOS, ERRnoaccess, NT_STATUS_INVALID_LOCK_SEQUENCE}, {	ERRDOS, ERRnoaccess, NT_STATUS_INVALID_VIEW_SIZE}, {	ERRDOS, 193, NT_STATUS_INVALID_FILE_FOR_SECTION}, {	ERRDOS, ERRnoaccess, NT_STATUS_ALREADY_COMMITTED},/*	{ This NT error code was 'sqashed'	 from NT_STATUS_ACCESS_DENIED to NT_STATUS_TRUSTED_RELATIONSHIP_FAILURE	 during the session setup }   */	{	ERRDOS, ERRnoaccess, NT_STATUS_ACCESS_DENIED}, {	ERRDOS, 111, NT_STATUS_BUFFER_TOO_SMALL}, {	ERRDOS, ERRbadfid, NT_STATUS_OBJECT_TYPE_MISMATCH}, {	ERRHRD, ERRgeneral, NT_STATUS_NONCONTINUABLE_EXCEPTION}, {	ERRHRD, ERRgeneral, NT_STATUS_INVALID_DISPOSITION}, {	ERRHRD, ERRgeneral, NT_STATUS_UNWIND}, {	ERRHRD, ERRgeneral, NT_STATUS_BAD_STACK}, {	ERRHRD, ERRgeneral, NT_STATUS_INVALID_UNWIND_TARGET}, {	ERRDOS, 158, NT_STATUS_NOT_LOCKED}, {	ERRHRD, ERRgeneral, NT_STATUS_PARITY_ERROR}, {	ERRDOS, 487, NT_STATUS_UNABLE_TO_DECOMMIT_VM}, {	ERRDOS, 487, NT_STATUS_NOT_COMMITTED}, {	ERRHRD, ERRgeneral, NT_STATUS_INVALID_PORT_ATTRIBUTES}, {	ERRHRD, ERRgeneral, NT_STATUS_PORT_MESSAGE_TOO_LONG}, {	ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_MIX}, {	ERRHRD, ERRgeneral, NT_STATUS_INVALID_QUOTA_LOWER}, {	ERRHRD, ERRgeneral, NT_STATUS_DISK_CORRUPT_ERROR}, {	ERRDOS, ERRbadfile, NT_STATUS_OBJECT_NAME_INVALID}, {	/* mapping changed since shell does lookup on * and expects file not found */	ERRDOS, ERRbadfile, NT_STATUS_OBJECT_NAME_NOT_FOUND}, {	ERRDOS, ERRalreadyexists, NT_STATUS_OBJECT_NAME_COLLISION}, {	ERRHRD, ERRgeneral, NT_STATUS_HANDLE_NOT_WAITABLE}, {	ERRDOS, ERRbadfid, NT_STATUS_PORT_DISCONNECTED}, {	ERRHRD, ERRgeneral, NT_STATUS_DEVICE_ALREADY_ATTACHED}, {	ERRDOS, 161, NT_STATUS_OBJECT_PATH_INVALID}, {	ERRDOS, ERRbadpath, NT_STATUS_OBJECT_PATH_NOT_FOUND}, {	ERRDOS, 161, NT_STATUS_OBJECT_PATH_SYNTAX_BAD}, {	ERRHRD, ERRgeneral, NT_STATUS_DATA_OVERRUN}, {	ERRHRD, ERRgeneral, NT_STATUS_DATA_LATE_ERROR}, {	ERRDOS, 23, NT_STATUS_DATA_ERROR}, {	ERRDOS, 23, NT_STATUS_CRC_ERROR}, {	ERRDOS, ERRnomem, NT_STATUS_SECTION_TOO_BIG}, {	ERRDOS, ERRnoaccess, NT_STATUS_PORT_CONNECTION_REFUSED}, {	ERRDOS, ERRbadfid, NT_STATUS_INVALID_PORT_HANDLE}, {	ERRDOS, ERRbadshare, NT_STATUS_SHARING_VIOLATION}, {	ERRHRD, ERRgeneral, NT_STATUS_QUOTA_EXCEEDED}, {	ERRDOS, 87, NT_STATUS_INVALID_PAGE_PROTECTION}, {	ERRDOS, 288, NT_STATUS_MUTANT_NOT_OWNED}, {	ERRDOS, 298, NT_STATUS_SEMAPHORE_LIMIT_EXCEEDED}, {	ERRDOS, 87, NT_STATUS_PORT_ALREADY_SET}, {	ERRDOS, 87, NT_STATUS_SECTION_NOT_IMAGE}, {	ERRDOS, 156, NT_STATUS_SUSPEND_COUNT_EXCEEDED}, {	ERRDOS, ERRnoaccess, NT_STATUS_THREAD_IS_TERMINATING}, {	ERRDOS, 87, NT_STATUS_BAD_WORKING_SET_LIMIT}, {	ERRDOS, 87, NT_STATUS_INCOMPATIBLE_FILE_MAP}, {	ERRDOS, 87, NT_STATUS_SECTION_PROTECTION}, {	ERRDOS, ERReasnotsupported, NT_STATUS_EAS_NOT_SUPPORTED}, {	ERRDOS, 255, NT_STATUS_EA_TOO_LARGE}, {	ERRHRD, ERRgeneral, NT_STATUS_NONEXISTENT_EA_ENTRY}, {	ERRHRD, ERRgeneral, NT_STATUS_NO_EAS_ON_FILE}, {	ERRHRD, ERRgeneral, NT_STATUS_EA_CORRUPT_ERROR}, {	ERRDOS, ERRlock, NT_STATUS_FILE_LOCK_CONFLICT}, {	ERRDOS, ERRlock, NT_STATUS_LOCK_NOT_GRANTED}, {	ERRDOS, ERRbadfile, NT_STATUS_DELETE_PENDING}, {	ERRDOS, ERRunsup, NT_STATUS_CTL_FILE_NOT_SUPPORTED}, {	ERRHRD, ERRgeneral, NT_STATUS_UNKNOWN_REVISION}, {	ERRHRD, ERRgeneral, NT_STATUS_REVISION_MISMATCH}, {	ERRHRD, ERRgeneral, NT_STATUS_INVALID_OWNER}, {	ERRHRD, ERRgeneral, NT_STATUS_INVALID_PRIMARY_GROUP}, {	ERRHRD, ERRgeneral, NT_STATUS_NO_IMPERSONATION_TOKEN}, {	ERRHRD, ERRgeneral, NT_STATUS_CANT_DISABLE_MANDATORY}, {	ERRDOS, 2215, NT_STATUS_NO_LOGON_SERVERS}, {	ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_LOGON_SESSION}, {	ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_PRIVILEGE}, {	ERRDOS, ERRnoaccess, NT_STATUS_PRIVILEGE_NOT_HELD}, {	ERRHRD, ERRgeneral, NT_STATUS_INVALID_ACCOUNT_NAME}, {	ERRHRD, ERRgeneral, NT_STATUS_USER_EXISTS},/*	{ This NT error code was 'sqashed'	 from NT_STATUS_NO_SUCH_USER to NT_STATUS_LOGON_FAILURE	 during the session setup } */	{	ERRDOS, ERRnoaccess, NT_STATUS_NO_SUCH_USER}, { /* could map to 2238 */	ERRHRD, ERRgeneral, NT_STATUS_GROUP_EXISTS}, {	ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_GROUP}, {	ERRHRD, ERRgeneral, NT_STATUS_MEMBER_IN_GROUP}, {	ERRHRD, ERRgeneral, NT_STATUS_MEMBER_NOT_IN_GROUP}, {	ERRHRD, ERRgeneral, NT_STATUS_LAST_ADMIN},/*	{ This NT error code was 'sqashed'	 from NT_STATUS_WRONG_PASSWORD to NT_STATUS_LOGON_FAILURE	 during the session setup } */	{	ERRSRV, ERRbadpw, NT_STATUS_WRONG_PASSWORD}, {	ERRHRD, ERRgeneral, NT_STATUS_ILL_FORMED_PASSWORD}, {	ERRHRD, ERRgeneral, NT_STATUS_PASSWORD_RESTRICTION}, {	ERRDOS, ERRnoaccess, NT_STATUS_LOGON_FAILURE}, {	ERRHRD, ERRgeneral, NT_STATUS_ACCOUNT_RESTRICTION}, {	ERRSRV, ERRbadLogonTime, NT_STATUS_INVALID_LOGON_HOURS}, {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -