Message ID | 1288798090-7127-13-git-send-email-mdroth@linux.vnet.ibm.com |
---|---|
State | New |
Headers | show |
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 */
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 */
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com> --- virtproxy.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ virtproxy.h | 2 ++ 2 files changed, 61 insertions(+), 0 deletions(-)