blob: f6fc5e343ea42b1e7e9b7ed4a504c0cc0db9cb6a [file] [log] [blame]
Steve French047092f2020-12-11 20:22:04 -06001// 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
Steve Frenchee0dce42020-12-12 12:49:28 -060010#include <linux/fs.h>
Steve French047092f2020-12-11 20:22:04 -060011#include <linux/slab.h>
Steve Frenchee0dce42020-12-12 12:49:28 -060012#include <linux/inet.h>
13#include <linux/ctype.h>
14#include "cifsglob.h"
Steve French047092f2020-12-11 20:22:04 -060015#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;
Steve French047092f2020-12-11 20:22:04 -060053
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++;
Steve French047092f2020-12-11 20:22:04 -060062
63 /* caller has to free the memory */
Al Viro8d767222021-03-05 15:02:34 -050064 dst = kstrdup(delim, GFP_KERNEL);
Steve French047092f2020-12-11 20:22:04 -060065 if (!dst)
66 return ERR_PTR(-ENOMEM);
67
68 return dst;
69}