1174 Commits

Author SHA1 Message Date
Pieter Hintjens
45c063725b Fixed issue #449 2012-10-18 11:32:13 +09:00
Pieter Hintjens
96811575c3 Fixed issue #448 2012-10-18 11:04:51 +09:00
Pieter Hintjens
3a43bd7354 Several include files were missing 2012-10-16 10:01:26 +09:00
Rohan
93a7a37893 fixed trailing whitespace 2012-10-11 09:32:54 -05:00
Rohan
a438e63498 explicit comments on multicast loopback 2012-10-10 16:22:52 -05:00
rohanbedarkar
11c22912d7 commented out TOS related opt for PGM 2012-10-10 10:08:06 -05:00
Pieter Hintjens
983ee761b1 Renamed ZMQ_ROUTER_BEHAVIOR to ZMQ_ROUTER_MANDATORY for clarity 2012-10-08 16:36:35 +09:00
Pieter Hintjens
f87bf38293 Fixed issue #443 2012-10-08 00:57:43 +09:00
Michel Pelletier
b84d0119b5 Ported from libxs revision 123c0f5387ecef287dd11f4dc790fb76ee1c0f67
Handle insufficient resources on accept() decently

    If accept() call fails due to insuffient OS resources
    the new connection is rejected.
2012-09-30 11:52:43 -07:00
Martin Hurton
82d7238f08 Make socket IO more robust
See also https://zeromq.jira.com/browse/LIBZMQ-433
2012-09-29 11:36:52 +02:00
Ivan Pechorin
725f141fd7 Fix LIBZMQ-211: REP socket asserting when getting malformed request
REP socket demands at least an empty address stack. The server asserted on (msg_->flags () & msg_t::more) in rep.cpp:75 when receiving a malformed request without empty part.

This patch makes a REP socket to discard and silently ignore such malformed requests.
2012-09-26 16:49:38 +04:00
Ivan Pechorin
9b58372a38 Fix compilation using MSVC 2008: its <algorithm> defines wrong min/max without NOMINMAX
Visual Studio 2008 compiler defines min/max as macros in its <algorithm> even if <windows.h> is not included at all. This patch defines NOMINMAX to remove these macros and fix compilation on Visual Studio 2008.
2012-09-26 16:09:55 +04:00
Ivan Pechorin
396b4e3046 Fix compilation using MSVC 2008: stdint.h is not present in this compiler
This patch fixes the two headers added recently to include our own "stdint.hpp" instead of system <stdint.h> because the latter is not available in Visual Studio versions prior to 2010.
2012-09-26 16:06:20 +04:00
Ivan Pechorin
9056c13e1e Use <stdint.h> shipped with Visual Studio 2010 and later
Visual Studio didn’t have <stdint.h> until 2010, therefore we had a bunch of typedefs for int8_t, int16_t and the likes in "stdint.hpp". This patch limits these typedefs to Visual Studio versions older than 2010 and uses compiler-shipped <stdint.h> on 2010 and newer.
2012-09-26 15:13:13 +04:00
Ian Barber
afa4933c1e Init message in drop subscription
Fixes reported issue with PGM receiver on 32bit Suse where asserts
were hit due to the msg flags not being zeroed.
2012-09-25 22:58:25 +01:00
Lourens Naudé
759d453368 Significantly reworked the monitoring infrastructure with a more granular per socket API and to play well with monitoring endpoints in application threads 2012-09-21 12:53:31 +01:00
Ian Barber
7a40df6d3a Merge pull request #422 from hintjens/master
Replaced device concept with proxy concept
2012-09-07 03:25:31 -07:00
Pieter Hintjens
5db28752f3 Removed 'device' concept and introduced proxies
* zmq_device is now a wrapper that calls zmq_proxy
* zmq_proxy adds capture socket
2012-09-07 18:38:50 +09:00
Pieter Hintjens
aaac4b84cb Code cleanups 2012-09-06 18:20:33 +09:00
Martin Hurton
2a41c8d7b4 Simplify initial handshaking 2012-09-05 20:17:34 +02:00
Martin Hurton
3f6148abdf Implement new message encoder/decoder
This is supposed to become part of the ZMTP/1.1.

