Simplified zmq_msg_get/set functions

* Return integer property
* Fixed up man pages, which were inaccurate
* Fixed test case
This commit is contained in:
Pieter Hintjens 2012-03-21 14:19:40 -05:00
parent 6dd102cded
commit f26e4ab784
8 changed files with 36 additions and 295 deletions

1
.gitignore vendored
View File

@ -20,6 +20,7 @@ autom4te.cache
.* .*
*~ *~
.*~ .*~
tests/test_last_endpoint
tests/test_pair_inproc tests/test_pair_inproc
tests/test_pair_ipc tests/test_pair_ipc
tests/test_pair_tcp tests/test_pair_tcp

View File

@ -4,28 +4,24 @@ zmq_msg_get(3)
NAME NAME
---- ----
zmq_msg_get - get message options zmq_msg_get - get message property
SYNOPSIS SYNOPSIS
-------- --------
*int zmq_msg_get (zmq_msg_t '*message', int 'option_name', void '*option_value', size_t '*option_len');* *int zmq_msg_get (zmq_msg_t '*message', int 'property');*
DESCRIPTION DESCRIPTION
----------- -----------
The _zmq_msg_get()_ function shall retrieve the value for the option The _zmq_msg_get()_ function shall return the value for the property
specified by the 'option_name' argument for the message pointed to by the specified by the 'property' argument for the message pointed to by the
'message' argument, and store it in the buffer pointed to by the 'option_value' 'message' argument.
argument. The 'option_len' argument is the size in bytes of the buffer pointed
to by 'option_value'; upon successful completion _zmq_getsockopt()_ shall
modify the 'option_len' argument to indicate the actual size of the option
value stored in the buffer.
The following options can be retrieved with the _zmq_msg_get()_ function: The following properties can be retrieved with the _zmq_msg_get()_ function:
*ZMQ_MORE*:: *ZMQ_MORE*::
Indicates that there are more message parts to follow after the 'message'. Indicates that there are more message frames to follow after the 'message'.
RETURN VALUE RETURN VALUE
------------ ------------
@ -36,42 +32,34 @@ shall return `-1` and set 'errno' to one of the values defined below.
ERRORS ERRORS
------ ------
*EINVAL*:: *EINVAL*::
The requested option _option_name_ is unknown, or the requested _option_size_ or The requested _property_ is unknown.
_option_value_ is invalid, or the size of the buffer pointed to by
_option_value_, as specified by _option_len_, is insufficient for storing the
option value.
EXAMPLE EXAMPLE
------- -------
.Receiving a multi-part message .Receiving a multi-frame message
---- ----
zmq_msg_t part;
int more;
size_t more_size = sizeof (more);
while (true) { while (true) {
// Create an empty 0MQ message to hold the message part // Create an empty 0MQ message to hold the message frame
int rc = zmq_msg_init (&part); int rc = zmq_msg_init (&frame);
assert (rc == 0); assert (rc == 0);
// Block until a message is available to be received from socket // Block until a message is available to be received from socket
rc = zmq_recvmsg (socket, &part, 0); rc = zmq_recvmsg (socket, &frame, 0);
assert (rc != -1); assert (rc != -1);
rc = getmsgopt (&part, ZMQ_MORE, &more, &more_size); if (zmq_msg_get (&frame, ZMQ_MORE))
assert (rc == 0);
if (more)
fprintf (stderr, "more\n"); fprintf (stderr, "more\n");
else { else {
fprintf (stderr, "end\n"); fprintf (stderr, "end\n");
break; break;
} }
zmq_msg_close (part); zmq_msg_close (frame);
} }
---- ----
SEE ALSO SEE ALSO
-------- --------
linkzmq:zmq_msg_poke[3] linkzmq:zmq_msg_set[3]
linkzmq:zmq_msg_init[3] linkzmq:zmq_msg_init[3]
linkzmq:zmq_msg_close[3] linkzmq:zmq_msg_close[3]
linkzmq:zmq[7] linkzmq:zmq[7]

