diff options
Diffstat (limited to 'libglusterfs/src/events.c')
| -rw-r--r-- | libglusterfs/src/events.c | 168 |
1 files changed, 108 insertions, 60 deletions
diff --git a/libglusterfs/src/events.c b/libglusterfs/src/events.c index f93934de0fb..33157549897 100644 --- a/libglusterfs/src/events.c +++ b/libglusterfs/src/events.c @@ -16,73 +16,121 @@ #include <time.h> #include <stdarg.h> #include <string.h> -#include "syscall.h" -#include "mem-pool.h" -#include "events.h" +#include <netinet/in.h> +#include <netdb.h> +#include "glusterfs/syscall.h" +#include "glusterfs/mem-pool.h" +#include "glusterfs/glusterfs.h" +#include "glusterfs/globals.h" +#include "glusterfs/events.h" -#define EVENT_PATH DATADIR "/run/gluster/events.sock" -#define EVENTS_MSG_MAX 2048 - +#define EVENT_HOST "127.0.0.1" +#define EVENT_PORT 24009 int -gf_event (eventtypes_t event, char *fmt, ...) +_gf_event(eventtypes_t event, const char *fmt, ...) { - int ret = 0; - int sock = -1; - char eventstr[EVENTS_MSG_MAX] = ""; - struct sockaddr_un server; - va_list arguments; - char *msg = NULL; - size_t eventstr_size = 0; - - if (event < 0 || event >= EVENT_LAST) { - ret = EVENT_ERROR_INVALID_INPUTS; - goto out; - } - - sock = socket(AF_UNIX, SOCK_STREAM, 0); - if (sock < 0) { - ret = EVENT_ERROR_SOCKET; - goto out; - } - server.sun_family = AF_UNIX; - strcpy(server.sun_path, EVENT_PATH); - - if (connect(sock, - (struct sockaddr *) &server, - sizeof(struct sockaddr_un)) < 0) { - ret = EVENT_ERROR_CONNECT; - goto out; + int ret = 0; + int sock = -1; + char *eventstr = NULL; + va_list arguments; + char *msg = NULL; + glusterfs_ctx_t *ctx = NULL; + char *host = NULL; + struct addrinfo hints; + struct addrinfo *result = NULL; + struct addrinfo *iter_result_ptr = NULL; + xlator_t *this = THIS; + char *volfile_server_transport = NULL; + + /* Global context */ + ctx = this->ctx; + + if (event < 0 || event >= EVENT_LAST) { + ret = EVENT_ERROR_INVALID_INPUTS; + goto out; + } + + if (ctx) { + volfile_server_transport = ctx->cmd_args.volfile_server_transport; + } + if (!volfile_server_transport) { + volfile_server_transport = "tcp"; + } + + /* host = NULL returns localhost */ + if (ctx && ctx->cmd_args.volfile_server && + (strcmp(volfile_server_transport, "unix"))) { + /* If it is client code then volfile_server is set + use that information to push the events. */ + host = ctx->cmd_args.volfile_server; + } + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_flags = AI_ADDRCONFIG; + + if ((getaddrinfo(host, TOSTRING(EVENT_PORT), &hints, &result)) != 0) { + ret = EVENT_ERROR_RESOLVE; + goto out; + } + + // iterate over the result and break when socket creation is success. + for (iter_result_ptr = result; iter_result_ptr != NULL; + iter_result_ptr = iter_result_ptr->ai_next) { + sock = socket(iter_result_ptr->ai_family, iter_result_ptr->ai_socktype, + iter_result_ptr->ai_protocol); + if (sock != -1) { + break; } + } + /* + * If none of the addrinfo structures lead to a successful socket + * creation, socket creation has failed. + */ + if (sock < 0) { + ret = EVENT_ERROR_SOCKET; + goto out; + } + + va_start(arguments, fmt); + ret = gf_vasprintf(&msg, fmt, arguments); + va_end(arguments); + + if (ret < 0) { + ret = EVENT_ERROR_INVALID_INPUTS; + goto out; + } + + ret = gf_asprintf(&eventstr, "%u %d %s", (unsigned)gf_time(), event, msg); + GF_FREE(msg); + if (ret <= 0) { + ret = EVENT_ERROR_MSG_FORMAT; + goto out; + } + + /* Send Message */ + if (sendto(sock, eventstr, strlen(eventstr), 0, result->ai_addr, + result->ai_addrlen) <= 0) { + ret = EVENT_ERROR_SEND; + goto out; + } + + ret = EVENT_SEND_OK; + +out: + if (sock >= 0) { + sys_close(sock); + } - va_start (arguments, fmt); - ret = gf_vasprintf (&msg, fmt, arguments); - va_end (arguments); - if (ret < 0) { - ret = EVENT_ERROR_INVALID_INPUTS; - goto out; - } - - eventstr_size = snprintf(NULL, 0, "%u %d %s", (unsigned)time(NULL), - event, msg); - - if (eventstr_size + 1 > EVENTS_MSG_MAX) { - eventstr_size = EVENTS_MSG_MAX - 1; - } - - snprintf(eventstr, eventstr_size+1, "%u %d %s", - (unsigned)time(NULL), event, msg); - - if (sys_write(sock, eventstr, strlen(eventstr)) <= 0) { - ret = EVENT_ERROR_SEND; - goto out; - } + /* Allocated by gf_asprintf */ + if (eventstr) + GF_FREE(eventstr); - ret = EVENT_SEND_OK; + if (result) + freeaddrinfo(result); - out: - sys_close(sock); - GF_FREE(msg); - return ret; + return ret; } |
