+Sat Jun 5 18:08:39 CEST 2010
+ Added support for UNIX domain sockets, code also defaults to
+ them when available.
+
Sun May 2 13:49:10 CEST 2010
Fixed problem with platform-dependence of format for IP addresses
in HELLOs for TCP and UDP transport.
* UTIL:
- only connect() sockets that are ready (select()) [Nils]
[On W32, we need to select after calling socket before doing connect etc.]
- - add support for UNIX domain sockets [CG]
* GNUNET-GTK:
- search events:
+ results
- better crash management (attach debugging support, capture and analyze
debug output, detect random vs. deterministic crashes)
- discover dependencies between services
- => need UNIX domain sockets first!
- handle gnunet-arm -k in combination with auto-start magic (what is the right thing here?)
+ - add listen socket forwarding to child processes on supported platforms
* FS: [CG]
- datastore reservation (publishing)
- location URIs (publish, search, download)
ACCEPT_FROM = 127.0.0.1;
ACCEPT_FROM6 = ::1;
DEFAULTSERVICES = resolver transport core topology hostlist
+UNIXPATH = /tmp/gnunet-service-arm.sock
# GLOBAL_POSTFIX = -l $SERVICEHOME/{}-logs
# GLOBAL_PREFIX =
# USERNAME =
BINARY = gnunet-service-statistics
ACCEPT_FROM = 127.0.0.1;
ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/gnunet-service-statistics.sock
# USERNAME =
# MAXBUF =
# TIMEOUT =
BINARY = gnunet-service-resolver
ACCEPT_FROM = 127.0.0.1;
ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/gnunet-service-resolver.sock
# USERNAME =
# MAXBUF =
# TIMEOUT =
BINARY = gnunet-service-peerinfo
ACCEPT_FROM = 127.0.0.1;
ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/gnunet-service-peerinfo.sock
# USERNAME =
# MAXBUF =
# TIMEOUT =
ACCEPT_FROM = 127.0.0.1;
ACCEPT_FROM6 = ::1;
PLUGINS = tcp
+UNIXPATH = /tmp/gnunet-service-transport.sock
# USERNAME =
# MAXBUF =
# TIMEOUT =
# quotas are in bytes per second now!
TOTAL_QUOTA_IN = 65536
TOTAL_QUOTA_OUT = 65536
+UNIXPATH = /tmp/gnunet-service-core.sock
# DEBUG = YES
# USERNAME =
# MAXBUF =
[datastore]
AUTOSTART = YES
+UNIXPATH = /tmp/gnunet-service-datastore.sock
PORT = 2093
HOSTNAME = localhost
HOME = $SERVICEHOME
ACCEPT_FROM = 127.0.0.1;
ACCEPT_FROM6 = ::1;
ACTIVEMIGRATION = YES
+UNIXPATH = /tmp/gnunet-service-fs.sock
# DEBUG = YES
case AF_INET6:
sock = GNUNET_NETWORK_socket_create (PF_INET6, SOCK_STREAM, 0);
break;
+ case AF_UNIX:
+ sock = GNUNET_NETWORK_socket_create (PF_UNIX, SOCK_STREAM, 0);
+ break;
default:
+ GNUNET_break (0);
sock = NULL;
+ errno = EAFNOSUPPORT;
break;
}
if (NULL == sock)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _("Unable to create socket for service `%s'"),
- serviceName);
+ _("Unable to create socket for service `%s': %s\n"),
+ serviceName,
+ STRERROR (errno));
GNUNET_free (sa);
return;
}
[resolver]
PORT = 12464
+UNIXPATH = /tmp/gnunet-p1-service-resolver.sock
#PREFIX = xterm -T resolver1 -e valgrind --tool=memcheck
[transport]
PORT = 12465
+UNIXPATH = /tmp/gnunet-p1-service-transport.sock
PLUGINS = tcp
#PREFIX = xterm -T transport1 -e
#PREFIX= xterm -e xterm -T transport1 -e gdb --args
[arm]
PORT = 12466
+UNIXPATH = /tmp/gnunet-p1-service-arm.sock
DEFAULTSERVICES =
#GLOBAL_PREFIX = xterm -e valgrind --tool=memcheck
[peerinfo]
PORT = 12469
+UNIXPATH = /tmp/gnunet-p1-service-peerinfo.sock
#PREFIX = xterm -T peerinfo1 -e valgrind --tool=memcheck
#PREFIX = xterm -T peerinfo1 -e
#DEBUG = YES
[core]
PORT = 12470
+UNIXPATH = /tmp/gnunet-p1-service-core.sock
#PREFIX = valgrind --tool=memcheck
#OPTIONS = -l log-core-1
#PREFIX = xterm -e xterm -T core1 -e gdb --args
[resolver]
PORT = 22464
+UNIXPATH = /tmp/gnunet-p2-service-resolver.sock
#PREFIX = xterm -T resolver2 -e valgrind --tool=memcheck
[transport]
PORT = 22465
+UNIXPATH = /tmp/gnunet-p2-service-transport.sock
PLUGINS = tcp
#PREFIX = xterm -T transport2 -e gdb --args
#PREFIX = xterm -e xterm -T transport2 -e gdb --args
[arm]
PORT = 22466
+UNIXPATH = /tmp/gnunet-p2-service-arm.sock
DEFAULTSERVICES =
#GLOBAL_PREFIX = xterm -e valgrind --tool=memcheck
[statistics]
PORT = 22467
+UNIXPATH = /tmp/gnunet-p2-service-statistics.sock
#PREFIX = xterm -T statistics2 -e valgrind --tool=memcheck
[transport-tcp]
[peerinfo]
PORT = 22469
+UNIXPATH = /tmp/gnunet-p2-service-peerinfo.sock
#PREFIX = xterm -T peerinfo2 -e valgrind --tool=memcheck
#PREFIX = xterm -T peerinfo2 -e
#DEBUG = YES
[core]
PORT = 22470
+UNIXPATH = /tmp/gnunet-p2-service-core.sock
#PREFIX = xterm -T core2 -e
#PREFIX = valgrind --tool=memcheck
#DEBUG = YES
[resolver]
PORT = 12964
+UNIXPATH = /tmp/gnunet-p1-service-resolver.sock
[transport]
PORT = 12965
+UNIXPATH = /tmp/gnunet-p1-service-transport.sock
PLUGINS = tcp
#DEBUG = YES
DEBUG = NO
[arm]
PORT = 12966
+UNIXPATH = /tmp/gnunet-p1-service-arm.sock
DEFAULTSERVICES = hostlist topology
#GLOBAL_PREFIX = xterm -e gdb -x cmd --args
[statistics]
PORT = 12967
+UNIXPATH = /tmp/gnunet-p1-service-statistics.sock
[transport-tcp]
PORT = 12968
[peerinfo]
PORT = 12969
+UNIXPATH = /tmp/gnunet-p1-service-peerinfo.sock
[core]
PORT = 12970
+UNIXPATH = /tmp/gnunet-p1-service-core.sock
#DEBUG = YES
#PREFIX = valgrind --tool=memcheck\
DEBUG = NO
[resolver]
PORT = 22964
+UNIXPATH = /tmp/gnunet-p2-service-resolver.sock
DEBUG = NO
[transport]
PORT = 22965
+UNIXPATH = /tmp/gnunet-p2-service-transport.sock
PLUGINS = tcp
DEBUG = NO
[arm]
PORT = 22966
+UNIXPATH = /tmp/gnunet-p2-service-arm.sock
DEFAULTSERVICES = hostlist topology
#GLOBAL_PREFIX = xterm -e gdb -x cmd --args
DEBUG = NO
[statistics]
PORT = 22967
+UNIXPATH = /tmp/gnunet-p2-service-statistics.sock
[transport-tcp]
PORT = 22968
[peerinfo]
PORT = 22969
+UNIXPATH = /tmp/gnunet-p2-service-peerinfo.sock
[core]
PORT = 22970
+UNIXPATH = /tmp/gnunet-p2-service-core.sock
DEBUG = NO
#PREFIX = valgrind --tool=memcheck
AUTOSTART = NO
[datastore]
-AUTOSTART = NO
\ No newline at end of file
+AUTOSTART = NO
const struct GNUNET_CONFIGURATION_Handle *cfg,\r
const char *hostname,\r
uint16_t port,\r
- size_t maxbuf);\r
+ size_t maxbuf);
+
+
+/**
+ * Create a socket handle by connecting to a UNIX domain service.
+ * This function returns immediately, even if the connection has not
+ * yet been established. This function only creates UNIX connections.
+ *
+ * @param sched scheduler to use
+ * @param cfg configuration to use
+ * @param unixpath path to connect to
+ * @param maxbuf maximum write buffer size for the socket (use
+ * 0 for sockets that need no write buffers, such as listen sockets)
+ * @return the socket handle, NULL on systems without UNIX support
+ */
+struct GNUNET_CONNECTION_Handle *
+GNUNET_CONNECTION_create_from_connect_to_unixpath (struct GNUNET_SCHEDULER_Handle *sched,
+ const struct
+ GNUNET_CONFIGURATION_Handle *cfg,
+ const char *unixpath,
+ size_t maxbuf);
+
\r
\r
\r
#ifndef MINGW
#include <netdb.h>
#include <sys/socket.h>
+#include <sys/un.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <arpa/inet.h>
[resolver]
PORT = 12564
+UNIXPATH = /tmp/gnunet-p1-service-resolver.sock
HOSTNAME = localhost
[transport]
PORT = 12565
+UNIXPATH = /tmp/gnunet-p1-service-transport.sock
HOSTNAME = localhost
PLUGINS = tcp
#PREFIX = xterm -e xterm -T transport -e gdb -x cmd --args
[arm]
PORT = 12566
+UNIXPATH = /tmp/gnunet-p1-service-arm.sock
HOSTNAME = localhost
DEFAULTSERVICES =
#DEBUG = YES
[statistics]
PORT = 12567
+UNIXPATH = /tmp/gnunet-p1-service-statistics.sock
HOSTNAME = localhost
[transport-tcp]
[peerinfo]
PORT = 12569
+UNIXPATH = /tmp/gnunet-p1-service-peerinfo.sock
HOSTNAME = localhost
[core]
PORT = 12570
+UNIXPATH = /tmp/gnunet-p1-service-core.sock
HOSTNAME = localhost
#DEBUG = YES
[resolver]
PORT = 22564
+UNIXPATH = /tmp/gnunet-p2-service-resolver.sock
HOSTNAME = localhost
[transport]
PORT = 22565
+UNIXPATH = /tmp/gnunet-p2-service-transport.sock
HOSTNAME = localhost
PLUGINS = tcp
#PREFIX = xterm -e xterm -T transport -e gdb -x cmd --args
[arm]
PORT = 22566
+UNIXPATH = /tmp/gnunet-p2-service-arm.sock
DEFAULTSERVICES =
HOSTNAME = localhost
#DEBUG = YES
[statistics]
PORT = 22567
+UNIXPATH = /tmp/gnunet-p2-service-statistics.sock
HOSTNAME = localhost
[transport-tcp]
[peerinfo]
PORT = 22569
+UNIXPATH = /tmp/gnunet-p2-service-peerinfo.sock
HOSTNAME = localhost
[core]
PORT = 22570
+UNIXPATH = /tmp/gnunet-p2-service-core.sock
HOSTNAME = localhost
#DEBUG = YES
struct UpdateContext
{
struct GNUNET_CONFIGURATION_Handle *ret;
- unsigned int nport;
const char *hostname;
+ unsigned int nport;
+ unsigned int upnum;
};
struct UpdateContext *ctx = cls;
unsigned int ival;
char cval[12];
+ char uval[128];
if ((0 == strcmp (option, "PORT")) && (1 == sscanf (value, "%u", &ival)))
{
- GNUNET_snprintf (cval, sizeof (cval), "%u", ctx->nport++);
- value = cval;
+ if (ival != 0)
+ {
+ GNUNET_snprintf (cval, sizeof (cval), "%u", ctx->nport++);
+ value = cval;
+ }
+ }
+
+ if (0 == strcmp (option, "UNIXPATH"))
+ {
+ GNUNET_snprintf (uval,
+ sizeof (uval),
+ "/tmp/test-service-%s-%u",
+ section,
+ ctx->upnum++);
+ value = uval;
}
if ((0 == strcmp (option, "HOSTNAME")) && (ctx->hostname != NULL))
* @param cfg template configuration
* @param port port numbers to use, update to reflect
* port numbers that were used
+ * @param upnum number to make unix domain socket names unique
* @param hostname hostname of the controlling host, to allow control connections from
*
* @return new configuration, NULL on error
*/
static struct GNUNET_CONFIGURATION_Handle *
-make_config (const struct GNUNET_CONFIGURATION_Handle *cfg, uint16_t * port, const char *hostname)
+make_config (const struct GNUNET_CONFIGURATION_Handle *cfg,
+ uint16_t * port,
+ uint32_t * upnum,
+ const char *hostname)
{
struct UpdateContext uc;
uint16_t orig;
orig = *port;
uc.nport = *port;
+ uc.upnum = *upnum;
uc.ret = GNUNET_CONFIGURATION_create ();
uc.hostname = hostname;
}
*port = (uint16_t) uc.nport;
+ *upnum = uc.upnum;
return uc.ret;
}
unsigned int off;
unsigned int hostcnt;
uint16_t minport;
+ uint32_t upnum;
if (0 == total)
{
GNUNET_break (0);
return NULL;
}
-
+ upnum = 0;
pg = GNUNET_malloc (sizeof (struct GNUNET_TESTING_PeerGroup));
pg->sched = sched;
pg->cfg = cfg;
if (hostcnt > 0)
{
hostname = pg->hosts[off % hostcnt].hostname;
- pcfg = make_config (cfg, &pg->hosts[off % hostcnt].minport, hostname);
+ pcfg = make_config (cfg,
+ &pg->hosts[off % hostcnt].minport,
+ &upnum,
+ hostname);
}
else
{
hostname = NULL;
- pcfg = make_config (cfg, &minport, hostname);
+ pcfg = make_config (cfg,
+ &minport,
+ &upnum,
+ hostname);
}
if (NULL == pcfg)
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12365
+UNIXPATH = /tmp/gnunet-p1-service-transport.sock
[peerinfo]
TRUST = $SERVICEHOME/data/credit/
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12369
+UNIXPATH = /tmp/gnunet-p1-service-peerinfo.sock
[resolver]
ACCEPT_FROM6 = ::1;
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12364
+UNIXPATH = /tmp/gnunet-p1-service-resolver.sock
[statistics]
ACCEPT_FROM6 = ::1;
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12367
+UNIXPATH = /tmp/gnunet-p1-service-statistics.sock
[arm]
DEFAULTSERVICES =
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12366
+UNIXPATH = /tmp/gnunet-p1-service-arm.sock
[transport-http]
PORT = 12389
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22365
+UNIXPATH = /tmp/gnunet-p2-service-transport.sock
#PREFIX = xterm -T transport1 -e gdb --command=cmd --args
#PREFIX = valgrind --leak-check=full
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22369
+UNIXPATH = /tmp/gnunet-p2-service-peerinfo.sock
[resolver]
ACCEPT_FROM6 = ::1;
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22364
+UNIXPATH = /tmp/gnunet-p2-service-resolver.sock
[statistics]
ACCEPT_FROM6 = ::1;
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22367
+UNIXPATH = /tmp/gnunet-p2-service-statistics.sock
+
[arm]
DEFAULTSERVICES =
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22366
+UNIXPATH = /tmp/gnunet-p2-service-arm.sock
+
[transport-http]
PORT = 22389
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12365
+UNIXPATH = /tmp/gnunet-p1-service-transport.sock
[peerinfo]
TRUST = $SERVICEHOME/data/credit/
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12369
+UNIXPATH = /tmp/gnunet-p1-service-peerinfo.sock
[resolver]
ACCEPT_FROM6 = ::1;
CONFIG = $DEFAULTCONFIG
HOME = $SERVICEHOME
HOSTNAME = localhost
-PORT = 12364
+PORT = 1236
+UNIXPATH = /tmp/gnunet-p1-service-resolver.sock
[statistics]
ACCEPT_FROM6 = ::1;
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12367
+UNIXPATH = /tmp/gnunet-p1-service-statistics.sock
[arm]
DEFAULTSERVICES = transport statistics
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12366
+UNIXPATH = /tmp/gnunet-p1-service-arm.sock
[transport-tcp]
TIMEOUT = 300000
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22365
+UNIXPATH = /tmp/gnunet-p2-service-transport.sock
#PREFIX = xterm -T transport1 -e gdb --command=cmd --args
#PREFIX = valgrind --leak-check=full
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22369
+UNIXPATH = /tmp/gnunet-p2-service-peerinfo.sock
[resolver]
ACCEPT_FROM6 = ::1;
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22364
+UNIXPATH = /tmp/gnunet-p2-service-resolver.sock
[statistics]
ACCEPT_FROM6 = ::1;
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22367
+UNIXPATH = /tmp/gnunet-p2-service-statistics.sock
[arm]
DEFAULTSERVICES = transport statistics
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22366
+UNIXPATH = /tmp/gnunet-p2-service-arm.sock
[transport-tcp]
TIMEOUT = 300000
EXTERNAL_ADDRESS = 127.0.0.1
[fs]
-ACCEPT_FROM6 = ::1;
-ACCEPT_FROM = 127.0.0.1;
-BINARY = gnunet-service-fs
-CONFIG = $DEFAULTCONFIG
-HOME = $SERVICEHOME
-HOSTNAME = localhost
-PORT = 2094
-INDEXDB = $SERVICEHOME/idxinfo.lst
+AUTOSTART = NO
[datastore-sqlite]
FILENAME = $SERVICEHOME/datastore/sqlite.db
[datastore]
-DATABASE = sqlite
-BLOOMFILTER = $SERVICEHOME/fs/bloomfilter
-QUOTA = 100000000
-ACCEPT_FROM6 = ::1;
-ACCEPT_FROM = 127.0.0.1;
-BINARY = gnunet-service-datastore
-CONFIG = $DEFAULTCONFIG
-HOME = $SERVICEHOME
-HOSTNAME = localhost
-PORT = 2093
+AUTOSTART = NO
[hostlist]
HTTP-PROXY =
MINIMUM-FRIENDS = 0
[core]
-TOTAL_QUOTA_OUT = 3932160
-TOTAL_QUOTA_IN = 3932160
-ACCEPT_FROM6 = ::1;
-ACCEPT_FROM = 127.0.0.1;
-BINARY = gnunet-service-core
-CONFIG = $DEFAULTCONFIG
-HOME = $SERVICEHOME
-HOSTNAME = localhost
-PORT = 2092
+AUTOSTART = NO
[transport]
PLUGINS = udp_nat
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12365
+UNIXPATH = /tmp/gnunet-p1-service-transport.sock
#PREFIX = valgrind --track-origins=yes --leak-check=full --log-file=valgrind_udp_peer1.log
#PREFIX = xterm -e xterm -T transport -e gdb --args
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12369
+UNIXPATH = /tmp/gnunet-p1-service-peerinfo.sock
[resolver]
ACCEPT_FROM6 = ::1;
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12364
+UNIXPATH = /tmp/gnunet-p1-service-resolver.sock
[statistics]
ACCEPT_FROM6 = ::1;
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12367
+UNIXPATH = /tmp/gnunet-p1-service-statistics.sock
[arm]
DEFAULTSERVICES =
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12366
+UNIXPATH = /tmp/gnunet-p1-service-arm.sock
[transport-tcp]
TIMEOUT = 300000
INTERNAL_ADDRESS = 127.0.0.1
[fs]
-ACCEPT_FROM6 = ::1;
-ACCEPT_FROM = 127.0.0.1;
-BINARY = gnunet-service-fs
-CONFIG = $DEFAULTCONFIG
-HOME = $SERVICEHOME
-HOSTNAME = localhost
-PORT = 2094
-INDEXDB = $SERVICEHOME/idxinfo.lst
-
-[datastore-sqlite]
-FILENAME = $SERVICEHOME/datastore/sqlite.db
+AUTOSTART = NO
[datastore]
-DATABASE = sqlite
-BLOOMFILTER = $SERVICEHOME/fs/bloomfilter
-QUOTA = 100000000
-ACCEPT_FROM6 = ::1;
-ACCEPT_FROM = 127.0.0.1;
-BINARY = gnunet-service-datastore
-CONFIG = $DEFAULTCONFIG
-HOME = $SERVICEHOME
-HOSTNAME = localhost
-PORT = 2093
+AUTOSTART = NO
[hostlist]
HTTP-PROXY =
MINIMUM-FRIENDS = 0
[core]
-TOTAL_QUOTA_OUT = 3932160
-TOTAL_QUOTA_IN = 3932160
-ACCEPT_FROM6 = ::1;
-ACCEPT_FROM = 127.0.0.1;
-BINARY = gnunet-service-core
-CONFIG = $DEFAULTCONFIG
-HOME = $SERVICEHOME
-HOSTNAME = localhost
-PORT = 2092
+AUTOSTART = NO
[transport]
PLUGINS = udp_nat
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22365
+UNIXPATH = /tmp/gnunet-p2-service-transport.sock
#PREFIX = xterm -e xterm -T transport -e gdb --args
[peerinfo]
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22369
+UNIXPATH = /tmp/gnunet-p2-service-peerinfo.sock
[resolver]
ACCEPT_FROM6 = ::1;
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22364
+UNIXPATH = /tmp/gnunet-p2-service-resolver.sock
[statistics]
ACCEPT_FROM6 = ::1;
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22367
+UNIXPATH = /tmp/gnunet-p2-service-statistics.sock
[arm]
DEFAULTSERVICES =
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22366
+UNIXPATH = /tmp/gnunet-p2-service-arm.sock
[transport-tcp]
TIMEOUT = 300000
MINIMUM-FRIENDS = 0
[core]
-TOTAL_QUOTA_OUT = 3932160
-TOTAL_QUOTA_IN = 3932160
-ACCEPT_FROM6 = ::1;
-ACCEPT_FROM = 127.0.0.1;
-BINARY = gnunet-service-core
-CONFIG = $DEFAULTCONFIG
-HOME = $SERVICEHOME
-HOSTNAME = localhost
-PORT = 2092
+AUTOSTART = NO
[transport]
PLUGINS = udp
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12365
+UNIXPATH = /tmp/gnunet-p1-service-transport.sock
#PREFIX = valgrind --track-origins=yes --leak-check=full --log-file=valgrind_udp_peer1.log
#PREFIX = xterm -e xterm -T transport -e gdb --args
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12369
+UNIXPATH = /tmp/gnunet-p1-service-peerinfo.sock
[resolver]
ACCEPT_FROM6 = ::1;
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12364
+UNIXPATH = /tmp/gnunet-p1-service-resolver.sock
[statistics]
ACCEPT_FROM6 = ::1;
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12367
+UNIXPATH = /tmp/gnunet-p1-service-statistics.sock
[arm]
DEFAULTSERVICES =
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 12366
+UNIXPATH = /tmp/gnunet-p1-service-arm.sock
[transport-tcp]
TIMEOUT = 300000
FRIENDS-ONLY = NO
MINIMUM-FRIENDS = 0
-[core]
-TOTAL_QUOTA_OUT = 3932160
-TOTAL_QUOTA_IN = 3932160
-ACCEPT_FROM6 = ::1;
-ACCEPT_FROM = 127.0.0.1;
-BINARY = gnunet-service-core
-CONFIG = $DEFAULTCONFIG
-HOME = $SERVICEHOME
-HOSTNAME = localhost
-PORT = 2092
-
[transport]
PLUGINS = udp
DEBUG = NO
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22365
+UNIXPATH = /tmp/gnunet-p1-service-transport.sock
#PREFIX = valgrind --track-origins=yes --leak-check=full --log-file=valgrind_udp_peer2.log
[peerinfo]
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22369
+UNIXPATH = /tmp/gnunet-p1-service-peerinfo.sock
[resolver]
ACCEPT_FROM6 = ::1;
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22364
+UNIXPATH = /tmp/gnunet-p1-service-resolver.sock
[statistics]
ACCEPT_FROM6 = ::1;
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22367
+UNIXPATH = /tmp/gnunet-p1-service-statistics.sock
[arm]
DEFAULTSERVICES =
HOME = $SERVICEHOME
HOSTNAME = localhost
PORT = 22366
+UNIXPATH = /tmp/gnunet-p1-service-arm.sock
[transport-tcp]
TIMEOUT = 300000
GNUNET_BANDWIDTH_tracker_consume (struct GNUNET_BANDWIDTH_Tracker *av,
ssize_t size)
{
- uint64_t nc;
+ int64_t nc;
#if DEBUG_BANDWIDTH
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
* Are we ignoring shutdown signals?
*/
int ignore_shutdown;
+
+ /**
+ * How often have we tried to connect?
+ */
+ unsigned int attempts;
};
+/**
+ * Try to connect to the service.
+ *
+ * @param sched scheduler to use
+ * @param service_name name of service to connect to
+ * @param cfg configuration to use
+ * @param attempt counter used to alternate between IP and UNIX domain sockets
+ * @return NULL on error
+ */
static struct GNUNET_CONNECTION_Handle *
do_connect (struct GNUNET_SCHEDULER_Handle *sched,
const char *service_name,
- const struct GNUNET_CONFIGURATION_Handle *cfg)
+ const struct GNUNET_CONFIGURATION_Handle *cfg,
+ unsigned int attempt)
{
struct GNUNET_CONNECTION_Handle *sock;
char *hostname;
+ char *unixpath;
unsigned long long port;
+#if AF_UNIX
+ if (0 == attempt % 2)
+ {
+ /* on even rounds, try UNIX */
+ if (GNUNET_OK ==
+ GNUNET_CONFIGURATION_get_value_string (cfg,
+ service_name,
+ "UNIXPATH", &unixpath))
+ {
+ sock = GNUNET_CONNECTION_create_from_connect_to_unixpath (sched,
+ cfg,
+ unixpath,
+ GNUNET_SERVER_MAX_MESSAGE_SIZE);
+ GNUNET_free (unixpath);
+ if (sock != NULL)
+ return sock;
+ }
+ }
+#endif
+
if ((GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_number (cfg,
service_name,
struct GNUNET_CLIENT_Connection *ret;
struct GNUNET_CONNECTION_Handle *sock;
- sock = do_connect (sched, service_name, cfg);
+ sock = do_connect (sched,
+ service_name,
+ cfg, 0);
if (sock == NULL)
return NULL;
ret = GNUNET_malloc (sizeof (struct GNUNET_CLIENT_Connection));
+ ret->attempts = 1;
ret->sock = sock;
ret->sched = sched;
ret->service_name = GNUNET_strdup (service_name);
/* auto-retry */
GNUNET_CONNECTION_destroy (th->sock->sock, GNUNET_NO);
th->sock->sock = do_connect (th->sock->sched,
- th->sock->service_name, th->sock->cfg);
+ th->sock->service_name,
+ th->sock->cfg,
+ th->sock->attempts++);
GNUNET_assert (NULL != th->sock->sock);
GNUNET_CONNECTION_ignore_shutdown (th->sock->sock,
th->sock->ignore_shutdown);
static char buf[INET6_ADDRSTRLEN + 8];
static char b2[6];
const struct sockaddr_in *v4;
+ const struct sockaddr_un *un;
const struct sockaddr_in6 *v6;
+ unsigned int off;
if (addr == NULL)
return _("unknown address");
sprintf (b2, "%u", ntohs (v6->sin6_port));
strcat (buf, b2);
return buf;
+ case AF_UNIX:
+ un = (const struct sockaddr_un*) addr;
+ off = 0;
+ if (un->sun_path[0] == '\0') off++;
+ snprintf (buf,
+ sizeof (buf),
+ "%s%.*s",
+ (off == 1) ? "@" : "",
+ addrlen - sizeof (sa_family_t) - 1 - off,
+ &un->sun_path[off]);
+ return buf;
default:
return _("invalid address");
}
}
+/**
+ * Create a socket handle by connecting to a UNIX domain service.
+ * This function returns immediately, even if the connection has not
+ * yet been established. This function only creates UNIX connections.
+ *
+ * @param sched scheduler to use
+ * @param cfg configuration to use
+ * @param unixpath path to connect to
+ * @param maxbuf maximum write buffer size for the socket (use
+ * 0 for sockets that need no write buffers, such as listen sockets)
+ * @return the socket handle, NULL on systems without UNIX support
+ */
+struct GNUNET_CONNECTION_Handle *
+GNUNET_CONNECTION_create_from_connect_to_unixpath (struct GNUNET_SCHEDULER_Handle *sched,
+ const struct
+ GNUNET_CONFIGURATION_Handle *cfg,
+ const char *unixpath,
+ size_t maxbuf)
+{
+#ifdef AF_UNIX
+ struct GNUNET_CONNECTION_Handle *ret;
+ struct sockaddr_un *un;
+ size_t slen;
+
+ GNUNET_assert (0 < strlen (unixpath)); /* sanity check */
+ un = GNUNET_malloc (sizeof (struct sockaddr_un));
+ un->sun_family = AF_UNIX;
+ slen = strlen (unixpath) + 1;
+ if (slen >= sizeof (un->sun_path))
+ slen = sizeof (un->sun_path) - 1;
+ memcpy (un->sun_path,
+ unixpath,
+ slen);
+ un->sun_path[slen] = '\0';
+ slen += sizeof (sa_family_t);
+#if LINUX
+ un->sun_path[0] = '\0';
+ slen = sizeof (struct sockaddr_un);
+#endif
+ ret = GNUNET_malloc (sizeof (struct GNUNET_CONNECTION_Handle) + maxbuf);
+ ret->cfg = cfg;
+ ret->sched = sched;
+ ret->write_buffer = (char *) &ret[1];
+ ret->write_buffer_size = maxbuf;
+ ret->port = 0;
+ ret->hostname = NULL;
+ ret->addr = (struct sockaddr*) un;
+ ret->addrlen = slen;
+ ret->sock = GNUNET_NETWORK_socket_create (AF_UNIX, SOCK_STREAM, 0);
+ if (GNUNET_OK != GNUNET_NETWORK_socket_connect (ret->sock,
+ ret->addr,
+ ret->addrlen))
+ {
+ GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (ret->sock));
+ GNUNET_free (ret->addr);
+ GNUNET_free (ret);
+ return NULL;
+ }
+ connect_success_continuation (ret);
+ return ret;
+#else
+ return NULL;
+#endif
+}
+
+
/**
* Create a socket handle by (asynchronously) connecting to a host.
* This function returns immediately, even if the connection has not
#ifdef DARWIN
socket_set_nosigpipe (ret);
#endif
- socket_set_nodelay (ret);
+#ifdef AF_UNIX
+ if (address->sa_family != AF_UNIX)
+#endif
+ socket_set_nodelay (ret);
return ret;
}
#ifdef DARWIN
socket_set_nosigpipe (ret);
#endif
- if (type == SOCK_STREAM)
+ if ( (type == SOCK_STREAM)
+#ifdef AF_UNIX
+ && (domain != AF_UNIX)
+#endif
+ )
socket_set_nodelay (ret);
return ret;
}
&& ((sctx->v6_denied == NULL) ||
(!check_ipv6_listed (sctx->v6_denied, &i6->sin6_addr)));
break;
+ case AF_UNIX:
+ /* FIXME: support checking UID/GID in the future... */
+ ret = GNUNET_OK; /* always OK for now */
+ break;
default:
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
_("Unknown address family %d\n"), addr->sa_family);
return GNUNET_OK;
}
+/**
+ * Add the given UNIX domain path as an address to the
+ * list (as the first entry).
+ *
+ * @param saddrs array to update
+ * @param saddrlens where to store the address length
+ * @param unixpath path to add
+ */
+static void
+add_unixpath (struct sockaddr **saddrs,
+ socklen_t *saddrlens,
+ const char *unixpath)
+{
+#ifdef AF_UNIX
+ struct sockaddr_un *un;
+ size_t slen;
+
+ un = GNUNET_malloc (sizeof (struct sockaddr_un));
+ un->sun_family = AF_UNIX;
+ slen = strlen (unixpath) + 1;
+ if (slen >= sizeof (un->sun_path))
+ slen = sizeof (un->sun_path) - 1;
+ memcpy (un->sun_path,
+ unixpath,
+ slen);
+ un->sun_path[slen] = '\0';
+ slen += sizeof (sa_family_t);
+#if LINUX
+ un->sun_path[0] = '\0';
+ slen = sizeof (struct sockaddr_un);
+#endif
+ *saddrs = (struct sockaddr*) un;
+ *saddrlens = slen;
+#else
+ /* this function should never be called
+ unless AF_UNIX is defined! */
+ GNUNET_assert (0);
+#endif
+}
+
/**
* Get the list of addresses that a server for the given service
int disablev6;
struct GNUNET_NETWORK_Handle *desc;
unsigned long long port;
+ char *unixpath;
struct addrinfo hints;
struct addrinfo *res;
struct addrinfo *pos;
}
}
-
- if ((GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_number (cfg,
- serviceName,
- "PORT",
- &port)) || (port > 65535))
+ port = 0;
+ if (GNUNET_CONFIGURATION_have_value (cfg,
+ serviceName, "PORT"))
{
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _
- ("Require valid port number for service `%s' in configuration!\n"),
- serviceName);
- return GNUNET_SYSERR;
+ GNUNET_break (GNUNET_OK ==
+ GNUNET_CONFIGURATION_get_value_number (cfg,
+ serviceName,
+ "PORT",
+ &port));
+ if (port > 65535)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _
+ ("Require valid port number for service `%s' in configuration!\n"),
+ serviceName);
+ return GNUNET_SYSERR;
+ }
}
+
if (GNUNET_CONFIGURATION_have_value (cfg,
serviceName, "BINDTO"))
{
else
hostname = NULL;
+#ifdef AF_UNIX
+ if (GNUNET_CONFIGURATION_have_value (cfg,
+ serviceName, "UNIXPATH"))
+ {
+ GNUNET_break (GNUNET_OK ==
+ GNUNET_CONFIGURATION_get_value_string (cfg,
+ serviceName,
+ "UNIXPATH",
+ &unixpath));
+
+ /* probe UNIX support */
+ desc = GNUNET_NETWORK_socket_create (AF_UNIX, SOCK_STREAM, 0);
+ if (NULL == desc)
+ {
+ if ((errno == ENOBUFS) ||
+ (errno == ENOMEM) || (errno == ENFILE) || (errno == EACCES))
+ {
+ GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket");
+ return GNUNET_SYSERR;
+ }
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ _
+ ("Disabling UNIX domainn socket support for service `%s', failed to create UNIX domain socket: %s\n"),
+ serviceName, STRERROR (errno));
+ GNUNET_free (unixpath);
+ unixpath = NULL;
+ }
+ }
+ else
+ unixpath = NULL;
+#else
+ unixpath = NULL;
+#endif
+
+ if ( (port == 0) &&
+ (unixpath == NULL) )
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _("Have neither PORT nor UNIXPATH for service `%s', but one is required\n"),
+ serviceName);
+ return GNUNET_SYSERR;
+ }
+
if (hostname != NULL)
{
#if DEBUG_SERVICE
return GNUNET_SYSERR;
}
resi = i;
- saddrs = GNUNET_malloc ((i+1) * sizeof(struct sockaddr*));
- saddrlens = GNUNET_malloc ((i+1) * sizeof (socklen_t));
+ if (NULL != unixpath)
+ resi++;
+ saddrs = GNUNET_malloc ((resi+1) * sizeof(struct sockaddr*));
+ saddrlens = GNUNET_malloc ((resi+1) * sizeof (socklen_t));
i = 0;
+ if (NULL != unixpath)
+ {
+ add_unixpath (saddrs, saddrlens, unixpath);
+ i++;
+ }
next = res;
while (NULL != (pos = next))
{
{
/* V4-only */
resi = 1;
- saddrs = GNUNET_malloc (2 * sizeof(struct sockaddr*));
- saddrlens = GNUNET_malloc (2 * sizeof (socklen_t));
- saddrlens[0] = sizeof (struct sockaddr_in);
- saddrs[0] = GNUNET_malloc (saddrlens[0]);
+ if (NULL != unixpath)
+ resi++;
+ i = 0;
+ saddrs = GNUNET_malloc ((resi+1) * sizeof(struct sockaddr*));
+ saddrlens = GNUNET_malloc ((resi+1) * sizeof (socklen_t));
+ if (NULL != unixpath)
+ {
+ add_unixpath (saddrs, saddrlens, unixpath);
+ i++;
+ }
+ saddrlens[i] = sizeof (struct sockaddr_in);
+ saddrs[i] = GNUNET_malloc (saddrlens[i]);
#if HAVE_SOCKADDR_IN_SIN_LEN
- ((struct sockaddr_in *) saddrs[0])->sin_len = saddrlens[0];
+ ((struct sockaddr_in *) saddrs[i])->sin_len = saddrlens[i];
#endif
- ((struct sockaddr_in *) saddrs[0])->sin_family = AF_INET;
- ((struct sockaddr_in *) saddrs[0])->sin_port = htons (port);
+ ((struct sockaddr_in *) saddrs[i])->sin_family = AF_INET;
+ ((struct sockaddr_in *) saddrs[i])->sin_port = htons (port);
}
else
{
/* dual stack */
resi = 2;
- saddrs = GNUNET_malloc (3 * sizeof(struct sockaddr*));
- saddrlens = GNUNET_malloc (3 * sizeof (socklen_t));
-
- saddrlens[0] = sizeof (struct sockaddr_in6);
- saddrs[0] = GNUNET_malloc (saddrlens[0]);
+ if (NULL != unixpath)
+ resi++;
+ saddrs = GNUNET_malloc ((resi+1) * sizeof(struct sockaddr*));
+ saddrlens = GNUNET_malloc ((resi+1) * sizeof (socklen_t));
+ i = 0;
+ if (NULL != unixpath)
+ {
+ add_unixpath (saddrs, saddrlens, unixpath);
+ i++;
+ }
+ saddrlens[i] = sizeof (struct sockaddr_in6);
+ saddrs[i] = GNUNET_malloc (saddrlens[i]);
#if HAVE_SOCKADDR_IN_SIN_LEN
- ((struct sockaddr_in6 *) saddrs[0])->sin6_len = saddrlens[0];
+ ((struct sockaddr_in6 *) saddrs[i])->sin6_len = saddrlens[0];
#endif
- ((struct sockaddr_in6 *) saddrs[0])->sin6_family = AF_INET6;
- ((struct sockaddr_in6 *) saddrs[0])->sin6_port = htons (port);
-
- saddrlens[1] = sizeof (struct sockaddr_in);
- saddrs[1] = GNUNET_malloc (saddrlens[1]);
+ ((struct sockaddr_in6 *) saddrs[i])->sin6_family = AF_INET6;
+ ((struct sockaddr_in6 *) saddrs[i])->sin6_port = htons (port);
+ i++;
+ saddrlens[i] = sizeof (struct sockaddr_in);
+ saddrs[i] = GNUNET_malloc (saddrlens[i]);
#if HAVE_SOCKADDR_IN_SIN_LEN
- ((struct sockaddr_in *) saddrs[1])->sin_len = saddrlens[1];
+ ((struct sockaddr_in *) saddrs[i])->sin_len = saddrlens[1];
#endif
- ((struct sockaddr_in *) saddrs[1])->sin_family = AF_INET;
- ((struct sockaddr_in *) saddrs[1])->sin_port = htons (port);
+ ((struct sockaddr_in *) saddrs[i])->sin_family = AF_INET;
+ ((struct sockaddr_in *) saddrs[i])->sin_port = htons (port);
}
}
+ GNUNET_free_non_null (unixpath);
*addrs = saddrs;
*addr_lens = saddrlens;
return resi;
* Setup addr, addrlen, maxbuf, idle_timeout
* based on configuration!
*
- * Configuration must specify a "PORT". It may
- * specify:
+ * Configuration may specify:
+ * - PORT (where to bind to for TCP)
+ * - UNIXPATH (where to bind to for UNIX domain sockets)
* - TIMEOUT (after how many ms does an inactive service timeout);
* - MAXBUF (maximum incoming message size supported)
* - DISABLEV6 (disable support for IPv6, otherwise we use dual-stack)
run(void *cls, struct GNUNET_SCHEDULER_Handle *sched, char * const *args,
const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
{
+ int *ok = cls;
struct sockaddr_in sa;
struct GNUNET_TIME_Relative timeout = GNUNET_TIME_relative_multiply(
GNUNET_TIME_UNIT_MILLISECONDS, 2500);
#endif
fprintf (stderr,
"System seems to be off-line, will not run all DNS tests\n");
+ *ok = 0; /* mark test as passing anyway */
return;
}