+
+static int parse_fec_parms(const char *arg, struct sender_command_data *scd)
+{
+ int32_t val;
+ char *a = para_strdup(arg), *b = a, *e = strchr(b, ':');
+ int ret = -E_COMMAND_SYNTAX;
+
+ /* parse max slice bytes */
+ if (!e)
+ goto out;
+ *e = '\0';
+ ret = para_atoi32(b, &val);
+ if (ret < 0)
+ goto out;
+ ret = -ERRNO_TO_PARA_ERROR(EINVAL);
+ if (val < 0 || val > 65535)
+ goto out;
+ scd->max_slice_bytes = val;
+ /* parse data_slices_per_group */
+ b = e + 1;
+ e = strchr(b, ':');
+ ret = -E_COMMAND_SYNTAX;
+ if (!e)
+ goto out;
+ *e = '\0';
+ ret = para_atoi32(b, &val);
+ if (ret < 0)
+ goto out;
+ ret = -ERRNO_TO_PARA_ERROR(EINVAL);
+ if (val < 0 || val > 255)
+ goto out;
+ scd->data_slices_per_group = val;
+ /* parse slices_per_group */
+ b = e + 1;
+ ret = para_atoi32(b, &val);
+ if (ret < 0)
+ goto out;
+ ret = -ERRNO_TO_PARA_ERROR(EINVAL);
+ if (val < 0 || val < scd->data_slices_per_group)
+ goto out;
+ scd->slices_per_group = val;
+ ret = 0;
+out:
+ free(a);
+ return ret;
+}
+
+/**
+ * Parse a FEC URL string.
+ *
+ * \param arg the URL string to parse.
+ * \param scd The structure containing host, port and the FEC parameters.
+ *
+ * \return Standard.
+ *
+ * A FEC URL consists of an ordinary URL string according to RFC 3986,
+ * optionally followed by a slash and the three FEC parameters slice_size,
+ * data_slices_per_group and slices_per_group. The three FEC parameters are
+ * separated by colons.
+ *
+ * \sa \ref parse_url().
+ */
+int parse_fec_url(const char *arg, struct sender_command_data *scd)
+{
+ int ret;
+ ssize_t len = sizeof(scd->host);
+ char *a = para_strdup(arg), *p = strchr(a, '/');
+
+ if (p) {
+ *p = '\0';
+ len = strlen(a);
+ }
+ ret = -ERRNO_TO_PARA_ERROR(EINVAL);
+ if (!parse_url(a, scd->host, len, &scd->port))
+ goto out;
+ if (p) {
+ ret = parse_fec_parms(p + 1, scd);
+ goto out;
+ }
+ /* use default fec parameters. */
+ scd->max_slice_bytes = 1490;
+ scd->slices_per_group = 16;
+ scd->data_slices_per_group = 14;
+ ret = 0;
+out:
+ free(a);
+ return ret;
+}