diff options
| author | Jelmer Vernooij <jelmer@samba.org> | 2008-01-05 23:09:38 +0100 | 
|---|---|---|
| committer | Jelmer Vernooij <jelmer@samba.org> | 2008-01-05 23:09:38 +0100 | 
| commit | aaa27706664da2855c09da0691c3717b571edaba (patch) | |
| tree | 17cc8a7475f7062eb664d0201d660c77bf415a7e /source3/lib | |
| parent | 3ba8fbef29aabfcd78e1170fcbfcf7bc943af6f9 (diff) | |
| parent | 4a413e4bd177402a1697cffac43d35e94cc55102 (diff) | |
| download | samba-aaa27706664da2855c09da0691c3717b571edaba.tar.gz samba-aaa27706664da2855c09da0691c3717b571edaba.tar.bz2 samba-aaa27706664da2855c09da0691c3717b571edaba.zip  | |
Merge branch 'v3-2-test' of ssh://git.samba.org/data/git/samba into v3-2-test
(This used to be commit 5a30f6377d37d8a5cadce4fb9a2fc19b78fc1709)
Diffstat (limited to 'source3/lib')
| -rw-r--r-- | source3/lib/debug.c | 11 | ||||
| -rw-r--r-- | source3/lib/dummysmbd.c | 1 | ||||
| -rw-r--r-- | source3/lib/gencache.c | 15 | ||||
| -rw-r--r-- | source3/lib/interfaces.c | 1 | ||||
| -rw-r--r-- | source3/lib/memcache.c | 2 | ||||
| -rw-r--r-- | source3/lib/netapi/examples/netdomjoin-gui/logo-small.png | bin | 0 -> 4485 bytes | |||
| -rw-r--r-- | source3/lib/netapi/examples/netdomjoin-gui/netdomjoin-gui.c | 98 | ||||
| -rw-r--r-- | source3/lib/netapi/examples/netdomjoin/netdomjoin.c | 12 | ||||
| -rw-r--r-- | source3/lib/netapi/joindomain.c | 43 | ||||
| -rw-r--r-- | source3/lib/netapi/serverinfo.c | 5 | ||||
| -rw-r--r-- | source3/lib/popt_common.c | 6 | ||||
| -rw-r--r-- | source3/lib/replace/system/network.h | 4 | ||||
| -rw-r--r-- | source3/lib/secace.c | 4 | ||||
| -rw-r--r-- | source3/lib/secdesc.c | 87 | ||||
| -rw-r--r-- | source3/lib/sharesec.c | 2 | ||||
| -rw-r--r-- | source3/lib/util.c | 52 | ||||
| -rw-r--r-- | source3/lib/util_reg_smbconf.c | 4 | ||||
| -rw-r--r-- | source3/lib/util_sid.c | 18 | ||||
| -rw-r--r-- | source3/lib/util_sock.c | 214 | ||||
| -rw-r--r-- | source3/lib/winbind_util.c | 49 | 
20 files changed, 326 insertions, 302 deletions
diff --git a/source3/lib/debug.c b/source3/lib/debug.c index 87ec9ed8f5..9ea2dc151a 100644 --- a/source3/lib/debug.c +++ b/source3/lib/debug.c @@ -785,13 +785,13 @@ void check_log_size( void )  			(void)x_vfprintf( dbf, format_str, ap );  		va_end( ap );  		errno = old_errno; -		return( 0 ); +		goto done;  	}  	/* prevent recursion by checking if reopen_logs() has temporaily  	   set the debugf string to NULL */  	if( debugf == NULL) -		return( 0 ); +		goto done;  #ifdef WITH_SYSLOG  	if( !lp_syslog_only() ) @@ -806,7 +806,7 @@ void check_log_size( void )  				x_setbuf( dbf, NULL );  			} else {  				errno = old_errno; -				return(0); +				goto done;  			}  		}  	} @@ -855,10 +855,11 @@ void check_log_size( void )  			(void)x_fflush( dbf );  	} -	errno = old_errno; - + done:  	TALLOC_FREE(tmp_debug_ctx); +	errno = old_errno; +  	return( 0 );  } diff --git a/source3/lib/dummysmbd.c b/source3/lib/dummysmbd.c index e3b179b763..dbe886e3d1 100644 --- a/source3/lib/dummysmbd.c +++ b/source3/lib/dummysmbd.c @@ -51,4 +51,3 @@ NTSTATUS can_delete_directory(struct connection_struct *conn,  {  	return NT_STATUS_OK;  } - diff --git a/source3/lib/gencache.c b/source3/lib/gencache.c index a50e5d01fa..663385cfe3 100644 --- a/source3/lib/gencache.c +++ b/source3/lib/gencache.c @@ -32,7 +32,6 @@  #define BLOB_TYPE_LEN 9  static TDB_CONTEXT *cache; -static bool cache_readonly;  /**   * @file gencache.c @@ -67,7 +66,6 @@ bool gencache_init(void)  	if (!cache && (errno == EACCES)) {  		cache = tdb_open_log(cache_fname, 0, TDB_DEFAULT, O_RDONLY, 0644);  		if (cache) { -			cache_readonly = True;  			DEBUG(5, ("gencache_init: Opening cache file %s read-only.\n", cache_fname));  		}  	} @@ -95,7 +93,6 @@ bool gencache_shutdown(void)  	DEBUG(5, ("Closing cache file\n"));  	ret = tdb_close(cache);  	cache = NULL; -	cache_readonly = False;  	return ret != -1;  } @@ -123,10 +120,6 @@ bool gencache_set(const char *keystr, const char *value, time_t timeout)  	if (!gencache_init()) return False; -	if (cache_readonly) { -		return False; -	} -  	asprintf(&valstr, CACHE_DATA_FMT, (int)timeout, value);  	if (!valstr)  		return False; @@ -161,10 +154,6 @@ bool gencache_del(const char *keystr)  	if (!gencache_init()) return False;	 -	if (cache_readonly) { -		return False; -	} -  	DEBUG(10, ("Deleting cache entry (key = %s)\n", keystr));  	ret = tdb_delete_bystring(cache, keystr); @@ -351,10 +340,6 @@ bool gencache_set_data_blob(const char *keystr, DATA_BLOB *blob, time_t timeout)  		return False;  	} -	if (cache_readonly) { -		return False; -	} -  	asprintf(&valstr, "%12u/%s", (int)timeout, BLOB_TYPE);  	if (!valstr) {  		return False; diff --git a/source3/lib/interfaces.c b/source3/lib/interfaces.c index 722ab56abd..3797fc679d 100644 --- a/source3/lib/interfaces.c +++ b/source3/lib/interfaces.c @@ -84,6 +84,7 @@  #include <net/if.h>  #endif +#define SOCKET_WRAPPER_NOT_REPLACE  #include "interfaces.h"  #include "lib/replace/replace.h" diff --git a/source3/lib/memcache.c b/source3/lib/memcache.c index 457586bd68..6dee61af50 100644 --- a/source3/lib/memcache.c +++ b/source3/lib/memcache.c @@ -46,6 +46,8 @@ static bool memcache_is_talloc(enum memcache_number n)  	switch (n) {  	case GETPWNAM_CACHE: +	case PDB_GETPWSID_CACHE: +	case SINGLETON_CACHE_TALLOC:  		result = true;  		break;  	default: diff --git a/source3/lib/netapi/examples/netdomjoin-gui/logo-small.png b/source3/lib/netapi/examples/netdomjoin-gui/logo-small.png Binary files differnew file mode 100644 index 0000000000..f041198002 --- /dev/null +++ b/source3/lib/netapi/examples/netdomjoin-gui/logo-small.png diff --git a/source3/lib/netapi/examples/netdomjoin-gui/netdomjoin-gui.c b/source3/lib/netapi/examples/netdomjoin-gui/netdomjoin-gui.c index beb12be8b1..d12e66bb26 100644 --- a/source3/lib/netapi/examples/netdomjoin-gui/netdomjoin-gui.c +++ b/source3/lib/netapi/examples/netdomjoin-gui/netdomjoin-gui.c @@ -1,7 +1,7 @@  /*   *  Unix SMB/CIFS implementation.   *  Join Support (gtk + netapi) - *  Copyright (C) Guenther Deschner 2007 + *  Copyright (C) Guenther Deschner 2007-2008   *   *  This program is free software; you can redistribute it and/or modify   *  it under the terms of the GNU General Public License as published by @@ -35,6 +35,7 @@  #define SAMBA_ICON_PATH  "/usr/share/pixmaps/samba/samba.ico"  #define SAMBA_IMAGE_PATH "/usr/share/pixmaps/samba/logo.png" +#define SAMBA_IMAGE_PATH_SMALL "/usr/share/pixmaps/samba/logo-small.png"  #define WKSSVC_JOIN_FLAGS_DOMAIN_JOIN_IF_JOINED ( 0x00000020 )  #define WKSSVC_JOIN_FLAGS_ACCOUNT_DELETE ( 0x00000004 ) @@ -124,7 +125,6 @@ static void free_join_state(struct join_state *s)  	SAFE_FREE(s->my_fqdn);  	SAFE_FREE(s->my_dnsdomain);  	SAFE_FREE(s->my_hostname); -  }  static void do_cleanup(struct join_state *state) @@ -225,7 +225,8 @@ static void callback_do_reboot(GtkWidget *widget,  	gtk_widget_destroy(dialog);  #endif -	gtk_label_set_text(GTK_LABEL(state->label_reboot), "Changes will take effect after you restart this computer"); +	gtk_label_set_text(GTK_LABEL(state->label_reboot), +			   "Changes will take effect after you restart this computer");  	debug("destroying do_change window\n");  	gtk_widget_destroy(GTK_WIDGET(state->window_do_change)); @@ -248,11 +249,14 @@ static void callback_do_reboot(GtkWidget *widget,  		SAFE_FREE(buffer);  		state->name_type_new = type;  #endif -		gtk_label_set_text(GTK_LABEL(state->label_current_name_buffer), state->name_buffer_new); -		if (state->name_type_new == 3) { -			gtk_label_set_text(GTK_LABEL(state->label_current_name_type), "Domain:"); +		gtk_label_set_text(GTK_LABEL(state->label_current_name_buffer), +				   state->name_buffer_new); +		if (state->name_type_new == NetSetupDomainName) { +			gtk_label_set_text(GTK_LABEL(state->label_current_name_type), +					   "Domain:");  		} else { -			gtk_label_set_text(GTK_LABEL(state->label_current_name_type), "Workgroup:"); +			gtk_label_set_text(GTK_LABEL(state->label_current_name_type), +					   "Workgroup:");  		}  	}  } @@ -365,7 +369,8 @@ static void callback_do_join(GtkWidget *widget,  	uint32_t unjoin_flags = 0;  	gboolean domain_join = FALSE;  	gboolean try_unjoin = FALSE; -	const char *domain_or_workgroup = NULL; +	const char *new_workgroup_type = NULL; +	const char *initial_workgroup_type = NULL;  	struct join_state *state = (struct join_state *)data; @@ -376,14 +381,33 @@ static void callback_do_join(GtkWidget *widget,  		gtk_widget_destroy(GTK_WIDGET(state->window_creds_prompt));  	} +	switch (state->name_type_initial) { +		case NetSetupWorkgroupName: +			initial_workgroup_type = "workgroup"; +			break; +		case NetSetupDomainName: +			initial_workgroup_type = "domain"; +			break; +		default: +			break; +	} + +	switch (state->name_type_new) { +		case NetSetupWorkgroupName: +			new_workgroup_type = "workgroup"; +			break; +		case NetSetupDomainName: +			new_workgroup_type = "domain"; +			break; +		default: +			break; +	} +  	if (state->name_type_new == NetSetupDomainName) {  		domain_join = TRUE;  		join_flags = WKSSVC_JOIN_FLAGS_JOIN_TYPE |  			     WKSSVC_JOIN_FLAGS_ACCOUNT_CREATE |  			     WKSSVC_JOIN_FLAGS_DOMAIN_JOIN_IF_JOINED; /* for testing */ -		domain_or_workgroup = "domain"; -	} else { -		domain_or_workgroup = "workgroup";  	}  	if ((state->name_type_initial == NetSetupDomainName) && @@ -394,7 +418,7 @@ static void callback_do_join(GtkWidget *widget,  	}  	debug("callback_do_join: Joining a %s named %s using join_flags 0x%08x ", -		domain_or_workgroup, +		new_workgroup_type,  		state->name_buffer_new,  		join_flags);  	if (domain_join) { @@ -422,8 +446,8 @@ static void callback_do_join(GtkWidget *widget,  							GTK_MESSAGE_ERROR,  							GTK_BUTTONS_CLOSE,  							"The following error occured attempting to unjoin the %s: \"%s\": %s", -							domain_or_workgroup, -							state->name_buffer_new, +							initial_workgroup_type, +							state->name_buffer_initial,  							err_str);  			g_signal_connect_swapped(dialog, "response", @@ -451,7 +475,7 @@ static void callback_do_join(GtkWidget *widget,  						GTK_MESSAGE_ERROR,  						GTK_BUTTONS_CLOSE,  						"The following error occured attempting to join the %s: \"%s\": %s", -						domain_or_workgroup, +						new_workgroup_type,  						state->name_buffer_new,  						err_str); @@ -465,7 +489,7 @@ static void callback_do_join(GtkWidget *widget,  	}  	debug("callback_do_join: Successfully joined %s\n", -		domain_or_workgroup); +		new_workgroup_type);  	dialog = gtk_message_dialog_new(GTK_WINDOW(state->window_parent),  					GTK_DIALOG_DESTROY_WITH_PARENT, @@ -473,7 +497,7 @@ static void callback_do_join(GtkWidget *widget,  					GTK_BUTTONS_OK,  					"Welcome to the %s %s.",  					state->name_buffer_new, -					domain_or_workgroup); +					new_workgroup_type);  	gtk_dialog_run(GTK_DIALOG(dialog));  	gtk_widget_destroy(dialog); @@ -760,6 +784,8 @@ static void callback_do_change(GtkWidget *widget,  	debug("callback_do_change called\n"); +#if 0 +	/* FIXME: add proper warnings for Samba as a DC */  	if (state->server_role == 3) {  		GtkWidget *dialog;  		dialog = gtk_message_dialog_new(GTK_WINDOW(state->window_main), @@ -774,13 +800,14 @@ static void callback_do_change(GtkWidget *widget,  		gtk_widget_show(dialog);  		return;  	} +#endif  	state->button_ok = gtk_button_new_from_stock(GTK_STOCK_OK);  	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  	gtk_window_set_title(GTK_WINDOW(window), "Computer Name Changes");  	gtk_window_set_resizable(GTK_WINDOW(window), FALSE); -	gtk_widget_set_size_request(GTK_WIDGET(window), 480, 500); /* breite * höhe */ +	gtk_widget_set_size_request(GTK_WIDGET(window), 480, 500);  	gtk_window_set_icon_from_file(GTK_WINDOW(window), SAMBA_ICON_PATH, NULL);  	g_signal_connect(G_OBJECT(window), "delete_event", @@ -830,14 +857,17 @@ static void callback_do_change(GtkWidget *widget,  		char *str = NULL;  		entry_text = gtk_entry_get_text(GTK_ENTRY(entry));  		if (state->name_type_initial == NetSetupDomainName) { -			asprintf(&str, "%s.%s", entry_text, state->my_dnsdomain); +			asprintf(&str, "%s.%s", entry_text, +				 state->my_dnsdomain);  		} else {  			asprintf(&str, "%s.", entry_text);  		} -		gtk_label_set_text(GTK_LABEL(state->label_full_computer_name), str); +		gtk_label_set_text(GTK_LABEL(state->label_full_computer_name), +				   str);  		free(str);  		gtk_misc_set_alignment(GTK_MISC(state->label_full_computer_name), 0, 0); -		gtk_box_pack_start(GTK_BOX(box1), state->label_full_computer_name, TRUE, TRUE, 0); +		gtk_box_pack_start(GTK_BOX(box1), +				   state->label_full_computer_name, TRUE, TRUE, 0);  		gtk_widget_show(state->label_full_computer_name);  	} @@ -872,7 +902,8 @@ static void callback_do_change(GtkWidget *widget,  				 G_CALLBACK(callback_continue),  				 (gpointer)state);  		if (state->name_type_initial == NetSetupDomainName) { -			gtk_entry_set_text(GTK_ENTRY(state->entry_domain), state->name_buffer_initial); +			gtk_entry_set_text(GTK_ENTRY(state->entry_domain), +					   state->name_buffer_initial);  			gtk_widget_set_sensitive(state->entry_workgroup, FALSE);  			gtk_widget_set_sensitive(state->entry_domain, TRUE);  		} @@ -893,7 +924,8 @@ static void callback_do_change(GtkWidget *widget,  			 G_CALLBACK(callback_do_join_workgroup),  			 (gpointer)state);  	{ -		gtk_entry_set_max_length(GTK_ENTRY(state->entry_workgroup), MAX_NETBIOS_NAME_LEN); +		gtk_entry_set_max_length(GTK_ENTRY(state->entry_workgroup), +					 MAX_NETBIOS_NAME_LEN);  		g_signal_connect(G_OBJECT(state->entry_workgroup), "changed",  				 G_CALLBACK(callback_enter_workgroup_and_unlock),  				 (gpointer)state); @@ -902,7 +934,8 @@ static void callback_do_change(GtkWidget *widget,  				 (gpointer)state);  		if (state->name_type_initial == NetSetupWorkgroupName) { -			gtk_entry_set_text(GTK_ENTRY(state->entry_workgroup), state->name_buffer_initial); +			gtk_entry_set_text(GTK_ENTRY(state->entry_workgroup), +					   state->name_buffer_initial);  			gtk_widget_set_sensitive(GTK_WIDGET(state->entry_domain), FALSE);  			gtk_widget_set_sensitive(GTK_WIDGET(state->entry_workgroup), TRUE);  		} @@ -979,21 +1012,25 @@ static int draw_main_window(struct join_state *state)  	icon = gdk_pixbuf_new_from_file(SAMBA_ICON_PATH,  	                                &error);  	if (icon == NULL) { -		g_print("failed to load logo from %s : %s\n", +		g_print("failed to load icon from %s : %s\n",  			SAMBA_ICON_PATH, error->message);  	}  #if 1 -	image = gtk_image_new_from_file(SAMBA_IMAGE_PATH); +	image = gtk_image_new_from_file(SAMBA_IMAGE_PATH_SMALL);  #else  	image = gtk_image_new_from_file("/usr/share/pixmaps/redhat-system_settings.png");  #endif +	if (image == NULL) { +		g_print("failed to load logo from %s : %s\n", +			SAMBA_IMAGE_PATH_SMALL, error->message); +	}  	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  	state->window_main = window;  	gtk_window_set_title(GTK_WINDOW(window), "Samba - Join Domain dialogue"); -	gtk_widget_set_size_request(GTK_WIDGET(window), 600, 600); /* breite * höhe */ +	gtk_widget_set_size_request(GTK_WIDGET(window), 600, 600);  	gtk_window_set_resizable(GTK_WINDOW(window), FALSE);  	gtk_window_set_icon_from_file(GTK_WINDOW(window), SAMBA_ICON_PATH, NULL); @@ -1015,14 +1052,15 @@ static int draw_main_window(struct join_state *state)  	{  /*		gtk_box_pack_start(GTK_BOX(main_vbox), image, TRUE, TRUE, 10); */ -		gtk_misc_set_alignment(GTK_MISC(image), 0, 0); +/*		gtk_misc_set_alignment(GTK_MISC(image), 0, 0); */ +		gtk_widget_set_size_request(GTK_WIDGET(image), 150, 40);  		gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 10);  		gtk_widget_show(image);  		/* Label */  		label = gtk_label_new("Samba uses the following information to identify your computer on the network."); -		gtk_misc_set_alignment(GTK_MISC(label), 0, 0); -		gtk_widget_set_size_request(GTK_WIDGET(label), 500, 40); +/*		gtk_misc_set_alignment(GTK_MISC(label), 0, 0); */ +		gtk_widget_set_size_request(GTK_WIDGET(label), 400, 40);  		gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);  		gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);  		gtk_widget_show(label); diff --git a/source3/lib/netapi/examples/netdomjoin/netdomjoin.c b/source3/lib/netapi/examples/netdomjoin/netdomjoin.c index e8b529927f..634d265597 100644 --- a/source3/lib/netapi/examples/netdomjoin/netdomjoin.c +++ b/source3/lib/netapi/examples/netdomjoin/netdomjoin.c @@ -1,7 +1,7 @@  /*   *  Unix SMB/CIFS implementation.   *  Join Support (cmdline + netapi) - *  Copyright (C) Guenther Deschner 2007 + *  Copyright (C) Guenther Deschner 2007-2008   *   *  This program is free software; you can redistribute it and/or modify   *  it under the terms of the GNU General Public License as published by @@ -56,7 +56,10 @@ int main(int argc, char **argv)  	if (argc < 2) {  		printf("usage: netdomjoin\n"); -		printf("\t[hostname=HOSTNAME] [domain=DOMAIN] <ou=OU> <usero=USERO> <passwordo=PASSWORDO> <userd=USERD> <passwordd=PASSWORDD>\n"); +		printf("\t[hostname] [domain=DOMAIN] <ou=OU> " +		       "<usero=USERO> <passwordo=PASSWORDO> " +		       "<userd=USERD> <passwordd=PASSWORDD> " +		       "<debug=DEBUGLEVEL>\n");  		return 0;  	} @@ -87,6 +90,11 @@ int main(int argc, char **argv)  			str = get_string_param(argv[i]);  			libnetapi_set_password(ctx, str);  		} +		if (strncasecmp(argv[i], "debug", strlen("debug"))== 0) { +			const char *str = NULL; +			str = get_string_param(argv[i]); +			libnetapi_set_debuglevel(ctx, str); +		}  	}  	status = NetJoinDomain(server_name, diff --git a/source3/lib/netapi/joindomain.c b/source3/lib/netapi/joindomain.c index e3d5eada02..c7849c952f 100644 --- a/source3/lib/netapi/joindomain.c +++ b/source3/lib/netapi/joindomain.c @@ -1,7 +1,7 @@  /*   *  Unix SMB/CIFS implementation.   *  NetApi Join Support - *  Copyright (C) Guenther Deschner 2007 + *  Copyright (C) Guenther Deschner 2007-2008   *   *  This program is free software; you can redistribute it and/or modify   *  it under the terms of the GNU General Public License as published by @@ -54,8 +54,9 @@ static WERROR NetJoinDomainLocal(struct libnetapi_ctx *mem_ctx,  		if (!NT_STATUS_IS_OK(status)) {  			return ntstatus_to_werror(status);  		} -		r->in.server_name = talloc_strdup(mem_ctx, info->domain_controller_name); -		W_ERROR_HAVE_NO_MEMORY(r->in.server_name); +		r->in.dc_name = talloc_strdup(mem_ctx, +					      info->domain_controller_name); +		W_ERROR_HAVE_NO_MEMORY(r->in.dc_name);  	}  	if (account_ou) { @@ -69,8 +70,8 @@ static WERROR NetJoinDomainLocal(struct libnetapi_ctx *mem_ctx,  	}  	if (password) { -		r->in.password = talloc_strdup(mem_ctx, password); -		W_ERROR_HAVE_NO_MEMORY(r->in.password); +		r->in.admin_password = talloc_strdup(mem_ctx, password); +		W_ERROR_HAVE_NO_MEMORY(r->in.admin_password);  	}  	r->in.join_flags = join_flags; @@ -89,13 +90,11 @@ static WERROR NetJoinDomainRemote(struct libnetapi_ctx *ctx,  {  	struct cli_state *cli = NULL;  	struct rpc_pipe_client *pipe_cli = NULL; -	struct wkssvc_PasswordBuffer encrypted_password; +	struct wkssvc_PasswordBuffer *encrypted_password = NULL;  	NTSTATUS status;  	WERROR werr;  	unsigned int old_timeout = 0; -	ZERO_STRUCT(encrypted_password); -  	status = cli_full_connection(&cli, NULL, server_name,  				     NULL, 0,  				     "IPC$", "IPC", @@ -114,7 +113,7 @@ static WERROR NetJoinDomainRemote(struct libnetapi_ctx *ctx,  	if (!pipe_cli) {  		werr = ntstatus_to_werror(status);  		goto done; -	}; +	}  	if (password) {  		encode_wkssvc_join_password_buffer(ctx, @@ -128,7 +127,7 @@ static WERROR NetJoinDomainRemote(struct libnetapi_ctx *ctx,  	status = rpccli_wkssvc_NetrJoinDomain2(pipe_cli, ctx,  					       server_name, domain_name,  					       account_ou, Account, -					       &encrypted_password, +					       encrypted_password,  					       join_flags, &werr);  	if (!NT_STATUS_IS_OK(status)) {  		werr = ntstatus_to_werror(status); @@ -224,8 +223,8 @@ static WERROR NetUnjoinDomainLocal(struct libnetapi_ctx *mem_ctx,  	W_ERROR_NOT_OK_RETURN(werr);  	if (server_name) { -		r->in.server_name = talloc_strdup(mem_ctx, server_name); -		W_ERROR_HAVE_NO_MEMORY(r->in.server_name); +		r->in.dc_name = talloc_strdup(mem_ctx, server_name); +		W_ERROR_HAVE_NO_MEMORY(r->in.dc_name);  	} else {  		NTSTATUS status; @@ -233,7 +232,6 @@ static WERROR NetUnjoinDomainLocal(struct libnetapi_ctx *mem_ctx,  		struct DS_DOMAIN_CONTROLLER_INFO *info = NULL;  		uint32_t flags = DS_DIRECTORY_SERVICE_REQUIRED |  				 DS_WRITABLE_REQUIRED | -				 DS_IS_FLAT_NAME |  				 DS_RETURN_DNS_NAME;  		if (lp_realm()) {  			domain = lp_realm(); @@ -245,8 +243,9 @@ static WERROR NetUnjoinDomainLocal(struct libnetapi_ctx *mem_ctx,  		if (!NT_STATUS_IS_OK(status)) {  			return ntstatus_to_werror(status);  		} -		r->in.server_name = talloc_strdup(mem_ctx, info->domain_controller_name); -		W_ERROR_HAVE_NO_MEMORY(r->in.server_name); +		r->in.dc_name = talloc_strdup(mem_ctx, +					      info->domain_controller_name); +		W_ERROR_HAVE_NO_MEMORY(r->in.dc_name);  	}  	if (account) { @@ -255,8 +254,8 @@ static WERROR NetUnjoinDomainLocal(struct libnetapi_ctx *mem_ctx,  	}  	if (password) { -		r->in.password = talloc_strdup(mem_ctx, password); -		W_ERROR_HAVE_NO_MEMORY(r->in.password); +		r->in.admin_password = talloc_strdup(mem_ctx, password); +		W_ERROR_HAVE_NO_MEMORY(r->in.admin_password);  	}  	r->in.unjoin_flags = unjoin_flags; @@ -276,13 +275,11 @@ static WERROR NetUnjoinDomainRemote(struct libnetapi_ctx *ctx,  {  	struct cli_state *cli = NULL;  	struct rpc_pipe_client *pipe_cli = NULL; -	struct wkssvc_PasswordBuffer encrypted_password; +	struct wkssvc_PasswordBuffer *encrypted_password = NULL;  	NTSTATUS status;  	WERROR werr;  	unsigned int old_timeout = 0; -	ZERO_STRUCT(encrypted_password); -  	status = cli_full_connection(&cli, NULL, server_name,  				     NULL, 0,  				     "IPC$", "IPC", @@ -301,7 +298,7 @@ static WERROR NetUnjoinDomainRemote(struct libnetapi_ctx *ctx,  	if (!pipe_cli) {  		werr = ntstatus_to_werror(status);  		goto done; -	}; +	}  	if (password) {  		encode_wkssvc_join_password_buffer(ctx, @@ -315,7 +312,7 @@ static WERROR NetUnjoinDomainRemote(struct libnetapi_ctx *ctx,  	status = rpccli_wkssvc_NetrUnjoinDomain2(pipe_cli, ctx,  						 server_name,  						 account, -						 &encrypted_password, +						 encrypted_password,  						 unjoin_flags,  						 &werr);  	if (!NT_STATUS_IS_OK(status)) { @@ -408,7 +405,7 @@ static WERROR NetGetJoinInformationRemote(struct libnetapi_ctx *ctx,  	if (!pipe_cli) {  		werr = ntstatus_to_werror(status);  		goto done; -	}; +	}  	status = rpccli_wkssvc_NetrGetJoinInformation(pipe_cli, ctx,  						      server_name, diff --git a/source3/lib/netapi/serverinfo.c b/source3/lib/netapi/serverinfo.c index 276a98c15e..0e356e0ee7 100644 --- a/source3/lib/netapi/serverinfo.c +++ b/source3/lib/netapi/serverinfo.c @@ -167,9 +167,8 @@ static WERROR NetServerSetInfoLocal_1005(struct libnetapi_ctx *ctx,  		return WERR_NOT_SUPPORTED;  	} -	return libnet_smbconf_set_global_param(ctx, -					       "server string", -					       info1005->comment); +	return libnet_conf_set_global_parameter("server string", +						info1005->comment);  }  static WERROR NetServerSetInfoLocal(struct libnetapi_ctx *ctx, diff --git a/source3/lib/popt_common.c b/source3/lib/popt_common.c index b3a84a6f7c..5a9d39d181 100644 --- a/source3/lib/popt_common.c +++ b/source3/lib/popt_common.c @@ -414,6 +414,7 @@ static void get_credentials_file(const char *file)   *		-N,--no-pass   *		-S,--signing   *              -P --machine-pass + * 		-e --encrypt   */ @@ -532,6 +533,10 @@ static void popt_common_credentials_callback(poptContext con,  	case 'N':  		set_cmdline_auth_info_password("");  		break; +	case 'e': +		set_cmdline_auth_info_smb_encrypt(); +		break; +  	}  } @@ -543,5 +548,6 @@ struct poptOption popt_common_credentials[] = {  	{ "authentication-file", 'A', POPT_ARG_STRING, NULL, 'A', "Get the credentials from a file", "FILE" },  	{ "signing", 'S', POPT_ARG_STRING, NULL, 'S', "Set the client signing state", "on|off|required" },  	{"machine-pass", 'P', POPT_ARG_NONE, NULL, 'P', "Use stored machine account password" }, +	{"encrypt", 'e', POPT_ARG_NONE, NULL, 'e', "Encrypt SMB transport (UNIX extended servers only)" },  	POPT_TABLEEND  }; diff --git a/source3/lib/replace/system/network.h b/source3/lib/replace/system/network.h index 9087c02da1..b6ae3c7c6f 100644 --- a/source3/lib/replace/system/network.h +++ b/source3/lib/replace/system/network.h @@ -233,6 +233,10 @@ typedef unsigned short int sa_family_t;  #endif  #endif +#ifdef HAVE_AIX_SOCKADDR_STORAGE +#define ss_family __ss_family +#endif +  #ifndef HAVE_STRUCT_ADDRINFO  #define HAVE_STRUCT_ADDRINFO  struct addrinfo { diff --git a/source3/lib/secace.c b/source3/lib/secace.c index 90ecc342cd..8760a6109a 100644 --- a/source3/lib/secace.c +++ b/source3/lib/secace.c @@ -59,7 +59,7 @@ void init_sec_ace(SEC_ACE *t, const DOM_SID *sid, enum security_ace_type type,  {  	t->type = type;  	t->flags = flag; -	t->size = sid_size(sid) + 8; +	t->size = ndr_size_dom_sid(sid, 0) + 8;  	t->access_mask = mask;  	ZERO_STRUCTP(&t->trustee); @@ -86,7 +86,7 @@ NTSTATUS sec_ace_add_sid(TALLOC_CTX *ctx, SEC_ACE **pp_new, SEC_ACE *old, unsign  	(*pp_new)[i].type  = SEC_ACE_TYPE_ACCESS_ALLOWED;  	(*pp_new)[i].flags = 0; -	(*pp_new)[i].size  = SEC_ACE_HEADER_SIZE + sid_size(sid); +	(*pp_new)[i].size  = SEC_ACE_HEADER_SIZE + ndr_size_dom_sid(sid, 0);  	(*pp_new)[i].access_mask = mask;  	sid_copy(&(*pp_new)[i].trustee, sid);  	return NT_STATUS_OK; diff --git a/source3/lib/secdesc.c b/source3/lib/secdesc.c index 123c3bcc9b..44ae23271e 100644 --- a/source3/lib/secdesc.c +++ b/source3/lib/secdesc.c @@ -32,35 +32,6 @@ const struct generic_mapping file_generic_mapping = {  };  /******************************************************************* - Works out the linearization size of a SEC_DESC. -********************************************************************/ - -size_t sec_desc_size(SEC_DESC *psd) -{ -	size_t offset; - -	if (!psd) return 0; - -	offset = SEC_DESC_HEADER_SIZE; - -	/* don't align */ - -	if (psd->owner_sid != NULL) -		offset += sid_size(psd->owner_sid); - -	if (psd->group_sid != NULL) -		offset += sid_size(psd->group_sid); - -	if (psd->sacl != NULL) -		offset += psd->sacl->size; - -	if (psd->dacl != NULL) -		offset += psd->dacl->size; - -	return offset; -} - -/*******************************************************************   Compares two SEC_DESC structures  ********************************************************************/ @@ -235,11 +206,11 @@ SEC_DESC *make_sec_desc(TALLOC_CTX *ctx,  	}  	if (dst->owner_sid != NULL) { -		offset += sid_size(dst->owner_sid); +		offset += ndr_size_dom_sid(dst->owner_sid, 0);  	}  	if (dst->group_sid != NULL) { -		offset += sid_size(dst->group_sid); +		offset += ndr_size_dom_sid(dst->group_sid, 0);  	}  	*sd_size = (size_t)offset; @@ -274,25 +245,21 @@ NTSTATUS marshall_sec_desc(TALLOC_CTX *mem_ctx,  			   struct security_descriptor *secdesc,  			   uint8 **data, size_t *len)  { -	prs_struct ps; -	 -	if (!prs_init(&ps, sec_desc_size(secdesc), mem_ctx, MARSHALL)) { -		return NT_STATUS_NO_MEMORY; -	} +	DATA_BLOB blob; +	enum ndr_err_code ndr_err; -	if (!sec_io_desc("security_descriptor", &secdesc, &ps, 1)) { -		prs_mem_free(&ps); -		return NT_STATUS_INVALID_PARAMETER; -	} +	ndr_err = ndr_push_struct_blob( +		&blob, mem_ctx, secdesc, +		(ndr_push_flags_fn_t)ndr_push_security_descriptor); -	if (!(*data = (uint8 *)talloc_memdup(mem_ctx, ps.data_p, -					     prs_offset(&ps)))) { -		prs_mem_free(&ps); -		return NT_STATUS_NO_MEMORY; +	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { +		DEBUG(0, ("ndr_push_security_descriptor failed: %s\n", +			  ndr_errstr(ndr_err))); +		return ndr_map_error2ntstatus(ndr_err);;  	} -	*len = prs_offset(&ps); -	prs_mem_free(&ps); +	*data = blob.data; +	*len = blob.length;  	return NT_STATUS_OK;  } @@ -302,25 +269,33 @@ NTSTATUS marshall_sec_desc(TALLOC_CTX *mem_ctx,  NTSTATUS unmarshall_sec_desc(TALLOC_CTX *mem_ctx, uint8 *data, size_t len,  			     struct security_descriptor **psecdesc)  { -	prs_struct ps; -	struct security_descriptor *secdesc = NULL; +	DATA_BLOB blob; +	enum ndr_err_code ndr_err; +	struct security_descriptor *result; -	if (!(secdesc = TALLOC_ZERO_P(mem_ctx, struct security_descriptor))) { -		return NT_STATUS_NO_MEMORY; +	if ((data == NULL) || (len == 0)) { +		return NT_STATUS_INVALID_PARAMETER;  	} -	if (!prs_init(&ps, 0, secdesc, UNMARSHALL)) { +	result = TALLOC_ZERO_P(mem_ctx, struct security_descriptor); +	if (result == NULL) {  		return NT_STATUS_NO_MEMORY;  	} -	prs_give_memory(&ps, (char *)data, len, False); +	blob = data_blob_const(data, len); -	if (!sec_io_desc("security_descriptor", &secdesc, &ps, 1)) { -		return NT_STATUS_INVALID_PARAMETER; +	ndr_err = ndr_pull_struct_blob( +		&blob, result, result, +		(ndr_pull_flags_fn_t)ndr_pull_security_descriptor); + +	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { +		DEBUG(0, ("ndr_pull_security_descriptor failed: %s\n", +			  ndr_errstr(ndr_err))); +		TALLOC_FREE(result); +		return ndr_map_error2ntstatus(ndr_err);;  	} -	prs_mem_free(&ps); -	*psecdesc = secdesc; +	*psecdesc = result;  	return NT_STATUS_OK;  } diff --git a/source3/lib/sharesec.c b/source3/lib/sharesec.c index 0027a8813a..ba025dacc1 100644 --- a/source3/lib/sharesec.c +++ b/source3/lib/sharesec.c @@ -144,7 +144,7 @@ SEC_DESC *get_share_security( TALLOC_CTX *ctx, const char *servicename,  	}  	if (psd) -		*psize = sec_desc_size(psd); +		*psize = ndr_size_security_descriptor(psd, 0);  	return psd;  } diff --git a/source3/lib/util.c b/source3/lib/util.c index 11c14ea538..c69a1450a0 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -289,7 +289,8 @@ static struct user_auth_info cmdline_auth_info = {  	NULL,	/* password */  	false,	/* got_pass */  	false,	/* use_kerberos */ -	Undefined /* signing state */ +	Undefined, /* signing state */ +	false	/* smb_encrypt */  };  const char *get_cmdline_auth_info_username(void) @@ -362,11 +363,22 @@ void set_cmdline_auth_info_use_krb5_ticket(void)  	cmdline_auth_info.got_pass = true;  } +/* This should only be used by lib/popt_common.c JRA */ +void set_cmdline_auth_info_smb_encrypt(void) +{ +	cmdline_auth_info.smb_encrypt = true; +} +  bool get_cmdline_auth_info_got_pass(void)  {  	return cmdline_auth_info.got_pass;  } +bool get_cmdline_auth_info_smb_encrypt(void) +{ +	return cmdline_auth_info.smb_encrypt; +} +  bool get_cmdline_auth_info_copy(struct user_auth_info *info)  {  	*info = cmdline_auth_info; @@ -605,32 +617,30 @@ void show_msg(char *buf)  }  /******************************************************************* - Set the length and marker of an smb packet. + Set the length and marker of an encrypted smb packet.  ********************************************************************/ -void smb_setlen(char *buf,int len) +void smb_set_enclen(char *buf,int len,uint16 enc_ctx_num)  {  	_smb_setlen(buf,len);  	SCVAL(buf,4,0xFF); -	SCVAL(buf,5,'S'); -	SCVAL(buf,6,'M'); -	SCVAL(buf,7,'B'); +	SCVAL(buf,5,'E'); +	SSVAL(buf,6,enc_ctx_num);  }  /******************************************************************* - Setup the word count and byte count for a smb message. + Set the length and marker of an smb packet.  ********************************************************************/ -int set_message(char *buf,int num_words,int num_bytes,bool zero) +void smb_setlen(char *buf,int len)  { -	if (zero && (num_words || num_bytes)) { -		memset(buf + smb_size,'\0',num_words*2 + num_bytes); -	} -	SCVAL(buf,smb_wct,num_words); -	SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);   -	smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4); -	return (smb_size + num_words*2 + num_bytes); +	_smb_setlen(buf,len); + +	SCVAL(buf,4,0xFF); +	SCVAL(buf,5,'S'); +	SCVAL(buf,6,'M'); +	SCVAL(buf,7,'B');  }  /******************************************************************* @@ -641,21 +651,11 @@ int set_message_bcc(char *buf,int num_bytes)  {  	int num_words = CVAL(buf,smb_wct);  	SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes); -	smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4); +	_smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);  	return (smb_size + num_words*2 + num_bytes);  }  /******************************************************************* - Setup only the byte count for a smb message, using the end of the - message as a marker. -********************************************************************/ - -int set_message_end(void *outbuf,void *end_ptr) -{ -	return set_message_bcc((char *)outbuf,PTR_DIFF(end_ptr,smb_buf((char *)outbuf))); -} - -/*******************************************************************   Add a data blob to the end of a smb_buf, adjusting bcc and smb_len.   Return the bytes added  ********************************************************************/ diff --git a/source3/lib/util_reg_smbconf.c b/source3/lib/util_reg_smbconf.c index 154c67ab8f..fa58f28d03 100644 --- a/source3/lib/util_reg_smbconf.c +++ b/source3/lib/util_reg_smbconf.c @@ -57,7 +57,7 @@ done:   */  bool registry_init_regdb(void)  { -	bool ret = False; +	bool ret = false;  	int saved_errno = 0;  	static REGISTRY_HOOK smbconf_reg_hook = {KEY_SMBCONF, &smbconf_reg_ops}; @@ -78,7 +78,7 @@ bool registry_init_regdb(void)  		goto done;  	} -	ret = True; +	ret = true;  done:  	return ret; diff --git a/source3/lib/util_sid.c b/source3/lib/util_sid.c index 52f65aa77d..222b32ed3a 100644 --- a/source3/lib/util_sid.c +++ b/source3/lib/util_sid.c @@ -382,7 +382,7 @@ bool sid_linearize(char *outbuf, size_t len, const DOM_SID *sid)  {  	size_t i; -	if (len < sid_size(sid)) +	if (len < ndr_size_dom_sid(sid, 0))  		return False;  	SCVAL(outbuf,0,sid->sid_rev_num); @@ -495,18 +495,6 @@ bool sid_equal(const DOM_SID *sid1, const DOM_SID *sid2)  }  /***************************************************************** - Calculates size of a sid. -*****************************************************************/   - -size_t sid_size(const DOM_SID *sid) -{ -	if (sid == NULL) -		return 0; - -	return sid->num_auths * sizeof(uint32) + 8; -} - -/*****************************************************************   Returns true if SID is internal (and non-mappable).  *****************************************************************/ @@ -535,7 +523,7 @@ bool non_mappable_sid(DOM_SID *sid)  char *sid_binstring(const DOM_SID *sid)  {  	char *buf, *s; -	int len = sid_size(sid); +	int len = ndr_size_dom_sid(sid, 0);  	buf = (char *)SMB_MALLOC(len);  	if (!buf)  		return NULL; @@ -553,7 +541,7 @@ char *sid_binstring(const DOM_SID *sid)  char *sid_binstring_hex(const DOM_SID *sid)  {  	char *buf, *s; -	int len = sid_size(sid); +	int len = ndr_size_dom_sid(sid, 0);  	buf = (char *)SMB_MALLOC(len);  	if (!buf)  		return NULL; diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c index 8f1bd9e686..945506ea77 100644 --- a/source3/lib/util_sock.c +++ b/source3/lib/util_sock.c @@ -1277,56 +1277,6 @@ ssize_t receive_smb_raw(int fd,  }  /**************************************************************************** - Wrapper for receive_smb_raw(). - Checks the MAC on signed packets. -****************************************************************************/ - -bool receive_smb(int fd, char *buffer, unsigned int timeout, enum smb_read_errors *pre) -{ -	if (receive_smb_raw(fd, buffer, timeout, 0, pre) < 0) { -		return false; -	} - -	/* Check the incoming SMB signature. */ -	if (!srv_check_sign_mac(buffer, true)) { -		DEBUG(0, ("receive_smb: SMB Signature verification " -			"failed on incoming packet!\n")); -		cond_set_smb_read_error(pre,SMB_READ_BAD_SIG); -		return false; -	} - -	return true; -} - -/**************************************************************************** - Send an smb to a fd. -****************************************************************************/ - -bool send_smb(int fd, char *buffer) -{ -	size_t len; -	size_t nwritten=0; -	ssize_t ret; - -	/* Sign the outgoing packet if required. */ -	srv_calculate_sign_mac(buffer); - -	len = smb_len(buffer) + 4; - -	while (nwritten < len) { -		ret = write_data(fd,buffer+nwritten,len - nwritten); -		if (ret <= 0) { -			DEBUG(0,("Error writing %d bytes to client. %d. (%s)\n", -				(int)len,(int)ret, strerror(errno) )); -			return false; -		} -		nwritten += ret; -	} - -	return true; -} - -/****************************************************************************   Open a socket of the specified type, port, and address for incoming data.  ****************************************************************************/ @@ -1800,18 +1750,66 @@ static bool matchname(const char *remotehost,  	return false;  } -static struct { -        struct sockaddr_storage ss; -        char *name; -} nc; +/******************************************************************* + Deal with the singleton cache. +******************************************************************/ + +struct name_addr_pair { +	struct sockaddr_storage ss; +	const char *name; +}; + +/******************************************************************* + Lookup a name/addr pair. Returns memory allocated from memcache. +******************************************************************/ + +static bool lookup_nc(struct name_addr_pair *nc) +{ +	DATA_BLOB tmp; + +	ZERO_STRUCTP(nc); + +	if (!memcache_lookup( +			NULL, SINGLETON_CACHE, +			data_blob_string_const("get_peer_name"), +			&tmp)) { +		return false; +	} + +	memcpy(&nc->ss, tmp.data, sizeof(nc->ss)); +	nc->name = (const char *)tmp.data + sizeof(nc->ss); +	return true; +} + +/******************************************************************* + Save a name/addr pair. +******************************************************************/ + +static void store_nc(const struct name_addr_pair *nc) +{ +	DATA_BLOB tmp; +	size_t namelen = strlen(nc->name); + +	tmp = data_blob(NULL, sizeof(nc->ss) + namelen + 1); +	if (!tmp.data) { +		return; +	} +	memcpy(tmp.data, &nc->ss, sizeof(nc->ss)); +	memcpy(tmp.data+sizeof(nc->ss), nc->name, namelen+1); + +	memcache_add(NULL, SINGLETON_CACHE, +			data_blob_string_const("get_peer_name"), +			tmp); +	data_blob_free(&tmp); +}  /*******************************************************************   Return the DNS name of the remote end of a socket.  ******************************************************************/ -const char *get_peer_name(int fd, -				bool force_lookup) +const char *get_peer_name(int fd, bool force_lookup)  { +	struct name_addr_pair nc;  	char addr_buf[INET6_ADDRSTRLEN];  	struct sockaddr_storage ss;  	socklen_t length = sizeof(ss); @@ -1826,13 +1824,15 @@ const char *get_peer_name(int fd,  	   possible */  	if (!lp_hostname_lookups() && (force_lookup == false)) {  		length = sizeof(nc.ss); -		p = get_peer_addr_internal(fd, addr_buf, sizeof(addr_buf), +		nc.name = get_peer_addr_internal(fd, addr_buf, sizeof(addr_buf),  			&nc.ss, &length); -		SAFE_FREE(nc.name); -		nc.name = SMB_STRDUP(p); +		store_nc(&nc); +		lookup_nc(&nc);  		return nc.name ? nc.name : "UNKNOWN";  	} +	lookup_nc(&nc); +  	memset(&ss, '\0', sizeof(ss));  	p = get_peer_addr_internal(fd, addr_buf, sizeof(addr_buf), &ss, &length); @@ -1841,9 +1841,7 @@ const char *get_peer_name(int fd,  		return nc.name ? nc.name : "UNKNOWN";  	} -	/* Not the same. Reset the cache. */ -	zero_addr(&nc.ss); -	SAFE_FREE(nc.name); +	/* Not the same. We need to lookup. */  	if (fd == -1) {  		return "UNKNOWN";  	} @@ -1880,7 +1878,11 @@ const char *get_peer_name(int fd,  		strlcpy(name_buf, "UNKNOWN", sizeof(name_buf));  	} -	nc.name = SMB_STRDUP(name_buf); +	nc.name = name_buf; +	nc.ss = ss; + +	store_nc(&nc); +	lookup_nc(&nc);  	return nc.name ? nc.name : "UNKNOWN";  } @@ -2002,50 +2004,68 @@ out_umask:  const char *get_mydnsfullname(void)  { -	static char *dnshostname_cache; - -	if (dnshostname_cache == NULL || !*dnshostname_cache) { -		struct addrinfo *res = NULL; -		char my_hostname[HOST_NAME_MAX]; -		bool ret; +	struct addrinfo *res = NULL; +	char my_hostname[HOST_NAME_MAX]; +	bool ret; +	DATA_BLOB tmp; -		/* get my host name */ -		if (gethostname(my_hostname, sizeof(my_hostname)) == -1) { -			DEBUG(0,("get_mydnsfullname: gethostname failed\n")); -			return NULL; -		} +	if (memcache_lookup(NULL, SINGLETON_CACHE, +			data_blob_string_const("get_mydnsfullname"), +			&tmp)) { +		SMB_ASSERT(tmp.length > 0); +		return (const char *)tmp.data; +	} -		/* Ensure null termination. */ -		my_hostname[sizeof(my_hostname)-1] = '\0'; +	/* get my host name */ +	if (gethostname(my_hostname, sizeof(my_hostname)) == -1) { +		DEBUG(0,("get_mydnsfullname: gethostname failed\n")); +		return NULL; +	} -		ret = interpret_string_addr_internal(&res, -					my_hostname, -					AI_ADDRCONFIG|AI_CANONNAME); +	/* Ensure null termination. */ +	my_hostname[sizeof(my_hostname)-1] = '\0'; -		if (!ret || res == NULL) { -			DEBUG(3,("get_mydnsfullname: getaddrinfo failed for " -				"name %s [%s]\n", +	ret = interpret_string_addr_internal(&res,  				my_hostname, -				gai_strerror(ret) )); -			return NULL; -		} +				AI_ADDRCONFIG|AI_CANONNAME); -		/* -		 * Make sure that getaddrinfo() returns the "correct" host name. -		 */ +	if (!ret || res == NULL) { +		DEBUG(3,("get_mydnsfullname: getaddrinfo failed for " +			"name %s [%s]\n", +			my_hostname, +			gai_strerror(ret) )); +		return NULL; +	} -		if (res->ai_canonname == NULL) { -			DEBUG(3,("get_mydnsfullname: failed to get " -				"canonical name for %s\n", -				my_hostname)); -			freeaddrinfo(res); -			return NULL; -		} +	/* +	 * Make sure that getaddrinfo() returns the "correct" host name. +	 */ -		dnshostname_cache = SMB_STRDUP(res->ai_canonname); +	if (res->ai_canonname == NULL) { +		DEBUG(3,("get_mydnsfullname: failed to get " +			"canonical name for %s\n", +			my_hostname));  		freeaddrinfo(res); +		return NULL; +	} + +	/* This copies the data, so we must do a lookup +	 * afterwards to find the value to return. +	 */ + +	memcache_add(NULL, SINGLETON_CACHE, +			data_blob_string_const("get_mydnsfullname"), +			data_blob_string_const(res->ai_canonname)); + +	freeaddrinfo(res); + +	if (!memcache_lookup(NULL, SINGLETON_CACHE, +			data_blob_string_const("get_mydnsfullname"), +			&tmp)) { +		return NULL;  	} -	return dnshostname_cache; + +	return (const char *)tmp.data;  }  /************************************************************ diff --git a/source3/lib/winbind_util.c b/source3/lib/winbind_util.c index f51a0171a2..3cf068a6e0 100644 --- a/source3/lib/winbind_util.c +++ b/source3/lib/winbind_util.c @@ -35,12 +35,12 @@ bool winbind_lookup_name(const char *dom_name, const char *name, DOM_SID *sid,  	result = wbcLookupName(dom_name, name, &dom_sid, &type);  	if (result != WBC_ERR_SUCCESS) -		return False; +		return false;  	memcpy(sid, &dom_sid, sizeof(DOM_SID));	  	*name_type = (enum lsa_SidType)type;	 -	return True;	 +	return true;	  }  /* Call winbindd to convert sid to name */ @@ -59,7 +59,7 @@ bool winbind_lookup_sid(TALLOC_CTX *mem_ctx, const DOM_SID *sid,  	result = wbcLookupSid(&dom_sid, &domain_name, &account_name, &type);  	if (result != WBC_ERR_SUCCESS) -		return False; +		return false;  	/* Copy out result */ @@ -74,16 +74,16 @@ bool winbind_lookup_sid(TALLOC_CTX *mem_ctx, const DOM_SID *sid,  	DEBUG(10, ("winbind_lookup_sid: SUCCESS: SID %s -> %s %s\n",   		   sid_string_dbg(sid), domain_name, account_name)); -	SAFE_FREE(domain_name); -	SAFE_FREE(account_name); +	wbcFreeMemory(domain_name); +	wbcFreeMemory(account_name);  	if ((domain && !*domain) || (name && !*name)) {		  		DEBUG(0,("winbind_lookup_sid: talloc() failed!\n")); -		return False; +		return false;  	}	 -	return True; +	return true;  }  /* Ping winbindd to see it is alive */ @@ -192,8 +192,9 @@ bool winbind_lookup_rids(TALLOC_CTX *mem_ctx,  	ret = wbcLookupRids(&dom_sid, num_rids, rids,  			    &dom_name, &namelist, &name_types); -	if (ret != WBC_ERR_SUCCESS) -		return False; +	if (ret != WBC_ERR_SUCCESS) {		 +		return false; +	}	  	*domain_name = talloc_strdup(mem_ctx, dom_name);  	*names       = TALLOC_ARRAY(mem_ctx, const char*, num_rids); @@ -202,13 +203,13 @@ bool winbind_lookup_rids(TALLOC_CTX *mem_ctx,  	for(i=0; i<num_rids; i++) {  		(*names)[i] = talloc_strdup(names, namelist[i]);  		(*types)[i] = (enum lsa_SidType)name_types[i]; - -		free(CONST_DISCARD(char*, namelist[i]));		  	} -	free(namelist); -	free(name_types); + +	wbcFreeMemory(CONST_DISCARD(char*, dom_name)); +	wbcFreeMemory(namelist); +	wbcFreeMemory(name_types); -	return True;	 +	return true;	  }  /* Ask Winbind to allocate a new uid for us */ @@ -238,7 +239,7 @@ bool winbind_allocate_gid(gid_t *gid)  bool winbind_lookup_name(const char *dom_name, const char *name, DOM_SID *sid,                            enum lsa_SidType *name_type)  { -	return False; +	return false;  }  /* Call winbindd to convert sid to name */ @@ -247,42 +248,42 @@ bool winbind_lookup_sid(TALLOC_CTX *mem_ctx, const DOM_SID *sid,  			const char **domain, const char **name,                          enum lsa_SidType *name_type)  { -	return False; +	return false;  }  /* Ping winbindd to see it is alive */  bool winbind_ping(void)  { -	return False; +	return false;  }  /* Call winbindd to convert SID to uid */  bool winbind_sid_to_uid(uid_t *puid, const DOM_SID *sid)  { -	return False; +	return false;  }  /* Call winbindd to convert uid to sid */  bool winbind_uid_to_sid(DOM_SID *sid, uid_t uid)  { -	return False; +	return false;  }  /* Call winbindd to convert SID to gid */  bool winbind_sid_to_gid(gid_t *pgid, const DOM_SID *sid)  { -	return False;	 +	return false;	  }  /* Call winbindd to convert gid to sid */  bool winbind_gid_to_sid(DOM_SID *sid, gid_t gid)  { -	return False; +	return false;  }  /* Check for a trusted domain */ @@ -300,21 +301,21 @@ bool winbind_lookup_rids(TALLOC_CTX *mem_ctx,  			 const char **domain_name,  			 const char ***names, enum lsa_SidType **types)  { -	return False; +	return false;  }  /* Ask Winbind to allocate a new uid for us */  bool winbind_allocate_uid(uid_t *uid)  { -	return False; +	return false;  }  /* Ask Winbind to allocate a new gid for us */  bool winbind_allocate_gid(gid_t *gid)  { -	return False; +	return false;  }  #endif     /* WITH_WINBIND */  | 
