2007-10-08 15:15:28 +04:00
/*
Unix SMB / CIFS implementation .
Winbind daemon - miscellaneous other functions
Copyright ( C ) Tim Potter 2000
Copyright ( C ) Andrew Bartlett 2002
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 3 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 , see < http : //www.gnu.org/licenses/>.
*/
# include "includes.h"
# include "winbindd.h"
# undef DBGC_CLASS
# define DBGC_CLASS DBGC_WINBIND
2007-10-08 16:25:57 +04:00
static const struct winbindd_child_dispatch_table locator_dispatch_table [ ] ;
2007-10-08 15:15:28 +04:00
static struct winbindd_child static_locator_child ;
void init_locator_child ( void )
{
2007-12-13 14:27:57 +03:00
setup_child ( & static_locator_child ,
locator_dispatch_table ,
" log.winbindd " , " locator " ) ;
2007-10-08 15:15:28 +04:00
}
struct winbindd_child * locator_child ( void )
{
return & static_locator_child ;
}
void winbindd_dsgetdcname ( struct winbindd_cli_state * state )
{
state - > request . domain_name
[ sizeof ( state - > request . domain_name ) - 1 ] = ' \0 ' ;
2008-01-11 17:32:20 +03:00
DEBUG ( 3 , ( " [%5lu]: dsgetdcname for %s \n " , ( unsigned long ) state - > pid ,
2007-10-08 15:15:28 +04:00
state - > request . domain_name ) ) ;
sendto_child ( state , locator_child ( ) ) ;
}
2007-10-08 16:25:57 +04:00
static enum winbindd_result dual_dsgetdcname ( struct winbindd_domain * domain ,
struct winbindd_cli_state * state )
2007-10-08 15:15:28 +04:00
{
NTSTATUS result ;
2008-02-28 14:30:18 +03:00
struct netr_DsRGetDCNameInfo * info = NULL ;
2007-10-08 15:15:28 +04:00
const char * dc = NULL ;
state - > request . domain_name
[ sizeof ( state - > request . domain_name ) - 1 ] = ' \0 ' ;
2008-01-11 17:32:20 +03:00
DEBUG ( 3 , ( " [%5lu]: dsgetdcname for %s \n " , ( unsigned long ) state - > pid ,
2007-10-08 15:15:28 +04:00
state - > request . domain_name ) ) ;
2008-01-26 03:39:33 +03:00
result = dsgetdcname ( state - > mem_ctx , state - > request . domain_name ,
2007-10-08 15:15:28 +04:00
NULL , NULL , state - > request . flags , & info ) ;
if ( ! NT_STATUS_IS_OK ( result ) ) {
return WINBINDD_ERROR ;
}
2008-02-28 14:30:18 +03:00
if ( info - > dc_address ) {
dc = info - > dc_address ;
2007-10-08 15:15:28 +04:00
if ( ( dc [ 0 ] = = ' \\ ' ) & & ( dc [ 1 ] = = ' \\ ' ) ) {
dc + = 2 ;
}
}
2008-02-28 14:30:18 +03:00
if ( ( ! dc | | ! is_ipaddress_v4 ( dc ) ) & & info - > dc_unc ) {
dc = info - > dc_unc ;
2007-10-08 15:15:28 +04:00
}
if ( ! dc | | ! * dc ) {
return WINBINDD_ERROR ;
}
fstrcpy ( state - > response . data . dc_name , dc ) ;
return WINBINDD_OK ;
}
2007-10-08 16:25:57 +04:00
static const struct winbindd_child_dispatch_table locator_dispatch_table [ ] = {
2007-12-07 18:00:45 +03:00
{
. name = " DSGETDCNAME " ,
. struct_cmd = WINBINDD_DSGETDCNAME ,
. struct_fn = dual_dsgetdcname ,
} , {
. name = NULL ,
}
2007-10-08 16:25:57 +04:00
} ;