Use pseudo channel instead of just /dev/zap/pseudo, now with proper protections (bug #1766)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3130 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.0
Mark Spencer 21 years ago
parent bc86e5de2a
commit b6beb440cd

@ -92,6 +92,7 @@ LOCAL_USER_DECL;
static struct ast_conference { static struct ast_conference {
char confno[AST_MAX_EXTENSION]; /* Conference */ char confno[AST_MAX_EXTENSION]; /* Conference */
struct ast_channel *chan; /* Announcements channel */
int fd; /* Announcements fd */ int fd; /* Announcements fd */
int zapconf; /* Zaptel Conf # */ int zapconf; /* Zaptel Conf # */
int users; /* Number of active users */ 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) static int careful_write(int fd, unsigned char *data, int len)
{ {
int res; int res;
int x;
while(len) { 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 (res < 1) {
if (errno != EAGAIN) { if (errno != EAGAIN) {
ast_log(LOG_WARNING, "Failed to write audio data to conference: %s\n", strerror(errno)); 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)); memset(cnf, 0, sizeof(struct ast_conference));
strncpy(cnf->confno, confno, sizeof(cnf->confno) - 1); strncpy(cnf->confno, confno, sizeof(cnf->confno) - 1);
strncpy(cnf->pin, pin, sizeof(cnf->pin) - 1); strncpy(cnf->pin, pin, sizeof(cnf->pin) - 1);
cnf->fd = open("/dev/zap/pseudo", O_RDWR); cnf->chan = ast_request("zap", AST_FORMAT_ULAW, "pseudo");
if (cnf->fd < 0) { if (cnf->chan) {
ast_log(LOG_WARNING, "Unable to open pseudo channel\n"); cnf->fd = cnf->chan->fds[0]; /* for use by conf_play() */
free(cnf); } else {
cnf = NULL; ast_log(LOG_WARNING, "Unable to open pseudo channel - trying device\n");
goto cnfout; 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)); memset(&ztc, 0, sizeof(ztc));
/* Setup a new zap conference */ /* Setup a new zap conference */
ztc.chan = 0; ztc.chan = 0;
ztc.confno = -1; 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)) { if (ioctl(cnf->fd, ZT_SETCONF, &ztc)) {
ast_log(LOG_WARNING, "Error setting conference\n"); ast_log(LOG_WARNING, "Error setting conference\n");
close(cnf->fd); if (cnf->chan)
ast_hangup(cnf->chan);
else
close(cnf->fd);
free(cnf); free(cnf);
cnf = NULL; cnf = NULL;
goto cnfout; goto cnfout;
@ -927,7 +941,10 @@ outrun:
} }
if (!cur) if (!cur)
ast_log(LOG_WARNING, "Conference not found\n"); ast_log(LOG_WARNING, "Conference not found\n");
close(conf->fd); if (conf->chan)
ast_hangup(conf->chan);
else
close(conf->fd);
free(conf); free(conf);
} else { } else {
/* Remove the user struct */ /* Remove the user struct */

Loading…
Cancel
Save