+ int i;
+
+ tall_log_ctx = talloc_named_const(ctx, 1, "logging");
+ if (!tall_log_ctx)
+ return -ENOMEM;
+
+ osmo_log_info = talloc_zero(tall_log_ctx, struct log_info);
+ if (!osmo_log_info)
+ return -ENOMEM;
+
+ osmo_log_info->num_cat_user = inf->num_cat;
+ /* total number = number of user cat + library cat */
+ osmo_log_info->num_cat = inf->num_cat + ARRAY_SIZE(internal_cat);
+
+ osmo_log_info->cat = talloc_zero_array(osmo_log_info,
+ struct log_info_cat,
+ osmo_log_info->num_cat);
+ if (!osmo_log_info->cat) {
+ talloc_free(osmo_log_info);
+ osmo_log_info = NULL;
+ return -ENOMEM;
+ }
+
+ /* copy over the user part */
+ for (i = 0; i < inf->num_cat; i++) {
+ memcpy(&osmo_log_info->cat[i], &inf->cat[i],
+ sizeof(struct log_info_cat));
+ }
+
+ /* copy over the library part */
+ for (i = 0; i < ARRAY_SIZE(internal_cat); i++) {
+ unsigned int cn = osmo_log_info->num_cat_user + i;
+ memcpy(&osmo_log_info->cat[cn],
+ &internal_cat[i], sizeof(struct log_info_cat));
+ }
+
+ return 0;