From a72236a1d0effb1fe985f5685d40e6dc33ab65a3 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Fri, 27 Sep 2013 22:42:41 +0200 Subject: permit gsmd and libgsm to handle multiple instances By using differntly-named unix domain sockets, we can run multiple gsmd instances in parallel. --- src/libgsmd/libgsmd.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'src/libgsmd') diff --git a/src/libgsmd/libgsmd.c b/src/libgsmd/libgsmd.c index 1626b04..03642ea 100644 --- a/src/libgsmd/libgsmd.c +++ b/src/libgsmd/libgsmd.c @@ -64,7 +64,7 @@ static int lgsm_open_backend(struct lgsm_handle *lh, const char *device) { int rc; - if (!strcmp(device, LGSMD_DEVICE_GSMD)) { + if (!strncmp(device, LGSMD_DEVICE_GSMD, strlen(LGSMD_DEVICE_GSMD))) { struct sockaddr_un sun; /* use unix domain socket to gsm daemon */ @@ -74,7 +74,8 @@ static int lgsm_open_backend(struct lgsm_handle *lh, const char *device) memset(&sun, 0, sizeof(sun)); sun.sun_family = AF_UNIX; - memcpy(sun.sun_path, GSMD_UNIX_SOCKET, sizeof(GSMD_UNIX_SOCKET)); + sun.sun_path[0] = '\0'; + strncpy(sun.sun_path+1, device, sizeof(sun.sun_path)-1); rc = connect(lh->fd, (struct sockaddr *)&sun, sizeof(sun)); if (rc < 0) { @@ -184,6 +185,19 @@ struct lgsm_handle *lgsm_init(const char *device) return lh; } +struct lgsm_handle *lgsm_init_inst(unsigned int instance) +{ + struct lgsm_handle *lh = malloc(sizeof(*lh)); + char buf[32]; + if (instance == 0) + snprintf(buf, sizeof(buf), "gsmd"); + else + snprintf(buf, sizeof(buf), "gsmd.%u", instance); + + return lgsm_init(buf); +} + + int lgsm_exit(struct lgsm_handle *lh) { free(lh); @@ -191,7 +205,6 @@ int lgsm_exit(struct lgsm_handle *lh) return 0; } - static u_int16_t next_msg_id; int lgsm_send(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh) -- cgit v1.2.3