summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorVyacheslav Trushkin <me@dogonthesun.net>2011-11-25 18:51:48 +0400
committerDenis Ovsienko <infrastation@yandex.ru>2011-12-13 14:13:06 +0400
commit271ee735ed3a42a1fe52f6401ddf72bd5d3e4f10 (patch)
tree6e8995fe61efdf88513c697e1d84d4108fabbf3a /lib
parent844ee4a8acf1a7b34e6a4a0bdf701496302a7416 (diff)
quagga: option "-z" ("--socket <path>") added
All daemons modified to support custom path to zserv socket. lib: generalize a zclient connection zclient_socket_connect added. zclient_socket and zclient_socket_un were hidden under static expression. "zclient_serv_path_set" modified.
Diffstat (limited to 'lib')
-rw-r--r--lib/zclient.c62
-rw-r--r--lib/zclient.h7
2 files changed, 55 insertions, 14 deletions
diff --git a/lib/zclient.c b/lib/zclient.c
index 52a3627d..3d5be918 100644
--- a/lib/zclient.c
+++ b/lib/zclient.c
@@ -41,6 +41,8 @@ static void zclient_event (enum event, struct zclient *);
extern struct thread_master *master;
+char *zclient_serv_path = NULL;
+
/* This file local debug flag. */
int zclient_debug = 0;
@@ -143,8 +145,10 @@ zclient_reset (struct zclient *zclient)
zclient_init (zclient, zclient->redist_default);
}
+#ifdef HAVE_TCP_ZEBRA
+
/* Make socket to zebra daemon. Return zebra socket. */
-int
+static int
zclient_socket(void)
{
int sock;
@@ -175,10 +179,12 @@ zclient_socket(void)
return sock;
}
+#endif /* HAVE_TCP_ZEBRA */
+
/* For sockaddr_un. */
#include <sys/un.h>
-int
+static int
zclient_socket_un (const char *path)
{
int ret;
@@ -208,6 +214,24 @@ zclient_socket_un (const char *path)
return sock;
}
+/**
+ * Connect to zebra daemon.
+ * @param zclient a pointer to zclient structure
+ * @return socket fd just to make sure that connection established
+ * @see zclient_init
+ * @see zclient_new
+ */
+int
+zclient_socket_connect (struct zclient *zclient)
+{
+#ifdef HAVE_TCP_ZEBRA
+ zclient->sock = zclient_socket ();
+#else
+ zclient->sock = zclient_socket_un (zclient_serv_path ? zclient_serv_path : ZEBRA_SERV_PATH);
+#endif
+ return zclient->sock;
+}
+
static int
zclient_failed(struct zclient *zclient)
{
@@ -313,13 +337,7 @@ zclient_start (struct zclient *zclient)
if (zclient->t_connect)
return 0;
- /* Make socket. */
-#ifdef HAVE_TCP_ZEBRA
- zclient->sock = zclient_socket ();
-#else
- zclient->sock = zclient_socket_un (ZEBRA_SERV_PATH);
-#endif /* HAVE_TCP_ZEBRA */
- if (zclient->sock < 0)
+ if (zclient_socket_connect(zclient) < 0)
{
if (zclient_debug)
zlog_debug ("zclient connection fail");
@@ -1018,3 +1036,29 @@ zclient_event (enum event event, struct zclient *zclient)
break;
}
}
+
+void
+zclient_serv_path_set (char *path)
+{
+ struct stat sb;
+
+ /* reset */
+ zclient_serv_path = NULL;
+
+ /* test if `path' is socket. don't set it otherwise. */
+ if (stat(path, &sb) == -1)
+ {
+ zlog_warn ("%s: zebra socket `%s' does not exist", __func__, path);
+ return;
+ }
+
+ if ((sb.st_mode & S_IFMT) != S_IFSOCK)
+ {
+ zlog_warn ("%s: `%s' is not unix socket, sir", __func__, path);
+ return;
+ }
+
+ /* it seems that path is unix socket */
+ zclient_serv_path = path;
+}
+
diff --git a/lib/zclient.h b/lib/zclient.h
index 21786ab8..5c3db382 100644
--- a/lib/zclient.h
+++ b/lib/zclient.h
@@ -127,11 +127,8 @@ extern void zclient_stop (struct zclient *);
extern void zclient_reset (struct zclient *);
extern void zclient_free (struct zclient *);
-/* Get TCP socket connection to zebra daemon at loopback address. */
-extern int zclient_socket (void);
-
-/* Get unix stream socket connection to zebra daemon at given path. */
-extern int zclient_socket_un (const char *);
+extern int zclient_socket_connect (struct zclient *);
+extern void zclient_serv_path_set (char *path);
/* Send redistribute command to zebra daemon. Do not update zclient state. */
extern int zebra_redistribute_send (int command, struct zclient *, int type);