[svn-commits] bmd: branch group/newcdr r117991 - /team/group/newcdr/main/channel.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu May 22 16:45:50 CDT 2008


Author: bmd
Date: Thu May 22 16:45:50 2008
New Revision: 117991

URL: http://svn.digium.com/view/asterisk?view=rev&rev=117991
Log:
fix the way linkedids are compared so that 1.11 will not seem older than 1.2

Modified:
    team/group/newcdr/main/channel.c

Modified: team/group/newcdr/main/channel.c
URL: http://svn.digium.com/view/asterisk/team/group/newcdr/main/channel.c?view=diff&rev=117991&r1=117990&r2=117991
==============================================================================
--- team/group/newcdr/main/channel.c (original)
+++ team/group/newcdr/main/channel.c Thu May 22 16:45:50 2008
@@ -3820,8 +3820,67 @@
 	}
 }
 
-/* return the oldest of two uniqueids */
-#define OLDEST(a,b) (ast_strlen_zero(a) ? b : (ast_strlen_zero(b) ? a : (strcmp(a, b) < 0 ? a : b)))
+
+
+/* return the oldest of two linkedids.  linkedid is derived from
+   uniqueid which is formed like this: [systemname-]ctime.seq
+
+   The systemname, and the dash are optional, followed by the epoch
+   time followed by an integer sequence.  Note that this is not a
+   decimal number, since 1.2 is less than 1.11 in uniqueid land.
+
+   To compare two uniqueids, we parse out the integer values of the
+   time and the sequence numbers and compare them, with time trumping
+   sequence.
+*/
+static const char *oldest_linkedid(const char *a, const char *b)
+{
+	const char *satime, *saseq;
+	const char *sbtime, *sbseq;
+	const char *dash;
+
+	unsigned int atime, aseq, btime, bseq;
+	
+	if (ast_strlen_zero(a))
+		return b;
+
+	if (ast_strlen_zero(b))
+		return a;
+
+	satime = a;
+	sbtime = b;
+
+	/* jump over the system name */
+	if ((dash = strrchr(satime, '-'))) {
+		satime = dash+1;
+	}
+	if ((dash = strrchr(sbtime, '-'))) {
+		sbtime = dash+1;
+	}
+
+	/* the sequence comes after the '.' */
+	saseq = strchr(satime, '.');
+	sbseq = strchr(sbtime, '.');
+	if (!saseq || !sbseq)
+		return NULL;
+	saseq++;
+	sbseq++;
+
+	/* convert it all to integers */
+	atime = atoi(satime); /* note that atoi is ignoring the '.' after the time string */
+	btime = atoi(sbtime); /* note that atoi is ignoring the '.' after the time string */
+	aseq = atoi(saseq);
+	bseq = atoi(sbseq);
+
+	/* and finally compare */
+	if (atime == btime) {
+		return (aseq < bseq) ? a : b;
+	}
+	else {
+		return (atime < btime) ? a : b;
+	}
+}
+
 
 /*!
   \brief Propagate the linked id from one channel to the other
@@ -3832,21 +3891,21 @@
 	const char* linkedid=NULL;
 	struct ast_channel *bridged;
 
-	linkedid = OLDEST(chan->linkedid, peer->linkedid);
-	linkedid = OLDEST(linkedid, chan->uniqueid);
-	linkedid = OLDEST(linkedid, peer->uniqueid);
+	linkedid = oldest_linkedid(chan->linkedid, peer->linkedid);
+	linkedid = oldest_linkedid(linkedid, chan->uniqueid);
+	linkedid = oldest_linkedid(linkedid, peer->uniqueid);
 	if (chan->_bridge) {
 		bridged = ast_bridged_channel(chan);
 		if (bridged != peer) {
-			linkedid = OLDEST(linkedid, bridged->linkedid);
-			linkedid = OLDEST(linkedid, bridged->uniqueid);
+			linkedid = oldest_linkedid(linkedid, bridged->linkedid);
+			linkedid = oldest_linkedid(linkedid, bridged->uniqueid);
 		}
 	}
 	if (peer->_bridge) {
 		bridged = ast_bridged_channel(peer);
 		if (bridged != chan) {
-			linkedid = OLDEST(linkedid, bridged->linkedid);
-			linkedid = OLDEST(linkedid, bridged->uniqueid);
+			linkedid = oldest_linkedid(linkedid, bridged->linkedid);
+			linkedid = oldest_linkedid(linkedid, bridged->uniqueid);
 		}
 	}
 




More information about the svn-commits mailing list