diff options
Diffstat (limited to 'fs/smb/client/unc.c')
| -rw-r--r-- | fs/smb/client/unc.c | 69 | 
1 files changed, 69 insertions, 0 deletions
diff --git a/fs/smb/client/unc.c b/fs/smb/client/unc.c new file mode 100644 index 000000000000..f6fc5e343ea4 --- /dev/null +++ b/fs/smb/client/unc.c @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + *   Copyright (C) 2020, Microsoft Corporation. + * + *   Author(s): Steve French <stfrench@microsoft.com> + *              Suresh Jayaraman <sjayaraman@suse.de> + *              Jeff Layton <jlayton@kernel.org> + */ + +#include <linux/fs.h> +#include <linux/slab.h> +#include <linux/inet.h> +#include <linux/ctype.h> +#include "cifsglob.h" +#include "cifsproto.h" + +/* extract the host portion of the UNC string */ +char *extract_hostname(const char *unc) +{ +	const char *src; +	char *dst, *delim; +	unsigned int len; + +	/* skip double chars at beginning of string */ +	/* BB: check validity of these bytes? */ +	if (strlen(unc) < 3) +		return ERR_PTR(-EINVAL); +	for (src = unc; *src && *src == '\\'; src++) +		; +	if (!*src) +		return ERR_PTR(-EINVAL); + +	/* delimiter between hostname and sharename is always '\\' now */ +	delim = strchr(src, '\\'); +	if (!delim) +		return ERR_PTR(-EINVAL); + +	len = delim - src; +	dst = kmalloc((len + 1), GFP_KERNEL); +	if (dst == NULL) +		return ERR_PTR(-ENOMEM); + +	memcpy(dst, src, len); +	dst[len] = '\0'; + +	return dst; +} + +char *extract_sharename(const char *unc) +{ +	const char *src; +	char *delim, *dst; + +	/* skip double chars at the beginning */ +	src = unc + 2; + +	/* share name is always preceded by '\\' now */ +	delim = strchr(src, '\\'); +	if (!delim) +		return ERR_PTR(-EINVAL); +	delim++; + +	/* caller has to free the memory */ +	dst = kstrdup(delim, GFP_KERNEL); +	if (!dst) +		return ERR_PTR(-ENOMEM); + +	return dst; +}  | 
