This page recounts how I built Seagull on Ubuntu 15.04. You can follow the steps and hopefully be able to build successfully as well.
CAUTION: Use these instructions if you're starting with a fresh Subversion to Git clone of Seagull. Otherwise, use the instructions from the section titled 'Build Instructions with Patches' in the README.rst file.
Install pre-requisites.
user@host:~$ sudo aptitude install build-essential curl git git-svn libglib2.0-dev ksh bison flex subversion
Find information about the latest revision.
user@host:~$ svn info https://svn.code.sf.net/p/gull/code/
Clone the Seagull svn repo into a git repo. This is a personal preference as I like to work with git and it allowed me to share this repo on GitHub.
user@host:~$ git svn clone svn://svn.code.sf.net/p/gull/code/ ~/opt/src/seagull user@host:~$ cd ~/opt/src/seagull user@host:~/opt/src/seagull$ git branch build master user@host:~/opt/src/seagull$ git checkout build
Download the latest sctplib and socketapi tarballs from http://www.sctp.de/ to the external-lib-src directory. They were are version 1.0.15 and 2.2.8 respectively at the time of writing.
user@host:~$ cd ~/opt/src/seagull/seagull/trunk/src user@host:~/opt/src/seagull/seagull/trunk/src$ curl -o ~/opt/src/seagull/seagull/trunk/src/external-lib-src/sctplib-1.0.15.tar.gz http://www.sctp.de/download/sctplib-1.0.15.tar.gz user@host:~/opt/src/seagull/seagull/trunk/src$ curl -o ~/opt/src/seagull/seagull/trunk/src/external-lib-src/socketapi-2.2.8.tar.gz http://www.sctp.de/download/socketapi-2.2.8.tar.gz
Edit build-ext-lib.conf and update the versions of these two libraries. First (optional) run a diff to make sure things look OK. Then just run sed to make the changes. Adjust the versions if you downloaded different versions.
user@host:~/opt/src/seagull/seagull/trunk/src$ diff build-ext-lib.conf <(sed -e 's/sctplib-1.0.5/sctplib-1.0.15/g' -e 's/socketapi-1.9.0/socketapi-2.2.8/g' build-ext-lib.conf) 74,75c74,75 < EXTBUILD_1_FILE=sctplib-1.0.5.tar.gz < EXTBUILD_1_DIR=sctplib-1.0.5 --- > EXTBUILD_1_FILE=sctplib-1.0.15.tar.gz > EXTBUILD_1_DIR=sctplib-1.0.15 82,83c82,83 < EXTBUILD_2_FILE=socketapi-1.9.0.tar.gz < EXTBUILD_2_DIR=socketapi-1.9.0 --- > EXTBUILD_2_FILE=socketapi-2.2.8.tar.gz > EXTBUILD_2_DIR=socketapi-2.2.8 user@host:~/opt/src/seagull/seagull/trunk/src$ sed -i -e 's/sctplib-1.0.5/sctplib-1.0.15/g' -e 's/socketapi-1.9.0/socketapi-2.2.8/g' build-ext-lib.conf
Make sure in the build.conf file all lines starting with BUILD_9 are uncommented to add SCTP support.
user@host:~/opt/src/seagull/seagull/trunk/src$ sed -i -e 's/^#BUILD_9/BUILD_9/g' build.conf
Download the latest OpenSSL tarball to the external-lib-src directory. It was 1.0.2a at the time of writing.
user@host:~$ cd ~/opt/src/seagull/seagull/trunk/src user@host:~/opt/src/seagull/seagull/trunk/src$ curl -o ~/opt/src/seagull/seagull/trunk/src/external-lib-src/openssl-1.0.2a.tar.gz https://www.openssl.org/source/openssl-1.0.2a.tar.gz
Edit build-ext-lib.conf and update the version of this library. Adjust the version if you downloaded a different version.
user@host:~/opt/src/seagull/seagull/trunk/src$ diff build-ext-lib.conf <(sed -e 's/openssl-0.9.8c/openssl-1.0.2a/g' build-ext-lib.conf) 90,91c90,91 < EXTBUILD_3_FILE=openssl-0.9.8c.tar.gz < EXTBUILD_3_DIR=openssl-0.9.8c --- > EXTBUILD_3_FILE=openssl-1.0.2a.tar.gz > EXTBUILD_3_DIR=openssl-1.0.2a user@host:~/opt/src/seagull/seagull/trunk/src$ sed -i -e 's/openssl-0.9.8c/openssl-1.0.2a/g' build-ext-lib.conf
Make sure in the build.conf file all lines starting with BUILD_10 are uncommented to add TLS support.
user@host:~/opt/src/seagull/seagull/trunk/src$ sed -i -e 's/^#BUILD_10/BUILD_10/g' build.conf
Build libraries for SCTP and TLS.
user@host:~/opt/src/seagull/seagull/trunk/src$ ksh build-ext-lib.ksh
user@host:~/opt/src/seagull/seagull/trunk/src$ diff build.conf <(sed -e 's/^BUILD_TCAP/#BUILD_TCAP/g' -e 's/^BUILD_8/#BUILD_8/g' build.conf) 144,147c144,147 < BUILD_TCAP_LIB_CC_LINUX=g++ < BUILD_TCAP_LIB_CC_FLAGS_LINUX="-D_GNU_SOURCE -DTCAP_API100 -D_REENTRANT -shared -Wall -fPIC -Werror -I/opt/OC/include -I./octcap_include" < BUILD_TCAP_LIB_LD_LINUX=g++ < BUILD_TCAP_LIB_LD_FLAGS_LINUX="-shared -fPIC" --- > #BUILD_TCAP_LIB_CC_LINUX=g++ > #BUILD_TCAP_LIB_CC_FLAGS_LINUX="-D_GNU_SOURCE -DTCAP_API100 -D_REENTRANT -shared -Wall -fPIC -Werror -I/opt/OC/include -I./octcap_include" > #BUILD_TCAP_LIB_LD_LINUX=g++ > #BUILD_TCAP_LIB_LD_FLAGS_LINUX="-shared -fPIC" 149c149 < BUILD_TCAP_LIB_LD_LIBS_LINUX="-lm -L/opt/OC/lib -lntl -lTTL -lTTLBase" --- > #BUILD_TCAP_LIB_LD_LIBS_LINUX="-lm -L/opt/OC/lib -lntl -lTTL -lTTLBase" 202,207c202,207 < BUILD_TCAP_LIB_CC_HP_UX=aCC < BUILD_TCAP_LIB_CC_FLAGS_HP_UX="-Aa +Z +DAportable +p -D_HPUX_SOURCE -DTCAP_API100 -D_XOPEN_SOURCE=500 -D_XOPEN_SOURCE_EXTENDED `check_dlopen_usage` -I/opt/OC/include -I./octcap_include" < BUILD_TCAP_LIB_CC_FLAGS_HP_UX_IA64="-AP -Aa +Z +p +DD64 -D_HPUX_SOURCE -DTCAP_API100 -D_XOPEN_SOURCE=500 -D_XOPEN_SOURCE_EXTENDED `check_dlopen_usage` -I/opt/OC/include -I./octcap_include" < BUILD_TCAP_LIB_LD_HP_UX=aCC < BUILD_TCAP_LIB_LD_FLAGS_HP_UX="-b" < BUILD_TCAP_LIB_LD_FLAGS_HP_UX_IA64="-b +DD64" --- > #BUILD_TCAP_LIB_CC_HP_UX=aCC > #BUILD_TCAP_LIB_CC_FLAGS_HP_UX="-Aa +Z +DAportable +p -D_HPUX_SOURCE -DTCAP_API100 -D_XOPEN_SOURCE=500 -D_XOPEN_SOURCE_EXTENDED `check_dlopen_usage` -I/opt/OC/include -I./octcap_include" > #BUILD_TCAP_LIB_CC_FLAGS_HP_UX_IA64="-AP -Aa +Z +p +DD64 -D_HPUX_SOURCE -DTCAP_API100 -D_XOPEN_SOURCE=500 -D_XOPEN_SOURCE_EXTENDED `check_dlopen_usage` -I/opt/OC/include -I./octcap_include" > #BUILD_TCAP_LIB_LD_HP_UX=aCC > #BUILD_TCAP_LIB_LD_FLAGS_HP_UX="-b" > #BUILD_TCAP_LIB_LD_FLAGS_HP_UX_IA64="-b +DD64" 209c209 < BUILD_TCAP_LIB_LD_LIBS_HP_UX="-lm -L/opt/OC/lib -lntl -lTTL -lTTLBase" --- > #BUILD_TCAP_LIB_LD_LIBS_HP_UX="-lm -L/opt/OC/lib -lntl -lTTL -lTTLBase" 211c211 < BUILD_TCAP_LIB_LD_LIBS_HP_UX_IA64="-lm -lxnet -L/opt/OC/lib -lntl -lTTL -lTTLBase" --- > #BUILD_TCAP_LIB_LD_LIBS_HP_UX_IA64="-lm -lxnet -L/opt/OC/lib -lntl -lTTL -lTTLBase" 323,325c323,325 < BUILD_8_NAME="libtrans_octcap.so" < BUILD_8_TYPE=tcap_lib < BUILD_8_MODULES="common transport-frame protocol-frame library-trans-octcap32" --- > #BUILD_8_NAME="libtrans_octcap.so" > #BUILD_8_TYPE=tcap_lib > #BUILD_8_MODULES="common transport-frame protocol-frame library-trans-octcap32" user@host:~/opt/src/seagull/seagull/trunk/src$ sed -i -e 's/^BUILD_TCAP/#BUILD_TCAP/g' -e 's/^BUILD_8/#BUILD_8/g' build.conf
First clean up previous build attempts and then build. Upon encountering errors, as you surely will without the patches, fix the error and run these two commands again.
user@host:~/opt/src/seagull/seagull/trunk/src$ ksh build.ksh -target clean user@host:~/opt/src/seagull/seagull/trunk/src$ ksh build.ksh -target all
First error.
[Compiling library-trans-extsctp/C_SocketSCTP.cpp] library-trans-extsctp/C_SocketSCTP.cpp: In member function ‘void C_SocketSCTPWithData::sctp_event_handler(C_TransportEvent*)’: library-trans-extsctp/C_SocketSCTP.cpp:429:29: error: variable ‘ssf’ set but not used [-Werror=unused-but-set-variable] struct sctp_send_failed *ssf; ^ library-trans-extsctp/C_SocketSCTP.cpp:431:29: error: variable ‘sre’ set but not used [-Werror=unused-but-set-variable] struct sctp_remote_error *sre; ^ library-trans-extsctp/C_SocketSCTP.cpp:435:23: error: variable ‘sin’ set but not used [-Werror=unused-but-set-variable] struct sockaddr_in *sin; ^ library-trans-extsctp/C_SocketSCTP.cpp:436:24: error: variable ‘sin6’ set but not used [-Werror=unused-but-set-variable] struct sockaddr_in6 *sin6; ^ cc1plus: all warnings being treated as errors /home/myusername/opt/src/seagull/seagull/trunk/src/work-1.8.3/dep-libtrans_extsctp.so.mk:82: recipe for target '/home/myusername/opt/src/seagull/seagull/trunk/src/work-1.8.3/C_SocketSCTP.o' failed make[1]: *** [/home/myusername/opt/src/seagull/seagull/trunk/src/work-1.8.3/C_SocketSCTP.o] Error 1 make[1]: Leaving directory '/home/myusername/opt/src/seagull/seagull/trunk/src' /home/myusername/opt/src/seagull/seagull/trunk/src/work-1.8.3/project.mk:66: recipe for target 'all_libtrans_extsctp.so' failed make: *** [all_libtrans_extsctp.so] Error 2
Fix for first error.
diff --git a/seagull/trunk/src/library-trans-extsctp/C_SocketSCTP.cpp b/seagull/trunk/src/library-trans-extsctp/C_SocketSCTP.cpp index 777924e..25e0747 100755 --- a/seagull/trunk/src/library-trans-extsctp/C_SocketSCTP.cpp +++ b/seagull/trunk/src/library-trans-extsctp/C_SocketSCTP.cpp @@ -426,14 +426,10 @@ void C_SocketSCTPWithData::set_properties() { void C_SocketSCTPWithData::sctp_event_handler (C_TransportEvent *P_event) { struct sctp_assoc_change *sac; - struct sctp_send_failed *ssf; struct sctp_paddr_change *spc; - struct sctp_remote_error *sre; union sctp_notification *snp; // char addrbuf[INET6_ADDRSTRLEN]; // const char *ap; - struct sockaddr_in *sin; - struct sockaddr_in6 *sin6; snp = (union sctp_notification *)m_read_buf; @@ -511,14 +507,6 @@ void C_SocketSCTPWithData::sctp_event_handler (C_TransportEvent *P_event) { break; - case SCTP_SEND_FAILED: - ssf = &snp->sn_send_failed; - SOCKET_DEBUG(0, "C_SocketSCTPWithData::sctp_event_handler() " << - "EVENT sendfailed: len=" - << ssf->ssf_length - << " err=" << ssf->ssf_error); - break; - case SCTP_PEER_ADDR_CHANGE: spc = &snp->sn_paddr_change; @@ -553,22 +541,10 @@ void C_SocketSCTPWithData::sctp_event_handler (C_TransportEvent *P_event) { break ; } /* end switch */ - if (spc->spc_aaddr.ss_family == AF_INET) { - sin = (struct sockaddr_in *)&spc->spc_aaddr; - // ap = inet_ntop(AF_INET, &sin->sin_addr, addrbuf, INET6_ADDRSTRLEN); - } else { - sin6 = (struct sockaddr_in6 *)&spc->spc_aaddr; - // ap = inet_ntop(AF_INET6, &sin6->sin6_addr, addrbuf, INET6_ADDRSTRLEN); - } // printf("EVENT intf_change: %s state=%d, error=%d\n", ap, spc->spc_state, spc->spc_error); // printf("EVENT intf_change: state=%d, error=%d\n", spc->spc_state, spc->spc_error); break; - case SCTP_REMOTE_ERROR: - sre = &snp->sn_remote_error; - // printf("EVENT: remote_error: err=%hu len=%hu\n", ntohs(sre->sre_error), ntohs(sre->sre_length)); - break; - case SCTP_ADAPTATION_INDICATION: SOCKET_DEBUG(0, "C_SocketSCTPWithData::sctp_event_handler() " << "EVENT: ADAPTATION INDICATION");
Second error after fixing the first error.
[Compiling library-trans-tls/C_TransIPTLS.cpp] library-trans-tls/C_TransIPTLS.cpp:36:1: error: invalid conversion from ‘const SSL_METHOD* (*)() {aka const ssl_method_st* (*)()}’ to ‘C_TransIPTLS::T_SSLMethodType {aka ssl_method_st* (*)()}’ [-fpermissive] } ; ^ /home/myusername/opt/src/seagull/seagull/trunk/src/work-1.8.3/dep-libtrans_iptls.so.mk:80: recipe for target '/home/myusername/opt/src/seagull/seagull/trunk/src/work-1.8.3/C_TransIPTLS.o' failed make[1]: *** [/home/myusername/opt/src/seagull/seagull/trunk/src/work-1.8.3/C_TransIPTLS.o] Error 1 make[1]: Leaving directory '/home/myusername/opt/src/seagull/seagull/trunk/src' /home/myusername/opt/src/seagull/seagull/trunk/src/work-1.8.3/project.mk:74: recipe for target 'all_libtrans_iptls.so' failed make: *** [all_libtrans_iptls.so] Error 2
Fix for the second error.
diff --git a/seagull/trunk/src/library-trans-tls/C_TransIPTLS.hpp b/seagull/trunk/src/library-trans-tls/C_TransIPTLS.hpp index 83884ab..8231550 100644 --- a/seagull/trunk/src/library-trans-tls/C_TransIPTLS.hpp +++ b/seagull/trunk/src/library-trans-tls/C_TransIPTLS.hpp @@ -38,7 +38,7 @@ public: virtual int config (T_pConfigValueList P_config_param_list) ; - typedef SSL_METHOD* (*T_SSLMethodType)(void); + typedef const SSL_METHOD* (*T_SSLMethodType)(void); typedef struct _T_supported_methods { char *m_name ; T_SSLMethodType m_method ;
Third error after fixing the second error.
[Compiling library-crypto/auth.c] library-crypto/auth.c: In function ‘int createAuthHeaderAKAv1MD5(char*, char*, char*, char*, char*, char*, char*, char*, char*, char*)’: library-crypto/auth.c:502:21: error: variable ‘resuf’ set but not used [-Werror=unused-but-set-variable] int has_auts = 0, resuf = 1; ^ cc1plus: all warnings being treated as errors /home/myusername/opt/src/seagull/seagull/trunk/src/work-1.8.3/dep-lib_crypto.so.mk:54: recipe for target '/home/myusername/opt/src/seagull/seagull/trunk/src/work-1.8.3/auth.o' failed make[1]: *** [/home/myusername/opt/src/seagull/seagull/trunk/src/work-1.8.3/auth.o] Error 1 make[1]: Leaving directory '/home/myusername/opt/src/seagull/seagull/trunk/src' /home/myusername/opt/src/seagull/seagull/trunk/src/work-1.8.3/project.mk:82: recipe for target 'all_lib_crypto.so' failed make: *** [all_lib_crypto.so] Error 2
Fix for the third error.
diff --git a/seagull/trunk/src/library-crypto/auth.c b/seagull/trunk/src/library-crypto/auth.c index 8f434b8..ca3eb39 100644 --- a/seagull/trunk/src/library-crypto/auth.c +++ b/seagull/trunk/src/library-crypto/auth.c @@ -499,7 +499,7 @@ int createAuthHeaderAKAv1MD5(char * user, char * aka_OP, char tmp[MAX_HEADER_LEN] ; char *start, *end; - int has_auts = 0, resuf = 1; + int has_auts = 0; char *nonce64, *nonce; int noncelen; RESHEX resp_hex; @@ -572,7 +572,7 @@ int createAuthHeaderAKAv1MD5(char * user, char * aka_OP, resp_hex[2*i+1]=hexa[res[i]&0x0F]; } resp_hex[RESLEN*2]=0; - resuf = createAuthHeaderMD5(user, resp_hex, method, uri, msgbody, auth, algo, result); + createAuthHeaderMD5(user, resp_hex, method, uri, msgbody, auth, algo, result); } else { sqn_ms[5] = sqn_he[5] + 1; f5star(k, rnd, ak, op); @@ -582,7 +582,7 @@ int createAuthHeaderAKAv1MD5(char * user, char * aka_OP, has_auts = 1; /* When re-synchronisation occurs an empty password has to be used */ /* to compute MD5 response (Cf. rfc 3310 section 3.2) */ - resuf=createAuthHeaderMD5(user, (char *)"",method,uri,msgbody,auth,algo,result); + createAuthHeaderMD5(user, (char *)"",method,uri,msgbody,auth,algo,result); } if (has_auts) { /* Format data for output in the SIP message */