@@ -52,6 +52,94 @@
#define CIFS_PORT 445
#define RFC1001_PORT 139
+/* mounting option values */
+enum CIFS_MOUNT_TOKEN {
+ CIFS_TOKEN_ERROR = -1,
+ USERXATTR = 1,
+ NO_USERXATTR = 2,
+ USER = 3,
+ PASS = 4,
+ IP = 5,
+ ADDR = 6,
+ SEC = 7,
+ UNC = 8,
+ TARGET = 9,
+ PATH = 10,
+ DOMAIN = 11,
+ WORKGROUP = 12,
+ PREFIXPATH = 13,
+ IOCHARSET = 14,
+ UID = 15,
+ FORCE_UID = 16,
+ NO_FORCE_UID = 17,
+ GID = 18,
+ FORCE_GID = 19,
+ NO_FORCE_GID = 20,
+ FILEMODE = 21,
+ DIRMODE = 22,
+ PORT = 23,
+ RSIZE = 24,
+ WSIZE = 25,
+ SOCKOPT = 26,
+ NETBIOSNAME = 27,
+ SERVERNAME = 28,
+ CREDENTIALS = 29,
+ VERSION = 30,
+ GUEST = 31,
+ RW = 32,
+ RO = 33,
+ NO_BLOCKSEND = 34,
+ NO_AUTOTUNE = 35,
+ NO_AUTO = 36,
+ SUID = 37,
+ NO_SUID = 38,
+ EXEC = 39,
+ NO_EXEC = 40,
+ DEV = 41,
+ NO_DEV = 42,
+ HARD = 43,
+ NO_HARD = 44,
+ SOFT = 45,
+ NO_SOFT = 46,
+ PERM = 47,
+ NO_PERM = 48,
+ MAPCHARS = 49,
+ NO_MAPCHARS = 50,
+ SFU = 51,
+ NO_SFU = 52,
+ NO_DFS = 53,
+ POSIXPATHS = 54,
+ NO_POSIXPATHS = 55,
+ NO_UNIX = 56,
+ NO_LINUX = 57,
+ NO_CASE = 58,
+ IGNORECASE = 59,
+ BRL = 60,
+ NO_BRL = 61,
+ NO_LOCK = 62,
+ FORCE_MANDATORYLOCK = 63,
+ SETUIDS = 64,
+ NO_SETUIDS = 65,
+ DYNPERM = 66,
+ NO_DYNPERM = 67,
+ INTR = 68,
+ NO_INTR = 69,
+ STRICTSYNC = 70,
+ NO_STRICTSYNC = 71,
+ SERVERINO = 72,
+ NO_SERVERINO = 73,
+ ACL = 74,
+ NO_ACL = 75,
+ CIFSACL = 76,
+ NO_CIFSACL = 77,
+ LOCALLEASE = 78,
+ SIGN = 79,
+ SEAL = 80,
+ DIRECT = 81,
+ FORCE_DIRECT = 82,
+ NO_AC = 83
+};
+
extern void SMBNTencrypt(unsigned char *passwd, unsigned char *c8,
unsigned char *p24);
@@ -797,6 +885,184 @@ extract_hostname(const char *unc)
return dst;
}
+/* returns the CIFS_MOUNT_TOKEN value that represents 'option' */
+static int cifs_parse_mount_token(const char *option)
+{
+ if (option == NULL)
+ return CIFS_TOKEN_ERROR;
+
+ if (strnicmp(option, "user_xattr", 10) == 0)
+ return USERXATTR;
+ if (strnicmp(option, "nouser_xattr", 12) == 0)
+ return NO_USERXATTR;
+ if (strnicmp(option, "user", 4) == 0)
+ return USER;
+ if (strnicmp(option, "pass", 4) == 0)
+ return PASS;
+ if (strnicmp(option, "ip", 2) == 0)
+ return IP;
+ if (strnicmp(option, "addr", 4) == 0)
+ return ADDR;
+ if (strnicmp(option, "sec", 3) == 0)
+ return SEC;
+ if (strnicmp(option, "unc", 3) == 0)
+ return UNC;
+ if (strnicmp(option, "target", 6) == 0)
+ return TARGET;
+ if (strnicmp(option, "path", 4) == 0)
+ return PATH;
+ if (strnicmp(option, "domain", 3) == 0)
+ return DOMAIN;
+ if (strnicmp(option, "workgroup", 5) == 0)
+ return WORKGROUP;
+ if (strnicmp(option, "prefixpath", 10) == 0)
+ return PREFIXPATH;
+ if (strnicmp(option, "iocharset", 9) == 0)
+ return IOCHARSET;
+ if (strnicmp(option, "uid", 3) == 0)
+ return UID;
+ if (strnicmp(option, "forceuid", 8) == 0)
+ return FORCE_UID;
+ if (strnicmp(option, "noforceuid", 10) == 0)
+ return NO_FORCE_UID;
+ if (strnicmp(option, "gid", 3) == 0)
+ return GID;
+ if (strnicmp(option, "forcegid", 8) == 0)
+ return FORCE_GID;
+ if (strnicmp(option, "noforcegid", 10) == 0)
+ return NO_FORCE_GID;
+ if (strnicmp(option, "file_mode", 4) == 0)
+ return FILEMODE;
+ /* dir_mode || dirmode */
+ if (strnicmp(option, "dir", 3) == 0)
+ return DIRMODE;
+ if (strnicmp(option, "port", 4) == 0)
+ return PORT;
+ if (strnicmp(option, "rsize", 5) == 0)
+ return RSIZE;
+ if (strnicmp(option, "wsize", 5) == 0)
+ return WSIZE;
+ if (strnicmp(option, "sockopt", 5) == 0)
+ return SOCKOPT;
+ if (strnicmp(option, "netbiosname", 4) == 0)
+ return NETBIOSNAME;
+ if (strnicmp(option, "servername", 7) == 0)
+ return SERVERNAME;
+ if (strnicmp(option, "credentials", 4) == 0)
+ return CREDENTIALS;
+ if (strnicmp(option, "version", 3) == 0)
+ return VERSION;
+ if (strnicmp(option, "guest", 5) == 0)
+ return GUEST;
+ if (strnicmp(option, "rw", 2) == 0)
+ return RW;
+ if (strnicmp(option, "ro", 2) == 0)
+ return RO;
+ if (strnicmp(option, "noblocksend", 11) == 0)
+ return NO_BLOCKSEND;
+ if (strnicmp(option, "noautotune", 10) == 0)
+ return NO_AUTOTUNE;
+ if (strnicmp(option, "suid", 4) == 0)
+ return SUID;
+ if (strnicmp(option, "nosuid", 6) == 0)
+ return NO_SUID;
+ if (strnicmp(option, "exec", 4) == 0)
+ return EXEC;
+ if (strnicmp(option, "noexec", 6) == 0)
+ return NO_EXEC;
+ if (strnicmp(option, "dev", 3) == 0)
+ return DEV;
+ if (strnicmp(option, "nodev", 5) == 0)
+ return NO_DEV;
+ if (strnicmp(option, "noauto", 6) == 0)
+ return NO_AUTO;
+ if (strnicmp(option, "hard", 4) == 0)
+ return HARD;
+ if (strnicmp(option, "nohard", 6) == 0)
+ return NO_HARD;
+ if (strnicmp(option, "soft", 4) == 0)
+ return SOFT;
+ if (strnicmp(option, "nosoft", 6) == 0)
+ return NO_SOFT;
+ if (strnicmp(option, "perm", 4) == 0)
+ return PERM;
+ if (strnicmp(option, "noperm", 6) == 0)
+ return NO_PERM;
+ if (strnicmp(option, "mapchars", 8) == 0)
+ return MAPCHARS;
+ if (strnicmp(option, "nomapchars", 10) == 0)
+ return NO_MAPCHARS;
+ if (strnicmp(option, "sfu", 3) == 0)
+ return SFU;
+ if (strnicmp(option, "nosfu", 5) == 0)
+ return NO_SFU;
+ if (strnicmp(option, "nodfs", 5) == 0)
+ return NO_DFS;
+ if (strnicmp(option, "posixpaths", 10) == 0)
+ return POSIXPATHS;
+ if (strnicmp(option, "noposixpaths", 12) == 0)
+ return NO_POSIXPATHS;
+ if (strnicmp(option, "nounix", 6) == 0)
+ return NO_UNIX;
+ if (strnicmp(option, "nolinux", 7) == 0)
+ return NO_LINUX;
+ if (strnicmp(option, "nocase", 6) == 0)
+ return NO_CASE;
+ if (strnicmp(option, "ignorecase", 10) == 0)
+ return IGNORECASE;
+ if (strnicmp(option, "brl", 3) == 0)
+ return BRL;
+ if (strnicmp(option, "nobrl", 5) == 0)
+ return NO_BRL;
+ if (strnicmp(option, "nolock", 6) == 0)
+ return NO_LOCK;
+ if (strnicmp(option, "forcemandatorylock", 9) == 0)
+ return FORCE_MANDATORYLOCK;
+ if (strnicmp(option, "setuids", 7) == 0)
+ return SETUIDS;
+ if (strnicmp(option, "nosetuids", 9) == 0)
+ return NO_SETUIDS;
+ if (strnicmp(option, "dynperm", 7) == 0)
+ return DYNPERM;
+ if (strnicmp(option, "nodynperm", 9) == 0)
+ return NO_DYNPERM;
+ if (strnicmp(option, "intr", 4) == 0)
+ return INTR;
+ if (strnicmp(option, "nointr", 6) == 0)
+ return NO_INTR;
+ if (strnicmp(option, "strictsync", 10) == 0)
+ return STRICTSYNC;
+ if (strnicmp(option, "nostrictsync", 12) == 0)
+ return NO_STRICTSYNC;
+ if (strnicmp(option, "serverino", 7) == 0)
+ return SERVERINO;
+ if (strnicmp(option, "noserverino", 9) == 0)
+ return NO_SERVERINO;
+ if (strnicmp(option, "cifsacl", 7) == 0)
+ return CIFSACL;
+ if (strnicmp(option, "nocifsacl", 9) == 0)
+ return NO_CIFSACL;
+ if (strnicmp(option, "acl", 3) == 0)
+ return ACL;
+ if (strnicmp(option, "noacl", 5) == 0)
+ return NO_ACL;
+ if (strnicmp(option, "locallease", 6) == 0)
+ return LOCALLEASE;
+ if (strnicmp(option, "sign", 4) == 0)
+ return SIGN;
+ if (strnicmp(option, "seal", 4) == 0)
+ return SEAL;
+ if (strnicmp(option, "direct", 6) == 0)
+ return DIRECT;
+ if (strnicmp(option, "forcedirectio", 13) == 0)
+ return FORCE_DIRECT;
+ if (strnicmp(option, "noac", 4) == 0)
+ return NO_AC;
+
+ return CIFS_TOKEN_ERROR;
+}
+
+
static int
cifs_parse_mount_options(char *options, const char *devname,
struct smb_vol *vol)