/* 
   Unix SMB/CIFS implementation.
   Samba parameters and setup
   Copyright (C) Andrew Tridgell 1992-2000
   Copyright (C) Luke Kenneth Casson Leighton 1996 - 2000
   Copyright (C) Shirish Kalele 2000

   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 02139, USA.
*/

#ifndef _RPC_DFS_H
#define _RPC_DFS_H

/* NETDFS pipe: calls */
#define DFS_EXIST                0x00
#define DFS_ADD                  0x01
#define DFS_REMOVE               0x02
#define DFS_GET_INFO             0x04
#define DFS_ENUM                 0x05

/* dfsadd flags */
#define DFSFLAG_ADD_VOLUME           0x00000001
#define DFSFLAG_RESTORE_VOLUME       0x00000002

typedef struct dfs_q_dfs_exist
{
  uint32 dummy;
}
DFS_Q_DFS_EXIST;

/* status == 1 if dfs exists. */
typedef struct dfs_r_dfs_exist
{
	uint32 status;          /* Not a WERROR or NTSTATUS code */
}
DFS_R_DFS_EXIST;

typedef struct dfs_q_dfs_add
{
  uint32 ptr_DfsEntryPath;
  UNISTR2 DfsEntryPath;
  uint32 ptr_ServerName;
  UNISTR2 ServerName;
  uint32 ptr_ShareName;
  UNISTR2 ShareName;
  uint32 ptr_Comment;
  UNISTR2 Comment;
  uint32 Flags;
}
DFS_Q_DFS_ADD;

typedef struct dfs_r_dfs_add
{
  WERROR status;
}
DFS_R_DFS_ADD;

/********************************************/
typedef struct dfs_q_dfs_remove
{
  UNISTR2 DfsEntryPath;
  uint32 ptr_ServerName;
  UNISTR2 ServerName;
  uint32 ptr_ShareName;
  UNISTR2 ShareName;
}
DFS_Q_DFS_REMOVE;

typedef struct dfs_r_dfs_remove
{
  WERROR status;
}
DFS_R_DFS_REMOVE;

/********************************************/
typedef struct dfs_info_1
{
  uint32 ptr_entrypath;
  UNISTR2 entrypath;
}
DFS_INFO_1;

typedef struct dfs_info_2
{
  uint32 ptr_entrypath;
  UNISTR2 entrypath;
  uint32 ptr_comment;
  UNISTR2 comment;
  uint32 state;
  uint32 num_storages;
}
DFS_INFO_2;

typedef struct dfs_storage_info
{
  uint32 state;
  uint32 ptr_servername;
  UNISTR2 servername;
  uint32 ptr_sharename;
  UNISTR2 sharename;
}
DFS_STORAGE_INFO;

typedef struct dfs_info_3
{
  uint32 ptr_entrypath;
  UNISTR2 entrypath;
  uint32 ptr_comment;
  UNISTR2 comment;
  uint32 state;
  uint32 num_storages;
  uint32 ptr_storages;
  uint32 num_storage_infos;
  DFS_STORAGE_INFO* storages;
}
DFS_INFO_3;

typedef struct dfs_info_ctr
{
  
  uint32 switch_value;
  uint32 num_entries;
  uint32 ptr_dfs_ctr; /* pointer to dfs info union */
  union
  {
    DFS_INFO_1 *info1;
    DFS_INFO_2 *info2;
    DFS_INFO_3 *info3;
  } dfs;
}
DFS_INFO_CTR;

typedef struct dfs_q_dfs_get_info
{
  UNISTR2 uni_path;
  
  uint32 ptr_server;
  UNISTR2 uni_server;

  uint32 ptr_share;
  UNISTR2 uni_share;
  
  uint32 level;
}
DFS_Q_DFS_GET_INFO;

typedef struct dfs_r_dfs_get_info
{
  uint32 level;
  uint32 ptr_ctr;
  DFS_INFO_CTR ctr;
  WERROR status;
}
DFS_R_DFS_GET_INFO;

typedef struct dfs_q_dfs_enum
{
  uint32 level;
  uint32 maxpreflen;
  uint32 ptr_buffer;
  uint32 level2;
  uint32 ptr_num_entries;
  uint32 num_entries;
  uint32 ptr_num_entries2;
  uint32 num_entries2;
  ENUM_HND reshnd;
}
DFS_Q_DFS_ENUM;

typedef struct dfs_r_dfs_enum
{
  DFS_INFO_CTR *ctr;
  uint32 ptr_buffer;
  uint32 level;
  uint32 level2;
  uint32 ptr_num_entries;
  uint32 num_entries;
  uint32 ptr_num_entries2;
  uint32 num_entries2;
  ENUM_HND reshnd;
  WERROR status;
}
DFS_R_DFS_ENUM;

#endif  
