|
|
|
@ -840,6 +840,64 @@ static unsigned int get_group(char *s)
|
|
|
|
|
return group;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int __unload_module(void)
|
|
|
|
|
{
|
|
|
|
|
struct ast_modem_pvt *p, *pl;
|
|
|
|
|
/* First, take us out of the channel loop */
|
|
|
|
|
ast_channel_unregister(type);
|
|
|
|
|
if (!ast_mutex_lock(&iflock)) {
|
|
|
|
|
/* Hangup all interfaces if they have an owner */
|
|
|
|
|
p = iflist;
|
|
|
|
|
while(p) {
|
|
|
|
|
if (p->owner)
|
|
|
|
|
ast_softhangup(p->owner, AST_SOFTHANGUP_APPUNLOAD);
|
|
|
|
|
p = p->next;
|
|
|
|
|
}
|
|
|
|
|
iflist = NULL;
|
|
|
|
|
ast_mutex_unlock(&iflock);
|
|
|
|
|
} else {
|
|
|
|
|
ast_log(LOG_WARNING, "Unable to lock the monitor\n");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
if (!ast_mutex_lock(&monlock)) {
|
|
|
|
|
if (monitor_thread != (pthread_t) -1 && monitor_thread != (pthread_t) -2) {
|
|
|
|
|
pthread_cancel(monitor_thread);
|
|
|
|
|
pthread_join(monitor_thread, NULL);
|
|
|
|
|
}
|
|
|
|
|
monitor_thread = (pthread_t) -2;
|
|
|
|
|
ast_mutex_unlock(&monlock);
|
|
|
|
|
} else {
|
|
|
|
|
ast_log(LOG_WARNING, "Unable to lock the monitor\n");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!ast_mutex_lock(&iflock)) {
|
|
|
|
|
/* Destroy all the interfaces and free their memory */
|
|
|
|
|
p = iflist;
|
|
|
|
|
while(p) {
|
|
|
|
|
/* Close the socket, assuming it's real */
|
|
|
|
|
if (p->fd > -1)
|
|
|
|
|
close(p->fd);
|
|
|
|
|
pl = p;
|
|
|
|
|
p = p->next;
|
|
|
|
|
/* Free associated memory */
|
|
|
|
|
free(pl);
|
|
|
|
|
}
|
|
|
|
|
iflist = NULL;
|
|
|
|
|
ast_mutex_unlock(&iflock);
|
|
|
|
|
} else {
|
|
|
|
|
ast_log(LOG_WARNING, "Unable to lock the monitor\n");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int unload_module()
|
|
|
|
|
{
|
|
|
|
|
return __unload_module();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int load_module()
|
|
|
|
|
{
|
|
|
|
|
struct ast_config *cfg;
|
|
|
|
@ -871,7 +929,7 @@ int load_module()
|
|
|
|
|
ast_log(LOG_ERROR, "Unable to register channel '%s'\n", v->value);
|
|
|
|
|
ast_destroy(cfg);
|
|
|
|
|
ast_mutex_unlock(&iflock);
|
|
|
|
|
unload_module();
|
|
|
|
|
__unload_module();
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
} else if (!strcasecmp(v->name, "driver")) {
|
|
|
|
@ -883,7 +941,7 @@ int load_module()
|
|
|
|
|
ast_log(LOG_ERROR, "Failed to load driver %s\n", driver);
|
|
|
|
|
ast_destroy(cfg);
|
|
|
|
|
ast_mutex_unlock(&iflock);
|
|
|
|
|
unload_module();
|
|
|
|
|
__unload_module();
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
} else if (!strcasecmp(v->name, "mode")) {
|
|
|
|
@ -921,7 +979,7 @@ int load_module()
|
|
|
|
|
AST_FORMAT_SLINEAR, modem_request)) {
|
|
|
|
|
ast_log(LOG_ERROR, "Unable to register channel class %s\n", type);
|
|
|
|
|
ast_destroy(cfg);
|
|
|
|
|
unload_module();
|
|
|
|
|
__unload_module();
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
ast_destroy(cfg);
|
|
|
|
@ -930,59 +988,6 @@ int load_module()
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int unload_module()
|
|
|
|
|
{
|
|
|
|
|
struct ast_modem_pvt *p, *pl;
|
|
|
|
|
/* First, take us out of the channel loop */
|
|
|
|
|
ast_channel_unregister(type);
|
|
|
|
|
if (!ast_mutex_lock(&iflock)) {
|
|
|
|
|
/* Hangup all interfaces if they have an owner */
|
|
|
|
|
p = iflist;
|
|
|
|
|
while(p) {
|
|
|
|
|
if (p->owner)
|
|
|
|
|
ast_softhangup(p->owner, AST_SOFTHANGUP_APPUNLOAD);
|
|
|
|
|
p = p->next;
|
|
|
|
|
}
|
|
|
|
|
iflist = NULL;
|
|
|
|
|
ast_mutex_unlock(&iflock);
|
|
|
|
|
} else {
|
|
|
|
|
ast_log(LOG_WARNING, "Unable to lock the monitor\n");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
if (!ast_mutex_lock(&monlock)) {
|
|
|
|
|
if (monitor_thread != (pthread_t) -1 && monitor_thread != (pthread_t) -2) {
|
|
|
|
|
pthread_cancel(monitor_thread);
|
|
|
|
|
pthread_join(monitor_thread, NULL);
|
|
|
|
|
}
|
|
|
|
|
monitor_thread = (pthread_t) -2;
|
|
|
|
|
ast_mutex_unlock(&monlock);
|
|
|
|
|
} else {
|
|
|
|
|
ast_log(LOG_WARNING, "Unable to lock the monitor\n");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!ast_mutex_lock(&iflock)) {
|
|
|
|
|
/* Destroy all the interfaces and free their memory */
|
|
|
|
|
p = iflist;
|
|
|
|
|
while(p) {
|
|
|
|
|
/* Close the socket, assuming it's real */
|
|
|
|
|
if (p->fd > -1)
|
|
|
|
|
close(p->fd);
|
|
|
|
|
pl = p;
|
|
|
|
|
p = p->next;
|
|
|
|
|
/* Free associated memory */
|
|
|
|
|
free(pl);
|
|
|
|
|
}
|
|
|
|
|
iflist = NULL;
|
|
|
|
|
ast_mutex_unlock(&iflock);
|
|
|
|
|
} else {
|
|
|
|
|
ast_log(LOG_WARNING, "Unable to lock the monitor\n");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int usecount(void)
|
|
|
|
|
{
|
|
|
|
|
int res;
|
|
|
|
|