diff options
Diffstat (limited to 'src/dtmffifo.c')
-rw-r--r-- | src/dtmffifo.c | 82 |
1 files changed, 82 insertions, 0 deletions
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 <unistd.h> +#include <libdaemon/dlog.h> +#include <limits.h> +#include <stdlib.h> +#include <assert.h> +#include <string.h> +#include <fcntl.h> +#include <errno.h> +#include <stdio.h> +#include <sys/stat.h> + +#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)); +} |