summaryrefslogtreecommitdiffstats
path: root/utils/utils.h
diff options
context:
space:
mode:
Diffstat (limited to 'utils/utils.h')
-rw-r--r--utils/utils.h299
1 files changed, 299 insertions, 0 deletions
diff --git a/utils/utils.h b/utils/utils.h
new file mode 100644
index 0000000..f9763eb
--- /dev/null
+++ b/utils/utils.h
@@ -0,0 +1,299 @@
+/*
+ Copyright (c) 2016 Red Hat, Inc. <http://www.redhat.com>
+ This file is part of gluster-block.
+
+ This file is licensed 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.
+*/
+
+
+# ifndef _UTILS_H
+# define _UTILS_H 1
+
+# define _GNU_SOURCE /* See feature_test_macros(7) */
+# include <stdio.h>
+
+# include <stdlib.h>
+# include <stdbool.h>
+# include <string.h>
+# include <errno.h>
+# include <time.h>
+
+
+/* Target Create */
+# define FAILED_CREATE "failed in create"
+# define FAILED_CREATING_FILE "failed while creating block file in gluster volume"
+# define FAILED_CREATING_BACKEND "failed while creating glfs backend"
+# define FAILED_CREATING_IQN "failed while creating IQN"
+# define FAILED_CREATING_LUN "failed while creating LUN"
+# define FAILED_SETTING_ATTRIBUTES "failed while setting attributes"
+# define FAILED_SAVEING_CONFIG "failed while saving configuration"
+
+/* Target List */
+# define FAILED_LIST "failed in list"
+# define FAILED_LIST_BACKEND "failed while listing glfs backends"
+
+/* Target Info */
+# define FAILED_INFO "failed in info"
+# define FAILED_GATHERING_INFO "failed while gathering target info"
+
+/* Target get cfgstring */
+# define FAILED_GATHERING_CFGSTR "failed while gathering backend cfgstring"
+
+/* Target Delete */
+# define FAILED_DELETE "failed in delete"
+# define FAILED_DELETING_BACKEND "failed while deleting glfs backend"
+# define FAILED_DELETING_IQN "failed while deleting IQN"
+# define FAILED_DELETING_FILE "failed while deleting block file from gluster volume"
+
+
+# define ERROR(fmt, ...) \
+ do { \
+ fprintf(stderr, "Error: " fmt " [at %s+%d :<%s>]\n", \
+ __VA_ARGS__, __FILE__, __LINE__, __FUNCTION__); \
+ } while (0)
+
+# define MSG(fmt, ...) \
+ do { \
+ fprintf(stdout, fmt, __VA_ARGS__); \
+ } while (0)
+
+# define LOG(str, level, fmt, ...) \
+ do { \
+ FILE *fd; \
+ if (!strcmp(str, "mgmt")) \
+ fd = fopen (DAEMON_LOG_FILE, "a"); \
+ else if (strcmp(str, "cli")) \
+ fd = fopen (CLI_LOG_FILE, "a"); \
+ else if (strcmp(str, "gfapi")) \
+ fd = fopen (GFAPI_LOG_FILE, "a"); \
+ else \
+ fd = stderr; \
+ fprintf(fd, "[%lu] %s: " fmt " [at %s+%d :<%s>]\n", \
+ (unsigned long)time(NULL), LogLevelLookup[level],\
+ __VA_ARGS__, __FILE__, __LINE__, __FUNCTION__); \
+ if (fd != stderr) \
+ fclose(fd); \
+ } while (0)
+
+# define GB_METALOCK_OR_GOTO(lkfd, volume, ret, label) \
+ do { \
+ struct flock lock = {0, }; \
+ lock.l_type = F_WRLCK; \
+ if (glfs_posix_lock (lkfd, F_SETLKW, &lock)) { \
+ LOG("mgmt", GB_LOG_ERROR, "glfs_posix_lock() on " \
+ "volume %s failed[%s]", volume, strerror(errno)); \
+ ret = -1; \
+ goto label; \
+ } \
+ } while (0)
+
+# define GB_METAUPDATE_OR_GOTO(tgmfd, fname, volume, ret, label,...)\
+ do { \
+ char *write; \
+ if (asprintf(&write, __VA_ARGS__) < 0) { \
+ ret = -1; \
+ goto label; \
+ } \
+ if(glfs_write (tgmfd, write, strlen(write), 0) < 0) { \
+ LOG("mgmt", GB_LOG_ERROR, "glfs_write(%s): on " \
+ "volume %s failed[%s]", fname, volume, \
+ strerror(errno)); \
+ ret = -1; \
+ goto label; \
+ } \
+ GB_FREE(write); \
+ } while (0)
+
+# define GB_METAUNLOCK(lkfd, volume, ret) \
+ do { \
+ struct flock lock = {0, }; \
+ lock.l_type = F_UNLCK; \
+ if (glfs_posix_lock(lkfd, F_SETLK, &lock)) { \
+ LOG("mgmt", GB_LOG_ERROR, "glfs_posix_lock() on " \
+ "volume %s failed[%s]", volume, strerror(errno)); \
+ ret = -1; \
+ } \
+ } while (0)
+
+
+# define CALLOC(x) \
+ calloc(1, x)
+
+# define GB_ALLOC_N(ptr, count) \
+ gbAllocN(&(ptr), sizeof(*(ptr)), (count), \
+ __FILE__, __FUNCTION__, __LINE__) \
+
+# define GB_ALLOC(ptr) \
+ gbAlloc(&(ptr), sizeof(*(ptr)), \
+ __FILE__, __FUNCTION__, __LINE__)
+
+# define GB_STRDUP(dst, src) \
+ gbStrdup(&(dst), src, \
+ __FILE__, __FUNCTION__, __LINE__)
+
+# define GB_FREE(ptr) \
+ gbFree(1 ? (void *) &(ptr) : (ptr))
+
+
+typedef enum gbCmdlineCreateOption {
+ /* needed by create option */
+ GB_CLI_CREATE_VOLUME = 11,
+ GB_CLI_CREATE_VOLSERVER = 12, /* optional (default: localhost)*/
+ GB_CLI_CREATE_SIZE = 13,
+ GB_CLI_CREATE_MULTIPATH = 14,
+ GB_CLI_CREATE_BACKEND_SERVESRS = 15,
+
+ GB_CLI_CREATE_OPT_MAX
+} gbCmdlineCreateOption;
+
+
+typedef enum gbCmdlineCommonOption {
+ /* common to all the cli options */
+ GB_CLI_COMMON_VOLUME = 21,
+
+ GB_CLI_COMMON_OPT_MAX
+} gbCmdlineCommonOption;
+
+
+typedef enum gbCmdlineOption {
+ GB_CLI_UNKNOWN = 0,
+
+ GB_CLI_CREATE = 1,
+ GB_CLI_LIST = 2,
+ GB_CLI_INFO = 3,
+ GB_CLI_DELETE = 4,
+ GB_CLI_MODIFY = 5,
+ GB_CLI_HELP = 6,
+
+ GB_CLI_OPT_MAX
+} gbCmdlineOption;
+
+
+static const char *const gbCmdlineOptLookup[] = {
+ [GB_CLI_UNKNOWN] = "NONE",
+
+ [GB_CLI_CREATE] = "create",
+ [GB_CLI_LIST] = "list",
+ [GB_CLI_INFO] = "info",
+ [GB_CLI_DELETE] = "delete",
+ [GB_CLI_MODIFY] = "modify",
+ [GB_CLI_HELP] = "help",
+
+ [GB_CLI_OPT_MAX] = NULL,
+};
+
+static const char *const gbCmdlineCreateOptLookup[] = {
+ [GB_CLI_CREATE_VOLUME] = "volume",
+ [GB_CLI_CREATE_VOLSERVER] = "volserver",
+ [GB_CLI_CREATE_SIZE] = "size",
+ [GB_CLI_CREATE_MULTIPATH] = "mpath",
+ [GB_CLI_CREATE_BACKEND_SERVESRS] = "backend-servers",
+
+
+ [GB_CLI_CREATE_OPT_MAX] = NULL
+};
+
+static const char *const gbCmdlineCommonOptLookup[] = {
+ [GB_CLI_COMMON_VOLUME] = "volume",
+
+ [GB_CLI_COMMON_OPT_MAX] = NULL
+};
+
+typedef enum LogLevel {
+ GB_LOG_NONE = 0,
+ GB_LOG_EMERGENCY = 1,
+ GB_LOG_ALERT = 2,
+ GB_LOG_CRITICAL = 3,
+ GB_LOG_ERROR = 4,
+ GB_LOG_WARNING = 5,
+ GB_LOG_NOTICE = 6,
+ GB_LOG_INFO = 7,
+ GB_LOG_DEBUG = 8,
+ GB_LOG_TRACE = 9,
+
+ GB_LOG_MAX
+} LogLevel;
+
+static const char *const LogLevelLookup[] = {
+ [GB_LOG_NONE] = "NONE",
+ [GB_LOG_EMERGENCY] = "EMERGENCY",
+ [GB_LOG_ALERT] = "ALERT",
+ [GB_LOG_CRITICAL] = "CRITICAL",
+ [GB_LOG_ERROR] = "ERROR",
+ [GB_LOG_WARNING] = "WARNING",
+ [GB_LOG_NOTICE] = "NOTICE",
+ [GB_LOG_INFO] = "INFO",
+ [GB_LOG_DEBUG] = "DEBUG",
+ [GB_LOG_TRACE] = "TRACE",
+
+ [GB_LOG_MAX] = NULL,
+};
+
+typedef enum Metakey {
+ GB_META_VOLUME = 0,
+ GB_META_GBID = 1,
+ GB_META_SIZE = 2,
+ GB_META_HA = 3,
+ GB_META_ENTRYCREATE = 4,
+
+ GB_METAKEY_MAX
+} Metakey;
+
+static const char *const MetakeyLookup[] = {
+ [GB_META_VOLUME] = "VOLUME",
+ [GB_META_GBID] = "GBID",
+ [GB_META_SIZE] = "SIZE",
+ [GB_META_HA] = "HA",
+ [GB_META_ENTRYCREATE] = "ENTRYCREATE",
+
+ [GB_METAKEY_MAX] = NULL
+};
+
+typedef enum MetaStatus {
+ GB_CONFIG_SUCCESS = 0,
+ GB_CONFIG_FAIL = 1,
+ GB_CONFIG_INPROGRESS = 2,
+ GB_CLEANUP_SUCCESS = 3,
+ GB_CLEANUP_FAIL = 4,
+ GB_CLEANUP_INPROGRES = 5,
+
+ GB_METASTATUS_MAX
+} MetaStatus;
+
+static const char *const MetaStatusLookup[] = {
+ [GB_CONFIG_SUCCESS] = "CONFIGSUCCESS",
+ [GB_CONFIG_FAIL] = "CONFIGFAIL",
+ [GB_CONFIG_INPROGRESS] = "CONFIGINPROGRESS",
+ [GB_CLEANUP_INPROGRES] = "CLEANUPINPROGRESS",
+ [GB_CLEANUP_SUCCESS] = "CLEANUPSUCCESS",
+ [GB_CLEANUP_FAIL] = "CLEANUPFAIL",
+
+ [GB_METASTATUS_MAX] = NULL,
+};
+
+
+int glusterBlockCLIOptEnumParse(const char *opt);
+
+int glusterBlockCLICreateOptEnumParse(const char *opt);
+
+int glusterBlockCLICommonOptEnumParse(const char *opt);
+
+int blockMetaKeyEnumParse(const char *opt);
+
+int blockMetaStatusEnumParse(const char *opt);
+
+int gbAlloc(void *ptrptr, size_t size,
+ const char *filename, const char *funcname, size_t linenr);
+
+int gbAllocN(void *ptrptr, size_t size, size_t count,
+ const char *filename, const char *funcname, size_t linenr);
+
+int gbStrdup(char **dest, const char *src,
+ const char *filename, const char *funcname, size_t linenr);
+
+void gbFree(void *ptrptr);
+
+#endif /* _UTILS_H */