On Fri, Jul 25, 2014 at 11:51:59AM +0200, Sven Eckelmann wrote:
> 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]>

Hi Sven

I've not tested your patch, just read it through. Looks O.K. to me.

Acked-by: Andrew Lunn <[email protected]>

          Andrew


> ---
>  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