The path to the socket used for client-server communication is currently
hardcoded in alfred and its complimentary daemons. This makes it hard to run
two instances of alfred on the same machine without any kind of virtualization
or containers.

An user may still want to use two alfred instances to create a test setup or
connect a single machine two separated alfred data clouds without exchanging
data between them.

Reported-by: Tobias Hachmer <[email protected]>
Signed-off-by: Sven Eckelmann <[email protected]>
---
 alfred.h               |  7 ++++---
 client.c               |  6 +++---
 gpsd/alfred-gpsd.c     |  9 +++++++--
 gpsd/alfred-gpsd.h     |  3 ++-
 gpsd/man/alfred-gpsd.8 |  3 +++
 main.c                 |  8 +++++++-
 man/alfred.8           |  3 +++
 server.c               |  2 +-
 unix_sock.c            | 10 +++++-----
 vis/man/batadv-vis.8   |  3 +++
 vis/vis.c              | 10 ++++++++--
 vis/vis.h              |  3 ++-
 12 files changed, 48 insertions(+), 19 deletions(-)

diff --git a/alfred.h b/alfred.h
index f0dbb6d..35ac4dd 100644
--- a/alfred.h
+++ b/alfred.h
@@ -35,7 +35,7 @@
 #define ALFRED_REQUEST_TIMEOUT         10
 #define ALFRED_SERVER_TIMEOUT          60
 #define ALFRED_DATA_TIMEOUT            600
