Index: main.c
diff -Nau main.c.orig main.c
--- main.c.orig	2012-03-21.orig 10:29:31.458420799 +0100
+++ main.c	2012-03-21 10:30:52.034994020 +0100
@@ -1025,6 +1025,10 @@
 	ret=-1;
 	my_argc=argc; my_argv=argv;
 
+	/* if (!log_stderr), that's not usable yet! '/
+	/* ...so unconditionally log to syslog for now */
+	openlog(argv[0], LOG_PID|LOG_CONS, log_facility);
+
 	/*init pkg mallocs (before parsing cfg or cmd line !)*/
 	if (init_pkg_mallocs()==-1)
 		goto error00;
@@ -1357,6 +1361,11 @@
 
 	/* init_daemon? */
 	if (!dont_fork){
+		/* shortly after main() we called openlog(3) to log */
+		/* the initialization, but since daemonize() has its */
+		/* own syslog(3) handling, we need to close the log first */
+		closelog(); /* close the initialization logging logic */
+
 		if ( daemonize((log_name==0)?argv[0]:log_name, &own_pgid) <0 )
 			goto error;
 	}
Index: Makefile.defs
diff -Nau Makefile.defs.orig Makefile.defs
--- Makefile.defs.orig	2012-03-21.orig 10:29:31.252995930 +0100
+++ Makefile.defs	2012-03-21 10:30:52.038327356 +0100
@@ -220,7 +220,7 @@
 else
 	doc-dir = doc/$(MAIN_NAME)/
 	man-dir = man/
-	data-dir = $(MAIN_NAME)/
+	data-dir = share/$(MAIN_NAME)/
 	LOCALBASE ?= $(SYSBASE)/local
 endif
 endif
@@ -1432,6 +1432,10 @@
 LIBS+= -lsctp
 endif
 
+#conditionally add libfsl
+LDFLAGS += -L$(prefix)/lib
+LIBS    += -lfsl
+
 ifneq ($(found_lock_method), yes)
 $(warning	No locking method found so far, trying SYS V sems)
 		DEFS+= -DUSE_SYSV_SEM  # try sys v sems
Index: scripts/opensipsctl.8
diff -Nau scripts/opensipsctl.8.orig scripts/opensipsctl.8
--- scripts/opensipsctl.8.orig	2012-03-21.orig 10:29:31.357825870 +0100
+++ scripts/opensipsctl.8	2012-03-21 10:30:52.039349015 +0100
@@ -20,8 +20,6 @@
 
 .SH FILES
 .PD 0
-.I /etc/opensips/.opensipsctlrc
-.br
 .I /usr/local/etc/opensips/.opensipsctlrc
 .br
 .I ~/.opensipsctlrc
Index: scripts/osipsconsole
diff -Nau scripts/osipsconsole.orig scripts/osipsconsole
--- scripts/osipsconsole.orig	2012-03-21.orig 10:29:31.335460757 +0100
+++ scripts/osipsconsole	2012-03-21 10:30:52.050666821 +0100
@@ -30,7 +30,6 @@
 use Term::ReadLine;
 use DBI;
 use POSIX;
-use Frontier::RPC2;
 use IO::Socket;
 use Socket;
 #use Net::IP;
@@ -378,6 +377,12 @@
 			}		
 		}
 
