]> git.ipfire.org Git - thirdparty/lldpd.git/commitdiff
Add a argument to specify the unix control socket 29/head
authorZang MingJie <zealot0630@gmail.com>
Tue, 26 Feb 2013 12:12:25 +0000 (20:12 +0800)
committerZang MingJie <zealot0630@gmail.com>
Tue, 26 Feb 2013 12:12:25 +0000 (20:12 +0800)
src/client/lldpcli.8
src/client/lldpcli.c
src/ctl.c
src/ctl.h
src/daemon/lldpd.8
src/daemon/lldpd.c
src/daemon/lldpd.h
src/daemon/priv.c
src/lib/connection.c
src/lib/lldpctl.h
src/lib/private.h

index dffa7a67ab43bf8616dbfb3c7adea5f9508368f2..2ef5bc113c4c3f71ee789cbcb5ef21513d7673b0 100644 (file)
 .Sh SYNOPSIS
 .Nm
 .Op Fl dv
+.Op Fl u Ar file
 .Op Fl f Ar format
 .Op Fl c Ar file
 .Op Ar command ...
 .Nm lldpctl
 .Op Fl dv
+.Op Fl u Ar file
 .Op Fl f Ar format
 .Op Ar interfaces ...
 .Sh DESCRIPTION
@@ -47,6 +49,9 @@ The options are as follows:
 .Bl -tag -width Ds
 .It Fl d
 Enable more debugging information.
+.It Fl u
+Specify the Unix-domain socket used for communication with
+.Xr lldpd 8 .
 .It Fl v
 Show
 .Nm
index cba35e4e632767ee823c66d87d3511ea9c510764..189c0de5b38d7c1bf7c60141aa8204e678e9fd28 100644 (file)
@@ -66,6 +66,7 @@ usage()
        fprintf(stderr, "\n");
 
        fprintf(stderr, "-d          Enable more debugging information.\n");
+       fprintf(stderr, "-u          Specify the Unix-domain socket used for communication with lldpd(8).\n");
        fprintf(stderr, "-f format   Choose output format (plain, keyvalue or xml).\n");
        if (!is_lldpctl(NULL))
                fprintf(stderr, "-c          Read the provided configuration file.\n");
@@ -412,6 +413,7 @@ main(int argc, char *argv[])
        lldpctl_conn_t *conn = NULL;
        const char *options = is_lldpctl(argv[0])?"hdvf:":"hdsvf:c:";
 
+       const char *ctlname = lldpctl_get_default_transport();
        int gotinputs = 0;
        struct inputs inputs;
        TAILQ_INIT(&inputs);
@@ -434,6 +436,9 @@ main(int argc, char *argv[])
                case 'h':
                        usage();
                        break;
+               case 'u':
+                       ctlname = optarg;
+                       break;
                case 'v':
                        fprintf(stdout, "%s\n", PACKAGE_VERSION);
                        exit(0);
@@ -455,7 +460,7 @@ main(int argc, char *argv[])
 
        /* Make a connection */
        log_debug("lldpctl", "connect to lldpd");
-       conn = lldpctl_new(NULL, NULL, NULL);
+       conn = lldpctl_new_name(ctlname, NULL, NULL, NULL);
        if (conn == NULL) goto end;
 
        /* Process file inputs */
index 023ec946f393088ab244899a7db4c502d230bb40..b323c28050bd16ccb7f130e7151b5411cfeefa16 100644 (file)
--- a/src/ctl.c
+++ b/src/ctl.c
@@ -36,7 +36,7 @@
  * @return The socket when successful, -1 otherwise.
  */
 int
