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:
parent
1bd6faa8fa
commit
d7f4bea394
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user