select: add functionality to check socket state

osmo_fd_register() is used to register socket file descriptors,
after registering a socket, there is no way to test if the socket
is still registered or actually registered at all.

This commit adds a new function osmo_fd_register_check() that can
be used to check in advance, if the socket fd is registered,
before performing further operations.

Change-Id: I48ec7098d6bba586c81bf0d5c9088108e2c081c6
This commit is contained in:
Philipp Maier 2016-12-09 14:07:18 +01:00
parent 7132011afa
commit b288853ffa
2 changed files with 26 additions and 6 deletions

View File

@ -1,6 +1,7 @@
#pragma once
#include <osmocom/core/linuxlist.h>
#include <stdbool.h>
/*! \defgroup select Select loop abstraction
* @{
@ -35,6 +36,7 @@ struct osmo_fd {
unsigned int priv_nr;
};
bool osmo_fd_is_registered(struct osmo_fd *fd);
int osmo_fd_register(struct osmo_fd *fd);
void osmo_fd_unregister(struct osmo_fd *fd);
int osmo_select_main(int polling);

View File

@ -23,6 +23,7 @@
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <sys/select.h>
#include <osmocom/core/select.h>
@ -45,6 +46,23 @@ static int maxfd = 0;
static LLIST_HEAD(osmo_fds);
static int unregistered_count;
/*! \brief Check if a file descriptor is already registered
* \param[in] fd osmocom file descriptor to be checked
* \returns true if registered; otherwise false
*/
bool osmo_fd_is_registered(struct osmo_fd *fd)
{
struct osmo_fd *entry;
llist_for_each_entry(entry, &osmo_fds, list) {
if (entry == fd) {
return true;
}
}
return false;
}
/*! \brief Register a new file descriptor with select loop abstraction
* \param[in] fd osmocom file descriptor to be registered
* \returns 0 on success; negative in case of error
@ -76,12 +94,9 @@ int osmo_fd_register(struct osmo_fd *fd)
maxfd = fd->fd;
#ifdef BSC_FD_CHECK
struct osmo_fd *entry;
llist_for_each_entry(entry, &osmo_fds, list) {
if (entry == fd) {
fprintf(stderr, "Adding a osmo_fd that is already in the list.\n");
return 0;
}
if (osmo_fd_is_registered(fd)) {
fprintf(stderr, "Adding a osmo_fd that is already in the list.\n");
return 0;
}
#endif
@ -95,6 +110,9 @@ int osmo_fd_register(struct osmo_fd *fd)
*/
void osmo_fd_unregister(struct osmo_fd *fd)
{
/* Note: when fd is inside the osmo_fds list (not registered before)
* this function will crash! If in doubt, check file descriptor with
* osmo_fd_is_registered() */
unregistered_count++;
llist_del(&fd->list);
}