View File

@ -50,8 +50,8 @@ while (true) {
SEE ALSO SEE ALSO
-------- --------
linkzmq:zmq_msg_peek[3] linkzmq:zmq_msg_get[3]
linkzmq:zmq_msg_poke[3] linkzmq:zmq_msg_set[3]
linkzmq:zmq_msg_init[3] linkzmq:zmq_msg_init[3]
linkzmq:zmq_msg_close[3] linkzmq:zmq_msg_close[3]
linkzmq:zmq[7] linkzmq:zmq[7]

View File

@ -5,22 +5,21 @@ zmq_msg_set(3)
NAME NAME
---- ----
zmq_msg_set - set message options zmq_msg_set - set message property
SYNOPSIS SYNOPSIS
-------- --------
*int zmq_msg_peek (zmq_msg_t '*message', int 'option_name', const void '*option_value', size_t '*option_len');* *int zmq_msg_set (zmq_msg_t '*message', int 'property', int 'value');*
DESCRIPTION DESCRIPTION
----------- -----------
The _zmq_msg_set()_ function shall set the option specified by the The _zmq_msg_set()_ function shall set the property specified by the
'option_name' argument to the value pointed to by the 'option_value' argument 'property' argument to the value of the 'value' argument for the 0MQ
for the 0MQ socket pointed to by the 'socket' argument. The 'option_len' message fragment pointed to by the 'message' argument.
argument is the size of the option value in bytes.
Currently the _zmq_msg_set()_ function does not support any option names. Currently the _zmq_msg_set()_ function does not support any property names.
RETURN VALUE RETURN VALUE
@ -32,13 +31,12 @@ shall return `-1` and set 'errno' to one of the values defined below.
ERRORS ERRORS
------ ------
*EINVAL*:: *EINVAL*::
The requested option _option_name_ is unknown, or the requested _option_len_ or The requested property _property_ is unknown.
_option_value_ is invalid.
SEE ALSO SEE ALSO
-------- --------
linkzmq:zmq_msg_peek[3] linkzmq:zmq_msg_get[3]
linkzmq:zmq[7] linkzmq:zmq[7]

View File

@ -168,10 +168,9 @@ ZMQ_EXPORT int zmq_msg_copy (zmq_msg_t *dest, zmq_msg_t *src);
ZMQ_EXPORT void *zmq_msg_data (zmq_msg_t *msg); ZMQ_EXPORT void *zmq_msg_data (zmq_msg_t *msg);
ZMQ_EXPORT size_t zmq_msg_size (zmq_msg_t *msg); ZMQ_EXPORT size_t zmq_msg_size (zmq_msg_t *msg);
ZMQ_EXPORT int zmq_msg_more (zmq_msg_t *msg); ZMQ_EXPORT int zmq_msg_more (zmq_msg_t *msg);
ZMQ_EXPORT int zmq_msg_get (zmq_msg_t *msg, int option, void *optval, ZMQ_EXPORT int zmq_msg_get (zmq_msg_t *msg, int option);
size_t *optvallen); ZMQ_EXPORT int zmq_msg_set (zmq_msg_t *msg, int option, int optval);
ZMQ_EXPORT int zmq_msg_set (zmq_msg_t *msg, int option, const void *optval,
size_t *optvallen);
/******************************************************************************/ /******************************************************************************/
/* 0MQ socket definition. */ /* 0MQ socket definition. */

View File

@ -549,34 +549,21 @@ size_t zmq_msg_size (zmq_msg_t *msg_)
int zmq_msg_more (zmq_msg_t *msg_) int zmq_msg_more (zmq_msg_t *msg_)
{ {
int more; return zmq_msg_get (msg_, ZMQ_MORE);
size_t more_size = sizeof (more);
int rc = zmq_msg_get (msg_, ZMQ_MORE, &more, &more_size);
assert (rc == 0);
return more;
} }
int zmq_msg_get (zmq_msg_t *msg_, int option_, void *optval_, int zmq_msg_get (zmq_msg_t *msg_, int option_)
size_t *optvallen_)
{ {
switch (option_) { switch (option_) {
case ZMQ_MORE: case ZMQ_MORE:
if (*optvallen_ < sizeof (int)) { return (((zmq::msg_t*) msg_)->flags () & zmq::msg_t::more)? 1: 0;
errno = EINVAL;
return -1;
}
*((int*) optval_) =
(((zmq::msg_t*) msg_)->flags () & zmq::msg_t::more)? 1 : 0;
*optvallen_ = sizeof (int);
return 0;
default: default:
errno = EINVAL; errno = EINVAL;
return -1; return -1;
} }
} }
int zmq_msg_set (zmq_msg_t *msg_, int option_, const void *optval_, int zmq_msg_set (zmq_msg_t *msg_, int option_, int optval_)
size_t *optvallen_)
{ {
// No options supported at present // No options supported at present
errno = EINVAL; errno = EINVAL;

View File

@ -1,225 +0,0 @@
#! /bin/bash
# test_last_endpoint - temporary wrapper script for .libs/test_last_endpoint
# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2ubuntu1
#
# The test_last_endpoint program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.
# Sed substitution that helps us do robust quoting. It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
emulate sh
NULLCMD=:
# Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
else
case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh
# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
relink_command="(cd /home/ph/work/libzmq_pieterh/tests; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; LD_LIBRARY_PATH=/usr/local/lib; export LD_LIBRARY_PATH; PATH=/opt/android-toolchain/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games; export PATH; g++ -g -O2 -o \$progdir/\$file test_last_endpoint.o ../src/.libs/libzmq.so -lrt -lpthread -Wl,-rpath -Wl,/home/ph/work/libzmq_pieterh/src/.libs)"
# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
# install mode needs the following variables:
generated_by_libtool_version='2.4'
notinst_deplibs=' ../src/libzmq.la'
else
# When we are sourced in execute mode, $file and $ECHO are already set.
if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
file="$0"
# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
ECHO="printf %s\\n"
fi
# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ which is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options which match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's ../libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
{
lt_script_arg0=$0
shift
for lt_opt
do
case "$lt_opt" in
--lt-debug) lt_option_debug=1 ;;
--lt-dump-script)
lt_dump_D=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
lt_dump_F=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%^.*/%%'`
cat "$lt_dump_D/$lt_dump_F"
exit 0
;;
--lt-*)
$ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
exit 1
;;
esac
done
# Print the debug banner immediately:
if test -n "$lt_option_debug"; then
echo "test_last_endpoint:test_last_endpoint:${LINENO}: libtool wrapper (GNU libtool) 2.4 Debian-2.4-2ubuntu1" 1>&2
fi
}
# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
lt_dump_args_N=1;
for lt_arg
do
$ECHO "test_last_endpoint:test_last_endpoint:${LINENO}: newargv[$lt_dump_args_N]: $lt_arg"
lt_dump_args_N=`expr $lt_dump_args_N + 1`
done
}
# Core function for launching the target application
func_exec_program_core ()
{
if test -n "$lt_option_debug"; then
$ECHO "test_last_endpoint:test_last_endpoint:${LINENO}: newargv[0]: $progdir/$program" 1>&2
func_lt_dump_args ${1+"$@"} 1>&2
fi
exec "$progdir/$program" ${1+"$@"}
$ECHO "$0: cannot exec $program $*" 1>&2
exit 1
}
# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
for lt_wr_arg
do
case $lt_wr_arg in
--lt-*) ;;
*) set x "$@" "$lt_wr_arg"; shift;;
esac
shift
done
func_exec_program_core ${1+"$@"}
}
# Parse options
func_parse_lt_options "$0" ${1+"$@"}
# Find the directory that this script lives in.
thisdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
test "x$thisdir" = "x$file" && thisdir=.
# Follow symbolic links until we get to the real thisdir.
file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'`
while test -n "$file"; do
destdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
# If there was a directory component, then change thisdir.
if test "x$destdir" != "x$file"; then
case "$destdir" in
[\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
*) thisdir="$thisdir/$destdir" ;;
esac
fi
file=`$ECHO "$file" | /bin/sed 's%^.*/%%'`
file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'`
done
# Usually 'no', except on cygwin/mingw when embedded into
# the cwrapper.
WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
# special case for '.'
if test "$thisdir" = "."; then
thisdir=`pwd`
fi
# remove .libs from thisdir
case "$thisdir" in
*[\\/].libs ) thisdir=`$ECHO "$thisdir" | /bin/sed 's%[\\/][^\\/]*$%%'` ;;
.libs ) thisdir=. ;;
esac
fi
# Try to get the absolute directory name.
absdir=`cd "$thisdir" && pwd`
test -n "$absdir" && thisdir="$absdir"
program=lt-'test_last_endpoint'
progdir="$thisdir/.libs"
if test ! -f "$progdir/$program" ||
{ file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \
test "X$file" != "X$progdir/$program"; }; then
file="$$-$program"
if test ! -d "$progdir"; then
mkdir "$progdir"
else
rm -f "$progdir/$file"
fi
# relink executable if necessary
if test -n "$relink_command"; then
if relink_command_output=`eval $relink_command 2>&1`; then :
else
printf %s\n "$relink_command_output" >&2
rm -f "$progdir/$file"
exit 1
fi
fi
mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
{ rm -f "$progdir/$program";
mv -f "$progdir/$file" "$progdir/$program"; }
rm -f "$progdir/$file"
fi
if test -f "$progdir/$program"; then
if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
# Run the actual program with our arguments.
func_exec_program ${1+"$@"}
fi
else
# The program doesn't exist.
$ECHO "$0: error: \`$progdir/$program' does not exist" 1>&2
$ECHO "This script is just a wrapper for $program." 1>&2
$ECHO "See the libtool documentation for more information." 1>&2
exit 1
fi
fi

