/*
  libnetapi interface definition
*/

cpp_quote("#define LIBNETAPI_LOCAL_SERVER(x) (!x || is_myname_or_ipaddr(x))")
cpp_quote("#ifndef MAXSUBAUTHS")
cpp_quote("#define MAXSUBAUTHS 15 /* max sub authorities in a SID */")
cpp_quote("#endif")

[
	pointer_default(unique)
]
interface libnetapi
{
	const int ERROR_MORE_DATA = 234L;

	[public] typedef [v1_enum] enum {
		NERR_Success=0
	} NET_API_STATUS;

	[public] typedef struct {
		uint8 sid_rev_num;
		uint8 num_auths;
		uint8 id_auth[6];
		uint32 sub_auths[MAXSUBAUTHS];
	} domsid;

	/*******************************************/
	/* NetJoinDomain                           */
	/*******************************************/

	[nopush,nopull] NET_API_STATUS NetJoinDomain(
		[in,unique] string *server,
		[in,ref] string *domain,
		[in,unique] string *account_ou,
		[in,unique] string *account,
		[in,unique] string *password,
		[in] uint32 join_flags
		);

	/*******************************************/
	/* NetUnjoinDomain                         */
	/*******************************************/

	[nopush,nopull] NET_API_STATUS NetUnjoinDomain(
		[in,unique] string *server_name,
		[in,unique] string *account,
		[in,unique] string *password,
		[in] uint32 unjoin_flags
		);

	/*******************************************/
	/* NetGetJoinInformation                   */
	/*******************************************/

	[nopush,nopull] NET_API_STATUS NetGetJoinInformation(
		[in,unique] string *server_name,
		[out] string **name_buffer,
		[out] uint16 *name_type
		);

	/*******************************************/
	/* NetGetJoinableOUs                       */
	/*******************************************/

	[nopush,nopull] NET_API_STATUS NetGetJoinableOUs(
		[in,unique] string *server_name,
		[in,ref] string *domain,
		[in,unique] string *account,
		[in,unique] string *password,
		[out] uint32 *ou_count,
		[out] string ***ous
		);

	/*******************************************/
	/* NetServerGetInfo                        */
	/*******************************************/

	[public] typedef struct {
		string sv1005_comment;
	} SERVER_INFO_1005;

	[nopush,nopull] NET_API_STATUS NetServerGetInfo(
		[in,unique] string *server_name,
		[in] uint32 level,
		[out] uint8 **buffer
		);

	/*******************************************/
	/* NetServerSetInfo                        */
	/*******************************************/

	[nopush,nopull] NET_API_STATUS NetServerSetInfo(
		[in,unique] string *server_name,
		[in] uint32 level,
		[in] uint8 *buffer,
		[out] uint32 *parm_error
		);

	/*******************************************/
	/* NetGetDCName                            */
	/*******************************************/

	[nopush,nopull] NET_API_STATUS NetGetDCName(
		[in,unique] string *server_name,
		[in,unique] string *domain_name,
		[out] uint8 **buffer
		);

	/*******************************************/
	/* NetGetAnyDCName                         */
	/*******************************************/

	[nopush,nopull] NET_API_STATUS NetGetAnyDCName(
		[in,unique] string *server_name,
		[in,unique] string *domain_name,
		[out] uint8 **buffer
		);

	/*******************************************/
	/* DsGetDcName                             */
	/*******************************************/

	[public] typedef struct {
		string domain_controller_name;
		string domain_controller_address;
		uint32 domain_controller_address_type;
		GUID domain_guid;
		string domain_name;
		string dns_forest_name;
		uint32 flags;
		string dc_site_name;
		string client_site_name;
	} DOMAIN_CONTROLLER_INFO;

	[nopush,nopull] NET_API_STATUS DsGetDcName(
		[in,unique] string *server_name,
		[in,ref] string *domain_name,
		[in,unique] GUID *domain_guid,
		[in,unique] string *site_name,
		[in] uint32 flags,
		[out,ref] DOMAIN_CONTROLLER_INFO **dc_info
		);

