• News
  • Idefisk
  • Tools
  • Tutorials
  • Forum
  • Reviews
  • VoIP Providers
  • Archives
  • Gallery
ZOIPER softphone
AsteriskGuru Archives
Mailing List Archives
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

[Asterisk-cvs] asterisk/channels chan_skinny.c,1.5,1.6

 
   AsteriskGuru Archives Forum Index -> Asterisk-CVS
View previous topic :: View next topic  
Author Message
jeremy at lists.digium.co
Guest





PostPosted: Sun Sep 14, 2003 12:04 am    Post subject: [Asterisk-cvs] asterisk/channels chan_skinny.c,1.5,1.6

Update of /usr/cvsroot/asterisk/channels
In directory mongoose.digium.com:/tmp/cvs-serv29526

Modified Files:
chan_skinny.c
Log Message:
implement reload


Index: chan_skinny.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_skinny.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- chan_skinny.c 13 Sep 2003 23:30:30 -0000 1.5
+++ chan_skinny.c 14 Sep 2003 00:05:37 -0000 1.6
@@ -526,17 +526,17 @@
#define SKINNY_ALERT 36
#define SKINNY_REORDER 37
#define SKINNY_CALLWAITTONE 45
-
-#define SKINNY_LAMP_OFF 1
-#define SKINNY_LAMP_ON 2
-#define SKINNY_LAMP_WINK 3
-#define SKINNY_LAMP_FLASH 4
-#define SKINNY_LAMP_BLINK 5
-
-#define SKINNY_RING_OFF 1
-#define SKINNY_RING_INSIDE 2
-#define SKINNY_RING_OUTSIDE 3
-#define SKINNY_RING_FEATURE 4
+
+#define SKINNY_LAMP_OFF 1
+#define SKINNY_LAMP_ON 2
+#define SKINNY_LAMP_WINK 3
+#define SKINNY_LAMP_FLASH 4
+#define SKINNY_LAMP_BLINK 5
+
+#define SKINNY_RING_OFF 1
+#define SKINNY_RING_INSIDE 2
+#define SKINNY_RING_OUTSIDE 3
+#define SKINNY_RING_FEATURE 4

#define TYPE_TRUNK 1
#define TYPE_LINE 2
@@ -559,8 +559,8 @@
#define SKINNY_CX_CONFERENCE 3
#define SKINNY_CX_MUTE 4
#define SKINNY_CX_INACTIVE 4
-
-#if 0
+
+#if 0
static char *skinny_cxmodes[] = {
"sendonly",
"recvonly",
@@ -568,7 +568,7 @@
"confrnce",
"inactive"
};
-#endif
+#endif

/* driver scheduler */
static struct sched_context *sched;
@@ -581,11 +581,11 @@
/* Protect the monitoring thread, so only one process can kill or start it, and not
when it's doing something critical. */
static ast_mutex_t monlock = AST_MUTEX_INITIALIZER;
-/* Protect the network socket */
+/* Protect the network socket */
static ast_mutex_t netlock = AST_MUTEX_INITIALIZER;
-/* Protect the session list */
-static ast_mutex_t sessionlock = AST_MUTEX_INITIALIZER;
-/* Protect the device list */
+/* Protect the session list */
+static ast_mutex_t sessionlock = AST_MUTEX_INITIALIZER;
+/* Protect the device list */
static ast_mutex_t devicelock = AST_MUTEX_INITIALIZER;