-#define ALFRED_SOCK_PATH               "/var/run/alfred.sock"
+#define ALFRED_SOCK_PATH_DEFAULT       "/var/run/alfred.sock"
 #define NO_FILTER                      -1
 
 enum data_source {
@@ -102,6 +102,7 @@ struct globals {
 
        int netsock;
        int unix_sock;
+       const char *unix_path;
 
        struct timespec if_check;
 
@@ -144,8 +145,8 @@ ssize_t send_alfred_packet(struct globals *globals, const 
struct in6_addr *dest,
                           void *buf, int length);
 /* unix_sock.c */
 int unix_sock_read(struct globals *globals);
-int unix_sock_open_daemon(struct globals *globals, const char *path);
-int unix_sock_open_client(struct globals *globals, const char *path);
+int unix_sock_open_daemon(struct globals *globals);
+int unix_sock_open_client(struct globals *globals);
 int unix_sock_close(struct globals *globals);
 int unix_sock_req_data_finish(struct globals *globals,
                              struct transaction_head *head);
diff --git a/client.c b/client.c
index cbc6867..b868719 100644
--- a/client.c
+++ b/client.c
@@ -40,7 +40,7 @@ int alfred_client_request_data(struct globals *globals)
        int ret, len, data_len, i;
        const size_t buf_data_len = sizeof(buf) - sizeof(*push) - sizeof(*data);
 
-       if (unix_sock_open_client(globals, ALFRED_SOCK_PATH))
+       if (unix_sock_open_client(globals))
                return -1;
 
        request = (struct alfred_request_v0 *)buf;
@@ -146,7 +146,7 @@ int alfred_client_set_data(struct globals *globals)
        struct alfred_data *data;
        int ret, len;
 
-       if (unix_sock_open_client(globals, ALFRED_SOCK_PATH))
+       if (unix_sock_open_client(globals))
                return -1;
 
        push = (struct alfred_push_data_v0 *)buf;
@@ -187,7 +187,7 @@ int alfred_client_modeswitch(struct globals *globals)
        struct alfred_modeswitch_v0 *modeswitch;
        int ret, len;
 
-       if (unix_sock_open_client(globals, ALFRED_SOCK_PATH))
+       if (unix_sock_open_client(globals))
                return -1;
 
        modeswitch = (struct alfred_modeswitch_v0 *)buf;
diff --git a/gpsd/alfred-gpsd.c b/gpsd/alfred-gpsd.c
index 87943bd..06c0680 100644
--- a/gpsd/alfred-gpsd.c
+++ b/gpsd/alfred-gpsd.c
@@ -36,7 +36,7 @@ static int alfred_open_sock(struct globals *globals)
 
        memset(&addr, 0, sizeof(addr));
        addr.sun_family = AF_LOCAL;
-       strncpy(addr.sun_path, ALFRED_SOCK_PATH, sizeof(addr.sun_path));
+       strncpy(addr.sun_path, globals->unix_path, sizeof(addr.sun_path));
        addr.sun_path[sizeof(addr.sun_path) - 1] = '\0';
 
        if (connect(globals->unix_sock, (struct sockaddr *)&addr,
@@ -399,6 +399,7 @@ static struct globals *gpsd_init(int argc, char *argv[])
                {"server",      no_argument,            NULL,   's'},
                {"location",    required_argument,      NULL,   'l'},
                {"gpsd",        required_argument,      NULL,   'g'},
+               {"unix-path",   required_argument,      NULL,   'u'},
                {"help",        no_argument,            NULL,   'h'},
                {"version",     no_argument,            NULL,   'v'},
                {NULL,          0,                      NULL,   0},
@@ -410,8 +411,9 @@ static struct globals *gpsd_init(int argc, char *argv[])
        globals->opmode = OPMODE_CLIENT;
        globals->source = SOURCE_GPSD;
        globals->gpsd_format = FORMAT_JSON;
+       globals->unix_path = ALFRED_SOCK_PATH_DEFAULT;
 
-       while ((opt = getopt_long(argc, argv, "shl:g:v", long_options,
+       while ((opt = getopt_long(argc, argv, "shl:g:vu:", long_options,
                                  &opt_ind)) != -1) {
                switch (opt) {
                case 's':
@@ -425,6 +427,9 @@ static struct globals *gpsd_init(int argc, char *argv[])
                        gpsd_source_spec(optarg, &globals->gpsdsource);
                        have_source = true;
                        break;
+               case 'u':
+                       globals->unix_path = optarg;
+                       break;
                case 'v':
                        printf("%s %s\n", argv[0], SOURCE_VERSION);
                        printf("GPSD alfred client\n");
diff --git a/gpsd/alfred-gpsd.h b/gpsd/alfred-gpsd.h
index 68da875..a8382ea 100644
--- a/gpsd/alfred-gpsd.h
+++ b/gpsd/alfred-gpsd.h
@@ -41,7 +41,7 @@
 #define SOURCE_VERSION                         "2014.4.0"
 #endif
 
-#define ALFRED_SOCK_PATH                       "/var/run/alfred.sock"
+#define ALFRED_SOCK_PATH_DEFAULT               "/var/run/alfred.sock"
 #define PATH_BUFF_LEN                          200
 #define GPSD_PACKETTYPE                                2
 #define        GPSD_PACKETVERSION                      1
@@ -95,6 +95,7 @@ struct globals {
 
        float lat, lon, alt;
        int unix_sock;
+       const char *unix_path;
 
        struct fixsource_t gpsdsource;
        struct gps_data_t gpsdata;
diff --git a/gpsd/man/alfred-gpsd.8 b/gpsd/man/alfred-gpsd.8
index fa5cb1f..3799293 100644
--- a/gpsd/man/alfred-gpsd.8
+++ b/gpsd/man/alfred-gpsd.8
@@ -43,6 +43,9 @@ Print the version
 \fB\-h\fP, \fB\-\-help\fP
 Display a brief help message.
 .TP
+\fB\-u\fP, \fB\-\-unix-path\fP \fIpath\fP
+path to unix socket used for alfred server communication.
+.TP
 \fB\-s\fP, \fB\-\-server\fP
 Start up in server mode. This server will read the current location
 from gpsd and set it in alfred via unix socket. The alfred server must
diff --git a/main.c b/main.c
index d848589..0a79e08 100644
--- a/main.c
+++ b/main.c
@@ -49,6 +49,7 @@ static void alfred_usage(void)
        printf("                              accepts data from slaves and 
synces it with\n");
        printf("                              other masters\n");
        printf("\n");
+       printf("  -u, --unix-path [path]      path to unix socket used for 
client-server communication (default: \""ALFRED_SOCK_PATH_DEFAULT"\")\n");
        printf("  -v, --version               print the version\n");
        printf("  -h, --help                  this help\n");
        printf("\n");
@@ -66,6 +67,7 @@ static struct globals *alfred_init(int argc, char *argv[])
                {"help",        no_argument,            NULL,   'h'},
                {"req-version", required_argument,      NULL,   'V'},
                {"modeswitch",  required_argument,      NULL,   'M'},
+               {"unix-path",   required_argument,      NULL,   'u'},
                {"version",     no_argument,            NULL,   'v'},
                {NULL,          0,                      NULL,   0},
        };
@@ -79,10 +81,11 @@ static struct globals *alfred_init(int argc, char *argv[])
        globals->best_server = NULL;
        globals->clientmode_version = 0;
        globals->mesh_iface = "bat0";
+       globals->unix_path = ALFRED_SOCK_PATH_DEFAULT;
 
        time_random_seed();
 
-       while ((opt = getopt_long(argc, argv, "ms:r:hi:b:vV:M:", long_options,
+       while ((opt = getopt_long(argc, argv, "ms:r:hi:b:vV:M:u:", long_options,
                                  &opt_ind)) != -1) {
                switch (opt) {
                case 'r':
@@ -132,6 +135,9 @@ static struct globals *alfred_init(int argc, char *argv[])
                        }
                        globals->clientmode = CLIENT_MODESWITCH;
                        break;
+               case 'u':
+                       globals->unix_path = optarg;
+                       break;
                case 'v':
                        printf("%s %s\n", argv[0], SOURCE_VERSION);
                        printf("A.L.F.R.E.D. - Almighty Lightweight Remote Fact 
Exchange Daemon\n");
diff --git a/man/alfred.8 b/man/alfred.8
index e77acc3..c90caa8 100644
--- a/man/alfred.8
+++ b/man/alfred.8
@@ -50,6 +50,9 @@ Print the version
 .TP
 \fB\-h\fP, \fB\-\-help\fP
 Display a brief help message.
+.TP
+\fB\-u\fP, \fB\-\-unix-path\fP \fIpath\fP
+path to unix socket used for client-server communication.
 .
 .SH CLIENT OPTIONS
 .TP
diff --git a/server.c b/server.c
index e4465dc..b060d55 100644
--- a/server.c
+++ b/server.c
@@ -285,7 +285,7 @@ int alfred_server(struct globals *globals)
        if (create_hashes(globals))
                return -1;
 
-       if (unix_sock_open_daemon(globals, ALFRED_SOCK_PATH))
+       if (unix_sock_open_daemon(globals))
                return -1;
 
        if (!globals->interface) {
diff --git a/unix_sock.c b/unix_sock.c
index 3915553..fb7e391 100644
--- a/unix_sock.c
+++ b/unix_sock.c
@@ -35,11 +35,11 @@
 #include "hash.h"
 #include "packet.h"
 
-int unix_sock_open_daemon(struct globals *globals, const char *path)
+int unix_sock_open_daemon(struct globals *globals)
 {
        struct sockaddr_un addr;
 
-       unlink(path);
+       unlink(globals->unix_path);
 
        globals->unix_sock = socket(AF_LOCAL, SOCK_STREAM, 0);
        if (globals->unix_sock < 0) {
@@ -50,7 +50,7 @@ int unix_sock_open_daemon(struct globals *globals, const char 
*path)
 
        memset(&addr, 0, sizeof(addr));
        addr.sun_family = AF_LOCAL;
-       strncpy(addr.sun_path, path, sizeof(addr.sun_path));
+       strncpy(addr.sun_path, globals->unix_path, sizeof(addr.sun_path));
        addr.sun_path[sizeof(addr.sun_path) - 1] = '\0';
 
        if (bind(globals->unix_sock, (struct sockaddr *)&addr,
@@ -69,7 +69,7 @@ int unix_sock_open_daemon(struct globals *globals, const char 
*path)
        return 0;
 }
 
-int unix_sock_open_client(struct globals *globals, const char *path)
+int unix_sock_open_client(struct globals *globals)
 {
        struct sockaddr_un addr;
 
@@ -82,7 +82,7 @@ int unix_sock_open_client(struct globals *globals, const char 
*path)
 
        memset(&addr, 0, sizeof(addr));
        addr.sun_family = AF_LOCAL;
-       strncpy(addr.sun_path, path, sizeof(addr.sun_path));
+       strncpy(addr.sun_path, globals->unix_path, sizeof(addr.sun_path));
        addr.sun_path[sizeof(addr.sun_path) - 1] = '\0';
 
        if (connect(globals->unix_sock, (struct sockaddr *)&addr,
diff --git a/vis/man/batadv-vis.8 b/vis/man/batadv-vis.8
index 9b7c05c..20dead7 100644
--- a/vis/man/batadv-vis.8
+++ b/vis/man/batadv-vis.8
@@ -42,6 +42,9 @@ Print the version
 \fB\-h\fP, \fB\-\-help\fP
 Display a brief help message.
 .TP
+\fB\-u\fP, \fB\-\-unix-path\fP \fIpath\fP
+path to unix socket used for alfred server communication.
+.TP
 \fB\-i\fP, \fB\-\-interface\fP \fIiface\fP
 Specify the batman-adv interface configured on the system (default: bat0)
 .TP
diff --git a/vis/vis.c b/vis/vis.c
index 55c2dad..0cc4981 100644
--- a/vis/vis.c
+++ b/vis/vis.c
@@ -169,7 +169,7 @@ static int alfred_open_sock(struct globals *globals)
 
        memset(&addr, 0, sizeof(addr));
        addr.sun_family = AF_LOCAL;
-       strncpy(addr.sun_path, ALFRED_SOCK_PATH, sizeof(addr.sun_path));
+       strncpy(addr.sun_path, globals->unix_path, sizeof(addr.sun_path));
        addr.sun_path[sizeof(addr.sun_path) - 1] = '\0';
 
        if (connect(globals->unix_sock, (struct sockaddr *)&addr,
@@ -818,6 +818,7 @@ static void vis_usage(void)
        printf("  -i, --interface             specify the batman-adv interface 
configured on the system (default: bat0)\n");
        printf("  -s, --server                start up in server mode, which 
regularly updates vis data from batman-adv\n");
        printf("  -f, --format <format>       specify the output format for 
client mode (either \"json\", \"jsondoc\" or \"dot\")\n");
+       printf("  -u, --unix-path <path>      path to unix socket used for 
alfred server communication (default: \""ALFRED_SOCK_PATH_DEFAULT"\")\n");
        printf("  -v, --version               print the version\n");
        printf("  -h, --help                  this help\n");
        printf("\n");
@@ -831,6 +832,7 @@ static struct globals *vis_init(int argc, char *argv[])
                {"server",      no_argument,            NULL,   's'},
                {"interface",   required_argument,      NULL,   'i'},
                {"format",      required_argument,      NULL,   'f'},
+               {"unix-path",   required_argument,      NULL,   'u'},
                {"help",        no_argument,            NULL,   'h'},
                {"version",     no_argument,            NULL,   'v'},
                {NULL,          0,                      NULL,   0},
@@ -842,8 +844,9 @@ static struct globals *vis_init(int argc, char *argv[])
        globals->opmode = OPMODE_CLIENT;
        globals->interface = "bat0";
        globals->vis_format = FORMAT_DOT;
+       globals->unix_path = ALFRED_SOCK_PATH_DEFAULT;
 
-       while ((opt = getopt_long(argc, argv, "shf:i:v", long_options,
+       while ((opt = getopt_long(argc, argv, "shf:i:vu:", long_options,
                                  &opt_ind)) != -1) {
                switch (opt) {
                case 's':
@@ -864,6 +867,9 @@ static struct globals *vis_init(int argc, char *argv[])
                case 'i':
                        globals->interface = strdup(optarg);
                        break;
+               case 'u':
+                       globals->unix_path = optarg;
+                       break;
                case 'v':
                        printf("%s %s\n", argv[0], SOURCE_VERSION);
                        printf("VIS alfred client\n");
diff --git a/vis/vis.h b/vis/vis.h
index 3f71970..468bfc4 100644
--- a/vis/vis.h
+++ b/vis/vis.h
@@ -30,7 +30,7 @@
 #define SOURCE_VERSION                         "2014.4.0"
 #endif
 
-#define ALFRED_SOCK_PATH                       "/var/run/alfred.sock"
+#define ALFRED_SOCK_PATH_DEFAULT               "/var/run/alfred.sock"
 #define PATH_BUFF_LEN                          200
 #define VIS_PACKETTYPE                         1
 #define        VIS_PACKETVERSION                       1
@@ -105,6 +105,7 @@ struct globals {
        struct list_head entry_list;
 
        int unix_sock;
+       const char *unix_path;
 };
 
 
-- 
2.0.1

Reply via email to