2000-05-18 18:43:53 +00:00
/*
2002-01-30 06:08:46 +00:00
* Unix SMB / CIFS implementation .
2000-05-18 18:43:53 +00:00
* RPC Pipe client / server routines for Dfs
* Copyright ( C ) Andrew Tridgell 1992 - 1997 ,
* Copyright ( C ) Luke Kenneth Casson Leighton 1996 - 1997 ,
* Copyright ( C ) Shirish Kalele 2000.
2001-02-27 02:09:50 +00:00
* Copyright ( C ) Jeremy Allison 2001.
2000-05-18 18:43:53 +00:00
*
* 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 .
*/
2001-02-27 02:09:50 +00:00
/* This is the interface to the dfs pipe. */
2000-05-18 18:43:53 +00:00
# include "includes.h"
# include "nterr.h"
# define MAX_MSDFS_JUNCTIONS 256
2002-06-18 09:20:13 +00:00
# undef DBGC_CLASS
# define DBGC_CLASS DBGC_RPC_SRV
2000-05-18 18:43:53 +00:00
/**********************************************************************
api_dfs_exist
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-02-27 02:09:50 +00:00
2000-06-16 08:11:32 +00:00
static BOOL api_dfs_exist ( pipes_struct * p )
2000-05-18 18:43:53 +00:00
{
2001-02-27 02:09:50 +00:00
DFS_Q_DFS_EXIST q_u ;
DFS_R_DFS_EXIST r_u ;
prs_struct * data = & p - > in_data . data ;
2000-06-16 08:11:32 +00:00
prs_struct * rdata = & p - > out_data . rdata ;
2001-02-27 02:09:50 +00:00
if ( ! dfs_io_q_dfs_exist ( " " , & q_u , data , 0 ) )
return False ;
2000-06-16 08:11:32 +00:00
2001-02-27 02:09:50 +00:00
r_u . status = _dfs_exist ( p , & q_u , & r_u ) ;
if ( ! dfs_io_r_dfs_exist ( " " , & r_u , rdata , 0 ) )
return False ;
2000-05-18 18:43:53 +00:00
2001-02-27 02:09:50 +00:00
return True ;
2000-05-18 18:43:53 +00:00
}
2001-02-27 02:09:50 +00:00
2000-05-18 18:43:53 +00:00
/*****************************************************************
api_dfs_add
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-02-27 02:09:50 +00:00
2000-10-13 21:53:51 +00:00
static BOOL api_dfs_add ( pipes_struct * p )
2000-05-18 18:43:53 +00:00
{
2001-02-27 02:09:50 +00:00
DFS_Q_DFS_ADD q_u ;
DFS_R_DFS_ADD r_u ;
2000-06-16 08:11:32 +00:00
prs_struct * data = & p - > in_data . data ;
prs_struct * rdata = & p - > out_data . rdata ;
2001-02-27 02:09:50 +00:00
ZERO_STRUCT ( q_u ) ;
ZERO_STRUCT ( r_u ) ;
if ( ! dfs_io_q_dfs_add ( " " , & q_u , data , 0 ) )
2000-06-16 08:11:32 +00:00
return False ;
2001-02-27 02:09:50 +00:00
r_u . status = _dfs_add ( p , & q_u , & r_u ) ;
2000-06-16 08:11:32 +00:00
2001-02-27 02:09:50 +00:00
if ( ! dfs_io_r_dfs_add ( " " , & r_u , rdata , 0 ) )
return False ;
2000-06-16 08:11:32 +00:00
return True ;
2000-05-18 18:43:53 +00:00
}
/*****************************************************************
api_dfs_remove
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-02-27 02:09:50 +00:00
2000-06-16 08:11:32 +00:00
static BOOL api_dfs_remove ( pipes_struct * p )
2000-05-18 18:43:53 +00:00
{
2001-02-27 02:09:50 +00:00
DFS_Q_DFS_REMOVE q_u ;
DFS_R_DFS_REMOVE r_u ;
2000-10-13 21:53:51 +00:00
prs_struct * data = & p - > in_data . data ;
prs_struct * rdata = & p - > out_data . rdata ;
2000-06-16 08:11:32 +00:00
2001-02-27 02:09:50 +00:00
ZERO_STRUCT ( q_u ) ;
ZERO_STRUCT ( r_u ) ;
if ( ! dfs_io_q_dfs_remove ( " " , & q_u , data , 0 ) )
2000-06-16 08:11:32 +00:00
return False ;
2001-02-27 02:09:50 +00:00
r_u . status = _dfs_remove ( p , & q_u , & r_u ) ;
2000-06-16 08:11:32 +00:00
2001-02-27 02:09:50 +00:00
if ( ! dfs_io_r_dfs_remove ( " " , & r_u , rdata , 0 ) )
return False ;
2000-06-16 08:11:32 +00:00
return True ;
2000-05-18 18:43:53 +00:00
}
/*******************************************************************
api_dfs_get_info
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-02-27 02:09:50 +00:00
2000-06-16 08:11:32 +00:00
static BOOL api_dfs_get_info ( pipes_struct * p )
2000-05-18 18:43:53 +00:00
{
2001-02-27 02:09:50 +00:00
DFS_Q_DFS_GET_INFO q_u ;
DFS_R_DFS_GET_INFO r_u ;
2000-06-16 08:11:32 +00:00
prs_struct * data = & p - > in_data . data ;
prs_struct * rdata = & p - > out_data . rdata ;
2001-02-27 02:09:50 +00:00
ZERO_STRUCT ( q_u ) ;
ZERO_STRUCT ( r_u ) ;
2000-06-16 08:11:32 +00:00
2001-02-27 02:09:50 +00:00
if ( ! dfs_io_q_dfs_get_info ( " " , & q_u , data , 0 ) )
2000-06-16 08:11:32 +00:00
return False ;
2001-02-27 02:09:50 +00:00
r_u . status = _dfs_get_info ( p , & q_u , & r_u ) ;
2000-06-16 08:11:32 +00:00
2001-02-27 02:09:50 +00:00
if ( ! dfs_io_r_dfs_get_info ( " " , & r_u , rdata , 0 ) )
2000-06-16 08:11:32 +00:00
return False ;
2001-02-27 02:09:50 +00:00
2000-06-16 08:11:32 +00:00
return True ;
2000-05-18 18:43:53 +00:00
}
/*******************************************************************
api_dfs_enum
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-02-27 02:09:50 +00:00
2000-06-16 08:11:32 +00:00
static BOOL api_dfs_enum ( pipes_struct * p )
2000-05-18 18:43:53 +00:00
{
2001-02-27 02:09:50 +00:00
DFS_Q_DFS_ENUM q_u ;
DFS_R_DFS_ENUM r_u ;
2000-06-16 08:11:32 +00:00
prs_struct * data = & p - > in_data . data ;
prs_struct * rdata = & p - > out_data . rdata ;
2001-02-27 02:09:50 +00:00
ZERO_STRUCT ( q_u ) ;
ZERO_STRUCT ( r_u ) ;
if ( ! dfs_io_q_dfs_enum ( " " , & q_u , data , 0 ) )
2000-06-16 08:11:32 +00:00
return False ;
2001-02-27 02:09:50 +00:00
r_u . status = _dfs_enum ( p , & q_u , & r_u ) ;
2000-06-16 08:11:32 +00:00
2001-02-27 02:09:50 +00:00
if ( ! dfs_io_r_dfs_enum ( " " , & r_u , rdata , 0 ) )
2000-06-16 08:11:32 +00:00
return False ;
2001-02-27 02:09:50 +00:00
2000-06-16 08:11:32 +00:00
return True ;
2000-05-18 18:43:53 +00:00
}
/*******************************************************************
\ pipe \ netdfs commands
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-02-27 02:09:50 +00:00
2000-05-18 18:43:53 +00:00
struct api_struct api_netdfs_cmds [ ] =
{
2000-06-16 08:11:32 +00:00
{ " DFS_EXIST " , DFS_EXIST , api_dfs_exist } ,
{ " DFS_ADD " , DFS_ADD , api_dfs_add } ,
{ " DFS_REMOVE " , DFS_REMOVE , api_dfs_remove } ,
{ " DFS_GET_INFO " , DFS_GET_INFO , api_dfs_get_info } ,
{ " DFS_ENUM " , DFS_ENUM , api_dfs_enum } ,
{ NULL , 0 , NULL }
2000-05-18 18:43:53 +00:00
} ;
/*******************************************************************
receives a netdfs pipe and responds .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-02-27 02:09:50 +00:00
2000-06-16 08:11:32 +00:00
BOOL api_netdfs_rpc ( pipes_struct * p )
2000-05-18 18:43:53 +00:00
{
2000-06-16 08:11:32 +00:00
return api_rpcTNP ( p , " api_netdfs_rpc " , api_netdfs_cmds ) ;
2000-05-18 18:43:53 +00:00
}