1*b3700b07SGordon Ross /* 2*b3700b07SGordon Ross * This file and its contents are supplied under the terms of the 3*b3700b07SGordon Ross * Common Development and Distribution License ("CDDL"), version 1.0. 4*b3700b07SGordon Ross * You may only use this file in accordance with the terms of version 5*b3700b07SGordon Ross * 1.0 of the CDDL. 6*b3700b07SGordon Ross * 7*b3700b07SGordon Ross * A full copy of the text of the CDDL should have accompanied this 8*b3700b07SGordon Ross * source. A copy of the CDDL is also available via the Internet at 9*b3700b07SGordon Ross * http://www.illumos.org/license/CDDL. 10*b3700b07SGordon Ross */ 11*b3700b07SGordon Ross 12*b3700b07SGordon Ross /* 13*b3700b07SGordon Ross * Copyright 2014 Nexenta Systems, Inc. All rights reserved. 14*b3700b07SGordon Ross */ 15*b3700b07SGordon Ross 16*b3700b07SGordon Ross /* 17*b3700b07SGordon Ross * Declarations intentionally similar to the MSDN SDK file 18*b3700b07SGordon Ross * winsdk/Include/DsGetDC.h 19*b3700b07SGordon Ross */ 20*b3700b07SGordon Ross 21*b3700b07SGordon Ross 22*b3700b07SGordon Ross #ifndef _ADS_DSGETDC_H 23*b3700b07SGordon Ross #define _ADS_DSGETDC_H 24*b3700b07SGordon Ross 25*b3700b07SGordon Ross #include <sys/types.h> 26*b3700b07SGordon Ross #include <sys/uuid.h> 27*b3700b07SGordon Ross 28*b3700b07SGordon Ross #ifdef __cplusplus 29*b3700b07SGordon Ross extern "C" { 30*b3700b07SGordon Ross #endif 31*b3700b07SGordon Ross 32*b3700b07SGordon Ross /* 33*b3700b07SGordon Ross * Flags to passed to DsGetDcName 34*b3700b07SGordon Ross */ 35*b3700b07SGordon Ross 36*b3700b07SGordon Ross #define DS_FORCE_REDISCOVERY 0x00000001 37*b3700b07SGordon Ross 38*b3700b07SGordon Ross #define DS_DIRECTORY_SERVICE_REQUIRED 0x00000010 39*b3700b07SGordon Ross #define DS_DIRECTORY_SERVICE_PREFERRED 0x00000020 40*b3700b07SGordon Ross #define DS_GC_SERVER_REQUIRED 0x00000040 41*b3700b07SGordon Ross #define DS_PDC_REQUIRED 0x00000080 42*b3700b07SGordon Ross #define DS_BACKGROUND_ONLY 0x00000100 43*b3700b07SGordon Ross #define DS_IP_REQUIRED 0x00000200 44*b3700b07SGordon Ross #define DS_KDC_REQUIRED 0x00000400 45*b3700b07SGordon Ross #define DS_TIMESERV_REQUIRED 0x00000800 46*b3700b07SGordon Ross #define DS_WRITABLE_REQUIRED 0x00001000 47*b3700b07SGordon Ross #define DS_GOOD_TIMESERV_PREFERRED 0x00002000 48*b3700b07SGordon Ross #define DS_AVOID_SELF 0x00004000 49*b3700b07SGordon Ross #define DS_ONLY_LDAP_NEEDED 0x00008000 50*b3700b07SGordon Ross 51*b3700b07SGordon Ross 52*b3700b07SGordon Ross #define DS_IS_FLAT_NAME 0x00010000 53*b3700b07SGordon Ross #define DS_IS_DNS_NAME 0x00020000 54*b3700b07SGordon Ross 55*b3700b07SGordon Ross #define DS_RETURN_DNS_NAME 0x40000000 56*b3700b07SGordon Ross #define DS_RETURN_FLAT_NAME 0x80000000 57*b3700b07SGordon Ross 58*b3700b07SGordon Ross /* 59*b3700b07SGordon Ross * Structure returned from DsGetDcName 60*b3700b07SGordon Ross * NB: Keep same as adspriv_dcinfo 61*b3700b07SGordon Ross */ 62*b3700b07SGordon Ross 63*b3700b07SGordon Ross typedef struct _DOMAIN_CONTROLLER_INFO { 64*b3700b07SGordon Ross char *DomainControllerName; 65*b3700b07SGordon Ross char *DomainControllerAddress; 66*b3700b07SGordon Ross uint32_t DomainControllerAddressType; 67*b3700b07SGordon Ross uuid_t DomainGuid; 68*b3700b07SGordon Ross char *DomainName; 69*b3700b07SGordon Ross char *DnsForestName; 70*b3700b07SGordon Ross uint32_t Flags; 71*b3700b07SGordon Ross char *DcSiteName; 72*b3700b07SGordon Ross char *ClientSiteName; 73*b3700b07SGordon Ross uint8_t _sockaddr[256]; 74*b3700b07SGordon Ross } DOMAIN_CONTROLLER_INFO, *PDOMAIN_CONTROLLER_INFO; 75*b3700b07SGordon Ross 76*b3700b07SGordon Ross /* 77*b3700b07SGordon Ross * Values for DomainControllerAddressType 78*b3700b07SGordon Ross */ 79*b3700b07SGordon Ross 80*b3700b07SGordon Ross #define DS_INET_ADDRESS 1 81*b3700b07SGordon Ross #define DS_NETBIOS_ADDRESS 2 82*b3700b07SGordon Ross 83*b3700b07SGordon Ross /* 84*b3700b07SGordon Ross * Values for returned Flags 85*b3700b07SGordon Ross */ 86*b3700b07SGordon Ross 87*b3700b07SGordon Ross #define DS_PDC_FLAG 0x00000001 /* DC is PDC of Domain */ 88*b3700b07SGordon Ross #define DS_GC_FLAG 0x00000004 /* DC is a GC of forest */ 89*b3700b07SGordon Ross #define DS_LDAP_FLAG 0x00000008 /* supports an LDAP server */ 90*b3700b07SGordon Ross #define DS_DS_FLAG 0x00000010 /* supports a DS and is a */ 91*b3700b07SGordon Ross /* Domain Controller */ 92*b3700b07SGordon Ross #define DS_KDC_FLAG 0x00000020 /* is running KDC service */ 93*b3700b07SGordon Ross #define DS_TIMESERV_FLAG 0x00000040 /* is running time service */ 94*b3700b07SGordon Ross #define DS_CLOSEST_FLAG 0x00000080 /* DC is in closest site */ 95*b3700b07SGordon Ross /* to the client */ 96*b3700b07SGordon Ross #define DS_WRITABLE_FLAG 0x00000100 /* DC has a writable DS */ 97*b3700b07SGordon Ross #define DS_GOOD_TIMESERV_FLAG 0x00000200 /* is running time service */ 98*b3700b07SGordon Ross /* (and has clock hardware) */ 99*b3700b07SGordon Ross #define DS_NDNC_FLAG 0x00000400 /* DomainName is non-domain */ 100*b3700b07SGordon Ross /* NC serviced by the */ 101*b3700b07SGordon Ross /* LDAP server */ 102*b3700b07SGordon Ross #define DS_PING_FLAGS 0x0000FFFF /* Flags returned on ping */ 103*b3700b07SGordon Ross 104*b3700b07SGordon Ross #define DS_DNS_CONTROLLER_FLAG 0x20000000 /* DC Name is a DNS name */ 105*b3700b07SGordon Ross #define DS_DNS_DOMAIN_FLAG 0x40000000 /* DomainName is a DNS name */ 106*b3700b07SGordon Ross #define DS_DNS_FOREST_FLAG 0x80000000 /* ForestName is a DNS name */ 107*b3700b07SGordon Ross 108*b3700b07SGordon Ross 109*b3700b07SGordon Ross /* 110*b3700b07SGordon Ross * Function Prototypes 111*b3700b07SGordon Ross */ 112*b3700b07SGordon Ross 113*b3700b07SGordon Ross /* Offial API. Returns an NT error number. */ 114*b3700b07SGordon Ross extern int 115*b3700b07SGordon Ross DsGetDcName(const char *ComputerName, 116*b3700b07SGordon Ross const char *DomainName, const struct uuid *DomainGuid, 117*b3700b07SGordon Ross const char *SiteName, uint32_t Flags, 118*b3700b07SGordon Ross DOMAIN_CONTROLLER_INFO **dcinfo); 119*b3700b07SGordon Ross 120*b3700b07SGordon Ross /* internal version of above - returns a detailed NT status */ 121*b3700b07SGordon Ross extern uint32_t 122*b3700b07SGordon Ross _DsGetDcName(const char *ComputerName, 123*b3700b07SGordon Ross const char *DomainName, const struct uuid *DomainGuid, 124*b3700b07SGordon Ross const char *SiteName, uint32_t Flags, 125*b3700b07SGordon Ross DOMAIN_CONTROLLER_INFO **dcinfo); 126*b3700b07SGordon Ross 127*b3700b07SGordon Ross extern int 128*b3700b07SGordon Ross DsGetSiteName( 129*b3700b07SGordon Ross const char *ComputerName, 130*b3700b07SGordon Ross char **SiteName); 131*b3700b07SGordon Ross 132*b3700b07SGordon Ross /* 133*b3700b07SGordon Ross * XXX: Others from DsGetDc.h we may want later: 134*b3700b07SGordon Ross * DsValidateSubnetName() 135*b3700b07SGordon Ross * DsAddressToSiteNames() 136*b3700b07SGordon Ross * DsAddressToSiteNamesEx() 137*b3700b07SGordon Ross * DsEnumerateDomainTrusts() 138*b3700b07SGordon Ross * DsGetForestTrustInformation() 139*b3700b07SGordon Ross * DsGetDcSiteCoverage() 140*b3700b07SGordon Ross * DsDeregisterDnsHostRecords() 141*b3700b07SGordon Ross * DsGetDcOpen(), DsGetDcNext(), DsGetDcClose() 142*b3700b07SGordon Ross */ 143*b3700b07SGordon Ross 144*b3700b07SGordon Ross /* 145*b3700b07SGordon Ross * Until we can easily allocate a DC Info as one big hunk. 146*b3700b07SGordon Ross * This will free a DC Info returned by DsGetDcName(). 147*b3700b07SGordon Ross */ 148*b3700b07SGordon Ross extern void 149*b3700b07SGordon Ross DsFreeDcInfo(DOMAIN_CONTROLLER_INFO *); 150*b3700b07SGordon Ross 151*b3700b07SGordon Ross /* 152*b3700b07SGordon Ross * Internal function to force DC Rediscovery. 153*b3700b07SGordon Ross */ 154*b3700b07SGordon Ross extern int 155*b3700b07SGordon Ross _DsForceRediscovery(char *domain, int flags); 156*b3700b07SGordon Ross 157*b3700b07SGordon Ross #ifdef __cplusplus 158*b3700b07SGordon Ross } 159*b3700b07SGordon Ross #endif 160*b3700b07SGordon Ross 161*b3700b07SGordon Ross #endif /* _ADS_DSGETDC_H */ 162