From c8620180083c2bff2e54bb90bcbf89a3d5008fbd Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 27 May 2009 11:15:44 +0200 Subject: s3:smbd: move tcon specific globals to struct smbd_server_connection metze --- source3/smbd/conn.c | 72 +++++++++++++++++++++++++++++------------------------ 1 file changed, 39 insertions(+), 33 deletions(-) (limited to 'source3/smbd/conn.c') diff --git a/source3/smbd/conn.c b/source3/smbd/conn.c index 3800643769..607329de77 100644 --- a/source3/smbd/conn.c +++ b/source3/smbd/conn.c @@ -30,17 +30,19 @@ /**************************************************************************** init the conn structures ****************************************************************************/ -void conn_init(void) +void conn_init(struct smbd_server_connection *sconn) { - bmap = bitmap_allocate(BITMAP_BLOCK_SZ); + sconn->smb1.tcons.Connections = NULL; + sconn->smb1.tcons.num_open = 0; + sconn->smb1.tcons.bmap = bitmap_allocate(BITMAP_BLOCK_SZ); } /**************************************************************************** return the number of open connections ****************************************************************************/ -int conn_num_open(void) +int conn_num_open(struct smbd_server_connection *sconn) { - return num_open; + return sconn->smb1.tcons.num_open; } @@ -49,8 +51,9 @@ check if a snum is in use ****************************************************************************/ bool conn_snum_used(int snum) { + struct smbd_server_connection *sconn = smbd_server_conn; connection_struct *conn; - for (conn=Connections;conn;conn=conn->next) { + for (conn=sconn->smb1.tcons.Connections;conn;conn=conn->next) { if (conn->params->service == snum) { return(True); } @@ -62,15 +65,16 @@ bool conn_snum_used(int snum) Find a conn given a cnum. ****************************************************************************/ -connection_struct *conn_find(unsigned cnum) +connection_struct *conn_find(struct smbd_server_connection *sconn,unsigned cnum) { int count=0; connection_struct *conn; - for (conn=Connections;conn;conn=conn->next,count++) { + for (conn=sconn->smb1.tcons.Connections;conn;conn=conn->next,count++) { if (conn->cnum == cnum) { if (count > 10) { - DLIST_PROMOTE(Connections, conn); + DLIST_PROMOTE(sconn->smb1.tcons.Connections, + conn); } return conn; } @@ -84,19 +88,20 @@ connection_struct *conn_find(unsigned cnum) The randomisation stops problems with the server dieing and clients thinking the server is still available. ****************************************************************************/ -connection_struct *conn_new(void) +connection_struct *conn_new(struct smbd_server_connection *sconn) { connection_struct *conn; int i; int find_offset = 1; find_again: - i = bitmap_find(bmap, find_offset); + i = bitmap_find(sconn->smb1.tcons.bmap, find_offset); if (i == -1) { /* Expand the connections bitmap. */ - int oldsz = bmap->n; - int newsz = bmap->n + BITMAP_BLOCK_SZ; + int oldsz = sconn->smb1.tcons.bmap->n; + int newsz = sconn->smb1.tcons.bmap->n + + BITMAP_BLOCK_SZ; struct bitmap * nbmap; if (newsz <= oldsz) { @@ -114,10 +119,10 @@ find_again: return NULL; } - bitmap_copy(nbmap, bmap); - bitmap_free(bmap); + bitmap_copy(nbmap, sconn->smb1.tcons.bmap); + bitmap_free(sconn->smb1.tcons.bmap); - bmap = nbmap; + sconn->smb1.tcons.bmap = nbmap; find_offset = oldsz; /* Start next search in the new portion. */ goto find_again; @@ -142,15 +147,15 @@ find_again: conn->cnum = i; conn->force_group_gid = (gid_t)-1; - bitmap_set(bmap, i); + bitmap_set(sconn->smb1.tcons.bmap, i); - num_open++; + sconn->smb1.tcons.num_open++; string_set(&conn->dirpath,""); string_set(&conn->connectpath,""); string_set(&conn->origpath,""); - DLIST_ADD(Connections, conn); + DLIST_ADD(sconn->smb1.tcons.Connections, conn); return conn; } @@ -159,14 +164,14 @@ find_again: Close all conn structures. return true if any were closed ****************************************************************************/ -bool conn_close_all(void) +bool conn_close_all(struct smbd_server_connection *sconn) { connection_struct *conn, *next; bool ret = false; - for (conn=Connections;conn;conn=next) { + for (conn=sconn->smb1.tcons.Connections;conn;conn=next) { next=conn->next; set_current_service(conn, 0, True); - close_cnum(conn, conn->vuid); + close_cnum(sconn, conn, conn->vuid); ret = true; } return ret; @@ -176,7 +181,7 @@ bool conn_close_all(void) Idle inactive connections. ****************************************************************************/ -bool conn_idle_all(time_t t) +bool conn_idle_all(struct smbd_server_connection *sconn,time_t t) { int deadtime = lp_deadtime()*60; pipes_struct *plist = NULL; @@ -185,7 +190,7 @@ bool conn_idle_all(time_t t) if (deadtime <= 0) deadtime = DEFAULT_SMBD_TIMEOUT; - for (conn=Connections;conn;conn=conn->next) { + for (conn=sconn->smb1.tcons.Connections;conn;conn=conn->next) { time_t age = t - conn->lastused; @@ -224,11 +229,11 @@ bool conn_idle_all(time_t t) Clear a vuid out of the validity cache, and as the 'owner' of a connection. ****************************************************************************/ -void conn_clear_vuid_caches(uint16_t vuid) +void conn_clear_vuid_caches(struct smbd_server_connection *sconn,uint16_t vuid) { connection_struct *conn; - for (conn=Connections;conn;conn=conn->next) { + for (conn=sconn->smb1.tcons.Connections;conn;conn=conn->next) { if (conn->vuid == vuid) { conn->vuid = UID_FIELD_INVALID; } @@ -279,14 +284,14 @@ void conn_free_internal(connection_struct *conn) Free a conn structure. ****************************************************************************/ -void conn_free(connection_struct *conn) +void conn_free(struct smbd_server_connection *sconn, connection_struct *conn) { - DLIST_REMOVE(Connections, conn); + DLIST_REMOVE(sconn->smb1.tcons.Connections, conn); - bitmap_clear(bmap, conn->cnum); + bitmap_clear(sconn->smb1.tcons.bmap, conn->cnum); - SMB_ASSERT(num_open > 0); - num_open--; + SMB_ASSERT(sconn->smb1.tcons.num_open > 0); + sconn->smb1.tcons.num_open--; conn_free_internal(conn); } @@ -303,6 +308,7 @@ void msg_force_tdis(struct messaging_context *msg, struct server_id server_id, DATA_BLOB *data) { + struct smbd_server_connection *sconn = smbd_server_conn; connection_struct *conn, *next; fstring sharename; @@ -310,16 +316,16 @@ void msg_force_tdis(struct messaging_context *msg, if (strcmp(sharename, "*") == 0) { DEBUG(1,("Forcing close of all shares\n")); - conn_close_all(); + conn_close_all(sconn); return; } - for (conn=Connections;conn;conn=next) { + for (conn=sconn->smb1.tcons.Connections;conn;conn=next) { next=conn->next; if (strequal(lp_servicename(SNUM(conn)), sharename)) { DEBUG(1,("Forcing close of share %s cnum=%d\n", sharename, conn->cnum)); - close_cnum(conn, (uint16)-1); + close_cnum(sconn, conn, (uint16)-1); } } } -- cgit