static int handle_pool4_display(struct pool4 *pool, struct genl_info *info, union request_pool4 *request) { struct nlcore_buffer buffer; struct pool4_sample *offset = NULL; int error = 0; log_debug("Sending pool4 to userspace."); error = nlbuffer_init_response(&buffer, info, nlbuffer_response_max_size()); if (error) return nlcore_respond(info, error); if (request->display.offset_set) offset = &request->display.offset; error = pool4db_foreach_sample(pool, request->display.proto, pool4_to_usr, &buffer, offset); nlbuffer_set_pending_data(&buffer, error > 0); error = (error >= 0) ? nlbuffer_send(info, &buffer) : nlcore_respond(info, error); nlbuffer_clean(&buffer); return error; }
static int handle_eamt_display(struct eam_table *eamt, struct genl_info *info, union request_eamt *request) { struct nlcore_buffer buffer; struct ipv4_prefix *prefix4; int error; log_debug("Sending EAMT to userspace."); error = nlbuffer_init_response(&buffer, info, nlbuffer_response_max_size()); if (error) nlcore_respond(info, error); prefix4 = request->display.prefix4_set ? &request->display.prefix4 : NULL; error = eamt_foreach(eamt, eam_entry_to_userspace, &buffer, prefix4); nlbuffer_set_pending_data(&buffer, error > 0); error = (error >= 0) ? nlbuffer_send(info, &buffer) : nlcore_respond(info, error); nlbuffer_clean(&buffer); return error; }
static int handle_session_display(struct bib *db, struct genl_info *info, struct request_session *request) { struct nlcore_buffer buffer; struct session_foreach_func func = { .cb = session_entry_to_userspace, .arg = &buffer, }; struct session_foreach_offset offset_struct; struct session_foreach_offset *offset = NULL; int error; if (verify_superpriv()) return nlcore_respond(info, -EPERM); log_debug("Sending session table to userspace."); error = nlbuffer_init_response(&buffer, info, nlbuffer_response_max_size()); if (error) return nlcore_respond(info, error); if (request->display.offset_set) { offset_struct.offset = request->display.offset; offset_struct.include_offset = false; offset = &offset_struct; } error = bib_foreach_session(db, request->l4_proto, &func, offset); nlbuffer_set_pending_data(&buffer, error > 0); error = (error >= 0) ? nlbuffer_send(info, &buffer) : nlcore_respond(info, error); nlbuffer_free(&buffer); return error; }