2005-10-16 02:01:15 +04:00
/*
Unix SMB / CIFS implementation .
Command backend for wbinfo - - getdcname
Copyright ( C ) Volker Lendecke 2005
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"
# include "libcli/composite/composite.h"
# include "winbind/wb_server.h"
# include "smbd/service_stream.h"
2005-10-19 17:45:44 +04:00
# include "smbd/service_task.h"
2005-10-16 02:01:15 +04:00
# include "librpc/gen_ndr/ndr_netlogon.h"
static void composite_netr_GetAnyDCName_recv_rpc ( struct rpc_request * req ) ;
static struct composite_context * composite_netr_GetAnyDCName_send ( struct dcerpc_pipe * p ,
TALLOC_CTX * mem_ctx ,
struct netr_GetAnyDCName * r )
{
struct composite_context * result ;
struct rpc_request * req ;
result = talloc ( mem_ctx , struct composite_context ) ;
if ( result = = NULL ) goto failed ;
result - > state = COMPOSITE_STATE_IN_PROGRESS ;
result - > async . fn = NULL ;
result - > event_ctx = p - > conn - > event_ctx ;
req = dcerpc_netr_GetAnyDCName_send ( p , mem_ctx , r ) ;
if ( req = = NULL ) goto failed ;
req - > async . callback = composite_netr_GetAnyDCName_recv_rpc ;
req - > async . private = result ;
return result ;
failed :
talloc_free ( result ) ;
return NULL ;
}
static void composite_netr_GetAnyDCName_recv_rpc ( struct rpc_request * req )
{
struct composite_context * ctx =
talloc_get_type ( req - > async . private , struct composite_context ) ;
ctx - > status = dcerpc_ndr_request_recv ( req ) ;
if ( ! composite_is_ok ( ctx ) ) return ;
composite_done ( ctx ) ;
}
2005-10-19 17:45:44 +04:00
static NTSTATUS composite_netr_GetAnyDCName_recv ( struct composite_context * ctx )
2005-10-16 02:01:15 +04:00
{
NTSTATUS status = composite_wait ( ctx ) ;
talloc_free ( ctx ) ;
return status ;
}
struct cmd_getdcname_state {
struct composite_context * ctx ;
const char * domain_name ;
struct netr_GetAnyDCName g ;
} ;
2005-10-19 17:45:44 +04:00
static struct composite_context * getdcname_send_req ( struct wbsrv_domain * domain ,
void * p ) ;
2005-10-16 02:01:15 +04:00
static NTSTATUS getdcname_recv_req ( struct composite_context * ctx , void * p ) ;
2005-10-19 17:45:44 +04:00
struct composite_context * wb_cmd_getdcname_send ( struct wbsrv_service * service ,
struct wbsrv_domain * domain ,
const char * domain_name )
2005-10-16 02:01:15 +04:00
{
struct cmd_getdcname_state * state ;
state = talloc ( NULL , struct cmd_getdcname_state ) ;
2005-10-19 17:45:44 +04:00
state - > domain_name = talloc_strdup ( state , domain_name ) ;
state - > ctx = wb_domain_request_send ( state , service ,
service - > primary_sid ,
getdcname_send_req ,
getdcname_recv_req ,
state ) ;
2005-10-16 02:01:15 +04:00
if ( state - > ctx = = NULL ) {
talloc_free ( state ) ;
return NULL ;
}
state - > ctx - > private_data = state ;
return state - > ctx ;
}
2005-10-19 17:45:44 +04:00
static struct composite_context * getdcname_send_req ( struct wbsrv_domain * domain , void * p )
2005-10-16 02:01:15 +04:00
{
struct cmd_getdcname_state * state =
talloc_get_type ( p , struct cmd_getdcname_state ) ;
state - > g . in . logon_server = talloc_asprintf (
state , " \\ \\ %s " ,
2005-10-19 17:45:44 +04:00
dcerpc_server_name ( domain - > netlogon_pipe ) ) ;
2005-10-16 02:01:15 +04:00
state - > g . in . domainname = state - > domain_name ;
2005-10-19 17:45:44 +04:00
return composite_netr_GetAnyDCName_send ( domain - > netlogon_pipe ,
2005-10-16 02:01:15 +04:00
state , & state - > g ) ;
}
static NTSTATUS getdcname_recv_req ( struct composite_context * ctx , void * p )
{
struct cmd_getdcname_state * state =
talloc_get_type ( p , struct cmd_getdcname_state ) ;
NTSTATUS status ;
status = composite_netr_GetAnyDCName_recv ( ctx ) ;
NT_STATUS_NOT_OK_RETURN ( status ) ;
if ( ! W_ERROR_IS_OK ( state - > g . out . result ) ) {
return werror_to_ntstatus ( state - > g . out . result ) ;
}
return NT_STATUS_OK ;
}
NTSTATUS wb_cmd_getdcname_recv ( struct composite_context * c ,
TALLOC_CTX * mem_ctx ,
const char * * dcname )
{
struct cmd_getdcname_state * state =
talloc_get_type ( c - > private_data , struct cmd_getdcname_state ) ;
NTSTATUS status = composite_wait ( c ) ;
if ( NT_STATUS_IS_OK ( status ) ) {
const char * p = state - > g . out . dcname ;
if ( * p = = ' \\ ' ) p + = 1 ;
if ( * p = = ' \\ ' ) p + = 1 ;
* dcname = talloc_strdup ( mem_ctx , p ) ;
if ( * dcname = = NULL ) {
status = NT_STATUS_NO_MEMORY ;
}
}
talloc_free ( state ) ;
return status ;
}