This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Neels Hofmeyr gerrit-no-reply at lists.osmocom.org
Review at https://gerrit.osmocom.org/7629
add osmo_fsm_inst_update_id_f()
In the osmo-msc, I would like to set the subscr conn FSM identifier by a string
format, to include the type of Complete Layer 3 that is taking place. I could
each time talloc a string and free it again. This API is more convenient.
>From osmo_fsm_inst_update_id(), call osmo_fsm_inst_update_id_f() with "%s" (or
pass NULL).
Put the name updating into separate static update_name() function to clarify.
Change-Id: I76743a7642f2449fd33350691ac8ebbf4400371d
---
M include/osmocom/core/fsm.h
M src/fsm.c
2 files changed, 52 insertions(+), 27 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/29/7629/1
diff --git a/include/osmocom/core/fsm.h b/include/osmocom/core/fsm.h
index 2c2a996..174396a 100644
--- a/include/osmocom/core/fsm.h
+++ b/include/osmocom/core/fsm.h
@@ -159,6 +159,7 @@
void osmo_fsm_inst_free(struct osmo_fsm_inst *fi);
int osmo_fsm_inst_update_id(struct osmo_fsm_inst *fi, const char *id);
+int osmo_fsm_inst_update_id_f(struct osmo_fsm_inst *fi, const char *fmt, ...);
const char *osmo_fsm_event_name(struct osmo_fsm *fsm, uint32_t event);
const char *osmo_fsm_inst_name(struct osmo_fsm_inst *fi);
diff --git a/src/fsm.c b/src/fsm.c
index 56bb3d0..4b0a3a8 100644
--- a/src/fsm.c
+++ b/src/fsm.c
@@ -206,40 +206,64 @@
*/
int osmo_fsm_inst_update_id(struct osmo_fsm_inst *fi, const char *id)
{
- if (id && !*id)
- id = NULL;
+ if (!id || !*id)
+ return osmo_fsm_inst_update_id_f(fi, NULL);
+ else
+ return osmo_fsm_inst_update_id_f(fi, "%s", id);
+}
- if (id) {
- if (!osmo_identifier_valid(id)) {
- LOGP(DLGLOBAL, LOGL_ERROR, "Attempting to allocate FSM instance of type '%s'"
- " with illegal identifier '%s'\n", fi->fsm->name, id);
+static void update_name(struct osmo_fsm_inst *fi)
+{
+ if (fi->name)
+ talloc_free((char*)fi->name);
+
+ if (!fsm_log_addr) {
+ if (fi->id)
+ fi->name = talloc_asprintf(fi, "%s(%s)", fi->fsm->name, fi->id);
+ else
+ fi->name = talloc_asprintf(fi, "%s", fi->fsm->name);
+ } else {
+ if (fi->id)
+ fi->name = talloc_asprintf(fi, "%s(%s)[%p]", fi->fsm->name, fi->id, fi);
+ else
+ fi->name = talloc_asprintf(fi, "%s[%p]", fi->fsm->name, fi);
+ }
+}
+
+/*! Change id of the FSM instance using a string format.
+ * \param[in] fi FSM instance.
+ * \param[in] fmt format string to compose new ID.
+ * \param[in] ... variable argument list for format string.
+ * \returns 0 if the ID was updated, otherwise -EINVAL.
+ */
+int osmo_fsm_inst_update_id_f(struct osmo_fsm_inst *fi, const char *fmt, ...)
+{
+ char *id = NULL;
+
+ if (fmt) {
+ va_list ap;
+
+ va_start(ap, fmt);
+ id = talloc_vasprintf(fi, fmt, ap);
+ va_end(ap);
+
+ if (!*id) {
+ talloc_free(id);
+ id = NULL;
+ } else if (!osmo_identifier_valid(id)) {
+ LOGP(DLGLOBAL, LOGL_ERROR,
+ "Attempting to set illegal id for FSM instance of type '%s': '%s'\n",
+ fi->fsm->name, id);
+ talloc_free(id);
return -EINVAL;
}
- osmo_talloc_replace_string(fi, (char **)&fi->id, id);
-
- if (fi->name)
- talloc_free((void*)fi->name);
-
- if (!fsm_log_addr) {
- fi->name = talloc_asprintf(fi, "%s(%s)", fi->fsm->name, id);
- } else {
- fi->name = talloc_asprintf(fi, "%s(%s)[%p]", fi->fsm->name, id, fi);
- }
-
- return 0;
}
if (fi->id)
- talloc_free((void*)fi->id);
- fi->id = NULL;
- if (fi->name)
- talloc_free((void*)fi->name);
+ talloc_free((char*)fi->id);
+ fi->id = id;
- if (!fsm_log_addr) {
- fi->name = talloc_asprintf(fi, "%s", fi->fsm->name);
- } else {
- fi->name = talloc_asprintf(fi, "%s[%p]", fi->fsm->name, fi);
- }
+ update_name(fi);
return 0;
}
--
To view, visit https://gerrit.osmocom.org/7629
To unsubscribe, visit https://gerrit.osmocom.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I76743a7642f2449fd33350691ac8ebbf4400371d
Gerrit-PatchSet: 1
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: Neels Hofmeyr <nhofmeyr at sysmocom.de>