summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorMaxim Sobolev <sobomax@FreeBSD.org>2003-09-14 16:51:56 +0000
committerMaxim Sobolev <sobomax@FreeBSD.org>2003-09-14 16:51:56 +0000
commitf0fb6b9efa0cdf1e9dfd0d654d59dba7227bba85 (patch)
tree17f5a4dd2b30f3cabed5d24728df014a7b300cd1 /net
parentRescue a hosed port from death row. GCL is now healthy enough to (diff)
Add ser 0.8.11, a very fast and configurable SIP proxy.
Notes
Notes: svn path=/head/; revision=88981
Diffstat (limited to 'net')
-rw-r--r--net/Makefile1
-rw-r--r--net/ser/Makefile45
-rw-r--r--net/ser/distinfo1
-rw-r--r--net/ser/files/patch-Makefile38
-rw-r--r--net/ser/files/patch-Makefile.defs82
-rw-r--r--net/ser/files/patch-modules::acc::acc_mod.c14
-rw-r--r--net/ser/files/patch-modules::acc::etc::radiusclient.conf42
-rw-r--r--net/ser/files/patch-modules::auth_radius::authrad_mod.c14
-rw-r--r--net/ser/files/patch-modules::group_radius::grouprad_mod.c14
-rw-r--r--net/ser/files/patch-modules::nathelper::README15
-rw-r--r--net/ser/files/patch-modules::nathelper::nathelper.c649
-rw-r--r--net/ser/files/patch-modules::postgres::Makefile14
-rw-r--r--net/ser/files/patch-modules::tm::t_lookup.c25
-rw-r--r--net/ser/files/patch-modules::uri_radius::urirad_mod.c14
-rw-r--r--net/ser/files/patch-udp_server.c16
-rw-r--r--net/ser/pkg-descr15
-rw-r--r--net/ser/pkg-plist70
17 files changed, 1069 insertions, 0 deletions
diff --git a/net/Makefile b/net/Makefile
index ade58d943ba9..a9da71c88775 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -592,6 +592,7 @@
SUBDIR += sdl_net
SUBDIR += sendfile
SUBDIR += sendip
+ SUBDIR += ser
SUBDIR += serveez
SUBDIR += sharity-light
SUBDIR += silc-client
diff --git a/net/ser/Makefile b/net/ser/Makefile
new file mode 100644
index 000000000000..cab7ab65d40f
--- /dev/null
+++ b/net/ser/Makefile
@@ -0,0 +1,45 @@
+# New ports collection makefile for: ser
+# Date created: 6 November 2002
+# Whom: andrei
+#
+# $FreeBSD$
+#
+
+PORTNAME= ser
+PORTVERSION= 0.8.11
+CATEGORIES= net
+MASTER_SITES= ftp://ftp.berlios.de/pub/ser/${PORTVERSION}/src/
+DISTNAME= ${PORTNAME}-${PORTVERSION}_src
+
+MAINTAINER= sobomax@FreeBSD.org
+COMMENT= A very fast and configurable SIP proxy
+
+BUILD_DEPENDS= ${LOCALBASE}/lib/mysql/libmysqlclient.a:${PORTSDIR}/databases/mysql40-client
+LIB_DEPENDS= radiusclient.0:${PORTSDIR}/net/radiusclient
+RUN_DEPENDS= ${LOCALBASE}/lib/mysql/libmysqlclient.a:${PORTSDIR}/databases/mysql40-client
+
+WRKSRC= ${WRKDIR}/${PORTNAME}-${PORTVERSION}
+
+USE_GMAKE= yes
+CFLAGS+= -I${LOCALBASE}/include
+
+MAN8= ser.8
+MAN5= ser.cfg.5
+MANCOMPRESSED= no
+
+post-install:
+ ${SED} 's|%%LOCALBASE%%|${LOCALBASE}|g ; s|%%PREFIX%%|${PREFIX}|g' \
+ ${WRKSRC}/modules/acc/etc/radiusclient.conf > \
+ ${WRKDIR}/radiusclient.conf
+ ${INSTALL_DATA} ${WRKSRC}/modules/acc/etc/sip_dictionary \
+ ${PREFIX}/etc/ser
+ ${INSTALL_DATA} ${WRKSRC}/modules/acc/etc/servers \
+ ${PREFIX}/etc/ser/servers.sample
+ ${INSTALL_DATA} ${WRKDIR}/radiusclient.conf \
+ ${PREFIX}/etc/ser/radiusclient.conf.default
+ if [ ! -e ${PREFIX}/etc/ser/radiusclient.conf ]; then \
+ ${INSTALL_DATA} ${WRKDIR}/radiusclient.conf \
+ ${PREFIX}/etc/ser/radiusclient.conf; \
+ fi
+
+.include <bsd.port.mk>
diff --git a/net/ser/distinfo b/net/ser/distinfo
new file mode 100644
index 000000000000..a36fb25b03a2
--- /dev/null
+++ b/net/ser/distinfo
@@ -0,0 +1 @@
+MD5 (ser-0.8.11_src.tar.gz) = 47510a4794f6d8bb788e49eaa31e0b63
diff --git a/net/ser/files/patch-Makefile b/net/ser/files/patch-Makefile
new file mode 100644
index 000000000000..c189f1321a59
--- /dev/null
+++ b/net/ser/files/patch-Makefile
@@ -0,0 +1,38 @@
+
+$FreeBSD$
+
+--- Makefile.orig Fri Aug 29 19:58:39 2003
++++ Makefile Wed Sep 10 19:38:09 2003
+@@ -46,8 +46,8 @@
+ exclude_modules?= cpl cpl-c ext extcmd mangler pdt \
+ postgres snmp \
+ im radius_acc radius_auth \
+- jabber mysql \
+- auth_radius group_radius uri_radius
++ jabber \
++ group_radius uri_radius
+ # always exclude the CVS dir
+ override exclude_modules+= CVS $(skip_modules)
+
+@@ -247,7 +247,7 @@
+ chmod 644 $(cfg-prefix)/$(cfg-dir)ser.cfg.sample
+ if [ -z "${skip_cfg_install}" -a \
+ ! -f $(cfg-prefix)/$(cfg-dir)ser.cfg ]; then \
+- mv -f $(cfg-prefix)/$(cfg-dir)ser.cfg.sample \
++ cp $(cfg-prefix)/$(cfg-dir)ser.cfg.sample \
+ $(cfg-prefix)/$(cfg-dir)ser.cfg; \
+ fi
+ # $(INSTALL-CFG) etc/ser.cfg $(cfg-prefix)/$(cfg-dir)
+@@ -256,10 +256,10 @@
+ $(INSTALL-TOUCH) $(bin-prefix)/$(bin-dir)/ser
+ $(INSTALL-BIN) ser $(bin-prefix)/$(bin-dir)
+ $(INSTALL-TOUCH) $(bin-prefix)/$(bin-dir)/sc
+- $(INSTALL-BIN) scripts/sc $(bin-prefix)/$(bin-dir)
++ $(INSTALL-SCRIPT) scripts/sc $(bin-prefix)/$(bin-dir)
+ mv -f $(bin-prefix)/$(bin-dir)/sc $(bin-prefix)/$(bin-dir)/serctl
+ $(INSTALL-TOUCH) $(bin-prefix)/$(bin-dir)/ser_mysql.sh
+- $(INSTALL-BIN) scripts/ser_mysql.sh $(bin-prefix)/$(bin-dir)
++ $(INSTALL-SCRIPT) scripts/ser_mysql.sh $(bin-prefix)/$(bin-dir)
+ $(INSTALL-TOUCH) $(bin-prefix)/$(bin-dir)/gen_ha1
+ $(INSTALL-BIN) utils/gen_ha1/gen_ha1 $(bin-prefix)/$(bin-dir)
+
diff --git a/net/ser/files/patch-Makefile.defs b/net/ser/files/patch-Makefile.defs
new file mode 100644
index 000000000000..32486fd5f541
--- /dev/null
+++ b/net/ser/files/patch-Makefile.defs
@@ -0,0 +1,82 @@
+
+$FreeBSD$
+
+--- Makefile.defs.orig Mon Sep 1 20:47:57 2003
++++ Makefile.defs Wed Sep 10 19:39:20 2003
+@@ -114,10 +114,11 @@
+ INSTALL-TOUCH = touch # used to create the file first (good to
+ # make solaris install work)
+ # INSTALL-CFG = $(INSTALL) -m 644
+-INSTALL-BIN = $(INSTALL) -m 755
+-INSTALL-MODULES = $(INSTALL) -m 755
+-INSTALL-DOC = $(INSTALL) -m 644
+-INSTALL-MAN = $(INSTALL) -m 644
++INSTALL-BIN = $(BSD_INSTALL_PROGRAM)
++INSTALL-MODULES = $(BSD_INSTALL_PROGRAM)
++INSTALL-DOC = $(BSD_INSTALL_MAN)
++INSTALL-MAN = $(BSD_INSTALL_MAN)
++INSTALL-SCRIPT = $(BSD_INSTALL_SCRIPT)
+
+ #set some vars from the environment (and not make builtins)
+ CC := $(shell echo "$${CC}")
+@@ -265,10 +266,10 @@
+ -DSHM_MEM -DSHM_MMAP \
+ -DADAPTIVE_WAIT -DADAPTIVE_WAIT_LOOPS=1024 \
+ -DDNS_IP_HACK \
+- -DUSE_IPV6 \
+- -DUSE_TCP \
+ -DDISABLE_NAGLE \
+- -DF_MALLOC \
++ #-DUSE_IPV6 \
++ #-DUSE_TCP \
++ #-DF_MALLOC \
+ # -DDBG_QM_MALLOC \
+ #-DF_MALLOC \
+ #-DNO_DEBUG \
+@@ -374,8 +375,8 @@
+ found_lock_method=yes
+ endif
+
+-CFLAGS=
+-LDFLAGS=
++#CFLAGS=
++#LDFLAGS=
+ # setting CFLAGS
+ ifeq ($(mode), release)
+ #if i386
+@@ -383,7 +384,7 @@
+ # if gcc
+ ifeq ($(CC_NAME), gcc)
+ #common stuff
+- CFLAGS=-g -O9 -funroll-loops -Wcast-align $(PROFILE) \
++ CFLAGS+=-funroll-loops -Wcast-align $(PROFILE) \
+ -Wall \
+ #if gcc 3.0
+ ifeq ($(CC_SHORTVER), 3.0)
+@@ -409,7 +410,7 @@
+
+ else # CC_NAME, gcc
+ ifeq ($(CC_NAME), icc)
+- CFLAGS=-g -O3 -ipo -ipo_obj -unroll $(PROFILE) \
++ CFLAGS+=-ipo -ipo_obj -unroll $(PROFILE) \
+ -tpp6 -xK #-openmp #optimize for PIII
+ # -prefetch doesn't seem to work
+ #( ty to inline acroos files, unroll loops,prefetch,
+@@ -428,7 +429,7 @@
+ #if gcc
+ ifeq ($(CC_NAME), gcc)
+ #common stuff
+- CFLAGS=-g -O9 -funroll-loops $(PROFILE) \
++ CFLAGS+=-funroll-loops $(PROFILE) \
+ -Wall\
+ #-Wcast-align \
+ #-Wmissing-prototypes
+@@ -486,7 +487,7 @@
+ # if gcc
+ ifeq ($(CC_NAME), gcc)
+ #common stuff
+- CFLAGS=-O9 -funroll-loops -Wcast-align $(PROFILE) \
++ CFLAGS+=-funroll-loops -Wcast-align $(PROFILE) \
+ -Wall \
+ #if gcc 3.0
+ ifeq ($(CC_SHORTVER), 3.0)
diff --git a/net/ser/files/patch-modules::acc::acc_mod.c b/net/ser/files/patch-modules::acc::acc_mod.c
new file mode 100644
index 000000000000..f7096b3c8a50
--- /dev/null
+++ b/net/ser/files/patch-modules::acc::acc_mod.c
@@ -0,0 +1,14 @@
+
+$FreeBSD$
+
+--- modules/acc/acc_mod.c 2003/07/06 18:04:54 1.1
++++ modules/acc/acc_mod.c 2003/07/06 18:05:26
+@@ -92,7 +92,7 @@
+ int log_level=L_NOTICE;
+ char *log_fmt=DEFAULT_LOG_FMT;
+ #ifdef RAD_ACC
+-char *radius_config = "/usr/local/etc/radiusclient/radiusclient.conf";
++char *radius_config = (CFG_DIR "radiusclient.conf");
+ int radius_flag = 0;
+ int radius_missed_flag = 0;
+ int service_type = PW_SIP;
diff --git a/net/ser/files/patch-modules::acc::etc::radiusclient.conf b/net/ser/files/patch-modules::acc::etc::radiusclient.conf
new file mode 100644
index 000000000000..876687437988
--- /dev/null
+++ b/net/ser/files/patch-modules::acc::etc::radiusclient.conf
@@ -0,0 +1,42 @@
+
+$FreeBSD$
+
+--- modules/acc/etc/radiusclient.conf 2003/07/06 17:56:08 1.1
++++ modules/acc/etc/radiusclient.conf 2003/07/06 17:57:54
+@@ -22,7 +22,7 @@
+
+ # name of the issue file. it's only display when no username is passed
+ # on the radlogin command line
+-issue /usr/local/etc/radiusclient/issue
++issue %%LOCALBASE%%/etc/radiusclient/issue
+
+ # RADIUS settings
+
+@@ -44,23 +44,23 @@
+
+ # file holding shared secrets used for the communication
+ # between the RADIUS client and server
+-servers /home/jiri/sip_router/modules/acc/etc/servers
++servers %%PREFIX%%/etc/ser/servers
+
+
+
+ # dictionary of allowed attributes and values
+ # just like in the normal RADIUS distributions
+-dictionary /home/jiri/sip_router/modules/acc/etc/sip_dictionary
++dictionary %%PREFIX%%/etc/ser/sip_dictionary
+
+ # program to call for a RADIUS authenticated login
+-login_radius /usr/local/sbin/login.radius
++login_radius %%LOCALBASE%%/sbin/login.radius
+
+ # file which holds sequence number for communication with the
+ # RADIUS server
+ seqfile /var/run/radius.seq
+
+ # file which specifies mapping between ttyname and NAS-Port attribute
+-mapfile /usr/local/etc/radiusclient/port-id-map
++mapfile %%LOCALBASE%%/etc/radiusclient/port-id-map
+
+ # default authentication realm to append to all usernames if no
+ # realm was explicitly specified by the user
diff --git a/net/ser/files/patch-modules::auth_radius::authrad_mod.c b/net/ser/files/patch-modules::auth_radius::authrad_mod.c
new file mode 100644
index 000000000000..a6fb67ad749e
--- /dev/null
+++ b/net/ser/files/patch-modules::auth_radius::authrad_mod.c
@@ -0,0 +1,14 @@
+
+$FreeBSD$
+
+--- modules/auth_radius/authrad_mod.c.orig Sat May 3 00:36:29 2003
++++ modules/auth_radius/authrad_mod.c Mon Sep 8 01:28:58 2003
+@@ -59,7 +59,7 @@
+ /*
+ * Module parameter variables
+ */
+-char* radius_config = "/usr/local/etc/radiusclient/radiusclient.conf";
++char* radius_config = (CFG_DIR "radiusclient.conf");
+ int service_type = PW_SIP;
+
+
diff --git a/net/ser/files/patch-modules::group_radius::grouprad_mod.c b/net/ser/files/patch-modules::group_radius::grouprad_mod.c
new file mode 100644
index 000000000000..3639deb07fb4
--- /dev/null
+++ b/net/ser/files/patch-modules::group_radius::grouprad_mod.c
@@ -0,0 +1,14 @@
+
+$FreeBSD$
+
+--- modules/group_radius/grouprad_mod.c 2003/07/06 18:04:54 1.1
++++ modules/group_radius/grouprad_mod.c 2003/07/06 18:05:41
+@@ -52,7 +52,7 @@
+ /*
+ * Module parameter variables
+ */
+-char* radius_config = "/usr/local/etc/radiusclient/radiusclient.conf";
++char* radius_config = (CFG_DIR "radiusclient.conf");
+ int use_domain = 1; /* By default we use domain */
+
+
diff --git a/net/ser/files/patch-modules::nathelper::README b/net/ser/files/patch-modules::nathelper::README
new file mode 100644
index 000000000000..46db1a3c6b1e
--- /dev/null
+++ b/net/ser/files/patch-modules::nathelper::README
@@ -0,0 +1,15 @@
+
+$FreeBSD$
+
+--- modules/nathelper/README.orig Sun Jul 6 17:32:22 2003
++++ modules/nathelper/README Sun Jul 6 20:53:30 2003
+@@ -43,3 +43,9 @@
+ address with source address of the message)
+ Desc: Rewrites SDP body in accordance with mode flag
+ Example: if (search("User-Agent: Cisco ATA.*") {fix_nated_sdp(3);};
++
++Name: force_rtp_proxy
++Params: none
++Desc: Rewrites SDP body to ensure that media is passed throuth RTP
++ proxy
++Example: if (search("User-Agent: Cisco ATA.*") {force_rtp_proxy(3);};
diff --git a/net/ser/files/patch-modules::nathelper::nathelper.c b/net/ser/files/patch-modules::nathelper::nathelper.c
new file mode 100644
index 000000000000..4acb99ff3e5b
--- /dev/null
+++ b/net/ser/files/patch-modules::nathelper::nathelper.c
@@ -0,0 +1,649 @@
+
+$FreeBSD$
+
+--- modules/nathelper/nathelper.c.orig Mon Jun 23 22:34:37 2003
++++ modules/nathelper/nathelper.c Sat Aug 2 09:03:54 2003
+@@ -5,6 +5,10 @@
+ * we received this message from
+ * fix_nated_sdp() - replaces IP address in the SDP with IP address
+ * and/or adds direction=active option to the SDP
++ * force_rtp_proxy() - rewrite IP address and UDP port in the SDP
++ * body in such a way that RTP traffic visits
++ * RTP proxy running on the same machine as a
++ * ser itself
+ *
+ * Beware, those functions will only work correctly if the UA supports
+ * symmetric signalling and media (not all do)!!!
+@@ -48,9 +52,15 @@
+ #include "../../timer.h"
+ #include "../../ut.h"
+ #include "../registrar/sip_msg.h"
++#include <sys/types.h>
++#include <sys/uio.h>
++#include <sys/un.h>
++#include <ctype.h>
++#include <errno.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
++#include <unistd.h>
+
+ MODULE_VERSION
+
+@@ -58,6 +68,14 @@
+ static int fix_nated_sdp_f(struct sip_msg *, char *, char *);
+ static int update_clen(struct sip_msg *, int);
+ static int extract_mediaip(str *, str *);
++static int extract_mediaport(str *, str *);
++static int alter_mediaip(struct sip_msg *, str *, str *, str *, int *, int);
++static int alter_mediaport(struct sip_msg *, str *, str *, str *, int *, int);
++static int fixate_sdp_f(struct sip_msg *, char *, char *);
++static char *send_rtpp_command(str *, char, int);
++static int unforce_rtp_proxy_f(struct sip_msg *, char *, char *);
++static int force_rtp_proxy_f(struct sip_msg *, char *, char *);
++
+ static void timer(unsigned int, void *);
+ inline static int fixup_str2int(void**, int);
+ static int mod_init(void);
+@@ -71,12 +89,15 @@
+ static cmd_export_t cmds[]={
+ {"fix_nated_contact", fix_nated_contact_f, 0, 0, REQUEST_ROUTE | ONREPLY_ROUTE },
+ {"fix_nated_sdp", fix_nated_sdp_f, 1, fixup_str2int, REQUEST_ROUTE | ONREPLY_ROUTE },
+- {0,0,0,0,0}
++ {"fixate_sdp", fixate_sdp_f, 0, 0, REQUEST_ROUTE | ONREPLY_ROUTE },
++ {"force_rtp_proxy", force_rtp_proxy_f, 0, 0, REQUEST_ROUTE | ONREPLY_ROUTE },
++ {"unforce_rtp_proxy", unforce_rtp_proxy_f, 0, 0, REQUEST_ROUTE | ONREPLY_ROUTE },
++ {0, 0, 0, 0, 0}
+ };
+
+ static param_export_t params[]={
+ {"natping_interval", INT_PARAM, &natping_interval},
+- {0,0,0}
++ {0, 0, 0}
+ };
+
+ struct module_exports exports={
+@@ -268,21 +289,28 @@
+
+ #define ADD_ADIRECTION 0x01
+ #define FIX_MEDIAIP 0x02
++#define ADD_ANORTPPROXY 0x04
+
+ #define ADIRECTION "a=direction:active\r\n"
+-#define ADIRECTION_LEN 21
++#define ADIRECTION_LEN 20
+
+ #define AOLDMEDIAIP "a=oldmediaip:"
+ #define AOLDMEDIAIP_LEN 13
+
++#define AOLDMEDIPRT "a=oldmediaport:"
++#define AOLDMEDIPRT_LEN 15
++
++#define ANORTPPROXY "a=nortpproxy:yes\r\n"
++#define ANORTPPROXY_LEN 18
++
+ #define CLEN_LEN 10
+
+ static int
+ fix_nated_sdp_f(struct sip_msg* msg, char* str1, char* str2)
+ {
+- str body, mediaip;
+- int level, added_len, offset, len;
+- char *buf, *cp;
++ str body, body1, oldip, oldip1, newip;
++ int level, added_len;
++ char *buf;
+ struct lump* anchor;
+
+ level = (int)(long)str1;
+@@ -293,82 +321,66 @@
+ return -1;
+ }
+
+- if (level & ADD_ADIRECTION) {
++ if (level & (ADD_ADIRECTION | ADD_ANORTPPROXY)) {
+ anchor = anchor_lump(&(msg->add_rm),
+ body.s + body.len - msg->buf, 0, 0);
+ if (anchor == NULL) {
+ LOG(L_ERR, "ERROR: fix_nated_sdp: anchor_lump failed\n");
+ return -1;
+ }
+- buf = pkg_malloc(ADIRECTION_LEN * sizeof(char));
+- if (buf == NULL) {
+- LOG(L_ERR, "ERROR: fix_nated_sdp: out of memory\n");
+- return -1;
++ if (level & ADD_ADIRECTION) {
++ buf = pkg_malloc(ADIRECTION_LEN * sizeof(char));
++ if (buf == NULL) {
++ LOG(L_ERR, "ERROR: fix_nated_sdp: out of memory\n");
++ return -1;
++ }
++ memcpy(buf, ADIRECTION, ADIRECTION_LEN);
++ if (insert_new_lump_after(anchor, buf, ADIRECTION_LEN, 0) == NULL) {
++ LOG(L_ERR, "ERROR: fix_nated_sdp: insert_new_lump_after failed\n");
++ pkg_free(buf);
++ return -1;
++ }
++ added_len += ADIRECTION_LEN;
+ }
+- memcpy(buf, ADIRECTION, ADIRECTION_LEN);
+- if (insert_new_lump_after(anchor, buf, ADIRECTION_LEN - 1, 0) == NULL) {
+- LOG(L_ERR, "ERROR: fix_nated_sdp: insert_new_lump_after failed\n");
+- pkg_free(buf);
+- return -1;
++ if (level & ADD_ANORTPPROXY) {
++ buf = pkg_malloc(ANORTPPROXY_LEN * sizeof(char));
++ if (buf == NULL) {
++ LOG(L_ERR, "ERROR: fix_nated_sdp: out of memory\n");
++ return -1;
++ }
++ memcpy(buf, ANORTPPROXY, ANORTPPROXY_LEN);
++ if (insert_new_lump_after(anchor, buf, ANORTPPROXY_LEN, 0) == NULL) {
++ LOG(L_ERR, "ERROR: fix_nated_sdp: insert_new_lump_after failed\n");
++ pkg_free(buf);
++ return -1;
++ }
++ added_len += ANORTPPROXY_LEN;
+ }
+- added_len += ADIRECTION_LEN - 1;
+ }
+
+ if (level & FIX_MEDIAIP) {
+- if (extract_mediaip(&body, &mediaip) == -1) {
++ if (extract_mediaip(&body, &oldip) == -1) {
+ LOG(L_ERR, "ERROR: fix_nated_sdp: can't extract media IP from the SDP\n");
+ goto finalise;
+ }
+-
+- /* check that updating mediaip is really necessary */
+- if (7 == mediaip.len && memcmp("0.0.0.0", mediaip.s, 7) == 0)
+- goto finalise;
+- cp = ip_addr2a(&msg->rcv.src_ip);
+- len = strlen(cp);
+- if (len == mediaip.len && memcmp(cp, mediaip.s, len) == 0)
+- goto finalise;
+-
+- anchor = anchor_lump(&(msg->add_rm),
+- body.s + body.len - msg->buf, 0, 0);
+- if (anchor == NULL) {
+- LOG(L_ERR, "ERROR: fix_nated_sdp: anchor_lump failed\n");
+- return -1;
+- }
+- buf = pkg_malloc(AOLDMEDIAIP_LEN + mediaip.len + CRLF_LEN);
+- if (buf == NULL) {
+- LOG(L_ERR, "ERROR: fix_nated_sdp: out of memory\n");
+- return -1;
+- }
+- memcpy(buf, AOLDMEDIAIP, AOLDMEDIAIP_LEN);
+- memcpy(buf + AOLDMEDIAIP_LEN, mediaip.s, mediaip.len);
+- memcpy(buf + AOLDMEDIAIP_LEN + mediaip.len, CRLF, CRLF_LEN);
+- if (insert_new_lump_after(anchor, buf,
+- AOLDMEDIAIP_LEN + mediaip.len + CRLF_LEN, 0) == NULL) {
+- LOG(L_ERR, "ERROR: fix_nated_sdp: insert_new_lump_after failed\n");
+- pkg_free(buf);
+- return -1;
++ body1.s = oldip.s + oldip.len;
++ body1.len = body.s + body.len - body1.s;
++ if (extract_mediaip(&body1, &oldip1) == -1) {
++ oldip1.len = 0;
+ }
+- added_len += AOLDMEDIAIP_LEN + mediaip.len + CRLF_LEN;
+
+- buf = pkg_malloc(len);
+- if (buf == NULL) {
+- LOG(L_ERR, "ERROR: fix_nated_sdp: out of memory\n");
+- return -1;
+- }
+- offset = mediaip.s - msg->buf;
+- anchor = del_lump(&msg->add_rm, offset, mediaip.len, 0);
+- if (anchor == NULL) {
+- LOG(L_ERR, "ERROR: fix_nated_sdp: del_lump failed\n");
+- pkg_free(buf);
++ newip.s = ip_addr2a(&msg->rcv.src_ip);
++ newip.len = strlen(newip.s);
++ if (alter_mediaip(msg, &body, &oldip, &newip,
++ &added_len, 1) == -1) {
++ LOG(L_ERR, "ERROR: fix_nated_sdp: can't alter media IP");
+ return -1;
+ }
+- memcpy(buf, cp, len);
+- if (insert_new_lump_after(anchor, buf, len, 0) == 0) {
+- LOG(L_ERR, "ERROR: fix_nated_sdp: insert_new_lump_after failed\n");
+- pkg_free(buf);
++ if (oldip1.len > 0 && alter_mediaip(msg, &body, &oldip1, &newip,
++ &added_len, 0) == -1) {
++ LOG(L_ERR, "ERROR: fix_nated_sdp: can't alter media IP");
+ return -1;
+ }
+- added_len += len - mediaip.len;
+ }
+
+ finalise:
+@@ -425,7 +437,7 @@
+ cp = cp1 + 2;
+ }
+ if (cp1 == NULL) {
+- LOG(L_ERR, "ERROR: extract_mediaip: no `c=' in SDP\n");
++ LOG(L_DBG, "ERROR: extract_mediaip: no `c=' in SDP\n");
+ return -1;
+ }
+ mediaip->s = cp1 + 2;
+@@ -449,6 +461,418 @@
+ LOG(L_ERR, "ERROR: extract_mediaip: no `IP4' in `c=' field\n");
+ return -1;
+ }
++ return 1;
++}
++
++static int
++extract_mediaport(str *body, str *mediaport)
++{
++ char *cp, *cp1;
++ int len;
++
++ cp1 = NULL;
++ for (cp = body->s; (len = body->s + body->len - cp) > 0;) {
++ cp1 = ser_memmem(cp, "m=", len, 2);
++ if (cp1 == NULL || cp1[-1] == '\n' || cp1[-1] == '\r')
++ break;
++ cp = cp1 + 2;
++ }
++ if (cp1 == NULL) {
++ LOG(L_ERR, "ERROR: extract_mediaport: no `m=' in SDP\n");
++ return -1;
++ }
++ mediaport->s = cp1 + 2;
++ mediaport->len = eat_line(mediaport->s, body->s + body->len -
++ mediaport->s) - mediaport->s;
++ trim_len(mediaport->len, mediaport->s, *mediaport);
++
++ if (mediaport->len < 7 || memcmp(mediaport->s, "audio", 5) != 0 ||
++ !isspace(mediaport->s[5])) {
++ LOG(L_ERR, "ERROR: extract_mediaport: can't parse `m=' in SDP\n");
++ return -1;
++ }
++ cp = eat_space_end(mediaport->s + 5, mediaport->s + mediaport->len);
++ mediaport->len = eat_token_end(cp, mediaport->s + mediaport->len) - cp;
++ mediaport->s = cp;
++ return 1;
++}
++
++static int
++alter_mediaip(struct sip_msg *msg, str *body, str *oldip, str *newip,
++ int *clendelta, int preserve)
++{
++ char *buf;
++ int offset;
++ struct lump* anchor;
++
++ /* check that updating mediaip is really necessary */
++ if (7 == oldip->len && memcmp("0.0.0.0", oldip->s, 7) == 0)
++ return 0;
++ if (newip->len == oldip->len &&
++ memcmp(newip->s, oldip->s, newip->len) == 0)
++ return 0;
++
++ if (preserve != 0) {
++ anchor = anchor_lump(&(msg->add_rm),
++ body->s + body->len - msg->buf, 0, 0);
++ if (anchor == NULL) {
++ LOG(L_ERR, "ERROR: alter_mediaip: anchor_lump failed\n");
++ return -1;
++ }
++ buf = pkg_malloc(AOLDMEDIAIP_LEN + oldip->len + CRLF_LEN);
++ if (buf == NULL) {
++ LOG(L_ERR, "ERROR: alter_mediaip: out of memory\n");
++ return -1;
++ }
++ memcpy(buf, AOLDMEDIAIP, AOLDMEDIAIP_LEN);
++ memcpy(buf + AOLDMEDIAIP_LEN, oldip->s, oldip->len);
++ memcpy(buf + AOLDMEDIAIP_LEN + oldip->len, CRLF, CRLF_LEN);
++ if (insert_new_lump_after(anchor, buf,
++ AOLDMEDIAIP_LEN + oldip->len + CRLF_LEN, 0) == NULL) {
++ LOG(L_ERR, "ERROR: alter_mediaip: insert_new_lump_after failed\n");
++ pkg_free(buf);
++ return -1;
++ }
++ *clendelta += AOLDMEDIAIP_LEN + oldip->len + CRLF_LEN;
++ }
++
++ buf = pkg_malloc(newip->len);
++ if (buf == NULL) {
++ LOG(L_ERR, "ERROR: alter_mediaip: out of memory\n");
++ return -1;
++ }
++ offset = oldip->s - msg->buf;
++ anchor = del_lump(&msg->add_rm, offset, oldip->len, 0);
++ if (anchor == NULL) {
++ LOG(L_ERR, "ERROR: alter_mediaip: del_lump failed\n");
++ pkg_free(buf);
++ return -1;
++ }
++ memcpy(buf, newip->s, newip->len);
++ if (insert_new_lump_after(anchor, buf, newip->len, 0) == 0) {
++ LOG(L_ERR, "ERROR: alter_mediaip: insert_new_lump_after failed\n");
++ pkg_free(buf);
++ return -1;
++ }
++ *clendelta += newip->len - oldip->len;
++ return 0;
++}
++
++static int
++alter_mediaport(struct sip_msg *msg, str *body, str *oldport, str *newport,
++ int *clendelta, int preserve)
++{
++ char *buf;
++ int offset;
++ struct lump* anchor;
++
++ /* check that updating mediaport is really necessary */
++ if (newport->len == oldport->len &&
++ memcmp(newport->s, oldport->s, newport->len) == 0)
++ return 0;
++
++ if (preserve != 0) {
++ anchor = anchor_lump(&(msg->add_rm),
++ body->s + body->len - msg->buf, 0, 0);
++ if (anchor == NULL) {
++ LOG(L_ERR, "ERROR: alter_mediaport: anchor_lump failed\n");
++ return -1;
++ }
++ buf = pkg_malloc(AOLDMEDIPRT_LEN + oldport->len + CRLF_LEN);
++ if (buf == NULL) {
++ LOG(L_ERR, "ERROR: alter_mediaport: out of memory\n");
++ return -1;
++ }
++ memcpy(buf, AOLDMEDIPRT, AOLDMEDIPRT_LEN);
++ memcpy(buf + AOLDMEDIPRT_LEN, oldport->s, oldport->len);
++ memcpy(buf + AOLDMEDIPRT_LEN + oldport->len, CRLF, CRLF_LEN);
++ if (insert_new_lump_after(anchor, buf,
++ AOLDMEDIPRT_LEN + oldport->len + CRLF_LEN, 0) == NULL) {
++ LOG(L_ERR, "ERROR: alter_mediaport: insert_new_lump_after failed\n");
++ pkg_free(buf);
++ return -1;
++ }
++ *clendelta += AOLDMEDIPRT_LEN + oldport->len + CRLF_LEN;
++ }
++
++ buf = pkg_malloc(newport->len);
++ if (buf == NULL) {
++ LOG(L_ERR, "ERROR: alter_mediaport: out of memory\n");
++ return -1;
++ }
++ offset = oldport->s - msg->buf;
++ anchor = del_lump(&msg->add_rm, offset, oldport->len, 0);
++ if (anchor == NULL) {
++ LOG(L_ERR, "ERROR: alter_mediaport: del_lump failed\n");
++ pkg_free(buf);
++ return -1;
++ }
++ memcpy(buf, newport->s, newport->len);
++ if (insert_new_lump_after(anchor, buf, newport->len, 0) == 0) {
++ LOG(L_ERR, "ERROR: alter_mediaport: insert_new_lump_after failed\n");
++ pkg_free(buf);
++ return -1;
++ }
++ *clendelta += newport->len - oldport->len;
++ return 0;
++}
++
++static int
++fixate_sdp_f(struct sip_msg* msg, char* str1, char* str2)
++{
++ char *cp, *cp1;
++ int len, cldelta;
++ str body, body1, newip, newip1, newport, dest, oldip, oldport;
++ struct sip_uri ruri;
++ struct hdr_field *hdr;
++ struct via_body *rvia;
++
++ if (msg->first_line.type == SIP_REQUEST &&
++ msg->first_line.u.request.method_value == METHOD_INVITE) {
++ LOG(L_ERR, "DEBUG: fixate_sdp: request\n");
++ if (msg->parsed_uri_ok) {
++ dest = msg->parsed_uri.host;
++ } else {
++ if (parse_uri(msg->new_uri.s, msg->new_uri.len, &ruri) < 0) {
++ LOG(L_ERR, "ERROR: fixate_sdp: can't parse request uri\n");
++ return -1;
++ }
++ dest = ruri.host;
++ }
++ } else if (msg->first_line.type == SIP_REPLY) {
++ LOG(L_ERR, "DEBUG: fixate_sdp: reply\n");
++ rvia = NULL;
++ for (hdr=msg->headers; hdr; hdr=hdr->next) {
++ if (hdr->type == HDR_VIA)
++ rvia = hdr->parsed;
++ }
++ if (rvia == NULL) {
++ LOG(L_ERR, "ERROR: fixate_sdp: no or incorrect Via in reply\n");
++ return -1;
++ }
++ if (rvia->received != NULL) {
++ dest = rvia->received->value;
++ } else {
++ dest = rvia->host;
++ }
++ } else {
++ return -1;
++ }
++
++ if (extract_body(msg, &body) == -1 || body.len == 0)
++ return -1;
++ if (extract_mediaip(&body, &newip) == -1) {
++ LOG(L_ERR, "ERROR: fixate_sdp: can't extract media IP from the SDP\n");
++ return -1;
++ }
++ body1.s = newip.s + newip.len;
++ body1.len = body.s + body.len - body1.s;
++ if (extract_mediaip(&body1, &newip1) == -1) {
++ newip1.len = 0;
++ }
++ if (newip.len != dest.len || memcmp(newip.s, dest.s, dest.len) != 0)
++ return -1;
++ if (extract_mediaport(&body, &newport) == -1) {
++ LOG(L_ERR, "ERROR: fixate_sdp: can't extract media port from the SDP\n");
++ return -1;
++ }
++
++ for (cp = body.s; (len = body.s + body.len - cp) >= AOLDMEDIAIP_LEN;) {
++ cp1 = ser_memmem(cp, AOLDMEDIAIP, len, AOLDMEDIAIP_LEN);
++ if (cp1 == NULL || cp1[-1] == '\n' || cp1[-1] == '\r')
++ break;
++ cp = cp1 + AOLDMEDIAIP_LEN;
++ }
++ if (cp1 == NULL) {
++ oldip.len = 0;
++ } else {
++ oldip.s = cp1 + AOLDMEDIAIP_LEN;
++ oldip.len = eat_line(oldip.s, body.s + body.len -
++ oldip.s) - oldip.s;
++ trim_len(oldip.len, oldip.s, oldip);
++ }
++ if (newip.len == oldip.len &&
++ memcmp(newip.s, oldip.s, newip.len) == 0)
++ oldip.len = 0;
++
++ for (cp = body.s; (len = body.s + body.len - cp) >= AOLDMEDIPRT_LEN;) {
++ cp1 = ser_memmem(cp, AOLDMEDIPRT, len, AOLDMEDIPRT_LEN);
++ if (cp1 == NULL || cp1[-1] == '\n' || cp1[-1] == '\r')
++ break;
++ cp = cp1 + AOLDMEDIPRT_LEN;
++ }
++ if (cp1 == NULL) {
++ oldport.len = 0;
++ } else {
++ oldport.s = cp1 + AOLDMEDIPRT_LEN;
++ oldport.len = eat_line(oldport.s, body.s + body.len -
++ oldport.s) - oldport.s;
++ trim_len(oldport.len, oldport.s, oldport);
++ }
++ if (newport.len == oldport.len &&
++ memcmp(newport.s, oldport.s, newport.len) == 0)
++ oldport.len = 0;
++
++ cldelta = 0;
++
++ if (oldip.len != 0) {
++ if (alter_mediaip(msg, &body, &newip, &oldip,
++ &cldelta, 0) == -1)
++ return -1;
++ if (newip1.len > 0 && alter_mediaip(msg, &body1, &newip1,
++ &oldip, &cldelta, 0) == -1)
++ return -1;
++ }
++ if (oldport.len != 0 &&
++ alter_mediaport(msg, &body, &newport, &oldport, &cldelta, 0) == -1)
++ return -1;
++
++ if (cldelta == 0)
++ return 1;
++
++ return (update_clen(msg, body.len + cldelta));
++}
++
++static char *
++send_rtpp_command(str *callid, char command, int getreply)
++{
++ struct sockaddr_un addr;
++ int fd, len;
++ struct iovec v[3];
++ static char buf[16];
++ char cmd[2] = {' ', ' '};
++
++ memset(&addr, 0, sizeof(addr));
++ addr.sun_family = AF_LOCAL;
++ strncpy(addr.sun_path, "/var/run/rtpproxy.sock",
++ sizeof(addr.sun_path) - 1);
++#if !defined(__linux__)
++ addr.sun_len = strlen(addr.sun_path);
++#endif
++
++ fd = socket(AF_LOCAL, SOCK_STREAM, 0);
++ if (fd < 0) {
++ LOG(L_ERR, "ERROR: send_rtpp_command: can't create socket\n");
++ return NULL;
++ }
++ if (connect(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
++ close(fd);
++ LOG(L_ERR, "ERROR: send_rtpp_command: can't connect to RTP proxy\n");
++ return NULL;
++ }
++
++ cmd[0] = command;
++ v[0].iov_base = cmd;
++ v[0].iov_len = 2;
++ v[1].iov_base = callid->s;
++ v[1].iov_len = callid->len;
++ v[2].iov_base = "\n";
++ v[2].iov_len = 1;
++ do {
++ len = writev(fd, v, 3);
++ } while (len == -1 && errno == EINTR);
++ if (len <= 0) {
++ close(fd);
++ LOG(L_ERR, "ERROR: send_rtpp_command: can't send command to a RTP proxy\n");
++ return NULL;
++ }
++
++ if (getreply != 0) {
++ do {
++ len = read(fd, buf, sizeof(buf) - 1);
++ } while (len == -1 && errno == EINTR);
++ close(fd);
++ if (len <= 0) {
++ LOG(L_ERR, "ERROR: send_rtpp_command: can't read reply from a RTP proxy\n");
++ return NULL;
++ }
++ buf[len] = '\0';
++ }
++
++ return buf;
++}
++
++static int
++unforce_rtp_proxy_f(struct sip_msg* msg, char* str1, char* str2)
++{
++
++ if (msg->callid == NULL || msg->callid->body.len <= 0) {
++ LOG(L_ERR, "ERROR: unforce_rtp_proxy: no Call-Id field\n");
++ return -1;
++ }
++ send_rtpp_command(&(msg->callid->body), 'D', 0);
++
++ return 1;
++}
++
++static int
++force_rtp_proxy_f(struct sip_msg* msg, char* str1, char* str2)
++{
++ str body, body1, oldport, oldip, oldip1, newport, newip;
++ int create, port, cldelta, len;
++ char buf[16];
++ char *cp, *cp1;
++
++ if (msg->first_line.type == SIP_REQUEST &&
++ msg->first_line.u.request.method_value == METHOD_INVITE) {
++ create = 1;
++ } else if (msg->first_line.type == SIP_REPLY) {
++ create = 0;
++ } else {
++ return -1;
++ }
++ if (msg->callid == NULL || msg->callid->body.len <= 0) {
++ LOG(L_ERR, "ERROR: force_rtp_proxy: no Call-Id field\n");
++ return -1;
++ }
++ if (extract_body(msg, &body) == -1 || body.len == 0)
++ return -1;
++ for (cp = body.s; (len = body.s + body.len - cp) >= ANORTPPROXY_LEN;) {
++ cp1 = ser_memmem(cp, ANORTPPROXY, len, ANORTPPROXY_LEN);
++ if (cp1 == NULL)
++ break;
++ if (cp1[-1] == '\n' || cp1[-1] == '\r')
++ return 1;
++ cp = cp1 + ANORTPPROXY_LEN;
++ }
++ if (extract_mediaip(&body, &oldip) == -1) {
++ LOG(L_ERR, "ERROR: force_rtp_proxy: can't extract media IP from the message\n");
++ return -1;
++ }
++ body1.s = oldip.s + oldip.len;
++ body1.len = body.s + body.len - body1.s;
++ if (extract_mediaip(&body1, &oldip1) == -1) {
++ oldip1.len = 0;
++ }
++ if (extract_mediaport(&body, &oldport) == -1) {
++ LOG(L_ERR, "ERROR: force_rtp_proxy: can't extract media port from the message\n");
++ return -1;
++ }
++ cp = send_rtpp_command(&(msg->callid->body), create ? 'U' : 'L', 1);
++ if (cp == NULL)
++ return -1;
++ port = atoi(cp);
++ if (port <= 0 || port > 65535)
++ return -1;
++
++ newport.s = buf;
++ newport.len = sprintf(buf, "%d", port);
++ newip.s = ip_addr2a(&msg->rcv.dst_ip);
++ newip.len = strlen(newip.s);
++
++ cldelta = 0;
++ if (alter_mediaip(msg, &body, &oldip, &newip, &cldelta, 0) == -1)
++ return -1;
++ if (oldip1.len > 0 &&
++ alter_mediaip(msg, &body1, &oldip1, &newip, &cldelta, 0) == -1)
++ return -1;
++ if (alter_mediaport(msg, &body, &oldport, &newport, &cldelta, 0) == -1)
++ return -1;
++
++ if (cldelta == 0)
++ return 1;
++
++ return (update_clen(msg, body.len + cldelta));
+ return 1;
+ }
+
diff --git a/net/ser/files/patch-modules::postgres::Makefile b/net/ser/files/patch-modules::postgres::Makefile
new file mode 100644
index 000000000000..565fa42e2bf2
--- /dev/null
+++ b/net/ser/files/patch-modules::postgres::Makefile
@@ -0,0 +1,14 @@
+
+$FreeBSD$
+
+--- modules/postgres/Makefile.orig Wed Jul 30 19:34:46 2003
++++ modules/postgres/Makefile Wed Sep 10 19:40:11 2003
+@@ -7,7 +7,7 @@
+ NAME=postgres.so
+
+ # libpq-fe.h locations
+-DEFS +=-I/usr/local/pgsql/include -I/usr/include/postgresql
++DEFS +=-I$(LOCALBASE)/pgsql/include -I/usr/include/postgresql
+ LIBS=-L$(LOCALBASE)/pgsql/lib -L$(LOCALBASE)/lib/pgsql -L/usr/pkg/lib \
+ -L/usr/pkg/lib/pgsql -lpq
+
diff --git a/net/ser/files/patch-modules::tm::t_lookup.c b/net/ser/files/patch-modules::tm::t_lookup.c
new file mode 100644
index 000000000000..c3de97915c98
--- /dev/null
+++ b/net/ser/files/patch-modules::tm::t_lookup.c
@@ -0,0 +1,25 @@
+
+$FreeBSD$
+
+--- modules/tm/t_lookup.c 2003/07/29 04:01:00 1.1
++++ modules/tm/t_lookup.c 2003/07/29 04:05:47
+@@ -94,8 +94,8 @@
+ #include "t_lookup.h"
+
+ #define EQ_VIA_LEN(_via)\
+- ( (p_msg->via1->bsize-(p_msg->_via->name.s-(p_msg->_via->hdr.s+p_msg->_via->hdr.len)))==\
+- (t_msg->via1->bsize-(t_msg->_via->name.s-(t_msg->_via->hdr.s+t_msg->_via->hdr.len))) )
++ ( (p_msg->_via->port_str.s + p_msg->_via->port_str.len - p_msg->_via->name.s)==\
++ (t_msg->_via->port_str.s + t_msg->_via->port_str.len - t_msg->_via->name.s) )
+
+
+
+@@ -113,7 +113,7 @@
+ #define EQ_VIA_STR(_via)\
+ ( memcmp( t_msg->_via->name.s,\
+ p_msg->_via->name.s,\
+- (t_msg->via1->bsize-(t_msg->_via->name.s-(t_msg->_via->hdr.s+t_msg->_via->hdr.len)))\
++ (t_msg->_via->port_str.s+t_msg->_via->port_str.len - t_msg->_via->name.s)\
+ )==0 )
+
+
diff --git a/net/ser/files/patch-modules::uri_radius::urirad_mod.c b/net/ser/files/patch-modules::uri_radius::urirad_mod.c
new file mode 100644
index 000000000000..ca5c31a8b285
--- /dev/null
+++ b/net/ser/files/patch-modules::uri_radius::urirad_mod.c
@@ -0,0 +1,14 @@
+
+$FreeBSD$
+
+--- modules/uri_radius/urirad_mod.c 2003/07/06 18:04:54 1.1
++++ modules/uri_radius/urirad_mod.c 2003/07/06 18:05:59
+@@ -48,7 +48,7 @@
+ /*
+ * Module parameter variables
+ */
+-char* radius_config = "/usr/local/etc/radiusclient/radiusclient.conf";
++char* radius_config = (CFG_DIR "radiusclient.conf");
+ int service_type = PW_CALL_CHECK;
+
+ /*
diff --git a/net/ser/files/patch-udp_server.c b/net/ser/files/patch-udp_server.c
new file mode 100644
index 000000000000..8db2d07294d7
--- /dev/null
+++ b/net/ser/files/patch-udp_server.c
@@ -0,0 +1,16 @@
+
+$FreeBSD$
+
+--- udp_server.c.orig Sat Jun 21 21:38:32 2003
++++ udp_server.c Sun Jul 6 20:53:30 2003
+@@ -326,6 +326,10 @@
+ continue; /* goto skip;*/
+ else goto error;
+ }
++ if (len < 8) {
++ /* Message is too short, just drop it already */
++ continue;
++ }
+ /* we must 0-term the messages, receive_msg expects it */
+ buf[len]=0; /* no need to save the previous char */
+
diff --git a/net/ser/pkg-descr b/net/ser/pkg-descr
new file mode 100644
index 000000000000..4b0f142a2302
--- /dev/null
+++ b/net/ser/pkg-descr
@@ -0,0 +1,15 @@
+ser or SIP Express Router is a very fast and flexible SIP (RFC3621)
+proxy server. Written entirely in C, ser can handle thousands calls
+per second even on low-budget hardware. C Shell like scripting language
+provides full control over the server's behaviour. It's modular
+architecture allows only required functionality to be loaded.
+Currently the following modules are available: Digest Authentication,
+CPL scripts, Instant Messaging, MySQL support, Presence Agent, Radius
+Authentication, Record Routing, SMS Gateway, Jabber Gateway, Transaction
+Module, Registrar and User Location.
+
+
+WWW: http://www.iptel.org/ser/
+
+- Andrei Pelinescu-Onciul
+pelinescu-onciul@fokus.gmd.de
diff --git a/net/ser/pkg-plist b/net/ser/pkg-plist
new file mode 100644
index 000000000000..566bba4535a9
--- /dev/null
+++ b/net/ser/pkg-plist
@@ -0,0 +1,70 @@
+etc/ser/radiusclient.conf.default
+etc/ser/ser.cfg.sample
+etc/ser/servers.sample
+etc/ser/sip_dictionary
+lib/ser/modules/acc.so
+lib/ser/modules/auth.so
+lib/ser/modules/auth_db.so
+lib/ser/modules/auth_radius.so
+lib/ser/modules/dbtext.so
+lib/ser/modules/domain.so
+lib/ser/modules/enum.so
+lib/ser/modules/exec.so
+lib/ser/modules/group.so
+lib/ser/modules/maxfwd.so
+lib/ser/modules/msilo.so
+lib/ser/modules/mysql.so
+lib/ser/modules/nathelper.so
+lib/ser/modules/pa.so
+lib/ser/modules/permissions.so
+lib/ser/modules/pike.so
+lib/ser/modules/print.so
+lib/ser/modules/registrar.so
+lib/ser/modules/rr.so
+lib/ser/modules/sl.so
+lib/ser/modules/sms.so
+lib/ser/modules/textops.so
+lib/ser/modules/tm.so
+lib/ser/modules/uri.so
+lib/ser/modules/usrloc.so
+lib/ser/modules/xlog.so
+lib/ser/modules/vm.so
+sbin/gen_ha1
+sbin/ser
+sbin/ser_mysql.sh
+sbin/serctl
+share/doc/ser/AUTHORS
+share/doc/ser/INSTALL
+share/doc/ser/NEWS
+share/doc/ser/README
+share/doc/ser/README-MODULES
+share/doc/ser/README.acc
+share/doc/ser/README.auth
+share/doc/ser/README.auth_db
+share/doc/ser/README.auth_radius
+share/doc/ser/README.dbtext
+share/doc/ser/README.domain
+share/doc/ser/README.enum
+share/doc/ser/README.exec
+share/doc/ser/README.group
+share/doc/ser/README.maxfwd
+share/doc/ser/README.msilo
+share/doc/ser/README.nathelper
+share/doc/ser/README.pa
+share/doc/ser/README.permissions
+share/doc/ser/README.pike
+share/doc/ser/README.print
+share/doc/ser/README.registrar
+share/doc/ser/README.rr
+share/doc/ser/README.sl
+share/doc/ser/README.sms
+share/doc/ser/README.textops
+share/doc/ser/README.tm
+share/doc/ser/README.uri
+share/doc/ser/README.usrloc
+share/doc/ser/README.xlog
+share/doc/ser/README.vm
+@dirrm share/doc/ser
+@dirrm lib/ser/modules
+@dirrm lib/ser
+@dirrm etc/ser