/* This is the thread for the monitor which checks for input on the channels
@@ -699,60 +699,60 @@
struct skinny_subchannel *sub = l->sub;
return sub;
}
-
-static struct skinny_subchannel *find_subchannel_by_name(char *dest)
-{
- struct skinny_line *l;
- struct skinny_device *d;
- char line[256];
- char *at;
- char *device;
-
- printf("dest: %s\n", dest);
-
- strncpy(line, dest, sizeof(line) - 1);
- at = strchr(line, '@');
- if (!at) {
- ast_log(LOG_NOTICE, "Device '%s' has no @ (at) sign!\n", dest);
- return NULL;
- }
- *at = '\0';
- at++;
- device = at;
-
- printf("line: %s\n", line);
- printf("device: %s\n", device);
-
- ast_mutex_lock(&devicelock);
- d = devices;
- while(d) {
- if (!strcasecmp(d->name, device)) {
- if (skinnydebug) {
- printf("Found device: %s\n", d->name);
- }
- /* Found the device */
- l = d->lines;
- while (l) {
- /* Search for the right line */
- if (!strcasecmp(l->name, line)) {
- ast_mutex_unlock(&devicelock);
- if (skinnydebug) {
- printf("Found line: %s\n", l->name);
- }
- return l->sub;
- }
- printf("line cycle\n");
- l = l->next;
- }
- }
- printf("device cycle\n");
- d = d->next;
- }
- /* Device not found*/
- ast_mutex_unlock(&devicelock);
- return NULL;
-}
-
+
+static struct skinny_subchannel *find_subchannel_by_name(char *dest)
+{
+ struct skinny_line *l;
+ struct skinny_device *d;
+ char line[256];
+ char *at;
+ char *device;
+
+ printf("dest: %s\n", dest);
+
+ strncpy(line, dest, sizeof(line) - 1);
+ at = strchr(line, '@');
+ if (!at) {
+ ast_log(LOG_NOTICE, "Device '%s' has no @ (at) sign!\n", dest);
+ return NULL;
+ }
+ *at = '\0';
+ at++;
+ device = at;
+
+ printf("line: %s\n", line);
+ printf("device: %s\n", device);
+
+ ast_mutex_lock(&devicelock);
+ d = devices;
+ while(d) {
+ if (!strcasecmp(d->name, device)) {
+ if (skinnydebug) {
+ printf("Found device: %s\n", d->name);
+ }
+ /* Found the device */
+ l = d->lines;
+ while (l) {
+ /* Search for the right line */
+ if (!strcasecmp(l->name, line)) {
+ ast_mutex_unlock(&devicelock);
+ if (skinnydebug) {
+ printf("Found line: %s\n", l->name);
+ }
+ return l->sub;
+ }
+ printf("line cycle\n");
+ l = l->next;
+ }
+ }
+ printf("device cycle\n");
+ d = d->next;
+ }
+ /* Device not found*/
+ ast_mutex_unlock(&devicelock);
+ return NULL;
+}
+
static int transmit_response(struct skinnysession *s, skinny_req *req)
{
int res = 0;
@@ -1432,52 +1432,52 @@

static int skinny_call(struct ast_channel *ast, char *dest, int timeout)
{
- int res = 0;
+ int res = 0;
int tone = 0;
struct skinny_line *l;
- struct skinny_subchannel *sub;
+ struct skinny_subchannel *sub;
struct skinnysession *session;
-
- if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) {
- ast_log(LOG_WARNING, "skinny_call called on %s, neither down nor reserved\n", ast->name);
- return -1;
- }
-
+
+ if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) {
+ ast_log(LOG_WARNING, "skinny_call called on %s, neither down nor reserved\n", ast->name);
+ return -1;
+ }
+
if (skinnydebug) {
ast_verbose(VERBOSE_PREFIX_3 "skinny_call(%s)\n", ast->name);
}

