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 >
