Patchwork [RFC,RESEND,v1,12/15] virtproxy: interfaces to set/remove VPIForwards

login
register
mail settings
Submitter Michael Roth
Date Nov. 3, 2010, 3:28 p.m.
Message ID <1288798090-7127-13-git-send-email-mdroth@linux.vnet.ibm.com>
Download mbox | patch
Permalink /patch/70027/
State New
Headers show

Comments

Michael Roth - Nov. 3, 2010, 3:28 p.m.
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
---
 virtproxy.c |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 virtproxy.h |    2 ++
 2 files changed, 61 insertions(+), 0 deletions(-)
Adam Litke - Nov. 4, 2010, 1:12 a.m.
Description please.

On Wed, 2010-11-03 at 10:28 -0500, Michael Roth wrote:
> Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
> ---
>  virtproxy.c |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  virtproxy.h |    2 ++
>  2 files changed, 61 insertions(+), 0 deletions(-)
> 
> diff --git a/virtproxy.c b/virtproxy.c
> index 5ec4e77..86a8e5b 100644
> --- a/virtproxy.c
> +++ b/virtproxy.c
> @@ -658,3 +658,62 @@ int vp_set_oforward(VPDriver *drv, int fd, const char *service_id)
> 
>      return 0;
>  }
> +
> +/* add/modify a service_id -> net/unix socket mapping
> + *
> + * "service_id" is a user-defined id for the service. this is what the
> + * remote end will use to proxy connections to a specific service on
> + * our end.
> + *
> + * if "port" is NULL, "addr" is the address of the net socket the
> + * service is running on. otherwise, addr is the path to the unix socket
> + * the service is running on.
> + *
> + * if "port" AND "addr" are NULL, find and remove the current iforward
> + * for this "service_id" if it exists.
> + *
> + * "ipv6" is a bool denoting whether or not to use ipv6
> + */
> +int vp_set_iforward(VPDriver *drv, const char *service_id, const char *addr,
> +                    const char *port, bool ipv6)
> +{
> +    VPIForward *f = get_iforward(drv, service_id);
> +
> +    if (addr == NULL && port == NULL) {
> +        if (f != NULL) {
> +            qemu_opts_del(f->socket_opts);
> +            QLIST_REMOVE(f, next);
> +            qemu_free(f);
> +        }
> +        return 0;
> +    }
> +
> +    if (f == NULL) {
> +        f = qemu_mallocz(sizeof(VPIForward));
> +        f->drv = drv;
> +        strncpy(f->service_id, service_id, VP_SERVICE_ID_LEN);
> +        QLIST_INSERT_HEAD(&drv->iforwards, f, next);
> +    } else {
> +        qemu_opts_del(f->socket_opts);
> +    }
> +
> +    /* stick socket-related options in a QemuOpts so we can
> +     * utilize qemu socket utility functions directly
> +     */
> +    f->socket_opts = qemu_opts_create(&vp_socket_opts, NULL, 0);
> +    if (port == NULL) {
> +        /* no port given, assume unix path */
> +        qemu_opt_set(f->socket_opts, "path", addr);
> +    } else {
> +        qemu_opt_set(f->socket_opts, "host", addr);
> +        qemu_opt_set(f->socket_opts, "port", port);
> +    }
> +
> +    if (ipv6) {
> +        qemu_opt_set(f->socket_opts, "ipv6", "on");
> +    } else {
> +        qemu_opt_set(f->socket_opts, "ipv4", "on");
> +    }
> +
> +    return 0;
> +}
> diff --git a/virtproxy.h b/virtproxy.h
> index 39d5d40..d2522b3 100644
> --- a/virtproxy.h
> +++ b/virtproxy.h
> @@ -34,5 +34,7 @@ int vp_set_fd_handler(int fd,
>  /* virtproxy interface */
>  VPDriver *vp_new(int fd, bool listen);
>  int vp_set_oforward(VPDriver *drv, int fd, const char *service_id);
> +int vp_set_iforward(VPDriver *drv, const char *service_id, const char *addr,
> +                    const char *port, bool ipv6);
> 
>  #endif /* VIRTPROXY_H */

Patch

diff --git a/virtproxy.c b/virtproxy.c
index 5ec4e77..86a8e5b 100644
--- a/virtproxy.c
+++ b/virtproxy.c
@@ -658,3 +658,62 @@  int vp_set_oforward(VPDriver *drv, int fd, const char *service_id)
 
     return 0;
 }
+
+/* add/modify a service_id -> net/unix socket mapping
+ *
+ * "service_id" is a user-defined id for the service. this is what the
+ * remote end will use to proxy connections to a specific service on
+ * our end.
+ *
+ * if "port" is NULL, "addr" is the address of the net socket the
+ * service is running on. otherwise, addr is the path to the unix socket
+ * the service is running on.
+ *
+ * if "port" AND "addr" are NULL, find and remove the current iforward
+ * for this "service_id" if it exists.
+ *
+ * "ipv6" is a bool denoting whether or not to use ipv6
+ */
+int vp_set_iforward(VPDriver *drv, const char *service_id, const char *addr,
+                    const char *port, bool ipv6)
+{
+    VPIForward *f = get_iforward(drv, service_id);
+
+    if (addr == NULL && port == NULL) {
+        if (f != NULL) {
+            qemu_opts_del(f->socket_opts);
+            QLIST_REMOVE(f, next);
+            qemu_free(f);
+        }
+        return 0;
+    }
+
+    if (f == NULL) {
+        f = qemu_mallocz(sizeof(VPIForward));
+        f->drv = drv;
+        strncpy(f->service_id, service_id, VP_SERVICE_ID_LEN);
+        QLIST_INSERT_HEAD(&drv->iforwards, f, next);
+    } else {
+        qemu_opts_del(f->socket_opts);
+    }
+
+    /* stick socket-related options in a QemuOpts so we can
+     * utilize qemu socket utility functions directly
+     */
+    f->socket_opts = qemu_opts_create(&vp_socket_opts, NULL, 0);
+    if (port == NULL) {
+        /* no port given, assume unix path */
+        qemu_opt_set(f->socket_opts, "path", addr);
+    } else {
+        qemu_opt_set(f->socket_opts, "host", addr);
+        qemu_opt_set(f->socket_opts, "port", port);
+    }
+
+    if (ipv6) {
+        qemu_opt_set(f->socket_opts, "ipv6", "on");
+    } else {
+        qemu_opt_set(f->socket_opts, "ipv4", "on");
+    }
+
+    return 0;
+}
diff --git a/virtproxy.h b/virtproxy.h
index 39d5d40..d2522b3 100644
--- a/virtproxy.h
+++ b/virtproxy.h
@@ -34,5 +34,7 @@  int vp_set_fd_handler(int fd,
 /* virtproxy interface */
 VPDriver *vp_new(int fd, bool listen);
 int vp_set_oforward(VPDriver *drv, int fd, const char *service_id);
+int vp_set_iforward(VPDriver *drv, const char *service_id, const char *addr,
+                    const char *port, bool ipv6);
 
 #endif /* VIRTPROXY_H */