summaryrefslogtreecommitdiffstats
path: root/libglusterfs/src/events.c
diff options
context:
space:
mode:
Diffstat (limited to 'libglusterfs/src/events.c')
-rw-r--r--libglusterfs/src/events.c168
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;
}