Version 0.3.0 from FTP
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@548 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
parent
77a1b3573d
commit
7bcf9080c5
|
@ -59,6 +59,12 @@ static char initstr[AST_MAX_INIT_STR] = "ATE0Q0";
|
||||||
/* Default MSN */
|
/* Default MSN */
|
||||||
static char msn[AST_MAX_EXTENSION]="";
|
static char msn[AST_MAX_EXTENSION]="";
|
||||||
|
|
||||||
|
/* Default Listen */
|
||||||
|
static char incomingmsn[AST_MAX_EXTENSION]="";
|
||||||
|
|
||||||
|
/* Default group */
|
||||||
|
static unsigned int cur_group = 0;
|
||||||
|
|
||||||
static int usecnt =0;
|
static int usecnt =0;
|
||||||
|
|
||||||
static int baudrate = 115200;
|
static int baudrate = 115200;
|
||||||
|
@ -91,8 +97,8 @@ static int modem_digit(struct ast_channel *ast, char digit)
|
||||||
p = ast->pvt->pvt;
|
p = ast->pvt->pvt;
|
||||||
if (p->mc->dialdigit)
|
if (p->mc->dialdigit)
|
||||||
return p->mc->dialdigit(p, digit);
|
return p->mc->dialdigit(p, digit);
|
||||||
else ast_log(LOG_DEBUG, "Channel %s lacks digit dialing\n", ast->name);
|
ast_log(LOG_DEBUG, "Channel %s lacks digit dialing\n", ast->name);
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ast_modem_driver *drivers = NULL;
|
static struct ast_modem_driver *drivers = NULL;
|
||||||
|
@ -162,13 +168,14 @@ int ast_unregister_modem_driver(struct ast_modem_driver *mc)
|
||||||
|
|
||||||
static int modem_call(struct ast_channel *ast, char *idest, int timeout)
|
static int modem_call(struct ast_channel *ast, char *idest, int timeout)
|
||||||
{
|
{
|
||||||
static int modem_hangup(struct ast_channel *ast);
|
|
||||||
struct ast_modem_pvt *p;
|
struct ast_modem_pvt *p;
|
||||||
int ms = timeout;
|
int ms = timeout;
|
||||||
char rdest[80], *where, dstr[100];
|
char rdest[80], *where, dstr[100];
|
||||||
|
char *stringp=NULL;
|
||||||
strncpy(rdest, idest, sizeof(rdest)-1);
|
strncpy(rdest, idest, sizeof(rdest)-1);
|
||||||
strtok(rdest, ":");
|
stringp=rdest;
|
||||||
where = strtok(NULL, ":");
|
strsep(&stringp, ":");
|
||||||
|
where = strsep(&stringp, ":");
|
||||||
if (!where) {
|
if (!where) {
|
||||||
ast_log(LOG_WARNING, "Destination %s requres a real destination (device:destination)\n", idest);
|
ast_log(LOG_WARNING, "Destination %s requres a real destination (device:destination)\n", idest);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -473,6 +480,12 @@ static int modem_write(struct ast_channel *ast, struct ast_frame *frame)
|
||||||
long flags;
|
long flags;
|
||||||
struct ast_modem_pvt *p = ast->pvt->pvt;
|
struct ast_modem_pvt *p = ast->pvt->pvt;
|
||||||
|
|
||||||
|
/* Modems tend to get upset when they receive data whilst in
|
||||||
|
* command mode. This makes esp. dial commands short lived.
|
||||||
|
* Pauline Middelink - 2002-09-24 */
|
||||||
|
if (ast->_state != AST_STATE_UP)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* Temporarily make non-blocking */
|
/* Temporarily make non-blocking */
|
||||||
flags = fcntl(ast->fds[0], F_GETFL);
|
flags = fcntl(ast->fds[0], F_GETFL);
|
||||||
fcntl(ast->fds[0], F_SETFL, flags | O_NONBLOCK);
|
fcntl(ast->fds[0], F_SETFL, flags | O_NONBLOCK);
|
||||||
|
@ -692,6 +705,7 @@ static struct ast_modem_pvt *mkif(char *iface)
|
||||||
}
|
}
|
||||||
strncpy(tmp->language, language, sizeof(tmp->language)-1);
|
strncpy(tmp->language, language, sizeof(tmp->language)-1);
|
||||||
strncpy(tmp->msn, msn, sizeof(tmp->msn)-1);
|
strncpy(tmp->msn, msn, sizeof(tmp->msn)-1);
|
||||||
|
strncpy(tmp->incomingmsn, incomingmsn, sizeof(tmp->incomingmsn)-1);
|
||||||
strncpy(tmp->dev, iface, sizeof(tmp->dev)-1);
|
strncpy(tmp->dev, iface, sizeof(tmp->dev)-1);
|
||||||
/* Maybe in the future we want to allow variable
|
/* Maybe in the future we want to allow variable
|
||||||
serial settings */
|
serial settings */
|
||||||
|
@ -709,6 +723,7 @@ static struct ast_modem_pvt *mkif(char *iface)
|
||||||
tmp->stripmsd = stripmsd;
|
tmp->stripmsd = stripmsd;
|
||||||
tmp->dialtype = dialtype;
|
tmp->dialtype = dialtype;
|
||||||
tmp->mode = gmode;
|
tmp->mode = gmode;
|
||||||
|
tmp->group = cur_group;
|
||||||
memset(tmp->cid, 0, sizeof(tmp->cid));
|
memset(tmp->cid, 0, sizeof(tmp->cid));
|
||||||
strncpy(tmp->context, context, sizeof(tmp->context)-1);
|
strncpy(tmp->context, context, sizeof(tmp->context)-1);
|
||||||
strncpy(tmp->initstr, initstr, sizeof(tmp->initstr)-1);
|
strncpy(tmp->initstr, initstr, sizeof(tmp->initstr)-1);
|
||||||
|
@ -730,9 +745,22 @@ static struct ast_channel *modem_request(char *type, int format, void *data)
|
||||||
struct ast_modem_pvt *p;
|
struct ast_modem_pvt *p;
|
||||||
struct ast_channel *tmp = NULL;
|
struct ast_channel *tmp = NULL;
|
||||||
char dev[80];
|
char dev[80];
|
||||||
|
unsigned int group = 0;
|
||||||
|
char *stringp=NULL;
|
||||||
strncpy(dev, (char *)data, sizeof(dev)-1);
|
strncpy(dev, (char *)data, sizeof(dev)-1);
|
||||||
strtok(dev, ":");
|
stringp=dev;
|
||||||
|
strsep(&stringp, ":");
|
||||||
oldformat = format;
|
oldformat = format;
|
||||||
|
|
||||||
|
if (dev[0]=='g' && isdigit(dev[1])) {
|
||||||
|
/* Retrieve the group number */
|
||||||
|
if (sscanf(dev+1, "%u", &group) < 1) {
|
||||||
|
ast_log(LOG_WARNING, "Unable to determine group from [%s]\n", (char *)data);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
group = 1 << group;
|
||||||
|
}
|
||||||
|
|
||||||
/* Search for an unowned channel */
|
/* Search for an unowned channel */
|
||||||
if (ast_pthread_mutex_lock(&iflock)) {
|
if (ast_pthread_mutex_lock(&iflock)) {
|
||||||
ast_log(LOG_ERROR, "Unable to lock interface list???\n");
|
ast_log(LOG_ERROR, "Unable to lock interface list???\n");
|
||||||
|
@ -740,17 +768,31 @@ static struct ast_channel *modem_request(char *type, int format, void *data)
|
||||||
}
|
}
|
||||||
p = iflist;
|
p = iflist;
|
||||||
while(p) {
|
while(p) {
|
||||||
if (!strcmp(dev, p->dev + 5)) {
|
if (group) {
|
||||||
if (p->mc->formats & format) {
|
/* if it belongs to the proper group, and the format matches
|
||||||
if (!p->owner) {
|
* and it is not in use, we found a candidate! */
|
||||||
tmp = ast_modem_new(p, AST_STATE_DOWN);
|
if (p->group & group &&
|
||||||
restart_monitor();
|
p->mc->formats & format &&
|
||||||
break;
|
!p->owner) {
|
||||||
|
/* XXX Not quite sure that not having an owner is
|
||||||
|
* sufficient evidence of beeing a free device XXX */
|
||||||
|
tmp = ast_modem_new(p, AST_STATE_DOWN);
|
||||||
|
restart_monitor();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!strcmp(dev, p->dev + 5)) {
|
||||||
|
if (p->mc->formats & format) {
|
||||||
|
if (!p->owner) {
|
||||||
|
tmp = ast_modem_new(p, AST_STATE_DOWN);
|
||||||
|
restart_monitor();
|
||||||
|
break;
|
||||||
|
} else
|
||||||
|
ast_log(LOG_WARNING, "Device '%s' is busy\n", p->dev);
|
||||||
} else
|
} else
|
||||||
ast_log(LOG_WARNING, "Device '%s' is busy\n", p->dev);
|
ast_log(LOG_WARNING, "Asked for a format %d line on %s\n", format, p->dev);
|
||||||
} else
|
break;
|
||||||
ast_log(LOG_WARNING, "Asked for a format %d line on %s\n", format, p->dev);
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
|
@ -761,6 +803,42 @@ static struct ast_channel *modem_request(char *type, int format, void *data)
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned int get_group(char *s)
|
||||||
|
{
|
||||||
|
char *piece;
|
||||||
|
int start, finish,x;
|
||||||
|
unsigned int group = 0;
|
||||||
|
char *copy = strdupa(s);
|
||||||
|
char *stringp=NULL;
|
||||||
|
if (!copy) {
|
||||||
|
ast_log(LOG_ERROR, "Out of memory\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
stringp=copy;
|
||||||
|
piece = strsep(&stringp, ",");
|
||||||
|
while(piece) {
|
||||||
|
if (sscanf(piece, "%d-%d", &start, &finish) == 2) {
|
||||||
|
/* Range */
|
||||||
|
} else if (sscanf(piece, "%d", &start)) {
|
||||||
|
/* Just one */
|
||||||
|
finish = start;
|
||||||
|
} else {
|
||||||
|
ast_log(LOG_ERROR, "Syntax error parsing '%s' at '%s'. Using '0'\n", s,piece);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
piece = strsep(&stringp, ",");
|
||||||
|
|
||||||
|
for (x=start;x<=finish;x++) {
|
||||||
|
if ((x > 31) || (x < 0)) {
|
||||||
|
ast_log(LOG_WARNING, "Ignoring invalid group %d\n", x);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
group |= (1 << x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return group;
|
||||||
|
}
|
||||||
|
|
||||||
int load_module()
|
int load_module()
|
||||||
{
|
{
|
||||||
struct ast_config *cfg;
|
struct ast_config *cfg;
|
||||||
|
@ -793,7 +871,6 @@ int load_module()
|
||||||
ast_destroy(cfg);
|
ast_destroy(cfg);
|
||||||
ast_pthread_mutex_unlock(&iflock);
|
ast_pthread_mutex_unlock(&iflock);
|
||||||
unload_module();
|
unload_module();
|
||||||
ast_pthread_mutex_unlock(&iflock);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else if (!strcasecmp(v->name, "driver")) {
|
} else if (!strcasecmp(v->name, "driver")) {
|
||||||
|
@ -829,8 +906,12 @@ int load_module()
|
||||||
strncpy(context, v->value, sizeof(context)-1);
|
strncpy(context, v->value, sizeof(context)-1);
|
||||||
} else if (!strcasecmp(v->name, "msn")) {
|
} else if (!strcasecmp(v->name, "msn")) {
|
||||||
strncpy(msn, v->value, sizeof(msn)-1);
|
strncpy(msn, v->value, sizeof(msn)-1);
|
||||||
|
} else if (!strcasecmp(v->name, "incomingmsn")) {
|
||||||
|
strncpy(incomingmsn, v->value, sizeof(incomingmsn)-1);
|
||||||
} else if (!strcasecmp(v->name, "language")) {
|
} else if (!strcasecmp(v->name, "language")) {
|
||||||
strncpy(language, v->value, sizeof(language)-1);
|
strncpy(language, v->value, sizeof(language)-1);
|
||||||
|
} else if (!strcasecmp(v->name, "group")) {
|
||||||
|
cur_group = get_group(v->value);
|
||||||
}
|
}
|
||||||
v = v->next;
|
v = v->next;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue