2 * Unix SMB/CIFS implementation.
4 * Copyright (C) Guenther Deschner 2007-2008
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.
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.
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/>.
21 #include "lib/netapi/netapi.h"
22 #include "lib/netapi/netapi_private.h"
24 extern bool AllowDebugChange
;
26 struct libnetapi_ctx
*stat_ctx
= NULL
;
27 TALLOC_CTX
*frame
= NULL
;
28 static bool libnetapi_initialized
= false;
30 /****************************************************************
31 ****************************************************************/
33 static NET_API_STATUS
libnetapi_init_private_context(struct libnetapi_ctx
*ctx
)
35 struct libnetapi_private_ctx
*priv
;
38 return W_ERROR_V(WERR_INVALID_PARAM
);
41 priv
= TALLOC_ZERO_P(ctx
, struct libnetapi_private_ctx
);
43 return W_ERROR_V(WERR_NOMEM
);
46 ctx
->private_data
= priv
;
48 return NET_API_STATUS_SUCCESS
;
51 /****************************************************************
52 ****************************************************************/
54 NET_API_STATUS
libnetapi_init(struct libnetapi_ctx
**context
)
56 NET_API_STATUS status
;
57 struct libnetapi_ctx
*ctx
= NULL
;
58 char *krb5_cc_env
= NULL
;
60 if (stat_ctx
&& libnetapi_initialized
) {
62 return NET_API_STATUS_SUCCESS
;
66 talloc_enable_leak_report();
68 frame
= talloc_stackframe();
70 ctx
= talloc_zero(frame
, struct libnetapi_ctx
);
73 return W_ERROR_V(WERR_NOMEM
);
80 /* prevent setup_logging() from closing x_stderr... */
82 setup_logging("libnetapi", true);
85 x_setbuf(x_stderr
, NULL
);
86 AllowDebugChange
= false;
90 if (!lp_load(get_dyn_CONFIGFILE(), true, false, false, false)) {
92 fprintf(stderr
, "lp_load failed\n");
93 return W_ERROR_V(WERR_GENERAL_FAILURE
);
96 AllowDebugChange
= true;
102 BlockSignals(True
, SIGPIPE
);
104 krb5_cc_env
= getenv(KRB5_ENV_CCNAME
);
105 if (!krb5_cc_env
|| (strlen(krb5_cc_env
) == 0)) {
106 ctx
->krb5_cc_env
= talloc_strdup(frame
, "MEMORY:libnetapi");
107 setenv(KRB5_ENV_CCNAME
, ctx
->krb5_cc_env
, 1);
110 if (getenv("USER")) {
111 ctx
->username
= talloc_strdup(frame
, getenv("USER"));
113 ctx
->username
= talloc_strdup(frame
, "");
115 if (!ctx
->username
) {
117 fprintf(stderr
, "libnetapi_init: out of memory\n");
118 return W_ERROR_V(WERR_NOMEM
);
121 status
= libnetapi_init_private_context(ctx
);
127 libnetapi_initialized
= true;
129 *context
= stat_ctx
= ctx
;
131 return NET_API_STATUS_SUCCESS
;
134 /****************************************************************
135 ****************************************************************/
137 NET_API_STATUS
libnetapi_getctx(struct libnetapi_ctx
**ctx
)
141 return NET_API_STATUS_SUCCESS
;
144 return libnetapi_init(ctx
);
147 /****************************************************************
148 ****************************************************************/
150 NET_API_STATUS
libnetapi_free(struct libnetapi_ctx
*ctx
)
153 return NET_API_STATUS_SUCCESS
;
156 libnetapi_samr_free(ctx
);
158 libnetapi_shutdown_cm(ctx
);
160 if (ctx
->krb5_cc_env
) {
161 char *env
= getenv(KRB5_ENV_CCNAME
);
162 if (env
&& (strequal(ctx
->krb5_cc_env
, env
))) {
163 unsetenv(KRB5_ENV_CCNAME
);
181 return NET_API_STATUS_SUCCESS
;
184 /****************************************************************
185 ****************************************************************/
187 NET_API_STATUS
libnetapi_set_debuglevel(struct libnetapi_ctx
*ctx
,
188 const char *debuglevel
)
190 AllowDebugChange
= true;
191 ctx
->debuglevel
= talloc_strdup(ctx
, debuglevel
);
192 if (!debug_parse_levels(debuglevel
)) {
193 return W_ERROR_V(WERR_GENERAL_FAILURE
);
195 return NET_API_STATUS_SUCCESS
;
198 /****************************************************************
199 ****************************************************************/
201 NET_API_STATUS
libnetapi_get_debuglevel(struct libnetapi_ctx
*ctx
,
204 *debuglevel
= ctx
->debuglevel
;
205 return NET_API_STATUS_SUCCESS
;
208 /****************************************************************
209 ****************************************************************/
211 NET_API_STATUS
libnetapi_set_username(struct libnetapi_ctx
*ctx
,
212 const char *username
)
214 TALLOC_FREE(ctx
->username
);
215 ctx
->username
= talloc_strdup(ctx
, username
? username
: "");
217 if (!ctx
->username
) {
218 return W_ERROR_V(WERR_NOMEM
);
220 return NET_API_STATUS_SUCCESS
;
223 NET_API_STATUS
libnetapi_set_password(struct libnetapi_ctx
*ctx
,
224 const char *password
)
226 TALLOC_FREE(ctx
->password
);
227 ctx
->password
= talloc_strdup(ctx
, password
);
228 if (!ctx
->password
) {
229 return W_ERROR_V(WERR_NOMEM
);
231 return NET_API_STATUS_SUCCESS
;
234 NET_API_STATUS
libnetapi_set_workgroup(struct libnetapi_ctx
*ctx
,
235 const char *workgroup
)
237 TALLOC_FREE(ctx
->workgroup
);
238 ctx
->workgroup
= talloc_strdup(ctx
, workgroup
);
239 if (!ctx
->workgroup
) {
240 return W_ERROR_V(WERR_NOMEM
);
242 return NET_API_STATUS_SUCCESS
;
245 /****************************************************************
246 ****************************************************************/
248 NET_API_STATUS
libnetapi_set_use_kerberos(struct libnetapi_ctx
*ctx
)
250 ctx
->use_kerberos
= true;
251 return NET_API_STATUS_SUCCESS
;
254 /****************************************************************
255 ****************************************************************/
257 const char *libnetapi_errstr(NET_API_STATUS status
)
259 if (status
& 0xc0000000) {
260 return get_friendly_nt_error_msg(NT_STATUS(status
));
263 return get_friendly_werror_msg(W_ERROR(status
));
266 /****************************************************************
267 ****************************************************************/
269 NET_API_STATUS
libnetapi_set_error_string(struct libnetapi_ctx
*ctx
,
270 const char *format
, ...)
274 TALLOC_FREE(ctx
->error_string
);
276 va_start(args
, format
);
277 ctx
->error_string
= talloc_vasprintf(ctx
, format
, args
);
280 if (!ctx
->error_string
) {
281 return W_ERROR_V(WERR_NOMEM
);
283 return NET_API_STATUS_SUCCESS
;
286 /****************************************************************
287 ****************************************************************/
289 const char *libnetapi_get_error_string(struct libnetapi_ctx
*ctx
,
290 NET_API_STATUS status_in
)
292 NET_API_STATUS status
;
293 struct libnetapi_ctx
*tmp_ctx
= ctx
;
296 status
= libnetapi_getctx(&tmp_ctx
);
302 if (tmp_ctx
->error_string
) {
303 return tmp_ctx
->error_string
;
306 return libnetapi_errstr(status_in
);
309 /****************************************************************
310 ****************************************************************/
312 NET_API_STATUS
NetApiBufferAllocate(uint32_t byte_count
,
318 return W_ERROR_V(WERR_INSUFFICIENT_BUFFER
);
321 if (byte_count
== 0) {
325 buf
= talloc_size(NULL
, byte_count
);
327 return W_ERROR_V(WERR_NOMEM
);
333 return NET_API_STATUS_SUCCESS
;
336 /****************************************************************
337 ****************************************************************/
339 NET_API_STATUS
NetApiBufferFree(void *buffer
)
342 return W_ERROR_V(WERR_INSUFFICIENT_BUFFER
);
347 return NET_API_STATUS_SUCCESS
;