summaryrefslogtreecommitdiff
path: root/source3/smbd/connection.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/smbd/connection.c')
-rw-r--r--source3/smbd/connection.c163
1 files changed, 75 insertions, 88 deletions
diff --git a/source3/smbd/connection.c b/source3/smbd/connection.c
index 3e4a8a858b..4c4ddbc0f0 100644
--- a/source3/smbd/connection.c
+++ b/source3/smbd/connection.c
@@ -20,50 +20,30 @@
#include "includes.h"
-static void make_conn_key(connection_struct *conn, const char *name, TDB_DATA *pkbuf, struct connections_key *pkey)
-{
- ZERO_STRUCTP(pkey);
- pkey->pid = procid_self();
- pkey->cnum = conn?conn->cnum:-1;
- fstrcpy(pkey->name, name);
-#ifdef DEVELOPER
- /* valgrind fixer... */
- {
- size_t sl = strlen(pkey->name);
- if (sizeof(fstring)-sl)
- memset(&pkey->name[sl], '\0', sizeof(fstring)-sl);
- }
-#endif
-
- pkbuf->dptr = (uint8 *)pkey;
- pkbuf->dsize = sizeof(*pkey);
-}
-
/****************************************************************************
Delete a connection record.
****************************************************************************/
BOOL yield_connection(connection_struct *conn, const char *name)
{
- struct connections_key key;
- TDB_DATA kbuf;
- TDB_CONTEXT *tdb = conn_tdb_ctx(True);
-
- if (!tdb)
- return False;
+ struct db_record *rec;
+ NTSTATUS status;
DEBUG(3,("Yielding connection to %s\n",name));
- make_conn_key(conn, name, &kbuf, &key);
+ if (!(rec = connections_fetch_entry(NULL, conn, name))) {
+ DEBUG(0, ("connections_fetch_entry failed\n"));
+ return False;
+ }
- if (tdb_delete(tdb, kbuf) != 0) {
- int dbg_lvl = (!conn && (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);
+ status = rec->delete_rec(rec);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG( NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND) ? 3 : 0,
+ ("deleting connection record returned %s\n",
+ nt_errstr(status)));
}
- return(True);
+ return NT_STATUS_IS_OK(status);
}
struct count_stat {
@@ -77,34 +57,36 @@ struct count_stat {
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)
+static int count_fn(struct db_record *rec,
+ const struct connections_key *ckey,
+ const struct connections_data *crec,
+ 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) {
+ 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)) {
+ if (cs->Clear && !process_exists(crec->pid) && (errno == ESRCH)) {
+ NTSTATUS status;
DEBUG(2,("pid %s doesn't exist - deleting connections %d [%s]\n",
- procid_str_static(&crec.pid), crec.cnum, crec.servicename));
- if (tdb_delete(the_tdb, kbuf) != 0)
- DEBUG(0,("count_fn: tdb_delete failed with error %s\n", tdb_errorstr(the_tdb) ));
+ procid_str_static(&crec->pid), crec->cnum,
+ crec->servicename));
+
+ status = rec->delete_rec(rec);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(0,("count_fn: tdb_delete failed with error %s\n",
+ nt_errstr(status)));
+ }
return 0;
}
if (cs->name) {
/* We are counting all the connections to a given share. */
- if (strequal(crec.servicename, cs->name)) {
+ if (strequal(crec->servicename, cs->name)) {
cs->curr_connections++;
}
} else {
@@ -125,7 +107,6 @@ static int count_fn( TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *u
int count_current_connections( const char *sharename, BOOL clear )
{
struct count_stat cs;
- TDB_CONTEXT *tdb = conn_tdb_ctx(True);
cs.mypid = sys_getpid();
cs.curr_connections = 0;
@@ -137,9 +118,9 @@ int count_current_connections( const char *sharename, BOOL clear )
* as it leads to deadlock.
*/
- if (tdb_traverse(tdb, count_fn, &cs) == -1) {
- DEBUG(0,("count_current_connections: traverse of connections.tdb failed with error %s\n",
- tdb_errorstr(tdb) ));
+ if (connections_forall(count_fn, &cs) == -1) {
+ DEBUG(0,("count_current_connections: traverse of "
+ "connections.tdb failed\n"));
DEBUGADD(0, ("count_current_connections: connection count of %d might not be accurate",
cs.curr_connections));
}
@@ -169,18 +150,17 @@ int count_all_current_connections(void)
BOOL claim_connection(connection_struct *conn, const char *name,
uint32 msg_flags)
{
- struct connections_key key;
+ struct db_record *rec;
struct connections_data crec;
- TDB_DATA kbuf, dbuf;
- TDB_CONTEXT *tdb = conn_tdb_ctx(True);
+ TDB_DATA dbuf;
+ NTSTATUS status;
- if (!tdb) {
+ DEBUG(5,("claiming [%s]\n", name));
+
+ if (!(rec = connections_fetch_entry(NULL, conn, name))) {
+ DEBUG(0, ("connections_fetch_entry failed\n"));
return False;
}
-
- DEBUG(5,("claiming %s\n",name));
-
- make_conn_key(conn, name, &kbuf, &key);
/* fill in the crec */
ZERO_STRUCT(crec);
@@ -190,21 +170,26 @@ BOOL claim_connection(connection_struct *conn, const char *name,
if (conn) {
crec.uid = conn->uid;
crec.gid = conn->gid;
- safe_strcpy(crec.servicename,
- lp_servicename(SNUM(conn)),sizeof(crec.servicename)-1);
+ strlcpy(crec.servicename, lp_servicename(SNUM(conn)),
+ sizeof(crec.servicename));
}
crec.start = time(NULL);
crec.bcast_msg_flags = msg_flags;
- safe_strcpy(crec.machine,get_remote_machine_name(),sizeof(crec.machine)-1);
- safe_strcpy(crec.addr,conn?conn->client_address:client_addr(),sizeof(crec.addr)-1);
+ strlcpy(crec.machine,get_remote_machine_name(),sizeof(crec.machine));
+ strlcpy(crec.addr,conn?conn->client_address:client_addr(),
+ sizeof(crec.addr));
dbuf.dptr = (uint8 *)&crec;
dbuf.dsize = sizeof(crec);
- if (tdb_store(tdb, kbuf, dbuf, TDB_REPLACE) != 0) {
+ status = rec->store(rec, dbuf, TDB_REPLACE);
+
+ TALLOC_FREE(rec);
+
+ if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("claim_connection: tdb_store failed with error %s.\n",
- tdb_errorstr(tdb) ));
+ nt_errstr(status)));
return False;
}
@@ -213,44 +198,44 @@ BOOL claim_connection(connection_struct *conn, const char *name,
BOOL register_message_flags(BOOL doreg, uint32 msg_flags)
{
- struct connections_key key;
+ struct db_record *rec;
struct connections_data *pcrec;
- TDB_DATA kbuf, dbuf;
- TDB_CONTEXT *tdb = conn_tdb_ctx(True);
-
- if (!tdb)
- return False;
+ NTSTATUS status;
DEBUG(10,("register_message_flags: %s flags 0x%x\n",
doreg ? "adding" : "removing",
(unsigned int)msg_flags ));
- make_conn_key(NULL, "", &kbuf, &key);
+ if (!(rec = connections_fetch_entry(NULL, NULL, NULL))) {
+ DEBUG(0, ("connections_fetch_entry failed\n"));
+ return False;
+ }
- dbuf = tdb_fetch(tdb, kbuf);
- if (!dbuf.dptr) {
- DEBUG(0,("register_message_flags: tdb_fetch failed: %s\n",
- tdb_errorstr(tdb)));
+ if (rec->value.dsize != sizeof(struct connections_data)) {
+ DEBUG(0,("register_message_flags: Got wrong record size\n"));
+ TALLOC_FREE(rec);
return False;
}
- pcrec = (struct connections_data *)dbuf.dptr;
+ pcrec = (struct connections_data *)rec->value.dptr;
if (doreg)
pcrec->bcast_msg_flags |= msg_flags;
else
pcrec->bcast_msg_flags &= ~msg_flags;
- if (tdb_store(tdb, kbuf, dbuf, TDB_REPLACE) != 0) {
+ status = rec->store(rec, rec->value, TDB_REPLACE);
+
+ TALLOC_FREE(rec);
+
+ if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("register_message_flags: tdb_store failed: %s.\n",
- tdb_errorstr(tdb) ));
- SAFE_FREE(dbuf.dptr);
+ nt_errstr(status)));
return False;
}
DEBUG(10,("register_message_flags: new flags 0x%x\n",
(unsigned int)pcrec->bcast_msg_flags ));
- SAFE_FREE(dbuf.dptr);
return True;
}
@@ -297,10 +282,10 @@ static void fill_pipe_open_rec( struct pipe_open_rec *prec, smb_np_struct *p )
BOOL store_pipe_opendb( smb_np_struct *p )
{
+ struct db_record *dbrec;
struct pipe_open_rec *prec;
TDB_DATA *key;
TDB_DATA data;
- TDB_CONTEXT *pipe_tdb;
BOOL ret = False;
if ( (prec = TALLOC_P( NULL, struct pipe_open_rec)) == NULL ) {
@@ -315,12 +300,13 @@ BOOL store_pipe_opendb( smb_np_struct *p )
data.dptr = (uint8 *)prec;
data.dsize = sizeof(struct pipe_open_rec);
-
- if ( (pipe_tdb = conn_tdb_ctx(True) ) == NULL ) {
+
+ if (!(dbrec = connections_fetch_record(prec, *key))) {
+ DEBUG(0, ("connections_fetch_record failed\n"));
goto done;
}
-
- ret = (tdb_store( pipe_tdb, *key, data, TDB_REPLACE ) != -1);
+
+ ret = NT_STATUS_IS_OK(dbrec->store(dbrec, data, TDB_REPLACE));
done:
TALLOC_FREE( prec );
@@ -332,9 +318,9 @@ done:
BOOL delete_pipe_opendb( smb_np_struct *p )
{
+ struct db_record *dbrec;
struct pipe_open_rec *prec;
TDB_DATA *key;
- TDB_CONTEXT *pipe_tdb;
BOOL ret = False;
if ( (prec = TALLOC_P( NULL, struct pipe_open_rec)) == NULL ) {
@@ -347,11 +333,12 @@ BOOL delete_pipe_opendb( smb_np_struct *p )
goto done;
}
- if ( (pipe_tdb = conn_tdb_ctx(True) ) == NULL ) {
+ if (!(dbrec = connections_fetch_record(prec, *key))) {
+ DEBUG(0, ("connections_fetch_record failed\n"));
goto done;
}
- ret = (tdb_delete( pipe_tdb, *key ) != -1 );
+ ret = NT_STATUS_IS_OK(dbrec->delete_rec(dbrec));
done:
TALLOC_FREE( prec );