The main differences from the ZMTP/1.0 framing protocol are:
- flags field comes first, followed by the length field
- long messages are signaled using a flag rather then 0xff escape
- length field does not include the flags field, 0 is a valid value
2012-09-05 20:17:22 +02:00
Martin Hurton
8672f5829e Introduce abstract interface for message encoder/decoder 2012-09-05 18:31:27 +02:00
Ian Barber
d7331b7b1f Fixing PGM issues
Hopefully fixed LIBZMQ-427 - there was a slight typo in the init_address
refactor. The encoder refactoring had also broken pgm_sender and
receiver, but just required updating to use the new functions.
2012-09-04 23:24:48 +01:00
Martin Hurton
9d17ead33d Remove superfluous statement 2012-09-03 19:26:52 +02:00
Martin Hurton
7e6db47e65 Remove unused member variable 2012-09-03 19:07:57 +02:00
Martin Hurton
d9307c9ff0 Make ZMQ interoperate with ZMQ 2.x SUB sockets
Since ZMQ 2.x does not support subscription forwarding, it's not
possible to use ZMQ 2.x SUB socket to receive messages from a PUB
socket.

This patch adds some compatibility layer so that ZMQ 2.x SUB socket
receives messages from PUB socket.
2012-09-02 22:46:26 +02:00
Martin Hurton
dfc0222ee6 Decouple encoder_t and decoder_t from session_base_t
This patch introduces i_msg_sink and i_msg_source interfaces. This
allows us to make message encoder and decoder more general.
2012-09-02 22:46:26 +02:00
Martin Hurton
1bca4f6f03 Extend ZTP/1.0 protocol
The new protocol adds support for protocol version and  exchanges the
socket type, so that the library can reject a connection when the
sockets do not match.

The protocol was designed so that it's possible to detect and fully
support ZTP/1.0 peers.

When a new connection is set up, peers exchange greeting messages. The
greeting message encodes both the protocol verion and the socket type.
The format of the greeting message is as follows:

    greeting    = tag1, adaptation, tag2, version, length, socket_type
    tag1        = BYTE / 0xff
    adaptation  = 8 BYTES
    tag2        = BYTE / 0x7f
    version     = BYTE / 1
    length      = BYTE / 1
    socket_type = BYTE

The protocol does not define the value of adaptation field.

When interoperability with ZTP/1.0 peers is required, the adaptaion
encodes, in network byte order, the length of identity message increased
by 1. When adaptaion consists of eight zeros, the current
implementatatio of 0MQ 2.x closes the connection.

This patch supports both ZTP/1.0 and new protocol.
2012-09-02 22:46:26 +02:00
Arthur O'Dwyer
3b984d40e9 Silence all "unused parameter" warnings from Clang.
Compiling without warnings is a good goal, because it makes
new warnings (which probably indicate bugs) stand out rather
than getting lost in the spam.

My fixes fall into two categories:

    - Adding (void) casts of unused parameters, where their
      unusedness seems like a TODO (or in some cases a bug?).

    - Removing parameter names altogether, where the function
      is clearly a stub that will never use its parameters.

Should be no change in behavior.
2012-08-27 16:05:51 -07:00
Arthur O'Dwyer
7fa4d423b8 Fix char_traits<unsigned char> to what looks like correct behavior.
char_traits<unsigned char>::to_char_type(x) used to return 0 no matter
what x was, and likewise to_int_type(x) used to return 0 no matter what.
(0 is what you get when you default-construct an integral type, which
is what the old code was doing.) This seemed like buggy behavior to me,
so I've changed it.
2012-08-27 16:00:40 -07:00
Ian Barber
95c018c0d3 Use full endpoint string in monitor response
The endpoint was excluding the tcp://, causing tests to fail
2012-08-26 16:29:40 +01:00
Ian Barber
94835581a4 Remove early return on terminated state
Code as stands breaks shutdown process. It was a bugfix by Arthur to a
bad line which was testing for an impossible state - but afaics we do
actually want to flush in those states. It is possible I am wrong on
that though - if there are any shutdown issues introduced aroudn this
commit I would suggest further investigation around this flushing
behavior.
2012-08-26 15:07:16 +01:00
Ian Barber
206e5f6f44 Incorrect function name in socket_base
VA specific monitor event in socket base was named monitor_event rather
than va_monitor_event
2012-08-26 14:29:09 +01:00
Ian Barber
f028379c1c Incorrect var name in monitor_event
The call to the va version of the function was using 'event' instead of
'event_'
2012-08-26 14:27:12 +01:00
Ian Barber
8bf541b252 Fixing incorrect argument order on va_start
Compile was failing on the monitor_event function function due to the
va_start params being switched.
2012-08-26 14:24:50 +01:00
Arthur O'Dwyer
7fadd708a0 Fix monitor_event() to work at all.
There are three versions of monitor_event(), all taking
variadic arguments. The original code just has the first one
creating a va_list and passing that va_list variadically to
the second one... which creates a new va_list and passes it
variadically to the third one... and of course everything
blows up when we try to pull a non-va_list argument off the
stack.

