[asterisk-commits] anthonyl: branch anthonyl/skinny-test r44491 - /team/anthonyl/skinny-test/cha...

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Thu Oct 5 11:58:00 MST 2006


Author: anthonyl
Date: Thu Oct  5 13:57:59 2006
New Revision: 44491

URL: http://svn.digium.com/view/asterisk?rev=44491&view=rev
Log:
patched

Modified:
    team/anthonyl/skinny-test/channels/chan_skinny.c

Modified: team/anthonyl/skinny-test/channels/chan_skinny.c
URL: http://svn.digium.com/view/asterisk/team/anthonyl/skinny-test/channels/chan_skinny.c?rev=44491&r1=44490&r2=44491&view=diff
==============================================================================
--- team/anthonyl/skinny-test/channels/chan_skinny.c (original)
+++ team/anthonyl/skinny-test/channels/chan_skinny.c Thu Oct  5 13:57:59 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: the remote 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,23 @@
 		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 sent 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);
 			return -1;
-		}
+		} else if (res == 0) {
+			if (skinnydebug)
+				ast_verbose("Skinny client lost, unregistering\n");
+			skinny_unregister(NULL,s);
+		}
+		
 		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