1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 *   Copyright (C) 2020, Microsoft Corporation.
4 *
5 *   Author(s): Steve French <stfrench@microsoft.com>
6 *              Suresh Jayaraman <sjayaraman@suse.de>
7 *              Jeff Layton <jlayton@kernel.org>
8 */
9
10#include <linux/fs.h>
11#include <linux/slab.h>
12#include <linux/inet.h>
13#include <linux/ctype.h>
14#include "cifsglob.h"
15#include "cifsproto.h"
16
17/* extract the host portion of the UNC string */
18char *extract_hostname(const char *unc)
19{
20	const char *src;
21	char *dst, *delim;
22	unsigned int len;
23
24	/* skip double chars at beginning of string */
25	/* BB: check validity of these bytes? */
26	if (strlen(unc) < 3)
27		return ERR_PTR(-EINVAL);
28	for (src = unc; *src && *src == '\\'; src++)
29		;
30	if (!*src)
31		return ERR_PTR(-EINVAL);
32
33	/* delimiter between hostname and sharename is always '\\' now */
34	delim = strchr(src, '\\');
35	if (!delim)
36		return ERR_PTR(-EINVAL);
37
38	len = delim - src;
39	dst = kmalloc((len + 1), GFP_KERNEL);
40	if (dst == NULL)
41		return ERR_PTR(-ENOMEM);
42
43	memcpy(dst, src, len);
44	dst[len] = '\0';
45
46	return dst;
47}
48
49char *extract_sharename(const char *unc)
50{
51	const char *src;
52	char *delim, *dst;
53
54	/* skip double chars at the beginning */
55	src = unc + 2;
56
57	/* share name is always preceded by '\\' now */
58	delim = strchr(src, '\\');
59	if (!delim)
60		return ERR_PTR(-EINVAL);
61	delim++;
62
63	/* caller has to free the memory */
64	dst = kstrdup(delim, GFP_KERNEL);
65	if (!dst)
66		return ERR_PTR(-ENOMEM);
67
68	return dst;
69}
70