	/*******************************************/
	/* NetUserAdd                              */
	/*******************************************/

	[public] typedef struct {
		string usri0_name;
	} USER_INFO_0;

	[public] typedef struct {
		string usri1_name;
		string usri1_password;
		uint32 usri1_password_age;
		uint32 usri1_priv;
		string usri1_home_dir;
		string usri1_comment;
		uint32 usri1_flags;
		string usri1_script_path;
	} USER_INFO_1;

	[nopush,nopull] NET_API_STATUS NetUserAdd(
		[in,unique] string *server_name,
		[in] uint32 level,
		[in,ref] uint8 *buffer,
		[out,ref] uint32 *parm_error
		);

	/*******************************************/
	/* NetUserDel                              */
	/*******************************************/

	[nopush,nopull] NET_API_STATUS NetUserDel(
		[in,unique] string *server_name,
		[in,ref] string *user_name
		);

	/*******************************************/
	/* NetUserEnum                             */
	/*******************************************/

	const int FILTER_TEMP_DUPLICATE_ACCOUNT = 0x0001;
	const int FILTER_NORMAL_ACCOUNT = 0x0002;
	const int FILTER_INTERDOMAIN_TRUST_ACCOUNT = 0x0008;
	const int FILTER_WORKSTATION_TRUST_ACCOUNT = 0x0010;
	const int FILTER_SERVER_TRUST_ACCOUNT = 0x0020;

	[nopush,nopull] NET_API_STATUS NetUserEnum(
		[in,unique] string *server_name,
		[in] uint32 level,
		[in] uint32 filter,
		[out,ref] uint8 **buffer,
		[in] uint32 prefmaxlen,
		[out,ref] uint32 *entries_read,
		[out,ref] uint32 *total_entries,
		[in,out,ref] uint32 *resume_handle
		);

	/*******************************************/
	/* NetUserChangePassword                   */
	/*******************************************/

	[nopush,nopull] NET_API_STATUS NetUserChangePassword(
		[in] string domain_name,
		[in] string user_name,
		[in] string old_password,
		[in] string new_password
		);

	/*******************************************/
	/* NetQueryDisplayInformation              */
	/*******************************************/

	[public] typedef struct {
		string usri1_name;
		string usri1_comment;
		uint32 usri1_flags;
		string usri1_full_name;
		uint32 usri1_user_id;
		uint32 usri1_next_index;
	} NET_DISPLAY_USER;

	[public] typedef struct {
		string usri2_name;
		string usri2_comment;
		uint32 usri2_flags;
		uint32 usri2_user_id;
		uint32 usri2_next_index;
	} NET_DISPLAY_MACHINE;

	[public] typedef struct {
		string grpi3_name;
		string grpi3_comment;
		uint32 grpi3_group_id;
		uint32 grpi3_attributes;
		uint32 grpi3_next_index;
	} NET_DISPLAY_GROUP;

	[nopush,nopull] NET_API_STATUS NetQueryDisplayInformation(
		[in,unique] string *server_name,
		[in] uint32 level,
		[in] uint32 idx,
		[in] uint32 entries_requested,
		[in] uint32 prefmaxlen,
		[out,ref] uint32 *entries_read,
		[out,ref,noprint] void **buffer
		);

	/*******************************************/
	/* NetGroupAdd                             */
	/*******************************************/

	typedef struct {
		string grpi0_name;
	} GROUP_INFO_0;

	typedef struct {
		string grpi1_name;
		string grpi1_comment;
	} GROUP_INFO_1;

	typedef struct {
		string grpi2_name;
		string grpi2_comment;
		uint32 grpi2_group_id;
		uint32 grpi2_attributes;
	} GROUP_INFO_2;

	typedef struct {
		string grpi3_name;
		string grpi3_comment;
		domsid grpi3_group_sid;
		uint32 grpi3_attributes;
	} GROUP_INFO_3;

