[SCM] Samba Shared Repository - branch master updated
Volker Lendecke
vlendec at samba.org
Sun Aug 29 13:57:52 MDT 2010
The branch, master has been updated
via e466bb4 s3: Remove smbd_server_fd()
via e784e16 s3: Remove two uses of smbd_server_fd()
via 5a6be0b s3: Remove smbd_server_fd() from srv_netlog_nt
via 744cc26 s3: Remove smbd_server_fd() from smbd_register_ips
via 5bbc4df s3: Lift smbd_server_fd() from msg_release_ip()
via 467208e s3: Lift smbd_server_fd() from release_ip()
via 6432383 s3: Remove a use of smbd_server_fd() in smbd main()
via 70df6fc s3: Pass sconn to check_reload
via babfe23 s3: Pass sconn instead of msg_ctx to housekeeping_fn
via 4a58c64 s3: Set the client_id in substitute.c once
via 8d256b8 s3: Remove some uses of smbd_server_fd()
via 291526b s3: Remove a use of smbd_server_fd
from b5ed9c2 s4-kcc: Notify dreplsrv that Topology has changed
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit e466bb4af45175a3fe1d6dff54c10d81c4e68257
Author: Volker Lendecke <vl at samba.org>
Date: Sat Aug 28 17:25:22 2010 +0200
s3: Remove smbd_server_fd()
This breaks the perfcol_onefs() build.
Tim, Steve, this use of smbd_server_fd is replacable by calls into
substitute.c. I don't have a onefs environment around to build a fix, so I've
decided to insert an #error, making it not compile. The fix should be pretty
obvious, you can get the socket data via "%I" and "%i" substitutions.
commit e784e160ec899a32b673dfaa77fa12c8f27d296c
Author: Volker Lendecke <vl at samba.org>
Date: Sat Aug 28 17:21:07 2010 +0200
s3: Remove two uses of smbd_server_fd()
Actually, this is a bit cheating. But those two files depend on
smbd_server_conn anyway, it does not make things worse.
commit 5a6be0b3149e43bad14bb75c308ced904909dc58
Author: Volker Lendecke <vl at samba.org>
Date: Sat Aug 28 17:19:42 2010 +0200
s3: Remove smbd_server_fd() from srv_netlog_nt
This is not actually used. If it was to be activated, we'd have to pass in a
pipes_struct.
commit 744cc264517ac440d606570f6e36b8aa1ba836f3
Author: Volker Lendecke <vl at samba.org>
Date: Sat Aug 28 17:16:08 2010 +0200
s3: Remove smbd_server_fd() from smbd_register_ips
commit 5bbc4df1680342a5d0678462bac66d5e536219f6
Author: Volker Lendecke <vl at samba.org>
Date: Sat Aug 28 17:12:43 2010 +0200
s3: Lift smbd_server_fd() from msg_release_ip()
commit 467208e9f417158e97941ddabcec001fac36ab3a
Author: Volker Lendecke <vl at samba.org>
Date: Sat Aug 28 17:09:56 2010 +0200
s3: Lift smbd_server_fd() from release_ip()
commit 64323839261f66cfcb81e524e727c129961c573c
Author: Volker Lendecke <vl at samba.org>
Date: Sat Aug 28 16:58:54 2010 +0200
s3: Remove a use of smbd_server_fd() in smbd main()
The effect this might have is that we set the socket options a bit later in
inetd mode.
commit 70df6fcb2ad99b173ec80bc4b678537dcac036c0
Author: Volker Lendecke <vl at samba.org>
Date: Sat Aug 28 16:57:51 2010 +0200
s3: Pass sconn to check_reload
This removes a use of smbd_server_fd()
commit babfe237171b0dc7561da0a0867d4b9bef2ee872
Author: Volker Lendecke <vl at samba.org>
Date: Sat Aug 28 16:56:47 2010 +0200
s3: Pass sconn instead of msg_ctx to housekeeping_fn
commit 4a58c640cce3b37d5eef62caddd15f64ef8befbe
Author: Volker Lendecke <vl at samba.org>
Date: Sat Aug 28 16:33:00 2010 +0200
s3: Set the client_id in substitute.c once
This never changes during a client connection's life, so we can set it
once.
commit 8d256b8f30e726bec6755712121840d3a4c9b620
Author: Volker Lendecke <vl at samba.org>
Date: Sat Aug 28 16:19:31 2010 +0200
s3: Remove some uses of smbd_server_fd()
The change in behaviour is that we don't detect "socket option" changes anymore
when printers are added or removed.
commit 291526b9cf54bab0e099896ebb668d24d151b5ab
Author: Volker Lendecke <vl at samba.org>
Date: Sat Aug 28 16:18:07 2010 +0200
s3: Remove a use of smbd_server_fd
This disables different socket options per user for ntlmssp authentiation, a
change in behaviour which is exotic enough I believe.
-----------------------------------------------------------------------
Summary of changes:
source3/auth/auth_ntlmssp.c | 2 +-
source3/include/proto.h | 3 +-
source3/lib/dummysmbd.c | 5 ---
source3/lib/substitute.c | 45 +++++++++++++++++++-------
source3/modules/perfcount_onefs.c | 31 ++++++++++--------
source3/rpc_server/srv_netlog_nt.c | 5 +--
source3/rpc_server/srv_spoolss_nt.c | 4 +-
source3/smbd/globals.h | 2 +-
source3/smbd/process.c | 60 ++++++++++++++++++++++-------------
source3/smbd/server.c | 17 ++++------
source3/torture/vfstest.c | 8 +----
11 files changed, 104 insertions(+), 78 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/auth/auth_ntlmssp.c b/source3/auth/auth_ntlmssp.c
index d533ac9..aa7998c 100644
--- a/source3/auth/auth_ntlmssp.c
+++ b/source3/auth/auth_ntlmssp.c
@@ -122,7 +122,7 @@ static NTSTATUS auth_ntlmssp_check_password(struct ntlmssp_state *ntlmssp_state,
/* sub_set_smb_name checks for weird internally */
sub_set_smb_name(auth_ntlmssp_state->ntlmssp_state->user);
- reload_services(smbd_messaging_context(), smbd_server_fd(), True);
+ reload_services(smbd_messaging_context(), -1, True);
nt_status = make_user_info_map(&user_info,
auth_ntlmssp_state->ntlmssp_state->user,
diff --git a/source3/include/proto.h b/source3/include/proto.h
index e2d1c94..5b9414f 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -816,6 +816,8 @@ const char *get_remote_machine_name(void);
void sub_set_smb_name(const char *name);
void set_current_user_info(const char *smb_name, const char *unix_name,
const char *domain);
+void sub_set_socket_ids(const char *peeraddr, const char *peername,
+ const char *sockaddr);
const char *get_current_username(void);
void standard_sub_basic(const char *smb_name, const char *domain_name,
char *str, size_t len);
@@ -5389,7 +5391,6 @@ void server_messaging_context_free(void);
/* The following definitions come from smbd/server.c */
-int smbd_server_fd(void);
struct event_context *smbd_event_context(void);
struct messaging_context *smbd_messaging_context(void);
struct memcache *smbd_memcache(void);
diff --git a/source3/lib/dummysmbd.c b/source3/lib/dummysmbd.c
index eb6bfe9..2ab0ed5 100644
--- a/source3/lib/dummysmbd.c
+++ b/source3/lib/dummysmbd.c
@@ -23,11 +23,6 @@
#include "includes.h"
-int smbd_server_fd(void)
-{
- return -1;
-}
-
int find_service(fstring service)
{
return -1;
diff --git a/source3/lib/substitute.c b/source3/lib/substitute.c
index d7ca184..399ef1d 100644
--- a/source3/lib/substitute.c
+++ b/source3/lib/substitute.c
@@ -192,6 +192,33 @@ void sub_set_smb_name(const char *name)
}
}
+static char sub_peeraddr[INET6_ADDRSTRLEN];
+static const char *sub_peername = "";
+static char sub_sockaddr[INET6_ADDRSTRLEN];
+
+void sub_set_socket_ids(const char *peeraddr, const char *peername,
+ const char *sockaddr)
+{
+ const char *addr = peeraddr;
+
+ if (strnequal(addr, "::ffff:", 7)) {
+ addr += 7;
+ }
+ strlcpy(sub_peeraddr, addr, sizeof(sub_peeraddr));
+
+ sub_peername = SMB_STRDUP(peername);
+ if (sub_peername == NULL) {
+ sub_peername = sub_peeraddr;
+ }
+
+ /*
+ * Shouldn't we do the ::ffff: cancellation here as well? The
+ * original code in alloc_sub_basic() did not do it, so I'm
+ * leaving it out here as well for compatibility.
+ */
+ strlcpy(sub_sockaddr, sockaddr, sizeof(sub_sockaddr));
+}
+
static const char *get_smb_user_name(void)
{
return smb_user_name ? smb_user_name : "";
@@ -538,7 +565,6 @@ static char *alloc_sub_basic(const char *smb_name, const char *domain_name,
{
char *b, *p, *s, *r, *a_string;
fstring pidstr, vnnstr;
- char addr[INET6_ADDRSTRLEN];
const char *local_machine_name = get_local_machine_name();
TALLOC_CTX *tmp_ctx = NULL;
@@ -593,20 +619,15 @@ static char *alloc_sub_basic(const char *smb_name, const char *domain_name,
a_string = realloc_string_sub(a_string, "%D", r);
break;
case 'I' : {
- int offset = 0;
- client_addr(smbd_server_fd(), addr, sizeof(addr));
- if (strnequal(addr,"::ffff:",7)) {
- offset = 7;
- }
- a_string = realloc_string_sub(a_string, "%I",
- addr + offset);
+ a_string = realloc_string_sub(
+ a_string, "%I",
+ sub_peeraddr[0] ? sub_peeraddr : "0.0.0.0");
break;
}
case 'i':
a_string = realloc_string_sub(
a_string, "%i",
- client_socket_addr(smbd_server_fd(),
- addr, sizeof(addr)));
+ sub_sockaddr[0] ? sub_sockaddr : "0.0.0.0");
break;
case 'L' :
if ( StrnCaseCmp(p, "%LOGONSERVER%", strlen("%LOGONSERVER%")) == 0 ) {
@@ -622,8 +643,8 @@ static char *alloc_sub_basic(const char *smb_name, const char *domain_name,
a_string = realloc_string_sub(a_string, "%N", automount_server(smb_name));
break;
case 'M' :
- a_string = realloc_string_sub(
- a_string, "%M", client_name(smbd_server_fd()));
+ a_string = realloc_string_sub(a_string, "%M",
+ sub_peername);
break;
case 'R' :
a_string = realloc_string_sub(a_string, "%R", remote_proto);
diff --git a/source3/modules/perfcount_onefs.c b/source3/modules/perfcount_onefs.c
index 75dc145..d693376 100644
--- a/source3/modules/perfcount_onefs.c
+++ b/source3/modules/perfcount_onefs.c
@@ -302,23 +302,26 @@ static void onefs_smb_statistics_end(struct smb_perfcount_data *pcd)
/* get address info once, doesn't change for process */
if (rem_addr == 0) {
- struct sockaddr_storage sa;
- socklen_t sa_len;
- int fd = smbd_server_fd();
-
- sa_len = sizeof sa;
- if (getpeername(fd, (struct sockaddr *)&sa, &sa_len) == 0 &&
- sa.ss_family == AF_INET)
- rem_addr = ((struct sockaddr_in *)&sa)->sin_addr.s_addr;
- else
+
+#error Isilon, please remove this after testing the code below
+
+ char *addr;
+
+ addr = talloc_sub_basic(talloc_tos(), "", "", "%I");
+ if (addr != NULL) {
+ rem_addr = interpret_addr(addr);
+ TALLOC_FREE(addr);
+ } else {
rem_addr = ISC_MASKED_ADDR;
+ }
- sa_len = sizeof sa;
- if (getsockname(fd, (struct sockaddr *)&sa, &sa_len) == 0 &&
- sa.ss_family == AF_INET)
- loc_addr = ((struct sockaddr_in *)&sa)->sin_addr.s_addr;
- else
+ addr = talloc_sub_basic(talloc_tos(), "", "", "%i");
+ if (addr != NULL) {
+ loc_addr = interpret_addr(addr);
+ TALLOC_FREE(addr);
+ } else {
loc_addr = ISC_MASKED_ADDR;
+ }
}
/*
diff --git a/source3/rpc_server/srv_netlog_nt.c b/source3/rpc_server/srv_netlog_nt.c
index 73f216f..d0f9dc9 100644
--- a/source3/rpc_server/srv_netlog_nt.c
+++ b/source3/rpc_server/srv_netlog_nt.c
@@ -600,7 +600,6 @@ static NTSTATUS get_md4pw(struct samr_Password *md4pw, const char *mach_acct,
union samr_UserInfo *info;
struct auth_serversupplied_info *server_info;
#if 0
- char addr[INET6_ADDRSTRLEN];
/*
* Currently this code is redundent as we already have a filter
@@ -612,8 +611,8 @@ static NTSTATUS get_md4pw(struct samr_Password *md4pw, const char *mach_acct,
*/
if (!allow_access(lp_domain_hostsdeny(), lp_domain_hostsallow(),
- client_name(smbd_server_fd()),
- client_addr(smbd_server_fd(),addr,sizeof(addr)))) {
+ p->client_id.name,
+ p->client_id.addr)) {
DEBUG(0,("get_md4pw: Workstation %s denied access to domain\n", mach_acct));
return False;
}
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index 4e97122..6ce377d 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -342,7 +342,7 @@ static WERROR delete_printer_hook(TALLOC_CTX *ctx, NT_USER_TOKEN *token,
/* go ahead and re-read the services immediately */
become_root();
- reload_services(msg_ctx, smbd_server_fd(), false);
+ reload_services(msg_ctx, -1, false);
unbecome_root();
if ( lp_servicenumber( sharename ) > 0 )
@@ -5765,7 +5765,7 @@ static bool add_printer_hook(TALLOC_CTX *ctx, NT_USER_TOKEN *token,
/* reload our services immediately */
become_root();
- reload_services(msg_ctx, smbd_server_fd(), false);
+ reload_services(msg_ctx, -1, false);
unbecome_root();
numlines = 0;
diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h
index 759fead..c4d65aa 100644
--- a/source3/smbd/globals.h
+++ b/source3/smbd/globals.h
@@ -469,7 +469,7 @@ struct smbd_server_connection {
struct {
/*
- * fd for the fcntl lock mutexing access to smbd_server_fd
+ * fd for the fcntl lock mutexing access to our sock
*/
int socket_lock_fd;
diff --git a/source3/smbd/process.c b/source3/smbd/process.c
index a18f045..51b2e51 100644
--- a/source3/smbd/process.c
+++ b/source3/smbd/process.c
@@ -928,7 +928,7 @@ static void smbd_sig_hup_handler(struct tevent_context *ev,
private_data, struct messaging_context);
change_to_root_user();
DEBUG(1,("Reloading services after SIGHUP\n"));
- reload_services(msg_ctx, smbd_server_fd(), False);
+ reload_services(msg_ctx, smbd_server_conn->sock, False);
}
void smbd_setup_sig_hup_handler(struct tevent_context *ev,
@@ -2212,7 +2212,7 @@ void chain_reply(struct smb_request *req)
Check if services need reloading.
****************************************************************************/
-static void check_reload(struct messaging_context *msg_ctx, time_t t)
+static void check_reload(struct smbd_server_connection *sconn, time_t t)
{
time_t printcap_cache_time = (time_t)lp_printcap_cache_time();
@@ -2237,7 +2237,7 @@ static void check_reload(struct messaging_context *msg_ctx, time_t t)
}
if (t >= last_smb_conf_reload_time+SMBD_RELOAD_CHECK) {
- reload_services(msg_ctx, smbd_server_fd(), True);
+ reload_services(sconn->msg_ctx, sconn->sock, True);
last_smb_conf_reload_time = t;
}
@@ -2251,7 +2251,7 @@ static void check_reload(struct messaging_context *msg_ctx, time_t t)
|| (t-last_printer_reload_time < 0) )
{
DEBUG( 3,( "Printcap cache time expired.\n"));
- reload_printers(msg_ctx);
+ reload_printers(sconn->msg_ctx);
last_printer_reload_time = t;
}
}
@@ -2377,10 +2377,8 @@ received when we should release a specific IP
****************************************************************************/
static void release_ip(const char *ip, void *priv)
{
- char addr[INET6_ADDRSTRLEN];
- char *p = addr;
-
- client_socket_addr(smbd_server_fd(),addr,sizeof(addr));
+ const char *addr = (const char *)priv;
+ const char *p = addr;
if (strncmp("::ffff:", addr, 7) == 0) {
p = addr + 7;
@@ -2403,7 +2401,10 @@ static void release_ip(const char *ip, void *priv)
static void msg_release_ip(struct messaging_context *msg_ctx, void *private_data,
uint32_t msg_type, struct server_id server_id, DATA_BLOB *data)
{
- release_ip((char *)data->data, NULL);
+ struct smbd_server_connection *sconn = talloc_get_type_abort(
+ private_data, struct smbd_server_connection);
+
+ release_ip((char *)data->data, sconn->client_id.addr);
}
#ifdef CLUSTER_SUPPORT
@@ -2494,15 +2495,15 @@ static bool deadtime_fn(const struct timeval *now, void *private_data)
static bool housekeeping_fn(const struct timeval *now, void *private_data)
{
- struct messaging_context *msg_ctx = talloc_get_type_abort(
- private_data, struct messaging_context);
+ struct smbd_server_connection *sconn = talloc_get_type_abort(
+ private_data, struct smbd_server_connection);
change_to_root_user();
/* update printer queue caches if necessary */
- update_monitored_printq_cache(msg_ctx);
+ update_monitored_printq_cache(sconn->msg_ctx);
/* check if we need to reload services */
- check_reload(msg_ctx, time(NULL));
+ check_reload(sconn, time(NULL));
/* Change machine password if neccessary. */
attempt_machine_password_change();
@@ -2888,6 +2889,27 @@ fail:
return false;
}
+static NTSTATUS smbd_register_ips(struct smbd_server_connection *sconn,
+ struct sockaddr_storage *srv,
+ struct sockaddr_storage *clnt)
+{
+ struct ctdbd_connection *cconn;
+ char tmp_addr[INET6_ADDRSTRLEN];
+ char *addr;
+
+ cconn = messaging_ctdbd_connection(procid_self());
+ if (cconn == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ client_socket_addr(sconn->sock, addr, sizeof(addr));
+ addr = talloc_strdup(cconn, tmp_addr);
+ if (addr == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ return ctdbd_register_ips(cconn, srv, clnt, release_ip, addr);
+}
+
/****************************************************************************
Process commands from the client
****************************************************************************/
@@ -3037,7 +3059,7 @@ void smbd_process(struct smbd_server_connection *sconn)
/* register our message handlers */
messaging_register(sconn->msg_ctx, NULL,
MSG_SMB_FORCE_TDIS, msg_force_tdis);
- messaging_register(sconn->msg_ctx, NULL,
+ messaging_register(sconn->msg_ctx, sconn,
MSG_SMB_RELEASE_IP, msg_release_ip);
messaging_register(sconn->msg_ctx, NULL,
MSG_SMB_CLOSE_FILE, msg_close_file);
@@ -3069,8 +3091,7 @@ void smbd_process(struct smbd_server_connection *sconn)
if (!(event_add_idle(smbd_event_context(), NULL,
timeval_set(SMBD_SELECT_TIMEOUT, 0),
- "housekeeping", housekeeping_fn,
- sconn->msg_ctx))) {
+ "housekeeping", housekeeping_fn, sconn))) {
DEBUG(0, ("Could not add housekeeping event\n"));
exit(1);
}
@@ -3088,13 +3109,8 @@ void smbd_process(struct smbd_server_connection *sconn)
struct sockaddr_storage srv, clnt;
if (client_get_tcp_info(&srv, &clnt) == 0) {
-
NTSTATUS status;
-
- status = ctdbd_register_ips(
- messaging_ctdbd_connection(procid_self()),
- &srv, &clnt, release_ip, NULL);
-
+ status = smbd_register_ips(sconn, &srv, &clnt);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("ctdbd_register_ips failed: %s\n",
nt_errstr(status)));
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index 7d25769..aa0f7e8 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -53,18 +53,12 @@ static_decl_rpc;
extern int dcelogin_atmost_once;
#endif /* WITH_DFS */
-int smbd_server_fd(void)
-{
- return server_fd;
-}
-
static void smbd_set_server_fd(int fd)
{
struct smbd_server_connection *sconn = smbd_server_conn;
+ char addr[INET6_ADDRSTRLEN];
const char *name;
- server_fd = fd;
-
sconn->sock = fd;
/*
@@ -82,6 +76,10 @@ static void smbd_set_server_fd(int fd)
}
sconn->client_id.name =
(name != NULL) ? name : sconn->client_id.addr;
+
+ sub_set_socket_ids(sconn->client_id.addr, sconn->client_id.name,
+ client_socket_addr(sconn->sock, addr,
+ sizeof(addr)));
}
struct event_context *smbd_event_context(void)
@@ -102,7 +100,7 @@ static void smb_conf_updated(struct messaging_context *msg,
DEBUG(10,("smb_conf_updated: Got message saying smb.conf was "
"updated. Reloading.\n"));
change_to_root_user();
- reload_services(msg, smbd_server_fd(), False);
+ reload_services(msg, smbd_server_conn->sock, False);
}
@@ -1005,8 +1003,7 @@ extern void build_options(bool screen);
* Reloading of the printers will not work here as we don't have a
* server info and rpc services set up. It will be called later.
*/
- if (!reload_services(smbd_messaging_context(), smbd_server_fd(),
- False)) {
+ if (!reload_services(smbd_messaging_context(), -1, False)) {
exit(1);
}
diff --git a/source3/torture/vfstest.c b/source3/torture/vfstest.c
index 4d537da..923b547 100644
--- a/source3/torture/vfstest.c
+++ b/source3/torture/vfstest.c
@@ -410,14 +410,8 @@ void exit_server_cleanly(const char *const reason)
exit_server("normal exit");
}
-static int server_fd = -1;
int last_message = -1;
-int smbd_server_fd(void)
-{
- return server_fd;
-}
-
struct event_context *smbd_event_context(void)
{
static struct event_context *ctx;
@@ -463,7 +457,7 @@ int main(int argc, char *argv[])
poptFreeContext(pc);
/* TODO: check output */
- reload_services(smbd_messaging_context(), smbd_server_fd(), False);
+ reload_services(smbd_messaging_context(), -1, False);
/* the following functions are part of the Samba debugging
facilities. See lib/debug.c */
--
Samba Shared Repository
More information about the samba-cvs
mailing list