1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-26 21:57:41 +03:00

Add SMB2 paths to smbd/conn.c. Except for conn_idle_all(), to be cleaned up next.

This commit is contained in:
Jeremy Allison 2010-10-19 10:12:42 -07:00
parent 1bd6faa8fa
commit d7f4bea394

View File

@ -55,13 +55,31 @@ int conn_num_open(struct smbd_server_connection *sconn)
bool conn_snum_used(int snum) bool conn_snum_used(int snum)
{ {
struct smbd_server_connection *sconn = smbd_server_conn; struct smbd_server_connection *sconn = smbd_server_conn;
connection_struct *conn;
for (conn=sconn->smb1.tcons.Connections;conn;conn=conn->next) { if (sconn->using_smb2) {
if (conn->params->service == snum) { /* SMB2 */
return(True); struct smbd_smb2_session *sess;
for (sess = sconn->smb2.sessions.list; sess; sess = sess->next) {
struct smbd_smb2_tcon *ptcon;
for (ptcon = sess->tcons.list; ptcon; ptcon = ptcon->next) {
if (ptcon->compat_conn &&
ptcon->compat_conn->params &&
(ptcon->compat_conn->params->service = snum)) {
return true;
}
}
}
} else {
/* SMB1 */
connection_struct *conn;
for (conn=sconn->smb1.tcons.Connections;conn;conn=conn->next) {
if (conn->params->service == snum) {
return true;
}
} }
} }
return(False); return false;
} }
/**************************************************************************** /****************************************************************************
@ -70,16 +88,31 @@ bool conn_snum_used(int snum)
connection_struct *conn_find(struct smbd_server_connection *sconn,unsigned cnum) connection_struct *conn_find(struct smbd_server_connection *sconn,unsigned cnum)
{ {
int count=0; if (sconn->using_smb2) {
connection_struct *conn; /* SMB2 */
struct smbd_smb2_session *sess;
for (sess = sconn->smb2.sessions.list; sess; sess = sess->next) {
struct smbd_smb2_tcon *ptcon;
for (conn=sconn->smb1.tcons.Connections;conn;conn=conn->next,count++) { for (ptcon = sess->tcons.list; ptcon; ptcon = ptcon->next) {
if (conn->cnum == cnum) { if (ptcon->compat_conn &&
if (count > 10) { ptcon->compat_conn->cnum == cnum) {
DLIST_PROMOTE(sconn->smb1.tcons.Connections, return ptcon->compat_conn;
conn); }
}
}
} else {
/* SMB1 */
int count=0;
connection_struct *conn;
for (conn=sconn->smb1.tcons.Connections;conn;conn=conn->next,count++) {
if (conn->cnum == cnum) {
if (count > 10) {
DLIST_PROMOTE(sconn->smb1.tcons.Connections,
conn);
}
return conn;
} }
return conn;
} }
} }
@ -99,6 +132,7 @@ connection_struct *conn_new(struct smbd_server_connection *sconn)
int find_offset = 1; int find_offset = 1;
if (sconn->using_smb2) { if (sconn->using_smb2) {
/* SMB2 */
if (!(conn=TALLOC_ZERO_P(NULL, connection_struct)) || if (!(conn=TALLOC_ZERO_P(NULL, connection_struct)) ||
!(conn->params = TALLOC_P(conn, struct share_params))) { !(conn->params = TALLOC_P(conn, struct share_params))) {
DEBUG(0,("TALLOC_ZERO() failed!\n")); DEBUG(0,("TALLOC_ZERO() failed!\n"));
@ -109,6 +143,7 @@ connection_struct *conn_new(struct smbd_server_connection *sconn)
return conn; return conn;
} }
/* SMB1 */
find_again: find_again:
i = bitmap_find(sconn->smb1.tcons.bmap, find_offset); i = bitmap_find(sconn->smb1.tcons.bmap, find_offset);
@ -182,24 +217,22 @@ find_again:
bool conn_close_all(struct smbd_server_connection *sconn) bool conn_close_all(struct smbd_server_connection *sconn)
{ {
bool ret = false;
if (sconn->using_smb2) { if (sconn->using_smb2) {
/* SMB2 */ /* SMB2 */
if (sconn->smb2.sessions.list && struct smbd_smb2_session *sess;
sconn->smb2.sessions.list->tcons.list) { for (sess = sconn->smb2.sessions.list; sess; sess = sess->next) {
struct smbd_smb2_tcon *tcon, *tc_next; struct smbd_smb2_tcon *tcon, *tc_next;
for (tcon = sconn->smb2.sessions.list->tcons.list; for (tcon = sess->tcons.list; tcon; tcon = tc_next) {
tcon; tcon = tc_next) {
tc_next = tcon->next; tc_next = tcon->next;
TALLOC_FREE(tcon); TALLOC_FREE(tcon);
ret = true;
} }
return true;
} }
return false;
} else { } else {
/* SMB1 */ /* SMB1 */
connection_struct *conn, *next; connection_struct *conn, *next;
bool ret = false;
for (conn=sconn->smb1.tcons.Connections;conn;conn=next) { for (conn=sconn->smb1.tcons.Connections;conn;conn=next) {
next=conn->next; next=conn->next;
@ -207,8 +240,8 @@ bool conn_close_all(struct smbd_server_connection *sconn)
close_cnum(conn, conn->vuid); close_cnum(conn, conn->vuid);
ret = true; ret = true;
} }
return ret;
} }
return ret;
} }
/**************************************************************************** /****************************************************************************
@ -262,11 +295,29 @@ void conn_clear_vuid_caches(struct smbd_server_connection *sconn,uint16_t vuid)
{ {
connection_struct *conn; connection_struct *conn;
for (conn=sconn->smb1.tcons.Connections;conn;conn=conn->next) { if (sconn->using_smb2) {
if (conn->vuid == vuid) { /* SMB2 */
conn->vuid = UID_FIELD_INVALID; struct smbd_smb2_session *sess;
for (sess = sconn->smb2.sessions.list; sess; sess = sess->next) {
struct smbd_smb2_tcon *ptcon;
for (ptcon = sess->tcons.list; ptcon; ptcon = ptcon->next) {
if (ptcon->compat_conn) {
if (ptcon->compat_conn->vuid == vuid) {
ptcon->compat_conn->vuid = UID_FIELD_INVALID;
}
conn_clear_vuid_cache(ptcon->compat_conn, vuid);
}
}
}
} else {
/* SMB1 */
for (conn=sconn->smb1.tcons.Connections;conn;conn=conn->next) {
if (conn->vuid == vuid) {
conn->vuid = UID_FIELD_INVALID;
}
conn_clear_vuid_cache(conn, vuid);
} }
conn_clear_vuid_cache(conn, vuid);
} }
} }
@ -320,10 +371,12 @@ void conn_free(connection_struct *conn)
} }
if (conn->sconn->using_smb2) { if (conn->sconn->using_smb2) {
/* SMB2 */
conn_free_internal(conn); conn_free_internal(conn);
return; return;
} }
/* SMB1 */
DLIST_REMOVE(conn->sconn->smb1.tcons.Connections, conn); DLIST_REMOVE(conn->sconn->smb1.tcons.Connections, conn);
if (conn->sconn->smb1.tcons.bmap != NULL) { if (conn->sconn->smb1.tcons.bmap != NULL) {
@ -371,12 +424,32 @@ void msg_force_tdis(struct messaging_context *msg,
return; return;
} }
for (conn=sconn->smb1.tcons.Connections;conn;conn=next) { if (sconn->using_smb2) {
next=conn->next; /* SMB2 */
if (strequal(lp_servicename(SNUM(conn)), sharename)) { struct smbd_smb2_session *sess;
DEBUG(1,("Forcing close of share %s cnum=%d\n", for (sess = sconn->smb2.sessions.list; sess; sess = sess->next) {
sharename, conn->cnum)); struct smbd_smb2_tcon *tcon, *tc_next;
close_cnum(conn, (uint16)-1);
for (tcon = sess->tcons.list; tcon; tcon = tc_next) {
tc_next = tcon->next;
if (tcon->compat_conn &&
strequal(lp_servicename(SNUM(tcon->compat_conn)),
sharename)) {
DEBUG(1,("Forcing close of share %s cnum=%d\n",
sharename, tcon->compat_conn->cnum));
TALLOC_FREE(tcon);
}
}
}
} else {
/* SMB1 */
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);
}
} }
} }
} }