s3: Replace register_message_flags() with serverid_register_msg_flags()
authorVolker Lendecke <vl@samba.org>
Sun, 4 Jul 2010 18:40:46 +0000 (20:40 +0200)
committerVolker Lendecke <vl@samba.org>
Sun, 4 Jul 2010 19:49:03 +0000 (21:49 +0200)
message_send_all is now done by walking the serverid.tdb, not the
connections.tdb anymore.

Günther, Simo, please check!

source3/include/proto.h
source3/include/serverid.h
source3/lib/serverid.c
source3/rpc_server/srv_spoolss_nt.c
source3/smbd/connection.c

index 30a432521f3a74c853af731b371876077beeb7ad..5f332ef53e7f93576cd029749c1a830b96e88c21 100644 (file)
@@ -5358,7 +5358,6 @@ bool yield_connection(connection_struct *conn, const char *name);
 int count_current_connections( const char *sharename, bool clear  );
 bool claim_connection(connection_struct *conn, const char *name,
                      uint32 msg_flags);
-bool register_message_flags(bool doreg, uint32 msg_flags);
 
 /* The following definitions come from smbd/dfree.c  */
 
index db2ce5ab87555c45fac9488d7844ae62652bbfac..3fcb5548d6ea64851c59e5b894a85d200369ecb8 100644 (file)
@@ -32,6 +32,12 @@ bool serverid_register(const struct server_id id, uint32_t msg_flags);
  */
 bool serverid_deregister(const struct server_id id);
 
+/*
+ * (De)register additional message flags
+ */
+bool serverid_register_msg_flags(const struct server_id id, bool do_reg,
+                                uint32_t msg_flags);
+
 /*
  * Check existence of a server id
  */
index f92c8cfd58d8eb0fd72ead0ec0d3bcf6a91f2dbe..f774170784cef87424a9f9c68d05d635a2ac46a4 100644 (file)
@@ -117,6 +117,58 @@ done:
        return ret;
 }
 
+bool serverid_register_msg_flags(const struct server_id id, bool do_reg,
+                                uint32_t msg_flags)
+{
+       struct db_context *db;
+       struct serverid_key key;
+       struct serverid_data *data;
+       struct db_record *rec;
+       TDB_DATA tdbkey, tdbdata;
+       NTSTATUS status;
+       bool ret = false;
+
+       db = serverid_db();
+       if (db == NULL) {
+               return false;
+       }
+
+       serverid_fill_key(&id, &key);
+       tdbkey = make_tdb_data((uint8_t *)&key, sizeof(key));
+
+       rec = db->fetch_locked(db, talloc_tos(), tdbkey);
+       if (rec == NULL) {
+               DEBUG(1, ("Could not fetch_lock serverid.tdb record\n"));
+               return false;
+       }
+
+       if (rec->value.dsize != sizeof(struct serverid_data)) {
+               DEBUG(1, ("serverid record has unexpected size %d "
+                         "(wanted %d)\n", (int)rec->value.dsize,
+                         sizeof(struct serverid_data)));
+               goto done;
+       }
+
+       data = (struct serverid_data *)rec->value.dptr;
+
+       if (do_reg) {
+               data->msg_flags |= msg_flags;
+       } else {
+               data->msg_flags &= ~msg_flags;
+       }
+
+       status = rec->store(rec, tdbdata, 0);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(1, ("Storing serverid.tdb record failed: %s\n",
+                         nt_errstr(status)));
+               goto done;
+       }
+       ret = true;
+done:
+       TALLOC_FREE(rec);
+       return ret;
+}
+
 bool serverid_deregister(struct server_id id)
 {
        struct db_context *db;
index c844027382a804f45c43726b12e47e034558bac0..dae9f376d9214138b80dfbdd52a45fa47f9751d5 100644 (file)
@@ -185,7 +185,9 @@ static void srv_spoolss_replycloseprinter(int snum, struct policy_handle *handle
                /* Tell the connections db we're no longer interested in
                 * printer notify messages. */
 
-               register_message_flags(false, FLAG_MSG_PRINT_NOTIFY);
+               serverid_register_msg_flags(
+                       procid_self(),
+                       false, FLAG_MSG_PRINT_NOTIFY);
        }
 
        smb_connections--;
@@ -2355,7 +2357,9 @@ static bool srv_spoolss_replyopenprinter(int snum, const char *printer,
                                   receive_notify2_message_list);
                /* Tell the connections db we're now interested in printer
                 * notify messages. */
-               register_message_flags(true, FLAG_MSG_PRINT_NOTIFY);
+               serverid_register_msg_flags(
+                       procid_self(),
+                       true, FLAG_MSG_PRINT_NOTIFY);
        }
 
        /*
index e2b01d057943943c54e00099b1c695a30a0bdede..fe1fcdbdb8fbb3a8e0210069ade4e49fda114bf2 100644 (file)
@@ -170,47 +170,3 @@ bool claim_connection(connection_struct *conn, const char *name,
 
        return True;
 }
-
-bool register_message_flags(bool doreg, uint32 msg_flags)
-{
-       struct db_record *rec;
-       struct connections_data *pcrec;
-       NTSTATUS status;
-
-       DEBUG(10,("register_message_flags: %s flags 0x%x\n",
-               doreg ? "adding" : "removing",
-               (unsigned int)msg_flags ));
-
-       if (!(rec = connections_fetch_entry(NULL, NULL, ""))) {
-               DEBUG(0, ("connections_fetch_entry failed\n"));
-               return False;
-       }
-
-       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 *)rec->value.dptr;
-       if (doreg)
-               pcrec->bcast_msg_flags |= msg_flags;
-       else
-               pcrec->bcast_msg_flags &= ~msg_flags;
-
-       status = rec->store(rec, rec->value, TDB_REPLACE);
-
-       if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(0,("register_message_flags: tdb_store failed: %s.\n",
-                        nt_errstr(status)));
-               TALLOC_FREE(rec);
-               return False;
-       }
-
-       DEBUG(10,("register_message_flags: new flags 0x%x\n",
-               (unsigned int)pcrec->bcast_msg_flags ));
-
-       TALLOC_FREE(rec);
-
-       return True;
-}