diff options
Diffstat (limited to 'source4')
-rw-r--r-- | source4/smb_server/config.mk | 1 | ||||
-rw-r--r-- | source4/smb_server/connection.c | 227 | ||||
-rw-r--r-- | source4/smb_server/service.c | 12 |
3 files changed, 0 insertions, 240 deletions
diff --git a/source4/smb_server/config.mk b/source4/smb_server/config.mk index 5938039ade..4059df1726 100644 --- a/source4/smb_server/config.mk +++ b/source4/smb_server/config.mk @@ -7,7 +7,6 @@ INIT_OBJ_FILES = \ smb_server/smb_server.o ADD_OBJ_FILES = \ smb_server/conn.o \ - smb_server/connection.o \ smb_server/negprot.o \ smb_server/nttrans.o \ smb_server/password.o \ diff --git a/source4/smb_server/connection.c b/source4/smb_server/connection.c deleted file mode 100644 index 4badf00ce3..0000000000 --- a/source4/smb_server/connection.c +++ /dev/null @@ -1,227 +0,0 @@ -/* - Unix SMB/CIFS implementation. - connection claim routines - Copyright (C) Andrew Tridgell 1998 - - 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 - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#include "includes.h" - -static TDB_CONTEXT *tdb; - - -static void make_conn_key(struct smbsrv_tcon *tcon, const char *name, TDB_DATA *pkbuf, struct connections_key *pkey) -{ - ZERO_STRUCTP(pkey); - pkey->pid = getpid(); - pkey->cnum = tcon?tcon->cnum:-1; - fstrcpy(pkey->name, name); - - pkbuf->dptr = (char *)pkey; - pkbuf->dsize = sizeof(*pkey); -} - -/**************************************************************************** - Delete a connection record. -****************************************************************************/ - -BOOL yield_connection(struct smbsrv_tcon *tcon, const char *name) -{ - struct connections_key key; - TDB_DATA kbuf; - - if (!tdb) - return False; - - DEBUG(3,("Yielding connection to %s\n",name)); - - make_conn_key(tcon, name, &kbuf, &key); - - if (tdb_delete(tdb, kbuf) != 0) { - int dbg_lvl = (!tcon && (tdb_error(tdb) == TDB_ERR_NOEXIST)) ? 3 : 0; - DEBUG(dbg_lvl,("yield_connection: tdb_delete for name %s failed with error %s.\n", - name, tdb_errorstr(tdb) )); - return (False); - } - - return(True); -} - -struct count_stat { - pid_t mypid; - int curr_connections; - const char *name; - BOOL Clear; -}; - -/**************************************************************************** - Count the entries belonging to a service in the connection db. -****************************************************************************/ - -static int count_fn( TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *udp) -{ - struct connections_data crec; - struct count_stat *cs = (struct count_stat *)udp; - - if (dbuf.dsize != sizeof(crec)) - return 0; - - memcpy(&crec, dbuf.dptr, sizeof(crec)); - - if (crec.cnum == -1) - return 0; - - /* If the pid was not found delete the entry from connections.tdb */ - - if (cs->Clear && !process_exists(crec.pid) && (errno == ESRCH)) { - DEBUG(2,("pid %u doesn't exist - deleting connections %d [%s]\n", - (uint_t)crec.pid, crec.cnum, crec.name)); - if (tdb_delete(the_tdb, kbuf) != 0) - DEBUG(0,("count_fn: tdb_delete failed with error %s\n", tdb_errorstr(tdb) )); - return 0; - } - - if (strequal(crec.name, cs->name)) - cs->curr_connections++; - - return 0; -} - -/**************************************************************************** - Claim an entry in the connections database. -****************************************************************************/ - -BOOL claim_connection(struct smbsrv_tcon *tcon, const char *name,int max_connections,BOOL Clear, uint32_t msg_flags) -{ - struct connections_key key; - struct connections_data crec; - TDB_DATA kbuf, dbuf; - - if (!tdb) { - char *lpath = lock_path(tcon, "connections.tdb"); - tdb = tdb_open_log(lpath, 0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT, - O_RDWR | O_CREAT, 0644); - talloc_free(lpath); - } - - if (!tdb) { - return False; - } - - /* - * Enforce the max connections parameter. - */ - - if (max_connections > 0) { - struct count_stat cs; - - cs.mypid = getpid(); - cs.curr_connections = 0; - cs.name = lp_servicename(SNUM(tcon)); - cs.Clear = Clear; - - /* - * This has a race condition, but locking the chain before hand is worse - * as it leads to deadlock. - */ - - if (tdb_traverse(tdb, count_fn, &cs) == -1) { - DEBUG(0,("claim_connection: traverse of connections.tdb failed with error %s.\n", - tdb_errorstr(tdb) )); - return False; - } - - if (cs.curr_connections >= max_connections) { - DEBUG(1,("claim_connection: Max connections (%d) exceeded for %s\n", - max_connections, name )); - return False; - } - } - - DEBUG(5,("claiming %s %d\n",name,max_connections)); - - make_conn_key(tcon, name, &kbuf, &key); - - /* fill in the crec */ - ZERO_STRUCT(crec); - crec.magic = 0x280267; - crec.pid = getpid(); - crec.cnum = tcon?tcon->cnum:-1; - if (tcon) { - crec.uid = -1; - crec.gid = -1; - StrnCpy(crec.name, - lp_servicename(SNUM(tcon)),sizeof(crec.name)-1); - } - crec.start = time(NULL); - crec.bcast_msg_flags = msg_flags; - - StrnCpy(crec.machine,sub_get_remote_machine(),sizeof(crec.machine)-1); - StrnCpy(crec.addr,tcon?tcon->smb_conn->connection->socket->client_addr:"NONE",sizeof(crec.addr)-1); - - dbuf.dptr = (char *)&crec; - dbuf.dsize = sizeof(crec); - - if (tdb_store(tdb, kbuf, dbuf, TDB_REPLACE) != 0) { - DEBUG(0,("claim_connection: tdb_store failed with error %s.\n", - tdb_errorstr(tdb) )); - return False; - } - - return True; -} - -BOOL register_message_flags(BOOL doreg, uint32_t msg_flags) -{ - struct connections_key key; - struct connections_data *pcrec; - TDB_DATA kbuf, dbuf; - - if (!tdb) - return False; - - DEBUG(10,("register_message_flags: %s flags 0x%x\n", - doreg ? "adding" : "removing", - (uint_t)msg_flags )); - - make_conn_key(NULL, "", &kbuf, &key); - - dbuf = tdb_fetch(tdb, kbuf); - if (!dbuf.dptr) { - DEBUG(0,("register_message_flags: tdb_fetch failed\n")); - return False; - } - - pcrec = (struct connections_data *)dbuf.dptr; - pcrec->bcast_msg_flags = msg_flags; - if (doreg) - pcrec->bcast_msg_flags |= msg_flags; - else - pcrec->bcast_msg_flags &= ~msg_flags; - - if (tdb_store(tdb, kbuf, dbuf, TDB_REPLACE) != 0) { - DEBUG(0,("register_message_flags: tdb_store failed with error %s.\n", - tdb_errorstr(tdb) )); - SAFE_FREE(dbuf.dptr); - return False; - } - - DEBUG(10,("register_message_flags: new flags 0x%x\n", - (uint_t)pcrec->bcast_msg_flags )); - - SAFE_FREE(dbuf.dptr); - return True; -} diff --git a/source4/smb_server/service.c b/source4/smb_server/service.c index 8741898a9c..e42b803690 100644 --- a/source4/smb_server/service.c +++ b/source4/smb_server/service.c @@ -172,16 +172,6 @@ static NTSTATUS make_connection_snum(struct smbsrv_request *req, } } - /* check number of connections */ - if (!claim_connection(tcon, - lp_servicename(SNUM(tcon)), - lp_max_connections(SNUM(tcon)), - False,0)) { - DEBUG(1,("too many connections - rejected\n")); - conn_free(req->smb_conn, tcon); - return NT_STATUS_INSUFFICIENT_RESOURCES; - } - /* init ntvfs function pointers */ status = ntvfs_init_connection(req); if (!NT_STATUS_IS_OK(status)) { @@ -261,8 +251,6 @@ void close_cnum(struct smbsrv_tcon *tcon) DEBUG(3,("%s closed connection to service %s\n", tcon->smb_conn->connection->socket->client_addr, lp_servicename(SNUM(tcon)))); - yield_connection(tcon, lp_servicename(SNUM(tcon))); - /* tell the ntvfs backend that we are disconnecting */ tcon->ntvfs_ops->disconnect(tcon); |