svn commit: r411695 - in head/devel: . libqb libqb/files
Tijl Coosemans
tijl at FreeBSD.org
Wed Mar 23 10:49:19 UTC 2016
Author: tijl
Date: Wed Mar 23 10:49:17 2016
New Revision: 411695
URL: https://svnweb.freebsd.org/changeset/ports/411695
Log:
Add devel/libqb.
libqb is a library with the primary purpose of providing high performance
client server reusable features. It provides high performance logging, tracing,
ipc, and poll.
PR: 208181
Submitted by: David Shane Holden <dpejesh at yahoo.com>
Added:
head/devel/libqb/
head/devel/libqb/Makefile (contents, props changed)
head/devel/libqb/distinfo (contents, props changed)
head/devel/libqb/files/
head/devel/libqb/files/patch-lib-ipc_int.h (contents, props changed)
head/devel/libqb/files/patch-lib-ipc_setup.c (contents, props changed)
head/devel/libqb/files/patch-lib-ipc_socket.c (contents, props changed)
head/devel/libqb/files/patch-lib-log.c (contents, props changed)
head/devel/libqb/files/patch-lib-unix.c (contents, props changed)
head/devel/libqb/pkg-descr (contents, props changed)
head/devel/libqb/pkg-plist (contents, props changed)
Modified:
head/devel/Makefile
Modified: head/devel/Makefile
==============================================================================
--- head/devel/Makefile Wed Mar 23 10:44:10 2016 (r411694)
+++ head/devel/Makefile Wed Mar 23 10:49:17 2016 (r411695)
@@ -1301,6 +1301,7 @@
SUBDIR += libpololu-avr
SUBDIR += libpru
SUBDIR += libpthread-stubs
+ SUBDIR += libqb
SUBDIR += libqcow
SUBDIR += libqxt
SUBDIR += libr3
Added: head/devel/libqb/Makefile
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/devel/libqb/Makefile Wed Mar 23 10:49:17 2016 (r411695)
@@ -0,0 +1,31 @@
+# Created by: dpejesh at yahoo.com
+# $FreeBSD$
+
+PORTNAME= libqb
+PORTVERSION= 0.17.2
+CATEGORIES= devel
+MASTER_SITES= https://github.com/ClusterLabs/libqb/releases/download/v${PORTVERSION}/
+
+MAINTAINER= dpejesh at yahoo.com
+COMMENT= High performance logging, tracing, ipc, and polling library
+
+LICENSE= LGPL21
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+QB_SOCKET_DIR?= /var/run/qb
+PLIST_SUB+= QB_SOCKET_DIR=${QB_SOCKET_DIR}
+
+USE_LDCONFIG= yes
+USES= gmake libtool pathfix pkgconfig tar:xz
+GNU_CONFIGURE= yes
+CONFIGURE_ARGS= --disable-silent-rules --with-socket-dir=${QB_SOCKET_DIR}
+INSTALL_TARGET= install-strip
+
+OPTIONS_DEFINE= DOXYGEN
+OPTIONS_SUB= yes
+DOXYGEN_BUILD_DEPENDS= doxygen:${PORTSDIR}/devel/doxygen
+
+post-install:
+ ${MKDIR} ${STAGEDIR}${QB_SOCKET_DIR}
+
+.include <bsd.port.mk>
Added: head/devel/libqb/distinfo
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/devel/libqb/distinfo Wed Mar 23 10:49:17 2016 (r411695)
@@ -0,0 +1,2 @@
+SHA256 (libqb-0.17.2.tar.xz) = 9a419c649ed51f275dc780da8a15babb8a5d33633567bd9e0cb6193b6e21f4fe
+SIZE (libqb-0.17.2.tar.xz) = 373540
Added: head/devel/libqb/files/patch-lib-ipc_int.h
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/devel/libqb/files/patch-lib-ipc_int.h Wed Mar 23 10:49:17 2016 (r411695)
@@ -0,0 +1,10 @@
+--- lib/ipc_int.h.orig 2015-08-18 19:55:43 UTC
++++ lib/ipc_int.h
+@@ -91,6 +91,7 @@ struct qb_ipcc_funcs {
+ struct qb_ipcc_connection {
+ char name[NAME_MAX];
+ int32_t needs_sock_for_poll;
++ gid_t egid;
+ struct qb_ipc_one_way setup;
+ struct qb_ipc_one_way request;
+ struct qb_ipc_one_way response;
Added: head/devel/libqb/files/patch-lib-ipc_setup.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/devel/libqb/files/patch-lib-ipc_setup.c Wed Mar 23 10:49:17 2016 (r411695)
@@ -0,0 +1,341 @@
+--- lib/ipc_setup.c.orig 2015-08-18 19:55:43 UTC
++++ lib/ipc_setup.c
+@@ -51,7 +51,10 @@ struct ipc_auth_ugp {
+ struct ipc_auth_data {
+ int32_t sock;
+ struct qb_ipcs_service *s;
+- struct qb_ipc_connection_request msg;
++ union {
++ struct qb_ipc_connection_request req;
++ struct qb_ipc_connection_response res;
++ } msg;
+ struct msghdr msg_recv;
+ struct iovec iov_recv;
+ struct ipc_auth_ugp ugp;
+@@ -311,12 +314,138 @@ qb_ipcc_us_sock_close(int32_t sock)
+ close(sock);
+ }
+
++static int32_t
++qb_ipc_auth_creds(struct ipc_auth_data *data)
++{
++ int32_t res = 0;
++
++ /*
++ * currently support getpeerucred, getpeereid, and SO_PASSCRED credential
++ * retrieval mechanisms for various Platforms
++ */
++#ifdef HAVE_GETPEERUCRED
++ /*
++ * Solaris and some BSD systems
++ */
++ {
++ ucred_t *uc = NULL;
++
++ if (getpeerucred(data->sock, &uc) == 0) {
++ res = 0;
++ data->ugp.uid = ucred_geteuid(uc);
++ data->ugp.gid = ucred_getegid(uc);
++ data->ugp.pid = ucred_getpid(uc);
++ ucred_free(uc);
++ } else {
++ res = -errno;
++ }
++ }
++#elif defined(HAVE_GETPEEREID)
++ /*
++ * Usually MacOSX systems
++ */
++ {
++ /*
++ * TODO get the peer's pid.
++ * c->pid = ?;
++ */
++ if (getpeereid(data->sock, &data->ugp.uid, &data->ugp.gid) == 0) {
++ res = 0;
++ } else {
++ res = -errno;
++ }
++ }
++
++#elif defined(SO_PASSCRED)
++ /*
++ * Usually Linux systems
++ */
++ {
++ struct ucred cred;
++ struct cmsghdr *cmsg;
++
++ res = -EINVAL;
++ for (cmsg = CMSG_FIRSTHDR(&data->msg_recv); cmsg != NULL;
++ cmsg = CMSG_NXTHDR(&data->msg_recv, cmsg)) {
++ if (cmsg->cmsg_type != SCM_CREDENTIALS)
++ continue;
++
++ memcpy(&cred, CMSG_DATA(cmsg), sizeof(struct ucred));
++ res = 0;
++ data->ugp.pid = cred.pid;
++ data->ugp.uid = cred.uid;
++ data->ugp.gid = cred.gid;
++ break;
++ }
++ }
++#else /* no credentials */
++ data->ugp.pid = 0;
++ data->ugp.uid = 0;
++ data->ugp.gid = 0;
++ res = -ENOTSUP;
++#endif /* no credentials */
++
++ return res;
++}
++
++static void
++destroy_ipc_auth_data(struct ipc_auth_data *data)
++{
++ if (data->s) {
++ qb_ipcs_unref(data->s);
++ }
++
++#ifdef SO_PASSCRED
++ free(data->cmsg_cred);
++#endif
++ free(data);
++}
++
++static struct ipc_auth_data *
++init_ipc_auth_data(int sock, size_t len)
++{
++ struct ipc_auth_data *data = calloc(1, sizeof(struct ipc_auth_data));
++
++ if (data == NULL) {
++ return NULL;
++ }
++
++ data->msg_recv.msg_iov = &data->iov_recv;
++ data->msg_recv.msg_iovlen = 1;
++ data->msg_recv.msg_name = 0;
++ data->msg_recv.msg_namelen = 0;
++
++#ifdef SO_PASSCRED
++ data->cmsg_cred = calloc(1, CMSG_SPACE(sizeof(struct ucred)));
++ if (data->cmsg_cred == NULL) {
++ destroy_ipc_auth_data(data);
++ return NULL;
++ }
++ data->msg_recv.msg_control = (void *)data->cmsg_cred;
++ data->msg_recv.msg_controllen = CMSG_SPACE(sizeof(struct ucred));
++#endif
++#ifdef QB_SOLARIS
++ data->msg_recv.msg_accrights = 0;
++ data->msg_recv.msg_accrightslen = 0;
++#else
++ data->msg_recv.msg_flags = 0;
++#endif /* QB_SOLARIS */
++
++ data->len = len;
++ data->iov_recv.iov_base = &data->msg;
++ data->iov_recv.iov_len = data->len;
++ data->sock = sock;
++
++ return data;
++}
++
+ int32_t
+ qb_ipcc_us_setup_connect(struct qb_ipcc_connection *c,
+ struct qb_ipc_connection_response *r)
+ {
+ int32_t res;
+ struct qb_ipc_connection_request request;
++ struct ipc_auth_data *data;
+ #ifdef QB_LINUX
+ int off = 0;
+ int on = 1;
+@@ -340,22 +469,33 @@ qb_ipcc_us_setup_connect(struct qb_ipcc_
+ qb_ipcc_us_sock_close(c->setup.u.us.sock);
+ return res;
+ }
++
++ data = init_ipc_auth_data(c->setup.u.us.sock, sizeof(struct qb_ipc_connection_response));
++ if (data == NULL) {
++ qb_ipcc_us_sock_close(c->setup.u.us.sock);
++ return -ENOMEM;
++ }
++
++ qb_ipc_us_ready(&c->setup, NULL, -1, POLLIN);
++ res = qb_ipc_us_recv_msghdr(data);
++
+ #ifdef QB_LINUX
+ setsockopt(c->setup.u.us.sock, SOL_SOCKET, SO_PASSCRED, &off,
+ sizeof(off));
+ #endif
+
+- res =
+- qb_ipc_us_recv(&c->setup, r,
+- sizeof(struct qb_ipc_connection_response), -1);
+- if (res < 0) {
++ if (res != data->len) {
++ destroy_ipc_auth_data(data);
+ return res;
+ }
+
+- if (r->hdr.error != 0) {
+- return r->hdr.error;
+- }
+- return 0;
++ memcpy(r, &data->msg.res, sizeof(struct qb_ipc_connection_response));
++
++ qb_ipc_auth_creds(data);
++ c->egid = data->ugp.gid;
++
++ destroy_ipc_auth_data(data);
++ return r->hdr.error;
+ }
+
+ /*
+@@ -561,19 +701,6 @@ send_response:
+ return res;
+ }
+
+-static void
+-destroy_ipc_auth_data(struct ipc_auth_data *data)
+-{
+- if (data->s) {
+- qb_ipcs_unref(data->s);
+- }
+-
+-#ifdef SO_PASSCRED
+- free(data->cmsg_cred);
+-#endif
+- free(data);
+-}
+-
+ static int32_t
+ process_auth(int32_t fd, int32_t revents, void *d)
+ {
+@@ -615,71 +742,7 @@ process_auth(int32_t fd, int32_t revents
+ goto cleanup_and_return;
+ }
+
+- /*
+- * currently support getpeerucred, getpeereid, and SO_PASSCRED credential
+- * retrieval mechanisms for various Platforms
+- */
+-#ifdef HAVE_GETPEERUCRED
+- /*
+- * Solaris and some BSD systems
+- */
+- {
+- ucred_t *uc = NULL;
+-
+- if (getpeerucred(data->sock, &uc) == 0) {
+- res = 0;
+- data->ugp.uid = ucred_geteuid(uc);
+- data->ugp.gid = ucred_getegid(uc);
+- data->ugp.pid = ucred_getpid(uc);
+- ucred_free(uc);
+- } else {
+- res = -errno;
+- }
+- }
+-#elif HAVE_GETPEEREID
+- /*
+- * Usually MacOSX systems
+- */
+- {
+- /*
+- * TODO get the peer's pid.
+- * c->pid = ?;
+- */
+- if (getpeereid(data->sock, &data->ugp.uid, &data->ugp.gid) == 0) {
+- res = 0;
+- } else {
+- res = -errno;
+- }
+- }
+-
+-#elif SO_PASSCRED
+- /*
+- * Usually Linux systems
+- */
+- {
+- struct ucred cred;
+- struct cmsghdr *cmsg;
+-
+- res = -EINVAL;
+- for (cmsg = CMSG_FIRSTHDR(&data->msg_recv); cmsg != NULL;
+- cmsg = CMSG_NXTHDR(&data->msg_recv, cmsg)) {
+- if (cmsg->cmsg_type != SCM_CREDENTIALS)
+- continue;
+-
+- memcpy(&cred, CMSG_DATA(cmsg), sizeof(struct ucred));
+- res = 0;
+- data->ugp.pid = cred.pid;
+- data->ugp.uid = cred.uid;
+- data->ugp.gid = cred.gid;
+- break;
+- }
+- }
+-#else /* no credentials */
+- data->ugp.pid = 0;
+- data->ugp.uid = 0;
+- data->ugp.gid = 0;
+- res = -ENOTSUP;
+-#endif /* no credentials */
++ res = qb_ipc_auth_creds(data);
+
+ cleanup_and_return:
+ #ifdef SO_PASSCRED
+@@ -690,7 +753,7 @@ cleanup_and_return:
+
+ if (res < 0) {
+ close(data->sock);
+- } else if (data->msg.hdr.id == QB_IPC_MSG_AUTHENTICATE) {
++ } else if (data->msg.req.hdr.id == QB_IPC_MSG_AUTHENTICATE) {
+ (void)handle_new_connection(data->s, res, data->sock, &data->msg, data->len, &data->ugp);
+ } else {
+ close(data->sock);
+@@ -709,7 +772,7 @@ qb_ipcs_uc_recv_and_auth(int32_t sock, s
+ int on = 1;
+ #endif
+
+- data = calloc(1, sizeof(struct ipc_auth_data));
++ data = init_ipc_auth_data(sock, sizeof(struct qb_ipc_connection_request));
+ if (data == NULL) {
+ close(sock);
+ /* -ENOMEM */
+@@ -719,34 +782,6 @@ qb_ipcs_uc_recv_and_auth(int32_t sock, s
+ data->s = s;
+ qb_ipcs_ref(data->s);
+
+- data->msg_recv.msg_iov = &data->iov_recv;
+- data->msg_recv.msg_iovlen = 1;
+- data->msg_recv.msg_name = 0;
+- data->msg_recv.msg_namelen = 0;
+-
+-#ifdef SO_PASSCRED
+- data->cmsg_cred = calloc(1,CMSG_SPACE(sizeof(struct ucred)));
+- if (data->cmsg_cred == NULL) {
+- close(sock);
+- destroy_ipc_auth_data(data);
+- /* -ENOMEM */
+- return;
+- }
+- data->msg_recv.msg_control = (void *)data->cmsg_cred;
+- data->msg_recv.msg_controllen = CMSG_SPACE(sizeof(struct ucred));
+-#endif
+-#ifdef QB_SOLARIS
+- data->msg_recv.msg_accrights = 0;
+- data->msg_recv.msg_accrightslen = 0;
+-#else
+- data->msg_recv.msg_flags = 0;
+-#endif /* QB_SOLARIS */
+-
+- data->len = sizeof(struct qb_ipc_connection_request);
+- data->iov_recv.iov_base = &data->msg;
+- data->iov_recv.iov_len = data->len;
+- data->sock = sock;
+-
+ #ifdef SO_PASSCRED
+ setsockopt(sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on));
+ #endif
Added: head/devel/libqb/files/patch-lib-ipc_socket.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/devel/libqb/files/patch-lib-ipc_socket.c Wed Mar 23 10:49:17 2016 (r411695)
@@ -0,0 +1,130 @@
+--- lib/ipc_socket.c.orig 2015-08-18 19:55:43 UTC
++++ lib/ipc_socket.c
+@@ -60,7 +60,8 @@ set_sock_addr(struct sockaddr_un *addres
+
+ static int32_t
+ qb_ipc_dgram_sock_setup(const char *base_name,
+- const char *service_name, int32_t * sock_pt)
++ const char *service_name, int32_t * sock_pt,
++ gid_t gid)
+ {
+ int32_t request_fd;
+ struct sockaddr_un local_address;
+@@ -84,6 +85,10 @@ qb_ipc_dgram_sock_setup(const char *base
+ #endif
+ res = bind(request_fd, (struct sockaddr *)&local_address,
+ sizeof(local_address));
++#if !(defined(QB_LINUX) || defined(QB_CYGWIN))
++ chmod(local_address.sun_path, 0660);
++ chown(local_address.sun_path, -1, gid);
++#endif
+ if (res < 0) {
+ goto error_connect;
+ }
+@@ -107,7 +112,7 @@ set_sock_size(int sockfd, size_t max_msg
+
+ rc = getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &optval, &optlen);
+
+- qb_util_log(LOG_TRACE, "%d: getsockopt(%d, needed:%d) actual:%d",
++ qb_util_log(LOG_TRACE, "%d: getsockopt(%d, SO_SNDBUF, needed:%d) actual:%d",
+ rc, sockfd, max_msg_size, optval);
+
+ /* The optvat <= max_msg_size check is weird...
+@@ -121,6 +126,29 @@ set_sock_size(int sockfd, size_t max_msg
+ optlen = sizeof(optval);
+ rc = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &optval, optlen);
+ }
++
++ if (rc != 0) {
++ return -errno;
++ }
++
++ rc = getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &optval, &optlen);
++
++ qb_util_log(LOG_TRACE, "%d: getsockopt(%d, SO_RCVBUF, needed:%d) actual:%d",
++ rc, sockfd, max_msg_size, optval);
++
++ /* Set the sockets receive buffer size to match the send buffer. Without
++ * this calls to sendto() will result in an ENOBUFS error if the message
++ * is larger than net.local.dgram.recvspace sysctl. */
++ if (rc == 0 && optval <= max_msg_size) {
++ optval = max_msg_size;
++ optlen = sizeof(optval);
++ rc = setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &optval, optlen);
++ }
++
++ if (rc != 0) {
++ return -errno;
++ }
++
+ return rc;
+ }
+
+@@ -218,12 +246,12 @@ static int32_t
+ qb_ipc_dgram_sock_connect(const char *base_name,
+ const char *local_name,
+ const char *remote_name,
+- int32_t max_msg_size, int32_t * sock_pt)
++ int32_t max_msg_size, int32_t * sock_pt, gid_t gid)
+ {
+ char sock_path[PATH_MAX];
+ struct sockaddr_un remote_address;
+ int32_t res = qb_ipc_dgram_sock_setup(base_name, local_name,
+- sock_pt);
++ sock_pt, gid);
+ if (res < 0) {
+ return res;
+ }
+@@ -544,14 +572,14 @@ qb_ipcc_us_connect(struct qb_ipcc_connec
+ fd_hdr = -1;
+
+ res = qb_ipc_dgram_sock_connect(r->response, "response", "request",
+- r->max_msg_size, &c->request.u.us.sock);
++ r->max_msg_size, &c->request.u.us.sock, c->egid);
+ if (res != 0) {
+ goto cleanup_hdr;
+ }
+ c->response.u.us.sock = c->request.u.us.sock;
+
+ res = qb_ipc_dgram_sock_connect(r->response, "event", "event-tx",
+- r->max_msg_size, &c->event.u.us.sock);
++ r->max_msg_size, &c->event.u.us.sock, c->egid);
+ if (res != 0) {
+ goto cleanup_hdr;
+ }
+@@ -773,10 +801,16 @@ qb_ipcs_us_connect(struct qb_ipcs_servic
+
+ /* request channel */
+ res = qb_ipc_dgram_sock_setup(r->response, "request",
+- &c->request.u.us.sock);
++ &c->request.u.us.sock, c->egid);
+ if (res < 0) {
+ goto cleanup_hdr;
+ }
++
++ res = set_sock_size(c->request.u.us.sock, c->request.max_msg_size);
++ if (res != 0) {
++ goto cleanup_hdr;
++ }
++
+ c->setup.u.us.sock_name = NULL;
+ c->request.u.us.sock_name = NULL;
+
+@@ -787,10 +821,16 @@ qb_ipcs_us_connect(struct qb_ipcs_servic
+
+ /* event channel */
+ res = qb_ipc_dgram_sock_setup(r->response, "event-tx",
+- &c->event.u.us.sock);
++ &c->event.u.us.sock, c->egid);
+ if (res < 0) {
+ goto cleanup_hdr;
+ }
++
++ res = set_sock_size(c->event.u.us.sock, c->event.max_msg_size);
++ if (res != 0) {
++ goto cleanup_hdr;
++ }
++
+ snprintf(path, PATH_MAX, "%s-%s", r->response, "event");
+ c->event.u.us.sock_name = strdup(path);
+
Added: head/devel/libqb/files/patch-lib-log.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/devel/libqb/files/patch-lib-log.c Wed Mar 23 10:49:17 2016 (r411695)
@@ -0,0 +1,97 @@
+--- lib/log.c.orig 2015-08-18 19:55:43 UTC
++++ lib/log.c
+@@ -47,9 +47,15 @@ static int32_t logger_inited = QB_FALSE;
+ static pthread_rwlock_t _listlock;
+ static qb_log_filter_fn _custom_filter_fn = NULL;
+
++static QB_LIST_DECLARE(dlnames);
+ static QB_LIST_DECLARE(tags_head);
+ static QB_LIST_DECLARE(callsite_sections);
+
++struct dlname {
++ char *dln_name;
++ struct qb_list_head list;
++};
++
+ struct callsite_section {
+ struct qb_log_callsite *start;
+ struct qb_log_callsite *stop;
+@@ -739,23 +745,45 @@ qb_log_filter_ctl(int32_t t, enum qb_log
+ }
+
+ #ifdef QB_HAVE_ATTRIBUTE_SECTION
++/* Some platforms (eg. FreeBSD 10+) don't support calling dlopen() from
++ * within a dl_iterate_phdr() callback; so save all of the dlpi_names to
++ * a list and iterate over them afterwards. */
+ static int32_t
+ _log_so_walk_callback(struct dl_phdr_info *info, size_t size, void *data)
+ {
++ struct dlname *dlname;
++
+ if (strlen(info->dlpi_name) > 0) {
+- void *handle;
+- void *start;
+- void *stop;
+- const char *error;
++ dlname = calloc(1, sizeof(struct dlname));
++ if (!dlname)
++ return 0;
++ dlname->dln_name = strdup(info->dlpi_name);
++ qb_list_add_tail(&dlname->list, &dlnames);
++ }
+
+- handle = dlopen(info->dlpi_name, RTLD_LAZY);
++ return 0;
++}
++
++static void
++_log_so_walk_dlnames(void)
++{
++ struct dlname *dlname;
++ struct qb_list_head *iter;
++ struct qb_list_head *next;
++
++ void *handle;
++ void *start;
++ void *stop;
++ const char *error;
++
++ qb_list_for_each_safe(iter, next, &dlnames) {
++ dlname = qb_list_entry(iter, struct dlname, list);
++
++ handle = dlopen(dlname->dln_name, RTLD_LAZY);
+ error = dlerror();
+ if (!handle || error) {
+ qb_log(LOG_ERR, "%s", error);
+- if (handle) {
+- dlclose(handle);
+- }
+- return 0;
++ goto done;
+ }
+
+ start = dlsym(handle, "__start___verbose");
+@@ -773,9 +801,13 @@ _log_so_walk_callback(struct dl_phdr_inf
+ qb_log_callsites_register(start, stop);
+ }
+ done:
+- dlclose(handle);
++ if (handle)
++ dlclose(handle);
++ qb_list_del(iter);
++ if (dlname->dln_name)
++ free(dlname->dln_name);
++ free(dlname);
+ }
+- return 0;
+ }
+ #endif /* QB_HAVE_ATTRIBUTE_SECTION */
+
+@@ -823,6 +855,7 @@ qb_log_init(const char *name, int32_t fa
+ #ifdef QB_HAVE_ATTRIBUTE_SECTION
+ qb_log_callsites_register(__start___verbose, __stop___verbose);
+ dl_iterate_phdr(_log_so_walk_callback, NULL);
++ _log_so_walk_dlnames();
+ #endif /* QB_HAVE_ATTRIBUTE_SECTION */
+
+ conf[QB_LOG_STDERR].state = QB_LOG_STATE_DISABLED;
Added: head/devel/libqb/files/patch-lib-unix.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/devel/libqb/files/patch-lib-unix.c Wed Mar 23 10:49:17 2016 (r411695)
@@ -0,0 +1,20 @@
+--- lib/unix.c.orig 2015-08-18 19:55:43 UTC
++++ lib/unix.c
+@@ -83,7 +83,7 @@ qb_sys_mmap_file_open(char *path, const
+ #if defined(QB_LINUX) || defined(QB_CYGWIN)
+ snprintf(path, PATH_MAX, "/dev/shm/%s", file);
+ #else
+- snprintf(path, PATH_MAX, LOCALSTATEDIR "/run/%s", file);
++ snprintf(path, PATH_MAX, "%s/%s", SOCKETDIR, file);
+ is_absolute = path;
+ #endif
+ }
+@@ -91,7 +91,7 @@ qb_sys_mmap_file_open(char *path, const
+ if (fd < 0 && !is_absolute) {
+ qb_util_perror(LOG_ERR, "couldn't open file %s", path);
+
+- snprintf(path, PATH_MAX, LOCALSTATEDIR "/run/%s", file);
++ snprintf(path, PATH_MAX, "%s/%s", SOCKETDIR, file);
+ fd = open_mmap_file(path, file_flags);
+ if (fd < 0) {
+ res = -errno;
Added: head/devel/libqb/pkg-descr
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/devel/libqb/pkg-descr Wed Mar 23 10:49:17 2016 (r411695)
@@ -0,0 +1,5 @@
+libqb is a library with the primary purpose of providing high performance
+client server reusable features. It provides high performance logging, tracing,
+ipc, and poll.
+
+WWW: https://github.com/ClusterLabs/libqb/wiki
Added: head/devel/libqb/pkg-plist
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/devel/libqb/pkg-plist Wed Mar 23 10:49:17 2016 (r411695)
@@ -0,0 +1,36 @@
+include/qb/qbarray.h
+include/qb/qbatomic.h
+include/qb/qbconfig.h
+include/qb/qbdefs.h
+include/qb/qbhdb.h
+include/qb/qbipc_common.h
+include/qb/qbipcc.h
+include/qb/qbipcs.h
+include/qb/qblist.h
+include/qb/qblog.h
+include/qb/qbloop.h
+include/qb/qbmap.h
+include/qb/qbrb.h
+include/qb/qbutil.h
+lib/libqb.a
+lib/libqb.so
+lib/libqb.so.0
+lib/libqb.so.0.17.2
+libdata/pkgconfig/libqb.pc
+%%DOXYGEN%%man/man3/qbarray.h.3.gz
+%%DOXYGEN%%man/man3/qbatomic.h.3.gz
+%%DOXYGEN%%man/man3/qbhdb.h.3.gz
+%%DOXYGEN%%man/man3/qbipc_common.h.3.gz
+%%DOXYGEN%%man/man3/qbipcc.h.3.gz
+%%DOXYGEN%%man/man3/qbipcs.h.3.gz
+%%DOXYGEN%%man/man3/qblist.h.3.gz
+%%DOXYGEN%%man/man3/qblog.h.3.gz
+%%DOXYGEN%%man/man3/qbloop.h.3.gz
+%%DOXYGEN%%man/man3/qbmap.h.3.gz
+%%DOXYGEN%%man/man3/qbutil.h.3.gz
+%%DOXYGEN%%man/man8/qb-blackbox.8.gz
+sbin/qb-blackbox
+ at comment %%PORTDOCS%%%%DOCSDIR%%/COPYING
+%%PORTDOCS%%%%DOCSDIR%%/INSTALL
+%%PORTDOCS%%%%DOCSDIR%%/README.markdown
+ at dir(,,1770) %%QB_SOCKET_DIR%%
More information about the svn-ports-head
mailing list