From 444b524c3a26d8dd83fae2a074d3d13b10ba17f7 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 5 Jan 2004 22:26:34 +0000 Subject: forgot some files preliminary client implementation git-svn-id: file:///home/lennart/svn/public/ivam2/trunk@15 dbf6933d-3bce-0310-9bcc-ed052ba35b35 --- src/dtmffifo.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/dtmffifo.c (limited to 'src/dtmffifo.c') diff --git a/src/dtmffifo.c b/src/dtmffifo.c new file mode 100644 index 0000000..54a1f62 --- /dev/null +++ b/src/dtmffifo.c @@ -0,0 +1,82 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "dtmffifo.h" + +struct dtmf_fifo* dtmf_fifo_new(void) { + struct dtmf_fifo *d = NULL; + char p[PATH_MAX]; + + d = malloc(sizeof(struct dtmf_fifo)); + assert(d); + memset(d, 0, sizeof(struct dtmf_fifo)); + d->fd = -1; + + d->dir = strdup("/tmp/ivamd.XXXXXX"); + assert(d->dir); + + if (!mkdtemp(d->dir)) { + daemon_log(LOG_ERR, "Failed to create temporary directory '%s': %s", d->dir, strerror(errno)); + goto fail; + } + + snprintf(p, sizeof(p), "%s/%s", d->dir, "dtmf"); + d->fname = strdup(p); + assert(d->fname); + + if (mkfifo(d->fname, 0700) != 0) { + daemon_log(LOG_ERR, "Failed to create FIFO '%s': %s", d->fname, strerror(errno)); + goto fail; + } + + if ((d->fd = open(d->fname, O_RDWR|O_NDELAY)) < 0) { + daemon_log(LOG_ERR, "Failed to open FIFO '%s': %s", d->fname, strerror(errno)); + goto fail; + } + + daemon_log(LOG_INFO, "Sucessfully opened DTMF FIFO '%s'.", d->fname); + + return d; + +fail: + if (d) + dtmf_fifo_free(d); + + return NULL; +} + +void dtmf_fifo_free(struct dtmf_fifo *d) { + assert(d); + + if (d->fd >= 0) + close(d->fd); + + if (d->fname) { + unlink(d->fname); + free(d->fname); + } + + if (d->dir) { + rmdir(d->dir); + free(d->dir); + } + + free(d); +} + +void dtmf_fifo_pass(struct dtmf_fifo *d, char c) { + assert(d && d->fd >= 0); + + daemon_log(LOG_INFO, "Recieved DTMF character '%c'", c); + + if (write(d->fd, &c, 1) != 1) + daemon_log(LOG_ERR, "Failed to write to DTMF FIFO: %s", strerror(errno)); +} -- cgit