X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=afh_recv.c;h=b76c405a47c686ad5eec5d0e4c569101ff83738a;hp=28d8f3980f814763cfe249e5762203ff5038a9a5;hb=fc8dfbb416ff07cca08fbf4e13efcaa25e17cc54;hpb=4d5282b4e53213c89359e4c60568c37119ab34fb diff --git a/afh_recv.c b/afh_recv.c index 28d8f398..b76c405a 100644 --- a/afh_recv.c +++ b/afh_recv.c @@ -8,15 +8,15 @@ #include #include +#include +#include "recv_cmd.lsg.h" #include "para.h" #include "error.h" #include "list.h" #include "sched.h" -#include "ggo.h" #include "buffer_tree.h" #include "recv.h" -#include "afh_recv.cmdline.h" #include "string.h" #include "fd.h" #include "afh.h" @@ -65,40 +65,25 @@ static int afh_execute(struct btr_node *btrn, const char *cmd, char **result) return -E_BTR_NAVAIL; } -static void *afh_recv_parse_config(int argc, char **argv) -{ - struct afh_recv_args_info *tmp = para_calloc(sizeof(*tmp)); - - afh_recv_cmdline_parser(argc, argv, tmp); - return tmp; -} - -static void afh_recv_free_config(void *conf) -{ - if (!conf) - return; - afh_recv_cmdline_parser_free(conf); - free(conf); -} - static int afh_recv_open(struct receiver_node *rn) { - struct afh_recv_args_info *conf = rn->conf; + struct lls_parse_result *lpr = rn->lpr; struct private_afh_recv_data *pard; struct afh_info *afhi; - char *filename = conf->filename_arg; - + const char *fn = RECV_CMD_OPT_STRING_VAL(AFH, FILENAME, lpr); + int32_t bc = RECV_CMD_OPT_INT32_VAL(AFH, BEGIN_CHUNK, lpr); + const struct lls_opt_result *r_e = RECV_CMD_OPT_RESULT(AFH, END_CHUNK, lpr); int ret; - if (!filename || *filename == '\0') + if (!fn || *fn == '\0') return -E_AFH_RECV_BAD_FILENAME; rn->private_data = pard = para_calloc(sizeof(*pard)); afhi = &pard->afhi; - ret = mmap_full_file(filename, O_RDONLY, &pard->map, + ret = mmap_full_file(fn, O_RDONLY, &pard->map, &pard->map_size, &pard->fd); if (ret < 0) goto out; - ret = compute_afhi(filename, pard->map, pard->map_size, + ret = compute_afhi(fn, pard->map, pard->map_size, pard->fd, afhi); if (ret < 0) goto out_unmap; @@ -106,23 +91,22 @@ static int afh_recv_open(struct receiver_node *rn) ret = -ERRNO_TO_PARA_ERROR(EINVAL); if (afhi->chunks_total == 0) goto out_clear_afhi; - if (PARA_ABS(conf->begin_chunk_arg) >= afhi->chunks_total) + if (PARA_ABS(bc) >= afhi->chunks_total) goto out_clear_afhi; - if (conf->begin_chunk_arg >= 0) - pard->first_chunk = afh_get_start_chunk( - conf->begin_chunk_arg, &pard->afhi); + if (bc >= 0) + pard->first_chunk = afh_get_start_chunk(bc, &pard->afhi); else - pard->first_chunk = afh_get_start_chunk( - afhi->chunks_total + conf->begin_chunk_arg, + pard->first_chunk = afh_get_start_chunk(afhi->chunks_total + bc, &pard->afhi); - if (conf->end_chunk_given) { + if (lls_opt_given(r_e)) { + int32_t ec = lls_int32_val(0, r_e); ret = -ERRNO_TO_PARA_ERROR(EINVAL); - if (PARA_ABS(conf->end_chunk_arg) > afhi->chunks_total) + if (PARA_ABS(ec) > afhi->chunks_total) goto out_clear_afhi; - if (conf->end_chunk_arg >= 0) - pard->last_chunk = conf->end_chunk_arg; + if (ec >= 0) + pard->last_chunk = ec; else - pard->last_chunk = afhi->chunks_total + conf->end_chunk_arg; + pard->last_chunk = afhi->chunks_total + ec; } else pard->last_chunk = afhi->chunks_total - 1; ret = -ERRNO_TO_PARA_ERROR(EINVAL); @@ -158,13 +142,14 @@ static void afh_recv_pre_select(struct sched *s, void *context) struct receiver_node *rn = context; struct private_afh_recv_data *pard = rn->private_data; struct afh_info *afhi = &pard->afhi; - struct afh_recv_args_info *conf = rn->conf; + struct lls_parse_result *lpr = rn->lpr; struct timeval chunk_time; int state = generic_recv_pre_select(s, rn); + unsigned j_given = RECV_CMD_OPT_GIVEN(AFH, JUST_IN_TIME, lpr); if (state <= 0) return; - if (!conf->just_in_time_given) { + if (!j_given) { sched_min_delay(s); return; } @@ -176,7 +161,7 @@ static void afh_recv_pre_select(struct sched *s, void *context) static int afh_recv_post_select(__a_unused struct sched *s, void *context) { struct receiver_node *rn = context; - struct afh_recv_args_info *conf = rn->conf; + struct lls_parse_result *lpr = rn->lpr; struct private_afh_recv_data *pard = rn->private_data; struct btr_node *btrn = rn->btrn; struct afh_info *afhi = &pard->afhi; @@ -185,11 +170,13 @@ static int afh_recv_post_select(__a_unused struct sched *s, void *context) const char *start, *end; size_t size; struct timeval chunk_time; + unsigned j_given = RECV_CMD_OPT_GIVEN(AFH, JUST_IN_TIME, lpr); + unsigned H_given = RECV_CMD_OPT_GIVEN(AFH, NO_HEADER, lpr); ret = btr_node_status(btrn, 0, BTR_NT_ROOT); if (ret <= 0) goto out; - if (pard->first_chunk > 0 && !conf->no_header_given) { + if (pard->first_chunk > 0 && !H_given) { char *header; afh_get_header(afhi, pard->audio_format_num, pard->map, pard->map_size, &header, &size); @@ -201,7 +188,7 @@ static int afh_recv_post_select(__a_unused struct sched *s, void *context) afh_free_header(header, pard->audio_format_num); } } - if (!conf->just_in_time_given) { + if (!j_given) { afh_get_chunk(pard->first_chunk, afhi, pard->map, &start, &size); afh_get_chunk(pard->last_chunk, afhi, pard->map, &end, &size); end += size; @@ -236,26 +223,11 @@ out: return ret; } -/** - * The init function of the afh receiver. - * - * \param r Pointer to the receiver struct to initialize. - * - * This initializes all function pointers of \a r. - */ -void afh_recv_init(struct receiver *r) -{ - struct afh_recv_args_info dummy; - - afh_init(); - afh_recv_cmdline_parser_init(&dummy); - r->open = afh_recv_open; - r->close = afh_recv_close; - r->pre_select = afh_recv_pre_select; - r->post_select = afh_recv_post_select; - r->parse_config = afh_recv_parse_config; - r->free_config = afh_recv_free_config; - r->execute = afh_execute; - r->help = (struct ggo_help)DEFINE_GGO_HELP(afh_recv); - afh_recv_cmdline_parser_free(&dummy); -} +const struct receiver lsg_recv_cmd_com_afh_user_data = { + .init = afh_init, + .open = afh_recv_open, + .close = afh_recv_close, + .pre_select = afh_recv_pre_select, + .post_select = afh_recv_post_select, + .execute = afh_execute, +};