static void
unix_plugin_select (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc);
+
/**
* Function called for a quick conversion of the binary address to
* a numeric address. Note that the caller must not free the
* @return string representing the same address
*/
static const char *
-unix_address_to_string (void *cls, const void *addr, size_t addrlen);
+unix_address_to_string (void *cls, const void *addr, size_t addrlen)
+{
+ static char rbuf[1024];
+ struct UnixAddress *ua = (struct UnixAddress *) addr;
+ char *addrstr;
+ size_t addr_str_len;
+
+ if ((NULL == addr) || (sizeof (struct UnixAddress) > addrlen))
+ {
+ GNUNET_break(0);
+ return NULL ;
+ }
+ addrstr = (char *) &ua[1];
+ addr_str_len = ntohl (ua->addrlen);
+
+ if (addr_str_len != addrlen - sizeof(struct UnixAddress))
+ {
+ GNUNET_break(0);
+ return NULL ;
+ }
+
+ if ('\0' != addrstr[addr_str_len - 1])
+ {
+ GNUNET_break(0);
+ return NULL ;
+ }
+ if (strlen (addrstr) + 1 != addr_str_len)
+ {
+ GNUNET_break(0);
+ return NULL ;
+ }
+
+ GNUNET_snprintf (rbuf, sizeof(rbuf), "%s.%u.%s", PLUGIN_NAME,
+ ntohl (ua->options), addrstr);
+ return rbuf;
+}
+
static struct sockaddr_un *
-unix_address_to_sockaddr (const char *unixpath , socklen_t *sock_len)
+unix_address_to_sockaddr (const char *unixpath,
+ socklen_t *sock_len)
{
struct sockaddr_un *un;
size_t slen;
#if HAVE_SOCKADDR_IN_SIN_LEN
un->sun_len = (u_char) slen;
#endif
-#if LINUX
- un->sun_path[0] = '\0';
-#endif
-
(*sock_len) = slen;
return un;
}
+
/**
* Re-schedule the main 'select' callback (unix_plugin_select)
* for this plugin.
/**
- * Closure to 'lookup_session_it'.
+ * Closure to #lookup_session_it.
*/
struct LookupCtx
{
*/
const struct UnixAddress *ua;
+ /**
+ * Number of bytes in @e ua
+ */
size_t ua_len;
};
* @param cls the 'struct LookupCtx'
* @param key peer we are looking for (unused)
* @param value a session
- * @return GNUNET_YES if not found (continue looking), GNUNET_NO on success
+ * @return #GNUNET_YES if not found (continue looking), #GNUNET_NO on success
*/
-static int
+static int
lookup_session_it (void *cls,
const struct GNUNET_PeerIdentity * key,
void *value)
if (t->addrlen != lctx->ua_len)
{
- GNUNET_break (0);
+ GNUNET_break (0);
return GNUNET_YES;
}
* @return NULL if session was not found
*/
static struct Session *
-lookup_session (struct Plugin *plugin,
- const struct GNUNET_PeerIdentity *sender,
+lookup_session (struct Plugin *plugin,
+ const struct GNUNET_PeerIdentity *sender,
const struct UnixAddress *ua, size_t ua_len)
{
struct LookupCtx lctx;
lctx.s = NULL;
lctx.ua = ua;
lctx.ua_len = ua_len;
- GNUNET_CONTAINER_multipeermap_get_multiple (plugin->session_map,
+ GNUNET_CONTAINER_multipeermap_get_multiple (plugin->session_map,
sender,
&lookup_session_it, &lctx);
return lctx.s;
struct UNIXMessageWrapper *next;
int removed;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
"Disconnecting session for peer `%s' `%s'\n",
- GNUNET_i2s (&s->target),
+ GNUNET_i2s (&s->target),
s->addr);
plugin->env->session_end (plugin->env->cls, &s->target, s);
removed = GNUNET_NO;
msgw->payload, 0);
GNUNET_free (msgw->msg);
GNUNET_free (msgw);
- removed = GNUNET_YES;
+ removed = GNUNET_YES;
}
GNUNET_assert (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_remove (plugin->session_map,
- &s->target,
+ GNUNET_CONTAINER_multipeermap_remove (plugin->session_map,
+ &s->target,
s));
GNUNET_STATISTICS_set (plugin->env->stats,
"# UNIX sessions active",
LOG (GNUNET_ERROR_TYPE_DEBUG,
"UNIX transmit %u-byte message to %s (%d: %s)\n",
- (unsigned int) msgbuf_size,
+ (unsigned int) msgbuf_size,
GNUNET_a2s ((const struct sockaddr *)un, un_len),
(int) sent,
(sent < 0) ? STRERROR (errno) : "ok");
* Closure for 'get_session_it'.
*/
struct GetSessionIteratorContext
-{
+{
/**
* Location to store the session, if found.
*/
* @param cls the 'struct LookupCtx'
* @param key peer we are looking for (unused)
* @param value a session
- * @return GNUNET_YES if not found (continue looking), GNUNET_NO on success
+ * @return #GNUNET_YES if not found (continue looking), #GNUNET_NO on success
*/
static int
-get_session_it (void *cls,
- const struct GNUNET_PeerIdentity *key,
+get_session_it (void *cls,
+ const struct GNUNET_PeerIdentity *key,
void *value)
{
struct GetSessionIteratorContext *gsi = cls;
* @param tc scheduler context
*/
static void
-session_timeout (void *cls,
+session_timeout (void *cls,
const struct GNUNET_SCHEDULER_TaskContext *tc)
{
struct Session *s = cls;
-
+
s->timeout_task = GNUNET_SCHEDULER_NO_TASK;
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Session %p was idle for %s, disconnecting\n",
*
* @param cls closure ('struct Plugin*')
* @param session the session
- * @return the network type in HBO or GNUNET_SYSERR
+ * @return the network type in HBO or #GNUNET_SYSERR
*/
static enum GNUNET_ATS_Network_Type
-unix_get_network (void *cls,
+unix_get_network (void *cls,
struct Session *session)
{
GNUNET_assert (NULL != session);
gsi.address = (const char *) address->address;
gsi.addrlen = address->address_length;
gsi.res = NULL;
- GNUNET_CONTAINER_multipeermap_get_multiple (plugin->session_map,
- &address->peer,
+ GNUNET_CONTAINER_multipeermap_get_multiple (plugin->session_map,
+ &address->peer,
&get_session_it, &gsi);
if (NULL != gsi.res)
{
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
"Found existing session\n");
return gsi.res;
}
struct UNIXMessageWrapper *wrapper;
struct UNIXMessage *message;
int ssize;
-
+
GNUNET_assert (NULL != plugin);
GNUNET_assert (NULL != session);
- if (GNUNET_OK !=
+ if (GNUNET_OK !=
GNUNET_CONTAINER_multipeermap_contains_value (plugin->session_map,
&session->target,
session))
{
- LOG (GNUNET_ERROR_TYPE_ERROR,
+ LOG (GNUNET_ERROR_TYPE_ERROR,
"Invalid session for peer `%s' `%s'\n",
GNUNET_i2s (&session->target),
(const char *) session->addr);
GNUNET_break (0);
return GNUNET_SYSERR;
}
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
"Sending %u bytes with session for peer `%s' `%s'\n",
msgbuf_size,
GNUNET_i2s (&session->target),
wrapper->cont = cont;
wrapper->cont_cls = cont_cls;
wrapper->session = session;
- GNUNET_CONTAINER_DLL_insert (plugin->msg_head,
+ GNUNET_CONTAINER_DLL_insert (plugin->msg_head,
plugin->msg_tail,
wrapper);
plugin->bytes_in_queue += ssize;
GNUNET_STATISTICS_set (plugin->env->stats,
"# bytes currently in UNIX buffers",
- plugin->bytes_in_queue,
+ plugin->bytes_in_queue,
GNUNET_NO);
if (GNUNET_NO == plugin->with_ws)
reschedule_select (plugin);
* @param sender from which peer the message was received
* @param currhdr pointer to the header of the message
* @param ua address to look for
- * @param ua_len length of the address
+ * @param ua_len length of the address @a ua
*/
static void
unix_demultiplexer (struct Plugin *plugin, struct GNUNET_PeerIdentity *sender,
s->inbound = GNUNET_YES;
/* Notify transport and ATS about new inbound session */
plugin->env->session_start (NULL, sender,
- PLUGIN_NAME, NULL, 0, s, &plugin->ats_network, 1);
+ PLUGIN_NAME, ua, ua_len, s, &plugin->ats_network, 1);
}
reschedule_session_timeout (s);
}
else
{
-#if LINUX
- un.sun_path[0] = '/';
-#endif
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Read %d bytes from socket %s\n", ret,
- &un.sun_path[0]);
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Read %d bytes from socket %s\n",
+ (int) ret,
+ un.sun_path);
}
GNUNET_assert (AF_UNIX == (un.sun_family));
- ua_len = sizeof (struct UnixAddress) + strlen (&un.sun_path[0]) +1;
+ ua_len = sizeof (struct UnixAddress) + strlen (un.sun_path) + 1;
ua = GNUNET_malloc (ua_len);
ua->addrlen = htonl (strlen (&un.sun_path[0]) +1);
ua->options = htonl (0);
- memcpy (&ua[1], &un.sun_path[0], strlen (&un.sun_path[0]) +1);
+ memcpy (&ua[1], &un.sun_path[0], strlen (un.sun_path) + 1);
msg = (struct UNIXMessage *) buf;
csize = ntohs (msg->header.size);
break; /* Message is ready for sending */
/* Message has a timeout */
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Timeout for message with %u bytes \n",
+ "Timeout for message with %u bytes \n",
(unsigned int) msgw->msgsize);
GNUNET_CONTAINER_DLL_remove (plugin->msg_head, plugin->msg_tail, msgw);
plugin->bytes_in_queue -= msgw->msgsize;
- GNUNET_STATISTICS_set (plugin->env->stats,
+ GNUNET_STATISTICS_set (plugin->env->stats,
"# bytes currently in UNIX buffers",
- plugin->bytes_in_queue, GNUNET_NO);
+ plugin->bytes_in_queue, GNUNET_NO);
GNUNET_STATISTICS_update (plugin->env->stats,
"# UNIX bytes discarded",
msgw->msgsize,
GNUNET_NO);
if (NULL != msgw->cont)
msgw->cont (msgw->cont_cls,
- &msgw->session->target,
- GNUNET_SYSERR,
- msgw->payload,
- 0);
+ &msgw->session->target,
+ GNUNET_SYSERR,
+ msgw->payload,
+ 0);
GNUNET_free (msgw->msg);
- GNUNET_free (msgw);
+ GNUNET_free (msgw);
}
if (NULL == msgw)
return; /* Nothing to send at the moment */
GNUNET_assert (plugin->bytes_in_queue >= msgw->msgsize);
plugin->bytes_in_queue -= msgw->msgsize;
- GNUNET_STATISTICS_set (plugin->env->stats,
+ GNUNET_STATISTICS_set (plugin->env->stats,
"# bytes currently in UNIX buffers",
plugin->bytes_in_queue, GNUNET_NO);
GNUNET_STATISTICS_update (plugin->env->stats,
}
/* successfully sent bytes */
GNUNET_break (sent > 0);
- GNUNET_CONTAINER_DLL_remove (plugin->msg_head,
- plugin->msg_tail,
- msgw);
+ GNUNET_CONTAINER_DLL_remove (plugin->msg_head,
+ plugin->msg_tail,
+ msgw);
GNUNET_assert (plugin->bytes_in_queue >= msgw->msgsize);
plugin->bytes_in_queue -= msgw->msgsize;
GNUNET_STATISTICS_set (plugin->env->stats,
GNUNET_STATISTICS_update (plugin->env->stats,
"# bytes transmitted via UNIX",
msgw->msgsize,
- GNUNET_NO);
+ GNUNET_NO);
if (NULL != msgw->cont)
- msgw->cont (msgw->cont_cls, &msgw->session->target,
+ msgw->cont (msgw->cont_cls, &msgw->session->target,
GNUNET_OK,
- msgw->payload,
- msgw->msgsize);
+ msgw->payload,
+ msgw->msgsize);
GNUNET_free (msgw->msg);
GNUNET_free (msgw);
}
* Create a slew of UNIX sockets. If possible, use IPv6 and IPv4.
*
* @param cls closure for server start, should be a struct Plugin *
- * @return number of sockets created or GNUNET_SYSERR on error
+ * @return number of sockets created or #GNUNET_SYSERR on error
*/
static int
unix_transport_server_start (void *cls)
GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket");
return GNUNET_SYSERR;
}
- if (GNUNET_NETWORK_socket_bind (plugin->unix_sock.desc, (const struct sockaddr *) un, un_len, 0)
- != GNUNET_OK)
+ if (GNUNET_OK !=
+ GNUNET_NETWORK_socket_bind (plugin->unix_sock.desc, (const struct sockaddr *) un, un_len))
{
GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind");
GNUNET_NETWORK_socket_close (plugin->unix_sock.desc);
}
-/**
- * Function called for a quick conversion of the binary address to
- * a numeric address. Note that the caller must not free the
- * address and that the next call to this function is allowed
- * to override the address again.
- *
- * @param cls closure
- * @param addr binary address
- * @param addrlen length of the address
- * @return string representing the same address
- */
-static const char *
-unix_address_to_string (void *cls, const void *addr, size_t addrlen)
-{
- static char rbuf[1024];
- struct UnixAddress *ua = (struct UnixAddress *) addr;
- char *addrstr;
- size_t addr_str_len;
-
- if (0 == addrlen)
- {
- GNUNET_snprintf(rbuf, sizeof (rbuf), "%s", TRANSPORT_SESSION_INBOUND_STRING);
- }
- if ((NULL == addr) || (sizeof (struct UnixAddress) > addrlen))
- {
- GNUNET_break (0);
- return NULL;
- }
- addrstr = (char *) &ua[1];
- addr_str_len = ntohl (ua->addrlen);
-
- if (addr_str_len != addrlen - sizeof (struct UnixAddress))
- {
- GNUNET_break (0);
- return NULL;
- }
-
- if ('\0' != addrstr[addr_str_len - 1])
- {
- GNUNET_break (0);
- return NULL;
- }
- if (strlen (addrstr) + 1 != addr_str_len)
- {
- GNUNET_break (0);
- return NULL;
- }
-
- GNUNET_snprintf(rbuf, sizeof (rbuf), "%s.%u.%s", PLUGIN_NAME, ntohl (ua->options), addrstr);
- return rbuf;
-}
-
/**
* Function that will be called to check if a binary address for this
* plugin is well-formed and corresponds to an address for THIS peer
unix_string_to_address (void *cls, const char *addr, uint16_t addrlen,
void **buf, size_t *added)
{
- struct UnixAddress *ua;
+ struct UnixAddress *ua;
char *address;
char *plugin;
char *optionstr;
return GNUNET_SYSERR;
}
optionstr[0] = '\0';
- optionstr ++;
+ optionstr++;
options = atol (optionstr);
address = strchr (optionstr, '.');
if (NULL == address)
return GNUNET_SYSERR;
}
address[0] = '\0';
- address ++;
+ address++;
if (0 != strcmp(plugin, PLUGIN_NAME))
{
GNUNET_break (0);
* @return GNUNET_YES (always, continue to iterate)
*/
static int
-get_session_delete_it (void *cls,
- const struct GNUNET_PeerIdentity *key,
+get_session_delete_it (void *cls,
+ const struct GNUNET_PeerIdentity *key,
void *value)
{
struct Session *s = value;
* @return #GNUNET_OK on success, #GNUNET_SYSERR if the operation failed
*/
static void
-unix_disconnect (void *cls,
+unix_disconnect (void *cls,
const struct GNUNET_PeerIdentity *target)
{
struct Plugin *plugin = cls;
GNUNET_assert (plugin != NULL);
GNUNET_CONTAINER_multipeermap_get_multiple (plugin->session_map,
- target,
+ target,
&get_session_delete_it, plugin);
}
plugin = GNUNET_malloc (sizeof (struct Plugin));
plugin->port = port;
plugin->env = env;
- GNUNET_asprintf (&plugin->unix_socket_path,
+ GNUNET_asprintf (&plugin->unix_socket_path,
"/tmp/unix-plugin-sock.%d",
plugin->port);