+		if ( $MD5 eq "" ) {
+			if ( $arr[0] =~ /^\s*MD5/ ) {
+			 	$MD5 = $arr[1]; 
+			}		
+		}
+
 		if ( $AWK eq "" ) {
 			if ( $arr[0] =~ /^\s*AWK/ ) {
 			 	$AWK = $arr[1]; 
Index: modules/permissions/parse_config.c
diff -Nau modules/permissions/parse_config.c.orig modules/permissions/parse_config.c
--- modules/permissions/parse_config.c.orig	2012-03-21.orig 10:29:32.047580003 +0100
+++ modules/permissions/parse_config.c	2012-03-21 10:30:52.052696686 +0100
@@ -114,8 +114,11 @@
 	except = strstr(str, " EXCEPT ");
 	if (except) {
 		/* exception found */
-		strncpy(str2, str, except-str);
-		str2[except-str] = '\0';
+		int l = except - str;
+		if (l > sizeof(str2) - 1)
+			l = sizeof(str2) - 1;
+		strncpy(str2, str, l);
+		str2[l] = '\0';
 		/* except+8 points to the exception */
 		if (parse_expression_list(except+8, e_exceptions)) {
 			/* error */
@@ -124,7 +127,8 @@
 		}
 	} else {
 		/* no exception */
-		strcpy(str2, str);
+		strncpy(str2, str, sizeof(str2)-1);
+		str2[sizeof(str2)-1] = '\0';
 		*e_exceptions = NULL;
 	}
 
Index: parser/sdp/sdp_helpr_funcs.c
diff -Nau parser/sdp/sdp_helpr_funcs.c.orig parser/sdp/sdp_helpr_funcs.c
--- parser/sdp/sdp_helpr_funcs.c.orig	2012-03-21.orig 10:29:31.444187545 +0100
+++ parser/sdp/sdp_helpr_funcs.c	2012-03-21 10:30:52.057616045 +0100
@@ -396,7 +396,7 @@
 
 	cp1 = NULL;
 	for (cp = body->s; (len = body->s + body->len - cp) > 0;) {
-		cp1 = (char*)ser_memmem(cp, line, len, 2);
+		cp1 = (char*)ser_memmem(cp, line, len, strlen(line));
 		if (cp1 == NULL || cp1[-1] == '\n' || cp1[-1] == '\r')
 			break;
 		cp = cp1 + 2;
Index: modules/nathelper/nathelper.c
diff -Nau modules/nathelper/nathelper.c.orig modules/nathelper/nathelper.c
--- modules/nathelper/nathelper.c.orig	2012-03-21.orig 10:29:31.795178267 +0100
+++ modules/nathelper/nathelper.c	2012-03-21 10:30:52.055610362 +0100
@@ -289,6 +289,9 @@
 	return 0;
 }
 
+/* MSvB macros */
+#define OPENSIPS_NOOP ((void)0)
+
 
 
 
@@ -813,6 +816,7 @@
 #define	FIX_MEDIP	0x02
 #define	ADD_ANORTPPROXY	0x04
 #define	FIX_ORGIP	0x08
+#define	FIX_RTCPIP	0x10
 
 #define	ADIRECTION	"a=direction:active"
 #define	ADIRECTION_LEN	(sizeof(ADIRECTION) - 1)
@@ -829,7 +833,9 @@
 {
 	char *buf;
 	int offset;
+	int binlump;
 	struct lump* anchor;
+	struct lump* templump;
 	str omip, nip, oip;
 
 	/* check that updating mediaip is really necessary */
@@ -860,7 +866,19 @@
 		memcpy(buf, CRLF, CRLF_LEN);
 		memcpy(buf + CRLF_LEN, omip.s, omip.len);
 		memcpy(buf + CRLF_LEN + omip.len, oldip->s, oldip->len);
-		if (insert_new_lump_after(anchor, buf,
+
+		/* if the oldmediaip string is already */
+		/* in the body then don't add it again */
+		binlump = 0;
+		for (templump = msg->body_lumps; templump; templump = templump->next)
+			if (templump->op == LUMP_ADD && strstr(templump->u.value, buf))
+				binlump = 1;
+		for (templump = msg->add_rm; templump; templump = templump->next)
+			if (templump->op == LUMP_ADD && strstr(templump->u.value, buf))
+				binlump = 1;
+		if (strstr(body->s, buf) || binlump)
+			pkg_free(buf);
+		else if (insert_new_lump_after(anchor, buf,
 		    omip.len + oldip->len + CRLF_LEN, 0) == NULL) {
 			LM_ERR("insert_new_lump_after failed\n");
 			pkg_free(buf);
@@ -1046,6 +1064,12 @@
 		p= p->next;
 	}
 
+	if (level & FIX_RTCPIP) {
+		/* Iterate all a=rtcp: and replace ips in them. */
+		if (replace_sdp_ip(msg, &body, "a=rtcp:", str2?&ip:0)==-1)
+			return -1;
+	}
+
 	return 1;
 }
 
