aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Maier <pmaier@sysmocom.de>2016-12-09 14:07:18 +0100
committerPhilipp Maier <pmaier@sysmocom.de>2017-02-07 13:39:00 +0100
commitb288853ffa01fbce1f5831ae6d387520c8882aec (patch)
treea37468ea47c91bb98f8f56385f68e45e7ecc628b
parent7132011afa1741f8cc435250a6981a4f6919f396 (diff)
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
-rw-r--r--include/osmocom/core/select.h2
-rw-r--r--src/select.c30
2 files changed, 26 insertions, 6 deletions
diff --git a/include/osmocom/core/select.h b/include/osmocom/core/select.h
index 2753637a..c2b51a45 100644
--- a/include/osmocom/core/select.h
+++ b/include/osmocom/core/select.h
@@ -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);
diff --git a/src/select.c b/src/select.c
index da273680..ab0734ea 100644
--- a/src/select.c
+++ b/src/select.c
@@ -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);
}