mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-06 09:59:20 +00:00
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
This commit is contained in:
@@ -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 */
|
||||||
|
|||||||
Reference in New Issue
Block a user