sub = ast->pvt->pvt;
- l = sub->parent;
+ l = sub->parent;
session = l->parent->session;
-
- if (l->dnd) {
- ast_queue_control(ast, AST_CONTROL_BUSY, 0);
- return 0;
- }
-
+
+ if (l->dnd) {
+ ast_queue_control(ast, AST_CONTROL_BUSY, 0);
+ return 0;
+ }
+
switch (l->hookstate) {
case SKINNY_OFFHOOK:
tone = SKINNY_CALLWAITTONE;
break;
- case SKINNY_ONHOOK:
- tone = SKINNY_ALERT;
+ case SKINNY_ONHOOK:
+ tone = SKINNY_ALERT;
break;
default:
ast_log(LOG_ERROR, "Don't know how to deal with hookstate %d\n", l->hookstate);
break;
}
-
- transmit_lamp_indication(session, l->instance, SKINNY_LAMP_BLINK);
- transmit_ringer_mode(session, SKINNY_RING_INSIDE);
- transmit_tone(session, tone);
- transmit_callstate(session, l->instance, SKINNY_RINGIN, sub->callid);
-
-// Set the prompt
-// Select the active softkeys
-
- ast_setstate(ast, AST_STATE_RINGING);
- ast_queue_control(ast, AST_CONTROL_RINGING, 0);
+
+ transmit_lamp_indication(session, l->instance, SKINNY_LAMP_BLINK);
+ transmit_ringer_mode(session, SKINNY_RING_INSIDE);
+ transmit_tone(session, tone);
+ transmit_callstate(session, l->instance, SKINNY_RINGIN, sub->callid);
+
+// Set the prompt
+// Select the active softkeys
+
+ ast_setstate(ast, AST_STATE_RINGING);
+ ast_queue_control(ast, AST_CONTROL_RINGING, 0);

