#include "messages.h"
#include "lib/conn_tdb.h"
-/****************************************************************************
- Delete a connection record.
-****************************************************************************/
-
-bool yield_connection(connection_struct *conn, const char *name)
-{
- struct db_record *rec;
- NTSTATUS status;
-
- DEBUG(3,("Yielding connection to %s\n",name));
-
- rec = connections_fetch_entry(talloc_tos(), conn, name);
- if (rec == NULL) {
- DEBUG(0, ("connections_fetch_entry failed\n"));
- return False;
- }
-
- status = dbwrap_record_delete(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)));
- }
-
- TALLOC_FREE(rec);
- return NT_STATUS_IS_OK(status);
-}
-
struct count_stat {
int curr_connections;
const char *name;
- bool Clear;
+ bool verify;
};
/****************************************************************************
Count the entries belonging to a service in the connection db.
****************************************************************************/
-static int count_fn(struct db_record *rec,
- const struct connections_key *ckey,
- const struct connections_data *crec,
+static int count_fn(struct smbXsrv_tcon_global0 *tcon,
void *udp)
{
struct count_stat *cs = (struct count_stat *)udp;
- if (crec->cnum == TID_FIELD_INVALID) {
- return 0;
- }
-
- /* If the pid was not found delete the entry from connections.tdb */
-
- 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));
-
- status = dbwrap_record_delete(rec);
- if (!NT_STATUS_IS_OK(status)) {
- DEBUG(0,("count_fn: tdb_delete failed with error %s\n",
- nt_errstr(status)));
- }
+ if (cs->verify && !process_exists(tcon->server_id)) {
return 0;
}
- if (strequal(crec->servicename, cs->name))
+ if (strequal(tcon->share_name, cs->name)) {
cs->curr_connections++;
+ }
return 0;
}
Claim an entry in the connections database.
****************************************************************************/
-int count_current_connections( const char *sharename, bool clear )
+int count_current_connections(const char *sharename, bool verify)
{
struct count_stat cs;
- int ret;
+ NTSTATUS status;
cs.curr_connections = 0;
cs.name = sharename;
- cs.Clear = clear;
+ cs.verify = verify;
/*
* This has a race condition, but locking the chain before hand is worse
* as it leads to deadlock.
*/
- /*
- * become_root() because we might have to open connections.tdb
- * via ctdb, which is not possible without root.
- */
- become_root();
- ret = connections_forall(count_fn, &cs);
- unbecome_root();
+ status = smbXsrv_tcon_global_traverse(count_fn, &cs);
- if (ret < 0) {
+ if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("count_current_connections: traverse of "
- "connections.tdb failed\n"));
+ "smbXsrv_tcon_global.tdb failed - %s\n",
+ nt_errstr(status)));
return 0;
}
return false;
}
-
-/****************************************************************************
- Claim an entry in the connections database.
-****************************************************************************/
-
-bool claim_connection(connection_struct *conn, const char *name)
-{
- struct db_record *rec;
- struct connections_data crec;
- char *raddr;
- TDB_DATA dbuf;
- NTSTATUS status;
-
- DEBUG(5,("claiming [%s]\n", name));
-
- if (!(rec = connections_fetch_entry(talloc_tos(), conn, name))) {
- DEBUG(0, ("connections_fetch_entry failed\n"));
- return False;
- }
-
- /* Make clear that we require the optional unix_token in the source3 code */
- SMB_ASSERT(conn->session_info->unix_token);
-
- /* fill in the crec */
- ZERO_STRUCT(crec);
- crec.magic = 0x280267;
- crec.pid = messaging_server_id(conn->sconn->msg_ctx);
- crec.cnum = conn->cnum;
- crec.uid = conn->session_info->unix_token->uid;
- crec.gid = conn->session_info->unix_token->gid;
- strlcpy(crec.servicename, lp_servicename(rec, SNUM(conn)),
- sizeof(crec.servicename));
- crec.start = time(NULL);
-
- raddr = tsocket_address_inet_addr_string(conn->sconn->remote_address,
- rec);
- if (raddr == NULL) {
- return false;
- }
-
- strlcpy(crec.machine,get_remote_machine_name(),sizeof(crec.machine));
- strlcpy(crec.addr, raddr, sizeof(crec.addr));
-
- dbuf.dptr = (uint8 *)&crec;
- dbuf.dsize = sizeof(crec);
-
- status = dbwrap_record_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",
- nt_errstr(status)));
- return False;
- }
-
- return True;
-}