View File

@ -50,26 +50,19 @@ int main (int argc, char *argv [])
assert (rc == 0); assert (rc == 0);
rc = zmq_recvmsg (sb, &msg, 0); rc = zmq_recvmsg (sb, &msg, 0);
assert (rc >= 0); assert (rc >= 0);
int more; int more = zmq_msg_get (&msg, ZMQ_MORE);
size_t more_size = sizeof (more);
rc = zmq_msg_get (&msg, ZMQ_MORE, &more, &more_size);
assert (rc == 0);
assert (more == 1); assert (more == 1);
// Then the first part of the message body. // Then the first part of the message body.
rc = zmq_recvmsg (sb, &msg, 0); rc = zmq_recvmsg (sb, &msg, 0);
assert (rc == 1); assert (rc == 1);
more_size = sizeof (more); more = zmq_msg_get (&msg, ZMQ_MORE);
rc = zmq_msg_get (&msg, ZMQ_MORE, &more, &more_size);
assert (rc == 0);
assert (more == 1); assert (more == 1);
// And finally, the second part of the message body. // And finally, the second part of the message body.
rc = zmq_recvmsg (sb, &msg, 0); rc = zmq_recvmsg (sb, &msg, 0);
assert (rc == 1); assert (rc == 1);
more_size = sizeof (more); more = zmq_msg_get (&msg, ZMQ_MORE);
rc = zmq_msg_get (&msg, ZMQ_MORE, &more, &more_size);
assert (rc == 0);
assert (more == 0); assert (more == 0);
// Deallocate the infrastructure. // Deallocate the infrastructure.