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 NET_API_STATUS
libnetapi_init(struct libnetapi_ctx
**context
)
35 struct libnetapi_ctx
*ctx
= NULL
;
36 char *krb5_cc_env
= NULL
;
38 if (stat_ctx
&& libnetapi_initialized
) {
40 return NET_API_STATUS_SUCCESS
;
44 talloc_enable_leak_report();
46 frame
= talloc_stackframe();
48 ctx
= talloc_zero(frame
, struct libnetapi_ctx
);
51 return W_ERROR_V(WERR_NOMEM
);
58 /* prevent setup_logging() from closing x_stderr... */
60 setup_logging("libnetapi", true);
63 x_setbuf(x_stderr
, NULL
);
64 AllowDebugChange
= false;
68 if (!lp_load(get_dyn_CONFIGFILE(), true, false, false, false)) {
70 fprintf(stderr
, "lp_load failed\n");
71 return W_ERROR_V(WERR_GENERAL_FAILURE
);
74 AllowDebugChange
= true;
80 BlockSignals(True
, SIGPIPE
);
82 krb5_cc_env
= getenv(KRB5_ENV_CCNAME
);
83 if (!krb5_cc_env
|| (strlen(krb5_cc_env
) == 0)) {
84 ctx
->krb5_cc_env
= talloc_strdup(frame
, "MEMORY:libnetapi");
85 setenv(KRB5_ENV_CCNAME
, ctx
->krb5_cc_env
, 1);
89 ctx
->username
= talloc_strdup(frame
, getenv("USER"));
91 ctx
->username
= talloc_strdup(frame
, "");
95 fprintf(stderr
, "libnetapi_init: out of memory\n");
96 return W_ERROR_V(WERR_NOMEM
);
99 libnetapi_initialized
= true;
101 *context
= stat_ctx
= ctx
;
103 return NET_API_STATUS_SUCCESS
;
106 /****************************************************************
107 ****************************************************************/
109 NET_API_STATUS
libnetapi_getctx(struct libnetapi_ctx
**ctx
)
113 return NET_API_STATUS_SUCCESS
;
116 return libnetapi_init(ctx
);
119 /****************************************************************
120 ****************************************************************/
122 NET_API_STATUS
libnetapi_free(struct libnetapi_ctx
*ctx
)
125 return NET_API_STATUS_SUCCESS
;
128 libnetapi_shutdown_cm(ctx
);
130 if (ctx
->krb5_cc_env
) {
131 char *env
= getenv(KRB5_ENV_CCNAME
);
132 if (env
&& (strequal(ctx
->krb5_cc_env
, env
))) {
133 unsetenv(KRB5_ENV_CCNAME
);
151 return NET_API_STATUS_SUCCESS
;
154 /****************************************************************
155 ****************************************************************/
157 NET_API_STATUS
libnetapi_set_debuglevel(struct libnetapi_ctx
*ctx
,
158 const char *debuglevel
)
160 AllowDebugChange
= true;
161 ctx
->debuglevel
= talloc_strdup(ctx
, debuglevel
);
162 if (!debug_parse_levels(debuglevel
)) {
163 return W_ERROR_V(WERR_GENERAL_FAILURE
);
165 return NET_API_STATUS_SUCCESS
;
168 /****************************************************************
169 ****************************************************************/
171 NET_API_STATUS
libnetapi_get_debuglevel(struct libnetapi_ctx
*ctx
,
174 *debuglevel
= ctx
->debuglevel
;
175 return NET_API_STATUS_SUCCESS
;
178 /****************************************************************
179 ****************************************************************/
181 NET_API_STATUS
libnetapi_set_username(struct libnetapi_ctx
*ctx
,
182 const char *username
)
184 TALLOC_FREE(ctx
->username
);
185 ctx
->username
= talloc_strdup(ctx
, username
? username
: "");
187 if (!ctx
->username
) {
188 return W_ERROR_V(WERR_NOMEM
);
190 return NET_API_STATUS_SUCCESS
;
193 NET_API_STATUS
libnetapi_set_password(struct libnetapi_ctx
*ctx
,
194 const char *password
)
196 TALLOC_FREE(ctx
->password
);
197 ctx
->password
= talloc_strdup(ctx
, password
);
198 if (!ctx
->password
) {
199 return W_ERROR_V(WERR_NOMEM
);
201 return NET_API_STATUS_SUCCESS
;
204 NET_API_STATUS
libnetapi_set_workgroup(struct libnetapi_ctx
*ctx
,
205 const char *workgroup
)
207 TALLOC_FREE(ctx
->workgroup
);
208 ctx
->workgroup
= talloc_strdup(ctx
, workgroup
);
209 if (!ctx
->workgroup
) {
210 return W_ERROR_V(WERR_NOMEM
);
212 return NET_API_STATUS_SUCCESS
;
215 /****************************************************************
216 ****************************************************************/
218 NET_API_STATUS
libnetapi_set_use_kerberos(struct libnetapi_ctx
*ctx
)
220 ctx
->use_kerberos
= true;
221 return NET_API_STATUS_SUCCESS
;
224 /****************************************************************
225 ****************************************************************/
227 const char *libnetapi_errstr(NET_API_STATUS status
)
229 if (status
& 0xc0000000) {
230 return get_friendly_nt_error_msg(NT_STATUS(status
));
233 return get_friendly_werror_msg(W_ERROR(status
));
236 /****************************************************************
237 ****************************************************************/
239 NET_API_STATUS
libnetapi_set_error_string(struct libnetapi_ctx
*ctx
,
240 const char *format
, ...)
244 TALLOC_FREE(ctx
->error_string
);
246 va_start(args
, format
);
247 ctx
->error_string
= talloc_vasprintf(ctx
, format
, args
);
250 if (!ctx
->error_string
) {
251 return W_ERROR_V(WERR_NOMEM
);
253 return NET_API_STATUS_SUCCESS
;
256 /****************************************************************
257 ****************************************************************/
259 const char *libnetapi_get_error_string(struct libnetapi_ctx
*ctx
,
260 NET_API_STATUS status_in
)
262 NET_API_STATUS status
;
263 struct libnetapi_ctx
*tmp_ctx
= ctx
;
266 status
= libnetapi_getctx(&tmp_ctx
);
272 if (tmp_ctx
->error_string
) {
273 return tmp_ctx
->error_string
;
276 return libnetapi_errstr(status_in
);
279 /****************************************************************
280 ****************************************************************/
282 NET_API_STATUS
NetApiBufferFree(void *buffer
)
285 return W_ERROR_V(WERR_INSUFFICIENT_BUFFER
);
290 return NET_API_STATUS_SUCCESS
;