2000-05-10 14:41:59 +04:00
# define OLD_NTDOMAIN 1
1998-03-12 00:11:04 +03:00
/*
* Unix SMB / Netbios implementation .
* Version 1.9 .
* RPC Pipe client / server routines
* Copyright ( C ) Andrew Tridgell 1992 - 1997 ,
* Copyright ( C ) Luke Kenneth Casson Leighton 1996 - 1997 ,
* Copyright ( C ) Paul Ashton 1997.
*
* 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"
extern int DEBUGLEVEL ;
1998-04-25 05:12:08 +04:00
extern pstring global_myname ;
1998-03-12 00:11:04 +03:00
/*******************************************************************
1999-12-13 16:27:58 +03:00
Fill in a share info level 1 structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
static void init_srv_share_info_1 ( SRV_SHARE_INFO_1 * sh1 , int snum )
{
int len_net_name ;
pstring net_name ;
pstring remark ;
uint32 type ;
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
pstrcpy ( net_name , lp_servicename ( snum ) ) ;
pstrcpy ( remark , lp_comment ( snum ) ) ;
pstring_sub ( remark , " %S " , lp_servicename ( snum ) ) ;
len_net_name = strlen ( net_name ) ;
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
/* work out the share type */
type = STYPE_DISKTREE ;
if ( lp_print_ok ( snum ) )
type = STYPE_PRINTQ ;
if ( strequal ( " IPC$ " , net_name ) )
type = STYPE_IPC ;
if ( net_name [ len_net_name ] = = ' $ ' )
type | = STYPE_HIDDEN ;
init_srv_share_info1 ( & sh1 - > info_1 , net_name , type , remark ) ;
init_srv_share_info1_str ( & sh1 - > info_1_str , net_name , remark ) ;
}
/*******************************************************************
Fill in a share info level 2 structure .
1998-03-12 00:11:04 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static void init_srv_share_info_2 ( SRV_SHARE_INFO_2 * sh2 , int snum )
1998-03-12 00:11:04 +03:00
{
int len_net_name ;
pstring net_name ;
pstring remark ;
1999-12-13 16:27:58 +03:00
pstring path ;
pstring passwd ;
1998-03-12 00:11:04 +03:00
uint32 type ;
pstrcpy ( net_name , lp_servicename ( snum ) ) ;
1999-12-13 16:27:58 +03:00
pstrcpy ( remark , lp_comment ( snum ) ) ;
pstring_sub ( remark , " %S " , lp_servicename ( snum ) ) ;
pstrcpy ( path , lp_pathname ( snum ) ) ;
pstrcpy ( passwd , " " ) ;
1998-03-12 00:11:04 +03:00
len_net_name = strlen ( net_name ) ;
/* work out the share type */
type = STYPE_DISKTREE ;
1999-12-13 16:27:58 +03:00
if ( lp_print_ok ( snum ) )
type = STYPE_PRINTQ ;
if ( strequal ( " IPC$ " , net_name ) )
type = STYPE_IPC ;
if ( net_name [ len_net_name ] = = ' $ ' )
type | = STYPE_HIDDEN ;
init_srv_share_info2 ( & sh2 - > info_2 , net_name , type , remark , 0 , 0xffffffff , 1 , path , passwd ) ;
init_srv_share_info2_str ( & sh2 - > info_2_str , net_name , remark , path , passwd ) ;
1998-03-12 00:11:04 +03:00
}
2000-04-28 22:36:47 +04:00
/***************************************************************************
Fill in a share info level 1005 structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void init_srv_share_info_1005 ( SRV_SHARE_INFO_1005 * sh1005 , int snum )
{
sh1005 - > dfs_root_flag = 0 ;
2000-05-26 21:10:40 +04:00
# ifdef WITH_MSDFS
2000-05-16 05:13:16 +04:00
if ( lp_host_msdfs ( ) & & lp_msdfs_root ( snum ) )
2000-04-28 22:36:47 +04:00
sh1005 - > dfs_root_flag = 3 ;
# endif
}
1998-03-12 00:11:04 +03:00
/*******************************************************************
1999-12-13 16:27:58 +03:00
Fill in a share info structure .
1998-03-12 00:11:04 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static BOOL init_srv_share_info_ctr ( SRV_SHARE_INFO_CTR * ctr ,
uint32 info_level , uint32 * resume_hnd , uint32 * total_entries )
1998-03-12 00:11:04 +03:00
{
1999-12-13 16:27:58 +03:00
int num_entries = 0 ;
int num_services = lp_numservices ( ) ;
int snum ;
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " init_srv_share_info_ctr \n " ) ) ;
ZERO_STRUCTPN ( ctr ) ;
ctr - > info_level = ctr - > switch_value = info_level ;
* resume_hnd = 0 ;
/* Count the number of entries. */
for ( snum = 0 ; snum < num_services ; snum + + ) {
if ( lp_browseable ( snum ) & & lp_snum_ok ( snum ) )
num_entries + + ;
1998-03-12 00:11:04 +03:00
}
1999-12-13 16:27:58 +03:00
* total_entries = num_entries ;
ctr - > num_entries2 = ctr - > num_entries = num_entries ;
ctr - > ptr_share_info = ctr - > ptr_entries = 1 ;
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
if ( ! num_entries )
return True ;
switch ( info_level ) {
case 1 :
1998-03-12 00:11:04 +03:00
{
1999-12-13 16:27:58 +03:00
SRV_SHARE_INFO_1 * info1 ;
int i = 0 ;
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
info1 = malloc ( num_entries * sizeof ( SRV_SHARE_INFO_1 ) ) ;
for ( snum = * resume_hnd ; snum < num_services ; snum + + ) {
if ( lp_browseable ( snum ) & & lp_snum_ok ( snum ) ) {
init_srv_share_info_1 ( & info1 [ i + + ] , snum ) ;
}
1998-03-12 00:11:04 +03:00
}
1999-12-13 16:27:58 +03:00
ctr - > share . info1 = info1 ;
break ;
1998-03-12 00:11:04 +03:00
}
1999-12-13 16:27:58 +03:00
case 2 :
1998-03-12 00:11:04 +03:00
{
1999-12-13 16:27:58 +03:00
SRV_SHARE_INFO_2 * info2 ;
int i = 0 ;
info2 = malloc ( num_entries * sizeof ( SRV_SHARE_INFO_2 ) ) ;
for ( snum = * resume_hnd ; snum < num_services ; snum + + ) {
if ( lp_browseable ( snum ) & & lp_snum_ok ( snum ) ) {
init_srv_share_info_2 ( & info2 [ i + + ] , snum ) ;
}
}
ctr - > share . info2 = info2 ;
break ;
1998-03-12 00:11:04 +03:00
}
1999-12-13 16:27:58 +03:00
default :
DEBUG ( 5 , ( " init_srv_share_info_ctr: unsupported switch value %d \n " , info_level ) ) ;
return False ;
}
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
return True ;
}
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
/*******************************************************************
Inits a SRV_R_NET_SHARE_ENUM structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
static void init_srv_r_net_share_enum ( SRV_R_NET_SHARE_ENUM * r_n ,
uint32 info_level , uint32 resume_hnd )
1998-03-12 00:11:04 +03:00
{
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " init_srv_r_net_share_enum: %d \n " , __LINE__ ) ) ;
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
if ( init_srv_share_info_ctr ( & r_n - > ctr , info_level ,
& resume_hnd , & r_n - > total_entries ) ) {
r_n - > status = 0x0 ;
} else {
r_n - > status = 0xC0000000 | NT_STATUS_INVALID_INFO_CLASS ;
}
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
init_enum_hnd ( & r_n - > enum_hnd , resume_hnd ) ;
1998-03-12 00:11:04 +03:00
}
/*******************************************************************
1999-12-13 16:27:58 +03:00
Net share enum .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
static BOOL srv_reply_net_share_enum ( SRV_Q_NET_SHARE_ENUM * q_n ,
prs_struct * rdata )
1998-03-12 00:11:04 +03:00
{
1999-12-13 16:27:58 +03:00
SRV_R_NET_SHARE_ENUM r_n ;
BOOL ret ;
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " srv_net_share_enum: %d \n " , __LINE__ ) ) ;
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
/* Create the list of shares for the response. */
init_srv_r_net_share_enum ( & r_n ,
q_n - > ctr . info_level ,
get_enum_hnd ( & q_n - > enum_hnd ) ) ;
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
/* store the response in the SMB stream */
ret = srv_io_r_net_share_enum ( " " , & r_n , rdata , 0 ) ;
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
/* Free the memory used by the response. */
free_srv_r_net_share_enum ( & r_n ) ;
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " srv_net_share_enum: %d \n " , __LINE__ ) ) ;
return ret ;
1998-03-12 00:11:04 +03:00
}
/*******************************************************************
1999-12-13 16:27:58 +03:00
Inits a SRV_R_NET_SHARE_GET_INFO structure .
1998-03-12 00:11:04 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static void init_srv_r_net_share_get_info ( SRV_R_NET_SHARE_GET_INFO * r_n ,
char * share_name , uint32 info_level )
1998-03-12 00:11:04 +03:00
{
uint32 status = 0x0 ;
1999-12-13 16:27:58 +03:00
int snum ;
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " init_srv_r_net_share_get_info: %d \n " , __LINE__ ) ) ;
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
r_n - > switch_value = info_level ;
snum = find_service ( share_name ) ;
if ( snum > = 0 ) {
switch ( info_level ) {
1998-03-12 00:11:04 +03:00
case 1 :
1999-12-13 16:27:58 +03:00
init_srv_share_info_1 ( & r_n - > share . info1 , snum ) ;
1998-03-12 00:11:04 +03:00
break ;
case 2 :
1999-12-13 16:27:58 +03:00
init_srv_share_info_2 ( & r_n - > share . info2 , snum ) ;
1998-03-12 00:11:04 +03:00
break ;
2000-04-28 22:36:47 +04:00
case 1005 :
init_srv_share_info_1005 ( & r_n - > share . info1005 , snum ) ;
break ;
1998-03-12 00:11:04 +03:00
default :
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " init_srv_net_share_get_info: unsupported switch value %d \n " , info_level ) ) ;
1998-03-12 00:11:04 +03:00
status = 0xC0000000 | NT_STATUS_INVALID_INFO_CLASS ;
break ;
}
1999-12-13 16:27:58 +03:00
} else {
status = 0xC0000000 | NT_STATUS_BAD_NETWORK_NAME ;
1998-03-12 00:11:04 +03:00
}
1999-12-13 16:27:58 +03:00
r_n - > ptr_share_ctr = ( status = = 0x0 ) ? 1 : 0 ;
r_n - > status = status ;
1998-03-12 00:11:04 +03:00
}
/*******************************************************************
1999-12-13 16:27:58 +03:00
Net share get info .
1998-03-12 00:11:04 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static BOOL srv_reply_net_share_get_info ( SRV_Q_NET_SHARE_GET_INFO * q_n ,
prs_struct * rdata )
1998-03-12 00:11:04 +03:00
{
1999-12-13 16:27:58 +03:00
SRV_R_NET_SHARE_GET_INFO r_n ;
char * share_name ;
BOOL ret ;
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " srv_net_share_get_info: %d \n " , __LINE__ ) ) ;
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
/* Create the list of shares for the response. */
share_name = dos_unistr2_to_str ( & q_n - > uni_share_name ) ;
init_srv_r_net_share_get_info ( & r_n , share_name , q_n - > info_level ) ;
1998-03-12 00:11:04 +03:00
/* store the response in the SMB stream */
1999-12-13 16:27:58 +03:00
ret = srv_io_r_net_share_get_info ( " " , & r_n , rdata , 0 ) ;
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
/* Free the memory used by the response. */
free_srv_r_net_share_get_info ( & r_n ) ;
DEBUG ( 5 , ( " srv_net_share_get_info: %d \n " , __LINE__ ) ) ;
return ret ;
1998-03-12 00:11:04 +03:00
}
/*******************************************************************
fill in a sess info level 1 structure .
this function breaks the rule that i ' d like to be in place , namely
it doesn ' t receive its data as arguments : it has to call lp_xxxx ( )
functions itself . yuck .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static void init_srv_sess_0_info ( SESS_INFO_0 * se0 , SESS_INFO_0_STR * str0 ,
1998-03-12 00:11:04 +03:00
char * name )
{
1999-12-13 16:27:58 +03:00
init_srv_sess_info0 ( se0 , name ) ;
init_srv_sess_info0_str ( str0 , name ) ;
1998-03-12 00:11:04 +03:00
}
/*******************************************************************
fill in a sess info level 0 structure .
this function breaks the rule that i ' d like to be in place , namely
it doesn ' t receive its data as arguments : it has to call lp_xxxx ( )
functions itself . yuck .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static void init_srv_sess_info_0 ( SRV_SESS_INFO_0 * ss0 , uint32 * snum , uint32 * stot )
1998-03-12 00:11:04 +03:00
{
uint32 num_entries = 0 ;
1999-12-13 16:27:58 +03:00
( * stot ) = 1 ;
1998-03-12 00:11:04 +03:00
1999-08-19 01:18:42 +04:00
if ( ss0 = = NULL )
{
( * snum ) = 0 ;
return ;
}
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " init_srv_sess_0_ss0 \n " ) ) ;
1998-03-12 00:11:04 +03:00
if ( snum )
{
for ( ; ( * snum ) < ( * stot ) & & num_entries < MAX_SESS_ENTRIES ; ( * snum ) + + )
{
1999-12-13 16:27:58 +03:00
init_srv_sess_0_info ( & ( ss0 - > info_0 [ num_entries ] ) ,
& ( ss0 - > info_0_str [ num_entries ] ) , " MACHINE " ) ;
1998-03-12 00:11:04 +03:00
/* move on to creating next session */
/* move on to creating next sess */
num_entries + + ;
}
ss0 - > num_entries_read = num_entries ;
ss0 - > ptr_sess_info = num_entries > 0 ? 1 : 0 ;
ss0 - > num_entries_read2 = num_entries ;
if ( ( * snum ) > = ( * stot ) )
{
( * snum ) = 0 ;
}
}
else
{
ss0 - > num_entries_read = 0 ;
ss0 - > ptr_sess_info = 0 ;
ss0 - > num_entries_read2 = 0 ;
}
}
/*******************************************************************
fill in a sess info level 1 structure .
this function breaks the rule that i ' d like to be in place , namely
it doesn ' t receive its data as arguments : it has to call lp_xxxx ( )
functions itself . yuck .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static void init_srv_sess_1_info ( SESS_INFO_1 * se1 , SESS_INFO_1_STR * str1 ,
1998-03-12 00:11:04 +03:00
char * name , char * user ,
uint32 num_opens ,
uint32 open_time , uint32 idle_time ,
uint32 usr_flgs )
{
1999-12-13 16:27:58 +03:00
init_srv_sess_info1 ( se1 , name , user , num_opens , open_time , idle_time , usr_flgs ) ;
init_srv_sess_info1_str ( str1 , name , user ) ;
1998-03-12 00:11:04 +03:00
}
/*******************************************************************
fill in a sess info level 1 structure .
this function breaks the rule that i ' d like to be in place , namely
it doesn ' t receive its data as arguments : it has to call lp_xxxx ( )
functions itself . yuck .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static void init_srv_sess_info_1 ( SRV_SESS_INFO_1 * ss1 , uint32 * snum , uint32 * stot )
1998-03-12 00:11:04 +03:00
{
uint32 num_entries = 0 ;
1999-12-13 16:27:58 +03:00
( * stot ) = 1 ;
1999-08-19 01:18:42 +04:00
1998-03-12 00:11:04 +03:00
if ( ss1 = = NULL )
{
( * snum ) = 0 ;
return ;
}
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " init_srv_sess_1_ss1 \n " ) ) ;
1998-03-12 00:11:04 +03:00
if ( snum )
{
for ( ; ( * snum ) < ( * stot ) & & num_entries < MAX_SESS_ENTRIES ; ( * snum ) + + )
{
1999-12-13 16:27:58 +03:00
init_srv_sess_1_info ( & ( ss1 - > info_1 [ num_entries ] ) ,
1998-03-12 00:11:04 +03:00
& ( ss1 - > info_1_str [ num_entries ] ) ,
1999-12-13 16:27:58 +03:00
" MACHINE " , " dummy_user " , 1 , 10 , 5 , 0 ) ;
1998-03-12 00:11:04 +03:00
/* move on to creating next session */
/* move on to creating next sess */
num_entries + + ;
}
ss1 - > num_entries_read = num_entries ;
ss1 - > ptr_sess_info = num_entries > 0 ? 1 : 0 ;
ss1 - > num_entries_read2 = num_entries ;
if ( ( * snum ) > = ( * stot ) )
{
( * snum ) = 0 ;
}
}
else
{
ss1 - > num_entries_read = 0 ;
ss1 - > ptr_sess_info = 0 ;
ss1 - > num_entries_read2 = 0 ;
( * stot ) = 0 ;
}
}
/*******************************************************************
makes a SRV_R_NET_SESS_ENUM structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static uint32 init_srv_sess_info_ctr ( SRV_SESS_INFO_CTR * ctr ,
1998-03-12 00:11:04 +03:00
int switch_value , uint32 * resume_hnd , uint32 * total_entries )
{
uint32 status = 0x0 ;
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " init_srv_sess_info_ctr: %d \n " , __LINE__ ) ) ;
1998-03-12 00:11:04 +03:00
ctr - > switch_value = switch_value ;
switch ( switch_value )
{
case 0 :
{
1999-12-13 16:27:58 +03:00
init_srv_sess_info_0 ( & ( ctr - > sess . info0 ) , resume_hnd , total_entries ) ;
1998-03-12 00:11:04 +03:00
ctr - > ptr_sess_ctr = 1 ;
break ;
}
case 1 :
{
1999-12-13 16:27:58 +03:00
init_srv_sess_info_1 ( & ( ctr - > sess . info1 ) , resume_hnd , total_entries ) ;
1998-03-12 00:11:04 +03:00
ctr - > ptr_sess_ctr = 1 ;
break ;
}
default :
{
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " init_srv_sess_info_ctr: unsupported switch value %d \n " ,
1998-03-12 00:11:04 +03:00
switch_value ) ) ;
( * resume_hnd ) = 0 ;
( * total_entries ) = 0 ;
ctr - > ptr_sess_ctr = 0 ;
status = 0xC0000000 | NT_STATUS_INVALID_INFO_CLASS ;
break ;
}
}
return status ;
}
/*******************************************************************
makes a SRV_R_NET_SESS_ENUM structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static void init_srv_r_net_sess_enum ( SRV_R_NET_SESS_ENUM * r_n ,
1998-03-12 00:11:04 +03:00
uint32 resume_hnd , int sess_level , int switch_value )
{
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " init_srv_r_net_sess_enum: %d \n " , __LINE__ ) ) ;
1998-03-12 00:11:04 +03:00
r_n - > sess_level = sess_level ;
if ( sess_level = = - 1 )
{
r_n - > status = 0xC0000000 | NT_STATUS_INVALID_INFO_CLASS ;
}
else
{
1999-12-13 16:27:58 +03:00
r_n - > status = init_srv_sess_info_ctr ( r_n - > ctr , switch_value , & resume_hnd , & r_n - > total_entries ) ;
1998-03-12 00:11:04 +03:00
}
if ( r_n - > status ! = 0x0 )
{
resume_hnd = 0 ;
}
1999-12-13 16:27:58 +03:00
init_enum_hnd ( & ( r_n - > enum_hnd ) , resume_hnd ) ;
1998-03-12 00:11:04 +03:00
}
/*******************************************************************
net sess enum
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void srv_reply_net_sess_enum ( SRV_Q_NET_SESS_ENUM * q_n ,
prs_struct * rdata )
{
SRV_R_NET_SESS_ENUM r_n ;
SRV_SESS_INFO_CTR ctr ;
r_n . ctr = & ctr ;
DEBUG ( 5 , ( " srv_net_sess_enum: %d \n " , __LINE__ ) ) ;
/* set up the */
1999-12-13 16:27:58 +03:00
init_srv_r_net_sess_enum ( & r_n ,
1998-03-12 00:11:04 +03:00
get_enum_hnd ( & q_n - > enum_hnd ) ,
q_n - > sess_level ,
q_n - > ctr - > switch_value ) ;
/* store the response in the SMB stream */
srv_io_r_net_sess_enum ( " " , & r_n , rdata , 0 ) ;
DEBUG ( 5 , ( " srv_net_sess_enum: %d \n " , __LINE__ ) ) ;
}
/*******************************************************************
fill in a conn info level 0 structure .
this function breaks the rule that i ' d like to be in place , namely
it doesn ' t receive its data as arguments : it has to call lp_xxxx ( )
functions itself . yuck .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static void init_srv_conn_info_0 ( SRV_CONN_INFO_0 * ss0 , uint32 * snum , uint32 * stot )
1998-03-12 00:11:04 +03:00
{
1999-12-13 16:27:58 +03:00
uint32 num_entries = 0 ;
( * stot ) = 1 ;
1998-03-12 00:11:04 +03:00
if ( ss0 = = NULL )
{
( * snum ) = 0 ;
return ;
}
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " init_srv_conn_0_ss0 \n " ) ) ;
1998-03-12 00:11:04 +03:00
if ( snum )
{
for ( ; ( * snum ) < ( * stot ) & & num_entries < MAX_CONN_ENTRIES ; ( * snum ) + + )
{
1999-12-13 16:27:58 +03:00
init_srv_conn_info0 ( & ( ss0 - > info_0 [ num_entries ] ) , ( * stot ) ) ;
1998-03-12 00:11:04 +03:00
/* move on to creating next connection */
/* move on to creating next conn */
num_entries + + ;
}
ss0 - > num_entries_read = num_entries ;
ss0 - > ptr_conn_info = num_entries > 0 ? 1 : 0 ;
ss0 - > num_entries_read2 = num_entries ;
if ( ( * snum ) > = ( * stot ) )
{
( * snum ) = 0 ;
}
}
else
{
ss0 - > num_entries_read = 0 ;
ss0 - > ptr_conn_info = 0 ;
ss0 - > num_entries_read2 = 0 ;
( * stot ) = 0 ;
}
}
/*******************************************************************
fill in a conn info level 1 structure .
this function breaks the rule that i ' d like to be in place , namely
it doesn ' t receive its data as arguments : it has to call lp_xxxx ( )
functions itself . yuck .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static void init_srv_conn_1_info ( CONN_INFO_1 * se1 , CONN_INFO_1_STR * str1 ,
1998-03-12 00:11:04 +03:00
uint32 id , uint32 type ,
uint32 num_opens , uint32 num_users , uint32 open_time ,
char * usr_name , char * net_name )
{
1999-12-13 16:27:58 +03:00
init_srv_conn_info1 ( se1 , id , type , num_opens , num_users , open_time , usr_name , net_name ) ;
init_srv_conn_info1_str ( str1 , usr_name , net_name ) ;
1998-03-12 00:11:04 +03:00
}
/*******************************************************************
fill in a conn info level 1 structure .
this function breaks the rule that i ' d like to be in place , namely
it doesn ' t receive its data as arguments : it has to call lp_xxxx ( )
functions itself . yuck .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static void init_srv_conn_info_1 ( SRV_CONN_INFO_1 * ss1 , uint32 * snum , uint32 * stot )
1998-03-12 00:11:04 +03:00
{
1999-12-13 16:27:58 +03:00
uint32 num_entries = 0 ;
( * stot ) = 1 ;
1998-03-12 00:11:04 +03:00
if ( ss1 = = NULL )
{
( * snum ) = 0 ;
return ;
}
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " init_srv_conn_1_ss1 \n " ) ) ;
1998-03-12 00:11:04 +03:00
if ( snum )
{
for ( ; ( * snum ) < ( * stot ) & & num_entries < MAX_CONN_ENTRIES ; ( * snum ) + + )
{
1999-12-13 16:27:58 +03:00
init_srv_conn_1_info ( & ( ss1 - > info_1 [ num_entries ] ) ,
1998-03-12 00:11:04 +03:00
& ( ss1 - > info_1_str [ num_entries ] ) ,
1999-12-13 16:27:58 +03:00
( * stot ) , 0x3 , 1 , 1 , 3 , " dummy_user " , " IPC$ " ) ;
1998-03-12 00:11:04 +03:00
/* move on to creating next connection */
/* move on to creating next conn */
num_entries + + ;
}
ss1 - > num_entries_read = num_entries ;
ss1 - > ptr_conn_info = num_entries > 0 ? 1 : 0 ;
ss1 - > num_entries_read2 = num_entries ;
if ( ( * snum ) > = ( * stot ) )
{
( * snum ) = 0 ;
}
}
else
{
ss1 - > num_entries_read = 0 ;
ss1 - > ptr_conn_info = 0 ;
ss1 - > num_entries_read2 = 0 ;
( * stot ) = 0 ;
}
}
/*******************************************************************
makes a SRV_R_NET_CONN_ENUM structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static uint32 init_srv_conn_info_ctr ( SRV_CONN_INFO_CTR * ctr ,
1998-03-12 00:11:04 +03:00
int switch_value , uint32 * resume_hnd , uint32 * total_entries )
{
uint32 status = 0x0 ;
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " init_srv_conn_info_ctr: %d \n " , __LINE__ ) ) ;
1998-03-12 00:11:04 +03:00
ctr - > switch_value = switch_value ;
switch ( switch_value )
{
case 0 :
{
1999-12-13 16:27:58 +03:00
init_srv_conn_info_0 ( & ( ctr - > conn . info0 ) , resume_hnd , total_entries ) ;
1998-03-12 00:11:04 +03:00
ctr - > ptr_conn_ctr = 1 ;
break ;
}
case 1 :
{
1999-12-13 16:27:58 +03:00
init_srv_conn_info_1 ( & ( ctr - > conn . info1 ) , resume_hnd , total_entries ) ;
1998-03-12 00:11:04 +03:00
ctr - > ptr_conn_ctr = 1 ;
break ;
}
default :
{
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " init_srv_conn_info_ctr: unsupported switch value %d \n " ,
1998-03-12 00:11:04 +03:00
switch_value ) ) ;
( * resume_hnd = 0 ) ;
( * total_entries ) = 0 ;
ctr - > ptr_conn_ctr = 0 ;
status = 0xC0000000 | NT_STATUS_INVALID_INFO_CLASS ;
break ;
}
}
return status ;
}
/*******************************************************************
makes a SRV_R_NET_CONN_ENUM structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static void init_srv_r_net_conn_enum ( SRV_R_NET_CONN_ENUM * r_n ,
1998-03-12 00:11:04 +03:00
uint32 resume_hnd , int conn_level , int switch_value )
{
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " init_srv_r_net_conn_enum: %d \n " , __LINE__ ) ) ;
1998-03-12 00:11:04 +03:00
r_n - > conn_level = conn_level ;
if ( conn_level = = - 1 )
{
r_n - > status = 0xC0000000 | NT_STATUS_INVALID_INFO_CLASS ;
}
else
{
1999-12-13 16:27:58 +03:00
r_n - > status = init_srv_conn_info_ctr ( r_n - > ctr , switch_value , & resume_hnd , & r_n - > total_entries ) ;
1998-03-12 00:11:04 +03:00
}
if ( r_n - > status ! = 0x0 )
{
resume_hnd = 0 ;
}
1999-12-13 16:27:58 +03:00
init_enum_hnd ( & ( r_n - > enum_hnd ) , resume_hnd ) ;
1998-03-12 00:11:04 +03:00
}
/*******************************************************************
net conn enum
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void srv_reply_net_conn_enum ( SRV_Q_NET_CONN_ENUM * q_n ,
prs_struct * rdata )
{
SRV_R_NET_CONN_ENUM r_n ;
SRV_CONN_INFO_CTR ctr ;
r_n . ctr = & ctr ;
DEBUG ( 5 , ( " srv_net_conn_enum: %d \n " , __LINE__ ) ) ;
/* set up the */
1999-12-13 16:27:58 +03:00
init_srv_r_net_conn_enum ( & r_n ,
1998-03-12 00:11:04 +03:00
get_enum_hnd ( & q_n - > enum_hnd ) ,
q_n - > conn_level ,
q_n - > ctr - > switch_value ) ;
/* store the response in the SMB stream */
srv_io_r_net_conn_enum ( " " , & r_n , rdata , 0 ) ;
DEBUG ( 5 , ( " srv_net_conn_enum: %d \n " , __LINE__ ) ) ;
}
/*******************************************************************
fill in a file info level 3 structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static void init_srv_file_3_info ( FILE_INFO_3 * fl3 , FILE_INFO_3_STR * str3 ,
1998-03-12 00:11:04 +03:00
uint32 fnum , uint32 perms , uint32 num_locks ,
char * path_name , char * user_name )
{
1999-12-13 16:27:58 +03:00
init_srv_file_info3 ( fl3 , fnum , perms , num_locks , path_name , user_name ) ;
init_srv_file_info3_str ( str3 , path_name , user_name ) ;
1998-03-12 00:11:04 +03:00
}
/*******************************************************************
fill in a file info level 3 structure .
this function breaks the rule that i ' d like to be in place , namely
it doesn ' t receive its data as arguments : it has to call lp_xxxx ( )
functions itself . yuck .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static void init_srv_file_info_3 ( SRV_FILE_INFO_3 * fl3 , uint32 * fnum , uint32 * ftot )
1998-03-12 00:11:04 +03:00
{
uint32 num_entries = 0 ;
( * ftot ) = 1 ;
if ( fl3 = = NULL )
{
( * fnum ) = 0 ;
return ;
}
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " init_srv_file_3_fl3 \n " ) ) ;
1998-03-12 00:11:04 +03:00
for ( ; ( * fnum ) < ( * ftot ) & & num_entries < MAX_FILE_ENTRIES ; ( * fnum ) + + )
{
1999-12-13 16:27:58 +03:00
init_srv_file_3_info ( & ( fl3 - > info_3 [ num_entries ] ) ,
1998-03-12 00:11:04 +03:00
& ( fl3 - > info_3_str [ num_entries ] ) ,
( * fnum ) , 0x35 , 0 , " \\ PIPE \\ samr " , " dummy user " ) ;
/* move on to creating next file */
num_entries + + ;
}
fl3 - > num_entries_read = num_entries ;
fl3 - > ptr_file_info = num_entries > 0 ? 1 : 0 ;
fl3 - > num_entries_read2 = num_entries ;
if ( ( * fnum ) > = ( * ftot ) )
{
( * fnum ) = 0 ;
}
}
/*******************************************************************
makes a SRV_R_NET_FILE_ENUM structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static uint32 init_srv_file_info_ctr ( SRV_FILE_INFO_CTR * ctr ,
1998-03-12 00:11:04 +03:00
int switch_value , uint32 * resume_hnd , uint32 * total_entries )
{
uint32 status = 0x0 ;
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " init_srv_file_info_ctr: %d \n " , __LINE__ ) ) ;
1998-03-12 00:11:04 +03:00
ctr - > switch_value = switch_value ;
switch ( switch_value )
{
case 3 :
{
1999-12-13 16:27:58 +03:00
init_srv_file_info_3 ( & ( ctr - > file . info3 ) , resume_hnd , total_entries ) ;
1998-03-12 00:11:04 +03:00
ctr - > ptr_file_ctr = 1 ;
break ;
}
default :
{
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " init_srv_file_info_ctr: unsupported switch value %d \n " ,
1998-03-12 00:11:04 +03:00
switch_value ) ) ;
( * resume_hnd = 0 ) ;
( * total_entries ) = 0 ;
ctr - > ptr_file_ctr = 0 ;
status = 0xC0000000 | NT_STATUS_INVALID_INFO_CLASS ;
break ;
}
}
return status ;
}
/*******************************************************************
makes a SRV_R_NET_FILE_ENUM structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static void init_srv_r_net_file_enum ( SRV_R_NET_FILE_ENUM * r_n ,
1998-03-12 00:11:04 +03:00
uint32 resume_hnd , int file_level , int switch_value )
{
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " init_srv_r_net_file_enum: %d \n " , __LINE__ ) ) ;
1998-03-12 00:11:04 +03:00
r_n - > file_level = file_level ;
if ( file_level = = 0 )
{
r_n - > status = 0xC0000000 | NT_STATUS_INVALID_INFO_CLASS ;
}
else
{
1999-12-13 16:27:58 +03:00
r_n - > status = init_srv_file_info_ctr ( r_n - > ctr , switch_value , & resume_hnd , & ( r_n - > total_entries ) ) ;
1998-03-12 00:11:04 +03:00
}
if ( r_n - > status ! = 0x0 )
{
resume_hnd = 0 ;
}
1999-12-13 16:27:58 +03:00
init_enum_hnd ( & ( r_n - > enum_hnd ) , resume_hnd ) ;
1998-03-12 00:11:04 +03:00
}
/*******************************************************************
net file enum
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void srv_reply_net_file_enum ( SRV_Q_NET_FILE_ENUM * q_n ,
prs_struct * rdata )
{
SRV_R_NET_FILE_ENUM r_n ;
SRV_FILE_INFO_CTR ctr ;
r_n . ctr = & ctr ;
DEBUG ( 5 , ( " srv_net_file_enum: %d \n " , __LINE__ ) ) ;
/* set up the */
1999-12-13 16:27:58 +03:00
init_srv_r_net_file_enum ( & r_n ,
1998-03-12 00:11:04 +03:00
get_enum_hnd ( & q_n - > enum_hnd ) ,
q_n - > file_level ,
q_n - > ctr - > switch_value ) ;
/* store the response in the SMB stream */
srv_io_r_net_file_enum ( " " , & r_n , rdata , 0 ) ;
DEBUG ( 5 , ( " srv_net_file_enum: %d \n " , __LINE__ ) ) ;
}
/*******************************************************************
net server get info
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
1998-03-12 00:11:04 +03:00
static void srv_reply_net_srv_get_info ( SRV_Q_NET_SRV_GET_INFO * q_n ,
prs_struct * rdata )
{
SRV_R_NET_SRV_GET_INFO r_n ;
uint32 status = 0x0 ;
SRV_INFO_CTR ctr ;
DEBUG ( 5 , ( " srv_net_srv_get_info: %d \n " , __LINE__ ) ) ;
switch ( q_n - > switch_value )
{
case 102 :
{
1999-12-13 16:27:58 +03:00
init_srv_info_102 ( & ctr . srv . sv102 ,
500 , global_myname ,
string_truncate ( lp_serverstring ( ) , MAX_SERVER_STRING_LENGTH ) ,
lp_major_announce_version ( ) , lp_minor_announce_version ( ) ,
1999-02-02 22:53:10 +03:00
lp_default_server_announce ( ) ,
1998-03-12 00:11:04 +03:00
0xffffffff , /* users */
0xf , /* disc */
0 , /* hidden */
240 , /* announce */
3000 , /* announce delta */
100000 , /* licenses */
" c: \\ " ) ; /* user path */
break ;
}
case 101 :
{
1999-12-13 16:27:58 +03:00
init_srv_info_101 ( & ctr . srv . sv101 ,
500 , global_myname ,
lp_major_announce_version ( ) , lp_minor_announce_version ( ) ,
1999-02-02 22:53:10 +03:00
lp_default_server_announce ( ) ,
1999-12-13 16:27:58 +03:00
string_truncate ( lp_serverstring ( ) , MAX_SERVER_STRING_LENGTH ) ) ;
1998-03-12 00:11:04 +03:00
break ;
}
default :
{
status = 0xC0000000 | NT_STATUS_INVALID_INFO_CLASS ;
break ;
}
}
/* set up the net server get info structure */
1999-12-13 16:27:58 +03:00
init_srv_r_net_srv_get_info ( & r_n , q_n - > switch_value , & ctr , status ) ;
1998-03-12 00:11:04 +03:00
/* store the response in the SMB stream */
srv_io_r_net_srv_get_info ( " " , & r_n , rdata , 0 ) ;
DEBUG ( 5 , ( " srv_net_srv_get_info: %d \n " , __LINE__ ) ) ;
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2000-04-04 04:35:34 +04:00
static BOOL api_srv_net_srv_get_info ( prs_struct * data ,
1998-03-12 00:11:04 +03:00
prs_struct * rdata )
{
SRV_Q_NET_SRV_GET_INFO q_n ;
/* grab the net server get info */
srv_io_q_net_srv_get_info ( " " , & q_n , data , 0 ) ;
/* construct reply. always indicate success */
srv_reply_net_srv_get_info ( & q_n , rdata ) ;
1999-12-13 16:27:58 +03:00
return True ;
1998-03-12 00:11:04 +03:00
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2000-04-04 04:35:34 +04:00
static BOOL api_srv_net_file_enum ( prs_struct * data ,
1998-03-12 00:11:04 +03:00
prs_struct * rdata )
{
SRV_Q_NET_FILE_ENUM q_n ;
SRV_FILE_INFO_CTR ctr ;
q_n . ctr = & ctr ;
/* grab the net file enum */
srv_io_q_net_file_enum ( " " , & q_n , data , 0 ) ;
/* construct reply. always indicate success */
srv_reply_net_file_enum ( & q_n , rdata ) ;
1999-12-13 16:27:58 +03:00
return True ;
1998-03-12 00:11:04 +03:00
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2000-04-04 04:35:34 +04:00
static BOOL api_srv_net_conn_enum ( prs_struct * data ,
1998-03-12 00:11:04 +03:00
prs_struct * rdata )
{
SRV_Q_NET_CONN_ENUM q_n ;
SRV_CONN_INFO_CTR ctr ;
q_n . ctr = & ctr ;
/* grab the net server get enum */
srv_io_q_net_conn_enum ( " " , & q_n , data , 0 ) ;
/* construct reply. always indicate success */
srv_reply_net_conn_enum ( & q_n , rdata ) ;
1999-12-13 16:27:58 +03:00
return True ;
1998-03-12 00:11:04 +03:00
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2000-04-04 04:35:34 +04:00
static BOOL api_srv_net_sess_enum ( prs_struct * data ,
1998-03-12 00:11:04 +03:00
prs_struct * rdata )
{
SRV_Q_NET_SESS_ENUM q_n ;
SRV_SESS_INFO_CTR ctr ;
q_n . ctr = & ctr ;
/* grab the net server get enum */
srv_io_q_net_sess_enum ( " " , & q_n , data , 0 ) ;
/* construct reply. always indicate success */
srv_reply_net_sess_enum ( & q_n , rdata ) ;
1999-12-13 16:27:58 +03:00
return True ;
1998-03-12 00:11:04 +03:00
}
/*******************************************************************
1999-12-13 16:27:58 +03:00
RPC to enumerate shares .
1998-03-12 00:11:04 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
2000-04-04 04:35:34 +04:00
static BOOL api_srv_net_share_enum ( prs_struct * data ,
1998-03-12 00:11:04 +03:00
prs_struct * rdata )
{
SRV_Q_NET_SHARE_ENUM q_n ;
1999-12-13 16:27:58 +03:00
BOOL ret ;
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
/* Unmarshall the net server get enum. */
if ( ! srv_io_q_net_share_enum ( " " , & q_n , data , 0 ) ) {
DEBUG ( 0 , ( " api_srv_net_share_enum: Failed to unmarshall SRV_Q_NET_SHARE_ENUM. \n " ) ) ;
return False ;
}
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
ret = srv_reply_net_share_enum ( & q_n , rdata ) ;
1998-03-12 00:11:04 +03:00
1999-12-13 16:27:58 +03:00
/* Free any data allocated in the unmarshalling. */
free_srv_q_net_share_enum ( & q_n ) ;
return ret ;
}
/*******************************************************************
RPC to return share information .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2000-04-04 04:35:34 +04:00
static BOOL api_srv_net_share_get_info ( prs_struct * data ,
1999-12-13 16:27:58 +03:00
prs_struct * rdata )
{
SRV_Q_NET_SHARE_GET_INFO q_n ;
BOOL ret ;
/* Unmarshall the net server get info. */
if ( ! srv_io_q_net_share_get_info ( " " , & q_n , data , 0 ) ) {
DEBUG ( 0 , ( " api_srv_net_share_get_info: Failed to unmarshall SRV_Q_NET_SHARE_GET_INFO. \n " ) ) ;
return False ;
}
ret = srv_reply_net_share_get_info ( & q_n , rdata ) ;
/* Free any data allocated in the unmarshalling. */
free_srv_q_net_share_get_info ( & q_n ) ;
return ret ;
1998-03-12 00:11:04 +03:00
}
1998-05-20 17:17:26 +04:00
/*******************************************************************
time of day
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static BOOL srv_reply_net_remote_tod ( SRV_Q_NET_REMOTE_TOD * q_n ,
1998-05-20 17:17:26 +04:00
prs_struct * rdata )
{
SRV_R_NET_REMOTE_TOD r_n ;
TIME_OF_DAY_INFO tod ;
struct tm * t ;
time_t unixdate = time ( NULL ) ;
r_n . tod = & tod ;
r_n . ptr_srv_tod = 0x1 ;
r_n . status = 0x0 ;
DEBUG ( 5 , ( " srv_reply_net_remote_tod: %d \n " , __LINE__ ) ) ;
1998-05-21 15:54:40 +04:00
t = gmtime ( & unixdate ) ;
1998-05-20 17:17:26 +04:00
/* set up the */
1999-12-13 16:27:58 +03:00
init_time_of_day_info ( & tod ,
1998-05-20 17:17:26 +04:00
unixdate ,
0 ,
t - > tm_hour ,
t - > tm_min ,
t - > tm_sec ,
0 ,
TimeDiff ( unixdate ) / 60 ,
10000 ,
t - > tm_mday ,
t - > tm_mon + 1 ,
1900 + t - > tm_year ,
t - > tm_wday ) ;
/* store the response in the SMB stream */
srv_io_r_net_remote_tod ( " " , & r_n , rdata , 0 ) ;
DEBUG ( 5 , ( " srv_reply_net_remote_tod: %d \n " , __LINE__ ) ) ;
1999-12-13 16:27:58 +03:00
return True ;
1998-05-20 17:17:26 +04:00
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2000-04-04 04:35:34 +04:00
static BOOL api_srv_net_remote_tod ( prs_struct * data ,
1998-05-20 17:17:26 +04:00
prs_struct * rdata )
{
SRV_Q_NET_REMOTE_TOD q_n ;
/* grab the net server get enum */
srv_io_q_net_remote_tod ( " " , & q_n , data , 0 ) ;
/* construct reply. always indicate success */
srv_reply_net_remote_tod ( & q_n , rdata ) ;
1999-12-13 16:27:58 +03:00
return True ;
1998-05-20 17:17:26 +04:00
}
1998-03-12 00:11:04 +03:00
/*******************************************************************
\ PIPE \ srvsvc commands
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
struct api_struct api_srv_cmds [ ] =
{
1999-12-13 16:27:58 +03:00
{ " SRV_NETCONNENUM " , SRV_NETCONNENUM , api_srv_net_conn_enum } ,
{ " SRV_NETSESSENUM " , SRV_NETSESSENUM , api_srv_net_sess_enum } ,
{ " SRV_NETSHAREENUM " , SRV_NETSHAREENUM , api_srv_net_share_enum } ,
{ " SRV_NET_SHARE_GET_INFO " , SRV_NET_SHARE_GET_INFO , api_srv_net_share_get_info } ,
{ " SRV_NETFILEENUM " , SRV_NETFILEENUM , api_srv_net_file_enum } ,
{ " SRV_NET_SRV_GET_INFO " , SRV_NET_SRV_GET_INFO , api_srv_net_srv_get_info } ,
{ " SRV_NET_REMOTE_TOD " , SRV_NET_REMOTE_TOD , api_srv_net_remote_tod } ,
{ NULL , 0 , NULL }
1998-03-12 00:11:04 +03:00
} ;
/*******************************************************************
receives a srvsvc pipe and responds .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
BOOL api_srvsvc_rpc ( pipes_struct * p , prs_struct * data )
1998-03-12 00:11:04 +03:00
{
return api_rpcTNP ( p , " api_srvsvc_rpc " , api_srv_cmds , data ) ;
}
2000-05-10 14:41:59 +04:00
# undef OLD_NTDOMAIN