s3: smbd: Change canonicalize_ea_name() to take a const smb_filename * parameter...
[sfrench/samba-autobuild/.git] / source3 / smbd / connection.c
index d334e8bdc1e70595ecfacc3f4fca2f24cee2f71f..0b78b9e2dbb2fbda165cd3a44470f8fe6f8204cf 100644 (file)
 #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;
 }
@@ -101,31 +56,26 @@ static int count_fn(struct db_record *rec,
  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;
        }
 
@@ -144,61 +94,3 @@ bool connections_snum_used(struct smbd_server_connection *unused, int snum)
 
        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;
-}