sub->outgoing = 1;
// sub->cxmode = SKINNY_CX_RECVONLY;
@@ -1485,10 +1485,10 @@
if (!sub->rtp) {
start_rtp(sub);
} else {
- /* do we need to anything if there already is an RTP allocated? */
+ /* do we need to anything if there already is an RTP allocated? */
// transmit_modify_request(sub);
}
-
+
#if 0
if (sub->next->owner && sub->next->callid) {
/* try to prevent a callwait from disturbing the other connection */
@@ -1502,8 +1502,8 @@
sub->next->cxmode = SKINNY_CX_SENDRECV;
// transmit_modify_request(sub->next);
}
-#endif
-
+#endif
+
} else {
ast_log(LOG_NOTICE, "Don't know how to dial on trunks yet\n");
res = -1;
@@ -1693,7 +1693,7 @@
case AST_CONTROL_RINGING:
transmit_tone(s, SKINNY_ALERT);
transmit_callstate(s, l->instance, SKINNY_PROGRESS, sub->callid);
- break;
+ break;
case AST_CONTROL_BUSY:
transmit_tone(s, SKINNY_BUSYTONE);
transmit_callstate(s, l->instance, SKINNY_BUSY, sub->callid);
@@ -1801,12 +1801,12 @@
time_t timer;
struct tm *cmtime;
pthread_t t;
-
- if ( (!s->device) && (req->e != REGISTER_MESSAGE && req->e != ALARM_MESSAGE)) {
- ast_log(LOG_WARNING, "Client sent message #%d without first registering.\n", req->e);
- free(req);
- return 0;
- }
+
+ if ( (!s->device) && (req->e != REGISTER_MESSAGE && req->e != ALARM_MESSAGE)) {
+ ast_log(LOG_WARNING, "Client sent message #%d without first registering.\n", req->e);
+ free(req);
+ return 0;
+ }


switch(req->e) {
@@ -2049,14 +2049,14 @@
}
sub->parent->hookstate = SKINNY_OFFHOOK;

- if (sub->outgoing) {
- transmit_callstate(s, s->device->lines->instance, SKINNY_OFFHOOK, sub->callid);
- transmit_tone(s, SKINNY_SILENCE);
- ast_setstate(sub->owner, AST_STATE_UP);
+ if (sub->outgoing) {
+ transmit_callstate(s, s->device->lines->instance, SKINNY_OFFHOOK, sub->callid);
+ transmit_tone(s, SKINNY_SILENCE);
+ ast_setstate(sub->owner, AST_STATE_UP);
// select soft keys
} else {
- if (!sub->owner) {
-
+ if (!sub->owner) {
+
transmit_callstate(s, s->device->lines->instance, SKINNY_OFFHOOK, sub->callid);
transmit_tone(s, SKINNY_DIALTONE);
c = skinny_new(sub, AST_STATE_DOWN);
@@ -2072,7 +2072,7 @@

} else {
ast_log(LOG_DEBUG, "Current sub [%s] already has owner\n", sub->owner->name);
- }
+ }
}
break;
case ONHOOK_MESSAGE:
@@ -2232,21 +2232,21 @@

res = ast_select(s->fd + 1, &fds, NULL, NULL, NULL);

- if (res < 0) {
- ast_log(LOG_WARNING, "Select returned error: %s\n", strerror(errno));
+ if (res < 0) {
+ ast_log(LOG_WARNING, "Select returned error: %s\n", strerror(errno));
} else if (res > 0) {
memset(s->inbuf,0,sizeof(s->inbuf));
- res = read(s->fd, s->inbuf, 4);
- if (res != 4) {
- ast_log(LOG_WARNING, "Skinny Client sent less data than expected.\n");
- return -1;
- }
- dlen = *(int *)s->inbuf;
- res = read(s->fd, s->inbuf+4, dlen+4);
- ast_mutex_unlock(&s->lock);
- if (res != (dlen+4)) {
- ast_log(LOG_WARNING, "Skinny Client sent less data than expected.\n");
- return -1;
+ res = read(s->fd, s->inbuf, 4);
+ if (res != 4) {
+ ast_log(LOG_WARNING, "Skinny Client sent less data than expected.\n");
+ return -1;
+ }
+ dlen = *(int *)s->inbuf;
+ res = read(s->fd, s->inbuf+4, dlen+4);
+ ast_mutex_unlock(&s->lock);
+ if (res != (dlen+4)) {
+ ast_log(LOG_WARNING, "Skinny Client sent less data than expected.\n");
+ return -1;
}

}
@@ -2267,7 +2267,7 @@
memcpy(req, s->inbuf, *(int*)(s->inbuf)+8); // +8
if (req->e < 0) {
ast_log(LOG_ERROR, "Event Message is NULL from socket %d, This is bad\n", s->fd);
- free(req);
+ free(req);
return NULL;
}
return req;
@@ -2422,9 +2422,9 @@
int oldformat;
struct skinny_subchannel *sub;
struct ast_channel *tmpc = NULL;
- char tmp[256];
- char *dest = data;
-
+ char tmp[256];
+ char *dest = data;
+
oldformat = format;
format &= capability;
if (!format) {
@@ -2432,11 +2432,11 @@
return NULL;
}

- strncpy(tmp, dest, sizeof(tmp) - 1);
- if (!strlen(tmp)) {
- ast_log(LOG_NOTICE, "Skinny channels require a device\n");
- return NULL;
- }
+ strncpy(tmp, dest, sizeof(tmp) - 1);
+ if (!strlen(tmp)) {
+ ast_log(LOG_NOTICE, "Skinny channels require a device\n");
+ return NULL;
+ }

sub = find_subchannel_by_name(tmp);
if (!sub) {
@@ -2600,7 +2600,46 @@

return 0;
}
+
+void delete_devices(void)
+{
+ struct skinny_device *d, *dlast;
+ struct skinny_line *l, *llast;
+ struct skinny_subchannel *sub, *slast;
+
+ ast_mutex_lock(&devicelock);
+
+ /* Delete all devices */
+ for (d=devices;d;) {
+
+ /* Delete all lines for this device */
+ for (l=d->lines;l;) {
+ /* Delete all subchannels for this line */
+ for (sub=l->sub;sub;) {
+ slast = sub;
+ sub = sub->next;
+ free(slast);
+ }
+ llast = l;
+ l = l->next;
+ free(llast);
+ }
+ dlast = d;
+ d = d->next;
+ free(dlast);
+ }
+ devices=NULL;
+ ast_mutex_unlock(&devicelock);
+}

+int reload(void)
+{
+ delete_devices();
+ reload_config();
+ restart_monitor();
+ return 0;
+}
+

int load_module()
{


Back to top
Display posts from previous:   
   AsteriskGuru Archives Forum Index -> Asterisk-CVS All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group
contact us at: support@asteriskguru.com - asterisKGuru.com © all rights reserved   |   *asterisk is registered trademark of © Digium™