2020-12-12 05:22:04 +03:00
// 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 >
*/
2020-12-12 21:49:28 +03:00
# include <linux/fs.h>
2020-12-12 05:22:04 +03:00
# include <linux/slab.h>
2020-12-12 21:49:28 +03:00
# include <linux/inet.h>
# include <linux/ctype.h>
# include "cifsglob.h"
2020-12-12 05:22:04 +03:00
# 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 */
2021-03-05 23:02:34 +03:00
dst = kstrdup ( delim , GFP_KERNEL ) ;
2020-12-12 05:22:04 +03:00
if ( ! dst )
return ERR_PTR ( - ENOMEM ) ;
return dst ;
}