X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=send_common.c;h=6a85644d734d6c2f7fd748edf688c6cc21b18651;hp=dea96081d43a51209a0d667cbf8f73a9ff11e08d;hb=28ea59db9b3cd2bd9d6be0f304d951aa550ea4d6;hpb=fd652c08d4b5b26032646c449e1979c48018b70a diff --git a/send_common.c b/send_common.c index dea96081..6a85644d 100644 --- a/send_common.c +++ b/send_common.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -261,6 +261,7 @@ void generic_com_off(struct sender_status *ss) * Accept a connection on the socket this server is listening on. * * \param ss The sender whose listening fd is ready for reading. + * \param rfds Passed to para_accept(), * * This must be called only if the socket fd of \a ss is ready for reading. It * calls para_accept() to accept the connection and performs the following @@ -309,7 +310,7 @@ struct sender_client *accept_sender_client(struct sender_status *ss, fd_set *rfd ss->num_clients++; sc = para_calloc(sizeof(*sc)); sc->fd = fd; - sc->name = make_message("%s", remote_name(fd)); + sc->name = para_strdup(remote_name(fd)); sc->cq = cq_new(MAX_CQ_BYTES); para_list_add(&sc->node, &ss->client_list); add_close_on_fork_list(fd); @@ -341,47 +342,51 @@ char *generic_sender_help(void) 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, ':'); + char *a = para_strdup(arg), + *b = strchr(a, ':'), + *c = strrchr(a, ':'); int ret = -E_COMMAND_SYNTAX; - /* parse max slice bytes */ - if (!e) + if (!b || !c) 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); + *b = *c = '\0'; + + ret = para_atoi32(a, &val); if (ret < 0) goto out; - ret = -ERRNO_TO_PARA_ERROR(EINVAL); + + /* optional max_slice_bytes (0 means "use MTU") */ + if (b == c) { + scd->max_slice_bytes = 0; + } else { + if (val < 0 || val > 65535) + goto fec_einval; + scd->max_slice_bytes = val; + + ret = para_atoi32(b + 1, &val); + if (ret < 0) + goto out; + } + + /* k = data_slices_per_group */ if (val < 0 || val > 255) - goto out; + goto fec_einval; scd->data_slices_per_group = val; - /* parse slices_per_group */ - b = e + 1; - ret = para_atoi32(b, &val); + + /* n = slices_per_group */ + ret = para_atoi32(c + 1, &val); if (ret < 0) goto out; - ret = -ERRNO_TO_PARA_ERROR(EINVAL); if (val < 0 || val < scd->data_slices_per_group) - goto out; + goto fec_einval; scd->slices_per_group = val; ret = 0; out: free(a); return ret; +fec_einval: + ret = -ERRNO_TO_PARA_ERROR(EINVAL); + goto out; } /** @@ -401,26 +406,22 @@ out: */ 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, '/'); + int ret = 0; + + /* default fec parameters */ + scd->max_slice_bytes = 0; + scd->data_slices_per_group = 14; + scd->slices_per_group = 16; 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; + if (ret < 0) + goto out; } - /* use default fec parameters. */ - scd->max_slice_bytes = 0; - scd->slices_per_group = 16; - scd->data_slices_per_group = 14; - ret = 0; + if (!parse_url(a, scd->host, sizeof(scd->host), &scd->port)) + ret = -ERRNO_TO_PARA_ERROR(EINVAL); out: free(a); return ret;