summaryrefslogtreecommitdiff
path: root/axfer/subcmd-transfer.c
diff options
context:
space:
mode:
Diffstat (limited to 'axfer/subcmd-transfer.c')
-rw-r--r--axfer/subcmd-transfer.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/axfer/subcmd-transfer.c b/axfer/subcmd-transfer.c
index 52c32d5..27d2cc5 100644
--- a/axfer/subcmd-transfer.c
+++ b/axfer/subcmd-transfer.c
@@ -19,6 +19,8 @@ struct context {
struct container_context *cntrs;
unsigned int cntr_count;
+ int *cntr_fds;
+
// NOTE: To handling Unix signal.
bool interrupted;
int signal;
@@ -153,6 +155,10 @@ static int allocate_containers(struct context *ctx, unsigned int count)
return -ENOMEM;
ctx->cntr_count = count;
+ ctx->cntr_fds = calloc(count, sizeof(*ctx->cntrs));
+ if (ctx->cntr_fds == NULL)
+ return -ENOMEM;
+
return 0;
}
@@ -196,8 +202,9 @@ static int capture_pre_process(struct context *ctx, snd_pcm_access_t *access,
if (fd < 0)
return -errno;
}
+ ctx->cntr_fds[i] = fd;
- err = container_builder_init(ctx->cntrs + i, fd,
+ err = container_builder_init(ctx->cntrs + i, ctx->cntr_fds[i],
ctx->xfer.cntr_format,
ctx->xfer.verbose > 1);
if (err < 0)
@@ -249,8 +256,9 @@ static int playback_pre_process(struct context *ctx, snd_pcm_access_t *access,
if (fd < 0)
return -errno;
}
+ ctx->cntr_fds[i] = fd;
- err = container_parser_init(ctx->cntrs + i, fd,
+ err = container_parser_init(ctx->cntrs + i, ctx->cntr_fds[i],
ctx->xfer.verbose > 1);
if (err < 0)
return err;
@@ -447,6 +455,12 @@ static void context_post_process(struct context *ctx,
free(ctx->cntrs);
}
+ if (ctx->cntr_fds) {
+ for (i = 0; i < ctx->cntr_count; ++i)
+ close(ctx->cntr_fds[i]);
+ free(ctx->cntr_fds);
+ }
+
mapper_context_post_process(&ctx->mapper);
mapper_context_destroy(&ctx->mapper);
}