-ctl_create(char *name)
+ctl_create(const char *name)
 {
        int s;
        struct sockaddr_un su;
@@ -69,7 +69,7 @@ ctl_create(char *name)
  * @return The socket when successful, -1 otherwise.
  */
 int
-ctl_connect(char *name)
+ctl_connect(const char *name)
 {
        int s;
        struct sockaddr_un su;
@@ -96,7 +96,7 @@ ctl_connect(char *name)
  * @param name The name of the Unix socket.
  */
 void
-ctl_cleanup(char *name)
+ctl_cleanup(const char *name)
 {
        log_debug("control", "cleanup control socket");
        if (unlink(name) == -1)
index 0bf8fee954aa030ebfd12e3e23f7a87680a303e9..9d019bd7cd1fb63756f90cdd22c451c511b72be0 100644 (file)
--- a/src/ctl.h
+++ b/src/ctl.h
@@ -47,9 +47,9 @@ struct hmsg_header {
 #define HMSG_MAX_SIZE (1<<19)
 
 /* ctl.c */
-int     ctl_create(char *);
-int     ctl_connect(char *);
-void    ctl_cleanup(char *);
+int     ctl_create(const char *);
+int     ctl_connect(const char *);
+void    ctl_cleanup(const char *);
 
 int     ctl_msg_send_unserialized(uint8_t **, size_t *,
                                       enum hmsg_type,
index 49be54c9b32222a2a14360e8f0caa89dab0e055a..f2a2dfba41b5817ecc5de4fd329075569f3cc918 100644 (file)
@@ -27,6 +27,7 @@
 .Op Fl P Ar platform
 .Op Fl X Ar socket
 .Op Fl m Ar management
+.Op Fl u Ar file
 .Op Fl I Ar interfaces
 .Op Fl C Ar interfaces
 .Op Fl M Ar class
@@ -183,6 +184,9 @@ only negative patterns are provided, only one IPv4 and one IPv6
 addresses are chosen. Otherwise, many of them can be selected. If you
 want to blacklist IPv6 addresses, you can use
 .Em !*:* .
+.It Fl u Ar file
+Specify the Unix-domain socket used for communication with
+.Xr lldpctl 8 .
 .It Fl I Ar interfaces
 Specify which interface to listen to. Without this option,
 .Nm
index 747ef0cf1823e01e689c8256ad200dc481accfad..9fab44b4c01513d301a760a6305f5ac3f03898c9 100644 (file)
@@ -95,6 +95,7 @@ usage(void)
        fprintf(stderr, "-S descr Override the default system description.\n");
        fprintf(stderr, "-P name  Override the default hardware platform.\n");
        fprintf(stderr, "-m IP    Specify the IPv4 management addresses of this system.\n");
+       fprintf(stderr, "-u file  Specify the Unix-domain socket used for communication with lldpctl(8).\n");
        fprintf(stderr, "-H mode  Specify the behaviour when detecting multiple neighbors.\n");
        fprintf(stderr, "-I iface Limit interfaces to use.\n");
 #ifdef ENABLE_LLDPMED
@@ -987,7 +988,7 @@ lldpd_exit(struct lldpd *cfg)
        struct lldpd_hardware *hardware, *hardware_next;
        log_debug("main", "exit lldpd");
        close(cfg->g_ctl);
-       priv_ctl_cleanup();
+       priv_ctl_cleanup(cfg->g_ctlname);
        log_debug("main", "cleanup hardware information");
        for (hardware = TAILQ_FIRST(&cfg->g_hardware); hardware != NULL;
             hardware = hardware_next) {
@@ -1158,11 +1159,12 @@ lldpd_main(int argc, char *argv[])
        int snmp = 0;
        char *agentx = NULL;    /* AgentX socket */
 #endif
+       char *ctlname = LLDPD_CTL_SOCKET;
        char *mgmtp = NULL;
        char *cidp = NULL;
        char *interfaces = NULL;
        char *popt, opts[] =
-               "H:vhkrdD:xX:m:4:6:I:C:p:M:P:S:iL:@                    ";
+               "H:vhkrdD:xX:m:u:4:6:I:C:p:M:P:S:iL:@                    ";
        int i, found, advertise_version = 1;
 #ifdef ENABLE_LLDPMED
        int lldpmed = 0, noinventory = 0;
@@ -1211,6 +1213,9 @@ lldpd_main(int argc, char *argv[])
                case 'm':
                        mgmtp = optarg;
                        break;
+               case 'u':
+                       ctlname = optarg;
+                       break;
                case 'I':
                        interfaces = optarg;
                        break;
@@ -1308,13 +1313,13 @@ lldpd_main(int argc, char *argv[])
        /* Create and setup socket */
        int retry = 1;
        log_debug("main", "creating control socket");
-       while ((ctl = ctl_create(LLDPD_CTL_SOCKET)) == -1) {
+       while ((ctl = ctl_create(ctlname)) == -1) {
                if (retry-- && errno == EADDRINUSE) {
                        /* Check if a daemon is really listening */
                        int tfd;
                        log_info("main", "unable to create control socket because it already exists");
                        log_info("main", "check if another instance is running");
-                       if ((tfd = ctl_connect(LLDPD_CTL_SOCKET)) != -1) {
+                       if ((tfd = ctl_connect(ctlname)) != -1) {
                                /* Another instance is running */
                                close(tfd);
                                log_warnx("main", "another instance is running, please stop it");
@@ -1322,7 +1327,7 @@ lldpd_main(int argc, char *argv[])
                        } else if (errno == ECONNREFUSED) {
                                /* Nobody is listening */
                                log_info("main", "old control socket is present, clean it");
-                               ctl_cleanup(LLDPD_CTL_SOCKET);
+                               ctl_cleanup(ctlname);
                                continue;
                        }
                        log_warn("main", "cannot determine if another daemon is already running");
@@ -1331,9 +1336,9 @@ lldpd_main(int argc, char *argv[])
                log_warn("main", "unable to create control socket");
                fatalx("giving up");
        }
-       if (chown(LLDPD_CTL_SOCKET, uid, gid) == -1)
+       if (chown(ctlname, uid, gid) == -1)
                log_warn("main", "unable to chown control socket");
-       if (chmod(LLDPD_CTL_SOCKET,
+       if (chmod(ctlname,
                S_IRUSR | S_IWUSR | S_IXUSR |
                S_IRGRP | S_IWGRP | S_IXGRP) == -1)
                log_warn("main", "unable to chmod control socket");
@@ -1385,6 +1390,7 @@ lldpd_main(int argc, char *argv[])
            calloc(1, sizeof(struct lldpd))) == NULL)
                fatal("main", NULL);
 
+       cfg->g_ctlname = ctlname;
        cfg->g_ctl = ctl;
        cfg->g_config.c_mgmt_pattern = mgmtp;
        cfg->g_config.c_cid_pattern = cidp;
index 921ab6a2c0b433f59edb7b21f0369564b8ff1ab8..e289156f545cf6d778fe17a88ae62d30b5c0b190 100644 (file)
@@ -105,6 +105,7 @@ struct lldpd {
 #endif /* USE_SNMP */
 
        /* Unix socket handling */
+       const char              *g_ctlname;
        int                      g_ctl;
        struct event            *g_ctl_event;
        struct event            *g_iface_event; /* Triggered when there is an interface change */
@@ -202,7 +203,7 @@ client_handle_client(struct lldpd *cfg,
 
 /* priv.c */
 void    priv_init(const char*, int, uid_t, gid_t);
-void    priv_ctl_cleanup(void);
+void    priv_ctl_cleanup(const char *ctlname);
 char           *priv_gethostbyname(void);
 #ifdef HOST_OS_LINUX
 int             priv_open(char*);
index 8fdd7c9b41ca2d1027fb670f5dd6772c96a7cb0b..422dded3a59126735cd47043f19a734b7a249258 100644 (file)
@@ -99,11 +99,14 @@ priv_ping()
 
 /* Proxy for ctl_cleanup */
 void
-priv_ctl_cleanup()
+priv_ctl_cleanup(const char *ctlname)
 {
        int cmd, rc;
+       int len = strlen(ctlname);
        cmd = PRIV_DELETE_CTL_SOCKET;
        must_write(remote, &cmd, sizeof(int));
+       must_write(remote, &len, sizeof(int));
+       must_write(remote, ctlname, len);
        must_read(remote, &rc, sizeof(int));
 }
 
@@ -210,8 +213,18 @@ asroot_ping()
 static void
 asroot_ctl_cleanup()
 {
+       int len;
+       char *ctlname;
        int rc = 0;
-       ctl_cleanup(LLDPD_CTL_SOCKET);
+
+       must_read(remote, &len, sizeof(int));
+       if ((ctlname = (char*)malloc(len+1)) == NULL)
+               fatal("ctlname", NULL);
+
+       must_read(remote, ctlname, len);
+       ctlname[len] = 0;
+
+       ctl_cleanup(ctlname);
 
        /* Ack */
        must_write(remote, &rc, sizeof(int));
index 729ee092b339fa6dcf48728b1fa05b17369e6422..3b3227ccb691aad1728fca65fc3bc69eae0c793c 100644 (file)
@@ -36,9 +36,9 @@ lldpctl_get_default_transport(void)
 
 /* Connect to the remote end */
 static int
-sync_connect()
+sync_connect(lldpctl_conn_t *lldpctl)
 {
-       return ctl_connect(LLDPD_CTL_SOCKET);
+       return ctl_connect(lldpctl->ctlname);
 }
 
 /* Synchronously send data to remote end. */
@@ -50,7 +50,7 @@ sync_send(lldpctl_conn_t *lldpctl,
        size_t nb;
 
        if (conn->fd == -1 &&
-           ((conn->fd = sync_connect()) == -1)) {
+           ((conn->fd = sync_connect(lldpctl)) == -1)) {
                return LLDPCTL_ERR_CANNOT_CONNECT;
        }
 
@@ -70,7 +70,7 @@ sync_recv(lldpctl_conn_t *lldpctl,
        size_t nb;
 
        if (conn->fd == -1 &&
-           ((conn->fd = sync_connect()) == -1)) {
+           ((conn->fd = sync_connect(lldpctl)) == -1)) {
                lldpctl->error = LLDPCTL_ERR_CANNOT_CONNECT;
                return LLDPCTL_ERR_CANNOT_CONNECT;
        }
@@ -83,9 +83,14 @@ sync_recv(lldpctl_conn_t *lldpctl,
 }
 
 
-
 lldpctl_conn_t*
 lldpctl_new(lldpctl_send_callback send, lldpctl_recv_callback recv, void *user_data)
+{
+       return lldpctl_new_name(lldpctl_get_default_transport(), send, recv, user_data);
+}
+
+lldpctl_conn_t*
+lldpctl_new_name(const char *ctlname, lldpctl_send_callback send, lldpctl_recv_callback recv, void *user_data)
 {
        lldpctl_conn_t *conn = NULL;
        struct lldpctl_conn_sync_t *data = NULL;
@@ -97,6 +102,11 @@ lldpctl_new(lldpctl_send_callback send, lldpctl_recv_callback recv, void *user_d
        if ((conn = calloc(1, sizeof(lldpctl_conn_t))) == NULL)
                return NULL;
 
+       conn->ctlname = strdup(ctlname);
+       if (conn->ctlname == NULL) {
+               free(conn);
+               return NULL;
+       }
        if (!send && !recv) {
                if ((data = malloc(sizeof(struct lldpctl_conn_sync_t))) == NULL) {
                        free(conn);
@@ -119,6 +129,7 @@ int
 lldpctl_release(lldpctl_conn_t *conn)
 {
        if (conn == NULL) return 0;
+       free(conn->ctlname);
        if (conn->send == sync_send) {
                struct lldpctl_conn_sync_t *data = conn->user_data;
                if (data->fd != -1) close(data->fd);
index 2c19228b29066eb14f93c74f0d493e8e1fbe5da8..70f60b0b575ef9f392735f4ddeeb766720f0ecab 100644 (file)
@@ -177,6 +177,24 @@ ssize_t lldpctl_send(lldpctl_conn_t *conn);
 lldpctl_conn_t *lldpctl_new(lldpctl_send_callback send,
     lldpctl_recv_callback recv, void *user_data);
 
+/**
+ * Allocate a new handler for connecting to lldpd.
+ *
+ * @param  ctlname   the Unix-domain socket to connect to lldpd.
+ * @param  send      Callback to be used when sending   new data is requested.
+ * @param  recv      Callback to be used when receiving new data is requested.
+ * @param  user_data Data to pass to callbacks.
+ * @return An handler to be used to connect to lldpd or @c NULL in
+ *         case of error. In the later case, the error is probable an
+ *         out of memory condition.
+ *
+ * The allocated handler can be released with @c lldpctl_release(). If the
+ * provided parameters are both @c NULL, default synchronous callbacks will be
+ * used.
+ */
+lldpctl_conn_t *lldpctl_new_name(const char *ctlname, lldpctl_send_callback send,
+    lldpctl_recv_callback recv, void *user_data);
+
 /**
  * Release resources associated with a connection to lldpd.
  *
index 4308f7079c2b3f5a14f0f5804853355a1eecad25..616a38d39d4c5746167386e798af705506ac0eb7 100644 (file)
@@ -22,6 +22,9 @@
 
 /* connection.c */
 struct lldpctl_conn_t {
+       /* the Unix-domain socket to connect to lldpd */
+       const char *ctlname;
+
        /* Callback handling */
        lldpctl_recv_callback recv; /* Receive callback */
        lldpctl_send_callback send; /* Send callback */