2001-06-06 11:32:51 +04:00
/*
2002-01-30 09:08:46 +03:00
Unix SMB / CIFS implementation .
2001-06-06 11:32:51 +04:00
RPC pipe client
Copyright ( C ) Tim Potter 2000 - 2001 ,
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"
2001-06-13 10:37:02 +04:00
/* Query DFS support */
2001-08-28 01:32:54 +04:00
NTSTATUS cli_dfs_exist ( struct cli_state * cli , TALLOC_CTX * mem_ctx ,
BOOL * dfs_exists )
2001-06-13 10:37:02 +04:00
{
prs_struct qbuf , rbuf ;
DFS_Q_DFS_EXIST q ;
DFS_R_DFS_EXIST r ;
2001-08-28 01:32:54 +04:00
NTSTATUS result = NT_STATUS_UNSUCCESSFUL ;
2001-06-13 10:37:02 +04:00
ZERO_STRUCT ( q ) ;
ZERO_STRUCT ( r ) ;
/* Initialise parse structures */
prs_init ( & qbuf , MAX_PDU_FRAG_LEN , mem_ctx , MARSHALL ) ;
prs_init ( & rbuf , 0 , mem_ctx , UNMARSHALL ) ;
/* Marshall data and send request */
init_dfs_q_dfs_exist ( & q ) ;
if ( ! dfs_io_q_dfs_exist ( " " , & q , & qbuf , 0 ) | |
! rpc_api_pipe_req ( cli , DFS_EXIST , & qbuf , & rbuf ) ) {
goto done ;
}
/* Unmarshall response */
if ( ! dfs_io_r_dfs_exist ( " " , & r , & rbuf , 0 ) ) {
goto done ;
}
/* Return result */
2001-09-13 05:00:46 +04:00
* dfs_exists = ( r . status ! = 0 ) ;
2001-06-13 10:37:02 +04:00
2001-08-27 23:46:22 +04:00
result = NT_STATUS_OK ;
2001-06-13 10:37:02 +04:00
done :
prs_mem_free ( & qbuf ) ;
prs_mem_free ( & rbuf ) ;
return result ;
}
2001-08-28 01:32:54 +04:00
NTSTATUS cli_dfs_add ( struct cli_state * cli , TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
const char * entrypath , const char * servername ,
const char * sharename , const char * comment , uint32 flags )
2001-06-13 10:37:02 +04:00
{
prs_struct qbuf , rbuf ;
DFS_Q_DFS_ADD q ;
DFS_R_DFS_ADD r ;
2001-08-28 01:32:54 +04:00
NTSTATUS result = NT_STATUS_UNSUCCESSFUL ;
2001-06-13 10:37:02 +04:00
ZERO_STRUCT ( q ) ;
ZERO_STRUCT ( r ) ;
/* Initialise parse structures */
prs_init ( & qbuf , MAX_PDU_FRAG_LEN , mem_ctx , MARSHALL ) ;
prs_init ( & rbuf , 0 , mem_ctx , UNMARSHALL ) ;
/* Marshall data and send request */
init_dfs_q_dfs_add ( & q , entrypath , servername , sharename , comment ,
flags ) ;
if ( ! dfs_io_q_dfs_add ( " " , & q , & qbuf , 0 ) | |
! rpc_api_pipe_req ( cli , DFS_ADD , & qbuf , & rbuf ) ) {
goto done ;
}
/* Unmarshall response */
if ( ! dfs_io_r_dfs_add ( " " , & r , & rbuf , 0 ) ) {
goto done ;
}
/* Return result */
2001-09-13 05:00:46 +04:00
result = werror_to_ntstatus ( r . status ) ;
2001-06-13 10:37:02 +04:00
done :
prs_mem_free ( & qbuf ) ;
prs_mem_free ( & rbuf ) ;
return result ;
}
2001-08-28 01:32:54 +04:00
NTSTATUS cli_dfs_remove ( struct cli_state * cli , TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
const char * entrypath , const char * servername ,
const char * sharename )
2001-06-13 10:37:02 +04:00
{
prs_struct qbuf , rbuf ;
DFS_Q_DFS_REMOVE q ;
DFS_R_DFS_REMOVE r ;
2001-09-13 05:00:46 +04:00
NTSTATUS result = NT_STATUS_UNSUCCESSFUL ;
2001-06-13 10:37:02 +04:00
ZERO_STRUCT ( q ) ;
ZERO_STRUCT ( r ) ;
/* Initialise parse structures */
prs_init ( & qbuf , MAX_PDU_FRAG_LEN , mem_ctx , MARSHALL ) ;
prs_init ( & rbuf , 0 , mem_ctx , UNMARSHALL ) ;
/* Marshall data and send request */
init_dfs_q_dfs_remove ( & q , entrypath , servername , sharename ) ;
if ( ! dfs_io_q_dfs_remove ( " " , & q , & qbuf , 0 ) | |
! rpc_api_pipe_req ( cli , DFS_REMOVE , & qbuf , & rbuf ) ) {
goto done ;
}
/* Unmarshall response */
if ( ! dfs_io_r_dfs_remove ( " " , & r , & rbuf , 0 ) ) {
goto done ;
}
/* Return result */
2001-09-13 05:00:46 +04:00
result = werror_to_ntstatus ( r . status ) ;
2001-06-13 10:37:02 +04:00
done :
prs_mem_free ( & qbuf ) ;
prs_mem_free ( & rbuf ) ;
2001-09-13 05:00:46 +04:00
return result ;
2001-06-13 10:37:02 +04:00
}
2001-08-28 01:32:54 +04:00
NTSTATUS cli_dfs_get_info ( struct cli_state * cli , TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
const char * entrypath , const char * servername ,
const char * sharename , uint32 info_level ,
DFS_INFO_CTR * ctr )
2001-06-13 10:37:02 +04:00
{
prs_struct qbuf , rbuf ;
DFS_Q_DFS_GET_INFO q ;
DFS_R_DFS_GET_INFO r ;
2001-09-13 05:00:46 +04:00
NTSTATUS result = NT_STATUS_UNSUCCESSFUL ;
2001-06-13 10:37:02 +04:00
ZERO_STRUCT ( q ) ;
ZERO_STRUCT ( r ) ;
/* Initialise parse structures */
prs_init ( & qbuf , MAX_PDU_FRAG_LEN , mem_ctx , MARSHALL ) ;
prs_init ( & rbuf , 0 , mem_ctx , UNMARSHALL ) ;
/* Marshall data and send request */
init_dfs_q_dfs_get_info ( & q , entrypath , servername , sharename ,
info_level ) ;
if ( ! dfs_io_q_dfs_get_info ( " " , & q , & qbuf , 0 ) | |
! rpc_api_pipe_req ( cli , DFS_GET_INFO , & qbuf , & rbuf ) ) {
goto done ;
}
/* Unmarshall response */
if ( ! dfs_io_r_dfs_get_info ( " " , & r , & rbuf , 0 ) ) {
goto done ;
}
/* Return result */
2001-09-13 05:00:46 +04:00
result = werror_to_ntstatus ( r . status ) ;
2001-06-13 10:37:02 +04:00
* ctr = r . ctr ;
done :
prs_mem_free ( & qbuf ) ;
prs_mem_free ( & rbuf ) ;
2001-09-13 05:00:46 +04:00
return result ;
2001-06-13 10:37:02 +04:00
}
/* Enumerate dfs shares */
2001-08-28 01:32:54 +04:00
NTSTATUS cli_dfs_enum ( struct cli_state * cli , TALLOC_CTX * mem_ctx ,
uint32 info_level , DFS_INFO_CTR * ctr )
2001-06-13 10:37:02 +04:00
{
prs_struct qbuf , rbuf ;
DFS_Q_DFS_ENUM q ;
DFS_R_DFS_ENUM r ;
2001-09-13 05:00:46 +04:00
NTSTATUS result = NT_STATUS_UNSUCCESSFUL ;
2001-06-13 10:37:02 +04:00
ZERO_STRUCT ( q ) ;
ZERO_STRUCT ( r ) ;
/* Initialise parse structures */
prs_init ( & qbuf , MAX_PDU_FRAG_LEN , mem_ctx , MARSHALL ) ;
prs_init ( & rbuf , 0 , mem_ctx , UNMARSHALL ) ;
/* Marshall data and send request */
init_dfs_q_dfs_enum ( & q , info_level , ctr ) ;
if ( ! dfs_io_q_dfs_enum ( " " , & q , & qbuf , 0 ) | |
! rpc_api_pipe_req ( cli , DFS_ENUM , & qbuf , & rbuf ) ) {
goto done ;
}
/* Unmarshall response */
r . ctr = ctr ;
if ( ! dfs_io_r_dfs_enum ( " " , & r , & rbuf , 0 ) ) {
goto done ;
}
/* Return result */
2001-09-13 05:00:46 +04:00
result = werror_to_ntstatus ( r . status ) ;
2001-06-13 10:37:02 +04:00
done :
prs_mem_free ( & qbuf ) ;
prs_mem_free ( & rbuf ) ;
2001-09-13 05:00:46 +04:00
return result ;
2001-06-13 10:37:02 +04:00
}