<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/9978">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ctrl: Introduce ctrl_cmd_parse3 API<br><br>Callers require to know whether the returned ERROR cmd was received or<br>generated locally, in order to send it or do something with it locally.<br><br>Related: OS#3394<br><br>Change-Id: Ide9170e5c31967c353f8fe4e8227e64130b91eae<br>---<br>M include/osmocom/ctrl/control_cmd.h<br>M src/ctrl/control_cmd.c<br>M src/ctrl/libosmoctrl.map<br>3 files changed, 22 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/ctrl/control_cmd.h b/include/osmocom/ctrl/control_cmd.h</span><br><span>index 08376f3..93055c7 100644</span><br><span>--- a/include/osmocom/ctrl/control_cmd.h</span><br><span>+++ b/include/osmocom/ctrl/control_cmd.h</span><br><span>@@ -124,6 +124,7 @@</span><br><span> int ctrl_cmd_install(enum ctrl_node_type node, struct ctrl_cmd_element *cmd);</span><br><span> int ctrl_cmd_send(struct osmo_wqueue *queue, struct ctrl_cmd *cmd);</span><br><span> int ctrl_cmd_send_to_all(struct ctrl_handle *ctrl, struct ctrl_cmd *cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+struct ctrl_cmd *ctrl_cmd_parse3(void *ctx, struct msgb *msg, bool *parse_failed);</span><br><span> struct ctrl_cmd *ctrl_cmd_parse2(void *ctx, struct msgb *msg);</span><br><span> struct ctrl_cmd *ctrl_cmd_parse(void *ctx, struct msgb *msg);</span><br><span> struct msgb *ctrl_cmd_make(struct ctrl_cmd *cmd);</span><br><span>diff --git a/src/ctrl/control_cmd.c b/src/ctrl/control_cmd.c</span><br><span>index 14ff906..33496bd 100644</span><br><span>--- a/src/ctrl/control_cmd.c</span><br><span>+++ b/src/ctrl/control_cmd.c</span><br><span>@@ -316,9 +316,25 @@</span><br><span>  *  \param[in] msg message buffer containing command to be decoded</span><br><span>  *  \returns callee-allocated decoded CTRL command; NULL on allocation failure,</span><br><span>  *  ctrl->type == CTRL_TYPE_ERROR and an error message in ctrl->reply on any error.</span><br><span style="color: hsl(0, 100%, 40%);">- * The caller is responsible to talloc_free() the returned struct pointer. */</span><br><span style="color: hsl(120, 100%, 40%);">+ * The caller is responsible to talloc_free() the returned struct pointer.</span><br><span style="color: hsl(120, 100%, 40%);">+ * If information of the origin of the ERROR cmd returned is required (received</span><br><span style="color: hsl(120, 100%, 40%);">+ * or local parsing failure), use \ref ctrl_cmd_parse3 instead. */</span><br><span> struct ctrl_cmd *ctrl_cmd_parse2(void *ctx, struct msgb *msg)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+      bool unused;</span><br><span style="color: hsl(120, 100%, 40%);">+  return ctrl_cmd_parse3(ctx, msg, &unused);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Parse/Decode CTRL from \ref msgb into command struct.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] ctx talloc context from which to allocate</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg message buffer containing command to be decoded</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[out] parse_failed Whether returned ERROR cmd was generatd locally</span><br><span style="color: hsl(120, 100%, 40%);">+ *                  (due to parse failure) or was received.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns callee-allocated decoded CTRL command; NULL on allocation failure,</span><br><span style="color: hsl(120, 100%, 40%);">+ *  ctrl->type == CTRL_TYPE_ERROR and an error message in ctrl->reply on any error.</span><br><span style="color: hsl(120, 100%, 40%);">+ * The caller is responsible to talloc_free() the returned struct pointer. */</span><br><span style="color: hsl(120, 100%, 40%);">+struct ctrl_cmd *ctrl_cmd_parse3(void *ctx, struct msgb *msg, bool *parse_failed)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span>     char *str, *tmp, *saveptr = NULL;</span><br><span>    char *var, *val;</span><br><span>     struct ctrl_cmd *cmd;</span><br><span>@@ -326,6 +342,7 @@</span><br><span>  cmd = talloc_zero(ctx, struct ctrl_cmd);</span><br><span>     if (!cmd) {</span><br><span>          LOGP(DLCTRL, LOGL_ERROR, "Failed to allocate.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          *parse_failed = true;</span><br><span>                return NULL;</span><br><span>         }</span><br><span> </span><br><span>@@ -483,12 +500,14 @@</span><br><span>                        goto err;</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ *parse_failed = false;</span><br><span>       return cmd;</span><br><span> oom:</span><br><span>  cmd->type = CTRL_TYPE_ERROR;</span><br><span>      cmd->id = "err";</span><br><span>        cmd->reply = "OOM";</span><br><span> err:</span><br><span style="color: hsl(120, 100%, 40%);">+      *parse_failed = true;</span><br><span>        return cmd;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/ctrl/libosmoctrl.map b/src/ctrl/libosmoctrl.map</span><br><span>index 5b888a2..f995467 100644</span><br><span>--- a/src/ctrl/libosmoctrl.map</span><br><span>+++ b/src/ctrl/libosmoctrl.map</span><br><span>@@ -13,6 +13,7 @@</span><br><span> ctrl_cmd_make;</span><br><span> ctrl_cmd_parse;</span><br><span> ctrl_cmd_parse2;</span><br><span style="color: hsl(120, 100%, 40%);">+ctrl_cmd_parse3;</span><br><span> ctrl_cmd_send;</span><br><span> ctrl_cmd_send_to_all;</span><br><span> ctrl_cmd_send_trap;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9978">change 9978</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/9978"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Ide9170e5c31967c353f8fe4e8227e64130b91eae </div>
<div style="display:none"> Gerrit-Change-Number: 9978 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>