2004-11-25 20:03:46 +00:00
/*
Unix SMB / CIFS implementation .
UUID / GUID / policy_handle functions
Copyright ( C ) Theodore Ts ' o 1996 , 1997 ,
Copyright ( C ) Jim McDonough 2002.
Copyright ( C ) Andrew Tridgell 2003.
Copyright ( C ) Stefan ( metze ) Metzmacher 2004.
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include "includes.h"
2005-01-31 17:16:45 +00:00
# include "system/network.h"
void ndr_print_ipv4_addr ( struct ndr_print * ndr , const char * name , const struct ipv4_addr * _ip )
{
struct ipv4_addr ip ;
ip . addr = htonl ( _ip - > addr ) ;
ndr - > print ( ndr , " %-25s: %s " , name , sys_inet_ntoa ( ip ) ) ;
}
2004-11-25 20:03:46 +00:00
/*
build a GUID from a string
*/
NTSTATUS GUID_from_string ( const char * s , struct GUID * guid )
{
NTSTATUS status = NT_STATUS_INVALID_PARAMETER ;
uint32_t time_low ;
uint32_t time_mid , time_hi_and_version ;
uint32_t clock_seq [ 2 ] ;
uint32_t node [ 6 ] ;
int i ;
2004-12-08 10:24:10 +00:00
if ( s = = NULL ) {
return NT_STATUS_INVALID_PARAMETER ;
}
2004-11-25 20:03:46 +00:00
if ( 11 = = sscanf ( s , " %08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x " ,
& time_low , & time_mid , & time_hi_and_version ,
& clock_seq [ 0 ] , & clock_seq [ 1 ] ,
& node [ 0 ] , & node [ 1 ] , & node [ 2 ] , & node [ 3 ] , & node [ 4 ] , & node [ 5 ] ) ) {
status = NT_STATUS_OK ;
} else if ( 11 = = sscanf ( s , " {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x} " ,
& time_low , & time_mid , & time_hi_and_version ,
& clock_seq [ 0 ] , & clock_seq [ 1 ] ,
& node [ 0 ] , & node [ 1 ] , & node [ 2 ] , & node [ 3 ] , & node [ 4 ] , & node [ 5 ] ) ) {
status = NT_STATUS_OK ;
}
if ( ! NT_STATUS_IS_OK ( status ) ) {
return status ;
}
guid - > time_low = time_low ;
guid - > time_mid = time_mid ;
guid - > time_hi_and_version = time_hi_and_version ;
guid - > clock_seq [ 0 ] = clock_seq [ 0 ] ;
guid - > clock_seq [ 1 ] = clock_seq [ 1 ] ;
for ( i = 0 ; i < 6 ; i + + ) {
guid - > node [ i ] = node [ i ] ;
}
return NT_STATUS_OK ;
}
/* generate a random GUID */
struct GUID GUID_random ( void )
{
struct GUID guid ;
generate_random_buffer ( ( uint8_t * ) & guid , sizeof ( guid ) ) ;
guid . clock_seq [ 0 ] = ( guid . clock_seq [ 0 ] & 0x3F ) | 0x80 ;
guid . time_hi_and_version = ( guid . time_hi_and_version & 0x0FFF ) | 0x4000 ;
return guid ;
}
BOOL GUID_all_zero ( const struct GUID * u )
{
if ( u - > time_low ! = 0 | |
u - > time_mid ! = 0 | |
u - > time_hi_and_version ! = 0 | |
u - > clock_seq [ 0 ] ! = 0 | |
u - > clock_seq [ 1 ] ! = 0 | |
! all_zero ( u - > node , 6 ) ) {
return False ;
}
return True ;
}
BOOL GUID_equal ( const struct GUID * u1 , const struct GUID * u2 )
{
if ( u1 - > time_low ! = u2 - > time_low | |
u1 - > time_mid ! = u2 - > time_mid | |
u1 - > time_hi_and_version ! = u2 - > time_hi_and_version | |
u1 - > clock_seq [ 0 ] ! = u2 - > clock_seq [ 0 ] | |
u1 - > clock_seq [ 1 ] ! = u2 - > clock_seq [ 1 ] | |
memcmp ( u1 - > node , u2 - > node , 6 ) ! = 0 ) {
return False ;
}
return True ;
}
/*
its useful to be able to display these in debugging messages
*/
char * GUID_string ( TALLOC_CTX * mem_ctx , const struct GUID * guid )
{
return talloc_asprintf ( mem_ctx ,
" %08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x " ,
guid - > time_low , guid - > time_mid ,
guid - > time_hi_and_version ,
guid - > clock_seq [ 0 ] ,
guid - > clock_seq [ 1 ] ,
guid - > node [ 0 ] , guid - > node [ 1 ] ,
guid - > node [ 2 ] , guid - > node [ 3 ] ,
guid - > node [ 4 ] , guid - > node [ 5 ] ) ;
}
char * GUID_string2 ( TALLOC_CTX * mem_ctx , const struct GUID * guid )
{
return talloc_asprintf ( mem_ctx ,
" {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x} " ,
guid - > time_low , guid - > time_mid ,
guid - > time_hi_and_version ,
guid - > clock_seq [ 0 ] ,
guid - > clock_seq [ 1 ] ,
guid - > node [ 0 ] , guid - > node [ 1 ] ,
guid - > node [ 2 ] , guid - > node [ 3 ] ,
guid - > node [ 4 ] , guid - > node [ 5 ] ) ;
}
void ndr_print_GUID ( struct ndr_print * ndr , const char * name , const struct GUID * guid )
{
ndr - > print ( ndr , " %-25s: %s " , name , GUID_string ( ndr , guid ) ) ;
}
BOOL policy_handle_empty ( struct policy_handle * h )
{
return ( h - > handle_type = = 0 & & GUID_all_zero ( & h - > uuid ) ) ;
}