#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)); }