function run_cmd_as_user { local user=$1 shift su -m $user -c "$*" || return 1 return 0 } ensed to you under your choice of the GNU Lesser General Public License, version 3 or any later version (LGPLv3 or later), or the GNU General Public License, version 2 (GPLv2), in all cases as published by the Free Software Foundation. */ #include #include #include #include #include #include #include #include "glusterfs/gf-event.h" #include "glusterfs/common-utils.h" #include "glusterfs/libglusterfs-messages.h" #include "glusterfs/syscall.h" struct event_pool * gf_event_pool_new(int count, int eventthreadcount) { struct event_pool *event_pool = NULL; extern struct event_ops event_ops_poll; #ifdef HAVE_SYS_EPOLL_H extern struct event_ops event_ops_epoll; event_pool = event_ops_epoll.new(count, eventthreadcount); if (event_pool) { event_pool->ops = &event_ops_epoll; } else { gf_msg("event", GF_LOG_WARNING, 0, LG_MSG_FALLBACK_TO_POLL, "falling back to poll based event handling"); } #endif if (!event_pool) { event_pool = event_ops_poll.new(count, eventthreadcount); if (event_pool) event_pool->ops = &event_ops_poll; } return event_pool; } int gf_event_register(struct event_pool *event_pool, int fd, event_handler_t handler, void *data, int poll_in, int poll_out, char notify_poller_death) { int ret = -1; GF_VALIDATE_OR_GOTO("event", event_pool, out); ret = event_pool->ops->event_register( event_pool, fd, handler, data, poll_in, poll_out, notify_poller_death); out: return ret; } int gf_event_unregister(struct event_pool *event_pool, int fd, int idx) { int ret = -1; GF_VALIDATE_OR_GOTO("event", event_pool, out); ret = event_pool->ops->event_unregister(event_pool, fd, idx); out: return ret; } int gf_event_unregister_close(struct event_pool *event_pool, int fd, int idx) { int ret = -1; GF_VALIDATE_OR_GOTO("event", event_pool, out); ret = event_pool->ops->event_unregister_close(event_pool, fd, idx); out: return ret; } int gf_event_select_on(struct event_pool *event_pool, int fd, int idx_hint, int poll_in, int poll_out) { int ret = -1; GF_VALIDATE_OR_GOTO("event", event_pool, out); ret = event_pool->ops->event_select_on(event_pool, fd, idx_hint, poll_in, poll_out); out: return ret; } int gf_event_dispatch(struct event_pool *event_pool) { int ret = -1; GF_VALIDATE_OR_GOTO("event", event_pool, out); ret = event_pool->ops->event_dispatch(event_pool); if (ret) goto out; out: return ret; } int gf_event_reconfigure_threads(struct event_pool *event_pool, int value) { int ret = -1; GF_VALIDATE_OR_GOTO("event", event_pool, out); /* call event refresh function */ ret = event_pool->ops->event_reconfigure_threads(event_pool, value); out: return ret; } int gf_event_pool_destroy(struct event_pool *event_pool) { int ret = -1; int destroy = 0, activethreadcount = 0; GF_VALIDATE_OR_GOTO("event", event_pool, out); pthread_mutex_lock(&event_pool->mutex); { destroy = event_pool->destroy; activethreadcount = event_pool->activethreadcount; } pthread_mutex_unlock(&event_pool->mutex); if (!destroy || (activethreadcount > 0)) { goto out; } ret = event_pool->ops->event_pool_destroy(event_pool); out: return ret; } void poller_destroy_h