Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Li-Wei Liu
openairinterface5G
Commits
6a47f9e7
Commit
6a47f9e7
authored
Feb 17, 2019
by
Raphael Defosseux
Browse files
Merge branch 'develop_integration_2019_w07_v2' into 'develop'
Develop integration 2019 week 07 v2 See merge request
oai/openairinterface5g!508
parents
52754797
d14ad679
Changes
177
Hide whitespace changes
Inline
Side-by-side
README.txt
View file @
6a47f9e7
...
...
@@ -61,3 +61,4 @@ v1.0.0 -> January 2019. This version first implements the architectural split de
S1-flex has been introduced.
New tools: config library, telnet server, ...
A lot of bugfixes and a proper automated Continuous Integration process validates contributions.
v1.0.1 -> February 2019: Bug fix for the UE L1 simulator.
ci-scripts/Jenkinsfile-gitlab
View file @
6a47f9e7
...
...
@@ -104,6 +104,7 @@ pipeline {
}
else
{
echo
"Git Branch is ${GIT_BRANCH}"
echo
"Git Commit is ${GIT_COMMIT}"
sh
"git log -n1 --pretty=format:\"%s\" > .git/CI_COMMIT_MSG"
sh
"zip -r -qq localZip.zip ."
// Running astyle options on all C/H files in the repository
...
...
@@ -260,7 +261,7 @@ pipeline {
expression
{
doRedHatBuild
}
}
steps
{
gitlabCommitStatus
(
name:
"Build eNb-USRP-
CentOS
"
)
{
gitlabCommitStatus
(
name:
"Build eNb-USRP-
RHE
"
)
{
script
{
try
{
withCredentials
([
...
...
@@ -572,6 +573,10 @@ OAI CI Team''',
replyTo:
'no-reply@openairinterface.org'
,
subject:
'$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!'
,
to:
env
.
gitlabUserEmail
if
(
fileExists
(
'.git/CI_COMMIT_MSG'
))
{
sh
"rm -f .git/CI_COMMIT_MSG"
}
}
}
success
{
...
...
ci-scripts/cppcheck_suppressions.list
0 → 100644
View file @
6a47f9e7
// *INDENT-OFF* cppcheck doesn't like "astyling" this file!!!!
// /*
// * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
// * contributor license agreements. See the NOTICE file distributed with
// * this work for additional information regarding copyright ownership.
// * The OpenAirInterface Software Alliance licenses this file to You under
// * the OAI Public License, Version 1.1 (the "License"); you may not use this file
// * except in compliance with the License.
// * You may obtain a copy of the License at
// *
// * http://www.openairinterface.org/?page_id=698
// *
// * Unless required by applicable law or agreed to in writing, software
// * distributed under the License is distributed on an "AS IS" BASIS,
// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// * See the License for the specific language governing permissions and
// * limitations under the License.
// *-------------------------------------------------------------------------------
// * For more information about the OpenAirInterface (OAI) Software Alliance:
// * contact@openairinterface.org
// */
//*****************************************************************************
//*****************************************************************************
// section for "valid" memory leaks: the related functions are allocators and
// the caller is responsible of freeing the memory. cppcheck has a mechanism
// to check more accuretaly this, by defining callers responsible of freeing
// but tools like valgring might be more suitable
//
//-----------------------------------------------------------------------------
// suppress error about keysP memory leak, free must be done by calling func
memleak:common/utils/hashtable/obj_hashtable.c
//-----------------------------------------------------------------------------
// suppress error about keys memory leak, free must be done by calling func
memleak:openair2/UTIL/OMG/omg_hashtable.c
//-----------------------------------------------------------------------------
// suppress error about data memory leak. This is the buffer where
// _emm_as_encode function creates the encoded buffer
//
memleak:openair3/NAS/UE/EMM/SAP/emm_as.c
//-----------------------------------------------------------------------------
//*****************************************************************************
// section for files not used in oai exec's included in CI.
// Possibly candidates for removal otherwise should be documented and updated
// for project rules enforcement
// ----------------------------------------------------------------------------
// likely sources for test programs, maintained?
invalidPrintfArgType_sint:openair1/PHY/CODING/TESTBENCH/ltetest.c
memleak:openair1/PHY/CODING/TESTBENCH/ltetest.c
invalidPrintfArgType_sint:openair1/PHY/CODING/TESTBENCH/pdcch_test.c
//
//-----------------------------------------------------------------------------
// oaisim deprecated, remove?
doubleFree:openair3/TEST/oaisim_mme_list_benchmark.c
//
//-----------------------------------------------------------------------------
// is itti analyzer deprecated
nullPointer:common/utils/itti_analyzer/itti_analyzer.c
nullPointerRedundantCheck:common/utils/itti_analyzer/libbuffers/buffers.c
doubleFree:common/utils/itti_analyzer/libbuffers/socket.c
memleak:common/utils/itti_analyzer/libbuffers/socket.c
memleak:common/utils/itti_analyzer/libparser/array_type.c
memleak:common/utils/itti_analyzer/libui/ui_callbacks.c
//-----------------------------------------------------------------------------
// obviously never even compiled!!!
syntaxError:openair1/SIMULATION/LTE_PHY/dlsim_tm4.c
//-----------------------------------------------------------------------------
// omg, otg commented out in cmakelist to be cleaned up definitely?
arrayIndexOutOfBounds:openair2/UTIL/OMG/omg.c
uninitvar:openair2/UTIL/OTG/otg_rx_socket.c
//
//*****************************************************************************
//
// True problems we don't know how to fix, Suppression is commented out,
// as these kind of problem need either to be fixed or can be suppressed
// when fully uderstood
//-----------------------------------------------------------------------------
// the function [nv]fapi_pnf_p7_config_create should return
// _this. _this points to a structure and a dynamically allocated field is
// returned. cppcheck suspects _this will never be released, so do i
// memleak:nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c
// memleak:nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c
//-----------------------------------------------------------------------------
// may be security_data->kenb.value is released from calling functions. But even
// when, for test, freeing it before returning from emm_proc_security_mode_command
// which does the allocation, cppcheck complains. So something might be wrong...
// memleak:openair3/NAS/UE/EMM/SecurityModeControl.c
//-----------------------------------------------------------------------------
// when used, nobody but the original developer can guess if sn_data_cnf is set or not
// cppcheck found that in some cases it is not, code needs cleanup before fixing that...
// uninitvar:openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c
//*****************************************************************************
// *INDENT-ON*
ci-scripts/doGitLabMerge.sh
View file @
6a47f9e7
...
...
@@ -121,6 +121,7 @@ git config user.email "jenkins@openairinterface.org"
git config user.name
"OAI Jenkins"
git checkout
-f
$SOURCE_COMMIT_ID
git log
-n1
--pretty
=
format:
\"
%s
\"
>
.git/CI_COMMIT_MSG
git merge
--ff
$TARGET_COMMIT_ID
-m
"Temporary merge for CI"
...
...
ci-scripts/oai-ci-vm-tool
View file @
6a47f9e7
...
...
@@ -264,7 +264,7 @@ case $key in
ARCHIVES_LOC
=
cppcheck
LOG_PATTERN
=
cppcheck.xml
NB_PATTERN_FILES
=
1
BUILD_OPTIONS
=
"--enable=warning --force --xml --xml-version=2"
BUILD_OPTIONS
=
"--enable=warning --force --xml --xml-version=2
--suppressions-list=ci-scripts/cppcheck_suppressions.list
"
NBARGS
=
$[$NBARGS
+256]
shift
;;
...
...
@@ -340,11 +340,11 @@ case $key in
;;
cppcheck
)
VM_NAME
=
ci-cppcheck
VM_MEMORY
=
8192
VM_MEMORY
=
4096
ARCHIVES_LOC
=
cppcheck
LOG_PATTERN
=
cppcheck.xml
NB_PATTERN_FILES
=
1
BUILD_OPTIONS
=
"--enable=warning --force --xml --xml-version=2"
BUILD_OPTIONS
=
"--enable=warning --force --xml --xml-version=2
--suppressions-list=ci-scripts/cppcheck_suppressions.list
"
NBARGS
=
$[$NBARGS
+256]
;;
enb-ethernet
)
...
...
ci-scripts/reportBuildLocally.sh
View file @
6a47f9e7
...
...
@@ -363,6 +363,14 @@ function report_build {
echo
" <td bgcolor =
\"
lightcyan
\"
> <span class=
\"
glyphicon glyphicon-tag
\"
></span> Commit ID</td>"
>>
./build_results.html
echo
" <td>
$SOURCE_COMMIT_ID
</td>"
>>
./build_results.html
echo
" </tr>"
>>
./build_results.html
if
[
-e
.git/CI_COMMIT_MSG
]
then
echo
" <tr>"
>>
./build_results.html
echo
" <td bgcolor =
\"
lightcyan
\"
> <span class=
\"
glyphicon glyphicon-comment
\"
></span> Commit Message</td>"
>>
./build_results.html
MSG
=
`
cat
.git/CI_COMMIT_MSG
`
echo
" <td>
$MSG
</td>"
>>
./build_results.html
echo
" </tr>"
>>
./build_results.html
fi
fi
if
[
$MR_TRIG
-eq
1
]
then
...
...
@@ -374,6 +382,14 @@ function report_build {
echo
" <td bgcolor =
\"
lightcyan
\"
> <span class=
\"
glyphicon glyphicon-tag
\"
></span> Source Commit ID</td>"
>>
./build_results.html
echo
" <td>
$SOURCE_COMMIT_ID
</td>"
>>
./build_results.html
echo
" </tr>"
>>
./build_results.html
if
[
-e
.git/CI_COMMIT_MSG
]
then
echo
" <tr>"
>>
./build_results.html
echo
" <td bgcolor =
\"
lightcyan
\"
> <span class=
\"
glyphicon glyphicon-comment
\"
></span> Source Commit Message</td>"
>>
./build_results.html
MSG
=
`
cat
.git/CI_COMMIT_MSG
`
echo
" <td>
$MSG
</td>"
>>
./build_results.html
echo
" </tr>"
>>
./build_results.html
fi
echo
" <tr>"
>>
./build_results.html
echo
" <td bgcolor =
\"
lightcyan
\"
> <span class=
\"
glyphicon glyphicon-log-in
\"
></span> Target Branch</td>"
>>
./build_results.html
echo
" <td>
$TARGET_BRANCH
</td>"
>>
./build_results.html
...
...
@@ -492,7 +508,7 @@ function report_build {
if
[
-e
./archives/red_hat
]
then
echo
" <h2>Red Hat
(CentOS Linux
release 7.
4.1708
) -- Summary</h2>"
>>
./build_results.html
echo
" <h2>Red Hat
Enterprise Linux Server
release 7.
6
) -- Summary</h2>"
>>
./build_results.html
summary_table_header
"Red Hat -- OAI Build eNB -- USRP option"
./archives/red_hat
summary_table_row
"LTE SoftModem - Release 14"
./archives/red_hat/lte-softmodem.Rel14.txt
"Built target lte-softmodem"
./enb_usrp_rh_row1.html
...
...
ci-scripts/reportTestLocally.sh
View file @
6a47f9e7
...
...
@@ -139,6 +139,14 @@ function report_test {
echo
" <td bgcolor =
\"
lightcyan
\"
> <span class=
\"
glyphicon glyphicon-tag
\"
></span> Commit ID</td>"
>>
./test_simulator_results.html
echo
" <td>
$SOURCE_COMMIT_ID
</td>"
>>
./test_simulator_results.html
echo
" </tr>"
>>
./test_simulator_results.html
if
[
-e
.git/CI_COMMIT_MSG
]
then
echo
" <tr>"
>>
./test_simulator_results.html
echo
" <td bgcolor =
\"
lightcyan
\"
> <span class=
\"
glyphicon glyphicon-comment
\"
></span> Commit Message</td>"
>>
./test_simulator_results.html
MSG
=
`
cat
.git/CI_COMMIT_MSG
`
echo
" <td>
$MSG
</td>"
>>
./test_simulator_results.html
echo
" </tr>"
>>
./test_simulator_results.html
fi
fi
if
[
$MR_TRIG
-eq
1
]
then
...
...
@@ -150,6 +158,14 @@ function report_test {
echo
" <td bgcolor =
\"
lightcyan
\"
> <span class=
\"
glyphicon glyphicon-tag
\"
></span> Source Commit ID</td>"
>>
./test_simulator_results.html
echo
" <td>
$SOURCE_COMMIT_ID
</td>"
>>
./test_simulator_results.html
echo
" </tr>"
>>
./test_simulator_results.html
if
[
-e
.git/CI_COMMIT_MSG
]
then
echo
" <tr>"
>>
./test_simulator_results.html
echo
" <td bgcolor =
\"
lightcyan
\"
> <span class=
\"
glyphicon glyphicon-comment
\"
></span> Commit Message</td>"
>>
./test_simulator_results.html
MSG
=
`
cat
.git/CI_COMMIT_MSG
`
echo
" <td>
$MSG
</td>"
>>
./test_simulator_results.html
echo
" </tr>"
>>
./test_simulator_results.html
fi
echo
" <tr>"
>>
./test_simulator_results.html
echo
" <td bgcolor =
\"
lightcyan
\"
> <span class=
\"
glyphicon glyphicon-log-in
\"
></span> Target Branch</td>"
>>
./test_simulator_results.html
echo
" <td>
$TARGET_BRANCH
</td>"
>>
./test_simulator_results.html
...
...
ci-scripts/runTestOnVM.sh
View file @
6a47f9e7
...
...
@@ -569,6 +569,7 @@ function start_l2_sim_enb {
ENB_SYNC
=
1
echo
"L2-SIM eNB is sync'ed: waiting for UE(s) to connect"
fi
sleep
10
}
function
start_l2_sim_ue
{
...
...
@@ -604,10 +605,34 @@ function start_l2_sim_ue {
if
[
$i
-lt
50
]
then
UE_SYNC
=
0
echo
"L2-SIM UE is NOT sync'ed w/eNB"
echo
"L2-SIM UE is NOT sync'ed w/ eNB"
return
else
UE_SYNC
=
1
echo
"L2-SIM UE is sync'ed w/ eNB"
fi
# Checking oip1 interface has now an IP address
i
=
"0"
echo
"ifconfig oip1 | egrep -c
\"
inet addr
\"
"
>
$1
while
[
$i
-lt
10
]
do
sleep
5
CONNECTED
=
`
ssh
-o
StrictHostKeyChecking
=
no ubuntu@
$LOC_VM_IP_ADDR
<
$1
`
if
[
$CONNECTED
-eq
1
]
then
i
=
"100"
else
i
=
$[$i
+1]
fi
done
rm
$1
if
[
$i
-lt
50
]
then
UE_SYNC
=
0
echo
"L2-SIM UE oip1 is NOT sync'ed w/ EPC"
else
UE_SYNC
=
1
echo
"L2-SIM UE is sync'ed w/
eNB
"
echo
"L2-SIM UE
oip1
is sync'ed w/
EPC
"
fi
sleep
10
}
...
...
cmake_targets/tools/build_helper
View file @
6a47f9e7
...
...
@@ -102,6 +102,7 @@ check_supported_distribution() {
"ubuntu14.04") return 0 ;;
"fedora24") return 0 ;;
"rhel7") return 0 ;;
"rhel7.6") return 0 ;;
"centos7") return 0 ;;
esac
return 1
...
...
@@ -310,10 +311,20 @@ install_usrp_uhd_driver() {
# On newer kernels, it fails to install
$SUDO apt-get -y install uhd-host
fi
# quick workaround for RHE7.6
local distribution=$(get_distribution_release)
if [ -z $1 ]; then
$SUDO uhd_images_downloader
if [[ "$distribution" == "rhel7.6" ]]; then
$SUDO /usr/local/bin/uhd_images_downloader
else
$SUDO uhd_images_downloader
fi
else
$SUDO uhd_images_downloader -i $1
if [[ "$distribution" == "rhel7.6" ]]; then
$SUDO /usr/local/bin/uhd_images_downloader -i $1
else
$SUDO uhd_images_downloader -i $1
fi
fi
}
...
...
common/config/config_cmdline.c
View file @
6a47f9e7
...
...
@@ -166,13 +166,14 @@ int config_check_unknown_cmdlineopt(char *prefix) {
int
unknowndetected
=
0
;
char
testprefix
[
CONFIG_MAXOPTLENGTH
];
int
finalcheck
=
0
;
memset
(
testprefix
,
0
,
sizeof
(
testprefix
));
memset
(
testprefix
,
0
,
sizeof
(
testprefix
));
if
(
prefix
!=
NULL
)
{
if
(
strcmp
(
prefix
,
CONFIG_CHECKALLSECTIONS
)
==
0
)
finalcheck
=
1
;
else
if
(
strlen
(
prefix
)
>
0
)
{
sprintf
(
testprefix
,
"--%.*s."
,
CONFIG_MAXOPTLENGTH
-
1
,
prefix
);
sprintf
(
testprefix
,
"--%.*s."
,
CONFIG_MAXOPTLENGTH
-
4
,
prefix
);
}
}
...
...
common/utils/T/local_tracer.c
View file @
6a47f9e7
...
...
@@ -31,7 +31,7 @@ typedef struct {
int
remote_port
;
pthread_mutex_t
lock
;
pthread_cond_t
cond
;
databuf
*
volatile
head
,
*
tail
;
databuf
*
volatile
head
,
*
tail
;
uint64_t
memusage
;
uint64_t
last_warning_memusage
;
}
forward_data
;
...
...
@@ -40,80 +40,115 @@ typedef struct {
/* utility functions */
/****************************************************************************/
static
void
new_thread
(
void
*
(
*
f
)(
void
*
),
void
*
data
)
{
static
void
new_thread
(
void
*
(
*
f
)(
void
*
),
void
*
data
)
{
pthread_t
t
;
pthread_attr_t
att
;
if
(
pthread_attr_init
(
&
att
))
{
fprintf
(
stderr
,
"pthread_attr_init err
\n
"
);
exit
(
1
);
}
if
(
pthread_attr_setdetachstate
(
&
att
,
PTHREAD_CREATE_DETACHED
))
{
fprintf
(
stderr
,
"pthread_attr_setdetachstate err
\n
"
);
exit
(
1
);
}
if
(
pthread_attr_setstacksize
(
&
att
,
10000000
))
{
fprintf
(
stderr
,
"pthread_attr_setstacksize err
\n
"
);
exit
(
1
);
}
if
(
pthread_create
(
&
t
,
&
att
,
f
,
data
))
{
fprintf
(
stderr
,
"pthread_create err
\n
"
);
exit
(
1
);
}
if
(
pthread_attr_destroy
(
&
att
))
{
fprintf
(
stderr
,
"pthread_attr_destroy err
\n
"
);
exit
(
1
);
}
if
(
pthread_attr_init
(
&
att
))
{
fprintf
(
stderr
,
"pthread_attr_init err
\n
"
);
exit
(
1
);
}
if
(
pthread_attr_setdetachstate
(
&
att
,
PTHREAD_CREATE_DETACHED
))
{
fprintf
(
stderr
,
"pthread_attr_setdetachstate err
\n
"
);
exit
(
1
);
}
if
(
pthread_attr_setstacksize
(
&
att
,
10000000
))
{
fprintf
(
stderr
,
"pthread_attr_setstacksize err
\n
"
);
exit
(
1
);
}
if
(
pthread_create
(
&
t
,
&
att
,
f
,
data
))
{
fprintf
(
stderr
,
"pthread_create err
\n
"
);
exit
(
1
);
}
if
(
pthread_attr_destroy
(
&
att
))
{
fprintf
(
stderr
,
"pthread_attr_destroy err
\n
"
);
exit
(
1
);
}
}
static
int
get_connection
(
char
*
addr
,
int
port
)
{
static
int
get_connection
(
char
*
addr
,
int
port
)
{
struct
sockaddr_in
a
;
socklen_t
alen
;
int
s
,
t
;
printf
(
"T tracer: waiting for connection on %s:%d
\n
"
,
addr
,
port
);
s
=
socket
(
AF_INET
,
SOCK_STREAM
,
0
);
if
(
s
==
-
1
)
{
perror
(
"socket"
);
exit
(
1
);
}
if
(
s
==
-
1
)
{
perror
(
"socket"
);
exit
(
1
);
}
t
=
1
;
if
(
setsockopt
(
s
,
SOL_SOCKET
,
SO_REUSEADDR
,
&
t
,
sizeof
(
int
)))
{
perror
(
"setsockopt"
);
exit
(
1
);
}
if
(
setsockopt
(
s
,
SOL_SOCKET
,
SO_REUSEADDR
,
&
t
,
sizeof
(
int
)))
{
perror
(
"setsockopt"
);
exit
(
1
);
}
a
.
sin_family
=
AF_INET
;
a
.
sin_port
=
htons
(
port
);
a
.
sin_addr
.
s_addr
=
inet_addr
(
addr
);
if
(
bind
(
s
,
(
struct
sockaddr
*
)
&
a
,
sizeof
(
a
)))
{
perror
(
"bind"
);
exit
(
1
);
}
if
(
listen
(
s
,
5
))
{
perror
(
"bind"
);
exit
(
1
);
}
if
(
bind
(
s
,
(
struct
sockaddr
*
)
&
a
,
sizeof
(
a
)))
{
perror
(
"bind"
);
exit
(
1
);
}
if
(
listen
(
s
,
5
))
{
perror
(
"bind"
);
exit
(
1
);
}
alen
=
sizeof
(
a
);
t
=
accept
(
s
,
(
struct
sockaddr
*
)
&
a
,
&
alen
);
if
(
t
==
-
1
)
{
perror
(
"accept"
);
exit
(
1
);
}
close
(
s
);
printf
(
"T tracer: connected
\n
"
);
if
(
t
==
-
1
)
{
perror
(
"accept"
);
exit
(
1
);
}
close
(
s
);
printf
(
"T tracer: connected
\n
"
);
return
t
;
}
static
void
forward
(
void
*
_forwarder
,
char
*
buf
,
int
size
);
void
send_T_messages_txt
(
void
*
forwarder
)
{
void
send_T_messages_txt
(
void
*
forwarder
)
{
char
buf
[
T_BUFFER_MAX
];
char
*
T_LOCAL_buf
=
buf
;
int
T_LOCAL_size
;
unsigned
char
*
src
;
int
src_len
;
/* trace T_message.txt
* Send several messages -1 with content followed by message -2.
*/
src
=
T_messages_txt
;
src_len
=
T_messages_txt_len
;
while
(
src_len
)
{
int
send_size
=
src_len
;
if
(
send_size
>
T_PAYLOAD_MAXSIZE
-
sizeof
(
int
))
send_size
=
T_PAYLOAD_MAXSIZE
-
sizeof
(
int
);
/* TODO: be careful, we use internal T stuff, to rewrite? */
T_LOCAL_size
=
0
;
T_HEADER
(
T_ID
(
-
1
));
T_PUT_buffer
(
1
,
((
T_buffer
){
addr
:
(
src
),
length
:
(
send_size
)}));
T_PUT_buffer
(
1
,
((
T_buffer
)
{
addr:
(
src
),
length
:
(
send_size
)
}));
forward
(
forwarder
,
buf
,
T_LOCAL_size
);
src
+=
send_size
;
src_len
-=
send_size
;
}
T_LOCAL_size
=
0
;
T_HEADER
(
T_ID
(
-
2
));
forward
(
forwarder
,
buf
,
T_LOCAL_size
);
...
...
@@ -123,49 +158,54 @@ void send_T_messages_txt(void *forwarder)
/* forward functions */
/****************************************************************************/
static
void
*
data_sender
(
void
*
_f
)
{
static
void
*
data_sender
(
void
*
_f
)
{
forward_data
*
f
=
_f
;
databuf
*
cur
;
char
*
buf
,
*
b
;
int
size
;
wait:
if
(
pthread_mutex_lock
(
&
f
->
lock
))
abort
();
while
(
f
->
head
==
NULL
)
if
(
pthread_cond_wait
(
&
f
->
cond
,
&
f
->
lock
))
abort
();
cur
=
f
->
head
;
buf
=
cur
->
d
;
size
=
cur
->
l
;
f
->
head
=
cur
->
next
;
f
->
memusage
-=
size
;
if
(
f
->
head
==
NULL
)
f
->
tail
=
NULL
;
if
(
pthread_mutex_unlock
(
&
f
->
lock
))
abort
();
free
(
cur
);
goto
process
;
process:
b
=
buf
;
if
(
f
->
socket_remote
!=
-
1
)
while
(
size
)
{
int
l
=
write
(
f
->
socket_remote
,
b
,
size
);
if
(
l
<=
0
)
{
printf
(
"T tracer: forward error
\n
"
);
close
(
f
->
socket_remote
);
f
->
socket_remote
=
-
1
;
break
;
while
(
size
)
{
int
l
=
write
(
f
->
socket_remote
,
b
,
size
);
if
(
l
<=
0
)
{
printf
(
"T tracer: forward error
\n
"
);
close
(
f
->
socket_remote
);
f
->
socket_remote
=
-
1
;
break
;
}
size
-=
l
;
b
+=
l
;
}
size
-=
l
;
b
+=
l
;
}
free
(
buf
);
goto
wait
;
}
static
void
*
forward_remote_messages
(
void
*
_f
)
{
static
void
*
forward_remote_messages
(
void
*
_f
)
{
#define PUT(x) do { \
if (bufsize == bufmaxsize) { \
bufmaxsize += 4096; \
...
...
@@ -180,7 +220,6 @@ static void *forward_remote_messages(void *_f)
int len = l; \
while (len) { PUT(*zz); zz++; len--; } \
} while (0)
forward_data
*
f
=
_f
;
int
from
;
int
to
;
...
...
@@ -190,43 +229,53 @@ static void *forward_remote_messages(void *_f)
int
bufsize
=
0
;
int
bufmaxsize
=
0
;
char
t
;
again:
while
(
1
)
{
from
=
f
->
socket_remote
;
to
=
f
->
socket_local
;
bufsize
=
0
;
/* let's read and process messages */
len
=
read
(
from
,
&
t
,
1
);
if
(
len
<=
0
)
goto
dead
;
len
=
read
(
from
,
&
t
,
1
);
if
(
len
<=
0
)
goto
dead
;
PUT
(
t
);
switch
(
t
)
{
case
0
:
case
1
:
/* message 0 and 1: get a length and then 'length' numbers */
if
(
read
(
from
,
&
len
,
sizeof
(
int
))
!=
sizeof
(
int
))
goto
dead
;
PUT_BUF
(
&
len
,
4
);
while
(
len
)
{
if
(
read
(
from
,
&
l
,
sizeof
(
int
))
!=
sizeof
(
int
))
goto
dead
;
PUT_BUF
(
&
l
,
4
);
len
--
;
}
break
;
case
0
:
case
1
:
/* message 0 and 1: get a length and then 'length' numbers */
if
(
read
(
from
,
&
len
,
sizeof
(
int
))
!=
sizeof
(
int
))
goto
dead
;
PUT_BUF
(
&
len
,
4
);
while
(
len
)
{
if
(
read
(
from
,
&
l
,
sizeof
(
int
))
!=
sizeof
(
int
))
goto
dead
;
PUT_BUF
(
&
l
,
4
);
len
--
;
}
break
;
case
2
:
break
;
case
2
:
break
;
default:
printf
(
"%s:%d:%s: unhandled message type %d
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
,
t
);
abort
();
default:
printf
(
"%s:%d:%s: unhandled message type %d
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
,
t
);
abort
();
}