	typedef struct {
		string grpi1002_comment;
	} GROUP_INFO_1002;

	typedef struct {
		uint32 grpi1005_attributes;
	} GROUP_INFO_1005;

	[nopush,nopull] NET_API_STATUS NetGroupAdd(
		[in] string server_name,
		[in] uint32 level,
		[in] uint8 *buf,
		[out] uint32 *parm_err
		);

	/*******************************************/
	/* NetGroupDel                             */
	/*******************************************/

	[nopush,nopull] NET_API_STATUS NetGroupDel(
		[in] string server_name,
		[in] string group_name
		);

	/*******************************************/
	/* NetGroupSetInfo                         */
	/*******************************************/

	[nopush,nopull] NET_API_STATUS NetGroupSetInfo(
		[in] string server_name,
		[in] string group_name,
		[in] uint32 level,
		[in] uint8 *buf,
		[out] uint32 *parm_err
		);

	/*******************************************/
	/* NetGroupGetInfo                         */
	/*******************************************/

	[nopush,nopull] NET_API_STATUS NetGroupGetInfo(
		[in] string server_name,
		[in] string group_name,
		[in] uint32 level,
		[out] uint8 **buf
		);

	/*******************************************/
	/* NetGroupAddUser                         */
	/*******************************************/

	[nopush,nopull] NET_API_STATUS NetGroupAddUser(
		[in] string server_name,
		[in] string group_name,
		[in] string user_name
		);

	/*******************************************/
	/* NetGroupDelUser                         */
	/*******************************************/

	[nopush,nopull] NET_API_STATUS NetGroupDelUser(
		[in] string server_name,
		[in] string group_name,
		[in] string user_name
		);

	/*******************************************/
	/* NetLocalGroupAdd                        */
	/*******************************************/

	typedef struct {
		string lgrpi0_name;
	} LOCALGROUP_INFO_0;

	typedef struct {
		string lgrpi1_name;
		string lgrpi1_comment;
	} LOCALGROUP_INFO_1;

	typedef struct {
		string lgrpi1002_comment;
	} LOCALGROUP_INFO_1002;

	[nopush,nopull] NET_API_STATUS NetLocalGroupAdd(
		[in] string server_name,
		[in] uint32 level,
		[in] uint8 *buf,
		[out,ref] uint32 *parm_err
		);

	/*******************************************/
	/* NetLocalGroupDel                        */
	/*******************************************/

	[nopush,nopull] NET_API_STATUS NetLocalGroupDel(
		[in] string server_name,
		[in] string group_name
		);

	/*******************************************/
	/* NetLocalGroupGetInfo                    */
	/*******************************************/

	[nopush,nopull] NET_API_STATUS NetLocalGroupGetInfo(
		[in] string server_name,
		[in] string group_name,
		[in] uint32 level,
		[out,ref] uint8 **buf
		);

	/*******************************************/
	/* NetLocalGroupSetInfo                    */
	/*******************************************/

	[nopush,nopull] NET_API_STATUS NetLocalGroupSetInfo(
		[in] string server_name,
		[in] string group_name,
		[in] uint32 level,
		[in,ref] uint8 *buf,
		[out,ref] uint32 *parm_err
		);

	/*******************************************/
	/* NetRemoteTOD                            */
	/*******************************************/

	typedef struct {
		uint32 tod_elapsedt;
		uint32 tod_msecs;
		uint32 tod_hours;
		uint32 tod_mins;
		uint32 tod_secs;
		uint32 tod_hunds;
		int32 tod_timezone;
		uint32 tod_tinterval;
		uint32 tod_day;
		uint32 tod_month;
		uint32 tod_year;
		uint32 tod_weekday;
	} TIME_OF_DAY_INFO;

	[nopush,nopull] NET_API_STATUS NetRemoteTOD(
		[in] string server_name,
		[out,ref] uint8 **buf
		);
}