#include "includes.h"
#include "lib/netapi/netapi.h"
+#include "lib/netapi/netapi_private.h"
extern bool AllowDebugChange;
return W_ERROR_V(WERR_NOMEM);
}
- DEBUGLEVEL = 0;
+ if (!DEBUGLEVEL) {
+ DEBUGLEVEL = 0;
+ }
+
+ /* prevent setup_logging() from closing x_stderr... */
+ dbf = 0;
setup_logging("libnetapi", true);
dbf = x_stderr;
if (!lp_load(get_dyn_CONFIGFILE(), true, false, false, false)) {
TALLOC_FREE(frame);
+ fprintf(stderr, "lp_load failed\n");
return W_ERROR_V(WERR_GENERAL_FAILURE);
}
setenv(KRB5_ENV_CCNAME, ctx->krb5_cc_env, 1);
}
+ ctx->username = talloc_strdup(frame, getenv("USER"));
+ if (!ctx->username) {
+ TALLOC_FREE(frame);
+ fprintf(stderr, "out of memory\n");
+ return W_ERROR_V(WERR_NOMEM);
+ }
+
libnetapi_initialized = true;
*context = stat_ctx = ctx;
NET_API_STATUS libnetapi_free(struct libnetapi_ctx *ctx)
{
+ if (!ctx) {
+ return NET_API_STATUS_SUCCESS;
+ }
+
+ libnetapi_shutdown_cm(ctx);
if (ctx->krb5_cc_env) {
char *env = getenv(KRB5_ENV_CCNAME);
gencache_shutdown();
secrets_shutdown();
- regdb_close();
TALLOC_FREE(ctx);
TALLOC_FREE(frame);
const char *username)
{
TALLOC_FREE(ctx->username);
- ctx->username = talloc_strdup(ctx, username);
+ ctx->username = talloc_strdup(ctx, username ? username : "");
+
if (!ctx->username) {
return W_ERROR_V(WERR_NOMEM);
}
/****************************************************************
****************************************************************/
-const char *libnetapi_errstr(struct libnetapi_ctx *ctx,
- NET_API_STATUS status)
+NET_API_STATUS libnetapi_set_use_kerberos(struct libnetapi_ctx *ctx)
+{
+ ctx->use_kerberos = true;
+ return NET_API_STATUS_SUCCESS;
+}
+
+/****************************************************************
+****************************************************************/
+
+const char *libnetapi_errstr(NET_API_STATUS status)
{
if (status & 0xc0000000) {
return get_friendly_nt_error_msg(NT_STATUS(status));
****************************************************************/
NET_API_STATUS libnetapi_set_error_string(struct libnetapi_ctx *ctx,
- const char *error_string)
+ const char *format, ...)
{
+ va_list args;
+
TALLOC_FREE(ctx->error_string);
- ctx->error_string = talloc_strdup(ctx, error_string);
+
+ va_start(args, format);
+ ctx->error_string = talloc_vasprintf(ctx, format, args);
+ va_end(args);
+
if (!ctx->error_string) {
return W_ERROR_V(WERR_NOMEM);
}
return NET_API_STATUS_SUCCESS;
+}
+
+/****************************************************************
+****************************************************************/
+
+const char *libnetapi_get_error_string(struct libnetapi_ctx *ctx,
+ NET_API_STATUS status_in)
+{
+ NET_API_STATUS status;
+ struct libnetapi_ctx *tmp_ctx = ctx;
+ if (!tmp_ctx) {
+ status = libnetapi_getctx(&tmp_ctx);
+ if (status != 0) {
+ return NULL;
+ }
+ }
+
+ if (tmp_ctx->error_string) {
+ return tmp_ctx->error_string;
+ }
+
+ return libnetapi_errstr(status_in);
}
/****************************************************************
****************************************************************/
-const char *libnetapi_get_error_string(struct libnetapi_ctx *ctx)
+NET_API_STATUS NetApiBufferFree(void *buffer)
{
- return ctx->error_string;
+ if (!buffer) {
+ return W_ERROR_V(WERR_INSUFFICIENT_BUFFER);
+ }
+
+ talloc_free(buffer);
+
+ return NET_API_STATUS_SUCCESS;
}