@@ -66,44 +66,20 @@ static struct lws_sorted_usec_list sul;
6666#endif
6767
6868
69- static int single_publish (struct mosquitto * context , struct mosquitto__message_v5 * pub_msg , uint32_t message_expiry )
69+ static int single_publish (struct mosquitto * context , struct mosquitto__base_msg * base_msg , uint32_t message_expiry )
7070{
71- struct mosquitto__base_msg * base_msg ;
7271 uint16_t mid ;
7372
74- base_msg = mosquitto_calloc (1 , sizeof (struct mosquitto__base_msg ));
75- if (base_msg == NULL ){
76- return MOSQ_ERR_NOMEM ;
77- }
78-
79- base_msg -> data .topic = pub_msg -> topic ;
80- pub_msg -> topic = NULL ;
81- base_msg -> data .retain = 0 ;
82- base_msg -> data .payloadlen = (uint32_t )pub_msg -> payloadlen ;
83- base_msg -> data .payload = mosquitto_malloc (base_msg -> data .payloadlen + 1 );
84- if (base_msg -> data .payload == NULL ){
85- db__msg_store_free (base_msg );
86- return MOSQ_ERR_NOMEM ;
87- }
88- /* Ensure payload is always zero terminated, this is the reason for the extra byte above */
89- ((uint8_t * )base_msg -> data .payload )[base_msg -> data .payloadlen ] = 0 ;
90- memcpy (base_msg -> data .payload , pub_msg -> payload , base_msg -> data .payloadlen );
91-
92- if (pub_msg -> properties ){
93- base_msg -> data .properties = pub_msg -> properties ;
94- pub_msg -> properties = NULL ;
95- }
96-
9773 if (db__message_store (context , base_msg , & message_expiry , mosq_mo_broker )){
9874 return 1 ;
9975 }
10076
101- if (pub_msg -> qos ){
77+ if (base_msg -> data . qos ){
10278 mid = mosquitto__mid_generate (context );
10379 }else {
10480 mid = 0 ;
10581 }
106- return db__message_insert_outgoing (context , 0 , mid , ( uint8_t ) pub_msg -> qos , 0 , base_msg , 0 , true, true);
82+ return db__message_insert_outgoing (context , 0 , mid , base_msg -> data . qos , 0 , base_msg , 0 , true, true);
10783}
10884
10985
@@ -138,28 +114,34 @@ static void read_message_expiry_interval(mosquitto_property **proplist, uint32_t
138114
139115static void queue_plugin_msgs (void )
140116{
141- struct mosquitto__message_v5 * msg , * tmp ;
117+ struct mosquitto__base_msg * base_msg , * base_tmp ;
142118 struct mosquitto * context ;
143119 uint32_t message_expiry ;
144120
145- DL_FOREACH_SAFE ( db .plugin_msgs , msg , tmp ){
146- DL_DELETE ( db .plugin_msgs , msg );
121+ for ( base_msg = db .plugin_msgs ; base_msg && ( base_tmp = base_msg -> hh . next , 1 ); base_msg = base_tmp ){
122+ base_msg__dl_delete ( & db .plugin_msgs , base_msg );
147123
148- read_message_expiry_interval (& msg -> properties , & message_expiry );
124+ read_message_expiry_interval (& base_msg -> data . properties , & message_expiry );
149125
150- if (msg -> clientid ){
151- HASH_FIND (hh_id , db .contexts_by_id , msg -> clientid , strlen (msg -> clientid ), context );
126+ if (base_msg -> data .source_id ){
127+ HASH_FIND (hh_id , db .contexts_by_id , base_msg -> data .source_id , strlen (base_msg -> data .source_id ), context );
128+ mosquitto_FREE (base_msg -> data .source_id );
152129 if (context ){
153- single_publish (context , msg , message_expiry );
130+ single_publish (context , base_msg , message_expiry );
131+ }else {
132+ db__msg_store_free (base_msg );
154133 }
155134 }else {
156- db__messages_easy_queue (NULL , msg -> topic , (uint8_t )msg -> qos , (uint32_t )msg -> payloadlen , msg -> payload , msg -> retain , message_expiry , & msg -> properties );
135+ db__messages_easy_queue (NULL ,
136+ base_msg -> data .topic ,
137+ base_msg -> data .qos ,
138+ base_msg -> data .payloadlen ,
139+ base_msg -> data .payload ,
140+ base_msg -> data .retain ,
141+ message_expiry ,
142+ & base_msg -> data .properties );
143+ db__msg_store_free (base_msg );
157144 }
158- mosquitto_FREE (msg -> topic );
159- mosquitto_FREE (msg -> payload );
160- mosquitto_property_free_all (& msg -> properties );
161- mosquitto_FREE (msg -> clientid );
162- mosquitto_FREE (msg );
163145 }
164146}
165147
@@ -197,7 +179,6 @@ int mosquitto_main_loop(struct mosquitto__listener_sock *listensock, int listens
197179
198180 while (g_run ){
199181 retain__expiry_check ();
200- queue_plugin_msgs ();
201182 context__free_disused ();
202183
203184 db .next_event_ms = 86400000 ;
@@ -262,6 +243,7 @@ int mosquitto_main_loop(struct mosquitto__listener_sock *listensock, int listens
262243 }
263244 }
264245#endif
246+ queue_plugin_msgs ();
265247 }
266248
267249 return MOSQ_ERR_SUCCESS ;
0 commit comments