/*
* call-seq:
* connect(target, [private_name], [all_messages]) -> nil
*
* Connect to Spread. +target+ specifies which Spread daemon to
* connect to. It must be a string in the form "port",
* "port@hostname", or "port@ip".
*
* +private_name+ is the name of this connection. It must be unique
* among all the connections to a given Spread daemon. If not
* specified, Spread will assign a randomly-generated unique private
* name.
*
* +all_messages+ indicates whether this connection should receive all
* Spread messages, or just data messages. The default is +true+ (so
* all messages will be received).
*
* If this Spread::Connection instance is presently connected, it will
* first be silently disconnected.
*/
static VALUE
spconn_connect(int argc, VALUE *argv, VALUE obj)
{
VALUE host_str;
VALUE name_str;
VALUE all_msgs;
char *c_name_str;
struct SpreadConnection *sp_conn;
int n;
Data_Get_Struct(obj, struct SpreadConnection, sp_conn);
rb_scan_args(argc, argv, "12", &host_str, &name_str, &all_msgs);
if (NIL_P(name_str))
c_name_str = NULL;
else
c_name_str = StringValuePtr(name_str);
if (NIL_P(all_msgs))
all_msgs = Qtrue; /* receive all messages by default */
/* If we're currently connected, silently disconnect first */
if (sp_conn->connected)
spconn_disconnect(obj);
SafeStringValue(host_str);
if ((n = SP_connect(RSTRING(host_str)->ptr,
c_name_str,
0, /* ignored */
BOOL2INT(all_msgs),
&sp_conn->mbox,
sp_conn->private_group)) < 0)
raise_sp_error(n);
snprintf(sp_conn->spread_name, MAX_PROC_NAME, "%s",
RSTRING(host_str)->ptr);
sp_conn->connected = true;
return Qnil;
}