[asterisk-commits] qwell: branch 1.4 r44764 -
/branches/1.4/channels/chan_skinny.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Mon Oct 9 09:12:36 MST 2006
Author: qwell
Date: Mon Oct 9 11:12:35 2006
New Revision: 44764
URL: http://svn.digium.com/view/asterisk?rev=44764&view=rev
Log:
Fix a problem where phones that go "missing" never got unregistered.
Issue #8067, reported by pj, patch by Anthony LaMantia (with minor whitespace modifications)
Modified:
branches/1.4/channels/chan_skinny.c
Modified: branches/1.4/channels/chan_skinny.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_skinny.c?rev=44764&r1=44763&r2=44764&view=diff
==============================================================================
--- branches/1.4/channels/chan_skinny.c (original)
+++ branches/1.4/channels/chan_skinny.c Mon Oct 9 11:12:35 2006
@@ -1335,6 +1335,55 @@
}
}
+
+static int skinny_register(struct skinny_req *req, struct skinnysession *s)
+{
+ struct skinny_device *d;
+ struct sockaddr_in sin;
+ socklen_t slen;
+
+ ast_mutex_lock(&devicelock);
+ for (d = devices; d; d = d->next) {
+ if (!strcasecmp(req->data.reg.name, d->id)
+ && ast_apply_ha(d->ha, &(s->sin))) {
+ s->device = d;
+ d->type = letohl(req->data.reg.type);
+ if (ast_strlen_zero(d->version_id)) {
+ ast_copy_string(d->version_id, version_id, sizeof(d->version_id));
+ }
+ d->registered = 1;
+ d->session = s;
+
+ slen = sizeof(sin);
+ if (getsockname(s->fd, (struct sockaddr *)&sin, &slen)) {
+ ast_log(LOG_WARNING, "Cannot get socket name\n");
+ sin.sin_addr = __ourip;
+ }
+ d->ourip = sin.sin_addr;
+ break;
+ }
+ }
+ ast_mutex_unlock(&devicelock);
+ if (!d) {
+ return 0;
+ }
+ return 1;
+}
+
+static int skinny_unregister(struct skinny_req *req, struct skinnysession *s)
+{
+ struct skinny_device *d;
+
+ d = s->device;
+
+ if (d) {
+ d->session = NULL;
+ d->registered = 0;
+ }
+
+ return -1; /* main loop will destroy the session */
+}
+
static int transmit_response(struct skinnysession *s, struct skinny_req *req)
{
int res = 0;
@@ -1350,9 +1399,17 @@
memcpy(s->outbuf+skinny_header_size, &req->data, sizeof(union skinny_data));
res = write(s->fd, s->outbuf, letohl(req->len)+8);
+
if (res != letohl(req->len)+8) {
ast_log(LOG_WARNING, "Transmit: write only sent %d out of %d bytes: %s\n", res, letohl(req->len)+8, strerror(errno));
- }
+ if (res == -1) {
+ if (skinnydebug)
+ ast_log(LOG_WARNING, "Transmit: Skinny Client was lost, unregistering\n");
+ skinny_unregister(NULL, s);
+ }
+
+ }
+
ast_mutex_unlock(&s->lock);
return 1;
}
@@ -2153,54 +2210,6 @@
return d;
}
-static int skinny_register(struct skinny_req *req, struct skinnysession *s)
-{
- struct skinny_device *d;
- struct sockaddr_in sin;
- socklen_t slen;
-
- ast_mutex_lock(&devicelock);
- for (d = devices; d; d = d->next) {
- if (!strcasecmp(req->data.reg.name, d->id)
- && ast_apply_ha(d->ha, &(s->sin))) {
- s->device = d;
- d->type = letohl(req->data.reg.type);
- if (ast_strlen_zero(d->version_id)) {
- ast_copy_string(d->version_id, version_id, sizeof(d->version_id));
- }
- d->registered = 1;
- d->session = s;
-
- slen = sizeof(sin);
- if (getsockname(s->fd, (struct sockaddr *)&sin, &slen)) {
- ast_log(LOG_WARNING, "Cannot get socket name\n");
- sin.sin_addr = __ourip;
- }
- d->ourip = sin.sin_addr;
- break;
- }
- }
- ast_mutex_unlock(&devicelock);
- if (!d) {
- return 0;
- }
- return 1;
-}
-
-static int skinny_unregister(struct skinny_req *req, struct skinnysession *s)
-{
- struct skinny_device *d;
-
- d = s->device;
-
- if (d) {
- d->session = NULL;
- d->registered = 0;
- }
-
- return -1; /* main loop will destroy the session */
-}
-
static void start_rtp(struct skinny_subchannel *sub)
{
struct skinny_line *l = sub->parent;
@@ -4173,13 +4182,26 @@
res = read(s->fd, s->inbuf, 4);
if (res < 0) {
ast_log(LOG_WARNING, "read() returned error: %s\n", strerror(errno));
+
+ if (skinnydebug)
+ ast_verbose("Skinny Client was lost, unregistering\n");
+
+ skinny_unregister(NULL,s);
ast_mutex_unlock(&s->lock);
return res;
} else if (res != 4) {
ast_log(LOG_WARNING, "Skinny Client sent less data than expected. Expected 4 but got %d.\n", res);
ast_mutex_unlock(&s->lock);
+
+ if (res == 0) {
+ if (skinnydebug)
+ ast_verbose("Skinny Client was lost, unregistering\n");
+ skinny_unregister(NULL, s);
+ }
+
return -1;
}
+
dlen = letohl(*(int *)s->inbuf);
if (dlen < 0) {
ast_log(LOG_WARNING, "Skinny Client sent invalid data.\n");
More information about the asterisk-commits
mailing list