The correct approach matches the C standard library's use
of printf/vprintf, scanf/vscanf, and so on. Once you make
a va_list, you must pass it only to functions which expect
a va_list parameter.
2012-08-24 16:42:31 -07:00
Arthur O'Dwyer
537a802788 Add a missing null-check, turning a segfault into an assertion.
Static analysis says:
src\tcp_address.cpp(297): error V595: The 'res' pointer was utilized before it was verified against nullptr. Check lines: 297, 301.
src\tcp_address.cpp(603): error V106: Implicit type conversion third argument 'full_bytes' of function 'memcmp' to memsize type.
src\tcp_address.cpp(603): error V526: The 'memcmp' function returns 0 if corresponding buffers are equal. Consider examining the condition for mistakes.

In fact the use of "memcmp" is correct, but the enclosing "if" isn't
necessary, and the compiler is happier if "full_bytes" is a size_t.
2012-08-24 16:38:46 -07:00
Arthur O'Dwyer
6347d392fd Fix a bug in pipe_t::flush().
Static analysis says:
src\pipe.cpp(193): error V547: Expression is always false. Probably the '||' operator should be used here.

If flush() is called on a pipe whose state was
"terminated" or "double_terminated", the programmer's
intent was to return immediately. But in fact the
two conditions can never be true simultaneously, so
the early return never happens, and we may try to flush
a terminated pipe anyway.
2012-08-24 16:36:19 -07:00
Arthur O'Dwyer
0886b7a26b Silence a compiler warning.
Static analysis says:
src\fd.hpp(38): error V103: Implicit type conversion from memsize to 32-bit type.

Adding the explicit cast should shut it up.
2012-08-24 16:33:48 -07:00
Arthur O'Dwyer
a48751b34b The "count_" out-parameter is doubled instead of unchanged.
Static analysis says:
src\zmq.cpp(489): error V220: Suspicious sequence of types castings: memsize -> 32-bit integer -> memsize. The value being casted: '* count_'.
src\zmq.cpp(510): error V127: An overflow of the 32-bit 'nread' variable is possible inside a long cycle which utilizes a memsize-type loop counter.

I've silenced the warning on line 489 and ignored the other.
But also, it looks to me like there's a serious bug here: The
out-parameter "count_" is never set to zero before we start
incrementing it. So its final value will always be between
1 and 2 times its initial value. The fix seems obvious.
2012-08-24 16:30:42 -07:00
Arthur O'Dwyer
28c9255d46 Fix an error in the inline assembly for Thumb2.
Notice that ZeroMQ has never been compiled for Thumb2 before,
and I personally don't make any guarantees that it will actually
behave correctly once compiled. But after this patch, it is at
least *possible* to compile it for Thumb2.

(Thumb2 is the target for most iOS devices.)
2012-08-23 12:49:21 -07:00
Martin Hurton
1ab85f471a Exchange greeting messages for all socket types
Fixes #415.
2012-08-11 19:04:49 +02:00
Ian Barber
b32542e396 Merge pull request #403 from methodmissing/efault-zmq-poll
Revert zmq_poll NULL poll items check to 2.2 behavior - let the poll items count filter out empty poll sets and not return a sometimes unexpected EFAULT error status
2012-08-05 08:10:53 -07:00
Sebastian Lauwers
a622328a9c Fix reordering compile errors 2012-08-04 23:54:31 +02:00
Lourens Naudé
9dc248f6ab Fix invalid address metadata for ZMQ_EVENT_DISCONNECTED 2012-08-04 11:41:33 +01:00
Martin Hurton
9fab9937e5 Fix issue #406
When a peer reconnects, the router socket receives an identity
message containing this peer id. When this happens, the current
implementation crashes.

This patch makes a router socket to silently ignore all identity
messages coming from reconnected peers.
2012-07-31 18:59:13 +02:00
Ricardo Catalinas Jiménez
92bee5a6db Fix LIBZMQ-404: zmq_term not truly re-entrant
zmq_term can not safely be re-entered with pgm transport.
Fix proposed by Steven McCoy.
2012-07-28 11:09:04 +02:00
Matthew Metnetsky
a0eb0bb7e6 signaler.cpp's Windows Lock should be in the "Global" namespace
That way it can be used more appropriately between processes.
2012-07-26 13:55:27 -04:00
Matthew Metnetsky
83537916f8 Fix issue 335
By assigning a SECURITY_DESCRIPTOR to the event we gain the ability to
share it between service and console programs. We also added
EVENT_MODIFY_STATE as a requirement to OpenEvent so we can SetEvent later
in the method.
2012-07-26 13:52:38 -04:00
Lourens Naudé
556074d438 Revert zmq_poll NULL poll items check to 2.2 behavior - let the poll items count filter out empty poll sets and not return a sometimes unexpected EFAULT error status 2012-07-24 02:22:27 +01:00