r5246: We can't use a pointer to struct lsa_info until is has been
[ira/wip.git] / source3 / rpc_server / srv_lsa_ds_nt.c
1 /* 
2  *  Unix SMB/CIFS implementation.
3  *  RPC Pipe client / server routines
4  *  Copyright (C) Andrew Tridgell               1992-1997.
5  *  Copyright (C) Luke Kenneth Casson Leighton  1996-1997.
6  *  Copyright (C) Paul Ashton                        1997.
7  *  Copyright (C) Jeremy Allison                     2001.
8  *  Copyright (C) Gerald Carter                      2002.
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *  
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *  
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23  */
24
25 /* Implementation of registry functions. */
26
27 #include "includes.h"
28
29 #undef DBGC_CLASS
30 #define DBGC_CLASS DBGC_RPC_SRV
31
32 /********************************************************************
33  Fill in a DS_DOMINFO_CTR structure
34  ********************************************************************/
35
36 static NTSTATUS fill_dsrole_dominfo_basic(TALLOC_CTX *ctx, DSROLE_PRIMARY_DOMAIN_INFO_BASIC **info) 
37 {
38         DSROLE_PRIMARY_DOMAIN_INFO_BASIC *basic;
39         const char *netbios_domain;
40         fstring dnsdomain;
41
42         DEBUG(10,("fill_dsrole_dominfo_basic: enter\n"));
43
44         if ( !(basic = TALLOC_ZERO_P(ctx, DSROLE_PRIMARY_DOMAIN_INFO_BASIC)) ) {
45                 DEBUG(0,("fill_dsrole_dominfo_basic: FATAL error!  talloc_xero() failed\n"));
46                 return NT_STATUS_NO_MEMORY;
47         }
48
49         switch ( lp_server_role() ) {
50                 case ROLE_STANDALONE:
51                         basic->machine_role = DSROLE_STANDALONE_SRV;
52                         break;
53                 case ROLE_DOMAIN_MEMBER:
54                         basic->machine_role = DSROLE_DOMAIN_MEMBER_SRV;
55                         break;
56                 case ROLE_DOMAIN_BDC:
57                         basic->machine_role = DSROLE_BDC;
58                         basic->flags = DSROLE_PRIMARY_DS_RUNNING|DSROLE_PRIMARY_DS_MIXED_MODE;
59                         if ( secrets_fetch_domain_guid( lp_workgroup(), &basic->domain_guid ) )
60                                 basic->flags |= DSROLE_PRIMARY_DOMAIN_GUID_PRESENT;
61                         get_mydnsdomname(dnsdomain);
62                         strlower_m(dnsdomain);
63                         break;
64                 case ROLE_DOMAIN_PDC:
65                         basic->machine_role = DSROLE_PDC;
66                         basic->flags = DSROLE_PRIMARY_DS_RUNNING|DSROLE_PRIMARY_DS_MIXED_MODE;
67                         if ( secrets_fetch_domain_guid( lp_workgroup(), &basic->domain_guid ) )
68                                 basic->flags |= DSROLE_PRIMARY_DOMAIN_GUID_PRESENT;
69                         get_mydnsdomname(dnsdomain);
70                         strlower_m(dnsdomain);
71                         break;
72         }
73
74         basic->unknown = 0x6173;                /* seen on the wire; maybe padding */
75
76         /* always set netbios name */
77
78         basic->netbios_ptr = 1;
79         netbios_domain = get_global_sam_name();
80         init_unistr2( &basic->netbios_domain, netbios_domain, UNI_FLAGS_NONE);
81
82         basic->dnsname_ptr = 1;
83         init_unistr2( &basic->dns_domain, dnsdomain, UNI_FLAGS_NONE);
84         basic->forestname_ptr = 1;
85         init_unistr2( &basic->forest_domain, dnsdomain, UNI_FLAGS_NONE);
86         
87
88         /* fill in some additional fields if we are a member of an AD domain */
89
90         if ( lp_security() == SEC_ADS ) {       
91                 /* TODO */
92                 ;;
93         }
94
95         *info = basic;
96
97         return NT_STATUS_OK;
98 }
99
100 /********************************************************************
101  Implement the DsroleGetPrimaryDomainInfo() call
102  ********************************************************************/
103
104 NTSTATUS _dsrole_get_primary_dominfo(pipes_struct *p, DS_Q_GETPRIMDOMINFO *q_u, DS_R_GETPRIMDOMINFO *r_u)
105 {
106         NTSTATUS result = NT_STATUS_OK;
107         uint32 level = q_u->level;
108
109         switch ( level ) {
110
111                 case DsRolePrimaryDomainInfoBasic:
112                         r_u->level = DsRolePrimaryDomainInfoBasic;
113                         r_u->ptr = 1;
114                         result = fill_dsrole_dominfo_basic( p->mem_ctx, &r_u->info.basic );
115                         break;
116
117                 default:
118                         DEBUG(0,("_dsrole_get_primary_dominfo: Unsupported info level [%d]!\n",
119                                 level));
120                         result = NT_STATUS_INVALID_LEVEL;
121         }
122
123         return result;
124 }
125
126
127