diff options
| author | Neels Hofmeyr <neels@hofmeyr.de> | 2018-03-31 16:34:49 +0200 | 
|---|---|---|
| committer | Neels Hofmeyr <neels@hofmeyr.de> | 2018-04-09 17:57:15 +0200 | 
| commit | a64c45a03e3b318b5fdc93c960670d89a5745271 (patch) | |
| tree | 2b89c218d75ccfa85c5faed719f1373f7bff9223 /src | |
| parent | 6e8c0884729eedbf4fc66414b67300d505ac17bb (diff) | |
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.
Adjust the error message for erratic ID: don't say "allocate", it might be from
an update. Adjust test expectation.
Change-Id: I76743a7642f2449fd33350691ac8ebbf4400371d
Diffstat (limited to 'src')
| -rw-r--r-- | src/fsm.c | 67 | 
1 files changed, 45 insertions, 22 deletions
| @@ -211,38 +211,61 @@ static void fsm_tmr_cb(void *data)   */  int osmo_fsm_inst_update_id(struct osmo_fsm_inst *fi, const char *id)  { -	if (id) { +	if (!id) +		return osmo_fsm_inst_update_id_f(fi, NULL); +	else +		return osmo_fsm_inst_update_id_f(fi, "%s", 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 (!osmo_identifier_valid(id)) {  			LOGP(DLGLOBAL, LOGL_ERROR,  			     "Attempting to set illegal id for FSM instance of type '%s': %s\n",  			     fi->fsm->name, osmo_quote_str(id, -1)); +			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;  } | 
