aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-06-02 16:57:14 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-06-02 16:57:14 +0000
commit2c58e4bbe62afc0f92b72ad09383172283f111bd (patch)
treedfec776b085689c953b5d8e4a79b7a64b20b14a8 /apps
parentd85c1c949cb09d40e35adeb9aba91e79bf0ef169 (diff)
Use pseudo channel instead of just /dev/zap/pseudo, now with proper protections (bug #1766)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@3130 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rwxr-xr-xapps/app_meetme.c37
1 files changed, 27 insertions, 10 deletions
diff --git a/apps/app_meetme.c b/apps/app_meetme.c
index 6d8d8cb33..c068ad57a 100755
--- a/apps/app_meetme.c
+++ b/apps/app_meetme.c
@@ -92,6 +92,7 @@ LOCAL_USER_DECL;
static struct ast_conference {
char confno[AST_MAX_EXTENSION]; /* Conference */
+ struct ast_channel *chan; /* Announcements channel */
int fd; /* Announcements fd */
int zapconf; /* Zaptel Conf # */
int users; /* Number of active users */
@@ -147,8 +148,12 @@ static int admin_exec(struct ast_channel *chan, void *data);
static int careful_write(int fd, unsigned char *data, int len)
{
int res;
+ int x;
while(len) {
- res = write(fd, data, len);
+ x = ZT_IOMUX_WRITE | ZT_IOMUX_SIGEVENT;
+ res = ioctl(fd, ZT_IOMUX, &x);
+ if (res >= 0)
+ res = write(fd, data, len);
if (res < 1) {
if (errno != EAGAIN) {
ast_log(LOG_WARNING, "Failed to write audio data to conference: %s\n", strerror(errno));
@@ -203,21 +208,30 @@ static struct ast_conference *build_conf(char *confno, char *pin, int make, int
memset(cnf, 0, sizeof(struct ast_conference));
strncpy(cnf->confno, confno, sizeof(cnf->confno) - 1);
strncpy(cnf->pin, pin, sizeof(cnf->pin) - 1);
- cnf->fd = open("/dev/zap/pseudo", O_RDWR);
- if (cnf->fd < 0) {
- ast_log(LOG_WARNING, "Unable to open pseudo channel\n");
- free(cnf);
- cnf = NULL;
- goto cnfout;
+ cnf->chan = ast_request("zap", AST_FORMAT_ULAW, "pseudo");
+ if (cnf->chan) {
+ cnf->fd = cnf->chan->fds[0]; /* for use by conf_play() */
+ } else {
+ ast_log(LOG_WARNING, "Unable to open pseudo channel - trying device\n");
+ cnf->fd = open("/dev/zap/pseudo", O_RDWR);
+ if (cnf->fd < 0) {
+ ast_log(LOG_WARNING, "Unable to open pseudo device\n");
+ free(cnf);
+ cnf = NULL;
+ goto cnfout;
+ }
}
memset(&ztc, 0, sizeof(ztc));
/* Setup a new zap conference */
ztc.chan = 0;
ztc.confno = -1;
- ztc.confmode = ZT_CONF_CONF | ZT_CONF_TALKER | ZT_CONF_LISTENER;
+ ztc.confmode = ZT_CONF_CONFANN;
if (ioctl(cnf->fd, ZT_SETCONF, &ztc)) {
ast_log(LOG_WARNING, "Error setting conference\n");
- close(cnf->fd);
+ if (cnf->chan)
+ ast_hangup(cnf->chan);
+ else
+ close(cnf->fd);
free(cnf);
cnf = NULL;
goto cnfout;
@@ -927,7 +941,10 @@ outrun:
}
if (!cur)
ast_log(LOG_WARNING, "Conference not found\n");
- close(conf->fd);
+ if (conf->chan)
+ ast_hangup(conf->chan);
+ else
+ close(conf->fd);
free(conf);
} else {
/* Remove the user struct */