@@ -156,6 +156,18 @@ int obs_open_module(obs_module_t **module, const char *path, const char *data_pa
156156 return MODULE_SUCCESS ;
157157}
158158
159+ static void clear_module_load_error (obs_module_t * module )
160+ {
161+ if (!module )
162+ return ;
163+
164+ bfree (module -> load_error_code );
165+ module -> load_error_code = NULL ;
166+
167+ bfree (module -> load_error_message );
168+ module -> load_error_message = NULL ;
169+ }
170+
159171bool obs_init_module (obs_module_t * module )
160172{
161173 if (!module || !obs )
@@ -167,14 +179,34 @@ bool obs_init_module(obs_module_t *module)
167179 profile_store_name (obs_get_profiler_name_store (), "obs_init_module(%s)" , module -> file );
168180 profile_start (profile_name );
169181
182+ clear_module_load_error (module );
170183 module -> loaded = module -> load ();
171- if (!module -> loaded )
172- blog (LOG_WARNING , "Failed to initialize module '%s'" , module -> file );
184+ if (!module -> loaded ) {
185+ if (module -> load_error_code && module -> load_error_message ) {
186+ blog (LOG_WARNING , "Failed to initialize module '%s': %s (%s)" , module -> file ,
187+ module -> load_error_message , module -> load_error_code );
188+ } else if (module -> load_error_code ) {
189+ blog (LOG_WARNING , "Failed to initialize module '%s': %s" , module -> file ,
190+ module -> load_error_code );
191+ } else {
192+ blog (LOG_WARNING , "Failed to initialize module '%s'" , module -> file );
193+ }
194+ }
173195
174196 profile_end (profile_name );
175197 return module -> loaded ;
176198}
177199
200+ void obs_module_set_load_error (obs_module_t * module , const char * code , const char * message )
201+ {
202+ if (!module )
203+ return ;
204+
205+ clear_module_load_error (module );
206+ module -> load_error_code = bstrdup (code ? code : "" );
207+ module -> load_error_message = bstrdup (message ? message : "" );
208+ }
209+
178210void obs_log_loaded_modules (void )
179211{
180212 blog (LOG_INFO , " Loaded Modules:" );
@@ -294,9 +326,25 @@ extern void get_plugin_info(const char *path, bool *is_obs_plugin, bool *can_loa
294326
295327struct fail_info {
296328 struct dstr fail_modules ;
297- size_t fail_count ;
329+ DARRAY ( struct obs_module_load_failure ) failures ;
298330};
299331
332+ static void add_module_failure (struct fail_info * fail_info , const char * module , const char * code , const char * message )
333+ {
334+ if (!fail_info )
335+ return ;
336+
337+ struct obs_module_load_failure failure = {
338+ bstrdup (module ? module : "" ),
339+ bstrdup ((code && * code ) ? code : "MODULE_LOAD_FAILED" ),
340+ bstrdup ((message && * message ) ? message : "Module failed to load." ),
341+ };
342+
343+ dstr_cat (& fail_info -> fail_modules , failure .module );
344+ dstr_cat (& fail_info -> fail_modules , ";" );
345+ da_push_back (fail_info -> failures , & failure );
346+ }
347+
300348static bool is_safe_module (const char * name )
301349{
302350 if (!obs -> safe_modules .num )
@@ -356,18 +404,16 @@ static void load_all_callback(void *param, const struct obs_module_info2 *info)
356404 return ;
357405 }
358406
359- if (!obs_init_module (module ))
407+ if (!obs_init_module (module )) {
408+ add_module_failure (fail_info , info -> name , module -> load_error_code , module -> load_error_message );
360409 free_module (module );
410+ }
361411
362412 UNUSED_PARAMETER (param );
363413 return ;
364414
365415load_failure :
366- if (fail_info ) {
367- dstr_cat (& fail_info -> fail_modules , info -> name );
368- dstr_cat (& fail_info -> fail_modules , ";" );
369- fail_info -> fail_count ++ ;
370- }
416+ add_module_failure (fail_info , info -> name , NULL , NULL );
371417}
372418
373419static const char * obs_load_all_modules_name = "obs_load_all_modules" ;
@@ -403,7 +449,8 @@ void obs_load_all_modules2(struct obs_module_failure_info *mfi)
403449#endif
404450 profile_end (obs_load_all_modules2_name );
405451
406- mfi -> count = fail_info .fail_count ;
452+ mfi -> count = fail_info .failures .num ;
453+ mfi -> failures = fail_info .failures .array ;
407454 mfi -> failed_modules = strlist_split (fail_info .fail_modules .array , ';' , false);
408455 dstr_free (& fail_info .fail_modules );
409456}
@@ -414,6 +461,19 @@ void obs_module_failure_info_free(struct obs_module_failure_info *mfi)
414461 bfree (mfi -> failed_modules );
415462 mfi -> failed_modules = NULL ;
416463 }
464+
465+ if (mfi -> failures ) {
466+ for (size_t i = 0 ; i < mfi -> count ; i ++ ) {
467+ bfree (mfi -> failures [i ].module );
468+ bfree (mfi -> failures [i ].code );
469+ bfree (mfi -> failures [i ].message );
470+ }
471+
472+ bfree (mfi -> failures );
473+ mfi -> failures = NULL ;
474+ }
475+
476+ mfi -> count = 0 ;
417477}
418478
419479void obs_post_load_modules (void )
@@ -621,6 +681,8 @@ void free_module(struct obs_module *mod)
621681 bfree (mod -> mod_name );
622682 bfree (mod -> bin_path );
623683 bfree (mod -> data_path );
684+ bfree (mod -> load_error_code );
685+ bfree (mod -> load_error_message );
624686 bfree (mod );
625687}
626688
0 commit comments