Enable talloc reporting in libnetapi if DEVELOPER compiled.
[metze/samba/wip.git] / source3 / lib / netapi / netapi.c
1 /*
2  *  Unix SMB/CIFS implementation.
3  *  NetApi Support
4  *  Copyright (C) Guenther Deschner 2007-2008
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 3 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include "includes.h"
21 #include "lib/netapi/netapi.h"
22
23 extern bool AllowDebugChange;
24
25 struct libnetapi_ctx *stat_ctx = NULL;
26 TALLOC_CTX *frame = NULL;
27 static bool libnetapi_initialized = false;
28
29 /****************************************************************
30 ****************************************************************/
31
32 NET_API_STATUS libnetapi_init(struct libnetapi_ctx **context)
33 {
34         struct libnetapi_ctx *ctx = NULL;
35         char *krb5_cc_env = NULL;
36
37         if (stat_ctx && libnetapi_initialized) {
38                 *context = stat_ctx;
39                 return NET_API_STATUS_SUCCESS;
40         }
41
42 #ifdef DEVELOPER
43         talloc_enable_leak_report();
44 #endif
45         frame = talloc_stackframe();
46
47         ctx = talloc_zero(frame, struct libnetapi_ctx);
48         if (!ctx) {
49                 TALLOC_FREE(frame);
50                 return W_ERROR_V(WERR_NOMEM);
51         }
52
53         DEBUGLEVEL = 0;
54         setup_logging("libnetapi", true);
55
56         dbf = x_stderr;
57         x_setbuf(x_stderr, NULL);
58         AllowDebugChange = false;
59
60         load_case_tables();
61
62         if (!lp_load(get_dyn_CONFIGFILE(), true, false, false, false)) {
63                 TALLOC_FREE(frame);
64                 return W_ERROR_V(WERR_GENERAL_FAILURE);
65         }
66
67         AllowDebugChange = true;
68
69         init_names();
70         load_interfaces();
71         reopen_logs();
72
73         BlockSignals(True, SIGPIPE);
74
75         krb5_cc_env = getenv(KRB5_ENV_CCNAME);
76         if (!krb5_cc_env || (strlen(krb5_cc_env) == 0)) {
77                 ctx->krb5_cc_env = talloc_strdup(frame, "MEMORY:libnetapi");
78                 setenv(KRB5_ENV_CCNAME, ctx->krb5_cc_env, 1);
79         }
80
81         libnetapi_initialized = true;
82
83         *context = stat_ctx = ctx;
84
85         return NET_API_STATUS_SUCCESS;
86 }
87
88 /****************************************************************
89 ****************************************************************/
90
91 NET_API_STATUS libnetapi_getctx(struct libnetapi_ctx **ctx)
92 {
93         if (stat_ctx) {
94                 *ctx = stat_ctx;
95                 return NET_API_STATUS_SUCCESS;
96         }
97
98         return libnetapi_init(ctx);
99 }
100
101 /****************************************************************
102 ****************************************************************/
103
104 NET_API_STATUS libnetapi_free(struct libnetapi_ctx *ctx)
105 {
106         gfree_names();
107         gfree_loadparm();
108         gfree_case_tables();
109         gfree_charcnv();
110         gfree_interfaces();
111
112         gencache_shutdown();
113         secrets_shutdown();
114         regdb_close();
115
116         if (ctx->krb5_cc_env &&
117             (strequal(ctx->krb5_cc_env, getenv(KRB5_ENV_CCNAME)))) {
118                 unsetenv(KRB5_ENV_CCNAME);
119         }
120
121         TALLOC_FREE(ctx);
122         TALLOC_FREE(frame);
123
124         gfree_debugsyms();
125
126         return NET_API_STATUS_SUCCESS;
127 }
128
129 /****************************************************************
130 ****************************************************************/
131
132 NET_API_STATUS libnetapi_set_debuglevel(struct libnetapi_ctx *ctx,
133                                         const char *debuglevel)
134 {
135         AllowDebugChange = true;
136         ctx->debuglevel = talloc_strdup(ctx, debuglevel);
137         if (!debug_parse_levels(debuglevel)) {
138                 return W_ERROR_V(WERR_GENERAL_FAILURE);
139         }
140         return NET_API_STATUS_SUCCESS;
141 }
142
143 /****************************************************************
144 ****************************************************************/
145
146 NET_API_STATUS libnetapi_get_debuglevel(struct libnetapi_ctx *ctx,
147                                         char **debuglevel)
148 {
149         *debuglevel = ctx->debuglevel;
150         return NET_API_STATUS_SUCCESS;
151 }
152
153 /****************************************************************
154 ****************************************************************/
155
156 NET_API_STATUS libnetapi_set_username(struct libnetapi_ctx *ctx,
157                                       const char *username)
158 {
159         TALLOC_FREE(ctx->username);
160         ctx->username = talloc_strdup(ctx, username);
161         if (!ctx->username) {
162                 return W_ERROR_V(WERR_NOMEM);
163         }
164         return NET_API_STATUS_SUCCESS;
165 }
166
167 NET_API_STATUS libnetapi_set_password(struct libnetapi_ctx *ctx,
168                                       const char *password)
169 {
170         TALLOC_FREE(ctx->password);
171         ctx->password = talloc_strdup(ctx, password);
172         if (!ctx->password) {
173                 return W_ERROR_V(WERR_NOMEM);
174         }
175         return NET_API_STATUS_SUCCESS;
176 }
177
178 NET_API_STATUS libnetapi_set_workgroup(struct libnetapi_ctx *ctx,
179                                        const char *workgroup)
180 {
181         TALLOC_FREE(ctx->workgroup);
182         ctx->workgroup = talloc_strdup(ctx, workgroup);
183         if (!ctx->workgroup) {
184                 return W_ERROR_V(WERR_NOMEM);
185         }
186         return NET_API_STATUS_SUCCESS;
187 }
188
189 /****************************************************************
190 ****************************************************************/
191
192 const char *libnetapi_errstr(struct libnetapi_ctx *ctx,
193                              NET_API_STATUS status)
194 {
195         if (status & 0xc0000000) {
196                 return get_friendly_nt_error_msg(NT_STATUS(status));
197         }
198
199         return get_friendly_werror_msg(W_ERROR(status));
200 }
201
202 /****************************************************************
203 ****************************************************************/
204
205 NET_API_STATUS libnetapi_set_error_string(struct libnetapi_ctx *ctx,
206                                           const char *error_string)
207 {
208         TALLOC_FREE(ctx->error_string);
209         ctx->error_string = talloc_strdup(ctx, error_string);
210         if (!ctx->error_string) {
211                 return W_ERROR_V(WERR_NOMEM);
212         }
213         return NET_API_STATUS_SUCCESS;
214
215 }
216
217 /****************************************************************
218 ****************************************************************/
219
220 const char *libnetapi_get_error_string(struct libnetapi_ctx *ctx)
221 {
222         return ctx->error_string;
223 }