diff options
Diffstat (limited to 'libglusterfs/src/common-utils.c')
-rw-r--r-- | libglusterfs/src/common-utils.c | 7053 |
1 files changed, 3540 insertions, 3513 deletions
diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index 748772bb21b..aae9858fe22 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -63,36 +63,41 @@ #define AI_ADDRCONFIG 0 #endif /* AI_ADDRCONFIG */ -char *vol_type_str[] = {"Distribute", - "Stripe", - "Replicate", - "Striped-Replicate", - "Disperse", - "Tier", - "Distributed-Stripe", - "Distributed-Replicate", - "Distributed-Striped-Replicate", - "Distributed-Disperse", - }; +char *vol_type_str[] = { + "Distribute", + "Stripe", + "Replicate", + "Striped-Replicate", + "Disperse", + "Tier", + "Distributed-Stripe", + "Distributed-Replicate", + "Distributed-Striped-Replicate", + "Distributed-Disperse", +}; typedef int32_t (*rw_op_t)(int32_t fd, char *buf, int32_t size); typedef int32_t (*rwv_op_t)(int32_t fd, const struct iovec *buf, int32_t size); void -gf_xxh64_wrapper(const unsigned char *data, size_t const len, unsigned long long const seed, - char *xxh64) +gf_xxh64_wrapper(const unsigned char *data, size_t const len, + unsigned long long const seed, char *xxh64) { - unsigned short i = 0; - const unsigned short lim = GF_XXH64_DIGEST_LENGTH*2+1; - XXH64_hash_t hash = 0; - XXH64_canonical_t c_hash = {{0,},}; - const uint8_t *p = (const uint8_t *) &c_hash; + unsigned short i = 0; + const unsigned short lim = GF_XXH64_DIGEST_LENGTH * 2 + 1; + XXH64_hash_t hash = 0; + XXH64_canonical_t c_hash = { + { + 0, + }, + }; + const uint8_t *p = (const uint8_t *)&c_hash; - hash = XXH64(data, len, seed); - XXH64_canonicalFromHash(&c_hash, hash); + hash = XXH64(data, len, seed); + XXH64_canonicalFromHash(&c_hash, hash); - for (i = 0; i < GF_XXH64_DIGEST_LENGTH; i++) - snprintf(xxh64 + i * 2, lim-i*2, "%02x", p[i]); + for (i = 0; i < GF_XXH64_DIGEST_LENGTH; i++) + snprintf(xxh64 + i * 2, lim - i * 2, "%02x", p[i]); } /** @@ -133,34 +138,35 @@ gf_xxh64_wrapper(const unsigned char *data, size_t const len, unsigned long long * tmp[15] = (hash_1) & 0xff; **/ static int -gf_gfid_from_xxh64 (xlator_t *this, uuid_t gfid, XXH64_hash_t hash, - unsigned short index) -{ - int ret = -1; - int i = -1; - - if ((index != 0) && (index != 8)) { - gf_msg_callingfn ("gfid-from-xxh64", GF_LOG_WARNING, 0, - LG_MSG_INDEX_NOT_FOUND, - "index can only be either 0 or 8, as this" - "function's purpose is to encode a 8 byte " - "hash inside the gfid (index: %d)", index); - goto out; - } - - for (i = 0; i < sizeof (hash); i++) { - /* - * As of now the below statement is equivalent of this. - * gfid[index+i] = (hash >> (64 - (8 * (i+1)))) & 0xff; - */ - gfid[index+i] = (hash >> ((sizeof (hash) * 8) - (8 * (i+1)))) - & (0xff); - } +gf_gfid_from_xxh64(xlator_t *this, uuid_t gfid, XXH64_hash_t hash, + unsigned short index) +{ + int ret = -1; + int i = -1; + + if ((index != 0) && (index != 8)) { + gf_msg_callingfn("gfid-from-xxh64", GF_LOG_WARNING, 0, + LG_MSG_INDEX_NOT_FOUND, + "index can only be either 0 or 8, as this" + "function's purpose is to encode a 8 byte " + "hash inside the gfid (index: %d)", + index); + goto out; + } + + for (i = 0; i < sizeof(hash); i++) { + /* + * As of now the below statement is equivalent of this. + * gfid[index+i] = (hash >> (64 - (8 * (i+1)))) & 0xff; + */ + gfid[index + i] = (hash >> ((sizeof(hash) * 8) - (8 * (i + 1)))) & + (0xff); + } - ret = 0; + ret = 0; out: - return ret; + return ret; } /** @@ -177,22 +183,26 @@ out: * of the hash). **/ XXH64_hash_t -gf_xxh64_hash_wrapper (const unsigned char *data, size_t const len, - unsigned long long const seed, char *xxh64) +gf_xxh64_hash_wrapper(const unsigned char *data, size_t const len, + unsigned long long const seed, char *xxh64) { - unsigned short i = 0; - const unsigned short lim = GF_XXH64_DIGEST_LENGTH*2+1; - XXH64_hash_t hash = 0; - XXH64_canonical_t c_hash = {{0,},}; - const uint8_t *p = (const uint8_t *)&c_hash; + unsigned short i = 0; + const unsigned short lim = GF_XXH64_DIGEST_LENGTH * 2 + 1; + XXH64_hash_t hash = 0; + XXH64_canonical_t c_hash = { + { + 0, + }, + }; + const uint8_t *p = (const uint8_t *)&c_hash; - hash = XXH64(data, len, seed); - XXH64_canonicalFromHash (&c_hash, hash); + hash = XXH64(data, len, seed); + XXH64_canonicalFromHash(&c_hash, hash); - for (i = 0; i < GF_XXH64_DIGEST_LENGTH; i++) - snprintf (xxh64 + i * 2, lim-i*2, "%02x", p[i]); + for (i = 0; i < GF_XXH64_DIGEST_LENGTH; i++) + snprintf(xxh64 + i * 2, lim - i * 2, "%02x", p[i]); - return hash; + return hash; } /** @@ -220,152 +230,165 @@ gf_xxh64_hash_wrapper (const unsigned char *data, size_t const len, * one 16 byte entity. **/ int -gf_gfid_generate_from_xxh64 (uuid_t gfid, char *key) -{ - char xxh64_1[GF_XXH64_DIGEST_LENGTH*2+1] = {0, }; - char xxh64_2[GF_XXH64_DIGEST_LENGTH*2+1] = {0, }; - XXH64_hash_t hash_1 = 0; - XXH64_hash_t hash_2 = 0; - int ret = -1; - xlator_t *this = THIS; - - hash_1 = gf_xxh64_hash_wrapper((unsigned char *)key, - strlen (key), GF_XXHSUM64_DEFAULT_SEED, - xxh64_1); - - hash_2 = gf_xxh64_hash_wrapper((unsigned char *)xxh64_1, - strlen (xxh64_1), - GF_XXHSUM64_DEFAULT_SEED, xxh64_2); - - /* hash_2 is saved in 1st 8 elements of uuid_t char array */ - if (gf_gfid_from_xxh64 (this, gfid, hash_2, 0)) { - gf_msg_callingfn (this->name, GF_LOG_WARNING, 0, - LG_MSG_XXH64_TO_GFID_FAILED, - "failed to encode the hash %llx into the 1st" - "half of gfid", hash_2); - goto out; - } - - /* hash_1 is saved in the remaining 8 elements of uuid_t */ - if (gf_gfid_from_xxh64 (this, gfid, hash_1, 8)) { - gf_msg_callingfn (this->name, GF_LOG_WARNING, 0, - LG_MSG_XXH64_TO_GFID_FAILED, - "failed to encode the hash %llx into the 2nd" - "half of gfid", hash_1); - goto out; - } - - gf_msg_debug (this->name, 0, "gfid generated is %s (hash1: %llx) " - "hash2: %llx, xxh64_1: %s xxh64_2: %s", uuid_utoa (gfid), - hash_1, hash_2, xxh64_1, xxh64_2); - - ret = 0; +gf_gfid_generate_from_xxh64(uuid_t gfid, char *key) +{ + char xxh64_1[GF_XXH64_DIGEST_LENGTH * 2 + 1] = { + 0, + }; + char xxh64_2[GF_XXH64_DIGEST_LENGTH * 2 + 1] = { + 0, + }; + XXH64_hash_t hash_1 = 0; + XXH64_hash_t hash_2 = 0; + int ret = -1; + xlator_t *this = THIS; + + hash_1 = gf_xxh64_hash_wrapper((unsigned char *)key, strlen(key), + GF_XXHSUM64_DEFAULT_SEED, xxh64_1); + + hash_2 = gf_xxh64_hash_wrapper((unsigned char *)xxh64_1, strlen(xxh64_1), + GF_XXHSUM64_DEFAULT_SEED, xxh64_2); + + /* hash_2 is saved in 1st 8 elements of uuid_t char array */ + if (gf_gfid_from_xxh64(this, gfid, hash_2, 0)) { + gf_msg_callingfn(this->name, GF_LOG_WARNING, 0, + LG_MSG_XXH64_TO_GFID_FAILED, + "failed to encode the hash %llx into the 1st" + "half of gfid", + hash_2); + goto out; + } + + /* hash_1 is saved in the remaining 8 elements of uuid_t */ + if (gf_gfid_from_xxh64(this, gfid, hash_1, 8)) { + gf_msg_callingfn(this->name, GF_LOG_WARNING, 0, + LG_MSG_XXH64_TO_GFID_FAILED, + "failed to encode the hash %llx into the 2nd" + "half of gfid", + hash_1); + goto out; + } + + gf_msg_debug(this->name, 0, + "gfid generated is %s (hash1: %llx) " + "hash2: %llx, xxh64_1: %s xxh64_2: %s", + uuid_utoa(gfid), hash_1, hash_2, xxh64_1, xxh64_2); + + ret = 0; out: - return ret; + return ret; } /* works similar to mkdir(1) -p. */ int -mkdir_p (char *path, mode_t mode, gf_boolean_t allow_symlinks) -{ - int i = 0; - int ret = -1; - char dir[PATH_MAX] = {0,}; - struct stat stbuf = {0,}; - - const int path_len = min(strlen(path), PATH_MAX -1); - - snprintf(dir, path_len + 1, "%s", path); - - i = (dir[0] == '/')? 1: 0; - do { - if (path[i] != '/' && path[i] != '\0') - continue; - - dir[i] = '\0'; - ret = sys_mkdir (dir, mode); - if (ret && errno != EEXIST) { - gf_msg ("", GF_LOG_ERROR, errno, LG_MSG_DIR_OP_FAILED, - "Failed due to reason"); - goto out; - } - - if (ret && errno == EEXIST && !allow_symlinks) { - ret = sys_lstat (dir, &stbuf); - if (ret) - goto out; - - if (S_ISLNK (stbuf.st_mode)) { - ret = -1; - gf_msg ("", GF_LOG_ERROR, 0, - LG_MSG_DIR_IS_SYMLINK, "%s is a " - "symlink", dir); - goto out; - } - } - dir[i] = '/'; - - } while (path[i++] != '\0'); - - ret = sys_stat (dir, &stbuf); - if (ret || !S_ISDIR (stbuf.st_mode)) { - if (ret == 0) - errno = 0; +mkdir_p(char *path, mode_t mode, gf_boolean_t allow_symlinks) +{ + int i = 0; + int ret = -1; + char dir[PATH_MAX] = { + 0, + }; + struct stat stbuf = { + 0, + }; + + const int path_len = min(strlen(path), PATH_MAX - 1); + + snprintf(dir, path_len + 1, "%s", path); + + i = (dir[0] == '/') ? 1 : 0; + do { + if (path[i] != '/' && path[i] != '\0') + continue; + + dir[i] = '\0'; + ret = sys_mkdir(dir, mode); + if (ret && errno != EEXIST) { + gf_msg("", GF_LOG_ERROR, errno, LG_MSG_DIR_OP_FAILED, + "Failed due to reason"); + goto out; + } + + if (ret && errno == EEXIST && !allow_symlinks) { + ret = sys_lstat(dir, &stbuf); + if (ret) + goto out; + + if (S_ISLNK(stbuf.st_mode)) { ret = -1; - gf_msg ("", GF_LOG_ERROR, errno, LG_MSG_DIR_OP_FAILED, "Failed" - " to create directory, possibly some of the components" - " were not directories"); + gf_msg("", GF_LOG_ERROR, 0, LG_MSG_DIR_IS_SYMLINK, + "%s is a " + "symlink", + dir); goto out; + } } + dir[i] = '/'; - ret = 0; + } while (path[i++] != '\0'); + + ret = sys_stat(dir, &stbuf); + if (ret || !S_ISDIR(stbuf.st_mode)) { + if (ret == 0) + errno = 0; + ret = -1; + gf_msg("", GF_LOG_ERROR, errno, LG_MSG_DIR_OP_FAILED, + "Failed" + " to create directory, possibly some of the components" + " were not directories"); + goto out; + } + + ret = 0; out: - return ret; + return ret; } int -gf_lstat_dir (const char *path, struct stat *stbuf_in) +gf_lstat_dir(const char *path, struct stat *stbuf_in) { - int ret = -1; - struct stat stbuf = {0,}; + int ret = -1; + struct stat stbuf = { + 0, + }; - if (path == NULL) { - errno = EINVAL; - goto out; - } + if (path == NULL) { + errno = EINVAL; + goto out; + } - ret = sys_lstat (path, &stbuf); - if (ret) - goto out; + ret = sys_lstat(path, &stbuf); + if (ret) + goto out; - if (!S_ISDIR (stbuf.st_mode)) { - errno = ENOTDIR; - ret = -1; - goto out; - } - ret = 0; + if (!S_ISDIR(stbuf.st_mode)) { + errno = ENOTDIR; + ret = -1; + goto out; + } + ret = 0; out: - if (!ret && stbuf_in) - *stbuf_in = stbuf; + if (!ret && stbuf_in) + *stbuf_in = stbuf; - return ret; + return ret; } int -log_base2 (unsigned long x) +log_base2(unsigned long x) { - int val = 0; + int val = 0; - while (x > 1) { - x /= 2; - val++; - } + while (x > 1) { + x /= 2; + val++; + } - return val; + return val; } /** @@ -377,22 +400,23 @@ log_base2 (unsigned long x) * failure: NULL */ char * -gf_rev_dns_lookup (const char *ip) +gf_rev_dns_lookup(const char *ip) { - char *fqdn = NULL; - int ret = 0; + char *fqdn = NULL; + int ret = 0; - GF_VALIDATE_OR_GOTO ("resolver", ip, out); + GF_VALIDATE_OR_GOTO("resolver", ip, out); - /* Get the FQDN */ - ret = gf_get_hostname_from_ip ((char *)ip, &fqdn); - if (ret != 0) { - gf_msg ("resolver", GF_LOG_INFO, errno, - LG_MSG_RESOLVE_HOSTNAME_FAILED, "could not resolve " - "hostname for %s", ip); - } + /* Get the FQDN */ + ret = gf_get_hostname_from_ip((char *)ip, &fqdn); + if (ret != 0) { + gf_msg("resolver", GF_LOG_INFO, errno, LG_MSG_RESOLVE_HOSTNAME_FAILED, + "could not resolve " + "hostname for %s", + ip); + } out: - return fqdn; + return fqdn; } /** @@ -402,144 +426,145 @@ out: * @return: The parent path if found, NULL otherwise */ char * -gf_resolve_path_parent (const char *path) +gf_resolve_path_parent(const char *path) { - char *parent = NULL; - char *tmp = NULL; - char *pathc = NULL; + char *parent = NULL; + char *tmp = NULL; + char *pathc = NULL; - GF_VALIDATE_OR_GOTO (THIS->name, path, out); + GF_VALIDATE_OR_GOTO(THIS->name, path, out); - if (strlen (path) <= 0) { - gf_msg_callingfn (THIS->name, GF_LOG_DEBUG, 0, - LG_MSG_INVALID_STRING, - "invalid string for 'path'"); - goto out; - } + if (strlen(path) <= 0) { + gf_msg_callingfn(THIS->name, GF_LOG_DEBUG, 0, LG_MSG_INVALID_STRING, + "invalid string for 'path'"); + goto out; + } - /* dup the parameter, we don't want to modify it */ - pathc = strdupa (path); - if (!pathc) { - goto out; - } + /* dup the parameter, we don't want to modify it */ + pathc = strdupa(path); + if (!pathc) { + goto out; + } - /* Get the parent directory */ - tmp = dirname (pathc); - if (strcmp (tmp, "/") == 0) - goto out; + /* Get the parent directory */ + tmp = dirname(pathc); + if (strcmp(tmp, "/") == 0) + goto out; - parent = gf_strdup (tmp); + parent = gf_strdup(tmp); out: - return parent; + return parent; } int32_t -gf_resolve_ip6 (const char *hostname, - uint16_t port, - int family, - void **dnscache, - struct addrinfo **addr_info) -{ - int32_t ret = 0; - struct addrinfo hints; - struct dnscache6 *cache = NULL; - char service[NI_MAXSERV], host[NI_MAXHOST]; - - if (!hostname) { - gf_msg_callingfn ("resolver", GF_LOG_WARNING, 0, - LG_MSG_HOSTNAME_NULL, "hostname is NULL"); - return -1; - } +gf_resolve_ip6(const char *hostname, uint16_t port, int family, void **dnscache, + struct addrinfo **addr_info) +{ + int32_t ret = 0; + struct addrinfo hints; + struct dnscache6 *cache = NULL; + char service[NI_MAXSERV], host[NI_MAXHOST]; - if (!*dnscache) { - *dnscache = GF_CALLOC (1, sizeof (struct dnscache6), - gf_common_mt_dnscache6); - if (!*dnscache) - return -1; - } + if (!hostname) { + gf_msg_callingfn("resolver", GF_LOG_WARNING, 0, LG_MSG_HOSTNAME_NULL, + "hostname is NULL"); + return -1; + } + + if (!*dnscache) { + *dnscache = GF_CALLOC(1, sizeof(struct dnscache6), + gf_common_mt_dnscache6); + if (!*dnscache) + return -1; + } + + cache = *dnscache; + if (cache->first && !cache->next) { + freeaddrinfo(cache->first); + cache->first = cache->next = NULL; + gf_msg_trace("resolver", 0, "flushing DNS cache"); + } - cache = *dnscache; - if (cache->first && !cache->next) { - freeaddrinfo(cache->first); - cache->first = cache->next = NULL; - gf_msg_trace ("resolver", 0, "flushing DNS cache"); - } + if (!cache->first) { + char *port_str = NULL; + gf_msg_trace("resolver", 0, + "DNS cache not present, freshly " + "probing hostname: %s", + hostname); + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = family; + hints.ai_socktype = SOCK_STREAM; - if (!cache->first) { - char *port_str = NULL; - gf_msg_trace ("resolver", 0, "DNS cache not present, freshly " - "probing hostname: %s", hostname); - - memset(&hints, 0, sizeof(hints)); - hints.ai_family = family; - hints.ai_socktype = SOCK_STREAM; - - ret = gf_asprintf (&port_str, "%d", port); - if (-1 == ret) { - return -1; - } - if ((ret = getaddrinfo(hostname, port_str, &hints, &cache->first)) != 0) { - gf_msg ("resolver", GF_LOG_ERROR, 0, - LG_MSG_GETADDRINFO_FAILED, "getaddrinfo failed" - " (%s)", gai_strerror (ret)); - - GF_FREE (*dnscache); - *dnscache = NULL; - GF_FREE (port_str); - return -1; - } - GF_FREE (port_str); - - cache->next = cache->first; + ret = gf_asprintf(&port_str, "%d", port); + if (-1 == ret) { + return -1; } + if ((ret = getaddrinfo(hostname, port_str, &hints, &cache->first)) != + 0) { + gf_msg("resolver", GF_LOG_ERROR, 0, LG_MSG_GETADDRINFO_FAILED, + "getaddrinfo failed" + " (%s)", + gai_strerror(ret)); - if (cache->next) { - ret = getnameinfo((struct sockaddr *)cache->next->ai_addr, - cache->next->ai_addrlen, - host, sizeof (host), - service, sizeof (service), - NI_NUMERICHOST); - if (ret != 0) { - gf_msg ("resolver", GF_LOG_ERROR, 0, - LG_MSG_GETNAMEINFO_FAILED, "getnameinfo failed" - " (%s)", gai_strerror (ret)); - goto err; - } - - gf_msg_debug ("resolver", 0, "returning ip-%s (port-%s) for " - "hostname: %s and port: %d", host, service, - hostname, port); - - *addr_info = cache->next; + GF_FREE(*dnscache); + *dnscache = NULL; + GF_FREE(port_str); + return -1; } + GF_FREE(port_str); + + cache->next = cache->first; + } - if (cache->next) - cache->next = cache->next->ai_next; - if (cache->next) { - ret = getnameinfo((struct sockaddr *)cache->next->ai_addr, - cache->next->ai_addrlen, - host, sizeof (host), - service, sizeof (service), - NI_NUMERICHOST); - if (ret != 0) { - gf_msg ("resolver", GF_LOG_ERROR, 0, - LG_MSG_GETNAMEINFO_FAILED, "getnameinfo failed" - " (%s)", gai_strerror (ret)); - goto err; - } - - gf_msg_debug ("resolver", 0, "next DNS query will return: " - "ip-%s port-%s", host, service); + if (cache->next) { + ret = getnameinfo((struct sockaddr *)cache->next->ai_addr, + cache->next->ai_addrlen, host, sizeof(host), service, + sizeof(service), NI_NUMERICHOST); + if (ret != 0) { + gf_msg("resolver", GF_LOG_ERROR, 0, LG_MSG_GETNAMEINFO_FAILED, + "getnameinfo failed" + " (%s)", + gai_strerror(ret)); + goto err; + } + + gf_msg_debug("resolver", 0, + "returning ip-%s (port-%s) for " + "hostname: %s and port: %d", + host, service, hostname, port); + + *addr_info = cache->next; + } + + if (cache->next) + cache->next = cache->next->ai_next; + if (cache->next) { + ret = getnameinfo((struct sockaddr *)cache->next->ai_addr, + cache->next->ai_addrlen, host, sizeof(host), service, + sizeof(service), NI_NUMERICHOST); + if (ret != 0) { + gf_msg("resolver", GF_LOG_ERROR, 0, LG_MSG_GETNAMEINFO_FAILED, + "getnameinfo failed" + " (%s)", + gai_strerror(ret)); + goto err; } - return 0; + gf_msg_debug("resolver", 0, + "next DNS query will return: " + "ip-%s port-%s", + host, service); + } + + return 0; err: - freeaddrinfo (cache->first); - cache->first = cache->next = NULL; - GF_FREE (cache); - *dnscache = NULL; - return -1; + freeaddrinfo(cache->first); + cache->first = cache->next = NULL; + GF_FREE(cache); + *dnscache = NULL; + return -1; } /** @@ -551,16 +576,15 @@ err: * FAILURE: NULL */ struct dnscache * -gf_dnscache_init (time_t ttl) +gf_dnscache_init(time_t ttl) { - struct dnscache *cache = GF_MALLOC (sizeof (*cache), - gf_common_mt_dnscache); - if (cache) { - cache->cache_dict = NULL; - cache->ttl = ttl; - } + struct dnscache *cache = GF_MALLOC(sizeof(*cache), gf_common_mt_dnscache); + if (cache) { + cache->cache_dict = NULL; + cache->ttl = ttl; + } - return cache; + return cache; } /** @@ -570,11 +594,11 @@ gf_dnscache_init (time_t ttl) * FAILURE: NULL */ struct dnscache_entry * -gf_dnscache_entry_init () +gf_dnscache_entry_init() { - struct dnscache_entry *entry = GF_CALLOC (1, sizeof (*entry), - gf_common_mt_dnscache_entry); - return entry; + struct dnscache_entry *entry = GF_CALLOC(1, sizeof(*entry), + gf_common_mt_dnscache_entry); + return entry; } /** @@ -583,11 +607,11 @@ gf_dnscache_entry_init () * @entry: Pointer to deallocate */ void -gf_dnscache_entry_deinit (struct dnscache_entry *entry) +gf_dnscache_entry_deinit(struct dnscache_entry *entry) { - GF_FREE (entry->ip); - GF_FREE (entry->fqdn); - GF_FREE (entry); + GF_FREE(entry->ip); + GF_FREE(entry->fqdn); + GF_FREE(entry); } /** @@ -599,1466 +623,1448 @@ gf_dnscache_entry_deinit (struct dnscache_entry *entry) * failure: NULL */ char * -gf_rev_dns_lookup_cached (const char *ip, struct dnscache *dnscache) +gf_rev_dns_lookup_cached(const char *ip, struct dnscache *dnscache) { - char *fqdn = NULL; - int ret = 0; - dict_t *cache = NULL; - data_t *entrydata = NULL; - struct dnscache_entry *dnsentry = NULL; - gf_boolean_t from_cache = _gf_false; + char *fqdn = NULL; + int ret = 0; + dict_t *cache = NULL; + data_t *entrydata = NULL; + struct dnscache_entry *dnsentry = NULL; + gf_boolean_t from_cache = _gf_false; - if (!dnscache) - goto out; + if (!dnscache) + goto out; + if (!dnscache->cache_dict) { + dnscache->cache_dict = dict_new(); if (!dnscache->cache_dict) { - dnscache->cache_dict = dict_new (); - if (!dnscache->cache_dict) { - goto out; - } - } - cache = dnscache->cache_dict; - - /* Quick cache lookup to see if we already hold it */ - entrydata = dict_get (cache, (char *)ip); - if (entrydata) { - dnsentry = (struct dnscache_entry *)entrydata->data; - /* First check the TTL & timestamp */ - if (time (NULL) - dnsentry->timestamp > dnscache->ttl) { - gf_dnscache_entry_deinit (dnsentry); - entrydata->data = NULL; /* Mark this as 'null' so - * dict_del () doesn't try free - * this after we've already - * freed it. - */ - - dict_del (cache, (char *)ip); /* Remove this entry */ - } else { - /* Cache entry is valid, get the FQDN and return */ - fqdn = dnsentry->fqdn; - from_cache = _gf_true; /* Mark this as from cache */ - goto out; - } + goto out; + } + } + cache = dnscache->cache_dict; + + /* Quick cache lookup to see if we already hold it */ + entrydata = dict_get(cache, (char *)ip); + if (entrydata) { + dnsentry = (struct dnscache_entry *)entrydata->data; + /* First check the TTL & timestamp */ + if (time(NULL) - dnsentry->timestamp > dnscache->ttl) { + gf_dnscache_entry_deinit(dnsentry); + entrydata->data = NULL; /* Mark this as 'null' so + * dict_del () doesn't try free + * this after we've already + * freed it. + */ + + dict_del(cache, (char *)ip); /* Remove this entry */ + } else { + /* Cache entry is valid, get the FQDN and return */ + fqdn = dnsentry->fqdn; + from_cache = _gf_true; /* Mark this as from cache */ + goto out; } + } - /* Get the FQDN */ - ret = gf_get_hostname_from_ip ((char *)ip, &fqdn); - if (ret != 0) - goto out; + /* Get the FQDN */ + ret = gf_get_hostname_from_ip((char *)ip, &fqdn); + if (ret != 0) + goto out; - if (!fqdn) { - gf_log_callingfn ("resolver", GF_LOG_CRITICAL, - "Allocation failed for the host address"); - goto out; - } + if (!fqdn) { + gf_log_callingfn("resolver", GF_LOG_CRITICAL, + "Allocation failed for the host address"); + goto out; + } - from_cache = _gf_false; + from_cache = _gf_false; out: - /* Insert into the cache */ - if (fqdn && !from_cache) { - struct dnscache_entry *entry = gf_dnscache_entry_init (); - - if (!entry) { - goto out; - } - entry->fqdn = fqdn; - if (!ip) { - gf_dnscache_entry_deinit (entry); - goto out; - } - - entry->ip = gf_strdup (ip); - entry->timestamp = time (NULL); - - entrydata = bin_to_data (entry, sizeof (*entry)); - dict_set (cache, (char *)ip, entrydata); + /* Insert into the cache */ + if (fqdn && !from_cache) { + struct dnscache_entry *entry = gf_dnscache_entry_init(); + + if (!entry) { + goto out; } - return fqdn; + entry->fqdn = fqdn; + if (!ip) { + gf_dnscache_entry_deinit(entry); + goto out; + } + + entry->ip = gf_strdup(ip); + entry->timestamp = time(NULL); + + entrydata = bin_to_data(entry, sizeof(*entry)); + dict_set(cache, (char *)ip, entrydata); + } + return fqdn; } struct xldump { - int lineno; + int lineno; }; /* to catch any format discrepencies that may arise in code */ -static int nprintf (struct xldump *dump, const char *fmt, ...) - __attribute__ ((__format__ (__printf__, 2, 3))); static int -nprintf (struct xldump *dump, const char *fmt, ...) +nprintf(struct xldump *dump, const char *fmt, ...) + __attribute__((__format__(__printf__, 2, 3))); +static int +nprintf(struct xldump *dump, const char *fmt, ...) { - va_list ap; - char *msg = NULL; - char header[32]; - int ret = 0; + va_list ap; + char *msg = NULL; + char header[32]; + int ret = 0; - ret = snprintf (header, 32, "%3d:", ++dump->lineno); - if (ret < 0) - goto out; + ret = snprintf(header, 32, "%3d:", ++dump->lineno); + if (ret < 0) + goto out; - va_start (ap, fmt); - ret = vasprintf (&msg, fmt, ap); - va_end (ap); - if (-1 == ret) - goto out; + va_start(ap, fmt); + ret = vasprintf(&msg, fmt, ap); + va_end(ap); + if (-1 == ret) + goto out; - /* NOTE: No ret value from gf_msg_plain, so unable to compute printed - * characters. The return value from nprintf is not used, so for now - * living with it */ - gf_msg_plain (GF_LOG_WARNING, "%s %s", header, msg); + /* NOTE: No ret value from gf_msg_plain, so unable to compute printed + * characters. The return value from nprintf is not used, so for now + * living with it */ + gf_msg_plain(GF_LOG_WARNING, "%s %s", header, msg); out: - FREE (msg); - return 0; + FREE(msg); + return 0; } - static int -xldump_options (dict_t *this, char *key, data_t *value, void *d) +xldump_options(dict_t *this, char *key, data_t *value, void *d) { - nprintf (d, " option %s %s", key, value->data); - return 0; + nprintf(d, " option %s %s", key, value->data); + return 0; } - static void -xldump_subvolumes (xlator_t *this, void *d) +xldump_subvolumes(xlator_t *this, void *d) { - xlator_list_t *subv = NULL; - int len = 0; - char *subvstr = NULL; + xlator_list_t *subv = NULL; + int len = 0; + char *subvstr = NULL; - subv = this->children; - if (!this->children) - return; + subv = this->children; + if (!this->children) + return; - for (subv = this->children; subv; subv = subv->next) - len += (strlen (subv->xlator->name) + 1); + for (subv = this->children; subv; subv = subv->next) + len += (strlen(subv->xlator->name) + 1); - subvstr = GF_MALLOC (len, gf_common_mt_strdup); + subvstr = GF_MALLOC(len, gf_common_mt_strdup); - len = 0; - for (subv = this->children; subv; subv= subv->next) - len += sprintf (subvstr + len, "%s%s", subv->xlator->name, - subv->next ? " " : ""); + len = 0; + for (subv = this->children; subv; subv = subv->next) + len += sprintf(subvstr + len, "%s%s", subv->xlator->name, + subv->next ? " " : ""); - nprintf (d, " subvolumes %s", subvstr); + nprintf(d, " subvolumes %s", subvstr); - GF_FREE (subvstr); + GF_FREE(subvstr); } - static void -xldump (xlator_t *each, void *d) +xldump(xlator_t *each, void *d) { - nprintf (d, "volume %s", each->name); - nprintf (d, " type %s", each->type); - dict_foreach (each->options, xldump_options, d); + nprintf(d, "volume %s", each->name); + nprintf(d, " type %s", each->type); + dict_foreach(each->options, xldump_options, d); - xldump_subvolumes (each, d); + xldump_subvolumes(each, d); - nprintf (d, "end-volume"); - nprintf (d, " "); + nprintf(d, "end-volume"); + nprintf(d, " "); } - void -gf_log_dump_graph (FILE *specfp, glusterfs_graph_t *graph) +gf_log_dump_graph(FILE *specfp, glusterfs_graph_t *graph) { - struct xldump xld = {0, }; + struct xldump xld = { + 0, + }; - gf_msg_plain (GF_LOG_WARNING, "Final graph:"); - gf_msg_plain (GF_LOG_WARNING, - "+---------------------------------------" - "---------------------------------------+"); + gf_msg_plain(GF_LOG_WARNING, "Final graph:"); + gf_msg_plain(GF_LOG_WARNING, + "+---------------------------------------" + "---------------------------------------+"); - xlator_foreach_depth_first (graph->top, xldump, &xld); + xlator_foreach_depth_first(graph->top, xldump, &xld); - gf_msg_plain (GF_LOG_WARNING, - "+---------------------------------------" - "---------------------------------------+"); + gf_msg_plain(GF_LOG_WARNING, + "+---------------------------------------" + "---------------------------------------+"); } static void -gf_dump_config_flags () +gf_dump_config_flags() { - gf_msg_plain_nomem (GF_LOG_ALERT, "configuration details:"); + gf_msg_plain_nomem(GF_LOG_ALERT, "configuration details:"); /* have argp */ #ifdef HAVE_ARGP - gf_msg_plain_nomem (GF_LOG_ALERT, "argp 1"); + gf_msg_plain_nomem(GF_LOG_ALERT, "argp 1"); #endif /* ifdef if found backtrace */ #ifdef HAVE_BACKTRACE - gf_msg_plain_nomem (GF_LOG_ALERT, "backtrace 1"); + gf_msg_plain_nomem(GF_LOG_ALERT, "backtrace 1"); #endif /* Berkeley-DB version has cursor->get() */ #ifdef HAVE_BDB_CURSOR_GET - gf_msg_plain_nomem (GF_LOG_ALERT, "bdb->cursor->get 1"); + gf_msg_plain_nomem(GF_LOG_ALERT, "bdb->cursor->get 1"); #endif /* Define to 1 if you have the <db.h> header file. */ #ifdef HAVE_DB_H - gf_msg_plain_nomem (GF_LOG_ALERT, "db.h 1"); + gf_msg_plain_nomem(GF_LOG_ALERT, "db.h 1"); #endif /* Define to 1 if you have the <dlfcn.h> header file. */ #ifdef HAVE_DLFCN_H - gf_msg_plain_nomem (GF_LOG_ALERT, "dlfcn 1"); + gf_msg_plain_nomem(GF_LOG_ALERT, "dlfcn 1"); #endif /* define if fdatasync exists */ #ifdef HAVE_FDATASYNC - gf_msg_plain_nomem (GF_LOG_ALERT, "fdatasync 1"); + gf_msg_plain_nomem(GF_LOG_ALERT, "fdatasync 1"); #endif /* Define to 1 if you have the `pthread' library (-lpthread). */ #ifdef HAVE_LIBPTHREAD - gf_msg_plain_nomem (GF_LOG_ALERT, "libpthread 1"); + gf_msg_plain_nomem(GF_LOG_ALERT, "libpthread 1"); #endif /* define if llistxattr exists */ #ifdef HAVE_LLISTXATTR - gf_msg_plain_nomem (GF_LOG_ALERT, "llistxattr 1"); + gf_msg_plain_nomem(GF_LOG_ALERT, "llistxattr 1"); #endif /* define if found setfsuid setfsgid */ #ifdef HAVE_SET_FSID - gf_msg_plain_nomem (GF_LOG_ALERT, "setfsid 1"); + gf_msg_plain_nomem(GF_LOG_ALERT, "setfsid 1"); #endif /* define if found spinlock */ #ifdef HAVE_SPINLOCK - gf_msg_plain_nomem (GF_LOG_ALERT, "spinlock 1"); + gf_msg_plain_nomem(GF_LOG_ALERT, "spinlock 1"); #endif /* Define to 1 if you have the <sys/epoll.h> header file. */ #ifdef HAVE_SYS_EPOLL_H - gf_msg_plain_nomem (GF_LOG_ALERT, "epoll.h 1"); + gf_msg_plain_nomem(GF_LOG_ALERT, "epoll.h 1"); #endif /* Define to 1 if you have the <sys/extattr.h> header file. */ #ifdef HAVE_SYS_EXTATTR_H - gf_msg_plain_nomem (GF_LOG_ALERT, "extattr.h 1"); + gf_msg_plain_nomem(GF_LOG_ALERT, "extattr.h 1"); #endif /* Define to 1 if you have the <sys/xattr.h> header file. */ #ifdef HAVE_SYS_XATTR_H - gf_msg_plain_nomem (GF_LOG_ALERT, "xattr.h 1"); + gf_msg_plain_nomem(GF_LOG_ALERT, "xattr.h 1"); #endif /* define if found st_atim.tv_nsec */ #ifdef HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC - gf_msg_plain_nomem (GF_LOG_ALERT, "st_atim.tv_nsec 1"); + gf_msg_plain_nomem(GF_LOG_ALERT, "st_atim.tv_nsec 1"); #endif /* define if found st_atimespec.tv_nsec */ #ifdef HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC - gf_msg_plain_nomem (GF_LOG_ALERT, "st_atimespec.tv_nsec 1"); + gf_msg_plain_nomem(GF_LOG_ALERT, "st_atimespec.tv_nsec 1"); #endif /* Define to the full name and version of this package. */ #ifdef PACKAGE_STRING - { - char *msg = NULL; - int ret = -1; - - ret = gf_asprintf (&msg, "package-string: %s", PACKAGE_STRING); - if (ret >= 0) { - gf_msg_plain_nomem (GF_LOG_ALERT, msg); - GF_FREE (msg); - } + { + char *msg = NULL; + int ret = -1; + + ret = gf_asprintf(&msg, "package-string: %s", PACKAGE_STRING); + if (ret >= 0) { + gf_msg_plain_nomem(GF_LOG_ALERT, msg); + GF_FREE(msg); } + } #endif - return; + return; } /* Obtain a backtrace and print it to the log */ void -gf_print_trace (int32_t signum, glusterfs_ctx_t *ctx) -{ - char msg[1024] = {0,}; - char timestr[64] = {0,}; - call_stack_t *stack = NULL; - - /* Now every gf_log call will just write to a buffer and when the - * buffer becomes full, its written to the log-file. Suppose the process - * crashes and prints the backtrace in the log-file, then the previous - * log information will still be in the buffer itself. So flush the - * contents of the buffer to the log file before printing the backtrace - * which helps in debugging. - */ - gf_log_flush(); - - gf_log_disable_suppression_before_exit (ctx); - - /* Pending frames, (if any), list them in order */ - gf_msg_plain_nomem (GF_LOG_ALERT, "pending frames:"); +gf_print_trace(int32_t signum, glusterfs_ctx_t *ctx) +{ + char msg[1024] = { + 0, + }; + char timestr[64] = { + 0, + }; + call_stack_t *stack = NULL; + + /* Now every gf_log call will just write to a buffer and when the + * buffer becomes full, its written to the log-file. Suppose the process + * crashes and prints the backtrace in the log-file, then the previous + * log information will still be in the buffer itself. So flush the + * contents of the buffer to the log file before printing the backtrace + * which helps in debugging. + */ + gf_log_flush(); + + gf_log_disable_suppression_before_exit(ctx); + + /* Pending frames, (if any), list them in order */ + gf_msg_plain_nomem(GF_LOG_ALERT, "pending frames:"); + { + /* FIXME: traversing stacks outside pool->lock */ + list_for_each_entry(stack, &ctx->pool->all_frames, all_frames) { - /* FIXME: traversing stacks outside pool->lock */ - list_for_each_entry (stack, &ctx->pool->all_frames, - all_frames) { - if (stack->type == GF_OP_TYPE_FOP) - sprintf (msg,"frame : type(%d) op(%s)", - stack->type, - gf_fop_list[stack->op]); - else - sprintf (msg,"frame : type(%d) op(%d)", - stack->type, - stack->op); - - gf_msg_plain_nomem (GF_LOG_ALERT, msg); - } + if (stack->type == GF_OP_TYPE_FOP) + sprintf(msg, "frame : type(%d) op(%s)", stack->type, + gf_fop_list[stack->op]); + else + sprintf(msg, "frame : type(%d) op(%d)", stack->type, stack->op); + + gf_msg_plain_nomem(GF_LOG_ALERT, msg); } + } - sprintf (msg, "patchset: %s", GLUSTERFS_REPOSITORY_REVISION); - gf_msg_plain_nomem (GF_LOG_ALERT, msg); + sprintf(msg, "patchset: %s", GLUSTERFS_REPOSITORY_REVISION); + gf_msg_plain_nomem(GF_LOG_ALERT, msg); - sprintf (msg, "signal received: %d", signum); - gf_msg_plain_nomem (GF_LOG_ALERT, msg); - { - /* Dump the timestamp of the crash too, so the previous logs - can be related */ - gf_time_fmt (timestr, sizeof timestr, time (NULL), - gf_timefmt_FT); - gf_msg_plain_nomem (GF_LOG_ALERT, "time of crash: "); - gf_msg_plain_nomem (GF_LOG_ALERT, timestr); - } + sprintf(msg, "signal received: %d", signum); + gf_msg_plain_nomem(GF_LOG_ALERT, msg); + { + /* Dump the timestamp of the crash too, so the previous logs + can be related */ + gf_time_fmt(timestr, sizeof timestr, time(NULL), gf_timefmt_FT); + gf_msg_plain_nomem(GF_LOG_ALERT, "time of crash: "); + gf_msg_plain_nomem(GF_LOG_ALERT, timestr); + } - gf_dump_config_flags (); - gf_msg_backtrace_nomem (GF_LOG_ALERT, 200); - sprintf (msg, "---------"); - gf_msg_plain_nomem (GF_LOG_ALERT, msg); + gf_dump_config_flags(); + gf_msg_backtrace_nomem(GF_LOG_ALERT, 200); + sprintf(msg, "---------"); + gf_msg_plain_nomem(GF_LOG_ALERT, msg); - /* Send a signal to terminate the process */ - signal (signum, SIG_DFL); - raise (signum); + /* Send a signal to terminate the process */ + signal(signum, SIG_DFL); + raise(signum); } void -trap (void) +trap(void) { - } char * -gf_trim (char *string) +gf_trim(char *string) { - register char *s, *t; + register char *s, *t; - if (string == NULL) { - return NULL; - } + if (string == NULL) { + return NULL; + } - for (s = string; isspace (*s); s++) - ; + for (s = string; isspace(*s); s++) + ; - if (*s == 0) - return s; + if (*s == 0) + return s; - t = s + strlen (s) - 1; - while (t > s && isspace (*t)) - t--; - *++t = '\0'; + t = s + strlen(s) - 1; + while (t > s && isspace(*t)) + t--; + *++t = '\0'; - return s; + return s; } int -gf_strstr (const char *str, const char *delim, const char *match) +gf_strstr(const char *str, const char *delim, const char *match) { - char *tmp = NULL; - char *save_ptr = NULL; - char *tmp_str = NULL; + char *tmp = NULL; + char *save_ptr = NULL; + char *tmp_str = NULL; - int ret = 0; + int ret = 0; - tmp_str = strdup (str); + tmp_str = strdup(str); - if (str == NULL || delim == NULL || match == NULL || tmp_str == NULL) { - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, EINVAL, - LG_MSG_INVALID_ARG, "argument invalid"); - ret = -1; - goto out; - } + if (str == NULL || delim == NULL || match == NULL || tmp_str == NULL) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG, + "argument invalid"); + ret = -1; + goto out; + } + tmp = strtok_r(tmp_str, delim, &save_ptr); - tmp = strtok_r (tmp_str, delim, &save_ptr); + while (tmp) { + ret = strcmp(tmp, match); - while (tmp) { - ret = strcmp (tmp, match); + if (ret == 0) + break; - if (ret == 0) - break; - - tmp = strtok_r (NULL, delim, &save_ptr); - } + tmp = strtok_r(NULL, delim, &save_ptr); + } out: - free (tmp_str); - - return ret; + free(tmp_str); + return ret; } int -gf_volume_name_validate (const char *volume_name) +gf_volume_name_validate(const char *volume_name) { - const char *vname = NULL; + const char *vname = NULL; - if (volume_name == NULL) { - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, EINVAL, - LG_MSG_INVALID_ARG, "argument invalid"); - return -1; - } + if (volume_name == NULL) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG, + "argument invalid"); + return -1; + } - if (!isalpha (volume_name[0])) - return 1; + if (!isalpha(volume_name[0])) + return 1; - for (vname = &volume_name[1]; *vname != '\0'; vname++) { - if (!(isalnum (*vname) || *vname == '_')) - return 1; - } + for (vname = &volume_name[1]; *vname != '\0'; vname++) { + if (!(isalnum(*vname) || *vname == '_')) + return 1; + } - return 0; + return 0; } - int -gf_string2time (const char *str, uint32_t *n) -{ - unsigned long value = 0; - char *tail = NULL; - int old_errno = 0; - const char *s = NULL; - - if (str == NULL || n == NULL) { - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, EINVAL, - LG_MSG_INVALID_ARG, "argument invalid"); - errno = EINVAL; - return -1; - } - - for (s = str; *s != '\0'; s++) { - if (isspace (*s)) - continue; - if (*s == '-') - return -1; - break; - } - - old_errno = errno; - errno = 0; - value = strtol (str, &tail, 0); - if (str == tail) - errno = EINVAL; - - if (errno == ERANGE || errno == EINVAL) - return -1; - - if (errno == 0) - errno = old_errno; - - if (((tail[0] == '\0') || - ((tail[0] == 's') && (tail[1] == '\0')) || - ((tail[0] == 's') && (tail[1] == 'e') && - (tail[2] == 'c') && (tail[3] == '\0')))) - goto out; - - else if (((tail[0] == 'm') && (tail[1] == '\0')) || - ((tail[0] == 'm') && (tail[1] == 'i') && - (tail[2] == 'n') && (tail[3] == '\0'))) { - value = value * GF_MINUTE_IN_SECONDS; - goto out; - } - - else if (((tail[0] == 'h') && (tail[1] == '\0')) || - ((tail[0] == 'h') && (tail[1] == 'r') && - (tail[2] == '\0'))) { - value = value * GF_HOUR_IN_SECONDS; - goto out; - } +gf_string2time(const char *str, uint32_t *n) +{ + unsigned long value = 0; + char *tail = NULL; + int old_errno = 0; + const char *s = NULL; - else if (((tail[0] == 'd') && (tail[1] == '\0')) || - ((tail[0] == 'd') && (tail[1] == 'a') && - (tail[2] == 'y') && (tail[3] == 's') && - (tail[4] == '\0'))) { - value = value * GF_DAY_IN_SECONDS; - goto out; - } + if (str == NULL || n == NULL) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG, + "argument invalid"); + errno = EINVAL; + return -1; + } + + for (s = str; *s != '\0'; s++) { + if (isspace(*s)) + continue; + if (*s == '-') + return -1; + break; + } + + old_errno = errno; + errno = 0; + value = strtol(str, &tail, 0); + if (str == tail) + errno = EINVAL; + + if (errno == ERANGE || errno == EINVAL) + return -1; - else if (((tail[0] == 'w') && (tail[1] == '\0')) || - ((tail[0] == 'w') && (tail[1] == 'k') && - (tail[2] == '\0'))) { - value = value * GF_WEEK_IN_SECONDS; - goto out; - } else { - return -1; - } + if (errno == 0) + errno = old_errno; + + if (((tail[0] == '\0') || ((tail[0] == 's') && (tail[1] == '\0')) || + ((tail[0] == 's') && (tail[1] == 'e') && (tail[2] == 'c') && + (tail[3] == '\0')))) + goto out; + + else if (((tail[0] == 'm') && (tail[1] == '\0')) || + ((tail[0] == 'm') && (tail[1] == 'i') && (tail[2] == 'n') && + (tail[3] == '\0'))) { + value = value * GF_MINUTE_IN_SECONDS; + goto out; + } + + else if (((tail[0] == 'h') && (tail[1] == '\0')) || + ((tail[0] == 'h') && (tail[1] == 'r') && (tail[2] == '\0'))) { + value = value * GF_HOUR_IN_SECONDS; + goto out; + } + + else if (((tail[0] == 'd') && (tail[1] == '\0')) || + ((tail[0] == 'd') && (tail[1] == 'a') && (tail[2] == 'y') && + (tail[3] == 's') && (tail[4] == '\0'))) { + value = value * GF_DAY_IN_SECONDS; + goto out; + } + + else if (((tail[0] == 'w') && (tail[1] == '\0')) || + ((tail[0] == 'w') && (tail[1] == 'k') && (tail[2] == '\0'))) { + value = value * GF_WEEK_IN_SECONDS; + goto out; + } else { + return -1; + } out: - *n = value; + *n = value; - return 0; + return 0; } int -gf_string2percent (const char *str, double *n) -{ - double value = 0; - char *tail = NULL; - int old_errno = 0; - const char *s = NULL; - - if (str == NULL || n == NULL) { - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, EINVAL, - LG_MSG_INVALID_ARG, "argument invalid"); - errno = EINVAL; - return -1; - } - - for (s = str; *s != '\0'; s++) { - if (isspace (*s)) - continue; - if (*s == '-') - return -1; - break; - } - - old_errno = errno; - errno = 0; - value = strtod (str, &tail); - if (str == tail) - errno = EINVAL; +gf_string2percent(const char *str, double *n) +{ + double value = 0; + char *tail = NULL; + int old_errno = 0; + const char *s = NULL; - if (errno == ERANGE || errno == EINVAL) - return -1; + if (str == NULL || n == NULL) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG, + "argument invalid"); + errno = EINVAL; + return -1; + } + + for (s = str; *s != '\0'; s++) { + if (isspace(*s)) + continue; + if (*s == '-') + return -1; + break; + } + + old_errno = errno; + errno = 0; + value = strtod(str, &tail); + if (str == tail) + errno = EINVAL; + + if (errno == ERANGE || errno == EINVAL) + return -1; - if (errno == 0) - errno = old_errno; + if (errno == 0) + errno = old_errno; - if (!((tail[0] == '\0') || - ((tail[0] == '%') && (tail[1] == '\0')))) - return -1; + if (!((tail[0] == '\0') || ((tail[0] == '%') && (tail[1] == '\0')))) + return -1; - *n = value; + *n = value; - return 0; + return 0; } - static int -_gf_string2long (const char *str, long *n, int base) +_gf_string2long(const char *str, long *n, int base) { - long value = 0; - char *tail = NULL; - int old_errno = 0; + long value = 0; + char *tail = NULL; + int old_errno = 0; - if (str == NULL || n == NULL) { - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, EINVAL, - LG_MSG_INVALID_ARG, "argument invalid"); - errno = EINVAL; - return -1; - } + if (str == NULL || n == NULL) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG, + "argument invalid"); + errno = EINVAL; + return -1; + } - old_errno = errno; - errno = 0; - value = strtol (str, &tail, base); - if (str == tail) - errno = EINVAL; + old_errno = errno; + errno = 0; + value = strtol(str, &tail, base); + if (str == tail) + errno = EINVAL; - if (errno == ERANGE || errno == EINVAL) - return -1; + if (errno == ERANGE || errno == EINVAL) + return -1; - if (errno == 0) - errno = old_errno; + if (errno == 0) + errno = old_errno; - if (tail[0] != '\0') - return -1; + if (tail[0] != '\0') + return -1; - *n = value; + *n = value; - return 0; + return 0; } static int -_gf_string2ulong (const char *str, unsigned long *n, int base) -{ - unsigned long value = 0; - char *tail = NULL; - int old_errno = 0; - const char *s = NULL; - - if (str == NULL || n == NULL) { - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, EINVAL, - LG_MSG_INVALID_ARG, "argument invalid"); - errno = EINVAL; - return -1; - } - - for (s = str; *s != '\0'; s++) { - if (isspace (*s)) - continue; - if (*s == '-') - return -1; - break; - } - - old_errno = errno; - errno = 0; - value = strtoul (str, &tail, base); - if (str == tail) - errno = EINVAL; +_gf_string2ulong(const char *str, unsigned long *n, int base) +{ + unsigned long value = 0; + char *tail = NULL; + int old_errno = 0; + const char *s = NULL; - if (errno == ERANGE || errno == EINVAL) - return -1; + if (str == NULL || n == NULL) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG, + "argument invalid"); + errno = EINVAL; + return -1; + } + + for (s = str; *s != '\0'; s++) { + if (isspace(*s)) + continue; + if (*s == '-') + return -1; + break; + } + + old_errno = errno; + errno = 0; + value = strtoul(str, &tail, base); + if (str == tail) + errno = EINVAL; + + if (errno == ERANGE || errno == EINVAL) + return -1; - if (errno == 0) - errno = old_errno; + if (errno == 0) + errno = old_errno; - if (tail[0] != '\0') - return -1; + if (tail[0] != '\0') + return -1; - *n = value; + *n = value; - return 0; + return 0; } static int -_gf_string2uint (const char *str, unsigned int *n, int base) -{ - unsigned long value = 0; - char *tail = NULL; - int old_errno = 0; - const char *s = NULL; - - if (str == NULL || n == NULL) { - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, EINVAL, - LG_MSG_INVALID_ARG, "argument invalid"); - errno = EINVAL; - return -1; - } - - for (s = str; *s != '\0'; s++) { - if (isspace (*s)) - continue; - if (*s == '-') - return -1; - break; - } - - old_errno = errno; - errno = 0; - value = strtoul (str, &tail, base); - if (str == tail) - errno = EINVAL; +_gf_string2uint(const char *str, unsigned int *n, int base) +{ + unsigned long value = 0; + char *tail = NULL; + int old_errno = 0; + const char *s = NULL; - if (errno == ERANGE || errno == EINVAL) - return -1; + if (str == NULL || n == NULL) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG, + "argument invalid"); + errno = EINVAL; + return -1; + } + + for (s = str; *s != '\0'; s++) { + if (isspace(*s)) + continue; + if (*s == '-') + return -1; + break; + } + + old_errno = errno; + errno = 0; + value = strtoul(str, &tail, base); + if (str == tail) + errno = EINVAL; + + if (errno == ERANGE || errno == EINVAL) + return -1; - if (errno == 0) - errno = old_errno; + if (errno == 0) + errno = old_errno; - if (tail[0] != '\0') - return -1; + if (tail[0] != '\0') + return -1; - *n = (unsigned int)value; + *n = (unsigned int)value; - return 0; + return 0; } static int -_gf_string2double (const char *str, double *n) +_gf_string2double(const char *str, double *n) { - double value = 0.0; - char *tail = NULL; - int old_errno = 0; + double value = 0.0; + char *tail = NULL; + int old_errno = 0; - if (str == NULL || n == NULL) { - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, EINVAL, - LG_MSG_INVALID_ARG, "argument invalid"); - errno = EINVAL; - return -1; - } + if (str == NULL || n == NULL) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG, + "argument invalid"); + errno = EINVAL; + return -1; + } - old_errno = errno; - errno = 0; - value = strtod (str, &tail); - if (str == tail) - errno = EINVAL; + old_errno = errno; + errno = 0; + value = strtod(str, &tail); + if (str == tail) + errno = EINVAL; - if (errno == ERANGE || errno == EINVAL) - return -1; + if (errno == ERANGE || errno == EINVAL) + return -1; - if (errno == 0) - errno = old_errno; + if (errno == 0) + errno = old_errno; - if (tail[0] != '\0') - return -1; + if (tail[0] != '\0') + return -1; - *n = value; + *n = value; - return 0; + return 0; } static int -_gf_string2longlong (const char *str, long long *n, int base) +_gf_string2longlong(const char *str, long long *n, int base) { - long long value = 0; - char *tail = NULL; - int old_errno = 0; + long long value = 0; + char *tail = NULL; + int old_errno = 0; - if (str == NULL || n == NULL) { - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, EINVAL, - LG_MSG_INVALID_ARG, "argument invalid"); - errno = EINVAL; - return -1; - } + if (str == NULL || n == NULL) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG, + "argument invalid"); + errno = EINVAL; + return -1; + } - old_errno = errno; - errno = 0; - value = strtoll (str, &tail, base); - if (str == tail) - errno = EINVAL; + old_errno = errno; + errno = 0; + value = strtoll(str, &tail, base); + if (str == tail) + errno = EINVAL; - if (errno == ERANGE || errno == EINVAL) - return -1; + if (errno == ERANGE || errno == EINVAL) + return -1; - if (errno == 0) - errno = old_errno; + if (errno == 0) + errno = old_errno; - if (tail[0] != '\0') - return -1; + if (tail[0] != '\0') + return -1; - *n = value; + *n = value; - return 0; + return 0; } static int -_gf_string2ulonglong (const char *str, unsigned long long *n, int base) -{ - unsigned long long value = 0; - char *tail = NULL; - int old_errno = 0; - const char *s = NULL; - - if (str == NULL || n == NULL) { - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, EINVAL, - LG_MSG_INVALID_ARG, "argument invalid"); - errno = EINVAL; - return -1; - } - - for (s = str; *s != '\0'; s++) { - if (isspace (*s)) - continue; - if (*s == '-') - return -1; - break; - } - - old_errno = errno; - errno = 0; - value = strtoull (str, &tail, base); - if (str == tail) - errno = EINVAL; +_gf_string2ulonglong(const char *str, unsigned long long *n, int base) +{ + unsigned long long value = 0; + char *tail = NULL; + int old_errno = 0; + const char *s = NULL; - if (errno == ERANGE || errno == EINVAL) - return -1; + if (str == NULL || n == NULL) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG, + "argument invalid"); + errno = EINVAL; + return -1; + } + + for (s = str; *s != '\0'; s++) { + if (isspace(*s)) + continue; + if (*s == '-') + return -1; + break; + } + + old_errno = errno; + errno = 0; + value = strtoull(str, &tail, base); + if (str == tail) + errno = EINVAL; + + if (errno == ERANGE || errno == EINVAL) + return -1; - if (errno == 0) - errno = old_errno; + if (errno == 0) + errno = old_errno; - if (tail[0] != '\0') - return -1; + if (tail[0] != '\0') + return -1; - *n = value; + *n = value; - return 0; + return 0; } int -gf_string2long (const char *str, long *n) +gf_string2long(const char *str, long *n) { - return _gf_string2long (str, n, 0); + return _gf_string2long(str, n, 0); } int -gf_string2ulong (const char *str, unsigned long *n) +gf_string2ulong(const char *str, unsigned long *n) { - return _gf_string2ulong (str, n, 0); + return _gf_string2ulong(str, n, 0); } int -gf_string2int (const char *str, int *n) +gf_string2int(const char *str, int *n) { - long l = 0; - int ret = 0; + long l = 0; + int ret = 0; - ret = _gf_string2long (str, &l, 0); + ret = _gf_string2long(str, &l, 0); - *n = l; - return ret; + *n = l; + return ret; } int -gf_string2uint (const char *str, unsigned int *n) +gf_string2uint(const char *str, unsigned int *n) { - return _gf_string2uint (str, n, 0); + return _gf_string2uint(str, n, 0); } int -gf_string2double (const char *str, double *n) +gf_string2double(const char *str, double *n) { - return _gf_string2double (str, n); + return _gf_string2double(str, n); } int -gf_string2longlong (const char *str, long long *n) +gf_string2longlong(const char *str, long long *n) { - return _gf_string2longlong (str, n, 0); + return _gf_string2longlong(str, n, 0); } int -gf_string2ulonglong (const char *str, unsigned long long *n) +gf_string2ulonglong(const char *str, unsigned long long *n) { - return _gf_string2ulonglong (str, n, 0); + return _gf_string2ulonglong(str, n, 0); } int -gf_string2int8 (const char *str, int8_t *n) +gf_string2int8(const char *str, int8_t *n) { - long l = 0L; - int rv = 0; + long l = 0L; + int rv = 0; - rv = _gf_string2long (str, &l, 0); - if (rv != 0) - return rv; + rv = _gf_string2long(str, &l, 0); + if (rv != 0) + return rv; - if ((l >= INT8_MIN) && (l <= INT8_MAX)) { - *n = (int8_t) l; - return 0; - } + if ((l >= INT8_MIN) && (l <= INT8_MAX)) { + *n = (int8_t)l; + return 0; + } - errno = ERANGE; - return -1; + errno = ERANGE; + return -1; } int -gf_string2int16 (const char *str, int16_t *n) +gf_string2int16(const char *str, int16_t *n) { - long l = 0L; - int rv = 0; + long l = 0L; + int rv = 0; - rv = _gf_string2long (str, &l, 0); - if (rv != 0) - return rv; + rv = _gf_string2long(str, &l, 0); + if (rv != 0) + return rv; - if ((l >= INT16_MIN) && (l <= INT16_MAX)) { - *n = (int16_t) l; - return 0; - } + if ((l >= INT16_MIN) && (l <= INT16_MAX)) { + *n = (int16_t)l; + return 0; + } - errno = ERANGE; - return -1; + errno = ERANGE; + return -1; } int -gf_string2int32 (const char *str, int32_t *n) +gf_string2int32(const char *str, int32_t *n) { - long l = 0L; - int rv = 0; + long l = 0L; + int rv = 0; - rv = _gf_string2long (str, &l, 0); - if (rv != 0) - return rv; + rv = _gf_string2long(str, &l, 0); + if (rv != 0) + return rv; - if ((l >= INT32_MIN) && (l <= INT32_MAX)) { - *n = (int32_t) l; - return 0; - } + if ((l >= INT32_MIN) && (l <= INT32_MAX)) { + *n = (int32_t)l; + return 0; + } - errno = ERANGE; - return -1; + errno = ERANGE; + return -1; } int -gf_string2int64 (const char *str, int64_t *n) +gf_string2int64(const char *str, int64_t *n) { - long long l = 0LL; - int rv = 0; + long long l = 0LL; + int rv = 0; - rv = _gf_string2longlong (str, &l, 0); - if (rv != 0) - return rv; + rv = _gf_string2longlong(str, &l, 0); + if (rv != 0) + return rv; - *n = (int64_t) l; - return 0; + *n = (int64_t)l; + return 0; } int -gf_string2uint8 (const char *str, uint8_t *n) +gf_string2uint8(const char *str, uint8_t *n) { - unsigned long l = 0L; - int rv = 0; + unsigned long l = 0L; + int rv = 0; - rv = _gf_string2ulong (str, &l, 0); - if (rv != 0) - return rv; + rv = _gf_string2ulong(str, &l, 0); + if (rv != 0) + return rv; - if (l <= UINT8_MAX) { - *n = (uint8_t) l; - return 0; - } + if (l <= UINT8_MAX) { + *n = (uint8_t)l; + return 0; + } - errno = ERANGE; - return -1; + errno = ERANGE; + return -1; } int -gf_string2uint16 (const char *str, uint16_t *n) +gf_string2uint16(const char *str, uint16_t *n) { - unsigned long l = 0L; - int rv = 0; + unsigned long l = 0L; + int rv = 0; - rv = _gf_string2ulong (str, &l, 0); - if (rv != 0) - return rv; + rv = _gf_string2ulong(str, &l, 0); + if (rv != 0) + return rv; - if (l <= UINT16_MAX) { - *n = (uint16_t) l; - return 0; - } + if (l <= UINT16_MAX) { + *n = (uint16_t)l; + return 0; + } - errno = ERANGE; - return -1; + errno = ERANGE; + return -1; } int -gf_string2uint32 (const char *str, uint32_t *n) +gf_string2uint32(const char *str, uint32_t *n) { - unsigned long l = 0L; - int rv = 0; + unsigned long l = 0L; + int rv = 0; - rv = _gf_string2ulong (str, &l, 0); - if (rv != 0) - return rv; + rv = _gf_string2ulong(str, &l, 0); + if (rv != 0) + return rv; - if (l <= UINT32_MAX) { - *n = (uint32_t) l; - return 0; - } + if (l <= UINT32_MAX) { + *n = (uint32_t)l; + return 0; + } - errno = ERANGE; - return -1; + errno = ERANGE; + return -1; } int -gf_string2uint64 (const char *str, uint64_t *n) +gf_string2uint64(const char *str, uint64_t *n) { - unsigned long long l = 0ULL; - int rv = 0; + unsigned long long l = 0ULL; + int rv = 0; - rv = _gf_string2ulonglong (str, &l, 0); - if (rv != 0) - return rv; + rv = _gf_string2ulonglong(str, &l, 0); + if (rv != 0) + return rv; - if (l <= UINT64_MAX) { - *n = (uint64_t) l; - return 0; - } + if (l <= UINT64_MAX) { + *n = (uint64_t)l; + return 0; + } - errno = ERANGE; - return -1; + errno = ERANGE; + return -1; } int -gf_string2ulong_base10 (const char *str, unsigned long *n) +gf_string2ulong_base10(const char *str, unsigned long *n) { - return _gf_string2ulong (str, n, 10); + return _gf_string2ulong(str, n, 10); } int -gf_string2uint_base10 (const char *str, unsigned int *n) +gf_string2uint_base10(const char *str, unsigned int *n) { - return _gf_string2uint (str, n, 10); + return _gf_string2uint(str, n, 10); } int -gf_string2uint8_base10 (const char *str, uint8_t *n) +gf_string2uint8_base10(const char *str, uint8_t *n) { - unsigned long l = 0L; - int rv = 0; + unsigned long l = 0L; + int rv = 0; - rv = _gf_string2ulong (str, &l, 10); - if (rv != 0) - return rv; + rv = _gf_string2ulong(str, &l, 10); + if (rv != 0) + return rv; - if (l <= UINT8_MAX) { - *n = (uint8_t) l; - return 0; - } + if (l <= UINT8_MAX) { + *n = (uint8_t)l; + return 0; + } - errno = ERANGE; - return -1; + errno = ERANGE; + return -1; } int -gf_string2uint16_base10 (const char *str, uint16_t *n) +gf_string2uint16_base10(const char *str, uint16_t *n) { - unsigned long l = 0L; - int rv = 0; + unsigned long l = 0L; + int rv = 0; - rv = _gf_string2ulong (str, &l, 10); - if (rv != 0) - return rv; + rv = _gf_string2ulong(str, &l, 10); + if (rv != 0) + return rv; - if (l <= UINT16_MAX) { - *n = (uint16_t) l; - return 0; - } + if (l <= UINT16_MAX) { + *n = (uint16_t)l; + return 0; + } - errno = ERANGE; - return -1; + errno = ERANGE; + return -1; } int -gf_string2uint32_base10 (const char *str, uint32_t *n) +gf_string2uint32_base10(const char *str, uint32_t *n) { - unsigned long l = 0L; - int rv = 0; + unsigned long l = 0L; + int rv = 0; - rv = _gf_string2ulong (str, &l, 10); - if (rv != 0) - return rv; + rv = _gf_string2ulong(str, &l, 10); + if (rv != 0) + return rv; - if (l <= UINT32_MAX) { - *n = (uint32_t) l; - return 0; - } + if (l <= UINT32_MAX) { + *n = (uint32_t)l; + return 0; + } - errno = ERANGE; - return -1; + errno = ERANGE; + return -1; } int -gf_string2uint64_base10 (const char *str, uint64_t *n) +gf_string2uint64_base10(const char *str, uint64_t *n) { - unsigned long long l = 0ULL; - int rv = 0; + unsigned long long l = 0ULL; + int rv = 0; - rv = _gf_string2ulonglong (str, &l, 10); - if (rv != 0) - return rv; + rv = _gf_string2ulonglong(str, &l, 10); + if (rv != 0) + return rv; - if (l <= UINT64_MAX) { - *n = (uint64_t) l; - return 0; - } + if (l <= UINT64_MAX) { + *n = (uint64_t)l; + return 0; + } - errno = ERANGE; - return -1; + errno = ERANGE; + return -1; } char * -gf_uint64_2human_readable (uint64_t n) -{ - int ret = 0; - char *str = NULL; - - if (n >= GF_UNIT_PB) { - ret = gf_asprintf (&str, "%.1lfPB", ((double) n)/GF_UNIT_PB); - if (ret < 0) - goto err; - } else if (n >= GF_UNIT_TB) { - ret = gf_asprintf (&str, "%.1lfTB", ((double) n)/GF_UNIT_TB); - if (ret < 0) - goto err; - } else if (n >= GF_UNIT_GB) { - ret = gf_asprintf (&str, "%.1lfGB", ((double) n)/GF_UNIT_GB); - if (ret < 0) - goto err; - } else if (n >= GF_UNIT_MB) { - ret = gf_asprintf (&str, "%.1lfMB", ((double) n)/GF_UNIT_MB); - if (ret < 0) - goto err; - } else if (n >= GF_UNIT_KB) { - ret = gf_asprintf (&str, "%.1lfKB", ((double) n)/GF_UNIT_KB); - if (ret < 0) - goto err; - } else { - ret = gf_asprintf (&str, "%luBytes", n); - if (ret < 0) - goto err; - } - return str; +gf_uint64_2human_readable(uint64_t n) +{ + int ret = 0; + char *str = NULL; + + if (n >= GF_UNIT_PB) { + ret = gf_asprintf(&str, "%.1lfPB", ((double)n) / GF_UNIT_PB); + if (ret < 0) + goto err; + } else if (n >= GF_UNIT_TB) { + ret = gf_asprintf(&str, "%.1lfTB", ((double)n) / GF_UNIT_TB); + if (ret < 0) + goto err; + } else if (n >= GF_UNIT_GB) { + ret = gf_asprintf(&str, "%.1lfGB", ((double)n) / GF_UNIT_GB); + if (ret < 0) + goto err; + } else if (n >= GF_UNIT_MB) { + ret = gf_asprintf(&str, "%.1lfMB", ((double)n) / GF_UNIT_MB); + if (ret < 0) + goto err; + } else if (n >= GF_UNIT_KB) { + ret = gf_asprintf(&str, "%.1lfKB", ((double)n) / GF_UNIT_KB); + if (ret < 0) + goto err; + } else { + ret = gf_asprintf(&str, "%luBytes", n); + if (ret < 0) + goto err; + } + return str; err: - return NULL; + return NULL; } int -gf_string2bytesize_range (const char *str, uint64_t *n, uint64_t umax) -{ - double value = 0.0; - int64_t int_value = 0; - uint64_t unit = 0; - int64_t max = 0; - char *tail = NULL; - int old_errno = 0; - const char *s = NULL; - gf_boolean_t fraction = _gf_false; - - if (str == NULL || n == NULL) { - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, EINVAL, - LG_MSG_INVALID_ARG, "argument invalid"); - errno = EINVAL; - return -1; - } +gf_string2bytesize_range(const char *str, uint64_t *n, uint64_t umax) +{ + double value = 0.0; + int64_t int_value = 0; + uint64_t unit = 0; + int64_t max = 0; + char *tail = NULL; + int old_errno = 0; + const char *s = NULL; + gf_boolean_t fraction = _gf_false; + + if (str == NULL || n == NULL) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG, + "argument invalid"); + errno = EINVAL; + return -1; + } - max = umax & 0x7fffffffffffffffLL; + max = umax & 0x7fffffffffffffffLL; - for (s = str; *s != '\0'; s++) { - if (isspace (*s)) - continue; - if (*s == '-') - return -1; - break; - } + for (s = str; *s != '\0'; s++) { + if (isspace(*s)) + continue; + if (*s == '-') + return -1; + break; + } - if (strrchr (str, '.')) - fraction = _gf_true; + if (strrchr(str, '.')) + fraction = _gf_true; - old_errno = errno; - errno = 0; - if (fraction) - value = strtod (str, &tail); - else - int_value = strtoll (str, &tail, 10); + old_errno = errno; + errno = 0; + if (fraction) + value = strtod(str, &tail); + else + int_value = strtoll(str, &tail, 10); - if (str == tail) - errno = EINVAL; + if (str == tail) + errno = EINVAL; - if (errno == ERANGE || errno == EINVAL) - return -1; + if (errno == ERANGE || errno == EINVAL) + return -1; - if (errno == 0) - errno = old_errno; + if (errno == 0) + errno = old_errno; - if (tail[0] != '\0') - { - if (strcasecmp (tail, GF_UNIT_KB_STRING) == 0) - unit = GF_UNIT_KB; - else if (strcasecmp (tail, GF_UNIT_MB_STRING) == 0) - unit = GF_UNIT_MB; - else if (strcasecmp (tail, GF_UNIT_GB_STRING) == 0) - unit = GF_UNIT_GB; - else if (strcasecmp (tail, GF_UNIT_TB_STRING) == 0) - unit = GF_UNIT_TB; - else if (strcasecmp (tail, GF_UNIT_PB_STRING) == 0) - unit = GF_UNIT_PB; - else if (strcasecmp (tail, GF_UNIT_B_STRING) != 0) - return -1; - - if (unit > 0) { - if (fraction) - value *= unit; - else - int_value *= unit; - } + if (tail[0] != '\0') { + if (strcasecmp(tail, GF_UNIT_KB_STRING) == 0) + unit = GF_UNIT_KB; + else if (strcasecmp(tail, GF_UNIT_MB_STRING) == 0) + unit = GF_UNIT_MB; + else if (strcasecmp(tail, GF_UNIT_GB_STRING) == 0) + unit = GF_UNIT_GB; + else if (strcasecmp(tail, GF_UNIT_TB_STRING) == 0) + unit = GF_UNIT_TB; + else if (strcasecmp(tail, GF_UNIT_PB_STRING) == 0) + unit = GF_UNIT_PB; + else if (strcasecmp(tail, GF_UNIT_B_STRING) != 0) + return -1; + + if (unit > 0) { + if (fraction) + value *= unit; + else + int_value *= unit; } + } - if (fraction) { - if ((max - value) < 0) { - errno = ERANGE; - return -1; - } - *n = (uint64_t) value; - } else { - if ((max - int_value) < 0) { - errno = ERANGE; - return -1; - } - *n = int_value; + if (fraction) { + if ((max - value) < 0) { + errno = ERANGE; + return -1; + } + *n = (uint64_t)value; + } else { + if ((max - int_value) < 0) { + errno = ERANGE; + return -1; } + *n = int_value; + } - return 0; + return 0; } int -gf_string2bytesize_size (const char *str, size_t *n) +gf_string2bytesize_size(const char *str, size_t *n) { - uint64_t u64; - size_t max = (size_t) - 1; - int val = gf_string2bytesize_range (str, &u64, max); - *n = (size_t) u64; - return val; + uint64_t u64; + size_t max = (size_t)-1; + int val = gf_string2bytesize_range(str, &u64, max); + *n = (size_t)u64; + return val; } int -gf_string2bytesize (const char *str, uint64_t *n) +gf_string2bytesize(const char *str, uint64_t *n) { - return gf_string2bytesize_range(str, n, UINT64_MAX); + return gf_string2bytesize_range(str, n, UINT64_MAX); } int -gf_string2bytesize_uint64 (const char *str, uint64_t *n) +gf_string2bytesize_uint64(const char *str, uint64_t *n) { - return gf_string2bytesize_range(str, n, UINT64_MAX); + return gf_string2bytesize_range(str, n, UINT64_MAX); } int -gf_string2bytesize_int64 (const char *str, int64_t *n) +gf_string2bytesize_int64(const char *str, int64_t *n) { - uint64_t u64 = 0; - int ret = 0; + uint64_t u64 = 0; + int ret = 0; - ret = gf_string2bytesize_range(str, &u64, INT64_MAX); - *n = (int64_t) u64; - return ret; + ret = gf_string2bytesize_range(str, &u64, INT64_MAX); + *n = (int64_t)u64; + return ret; } int -gf_string2percent_or_bytesize (const char *str, double *n, - gf_boolean_t *is_percent) -{ - double value = 0ULL; - char *tail = NULL; - int old_errno = 0; - const char *s = NULL; - - if (str == NULL || n == NULL) { - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, EINVAL, - LG_MSG_INVALID_ARG, "argument invalid"); - errno = EINVAL; - return -1; - } - - for (s = str; *s != '\0'; s++) { - if (isspace (*s)) - continue; - if (*s == '-') - return -1; - break; - } +gf_string2percent_or_bytesize(const char *str, double *n, + gf_boolean_t *is_percent) +{ + double value = 0ULL; + char *tail = NULL; + int old_errno = 0; + const char *s = NULL; + + if (str == NULL || n == NULL) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG, + "argument invalid"); + errno = EINVAL; + return -1; + } + + for (s = str; *s != '\0'; s++) { + if (isspace(*s)) + continue; + if (*s == '-') + return -1; + break; + } + + old_errno = errno; + errno = 0; + value = strtod(str, &tail); + if (str == tail) + errno = EINVAL; + + if (errno == ERANGE || errno == EINVAL) + return -1; - old_errno = errno; - errno = 0; - value = strtod (str, &tail); - if (str == tail) - errno = EINVAL; - - if (errno == ERANGE || errno == EINVAL) - return -1; - - if (errno == 0) - errno = old_errno; - - /*Maximum accepted value for 64 bit OS will be (2^14 -1)PB*/ - if (tail[0] != '\0') { - if (strcasecmp (tail, GF_UNIT_KB_STRING) == 0) - value *= GF_UNIT_KB; - else if (strcasecmp (tail, GF_UNIT_MB_STRING) == 0) - value *= GF_UNIT_MB; - else if (strcasecmp (tail, GF_UNIT_GB_STRING) == 0) - value *= GF_UNIT_GB; - else if (strcasecmp (tail, GF_UNIT_TB_STRING) == 0) - value *= GF_UNIT_TB; - else if (strcasecmp (tail, GF_UNIT_PB_STRING) == 0) - value *= GF_UNIT_PB; - else if (strcasecmp (tail, GF_UNIT_PERCENT_STRING) == 0) - *is_percent = _gf_true; - else - return -1; - } + if (errno == 0) + errno = old_errno; + + /*Maximum accepted value for 64 bit OS will be (2^14 -1)PB*/ + if (tail[0] != '\0') { + if (strcasecmp(tail, GF_UNIT_KB_STRING) == 0) + value *= GF_UNIT_KB; + else if (strcasecmp(tail, GF_UNIT_MB_STRING) == 0) + value *= GF_UNIT_MB; + else if (strcasecmp(tail, GF_UNIT_GB_STRING) == 0) + value *= GF_UNIT_GB; + else if (strcasecmp(tail, GF_UNIT_TB_STRING) == 0) + value *= GF_UNIT_TB; + else if (strcasecmp(tail, GF_UNIT_PB_STRING) == 0) + value *= GF_UNIT_PB; + else if (strcasecmp(tail, GF_UNIT_PERCENT_STRING) == 0) + *is_percent = _gf_true; + else + return -1; + } - /* Error out if we cannot store the value in uint64 */ - if ((UINT64_MAX - value) < 0) { - errno = ERANGE; - return -1; - } + /* Error out if we cannot store the value in uint64 */ + if ((UINT64_MAX - value) < 0) { + errno = ERANGE; + return -1; + } - *n = value; + *n = value; - return 0; + return 0; } int64_t -gf_str_to_long_long (const char *number) -{ - int64_t unit = 1; - int64_t ret = 0; - char *endptr = NULL ; - if (!number) - return 0; - - ret = strtoll (number, &endptr, 0); - - if (endptr) { - switch (*endptr) { - case 'G': - case 'g': - if ((* (endptr + 1) == 'B') ||(* (endptr + 1) == 'b')) - unit = 1024 * 1024 * 1024; - break; - case 'M': - case 'm': - if ((* (endptr + 1) == 'B') ||(* (endptr + 1) == 'b')) - unit = 1024 * 1024; - break; - case 'K': - case 'k': - if ((* (endptr + 1) == 'B') ||(* (endptr + 1) == 'b')) - unit = 1024; - break; - case '%': - unit = 1; - break; - default: - unit = 1; - break; - } +gf_str_to_long_long(const char *number) +{ + int64_t unit = 1; + int64_t ret = 0; + char *endptr = NULL; + if (!number) + return 0; + + ret = strtoll(number, &endptr, 0); + + if (endptr) { + switch (*endptr) { + case 'G': + case 'g': + if ((*(endptr + 1) == 'B') || (*(endptr + 1) == 'b')) + unit = 1024 * 1024 * 1024; + break; + case 'M': + case 'm': + if ((*(endptr + 1) == 'B') || (*(endptr + 1) == 'b')) + unit = 1024 * 1024; + break; + case 'K': + case 'k': + if ((*(endptr + 1) == 'B') || (*(endptr + 1) == 'b')) + unit = 1024; + break; + case '%': + unit = 1; + break; + default: + unit = 1; + break; } - return ret * unit; + } + return ret * unit; } int -gf_string2boolean (const char *str, gf_boolean_t *b) +gf_string2boolean(const char *str, gf_boolean_t *b) { - if (str == NULL) { - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, EINVAL, - LG_MSG_INVALID_ARG, "argument invalid"); - return -1; - } + if (str == NULL) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG, + "argument invalid"); + return -1; + } - if ((strcasecmp (str, "1") == 0) || - (strcasecmp (str, "on") == 0) || - (strcasecmp (str, "yes") == 0) || - (strcasecmp (str, "true") == 0) || - (strcasecmp (str, "enable") == 0)) { - *b = _gf_true; - return 0; - } + if ((strcasecmp(str, "1") == 0) || (strcasecmp(str, "on") == 0) || + (strcasecmp(str, "yes") == 0) || (strcasecmp(str, "true") == 0) || + (strcasecmp(str, "enable") == 0)) { + *b = _gf_true; + return 0; + } - if ((strcasecmp (str, "0") == 0) || - (strcasecmp (str, "off") == 0) || - (strcasecmp (str, "no") == 0) || - (strcasecmp (str, "false") == 0) || - (strcasecmp (str, "disable") == 0)) { - *b = _gf_false; - return 0; - } + if ((strcasecmp(str, "0") == 0) || (strcasecmp(str, "off") == 0) || + (strcasecmp(str, "no") == 0) || (strcasecmp(str, "false") == 0) || + (strcasecmp(str, "disable") == 0)) { + *b = _gf_false; + return 0; + } - return -1; + return -1; } - int -gf_lockfd (int fd) +gf_lockfd(int fd) { - struct gf_flock fl; + struct gf_flock fl; - fl.l_type = F_WRLCK; - fl.l_whence = SEEK_SET; - fl.l_start = 0; - fl.l_len = 0; + fl.l_type = F_WRLCK; + fl.l_whence = SEEK_SET; + fl.l_start = 0; + fl.l_len = 0; - return fcntl (fd, F_SETLK, &fl); + return fcntl(fd, F_SETLK, &fl); } - int -gf_unlockfd (int fd) +gf_unlockfd(int fd) { - struct gf_flock fl; + struct gf_flock fl; - fl.l_type = F_UNLCK; - fl.l_whence = SEEK_SET; - fl.l_start = 0; - fl.l_len = 0; + fl.l_type = F_UNLCK; + fl.l_whence = SEEK_SET; + fl.l_start = 0; + fl.l_len = 0; - return fcntl (fd, F_SETLK, &fl); + return fcntl(fd, F_SETLK, &fl); } static void -compute_checksum (char *buf, size_t size, uint32_t *checksum) +compute_checksum(char *buf, size_t size, uint32_t *checksum) { - int ret = -1; - char *checksum_buf = NULL; + int ret = -1; + char *checksum_buf = NULL; - checksum_buf = (char *)(checksum); + checksum_buf = (char *)(checksum); - if (!(*checksum)) { - checksum_buf [0] = 0xba; - checksum_buf [1] = 0xbe; - checksum_buf [2] = 0xb0; - checksum_buf [3] = 0x0b; - } + if (!(*checksum)) { + checksum_buf[0] = 0xba; + checksum_buf[1] = 0xbe; + checksum_buf[2] = 0xb0; + checksum_buf[3] = 0x0b; + } - for (ret = 0; ret < (size - 4); ret += 4) { - checksum_buf[0] ^= (buf[ret]); - checksum_buf[1] ^= (buf[ret + 1] << 1) ; - checksum_buf[2] ^= (buf[ret + 2] << 2); - checksum_buf[3] ^= (buf[ret + 3] << 3); - } + for (ret = 0; ret < (size - 4); ret += 4) { + checksum_buf[0] ^= (buf[ret]); + checksum_buf[1] ^= (buf[ret + 1] << 1); + checksum_buf[2] ^= (buf[ret + 2] << 2); + checksum_buf[3] ^= (buf[ret + 3] << 3); + } - for (ret = 0; ret <= (size % 4); ret++) { - checksum_buf[ret] ^= (buf[(size - 4) + ret] << ret); - } + for (ret = 0; ret <= (size % 4); ret++) { + checksum_buf[ret] ^= (buf[(size - 4) + ret] << ret); + } - return; + return; } #define GF_CHECKSUM_BUF_SIZE 1024 int -get_checksum_for_file (int fd, uint32_t *checksum) +get_checksum_for_file(int fd, uint32_t *checksum) { - int ret = -1; - char buf[GF_CHECKSUM_BUF_SIZE] = {0,}; + int ret = -1; + char buf[GF_CHECKSUM_BUF_SIZE] = { + 0, + }; - /* goto first place */ - sys_lseek (fd, 0L, SEEK_SET); - do { - ret = sys_read (fd, &buf, GF_CHECKSUM_BUF_SIZE); - if (ret > 0) - compute_checksum (buf, GF_CHECKSUM_BUF_SIZE, - checksum); - } while (ret > 0); + /* goto first place */ + sys_lseek(fd, 0L, SEEK_SET); + do { + ret = sys_read(fd, &buf, GF_CHECKSUM_BUF_SIZE); + if (ret > 0) + compute_checksum(buf, GF_CHECKSUM_BUF_SIZE, checksum); + } while (ret > 0); - /* set it back */ - sys_lseek (fd, 0L, SEEK_SET); + /* set it back */ + sys_lseek(fd, 0L, SEEK_SET); - return ret; + return ret; } - int -get_checksum_for_path (char *path, uint32_t *checksum) +get_checksum_for_path(char *path, uint32_t *checksum) { - int ret = -1; - int fd = -1; + int ret = -1; + int fd = -1; - GF_ASSERT (path); - GF_ASSERT (checksum); + GF_ASSERT(path); + GF_ASSERT(checksum); - fd = open (path, O_RDWR); + fd = open(path, O_RDWR); - if (fd == -1) { - gf_msg (THIS->name, GF_LOG_ERROR, errno, LG_MSG_PATH_ERROR, - "Unable to open %s", path); - goto out; - } + if (fd == -1) { + gf_msg(THIS->name, GF_LOG_ERROR, errno, LG_MSG_PATH_ERROR, + "Unable to open %s", path); + goto out; + } - ret = get_checksum_for_file (fd, checksum); + ret = get_checksum_for_file(fd, checksum); out: - if (fd != -1) - sys_close (fd); + if (fd != -1) + sys_close(fd); - return ret; + return ret; } /** @@ -2071,26 +2077,25 @@ out: * errors : Errors returned by the stat () call */ int -get_file_mtime (const char *path, time_t *stamp) +get_file_mtime(const char *path, time_t *stamp) { - struct stat f_stat = {0}; - int ret = -EINVAL; + struct stat f_stat = {0}; + int ret = -EINVAL; - GF_VALIDATE_OR_GOTO (THIS->name, path, out); - GF_VALIDATE_OR_GOTO (THIS->name, stamp, out); + GF_VALIDATE_OR_GOTO(THIS->name, path, out); + GF_VALIDATE_OR_GOTO(THIS->name, stamp, out); - ret = sys_stat (path, &f_stat); - if (ret < 0) { - gf_msg (THIS->name, GF_LOG_ERROR, errno, - LG_MSG_FILE_STAT_FAILED, "failed to stat %s", - path); - goto out; - } + ret = sys_stat(path, &f_stat); + if (ret < 0) { + gf_msg(THIS->name, GF_LOG_ERROR, errno, LG_MSG_FILE_STAT_FAILED, + "failed to stat %s", path); + goto out; + } - /* Set the mtime */ - *stamp = f_stat.st_mtime; + /* Set the mtime */ + *stamp = f_stat.st_mtime; out: - return ret; + return ret; } /** @@ -2106,117 +2111,117 @@ out: * failure: -EINVAL for bad args, retval of inet_pton otherwise */ gf_boolean_t -gf_is_ip_in_net (const char *network, const char *ip_str) -{ - unsigned long ip_buf = 0; - unsigned long net_ip_buf = 0; - unsigned long subnet_mask = 0; - int ret = -EINVAL; - char *slash = NULL; - char *net_ip = NULL; - char *subnet = NULL; - char *net_str = NULL; - int family = AF_INET; - gf_boolean_t result = _gf_false; - - GF_ASSERT (network); - GF_ASSERT (ip_str); - - if (strchr (network, ':')) - family = AF_INET6; - else if (strchr (network, '.')) - family = AF_INET; - else { - family = -1; - goto out; - } - - net_str = strdupa (network); - slash = strchr (net_str, '/'); - if (!slash) - goto out; - *slash = '\0'; - - subnet = slash + 1; - net_ip = net_str; - - /* Convert IP address to a long */ - ret = inet_pton (family, ip_str, &ip_buf); - if (ret < 0) - gf_msg ("common-utils", GF_LOG_ERROR, errno, - LG_MSG_INET_PTON_FAILED, "inet_pton() failed"); - - /* Convert network IP address to a long */ - ret = inet_pton (family, net_ip, &net_ip_buf); - if (ret < 0) { - gf_msg ("common-utils", GF_LOG_ERROR, errno, - LG_MSG_INET_PTON_FAILED, "inet_pton() failed"); - goto out; - } - - /* Converts /x into a mask */ - subnet_mask = (1 << atoi (subnet)) - 1; - - result = ((ip_buf & subnet_mask) == (net_ip_buf & subnet_mask)); +gf_is_ip_in_net(const char *network, const char *ip_str) +{ + unsigned long ip_buf = 0; + unsigned long net_ip_buf = 0; + unsigned long subnet_mask = 0; + int ret = -EINVAL; + char *slash = NULL; + char *net_ip = NULL; + char *subnet = NULL; + char *net_str = NULL; + int family = AF_INET; + gf_boolean_t result = _gf_false; + + GF_ASSERT(network); + GF_ASSERT(ip_str); + + if (strchr(network, ':')) + family = AF_INET6; + else if (strchr(network, '.')) + family = AF_INET; + else { + family = -1; + goto out; + } + + net_str = strdupa(network); + slash = strchr(net_str, '/'); + if (!slash) + goto out; + *slash = '\0'; + + subnet = slash + 1; + net_ip = net_str; + + /* Convert IP address to a long */ + ret = inet_pton(family, ip_str, &ip_buf); + if (ret < 0) + gf_msg("common-utils", GF_LOG_ERROR, errno, LG_MSG_INET_PTON_FAILED, + "inet_pton() failed"); + + /* Convert network IP address to a long */ + ret = inet_pton(family, net_ip, &net_ip_buf); + if (ret < 0) { + gf_msg("common-utils", GF_LOG_ERROR, errno, LG_MSG_INET_PTON_FAILED, + "inet_pton() failed"); + goto out; + } + + /* Converts /x into a mask */ + subnet_mask = (1 << atoi(subnet)) - 1; + + result = ((ip_buf & subnet_mask) == (net_ip_buf & subnet_mask)); out: - return result; + return result; } char * -strtail (char *str, const char *pattern) +strtail(char *str, const char *pattern) { - int i = 0; + int i = 0; - for (i = 0; str[i] == pattern[i] && str[i]; i++); + for (i = 0; str[i] == pattern[i] && str[i]; i++) + ; - if (pattern[i] == '\0') - return str + i; + if (pattern[i] == '\0') + return str + i; - return NULL; + return NULL; } void -skipwhite (char **s) +skipwhite(char **s) { - while (isspace (**s)) - (*s)++; + while (isspace(**s)) + (*s)++; } void -gf_strTrim (char **s) +gf_strTrim(char **s) { - char *end = NULL; + char *end = NULL; - end = *s + strlen(*s) - 1; - while (end > *s && isspace ((unsigned char)*end)) - end--; + end = *s + strlen(*s) - 1; + while (end > *s && isspace((unsigned char)*end)) + end--; - *(end+1) = '\0'; + *(end + 1) = '\0'; - while (isspace (**s)) - (*s)++; + while (isspace(**s)) + (*s)++; - return; + return; } char * -nwstrtail (char *str, char *pattern) +nwstrtail(char *str, char *pattern) { - for (;;) { - skipwhite (&str); - skipwhite (&pattern); + for (;;) { + skipwhite(&str); + skipwhite(&pattern); - if (*str != *pattern || !*str) - break; + if (*str != *pattern || !*str) + break; - str++; - pattern++; - } + str++; + pattern++; + } - return *pattern ? NULL : str; + return *pattern ? NULL : str; } - /** * token_iter_init -- initialize tokenization * @@ -2231,12 +2236,12 @@ nwstrtail (char *str, char *pattern) * next_token(). */ char * -token_iter_init (char *str, char sep, token_iter_t *tit) +token_iter_init(char *str, char sep, token_iter_t *tit) { - tit->end = str + strlen (str); - tit->sep = sep; + tit->end = str + strlen(str); + tit->sep = sep; - return str; + return str; } /** @@ -2256,30 +2261,32 @@ token_iter_init (char *str, char sep, token_iter_t *tit) * apart from dropped tokens (see drop_token()). */ gf_boolean_t -next_token (char **tokenp, token_iter_t *tit) -{ - char *cursor = NULL; - gf_boolean_t is_last = _gf_false; - - for (cursor = *tokenp; *cursor; cursor++); - if (cursor < tit->end) { - /* - * We detect that in between current token and end a zero - * marker has already been inserted. This means that the - * token has already been returned. We restore the - * separator and move ahead. - */ - *cursor = tit->sep; - *tokenp = cursor + 1; - } +next_token(char **tokenp, token_iter_t *tit) +{ + char *cursor = NULL; + gf_boolean_t is_last = _gf_false; - for (cursor = *tokenp; *cursor && *cursor != tit->sep; cursor++); - /* If the cursor ended up on a zero byte, then it's the last token. */ - is_last = !*cursor; - /* Zero-terminate the token. */ - *cursor = 0; + for (cursor = *tokenp; *cursor; cursor++) + ; + if (cursor < tit->end) { + /* + * We detect that in between current token and end a zero + * marker has already been inserted. This means that the + * token has already been returned. We restore the + * separator and move ahead. + */ + *cursor = tit->sep; + *tokenp = cursor + 1; + } - return is_last; + for (cursor = *tokenp; *cursor && *cursor != tit->sep; cursor++) + ; + /* If the cursor ended up on a zero byte, then it's the last token. */ + is_last = !*cursor; + /* Zero-terminate the token. */ + *cursor = 0; + + return is_last; } /* @@ -2330,142 +2337,143 @@ next_token (char **tokenp, token_iter_t *tit) * } */ void -drop_token (char *token, token_iter_t *tit) -{ - char *cursor = NULL; - - for (cursor = token; *cursor; cursor++); - if (cursor < tit->end) { - /* - * We detect a zero inserted by next_token(). - * Step the cursor and copy what comes after - * to token. - */ - for (cursor++; cursor < tit->end; *token++ = *cursor++); - } +drop_token(char *token, token_iter_t *tit) +{ + char *cursor = NULL; + for (cursor = token; *cursor; cursor++) + ; + if (cursor < tit->end) { /* - * Zero out the remainder of the buffer. - * It would be enough to insert just a single zero, - * but we continue 'till the end to have cleaner - * memory content. + * We detect a zero inserted by next_token(). + * Step the cursor and copy what comes after + * to token. */ - for (cursor = token; cursor < tit->end; *cursor++ = 0); + for (cursor++; cursor < tit->end; *token++ = *cursor++) + ; + } - /* Adjust the end to point to the new terminating zero. */ - tit->end = token; + /* + * Zero out the remainder of the buffer. + * It would be enough to insert just a single zero, + * but we continue 'till the end to have cleaner + * memory content. + */ + for (cursor = token; cursor < tit->end; *cursor++ = 0) + ; + + /* Adjust the end to point to the new terminating zero. */ + tit->end = token; } /* Syntax formed according to RFC 1912 (RFC 1123 & 952 are more restrictive) * <hname> ::= <gen-name>*["."<gen-name>] * <gen-name> ::= <let-or-digit> <[*[<let-or-digit-or-hyphen>]<let-or-digit>] */ char -valid_host_name (char *address, int length) +valid_host_name(char *address, int length) { - int i = 0; - int str_len = 0; - char ret = 1; - char *dup_addr = NULL; - char *temp_str = NULL; - char *save_ptr = NULL; + int i = 0; + int str_len = 0; + char ret = 1; + char *dup_addr = NULL; + char *temp_str = NULL; + char *save_ptr = NULL; - if ((length > _POSIX_HOST_NAME_MAX) || (length < 1)) { - ret = 0; - goto out; - } + if ((length > _POSIX_HOST_NAME_MAX) || (length < 1)) { + ret = 0; + goto out; + } - dup_addr = gf_strdup (address); - if (!dup_addr) { - ret = 0; - goto out; - } + dup_addr = gf_strdup(address); + if (!dup_addr) { + ret = 0; + goto out; + } - if (!isalnum (dup_addr[length - 1]) && (dup_addr[length - 1] != '*')) { - ret = 0; - goto out; - } + if (!isalnum(dup_addr[length - 1]) && (dup_addr[length - 1] != '*')) { + ret = 0; + goto out; + } - /* Check for consecutive dots, which is invalid in a hostname and is - * ignored by strtok() - */ - if (strstr (dup_addr, "..")) { + /* Check for consecutive dots, which is invalid in a hostname and is + * ignored by strtok() + */ + if (strstr(dup_addr, "..")) { + ret = 0; + goto out; + } + + /* gen-name */ + temp_str = strtok_r(dup_addr, ".", &save_ptr); + do { + str_len = strlen(temp_str); + + if (!isalnum(temp_str[0]) || !isalnum(temp_str[str_len - 1])) { + ret = 0; + goto out; + } + for (i = 1; i < str_len; i++) { + if (!isalnum(temp_str[i]) && (temp_str[i] != '-')) { ret = 0; goto out; + } } - - /* gen-name */ - temp_str = strtok_r (dup_addr, ".", &save_ptr); - do { - str_len = strlen (temp_str); - - if (!isalnum (temp_str[0]) || - !isalnum (temp_str[str_len-1])) { - ret = 0; - goto out; - } - for (i = 1; i < str_len; i++) { - if (!isalnum (temp_str[i]) && (temp_str[i] != '-')) { - ret = 0; - goto out; - } - } - } while ((temp_str = strtok_r (NULL, ".", &save_ptr))); + } while ((temp_str = strtok_r(NULL, ".", &save_ptr))); out: - GF_FREE (dup_addr); - return ret; + GF_FREE(dup_addr); + return ret; } /* Matches all ipv4 address, if wildcard_acc is true '*' wildcard pattern for* - subnets is considered as valid strings as well */ + subnets is considered as valid strings as well */ char -valid_ipv4_address (char *address, int length, gf_boolean_t wildcard_acc) -{ - int octets = 0; - int value = 0; - char *tmp = NULL, *ptr = NULL, *prev = NULL, *endptr = NULL; - char ret = 1; - int is_wildcard = 0; +valid_ipv4_address(char *address, int length, gf_boolean_t wildcard_acc) +{ + int octets = 0; + int value = 0; + char *tmp = NULL, *ptr = NULL, *prev = NULL, *endptr = NULL; + char ret = 1; + int is_wildcard = 0; + + tmp = gf_strdup(address); + + /* + * To prevent cases where last character is '.' and which have + * consecutive dots like ".." as strtok ignore consecutive + * delimiters. + */ + if (length <= 0 || (strstr(address, "..")) || + (!isdigit(tmp[length - 1]) && (tmp[length - 1] != '*'))) { + ret = 0; + goto out; + } - tmp = gf_strdup (address); + prev = tmp; + prev = strtok_r(tmp, ".", &ptr); - /* - * To prevent cases where last character is '.' and which have - * consecutive dots like ".." as strtok ignore consecutive - * delimiters. - */ - if (length <= 0 || - (strstr (address, "..")) || - (!isdigit (tmp[length - 1]) && (tmp[length - 1] != '*'))) { + while (prev != NULL) { + octets++; + if (wildcard_acc && !strcmp(prev, "*")) { + is_wildcard = 1; + } else { + value = strtol(prev, &endptr, 10); + if ((value > 255) || (value < 0) || + (endptr != NULL && *endptr != '\0')) { ret = 0; goto out; + } } + prev = strtok_r(NULL, ".", &ptr); + } - prev = tmp; - prev = strtok_r (tmp, ".", &ptr); - - while (prev != NULL) { - octets++; - if (wildcard_acc && !strcmp (prev, "*")) { - is_wildcard = 1; - } else { - value = strtol (prev, &endptr, 10); - if ((value > 255) || (value < 0) || - (endptr != NULL && *endptr != '\0')) { - ret = 0; - goto out; - } - } - prev = strtok_r (NULL, ".", &ptr); - } - - if ((octets > 4) || (octets < 4 && !is_wildcard)) { - ret = 0; - } + if ((octets > 4) || (octets < 4 && !is_wildcard)) { + ret = 0; + } out: - GF_FREE (tmp); - return ret; + GF_FREE(tmp); + return ret; } /** @@ -2479,152 +2487,153 @@ out: * _gf_false otherwise. */ gf_boolean_t -valid_ipv4_subnetwork (const char *address) +valid_ipv4_subnetwork(const char *address) { - char *slash = NULL; - char *paddr = NULL; - char *endptr = NULL; - long prefixlen = -1; - gf_boolean_t retv = _gf_true; + char *slash = NULL; + char *paddr = NULL; + char *endptr = NULL; + long prefixlen = -1; + gf_boolean_t retv = _gf_true; - if (address == NULL) { - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, EINVAL, - LG_MSG_INVALID_ARG, "argument invalid"); - return _gf_false; - } - - paddr = gf_strdup (address); - if (paddr == NULL) /* ENOMEM */ - return _gf_false; - - /* - * INVALID: If '/' is not present OR - * Nothing specified after '/' - */ - slash = strchr(paddr, '/'); - if ((slash == NULL) || (slash[1] == '\0')) { - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, 0, - LG_MSG_INVALID_IPV4_FORMAT, "Invalid IPv4 " - "subnetwork format"); - retv = _gf_false; - goto out; - } + if (address == NULL) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG, + "argument invalid"); + return _gf_false; + } - *slash = '\0'; - retv = valid_ipv4_address (paddr, strlen(paddr), _gf_false); - if (retv == _gf_false) { - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, 0, - LG_MSG_INVALID_IPV4_FORMAT, - "Invalid IPv4 subnetwork address"); - goto out; - } - /* - * Reset errno before checking it - */ - errno = 0; - prefixlen = strtol (slash + 1, &endptr, 10); - if ((errno != 0) || (*endptr != '\0') || - (prefixlen < 0) || (prefixlen > IPv4_ADDR_SIZE)) { - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, 0, - LG_MSG_INVALID_IPV4_FORMAT, - "Invalid IPv4 subnetwork mask"); - retv = _gf_false; - goto out; - } + paddr = gf_strdup(address); + if (paddr == NULL) /* ENOMEM */ + return _gf_false; - retv = _gf_true; + /* + * INVALID: If '/' is not present OR + * Nothing specified after '/' + */ + slash = strchr(paddr, '/'); + if ((slash == NULL) || (slash[1] == '\0')) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, 0, + LG_MSG_INVALID_IPV4_FORMAT, + "Invalid IPv4 " + "subnetwork format"); + retv = _gf_false; + goto out; + } + + *slash = '\0'; + retv = valid_ipv4_address(paddr, strlen(paddr), _gf_false); + if (retv == _gf_false) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, 0, + LG_MSG_INVALID_IPV4_FORMAT, + "Invalid IPv4 subnetwork address"); + goto out; + } + /* + * Reset errno before checking it + */ + errno = 0; + prefixlen = strtol(slash + 1, &endptr, 10); + if ((errno != 0) || (*endptr != '\0') || (prefixlen < 0) || + (prefixlen > IPv4_ADDR_SIZE)) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, 0, + LG_MSG_INVALID_IPV4_FORMAT, + "Invalid IPv4 subnetwork mask"); + retv = _gf_false; + goto out; + } + + retv = _gf_true; out: - GF_FREE (paddr); - return retv; + GF_FREE(paddr); + return retv; } char -valid_ipv6_address (char *address, int length, gf_boolean_t wildcard_acc) -{ - int hex_numbers = 0; - int value = 0; - int i = 0; - char *tmp = NULL, *ptr = NULL, *prev = NULL, *endptr = NULL; - char ret = 1; - int is_wildcard = 0; - int is_compressed = 0; - - tmp = gf_strdup (address); - - /* Check for '%' for link local addresses */ - endptr = strchr(tmp, '%'); - if (endptr) { - *endptr = '\0'; - length = strlen(tmp); - endptr = NULL; - } - - /* Check for compressed form */ - if (length <= 0 || tmp[length - 1] == ':') { +valid_ipv6_address(char *address, int length, gf_boolean_t wildcard_acc) +{ + int hex_numbers = 0; + int value = 0; + int i = 0; + char *tmp = NULL, *ptr = NULL, *prev = NULL, *endptr = NULL; + char ret = 1; + int is_wildcard = 0; + int is_compressed = 0; + + tmp = gf_strdup(address); + + /* Check for '%' for link local addresses */ + endptr = strchr(tmp, '%'); + if (endptr) { + *endptr = '\0'; + length = strlen(tmp); + endptr = NULL; + } + + /* Check for compressed form */ + if (length <= 0 || tmp[length - 1] == ':') { + ret = 0; + goto out; + } + for (i = 0; i < (length - 1); i++) { + if (tmp[i] == ':' && tmp[i + 1] == ':') { + if (is_compressed == 0) + is_compressed = 1; + else { ret = 0; goto out; + } } - for (i = 0; i < (length - 1) ; i++) { - if (tmp[i] == ':' && tmp[i + 1] == ':') { - if (is_compressed == 0) - is_compressed = 1; - else { - ret = 0; - goto out; - } - } - } + } - prev = strtok_r (tmp, ":", &ptr); - - while (prev != NULL) { - hex_numbers++; - if (wildcard_acc && !strcmp (prev, "*")) { - is_wildcard = 1; - } else { - value = strtol (prev, &endptr, 16); - if ((value > 0xffff) || (value < 0) - || (endptr != NULL && *endptr != '\0')) { - ret = 0; - goto out; - } - } - prev = strtok_r (NULL, ":", &ptr); - } + prev = strtok_r(tmp, ":", &ptr); - if ((hex_numbers > 8) || (hex_numbers < 8 && !is_wildcard - && !is_compressed)) { + while (prev != NULL) { + hex_numbers++; + if (wildcard_acc && !strcmp(prev, "*")) { + is_wildcard = 1; + } else { + value = strtol(prev, &endptr, 16); + if ((value > 0xffff) || (value < 0) || + (endptr != NULL && *endptr != '\0')) { ret = 0; + goto out; + } } + prev = strtok_r(NULL, ":", &ptr); + } + + if ((hex_numbers > 8) || + (hex_numbers < 8 && !is_wildcard && !is_compressed)) { + ret = 0; + } out: - GF_FREE (tmp); - return ret; + GF_FREE(tmp); + return ret; } char -valid_internet_address (char *address, gf_boolean_t wildcard_acc) +valid_internet_address(char *address, gf_boolean_t wildcard_acc) { - char ret = 0; - int length = 0; + char ret = 0; + int length = 0; - if (address == NULL) { - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, EINVAL, - LG_MSG_INVALID_ARG, "argument invalid"); - goto out; - } + if (address == NULL) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG, + "argument invalid"); + goto out; + } - length = strlen (address); - if (length == 0) - goto out; + length = strlen(address); + if (length == 0) + goto out; - if (valid_ipv4_address (address, length, wildcard_acc) - || valid_ipv6_address (address, length, wildcard_acc) - || valid_host_name (address, length)) - ret = 1; + if (valid_ipv4_address(address, length, wildcard_acc) || + valid_ipv6_address(address, length, wildcard_acc) || + valid_host_name(address, length)) + ret = 1; out: - return ret; + return ret; } /** @@ -2634,56 +2643,56 @@ out: * * @return _gf_true if "address" is "*" (anonymous) 'OR' * if "address" is valid FQDN or valid IPv4/6 address 'OR' - * if "address" contains wildcard chars e.g. "'*' or '?' or '['" - * if "address" is valid ipv4 subnet pattern (xx.xx.xx.xx/n) - * _gf_false otherwise + * if "address" contains wildcard chars e.g. "'*' or '?' or + * '['" if "address" is valid ipv4 subnet pattern (xx.xx.xx.xx/n) _gf_false + * otherwise * * * NB: If the user/admin set for wildcard pattern, then it does not have * to be validated. Make it similar to the way exportfs (kNFS) works. */ gf_boolean_t -valid_mount_auth_address (char *address) +valid_mount_auth_address(char *address) { - int length = 0; - char *cp = NULL; + int length = 0; + char *cp = NULL; - /* 1. Check for "NULL and empty string */ - if ((address == NULL) || (address[0] == '\0')){ - gf_msg_callingfn (THIS->name, GF_LOG_WARNING, EINVAL, - LG_MSG_INVALID_ARG, "argument invalid"); - return _gf_false; - } + /* 1. Check for "NULL and empty string */ + if ((address == NULL) || (address[0] == '\0')) { + gf_msg_callingfn(THIS->name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG, + "argument invalid"); + return _gf_false; + } - /* 2. Check for Anonymous */ - if (strcmp(address, "*") == 0) - return _gf_true; + /* 2. Check for Anonymous */ + if (strcmp(address, "*") == 0) + return _gf_true; - for (cp = address; *cp; cp++) { - /* 3. Check for wildcard pattern */ - if (*cp == '*' || *cp == '?' || *cp == '[') { - return _gf_true; - } - - /* - * 4. check for IPv4 subnetwork i.e. xx.xx.xx.xx/n - * TODO: check for IPv6 subnetwork - * NB: Wildcard must not be mixed with subnetwork. - */ - if (*cp == '/') { - return valid_ipv4_subnetwork (address); - } + for (cp = address; *cp; cp++) { + /* 3. Check for wildcard pattern */ + if (*cp == '*' || *cp == '?' || *cp == '[') { + return _gf_true; } - /* 5. Check for v4/v6 IP addr and FQDN/hostname */ - length = strlen (address); - if ((valid_ipv4_address (address, length, _gf_false)) || - (valid_ipv6_address (address, length, _gf_false)) || - (valid_host_name (address, length))) { - return _gf_true; + /* + * 4. check for IPv4 subnetwork i.e. xx.xx.xx.xx/n + * TODO: check for IPv6 subnetwork + * NB: Wildcard must not be mixed with subnetwork. + */ + if (*cp == '/') { + return valid_ipv4_subnetwork(address); } + } - return _gf_false; + /* 5. Check for v4/v6 IP addr and FQDN/hostname */ + length = strlen(address); + if ((valid_ipv4_address(address, length, _gf_false)) || + (valid_ipv6_address(address, length, _gf_false)) || + (valid_host_name(address, length))) { + return _gf_true; + } + + return _gf_false; } /** @@ -2694,40 +2703,39 @@ valid_mount_auth_address (char *address) * @return _gf_true if a and b have same ipv{4,6} addr, _gf_false otherwise */ gf_boolean_t -gf_sock_union_equal_addr (union gf_sock_union *a, - union gf_sock_union *b) +gf_sock_union_equal_addr(union gf_sock_union *a, union gf_sock_union *b) { - if (!a || !b) { - gf_msg ("common-utils", GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, - "Invalid arguments to gf_sock_union_equal_addr"); - return _gf_false; - } + if (!a || !b) { + gf_msg("common-utils", GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, + "Invalid arguments to gf_sock_union_equal_addr"); + return _gf_false; + } - if (a->storage.ss_family != b->storage.ss_family) - return _gf_false; + if (a->storage.ss_family != b->storage.ss_family) + return _gf_false; - switch (a->storage.ss_family) { + switch (a->storage.ss_family) { case AF_INET: - if (a->sin.sin_addr.s_addr == b->sin.sin_addr.s_addr) - return _gf_true; - else - return _gf_false; + if (a->sin.sin_addr.s_addr == b->sin.sin_addr.s_addr) + return _gf_true; + else + return _gf_false; case AF_INET6: - if (memcmp ((void *)(&a->sin6.sin6_addr), - (void *)(&b->sin6.sin6_addr), - sizeof (a->sin6.sin6_addr))) - return _gf_false; - else - return _gf_true; + if (memcmp((void *)(&a->sin6.sin6_addr), + (void *)(&b->sin6.sin6_addr), sizeof(a->sin6.sin6_addr))) + return _gf_false; + else + return _gf_true; default: - gf_msg_debug ("common-utils", 0, "Unsupported/invalid address " - "family"); - break; - } + gf_msg_debug("common-utils", 0, + "Unsupported/invalid address " + "family"); + break; + } - return _gf_false; + return _gf_false; } /* @@ -2743,62 +2751,61 @@ gf_sock_union_equal_addr (union gf_sock_union *a, gf_boolean_t mask_match(const uint32_t a, const uint32_t b, const uint32_t m) { - return (((a ^ b) & m) == 0); + return (((a ^ b) & m) == 0); } - /*Thread safe conversion function*/ char * -uuid_utoa (uuid_t uuid) +uuid_utoa(uuid_t uuid) { - char *uuid_buffer = glusterfs_uuid_buf_get (); - gf_uuid_unparse (uuid, uuid_buffer); - return uuid_buffer; + char *uuid_buffer = glusterfs_uuid_buf_get(); + gf_uuid_unparse(uuid, uuid_buffer); + return uuid_buffer; } /*Re-entrant conversion function*/ char * -uuid_utoa_r (uuid_t uuid, char *dst) +uuid_utoa_r(uuid_t uuid, char *dst) { - if(!dst) - return NULL; - gf_uuid_unparse (uuid, dst); - return dst; + if (!dst) + return NULL; + gf_uuid_unparse(uuid, dst); + return dst; } /*Thread safe conversion function*/ char * -lkowner_utoa (gf_lkowner_t *lkowner) +lkowner_utoa(gf_lkowner_t *lkowner) { - char *lkowner_buffer = glusterfs_lkowner_buf_get (); - lkowner_unparse (lkowner, lkowner_buffer, GF_LKOWNER_BUF_SIZE); - return lkowner_buffer; + char *lkowner_buffer = glusterfs_lkowner_buf_get(); + lkowner_unparse(lkowner, lkowner_buffer, GF_LKOWNER_BUF_SIZE); + return lkowner_buffer; } /*Re-entrant conversion function*/ char * -lkowner_utoa_r (gf_lkowner_t *lkowner, char *dst, int len) +lkowner_utoa_r(gf_lkowner_t *lkowner, char *dst, int len) { - if(!dst) - return NULL; - lkowner_unparse (lkowner, dst, len); - return dst; + if (!dst) + return NULL; + lkowner_unparse(lkowner, dst, len); + return dst; } gf_boolean_t -is_valid_lease_id (const char *lease_id) +is_valid_lease_id(const char *lease_id) { - int i = 0; - gf_boolean_t valid = _gf_false; + int i = 0; + gf_boolean_t valid = _gf_false; - for (i = 0; i < LEASE_ID_SIZE; i++) { - if (lease_id[i] != 0) { - valid = _gf_true; - goto out; - } + for (i = 0; i < LEASE_ID_SIZE; i++) { + if (lease_id[i] != 0) { + valid = _gf_true; + goto out; } + } out: - return valid; + return valid; } /* Lease_id can be a either in printable or non printable binary @@ -2815,108 +2822,107 @@ out: * subsequent call to this function will override the same buffer. */ char * -leaseid_utoa (const char *lease_id) -{ - char *buf = NULL; - int i = 0; - int j = 0; - - buf = glusterfs_leaseid_buf_get (); - if (!buf) - goto out; - - for (i = 0; i < LEASE_ID_SIZE; i++) { - if (i && !(i % 2)) { - buf[j] = '-'; - j++; - } - sprintf (&buf[j], "%02hhx", lease_id[i]); - j += 2; - if (j == GF_LEASE_ID_BUF_SIZE) - break; - } - buf[GF_LEASE_ID_BUF_SIZE - 1] = '\0'; +leaseid_utoa(const char *lease_id) +{ + char *buf = NULL; + int i = 0; + int j = 0; + + buf = glusterfs_leaseid_buf_get(); + if (!buf) + goto out; + + for (i = 0; i < LEASE_ID_SIZE; i++) { + if (i && !(i % 2)) { + buf[j] = '-'; + j++; + } + sprintf(&buf[j], "%02hhx", lease_id[i]); + j += 2; + if (j == GF_LEASE_ID_BUF_SIZE) + break; + } + buf[GF_LEASE_ID_BUF_SIZE - 1] = '\0'; out: - return buf; + return buf; } char * -gf_leaseid_get () +gf_leaseid_get() { - return glusterfs_leaseid_buf_get (); + return glusterfs_leaseid_buf_get(); } char * -gf_existing_leaseid () +gf_existing_leaseid() { - return glusterfs_leaseid_exist (); + return glusterfs_leaseid_exist(); } -void* gf_array_elem (void *a, int index, size_t elem_size) +void * +gf_array_elem(void *a, int index, size_t elem_size) { - uint8_t* ptr = a; - return (void*)(ptr + index * elem_size); + uint8_t *ptr = a; + return (void *)(ptr + index * elem_size); } void -gf_elem_swap (void *x, void *y, size_t l) { - uint8_t *a = x, *b = y, c; - while(l--) { - c = *a; - *a++ = *b; - *b++ = c; - } +gf_elem_swap(void *x, void *y, size_t l) +{ + uint8_t *a = x, *b = y, c; + while (l--) { + c = *a; + *a++ = *b; + *b++ = c; + } } void -gf_array_insertionsort (void *A, int l, int r, size_t elem_size, - gf_cmp cmp) -{ - int i = l; - int N = r+1; - void *Temp = NULL; - int j = 0; - - for(i = l; i < N; i++) { - Temp = gf_array_elem (A, i, elem_size); - j = i - 1; - while (j >= 0 && (cmp (Temp, gf_array_elem (A, j, elem_size)) - < 0)) { - gf_elem_swap (Temp, gf_array_elem (A, j, elem_size), - elem_size); - Temp = gf_array_elem (A, j, elem_size); - j = j-1; - } +gf_array_insertionsort(void *A, int l, int r, size_t elem_size, gf_cmp cmp) +{ + int i = l; + int N = r + 1; + void *Temp = NULL; + int j = 0; + + for (i = l; i < N; i++) { + Temp = gf_array_elem(A, i, elem_size); + j = i - 1; + while (j >= 0 && (cmp(Temp, gf_array_elem(A, j, elem_size)) < 0)) { + gf_elem_swap(Temp, gf_array_elem(A, j, elem_size), elem_size); + Temp = gf_array_elem(A, j, elem_size); + j = j - 1; } + } } int -gf_is_str_int (const char *value) +gf_is_str_int(const char *value) { - int flag = 0; - char *str = NULL; - char *fptr = NULL; + int flag = 0; + char *str = NULL; + char *fptr = NULL; - GF_VALIDATE_OR_GOTO (THIS->name, value, out); + GF_VALIDATE_OR_GOTO(THIS->name, value, out); - str = gf_strdup (value); - if (!str) - goto out; + str = gf_strdup(value); + if (!str) + goto out; - fptr = str; + fptr = str; - while (*str) { - if (!isdigit(*str)) { - flag = 1; - goto out; - } - str++; + while (*str) { + if (!isdigit(*str)) { + flag = 1; + goto out; } + str++; + } out: - GF_FREE (fptr); + GF_FREE(fptr); - return flag; + return flag; } /* * rounds up nr to power of two. If nr is already a power of two, just returns @@ -2924,22 +2930,22 @@ out: */ int32_t -gf_roundup_power_of_two (int32_t nr) +gf_roundup_power_of_two(int32_t nr) { - int32_t result = 1; + int32_t result = 1; - if (nr < 0) { - gf_msg ("common-utils", GF_LOG_WARNING, 0, - LG_MSG_NEGATIVE_NUM_PASSED, "negative number passed"); - result = -1; - goto out; - } + if (nr < 0) { + gf_msg("common-utils", GF_LOG_WARNING, 0, LG_MSG_NEGATIVE_NUM_PASSED, + "negative number passed"); + result = -1; + goto out; + } - while (result < nr) - result *= 2; + while (result < nr) + result *= 2; out: - return result; + return result; } /* @@ -2948,392 +2954,384 @@ out: */ int32_t -gf_roundup_next_power_of_two (int32_t nr) +gf_roundup_next_power_of_two(int32_t nr) { - int32_t result = 1; + int32_t result = 1; - if (nr < 0) { - gf_msg ("common-utils", GF_LOG_WARNING, 0, - LG_MSG_NEGATIVE_NUM_PASSED, "negative number passed"); - result = -1; - goto out; - } + if (nr < 0) { + gf_msg("common-utils", GF_LOG_WARNING, 0, LG_MSG_NEGATIVE_NUM_PASSED, + "negative number passed"); + result = -1; + goto out; + } - while (result <= nr) - result *= 2; + while (result <= nr) + result *= 2; out: - return result; + return result; } int -get_vol_type (int type, int dist_count, int brick_count) +get_vol_type(int type, int dist_count, int brick_count) { - if ((type != GF_CLUSTER_TYPE_TIER) && (type > 0) && - (dist_count < brick_count)) - type = type + GF_CLUSTER_TYPE_MAX - 1; + if ((type != GF_CLUSTER_TYPE_TIER) && (type > 0) && + (dist_count < brick_count)) + type = type + GF_CLUSTER_TYPE_MAX - 1; - return type; + return type; } int -validate_brick_name (char *brick) +validate_brick_name(char *brick) { - char *delimiter = NULL; - int ret = 0; - delimiter = strrchr (brick, ':'); - if (!delimiter || delimiter == brick - || *(delimiter+1) != '/') - ret = -1; + char *delimiter = NULL; + int ret = 0; + delimiter = strrchr(brick, ':'); + if (!delimiter || delimiter == brick || *(delimiter + 1) != '/') + ret = -1; - return ret; + return ret; } char * -get_host_name (char *word, char **host) +get_host_name(char *word, char **host) { - char *delimiter = NULL; - delimiter = strrchr (word, ':'); - if (delimiter) - *delimiter = '\0'; - else - return NULL; - *host = word; - return *host; + char *delimiter = NULL; + delimiter = strrchr(word, ':'); + if (delimiter) + *delimiter = '\0'; + else + return NULL; + *host = word; + return *host; } - char * -get_path_name (char *word, char **path) +get_path_name(char *word, char **path) { - char *delimiter = NULL; - delimiter = strchr (word, '/'); - if (!delimiter) - return NULL; - *path = delimiter; - return *path; + char *delimiter = NULL; + delimiter = strchr(word, '/'); + if (!delimiter) + return NULL; + *path = delimiter; + return *path; } void -gf_path_strip_trailing_slashes (char *path) +gf_path_strip_trailing_slashes(char *path) { - int i = 0; - int len = 0; + int i = 0; + int len = 0; - if (!path) - return; + if (!path) + return; - len = strlen (path); - for (i = len - 1; i > 0; i--) { - if (path[i] != '/') - break; - } + len = strlen(path); + for (i = len - 1; i > 0; i--) { + if (path[i] != '/') + break; + } - if (i < (len -1)) - path [i+1] = '\0'; + if (i < (len - 1)) + path[i + 1] = '\0'; - return; + return; } uint64_t -get_mem_size () +get_mem_size() { - uint64_t memsize = -1; + uint64_t memsize = -1; #if defined GF_LINUX_HOST_OS || defined GF_SOLARIS_HOST_OS - uint64_t page_size = 0; - uint64_t num_pages = 0; + uint64_t page_size = 0; + uint64_t num_pages = 0; - page_size = sysconf (_SC_PAGESIZE); - num_pages = sysconf (_SC_PHYS_PAGES); + page_size = sysconf(_SC_PAGESIZE); + num_pages = sysconf(_SC_PHYS_PAGES); - memsize = page_size * num_pages; + memsize = page_size * num_pages; #endif #if defined GF_DARWIN_HOST_OS - size_t len = sizeof(memsize); - int name [] = { CTL_HW, HW_PHYSMEM }; + size_t len = sizeof(memsize); + int name[] = {CTL_HW, HW_PHYSMEM}; - sysctl (name, 2, &memsize, &len, NULL, 0); + sysctl(name, 2, &memsize, &len, NULL, 0); #endif #if defined __NetBSD__ - size_t len = sizeof(memsize); - int name64 [] = { CTL_HW, HW_PHYSMEM64 }; + size_t len = sizeof(memsize); + int name64[] = {CTL_HW, HW_PHYSMEM64}; - sysctl (name64, 2, &memsize, &len, NULL, 0); - if (memsize == -1) - sysctl (name64, 2, &memsize, &len, NULL, 0); + sysctl(name64, 2, &memsize, &len, NULL, 0); + if (memsize == -1) + sysctl(name64, 2, &memsize, &len, NULL, 0); #endif - return memsize; + return memsize; } /* Strips all whitespace characters in a string and returns length of new string * on success */ int -gf_strip_whitespace (char *str, int len) +gf_strip_whitespace(char *str, int len) { - int i = 0; - int new_len = 0; - char *new_str = NULL; + int i = 0; + int new_len = 0; + char *new_str = NULL; - GF_ASSERT (str); + GF_ASSERT(str); - new_str = GF_MALLOC (len + 1, gf_common_mt_char); - if (new_str == NULL) - return -1; + new_str = GF_MALLOC(len + 1, gf_common_mt_char); + if (new_str == NULL) + return -1; - for (i = 0; i < len; i++) { - if (!isspace (str[i])) - new_str[new_len++] = str[i]; - } - new_str[new_len] = '\0'; + for (i = 0; i < len; i++) { + if (!isspace(str[i])) + new_str[new_len++] = str[i]; + } + new_str[new_len] = '\0'; - if (new_len != len) { - snprintf(str, new_len + 1, "%s", new_str); - } + if (new_len != len) { + snprintf(str, new_len + 1, "%s", new_str); + } - GF_FREE (new_str); - return new_len; + GF_FREE(new_str); + return new_len; } int -gf_canonicalize_path (char *path) +gf_canonicalize_path(char *path) { - int ret = -1; - int path_len = 0; - int dir_path_len = 0; - char *tmppath = NULL; - char *dir = NULL; - char *tmpstr = NULL; + int ret = -1; + int path_len = 0; + int dir_path_len = 0; + char *tmppath = NULL; + char *dir = NULL; + char *tmpstr = NULL; - if (!path || *path != '/') - goto out; + if (!path || *path != '/') + goto out; + + if (!strcmp(path, "/")) + return 0; - if (!strcmp (path, "/")) - return 0; + tmppath = gf_strdup(path); + if (!tmppath) + goto out; - tmppath = gf_strdup (path); - if (!tmppath) - goto out; + /* Strip the extra slashes and return */ + bzero(path, strlen(path)); + path[0] = '/'; + dir = strtok_r(tmppath, "/", &tmpstr); - /* Strip the extra slashes and return */ - bzero (path, strlen(path)); - path[0] = '/'; - dir = strtok_r(tmppath, "/", &tmpstr); - - while (dir) { - dir_path_len = strlen(dir); - strncpy ((path + path_len + 1), dir, dir_path_len); - path_len += dir_path_len + 1; - dir = strtok_r (NULL, "/", &tmpstr); - if (dir) { - path[path_len] = '/'; - } + while (dir) { + dir_path_len = strlen(dir); + strncpy((path + path_len + 1), dir, dir_path_len); + path_len += dir_path_len + 1; + dir = strtok_r(NULL, "/", &tmpstr); + if (dir) { + path[path_len] = '/'; } - path[path_len] = '\0'; - ret = 0; + } + path[path_len] = '\0'; + ret = 0; - out: - if (ret) - gf_msg ("common-utils", GF_LOG_ERROR, 0, LG_MSG_PATH_ERROR, - "Path manipulation failed"); +out: + if (ret) + gf_msg("common-utils", GF_LOG_ERROR, 0, LG_MSG_PATH_ERROR, + "Path manipulation failed"); - GF_FREE(tmppath); + GF_FREE(tmppath); - return ret; + return ret; } static const char *__gf_timefmts[] = { - "%F %T", - "%Y/%m/%d-%T", - "%b %d %T", - "%F %H%M%S", - "%Y-%m-%d-%T", - "%s", + "%F %T", "%Y/%m/%d-%T", "%b %d %T", "%F %H%M%S", "%Y-%m-%d-%T", "%s", }; static const char *__gf_zerotimes[] = { - "0000-00-00 00:00:00", - "0000/00/00-00:00:00", - "xxx 00 00:00:00", - "0000-00-00 000000", - "0000-00-00-00:00:00", - "0", + "0000-00-00 00:00:00", "0000/00/00-00:00:00", "xxx 00 00:00:00", + "0000-00-00 000000", "0000-00-00-00:00:00", "0", }; void -_gf_timestuff (const char ***fmts, const char ***zeros) +_gf_timestuff(const char ***fmts, const char ***zeros) { - *fmts = __gf_timefmts; - *zeros = __gf_zerotimes; + *fmts = __gf_timefmts; + *zeros = __gf_zerotimes; } - char * -generate_glusterfs_ctx_id (void) +generate_glusterfs_ctx_id(void) { - uuid_t ctxid; - char *tmp = NULL; + uuid_t ctxid; + char *tmp = NULL; - gf_uuid_generate (ctxid); - tmp = uuid_utoa (ctxid); + gf_uuid_generate(ctxid); + tmp = uuid_utoa(ctxid); - return gf_strdup (tmp); + return gf_strdup(tmp); } char * -gf_get_reserved_ports () +gf_get_reserved_ports() { - char *ports_info = NULL; + char *ports_info = NULL; #if defined GF_LINUX_HOST_OS - int proc_fd = -1; - char *proc_file = "/proc/sys/net/ipv4/ip_local_reserved_ports"; - char buffer[4096] = {0,}; - int32_t ret = -1; - - proc_fd = open (proc_file, O_RDONLY); - if (proc_fd == -1) { - /* What should be done in this case? error out from here - * and thus stop the glusterfs process from starting or - * continue with older method of using any of the available - * port? For now 2nd option is considered. - */ - gf_msg ("glusterfs", GF_LOG_WARNING, errno, - LG_MSG_FILE_OP_FAILED, "could not open the file " - "/proc/sys/net/ipv4/ip_local_reserved_ports for " - "getting reserved ports info"); - goto out; - } - - ret = sys_read (proc_fd, buffer, sizeof (buffer)-1); - if (ret < 0) { - gf_msg ("glusterfs", GF_LOG_WARNING, errno, - LG_MSG_FILE_OP_FAILED, "could not read the file %s for" - " getting reserved ports info", proc_file); - goto out; - } - - buffer[ret] = '\0'; - ports_info = gf_strdup (buffer); + int proc_fd = -1; + char *proc_file = "/proc/sys/net/ipv4/ip_local_reserved_ports"; + char buffer[4096] = { + 0, + }; + int32_t ret = -1; + + proc_fd = open(proc_file, O_RDONLY); + if (proc_fd == -1) { + /* What should be done in this case? error out from here + * and thus stop the glusterfs process from starting or + * continue with older method of using any of the available + * port? For now 2nd option is considered. + */ + gf_msg("glusterfs", GF_LOG_WARNING, errno, LG_MSG_FILE_OP_FAILED, + "could not open the file " + "/proc/sys/net/ipv4/ip_local_reserved_ports for " + "getting reserved ports info"); + goto out; + } + + ret = sys_read(proc_fd, buffer, sizeof(buffer) - 1); + if (ret < 0) { + gf_msg("glusterfs", GF_LOG_WARNING, errno, LG_MSG_FILE_OP_FAILED, + "could not read the file %s for" + " getting reserved ports info", + proc_file); + goto out; + } + + buffer[ret] = '\0'; + ports_info = gf_strdup(buffer); out: - if (proc_fd != -1) - sys_close (proc_fd); + if (proc_fd != -1) + sys_close(proc_fd); #endif /* GF_LINUX_HOST_OS */ - return ports_info; + return ports_info; } int -gf_process_reserved_ports (unsigned char *ports, uint32_t ceiling) +gf_process_reserved_ports(unsigned char *ports, uint32_t ceiling) { - int ret = -1; + int ret = -1; - memset (ports, 0, GF_PORT_ARRAY_SIZE); + memset(ports, 0, GF_PORT_ARRAY_SIZE); #if defined GF_LINUX_HOST_OS - char *ports_info = NULL; - char *tmp = NULL; - char *blocked_port = NULL; - - ports_info = gf_get_reserved_ports (); - if (!ports_info) { - gf_msg ("glusterfs", GF_LOG_WARNING, 0, - LG_MSG_RESERVED_PORTS_ERROR, "Not able to get reserved" - " ports, hence there is a possibility that glusterfs " - "may consume reserved port"); - goto out; - } + char *ports_info = NULL; + char *tmp = NULL; + char *blocked_port = NULL; - blocked_port = strtok_r (ports_info, ",\n",&tmp); + ports_info = gf_get_reserved_ports(); + if (!ports_info) { + gf_msg("glusterfs", GF_LOG_WARNING, 0, LG_MSG_RESERVED_PORTS_ERROR, + "Not able to get reserved" + " ports, hence there is a possibility that glusterfs " + "may consume reserved port"); + goto out; + } - while (blocked_port) { - gf_ports_reserved (blocked_port, ports, ceiling); - blocked_port = strtok_r (NULL, ",\n", &tmp); - } + blocked_port = strtok_r(ports_info, ",\n", &tmp); - ret = 0; + while (blocked_port) { + gf_ports_reserved(blocked_port, ports, ceiling); + blocked_port = strtok_r(NULL, ",\n", &tmp); + } + + ret = 0; out: - GF_FREE (ports_info); + GF_FREE(ports_info); #else /* FIXME: Non Linux Host */ - ret = 0; + ret = 0; #endif /* GF_LINUX_HOST_OS */ - return ret; + return ret; } gf_boolean_t -gf_ports_reserved (char *blocked_port, unsigned char *ports, uint32_t ceiling) -{ - gf_boolean_t result = _gf_false; - char *range_port = NULL; - int32_t tmp_port1 = -1; - int32_t tmp_port2 = -1; - - if (strstr (blocked_port, "-") == NULL) { - /* get rid of the new line character*/ - if (blocked_port[strlen(blocked_port) -1] == '\n') - blocked_port[strlen(blocked_port) -1] = '\0'; - if (gf_string2int32 (blocked_port, &tmp_port1) == 0) { - if (tmp_port1 > ceiling - || tmp_port1 < 0) { - gf_msg ("glusterfs-socket", GF_LOG_WARNING, 0, - LG_MSG_INVALID_PORT, "invalid port %d", - tmp_port1); - result = _gf_true; - goto out; - } else { - gf_msg_debug ("glusterfs", 0, "blocking port " - "%d", tmp_port1); - BIT_SET (ports, tmp_port1); - } - } else { - gf_msg ("glusterfs-socket", GF_LOG_WARNING, 0, - LG_MSG_INVALID_PORT, "%s is not a valid port " - "identifier", blocked_port); - result = _gf_true; - goto out; - } +gf_ports_reserved(char *blocked_port, unsigned char *ports, uint32_t ceiling) +{ + gf_boolean_t result = _gf_false; + char *range_port = NULL; + int32_t tmp_port1 = -1; + int32_t tmp_port2 = -1; + + if (strstr(blocked_port, "-") == NULL) { + /* get rid of the new line character*/ + if (blocked_port[strlen(blocked_port) - 1] == '\n') + blocked_port[strlen(blocked_port) - 1] = '\0'; + if (gf_string2int32(blocked_port, &tmp_port1) == 0) { + if (tmp_port1 > ceiling || tmp_port1 < 0) { + gf_msg("glusterfs-socket", GF_LOG_WARNING, 0, + LG_MSG_INVALID_PORT, "invalid port %d", tmp_port1); + result = _gf_true; + goto out; + } else { + gf_msg_debug("glusterfs", 0, + "blocking port " + "%d", + tmp_port1); + BIT_SET(ports, tmp_port1); + } } else { - range_port = strtok (blocked_port, "-"); - if (!range_port){ - result = _gf_true; - goto out; - } - if (gf_string2int32 (range_port, &tmp_port1) == 0) { - if (tmp_port1 > ceiling) - tmp_port1 = ceiling; - if (tmp_port1 < 0) - tmp_port1 = 0; - } - range_port = strtok (NULL, "-"); - if (!range_port) { - result = _gf_true; - goto out; - } - /* get rid of the new line character*/ - if (range_port[strlen(range_port) -1] == '\n') - range_port[strlen(range_port) - 1] = '\0'; - if (gf_string2int32 (range_port, &tmp_port2) == 0) { - if (tmp_port2 > ceiling) - tmp_port2 = ceiling; - if (tmp_port2 < 0) - tmp_port2 = 0; - } - gf_msg_debug ("glusterfs", 0, "lower: %d, higher: %d", - tmp_port1, tmp_port2); - for (; tmp_port1 <= tmp_port2; tmp_port1++) - BIT_SET (ports, tmp_port1); - } + gf_msg("glusterfs-socket", GF_LOG_WARNING, 0, LG_MSG_INVALID_PORT, + "%s is not a valid port " + "identifier", + blocked_port); + result = _gf_true; + goto out; + } + } else { + range_port = strtok(blocked_port, "-"); + if (!range_port) { + result = _gf_true; + goto out; + } + if (gf_string2int32(range_port, &tmp_port1) == 0) { + if (tmp_port1 > ceiling) + tmp_port1 = ceiling; + if (tmp_port1 < 0) + tmp_port1 = 0; + } + range_port = strtok(NULL, "-"); + if (!range_port) { + result = _gf_true; + goto out; + } + /* get rid of the new line character*/ + if (range_port[strlen(range_port) - 1] == '\n') + range_port[strlen(range_port) - 1] = '\0'; + if (gf_string2int32(range_port, &tmp_port2) == 0) { + if (tmp_port2 > ceiling) + tmp_port2 = ceiling; + if (tmp_port2 < 0) + tmp_port2 = 0; + } + gf_msg_debug("glusterfs", 0, "lower: %d, higher: %d", tmp_port1, + tmp_port2); + for (; tmp_port1 <= tmp_port2; tmp_port1++) + BIT_SET(ports, tmp_port1); + } out: - return result; + return result; } /* Takes in client ip{v4,v6} and returns associated hostname, if any @@ -3341,331 +3339,326 @@ out: * Returns: 0 for success, -1 for failure */ int -gf_get_hostname_from_ip (char *client_ip, char **hostname) -{ - int ret = -1; - struct sockaddr *client_sockaddr = NULL; - struct sockaddr_in client_sock_in = {0}; - struct sockaddr_in6 client_sock_in6 = {0}; - char client_hostname[NI_MAXHOST] = {0}; - char *client_ip_copy = NULL; - char *tmp = NULL; - char *ip = NULL; - size_t addr_sz = 0; - - /* if ipv4, reverse lookup the hostname to - * allow FQDN based rpc authentication - */ - if (!valid_ipv6_address (client_ip, strlen (client_ip), 0) && - !valid_ipv4_address (client_ip, strlen (client_ip), 0)) { - /* most times, we get a.b.c.d:port form, so check that */ - client_ip_copy = gf_strdup (client_ip); - if (!client_ip_copy) - goto out; - - ip = strtok_r (client_ip_copy, ":", &tmp); - } else { - ip = client_ip; - } - - if (valid_ipv4_address (ip, strlen (ip), 0) == _gf_true) { - client_sockaddr = (struct sockaddr *)&client_sock_in; - addr_sz = sizeof (client_sock_in); - client_sock_in.sin_family = AF_INET; - ret = inet_pton (AF_INET, ip, - (void *)&client_sock_in.sin_addr.s_addr); - - } else if (valid_ipv6_address (ip, strlen (ip), 0) == _gf_true) { - client_sockaddr = (struct sockaddr *) &client_sock_in6; - addr_sz = sizeof (client_sock_in6); +gf_get_hostname_from_ip(char *client_ip, char **hostname) +{ + int ret = -1; + struct sockaddr *client_sockaddr = NULL; + struct sockaddr_in client_sock_in = {0}; + struct sockaddr_in6 client_sock_in6 = {0}; + char client_hostname[NI_MAXHOST] = {0}; + char *client_ip_copy = NULL; + char *tmp = NULL; + char *ip = NULL; + size_t addr_sz = 0; + + /* if ipv4, reverse lookup the hostname to + * allow FQDN based rpc authentication + */ + if (!valid_ipv6_address(client_ip, strlen(client_ip), 0) && + !valid_ipv4_address(client_ip, strlen(client_ip), 0)) { + /* most times, we get a.b.c.d:port form, so check that */ + client_ip_copy = gf_strdup(client_ip); + if (!client_ip_copy) + goto out; + + ip = strtok_r(client_ip_copy, ":", &tmp); + } else { + ip = client_ip; + } + + if (valid_ipv4_address(ip, strlen(ip), 0) == _gf_true) { + client_sockaddr = (struct sockaddr *)&client_sock_in; + addr_sz = sizeof(client_sock_in); + client_sock_in.sin_family = AF_INET; + ret = inet_pton(AF_INET, ip, (void *)&client_sock_in.sin_addr.s_addr); + + } else if (valid_ipv6_address(ip, strlen(ip), 0) == _gf_true) { + client_sockaddr = (struct sockaddr *)&client_sock_in6; + addr_sz = sizeof(client_sock_in6); + + client_sock_in6.sin6_family = AF_INET6; + ret = inet_pton(AF_INET6, ip, (void *)&client_sock_in6.sin6_addr); + } else { + goto out; + } + + if (ret != 1) { + ret = -1; + goto out; + } + + /* You cannot just use sizeof (*client_sockaddr), as per the man page + * the (getnameinfo) size must be the size of the underlying sockaddr + * struct e.g. sockaddr_in6 or sockaddr_in. Failure to do so will + * break IPv6 hostname resolution (IPv4 will work only because + * the sockaddr_in struct happens to be of the correct size). + */ + ret = getnameinfo(client_sockaddr, addr_sz, client_hostname, + sizeof(client_hostname), NULL, 0, 0); + if (ret) { + gf_msg("common-utils", GF_LOG_ERROR, 0, LG_MSG_GETNAMEINFO_FAILED, + "Could not lookup hostname " + "of %s : %s", + client_ip, gai_strerror(ret)); + ret = -1; + goto out; + } + + *hostname = gf_strdup((char *)client_hostname); +out: + if (client_ip_copy) + GF_FREE(client_ip_copy); - client_sock_in6.sin6_family = AF_INET6; - ret = inet_pton (AF_INET6, ip, - (void *)&client_sock_in6.sin6_addr); - } else { - goto out; - } + return ret; +} - if (ret != 1) { - ret = -1; - goto out; - } +gf_boolean_t +gf_interface_search(char *ip) +{ + int32_t ret = -1; + gf_boolean_t found = _gf_false; + struct ifaddrs *ifaddr, *ifa; + int family; + char host[NI_MAXHOST]; + xlator_t *this = NULL; + char *pct = NULL; - /* You cannot just use sizeof (*client_sockaddr), as per the man page - * the (getnameinfo) size must be the size of the underlying sockaddr - * struct e.g. sockaddr_in6 or sockaddr_in. Failure to do so will - * break IPv6 hostname resolution (IPv4 will work only because - * the sockaddr_in struct happens to be of the correct size). - */ - ret = getnameinfo (client_sockaddr, - addr_sz, - client_hostname, sizeof (client_hostname), - NULL, 0, 0); - if (ret) { - gf_msg ("common-utils", GF_LOG_ERROR, 0, - LG_MSG_GETNAMEINFO_FAILED, "Could not lookup hostname " - "of %s : %s", client_ip, gai_strerror (ret)); - ret = -1; - goto out; - } + this = THIS; - *hostname = gf_strdup ((char *)client_hostname); - out: - if (client_ip_copy) - GF_FREE (client_ip_copy); + ret = getifaddrs(&ifaddr); - return ret; -} + if (ret != 0) { + gf_msg(this->name, GF_LOG_ERROR, 0, LG_MSG_GETIFADDRS_FAILED, + "getifaddrs() failed: %s\n", gai_strerror(ret)); + goto out; + } -gf_boolean_t -gf_interface_search (char *ip) -{ - int32_t ret = -1; - gf_boolean_t found = _gf_false; - struct ifaddrs *ifaddr, *ifa; - int family; - char host[NI_MAXHOST]; - xlator_t *this = NULL; - char *pct = NULL; + for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { + if (!ifa->ifa_addr) { + /* + * This seemingly happens if an interface hasn't + * been bound to a particular protocol (seen with + * TUN devices). + */ + continue; + } + family = ifa->ifa_addr->sa_family; - this = THIS; + if (family != AF_INET && family != AF_INET6) + continue; - ret = getifaddrs (&ifaddr); + ret = getnameinfo(ifa->ifa_addr, + (family == AF_INET) ? sizeof(struct sockaddr_in) + : sizeof(struct sockaddr_in6), + host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (ret != 0) { - gf_msg (this->name, GF_LOG_ERROR, 0, LG_MSG_GETIFADDRS_FAILED, - "getifaddrs() failed: %s\n", gai_strerror(ret)); - goto out; + gf_msg(this->name, GF_LOG_ERROR, 0, LG_MSG_GETNAMEINFO_FAILED, + "getnameinfo() " + "failed: %s\n", + gai_strerror(ret)); + goto out; + } + + /* + * Sometimes the address comes back as addr%eth0 or + * similar. Since % is an invalid character, we can + * strip it out with confidence that doing so won't + * harm anything. + */ + pct = index(host, '%'); + if (pct) { + *pct = '\0'; } - for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { - if (!ifa->ifa_addr) { - /* - * This seemingly happens if an interface hasn't - * been bound to a particular protocol (seen with - * TUN devices). - */ - continue; - } - family = ifa->ifa_addr->sa_family; - - if (family != AF_INET && family != AF_INET6) - continue; - - ret = getnameinfo (ifa->ifa_addr, - (family == AF_INET) ? sizeof(struct sockaddr_in) : - sizeof(struct sockaddr_in6), - host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); - - if (ret != 0) { - gf_msg (this->name, GF_LOG_ERROR, 0, - LG_MSG_GETNAMEINFO_FAILED, "getnameinfo() " - "failed: %s\n", gai_strerror(ret)); - goto out; - } - - /* - * Sometimes the address comes back as addr%eth0 or - * similar. Since % is an invalid character, we can - * strip it out with confidence that doing so won't - * harm anything. - */ - pct = index(host,'%'); - if (pct) { - *pct = '\0'; - } - - if (strncmp (ip, host, NI_MAXHOST) == 0) { - gf_msg_debug (this->name, 0, "%s is local address at " - "interface %s", ip, ifa->ifa_name); - found = _gf_true; - goto out; - } + if (strncmp(ip, host, NI_MAXHOST) == 0) { + gf_msg_debug(this->name, 0, + "%s is local address at " + "interface %s", + ip, ifa->ifa_name); + found = _gf_true; + goto out; } + } out: - if(ifaddr) - freeifaddrs (ifaddr); - return found; + if (ifaddr) + freeifaddrs(ifaddr); + return found; } char * -get_ip_from_addrinfo (struct addrinfo *addr, char **ip) +get_ip_from_addrinfo(struct addrinfo *addr, char **ip) { - char buf[64]; - void *in_addr = NULL; - struct sockaddr_in *s4 = NULL; - struct sockaddr_in6 *s6 = NULL; + char buf[64]; + void *in_addr = NULL; + struct sockaddr_in *s4 = NULL; + struct sockaddr_in6 *s6 = NULL; - switch (addr->ai_family) - { - case AF_INET: - s4 = (struct sockaddr_in *)addr->ai_addr; - in_addr = &s4->sin_addr; - break; - - case AF_INET6: - s6 = (struct sockaddr_in6 *)addr->ai_addr; - in_addr = &s6->sin6_addr; - break; - - default: - gf_msg ("glusterd", GF_LOG_ERROR, 0, - LG_MSG_INVALID_FAMILY, "Invalid family"); - return NULL; - } + switch (addr->ai_family) { + case AF_INET: + s4 = (struct sockaddr_in *)addr->ai_addr; + in_addr = &s4->sin_addr; + break; - if (!inet_ntop(addr->ai_family, in_addr, buf, sizeof(buf))) { - gf_msg ("glusterd", GF_LOG_ERROR, 0, LG_MSG_CONVERSION_FAILED, - "String conversion failed"); - return NULL; - } + case AF_INET6: + s6 = (struct sockaddr_in6 *)addr->ai_addr; + in_addr = &s6->sin6_addr; + break; + + default: + gf_msg("glusterd", GF_LOG_ERROR, 0, LG_MSG_INVALID_FAMILY, + "Invalid family"); + return NULL; + } + + if (!inet_ntop(addr->ai_family, in_addr, buf, sizeof(buf))) { + gf_msg("glusterd", GF_LOG_ERROR, 0, LG_MSG_CONVERSION_FAILED, + "String conversion failed"); + return NULL; + } - *ip = gf_strdup (buf); - return *ip; + *ip = gf_strdup(buf); + return *ip; } gf_boolean_t -gf_is_loopback_localhost (const struct sockaddr *sa, char *hostname) -{ - GF_ASSERT (sa); - - gf_boolean_t is_local = _gf_false; - const struct in_addr *addr4 = NULL; - const struct in6_addr *addr6 = NULL; - uint8_t *ap = NULL; - struct in6_addr loopbackaddr6 = IN6ADDR_LOOPBACK_INIT; - - switch (sa->sa_family) { - case AF_INET: - addr4 = &(((struct sockaddr_in *)sa)->sin_addr); - ap = (uint8_t*)&addr4->s_addr; - if (ap[0] == 127) - is_local = _gf_true; - break; - - case AF_INET6: - addr6 = &(((struct sockaddr_in6 *)sa)->sin6_addr); - if (memcmp (addr6, &loopbackaddr6, - sizeof (loopbackaddr6)) == 0) - is_local = _gf_true; - break; - - default: - if (hostname) - gf_msg ("glusterd", GF_LOG_ERROR, 0, - LG_MSG_INVALID_FAMILY, "unknown " - "address family %d for %s", - sa->sa_family, hostname); - break; - } +gf_is_loopback_localhost(const struct sockaddr *sa, char *hostname) +{ + GF_ASSERT(sa); + + gf_boolean_t is_local = _gf_false; + const struct in_addr *addr4 = NULL; + const struct in6_addr *addr6 = NULL; + uint8_t *ap = NULL; + struct in6_addr loopbackaddr6 = IN6ADDR_LOOPBACK_INIT; + + switch (sa->sa_family) { + case AF_INET: + addr4 = &(((struct sockaddr_in *)sa)->sin_addr); + ap = (uint8_t *)&addr4->s_addr; + if (ap[0] == 127) + is_local = _gf_true; + break; + + case AF_INET6: + addr6 = &(((struct sockaddr_in6 *)sa)->sin6_addr); + if (memcmp(addr6, &loopbackaddr6, sizeof(loopbackaddr6)) == 0) + is_local = _gf_true; + break; + + default: + if (hostname) + gf_msg("glusterd", GF_LOG_ERROR, 0, LG_MSG_INVALID_FAMILY, + "unknown " + "address family %d for %s", + sa->sa_family, hostname); + break; + } - return is_local; + return is_local; } gf_boolean_t -gf_is_local_addr (char *hostname) +gf_is_local_addr(char *hostname) { - int32_t ret = -1; - struct addrinfo *result = NULL; - struct addrinfo *res = NULL; - gf_boolean_t found = _gf_false; - char *ip = NULL; - xlator_t *this = NULL; - struct addrinfo hints; + int32_t ret = -1; + struct addrinfo *result = NULL; + struct addrinfo *res = NULL; + gf_boolean_t found = _gf_false; + char *ip = NULL; + xlator_t *this = NULL; + struct addrinfo hints; - this = THIS; + this = THIS; - memset (&hints, 0, sizeof (hints)); - /* - * Removing AI_ADDRCONFIG from default_hints - * for being able to use link local ipv6 addresses - */ - hints.ai_family = AF_UNSPEC; + memset(&hints, 0, sizeof(hints)); + /* + * Removing AI_ADDRCONFIG from default_hints + * for being able to use link local ipv6 addresses + */ + hints.ai_family = AF_UNSPEC; - ret = getaddrinfo (hostname, NULL, &hints, &result); + ret = getaddrinfo(hostname, NULL, &hints, &result); - if (ret != 0) { - gf_msg (this->name, GF_LOG_ERROR, 0, LG_MSG_GETADDRINFO_FAILED, - "error in getaddrinfo: %s\n", gai_strerror(ret)); - goto out; - } + if (ret != 0) { + gf_msg(this->name, GF_LOG_ERROR, 0, LG_MSG_GETADDRINFO_FAILED, + "error in getaddrinfo: %s\n", gai_strerror(ret)); + goto out; + } + + for (res = result; res != NULL; res = res->ai_next) { + gf_msg_debug(this->name, 0, "%s ", get_ip_from_addrinfo(res, &ip)); - for (res = result; res != NULL; res = res->ai_next) { - gf_msg_debug (this->name, 0, "%s ", - get_ip_from_addrinfo (res, &ip)); - - if (ip) { - found = gf_is_loopback_localhost - (res->ai_addr, hostname) || - gf_interface_search (ip); - } - if (found) { - GF_FREE (ip); - goto out; - } - GF_FREE (ip); + if (ip) { + found = gf_is_loopback_localhost(res->ai_addr, hostname) || + gf_interface_search(ip); + } + if (found) { + GF_FREE(ip); + goto out; } + GF_FREE(ip); + } out: - if (result) - freeaddrinfo (result); + if (result) + freeaddrinfo(result); - if (!found) - gf_msg_debug (this->name, 0, "%s is not local", hostname); + if (!found) + gf_msg_debug(this->name, 0, "%s is not local", hostname); - return found; + return found; } gf_boolean_t -gf_is_same_address (char *name1, char *name2) -{ - struct addrinfo *addr1 = NULL; - struct addrinfo *addr2 = NULL; - struct addrinfo *p = NULL; - struct addrinfo *q = NULL; - gf_boolean_t ret = _gf_false; - int gai_err = 0; - struct addrinfo hints; - - memset (&hints, 0, sizeof (hints)); - hints.ai_family = AF_UNSPEC; - - gai_err = getaddrinfo(name1, NULL, &hints, &addr1); - if (gai_err != 0) { - gf_msg (name1, GF_LOG_WARNING, 0, LG_MSG_GETADDRINFO_FAILED, - "error in getaddrinfo: %s\n", gai_strerror(gai_err)); - goto out; - } - - gai_err = getaddrinfo(name2, NULL, &hints, &addr2); - if (gai_err != 0) { - gf_msg (name2, GF_LOG_WARNING, 0, LG_MSG_GETADDRINFO_FAILED, - "error in getaddrinfo: %s\n", gai_strerror(gai_err)); - goto out; - } - - for (p = addr1; p; p = p->ai_next) { - for (q = addr2; q; q = q->ai_next) { - if (p->ai_addrlen != q->ai_addrlen) { - continue; - } - if (memcmp(p->ai_addr,q->ai_addr,p->ai_addrlen)) { - continue; - } - ret = _gf_true; - goto out; - } - } +gf_is_same_address(char *name1, char *name2) +{ + struct addrinfo *addr1 = NULL; + struct addrinfo *addr2 = NULL; + struct addrinfo *p = NULL; + struct addrinfo *q = NULL; + gf_boolean_t ret = _gf_false; + int gai_err = 0; + struct addrinfo hints; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + + gai_err = getaddrinfo(name1, NULL, &hints, &addr1); + if (gai_err != 0) { + gf_msg(name1, GF_LOG_WARNING, 0, LG_MSG_GETADDRINFO_FAILED, + "error in getaddrinfo: %s\n", gai_strerror(gai_err)); + goto out; + } + + gai_err = getaddrinfo(name2, NULL, &hints, &addr2); + if (gai_err != 0) { + gf_msg(name2, GF_LOG_WARNING, 0, LG_MSG_GETADDRINFO_FAILED, + "error in getaddrinfo: %s\n", gai_strerror(gai_err)); + goto out; + } + + for (p = addr1; p; p = p->ai_next) { + for (q = addr2; q; q = q->ai_next) { + if (p->ai_addrlen != q->ai_addrlen) { + continue; + } + if (memcmp(p->ai_addr, q->ai_addr, p->ai_addrlen)) { + continue; + } + ret = _gf_true; + goto out; + } + } out: - if (addr1) { - freeaddrinfo(addr1); - } - if (addr2) { - freeaddrinfo(addr2); - } - return ret; - + if (addr1) { + freeaddrinfo(addr1); + } + if (addr2) { + freeaddrinfo(addr2); + } + return ret; } /* @@ -3673,511 +3666,503 @@ out: * Format: <host1>:<port1> <host2>:<port2>... */ int -gf_process_getspec_servers_list(cmd_args_t *cmd_args, - const char *servers_list) { - char *tmp = NULL; - char *address = NULL; - char *host = NULL; - char *last_colon = NULL; - char *save_ptr = NULL; - int port = 0; - int ret = -1; - - tmp = gf_strdup (servers_list); - if (!tmp) { - errno = ENOMEM; - goto out; - } - - address = strtok_r (tmp, " ", &save_ptr); +gf_process_getspec_servers_list(cmd_args_t *cmd_args, const char *servers_list) +{ + char *tmp = NULL; + char *address = NULL; + char *host = NULL; + char *last_colon = NULL; + char *save_ptr = NULL; + int port = 0; + int ret = -1; + + tmp = gf_strdup(servers_list); + if (!tmp) { + errno = ENOMEM; + goto out; + } + + address = strtok_r(tmp, " ", &save_ptr); + if (!address) { + errno = EINVAL; + goto out; + } + + while (1) { + last_colon = strrchr(address, ':'); + if (!last_colon) { + errno = EINVAL; + ret = -1; + break; + } + *last_colon = '\0'; + host = address; + port = atoi(last_colon + 1); + if (port <= 0) { + errno = EINVAL; + ret = -1; + break; + } + ret = gf_set_volfile_server_common(cmd_args, host, + GF_DEFAULT_VOLFILE_TRANSPORT, port); + if (ret && errno != EEXIST) { + break; + } + address = strtok_r(NULL, " ", &save_ptr); if (!address) { - errno = EINVAL; - goto out; - } - - while (1) { - last_colon = strrchr (address, ':'); - if (!last_colon) { - errno = EINVAL; - ret = -1; - break; - } - *last_colon = '\0'; - host = address; - port = atoi (last_colon + 1); - if (port <= 0) { - errno = EINVAL; - ret = -1; - break; - } - ret = gf_set_volfile_server_common ( - cmd_args, host, GF_DEFAULT_VOLFILE_TRANSPORT, port); - if (ret && errno != EEXIST) { - break; - } - address = strtok_r (NULL, " ", &save_ptr); - if (!address) { - errno = 0; - ret = 0; - break; - } + errno = 0; + ret = 0; + break; } + } out: - if (tmp) { - GF_FREE (tmp); - } + if (tmp) { + GF_FREE(tmp); + } - return ret; + return ret; } int -gf_set_volfile_server_common (cmd_args_t *cmd_args, const char *host, - const char *transport, int port) -{ - server_cmdline_t *server = NULL; - server_cmdline_t *tmp = NULL; - int ret = -1; - - GF_VALIDATE_OR_GOTO (THIS->name, cmd_args, out); - GF_VALIDATE_OR_GOTO (THIS->name, host, out); - GF_VALIDATE_OR_GOTO (THIS->name, transport, out); - - server = GF_CALLOC (1, sizeof (server_cmdline_t), - gf_common_mt_server_cmdline_t); - if (!server) { - errno = ENOMEM; - goto out; - } - - INIT_LIST_HEAD (&server->list); - - server->volfile_server = gf_strdup (host); - if (!server->volfile_server) { - errno = ENOMEM; - goto out; - } - - server->transport = gf_strdup (transport); - if (!server->transport) { - errno = ENOMEM; - goto out; - } - - server->port = port; - - if (!cmd_args->volfile_server) { - cmd_args->volfile_server = server->volfile_server; - cmd_args->volfile_server_transport = server->transport; - cmd_args->volfile_server_port = server->port; - cmd_args->curr_server = server; - } - - list_for_each_entry(tmp, &cmd_args->volfile_servers, list) { - if ((!strcmp(tmp->volfile_server, server->volfile_server) && - !strcmp(tmp->transport, server->transport) && - (tmp->port == server->port))) { - errno = EEXIST; - ret = -1; - goto out; - } - } - - list_add_tail (&server->list, &cmd_args->volfile_servers); - - ret = 0; +gf_set_volfile_server_common(cmd_args_t *cmd_args, const char *host, + const char *transport, int port) +{ + server_cmdline_t *server = NULL; + server_cmdline_t *tmp = NULL; + int ret = -1; + + GF_VALIDATE_OR_GOTO(THIS->name, cmd_args, out); + GF_VALIDATE_OR_GOTO(THIS->name, host, out); + GF_VALIDATE_OR_GOTO(THIS->name, transport, out); + + server = GF_CALLOC(1, sizeof(server_cmdline_t), + gf_common_mt_server_cmdline_t); + if (!server) { + errno = ENOMEM; + goto out; + } + + INIT_LIST_HEAD(&server->list); + + server->volfile_server = gf_strdup(host); + if (!server->volfile_server) { + errno = ENOMEM; + goto out; + } + + server->transport = gf_strdup(transport); + if (!server->transport) { + errno = ENOMEM; + goto out; + } + + server->port = port; + + if (!cmd_args->volfile_server) { + cmd_args->volfile_server = server->volfile_server; + cmd_args->volfile_server_transport = server->transport; + cmd_args->volfile_server_port = server->port; + cmd_args->curr_server = server; + } + + list_for_each_entry(tmp, &cmd_args->volfile_servers, list) + { + if ((!strcmp(tmp->volfile_server, server->volfile_server) && + !strcmp(tmp->transport, server->transport) && + (tmp->port == server->port))) { + errno = EEXIST; + ret = -1; + goto out; + } + } + + list_add_tail(&server->list, &cmd_args->volfile_servers); + + ret = 0; out: - if (-1 == ret) { - if (server) { - GF_FREE (server->volfile_server); - GF_FREE (server->transport); - GF_FREE (server); - } + if (-1 == ret) { + if (server) { + GF_FREE(server->volfile_server); + GF_FREE(server->transport); + GF_FREE(server); } + } - return ret; + return ret; } /* Sets log file path from user provided arguments */ int -gf_set_log_file_path (cmd_args_t *cmd_args, glusterfs_ctx_t *ctx) -{ - int i = 0; - int j = 0; - int ret = 0; - int tmp_len = 0; - char tmp_str[1024] = {0,}; - - if (!cmd_args) - goto done; - - if (cmd_args->mount_point) { - j = 0; - i = 0; - if (cmd_args->mount_point[0] == '/') - i = 1; - for (; i < strlen (cmd_args->mount_point); i++,j++) { - tmp_str[j] = cmd_args->mount_point[i]; - if (cmd_args->mount_point[i] == '/') - tmp_str[j] = '-'; - } - - ret = gf_asprintf (&cmd_args->log_file, - DEFAULT_LOG_FILE_DIRECTORY "/%s.log", - tmp_str); - if (ret > 0) - ret = 0; - goto done; - } +gf_set_log_file_path(cmd_args_t *cmd_args, glusterfs_ctx_t *ctx) +{ + int i = 0; + int j = 0; + int ret = 0; + int tmp_len = 0; + char tmp_str[1024] = { + 0, + }; - if (ctx && GF_GLUSTERD_PROCESS == ctx->process_mode) { - ret = gf_asprintf (&cmd_args->log_file, - DEFAULT_LOG_FILE_DIRECTORY "/%s.log", - GLUSTERD_NAME); - if (ret > 0) - ret = 0; + if (!cmd_args) + goto done; - goto done; + if (cmd_args->mount_point) { + j = 0; + i = 0; + if (cmd_args->mount_point[0] == '/') + i = 1; + for (; i < strlen(cmd_args->mount_point); i++, j++) { + tmp_str[j] = cmd_args->mount_point[i]; + if (cmd_args->mount_point[i] == '/') + tmp_str[j] = '-'; } - if (cmd_args->volfile) { - j = 0; - i = 0; - if (cmd_args->volfile[0] == '/') - i = 1; - for (; i < strlen (cmd_args->volfile); i++,j++) { - tmp_str[j] = cmd_args->volfile[i]; - if (cmd_args->volfile[i] == '/') - tmp_str[j] = '-'; - } - ret = gf_asprintf (&cmd_args->log_file, - DEFAULT_LOG_FILE_DIRECTORY "/%s.log", - tmp_str); - if (ret > 0) - ret = 0; - goto done; - } + ret = gf_asprintf(&cmd_args->log_file, + DEFAULT_LOG_FILE_DIRECTORY "/%s.log", tmp_str); + if (ret > 0) + ret = 0; + goto done; + } + + if (ctx && GF_GLUSTERD_PROCESS == ctx->process_mode) { + ret = gf_asprintf(&cmd_args->log_file, + DEFAULT_LOG_FILE_DIRECTORY "/%s.log", GLUSTERD_NAME); + if (ret > 0) + ret = 0; + + goto done; + } - if (cmd_args->volfile_server) { - if (strncmp (cmd_args->volfile_server_transport, - "unix", 4) == 0) { - if (cmd_args->volfile_server[0] == '/') - i = 1; - tmp_len = strlen (cmd_args->volfile_server); - for (j = 0; i < tmp_len; i++, j++) { - tmp_str[j] = cmd_args->volfile_server[i]; - if (cmd_args->volfile_server[i] == '/') - tmp_str[j] = '-'; - } - ret = gf_asprintf (&cmd_args->log_file, - "%s/%s-%s-%d.log", - DEFAULT_LOG_FILE_DIRECTORY, - tmp_str, - cmd_args->volfile_id, getpid()); - } else { - ret = gf_asprintf (&cmd_args->log_file, - "%s/%s-%s-%d.log", - DEFAULT_LOG_FILE_DIRECTORY, - cmd_args->volfile_server, - cmd_args->volfile_id, getpid()); - } - if (ret > 0) - ret = 0; + if (cmd_args->volfile) { + j = 0; + i = 0; + if (cmd_args->volfile[0] == '/') + i = 1; + for (; i < strlen(cmd_args->volfile); i++, j++) { + tmp_str[j] = cmd_args->volfile[i]; + if (cmd_args->volfile[i] == '/') + tmp_str[j] = '-'; + } + ret = gf_asprintf(&cmd_args->log_file, + DEFAULT_LOG_FILE_DIRECTORY "/%s.log", tmp_str); + if (ret > 0) + ret = 0; + goto done; + } + + if (cmd_args->volfile_server) { + if (strncmp(cmd_args->volfile_server_transport, "unix", 4) == 0) { + if (cmd_args->volfile_server[0] == '/') + i = 1; + tmp_len = strlen(cmd_args->volfile_server); + for (j = 0; i < tmp_len; i++, j++) { + tmp_str[j] = cmd_args->volfile_server[i]; + if (cmd_args->volfile_server[i] == '/') + tmp_str[j] = '-'; + } + ret = gf_asprintf(&cmd_args->log_file, "%s/%s-%s-%d.log", + DEFAULT_LOG_FILE_DIRECTORY, tmp_str, + cmd_args->volfile_id, getpid()); + } else { + ret = gf_asprintf(&cmd_args->log_file, "%s/%s-%s-%d.log", + DEFAULT_LOG_FILE_DIRECTORY, + cmd_args->volfile_server, cmd_args->volfile_id, + getpid()); } + if (ret > 0) + ret = 0; + } done: - return ret; + return ret; } int -gf_set_log_ident (cmd_args_t *cmd_args) +gf_set_log_ident(cmd_args_t *cmd_args) { - int ret = 0; - char *ptr = NULL; - - if (cmd_args->log_file == NULL) { - /* no ident source */ - return 0; - } + int ret = 0; + char *ptr = NULL; - /* TODO: Some idents would look like, etc-glusterfs-glusterd.vol, which - * seems ugly and can be bettered? */ - /* just get the filename as the ident */ - if (NULL != (ptr = strrchr (cmd_args->log_file, '/'))) { - ret = gf_asprintf (&cmd_args->log_ident, "%s", ptr + 1); - } else { - ret = gf_asprintf (&cmd_args->log_ident, "%s", - cmd_args->log_file); - } - - if (ret > 0) - ret = 0; - else - return ret; + if (cmd_args->log_file == NULL) { + /* no ident source */ + return 0; + } + + /* TODO: Some idents would look like, etc-glusterfs-glusterd.vol, which + * seems ugly and can be bettered? */ + /* just get the filename as the ident */ + if (NULL != (ptr = strrchr(cmd_args->log_file, '/'))) { + ret = gf_asprintf(&cmd_args->log_ident, "%s", ptr + 1); + } else { + ret = gf_asprintf(&cmd_args->log_ident, "%s", cmd_args->log_file); + } + + if (ret > 0) + ret = 0; + else + return ret; - /* remove .log suffix */ - if (NULL != (ptr = strrchr (cmd_args->log_ident, '.'))) { - if (strcmp (ptr, ".log") == 0) { - ptr[0] = '\0'; - } + /* remove .log suffix */ + if (NULL != (ptr = strrchr(cmd_args->log_ident, '.'))) { + if (strcmp(ptr, ".log") == 0) { + ptr[0] = '\0'; } + } - return ret; + return ret; } int -gf_thread_cleanup_xint (pthread_t thread) +gf_thread_cleanup_xint(pthread_t thread) { - int ret = 0; - void *res = NULL; + int ret = 0; + void *res = NULL; - ret = pthread_cancel (thread); - if (ret != 0) - goto error_return; + ret = pthread_cancel(thread); + if (ret != 0) + goto error_return; - ret = pthread_join (thread, &res); - if (ret != 0) - goto error_return; + ret = pthread_join(thread, &res); + if (ret != 0) + goto error_return; - if (res != PTHREAD_CANCELED) - goto error_return; + if (res != PTHREAD_CANCELED) + goto error_return; - ret = 0; + ret = 0; - error_return: - return ret; +error_return: + return ret; } int -gf_thread_create (pthread_t *thread, const pthread_attr_t *attr, - void *(*start_routine)(void *), void *arg, const char *name) -{ - sigset_t set, old; - int ret; - char thread_name[GF_THREAD_NAMEMAX+GF_THREAD_NAME_PREFIX_LEN] = {0,}; - /* Max name on Linux is 16 and on NetBSD is 32 - * All Gluster threads have a set prefix of gluster and hence the limit - * of 9 on GF_THREAD_NAMEMAX including the null character. - */ - - sigemptyset (&old); - sigfillset (&set); - sigdelset (&set, SIGSEGV); - sigdelset (&set, SIGBUS); - sigdelset (&set, SIGILL); - sigdelset (&set, SIGSYS); - sigdelset (&set, SIGFPE); - sigdelset (&set, SIGABRT); - - pthread_sigmask (SIG_BLOCK, &set, &old); - - ret = pthread_create (thread, attr, start_routine, arg); - snprintf (thread_name, sizeof(thread_name), "%s%s", - GF_THREAD_NAME_PREFIX, name); - - if (0 == ret && name) { - #ifdef GF_LINUX_HOST_OS - pthread_setname_np(*thread, thread_name); - #elif defined(__NetBSD__) - pthread_setname_np(*thread, thread_name, NULL); - #elif defined(__FreeBSD__) - pthread_set_name_np(*thread, thread_name); - #else - gf_msg (THIS->name, GF_LOG_WARNING, 0, - LG_MSG_PTHREAD_NAMING_FAILED, - "Could not set thread name: %s", - thread_name); - #endif - } +gf_thread_create(pthread_t *thread, const pthread_attr_t *attr, + void *(*start_routine)(void *), void *arg, const char *name) +{ + sigset_t set, old; + int ret; + char thread_name[GF_THREAD_NAMEMAX + GF_THREAD_NAME_PREFIX_LEN] = { + 0, + }; + /* Max name on Linux is 16 and on NetBSD is 32 + * All Gluster threads have a set prefix of gluster and hence the limit + * of 9 on GF_THREAD_NAMEMAX including the null character. + */ + + sigemptyset(&old); + sigfillset(&set); + sigdelset(&set, SIGSEGV); + sigdelset(&set, SIGBUS); + sigdelset(&set, SIGILL); + sigdelset(&set, SIGSYS); + sigdelset(&set, SIGFPE); + sigdelset(&set, SIGABRT); + + pthread_sigmask(SIG_BLOCK, &set, &old); + + ret = pthread_create(thread, attr, start_routine, arg); + snprintf(thread_name, sizeof(thread_name), "%s%s", GF_THREAD_NAME_PREFIX, + name); + + if (0 == ret && name) { +#ifdef GF_LINUX_HOST_OS + pthread_setname_np(*thread, thread_name); +#elif defined(__NetBSD__) + pthread_setname_np(*thread, thread_name, NULL); +#elif defined(__FreeBSD__) + pthread_set_name_np(*thread, thread_name); +#else + gf_msg(THIS->name, GF_LOG_WARNING, 0, LG_MSG_PTHREAD_NAMING_FAILED, + "Could not set thread name: %s", thread_name); +#endif + } - pthread_sigmask (SIG_SETMASK, &old, NULL); + pthread_sigmask(SIG_SETMASK, &old, NULL); - return ret; + return ret; } int -gf_thread_create_detached (pthread_t *thread, - void *(*start_routine)(void *), void *arg, - const char *name) +gf_thread_create_detached(pthread_t *thread, void *(*start_routine)(void *), + void *arg, const char *name) { - pthread_attr_t attr; - int ret = -1; + pthread_attr_t attr; + int ret = -1; - ret = pthread_attr_init (&attr); - if (ret) { - gf_msg (THIS->name, GF_LOG_ERROR, ret, - LG_MSG_PTHREAD_ATTR_INIT_FAILED, - "Thread attribute initialization failed"); - return -1; - } + ret = pthread_attr_init(&attr); + if (ret) { + gf_msg(THIS->name, GF_LOG_ERROR, ret, LG_MSG_PTHREAD_ATTR_INIT_FAILED, + "Thread attribute initialization failed"); + return -1; + } - pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - ret = gf_thread_create (thread, &attr, start_routine, arg, name); - if (ret) { - gf_msg (THIS->name, GF_LOG_ERROR, ret, - LG_MSG_PTHREAD_FAILED, - "Thread creation failed"); - ret = -1; - } + ret = gf_thread_create(thread, &attr, start_routine, arg, name); + if (ret) { + gf_msg(THIS->name, GF_LOG_ERROR, ret, LG_MSG_PTHREAD_FAILED, + "Thread creation failed"); + ret = -1; + } - pthread_attr_destroy (&attr); + pthread_attr_destroy(&attr); - return ret; + return ret; } int -gf_skip_header_section (int fd, int header_len) +gf_skip_header_section(int fd, int header_len) { - int ret = -1; + int ret = -1; - ret = sys_lseek (fd, header_len, SEEK_SET); - if (ret == (off_t) -1) { - gf_msg ("", GF_LOG_ERROR, 0, LG_MSG_SKIP_HEADER_FAILED, - "Failed to skip header section"); - } else { - ret = 0; - } + ret = sys_lseek(fd, header_len, SEEK_SET); + if (ret == (off_t)-1) { + gf_msg("", GF_LOG_ERROR, 0, LG_MSG_SKIP_HEADER_FAILED, + "Failed to skip header section"); + } else { + ret = 0; + } - return ret; + return ret; } /* Below function is use to check at runtime if pid is running */ gf_boolean_t -gf_is_pid_running (int pid) +gf_is_pid_running(int pid) { - char fname[32] = {0,}; + char fname[32] = { + 0, + }; - snprintf(fname, sizeof(fname), "/proc/%d/cmdline", pid); - - if (sys_access (fname , R_OK) != 0) { - return _gf_false; - } + snprintf(fname, sizeof(fname), "/proc/%d/cmdline", pid); - return _gf_true; + if (sys_access(fname, R_OK) != 0) { + return _gf_false; + } + return _gf_true; } - gf_boolean_t -gf_is_service_running (char *pidfile, int *pid) -{ - FILE *file = NULL; - gf_boolean_t running = _gf_false; - int ret = 0; - int fno = 0; - - file = fopen (pidfile, "r+"); - if (!file) { - goto out; - } - - fno = fileno (file); - ret = lockf (fno, F_TEST, 0); - if (ret == -1) { - running = _gf_true; - goto out; - } - - ret = fscanf (file, "%d", pid); - if (ret <= 0) { - gf_msg ("", GF_LOG_ERROR, errno, LG_MSG_FILE_OP_FAILED, - "Unable to read pidfile: %s", pidfile); - *pid = -1; - } - - running = gf_is_pid_running (*pid); +gf_is_service_running(char *pidfile, int *pid) +{ + FILE *file = NULL; + gf_boolean_t running = _gf_false; + int ret = 0; + int fno = 0; + + file = fopen(pidfile, "r+"); + if (!file) { + goto out; + } + + fno = fileno(file); + ret = lockf(fno, F_TEST, 0); + if (ret == -1) { + running = _gf_true; + goto out; + } + + ret = fscanf(file, "%d", pid); + if (ret <= 0) { + gf_msg("", GF_LOG_ERROR, errno, LG_MSG_FILE_OP_FAILED, + "Unable to read pidfile: %s", pidfile); + *pid = -1; + } + + running = gf_is_pid_running(*pid); out: - if (file) - fclose (file); - return running; + if (file) + fclose(file); + return running; } /* Check if the pid is > 0 */ gf_boolean_t -gf_valid_pid (const char *pid, int length) +gf_valid_pid(const char *pid, int length) { - gf_boolean_t ret = _gf_true; - pid_t value = 0; - char *end_ptr = NULL; + gf_boolean_t ret = _gf_true; + pid_t value = 0; + char *end_ptr = NULL; - if (length <= 0) { - ret = _gf_false; - goto out; - } + if (length <= 0) { + ret = _gf_false; + goto out; + } - value = strtol (pid, &end_ptr, 10); - if (value <= 0) { - ret = _gf_false; - } + value = strtol(pid, &end_ptr, 10); + if (value <= 0) { + ret = _gf_false; + } out: - return ret; + return ret; } static int -dht_is_linkfile_key (dict_t *this, char *key, data_t *value, void *data) +dht_is_linkfile_key(dict_t *this, char *key, data_t *value, void *data) { - gf_boolean_t *linkfile_key_found = NULL; + gf_boolean_t *linkfile_key_found = NULL; - if (!data) - goto out; + if (!data) + goto out; - linkfile_key_found = data; + linkfile_key_found = data; - *linkfile_key_found = _gf_true; + *linkfile_key_found = _gf_true; out: - return 0; + return 0; } - gf_boolean_t -dht_is_linkfile (struct iatt *buf, dict_t *dict) +dht_is_linkfile(struct iatt *buf, dict_t *dict) { - gf_boolean_t linkfile_key_found = _gf_false; + gf_boolean_t linkfile_key_found = _gf_false; - if (!IS_DHT_LINKFILE_MODE (buf)) - return _gf_false; + if (!IS_DHT_LINKFILE_MODE(buf)) + return _gf_false; - dict_foreach_fnmatch (dict, "*."DHT_LINKFILE_STR, dht_is_linkfile_key, - &linkfile_key_found); + dict_foreach_fnmatch(dict, "*." DHT_LINKFILE_STR, dht_is_linkfile_key, + &linkfile_key_found); - return linkfile_key_found; + return linkfile_key_found; } int -gf_check_log_format (const char *value) +gf_check_log_format(const char *value) { - int log_format = -1; + int log_format = -1; - if (!strcasecmp (value, GF_LOG_FORMAT_NO_MSG_ID)) - log_format = gf_logformat_traditional; - else if (!strcasecmp (value, GF_LOG_FORMAT_WITH_MSG_ID)) - log_format = gf_logformat_withmsgid; + if (!strcasecmp(value, GF_LOG_FORMAT_NO_MSG_ID)) + log_format = gf_logformat_traditional; + else if (!strcasecmp(value, GF_LOG_FORMAT_WITH_MSG_ID)) + log_format = gf_logformat_withmsgid; - if (log_format == -1) - gf_msg (THIS->name, GF_LOG_ERROR, 0, LG_MSG_INVALID_LOG, - "Invalid log-format. possible values are " - GF_LOG_FORMAT_NO_MSG_ID "|" GF_LOG_FORMAT_WITH_MSG_ID); + if (log_format == -1) + gf_msg( + THIS->name, GF_LOG_ERROR, 0, LG_MSG_INVALID_LOG, + "Invalid log-format. possible values are " GF_LOG_FORMAT_NO_MSG_ID + "|" GF_LOG_FORMAT_WITH_MSG_ID); - return log_format; + return log_format; } int -gf_check_logger (const char *value) +gf_check_logger(const char *value) { - int logger = -1; + int logger = -1; - if (!strcasecmp (value, GF_LOGGER_GLUSTER_LOG)) - logger = gf_logger_glusterlog; - else if (!strcasecmp (value, GF_LOGGER_SYSLOG)) - logger = gf_logger_syslog; + if (!strcasecmp(value, GF_LOGGER_GLUSTER_LOG)) + logger = gf_logger_glusterlog; + else if (!strcasecmp(value, GF_LOGGER_SYSLOG)) + logger = gf_logger_syslog; - if (logger == -1) - gf_msg (THIS->name, GF_LOG_ERROR, 0, LG_MSG_INVALID_LOG, - "Invalid logger. possible values are " - GF_LOGGER_GLUSTER_LOG "|" GF_LOGGER_SYSLOG); + if (logger == -1) + gf_msg(THIS->name, GF_LOG_ERROR, 0, LG_MSG_INVALID_LOG, + "Invalid logger. possible values are " GF_LOGGER_GLUSTER_LOG + "|" GF_LOGGER_SYSLOG); - return logger; + return logger; } /* gf_compare_sockaddr compares the given addresses @addr1 and @addr2 for @@ -4187,30 +4172,28 @@ gf_check_logger (const char *value) * https://www.opensource.apple.com/source/postfix/postfix-197/postfix/src/util/sock_addr.c */ gf_boolean_t -gf_compare_sockaddr (const struct sockaddr *addr1, - const struct sockaddr *addr2) +gf_compare_sockaddr(const struct sockaddr *addr1, const struct sockaddr *addr2) { - GF_ASSERT (addr1 != NULL); - GF_ASSERT (addr2 != NULL); - - /* Obviously, the addresses don't match if their families are different - */ - if (addr1->sa_family != addr2->sa_family) - return _gf_false; + GF_ASSERT(addr1 != NULL); + GF_ASSERT(addr2 != NULL); + /* Obviously, the addresses don't match if their families are different + */ + if (addr1->sa_family != addr2->sa_family) + return _gf_false; - if (AF_INET == addr1->sa_family) { - if (((struct sockaddr_in *)addr1)->sin_addr.s_addr == - ((struct sockaddr_in *)addr2)->sin_addr.s_addr) - return _gf_true; + if (AF_INET == addr1->sa_family) { + if (((struct sockaddr_in *)addr1)->sin_addr.s_addr == + ((struct sockaddr_in *)addr2)->sin_addr.s_addr) + return _gf_true; - } else if (AF_INET6 == addr1->sa_family) { - if (memcmp ((char *)&((struct sockaddr_in6 *)addr1)->sin6_addr, - (char *)&((struct sockaddr_in6 *)addr2)->sin6_addr, - sizeof (struct in6_addr)) == 0) - return _gf_true; - } - return _gf_false; + } else if (AF_INET6 == addr1->sa_family) { + if (memcmp((char *)&((struct sockaddr_in6 *)addr1)->sin6_addr, + (char *)&((struct sockaddr_in6 *)addr2)->sin6_addr, + sizeof(struct in6_addr)) == 0) + return _gf_true; + } + return _gf_false; } /* @@ -4219,155 +4202,168 @@ gf_compare_sockaddr (const struct sockaddr *addr1, */ int -gf_set_timestamp (const char *src, const char* dest) +gf_set_timestamp(const char *src, const char *dest) { - struct stat sb = {0, }; + struct stat sb = { + 0, + }; #if defined(HAVE_UTIMENSAT) - struct timespec new_time[2] = { {0, }, {0, } }; + struct timespec new_time[2] = {{ + 0, + }, + { + 0, + }}; #else - struct timeval new_time[2] = { {0, }, {0, } }; + struct timeval new_time[2] = {{ + 0, + }, + { + 0, + }}; #endif - int ret = 0; - xlator_t *this = NULL; - - this = THIS; - GF_ASSERT (this); - GF_ASSERT (src); - GF_ASSERT (dest); - - ret = sys_stat (src, &sb); - if (ret) { - gf_msg (this->name, GF_LOG_ERROR, errno, - LG_MSG_FILE_STAT_FAILED, "stat on %s", src); - goto out; - } - /* The granularity is nano seconds if `utimensat()` is available, - * and micro seconds otherwise. - */ + int ret = 0; + xlator_t *this = NULL; + + this = THIS; + GF_ASSERT(this); + GF_ASSERT(src); + GF_ASSERT(dest); + + ret = sys_stat(src, &sb); + if (ret) { + gf_msg(this->name, GF_LOG_ERROR, errno, LG_MSG_FILE_STAT_FAILED, + "stat on %s", src); + goto out; + } + /* The granularity is nano seconds if `utimensat()` is available, + * and micro seconds otherwise. + */ #if defined(HAVE_UTIMENSAT) - new_time[0].tv_sec = sb.st_atime; - new_time[0].tv_nsec = ST_ATIM_NSEC (&sb); - - new_time[1].tv_sec = sb.st_mtime; - new_time[1].tv_nsec = ST_MTIM_NSEC (&sb); - - /* dirfd = 0 is ignored because `dest` is an absolute path. */ - ret = sys_utimensat (AT_FDCWD, dest, new_time, AT_SYMLINK_NOFOLLOW); - if (ret) { - gf_msg (this->name, GF_LOG_ERROR, errno, - LG_MSG_UTIMENSAT_FAILED, "utimensat on %s", dest); - } + new_time[0].tv_sec = sb.st_atime; + new_time[0].tv_nsec = ST_ATIM_NSEC(&sb); + + new_time[1].tv_sec = sb.st_mtime; + new_time[1].tv_nsec = ST_MTIM_NSEC(&sb); + + /* dirfd = 0 is ignored because `dest` is an absolute path. */ + ret = sys_utimensat(AT_FDCWD, dest, new_time, AT_SYMLINK_NOFOLLOW); + if (ret) { + gf_msg(this->name, GF_LOG_ERROR, errno, LG_MSG_UTIMENSAT_FAILED, + "utimensat on %s", dest); + } #else - new_time[0].tv_sec = sb.st_atime; - new_time[0].tv_usec = ST_ATIM_NSEC (&sb)/1000; + new_time[0].tv_sec = sb.st_atime; + new_time[0].tv_usec = ST_ATIM_NSEC(&sb) / 1000; - new_time[1].tv_sec = sb.st_mtime; - new_time[1].tv_usec = ST_MTIM_NSEC (&sb)/1000; + new_time[1].tv_sec = sb.st_mtime; + new_time[1].tv_usec = ST_MTIM_NSEC(&sb) / 1000; - ret = sys_utimes (dest, new_time); - if (ret) { - gf_msg (this->name, GF_LOG_ERROR, errno, LG_MSG_UTIMES_FAILED, - "utimes on %s", dest); - } + ret = sys_utimes(dest, new_time); + if (ret) { + gf_msg(this->name, GF_LOG_ERROR, errno, LG_MSG_UTIMES_FAILED, + "utimes on %s", dest); + } #endif out: - return ret; + return ret; } static void -gf_backtrace_end (char *buf, size_t frames) +gf_backtrace_end(char *buf, size_t frames) { - size_t pos = 0; + size_t pos = 0; - if (!buf) - return; + if (!buf) + return; - pos = strlen (buf); + pos = strlen(buf); - frames = min(frames, GF_BACKTRACE_LEN - pos -1); + frames = min(frames, GF_BACKTRACE_LEN - pos - 1); - if (frames <= 0) - return; + if (frames <= 0) + return; - memset (buf+pos, ')', frames); - buf[pos+frames] = '\0'; + memset(buf + pos, ')', frames); + buf[pos + frames] = '\0'; } /*Returns bytes written*/ static int -gf_backtrace_append (char *buf, size_t pos, char *framestr) +gf_backtrace_append(char *buf, size_t pos, char *framestr) { - if (pos >= GF_BACKTRACE_LEN) - return -1; - return snprintf (buf+pos, GF_BACKTRACE_LEN-pos, "(--> %s ", framestr); + if (pos >= GF_BACKTRACE_LEN) + return -1; + return snprintf(buf + pos, GF_BACKTRACE_LEN - pos, "(--> %s ", framestr); } static int -gf_backtrace_fillframes (char *buf) -{ - void *array[GF_BACKTRACE_FRAME_COUNT]; - size_t frames = 0; - FILE *fp = NULL; - char callingfn[GF_BACKTRACE_FRAME_COUNT-2][1024] = {{0},}; - int ret = -1; - int fd = -1; - size_t idx = 0; - size_t pos = 0; - size_t inc = 0; - char tmpl[] = "/tmp/glfs-bt-XXXXXX"; - - frames = backtrace (array, GF_BACKTRACE_FRAME_COUNT); - if (!frames) - return -1; - - /* coverity[secure_temp] mkstemp uses 0600 as the mode and is safe */ - fd = mkstemp (tmpl); - if (fd == -1) - return -1; - - /* Calling unlink so that when the file is closed or program - * terminates the temporary file is deleted. - */ - ret = sys_unlink (tmpl); - if (ret < 0) { - gf_msg (THIS->name, GF_LOG_INFO, 0, LG_MSG_FILE_OP_FAILED, - "Unable to delete temporary file: %s", tmpl); - } - - /*The most recent two frames are the calling function and - * gf_backtrace_save, which we can infer.*/ - - backtrace_symbols_fd (&array[2], frames-2, fd); - - fp = fdopen (fd, "r"); - if (!fp) { - sys_close (fd); - ret = -1; - goto out; - } +gf_backtrace_fillframes(char *buf) +{ + void *array[GF_BACKTRACE_FRAME_COUNT]; + size_t frames = 0; + FILE *fp = NULL; + char callingfn[GF_BACKTRACE_FRAME_COUNT - 2][1024] = { + {0}, + }; + int ret = -1; + int fd = -1; + size_t idx = 0; + size_t pos = 0; + size_t inc = 0; + char tmpl[] = "/tmp/glfs-bt-XXXXXX"; + + frames = backtrace(array, GF_BACKTRACE_FRAME_COUNT); + if (!frames) + return -1; - ret = fseek (fp, 0L, SEEK_SET); - if (ret) - goto out; + /* coverity[secure_temp] mkstemp uses 0600 as the mode and is safe */ + fd = mkstemp(tmpl); + if (fd == -1) + return -1; - pos = 0; - for (idx = 0; idx < frames - 2; idx++) { - ret = fscanf (fp, "%s", callingfn[idx]); - if (ret == EOF) - break; - inc = gf_backtrace_append (buf, pos, callingfn[idx]); - if (inc == -1) - break; - pos += inc; - } - gf_backtrace_end (buf, idx); + /* Calling unlink so that when the file is closed or program + * terminates the temporary file is deleted. + */ + ret = sys_unlink(tmpl); + if (ret < 0) { + gf_msg(THIS->name, GF_LOG_INFO, 0, LG_MSG_FILE_OP_FAILED, + "Unable to delete temporary file: %s", tmpl); + } + + /*The most recent two frames are the calling function and + * gf_backtrace_save, which we can infer.*/ + + backtrace_symbols_fd(&array[2], frames - 2, fd); + + fp = fdopen(fd, "r"); + if (!fp) { + sys_close(fd); + ret = -1; + goto out; + } + + ret = fseek(fp, 0L, SEEK_SET); + if (ret) + goto out; + + pos = 0; + for (idx = 0; idx < frames - 2; idx++) { + ret = fscanf(fp, "%s", callingfn[idx]); + if (ret == EOF) + break; + inc = gf_backtrace_append(buf, pos, callingfn[idx]); + if (inc == -1) + break; + pos += inc; + } + gf_backtrace_end(buf, idx); out: - if (fp) - fclose (fp); - - return (idx > 0)? 0: -1; + if (fp) + fclose(fp); + return (idx > 0) ? 0 : -1; } /* Optionally takes @buf to save backtrace. If @buf is NULL, uses the @@ -4378,72 +4374,66 @@ out: * when there is a real-use for that.*/ char * -gf_backtrace_save (char *buf) +gf_backtrace_save(char *buf) { - char *bt = NULL; - - if (!buf) { - bt = THIS->ctx->btbuf; - GF_ASSERT (bt); + char *bt = NULL; - } else { - bt = buf; + if (!buf) { + bt = THIS->ctx->btbuf; + GF_ASSERT(bt); - } + } else { + bt = buf; + } - if ((0 == gf_backtrace_fillframes (bt))) - return bt; + if ((0 == gf_backtrace_fillframes(bt))) + return bt; - gf_msg (THIS->name, GF_LOG_WARNING, 0, LG_MSG_BACKTRACE_SAVE_FAILED, - "Failed to save the backtrace."); - return NULL; + gf_msg(THIS->name, GF_LOG_WARNING, 0, LG_MSG_BACKTRACE_SAVE_FAILED, + "Failed to save the backtrace."); + return NULL; } gf_loglevel_t -fop_log_level (glusterfs_fop_t fop, int op_errno) -{ - /* if gfid doesn't exist ESTALE comes */ - if (op_errno == ENOENT || op_errno == ESTALE) - return GF_LOG_DEBUG; - - if ((fop == GF_FOP_ENTRYLK) || - (fop == GF_FOP_FENTRYLK) || - (fop == GF_FOP_FINODELK) || - (fop == GF_FOP_INODELK) || - (fop == GF_FOP_LK)) { - /* - * if non-blocking lock fails EAGAIN comes - * if locks xlator is not loaded ENOSYS comes - */ - if (op_errno == EAGAIN || op_errno == ENOSYS) - return GF_LOG_DEBUG; - } +fop_log_level(glusterfs_fop_t fop, int op_errno) +{ + /* if gfid doesn't exist ESTALE comes */ + if (op_errno == ENOENT || op_errno == ESTALE) + return GF_LOG_DEBUG; - if ((fop == GF_FOP_GETXATTR) || - (fop == GF_FOP_FGETXATTR)) { - if (op_errno == ENOTSUP || op_errno == ENODATA) - return GF_LOG_DEBUG; - } + if ((fop == GF_FOP_ENTRYLK) || (fop == GF_FOP_FENTRYLK) || + (fop == GF_FOP_FINODELK) || (fop == GF_FOP_INODELK) || + (fop == GF_FOP_LK)) { + /* + * if non-blocking lock fails EAGAIN comes + * if locks xlator is not loaded ENOSYS comes + */ + if (op_errno == EAGAIN || op_errno == ENOSYS) + return GF_LOG_DEBUG; + } - if ((fop == GF_FOP_SETXATTR) || - (fop == GF_FOP_FSETXATTR) || - (fop == GF_FOP_REMOVEXATTR) || - (fop == GF_FOP_FREMOVEXATTR)) { - if (op_errno == ENOTSUP) - return GF_LOG_DEBUG; - } + if ((fop == GF_FOP_GETXATTR) || (fop == GF_FOP_FGETXATTR)) { + if (op_errno == ENOTSUP || op_errno == ENODATA) + return GF_LOG_DEBUG; + } + + if ((fop == GF_FOP_SETXATTR) || (fop == GF_FOP_FSETXATTR) || + (fop == GF_FOP_REMOVEXATTR) || (fop == GF_FOP_FREMOVEXATTR)) { + if (op_errno == ENOTSUP) + return GF_LOG_DEBUG; + } - if (fop == GF_FOP_MKNOD || fop == GF_FOP_MKDIR) - if (op_errno == EEXIST) - return GF_LOG_DEBUG; + if (fop == GF_FOP_MKNOD || fop == GF_FOP_MKDIR) + if (op_errno == EEXIST) + return GF_LOG_DEBUG; - if (fop == GF_FOP_SEEK) { - if (op_errno == ENXIO) { - return GF_LOG_DEBUG; - } + if (fop == GF_FOP_SEEK) { + if (op_errno == ENXIO) { + return GF_LOG_DEBUG; } + } - return GF_LOG_ERROR; + return GF_LOG_ERROR; } /* This function will build absolute path of file/directory from the @@ -4461,116 +4451,115 @@ fop_log_level (glusterfs_fop_t fop, int op_errno) */ int32_t -gf_build_absolute_path (char *current_path, char *relative_path, char **path) -{ - char *absolute_path = NULL; - char *token = NULL; - char *component = NULL; - char *saveptr = NULL; - char *end = NULL; - int ret = 0; - size_t relativepath_len = 0; - size_t currentpath_len = 0; - size_t max_absolutepath_len = 0; - - GF_ASSERT (current_path); - GF_ASSERT (relative_path); - GF_ASSERT (path); - - if (!path || !current_path || !relative_path) { - ret = -EFAULT; - goto err; - } - /* Check for current and relative path - * current path should be absolute one and start from '/' - * relative path should not start from '/' - */ - currentpath_len = strlen (current_path); - if (current_path[0] != '/' || (currentpath_len > PATH_MAX)) { - gf_msg (THIS->name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, - "Wrong value for current path %s", current_path); - ret = -EINVAL; - goto err; - } - - relativepath_len = strlen (relative_path); - if (relative_path[0] == '/' || (relativepath_len > PATH_MAX)) { - gf_msg (THIS->name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, - "Wrong value for relative path %s", relative_path); - ret = -EINVAL; +gf_build_absolute_path(char *current_path, char *relative_path, char **path) +{ + char *absolute_path = NULL; + char *token = NULL; + char *component = NULL; + char *saveptr = NULL; + char *end = NULL; + int ret = 0; + size_t relativepath_len = 0; + size_t currentpath_len = 0; + size_t max_absolutepath_len = 0; + + GF_ASSERT(current_path); + GF_ASSERT(relative_path); + GF_ASSERT(path); + + if (!path || !current_path || !relative_path) { + ret = -EFAULT; + goto err; + } + /* Check for current and relative path + * current path should be absolute one and start from '/' + * relative path should not start from '/' + */ + currentpath_len = strlen(current_path); + if (current_path[0] != '/' || (currentpath_len > PATH_MAX)) { + gf_msg(THIS->name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, + "Wrong value for current path %s", current_path); + ret = -EINVAL; + goto err; + } + + relativepath_len = strlen(relative_path); + if (relative_path[0] == '/' || (relativepath_len > PATH_MAX)) { + gf_msg(THIS->name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, + "Wrong value for relative path %s", relative_path); + ret = -EINVAL; + goto err; + } + + /* It is maximum possible value for absolute path */ + max_absolutepath_len = currentpath_len + relativepath_len + 2; + + absolute_path = GF_CALLOC(1, max_absolutepath_len, gf_common_mt_char); + if (!absolute_path) { + ret = -ENOMEM; + goto err; + } + absolute_path[0] = '\0'; + + /* If current path is root i.e contains only "/", we do not + * need to copy it + */ + if (strcmp(current_path, "/") != 0) { + strcpy(absolute_path, current_path); + + /* We trim '/' at the end for easier string manipulation */ + gf_path_strip_trailing_slashes(absolute_path); + } + + /* Used to spilt relative path based on '/' */ + component = gf_strdup(relative_path); + if (!component) { + ret = -ENOMEM; + goto err; + } + + /* In the relative path, we want to consider ".." and "." + * if token is ".." , we just need to reduce one level hierarchy + * if token is "." , we just ignore it + * if token is NULL , end of relative path + * if absolute path becomes '\0' and still "..", then it is a bad + * relative path, it points to out of boundary area and stop + * building the absolute path + * All other cases we just concatenate token to the absolute path + */ + for (token = strtok_r(component, "/", &saveptr), + end = strchr(absolute_path, '\0'); + token; token = strtok_r(NULL, "/", &saveptr)) { + if (strcmp(token, ".") == 0) + continue; + + else if (strcmp(token, "..") == 0) { + if (absolute_path[0] == '\0') { + ret = -EACCES; goto err; - } - - /* It is maximum possible value for absolute path */ - max_absolutepath_len = currentpath_len + relativepath_len + 2; - - absolute_path = GF_CALLOC (1, max_absolutepath_len, gf_common_mt_char); - if (!absolute_path) { - ret = -ENOMEM; - goto err; - } - absolute_path[0] = '\0'; - - /* If current path is root i.e contains only "/", we do not - * need to copy it - */ - if (strcmp (current_path, "/") != 0) { - strcpy (absolute_path, current_path); - - /* We trim '/' at the end for easier string manipulation */ - gf_path_strip_trailing_slashes (absolute_path); - } - - /* Used to spilt relative path based on '/' */ - component = gf_strdup (relative_path); - if (!component) { - ret = -ENOMEM; - goto err; - } + } - /* In the relative path, we want to consider ".." and "." - * if token is ".." , we just need to reduce one level hierarchy - * if token is "." , we just ignore it - * if token is NULL , end of relative path - * if absolute path becomes '\0' and still "..", then it is a bad - * relative path, it points to out of boundary area and stop - * building the absolute path - * All other cases we just concatenate token to the absolute path - */ - for (token = strtok_r (component, "/", &saveptr), - end = strchr (absolute_path, '\0'); token; - token = strtok_r (NULL, "/", &saveptr)) { - if (strcmp (token, ".") == 0) - continue; - - else if (strcmp (token, "..") == 0) { - - if (absolute_path[0] == '\0') { - ret = -EACCES; - goto err; - } - - end = strrchr (absolute_path, '/'); - *end = '\0'; - } else { - ret = snprintf (end, max_absolutepath_len - - strlen (absolute_path), "/%s", token); - end = strchr (absolute_path , '\0'); - } + end = strrchr(absolute_path, '/'); + *end = '\0'; + } else { + ret = snprintf(end, max_absolutepath_len - strlen(absolute_path), + "/%s", token); + end = strchr(absolute_path, '\0'); } + } - if (strlen (absolute_path) > PATH_MAX) { - ret = -EINVAL; - goto err; - } - *path = gf_strdup (absolute_path); + if (strlen(absolute_path) > PATH_MAX) { + ret = -EINVAL; + goto err; + } + *path = gf_strdup(absolute_path); err: - if (component) - GF_FREE (component); - if (absolute_path) - GF_FREE (absolute_path); - return ret; + if (component) + GF_FREE(component); + if (absolute_path) + GF_FREE(absolute_path); + return ret; } /* This is an utility function which will recursively delete @@ -4581,69 +4570,85 @@ err: * @return 0 on success and -1 on failure. */ int -recursive_rmdir (const char *delete_path) -{ - int ret = -1; - char path[PATH_MAX] = {0,}; - struct stat st = {0,}; - DIR *dir = NULL; - struct dirent *entry = NULL; - struct dirent scratch[2] = {{0,},}; - xlator_t *this = NULL; - - this = THIS; - GF_ASSERT (this); - GF_VALIDATE_OR_GOTO (this->name, delete_path, out); - - dir = sys_opendir (delete_path); - if (!dir) { - gf_msg_debug (this->name, 0, "Failed to open directory %s. " - "Reason : %s", delete_path, strerror (errno)); - ret = 0; - goto out; - } +recursive_rmdir(const char *delete_path) +{ + int ret = -1; + char path[PATH_MAX] = { + 0, + }; + struct stat st = { + 0, + }; + DIR *dir = NULL; + struct dirent *entry = NULL; + struct dirent scratch[2] = { + { + 0, + }, + }; + xlator_t *this = NULL; + + this = THIS; + GF_ASSERT(this); + GF_VALIDATE_OR_GOTO(this->name, delete_path, out); + + dir = sys_opendir(delete_path); + if (!dir) { + gf_msg_debug(this->name, 0, + "Failed to open directory %s. " + "Reason : %s", + delete_path, strerror(errno)); + ret = 0; + goto out; + } - GF_SKIP_IRRELEVANT_ENTRIES (entry, dir, scratch); - while (entry) { - snprintf (path, PATH_MAX, "%s/%s", delete_path, entry->d_name); - ret = sys_lstat (path, &st); - if (ret == -1) { - gf_msg_debug (this->name, 0, "Failed to stat entry %s :" - " %s", path, strerror (errno)); - (void) sys_closedir (dir); - goto out; - } - - if (S_ISDIR (st.st_mode)) - ret = recursive_rmdir (path); - else - ret = sys_unlink (path); - - if (ret) { - gf_msg_debug (this->name, 0, " Failed to remove %s. " - "Reason : %s", path, strerror (errno)); - } - - gf_msg_debug (this->name, 0, "%s %s", ret ? - "Failed to remove" : "Removed", entry->d_name); - - GF_SKIP_IRRELEVANT_ENTRIES (entry, dir, scratch); + GF_SKIP_IRRELEVANT_ENTRIES(entry, dir, scratch); + while (entry) { + snprintf(path, PATH_MAX, "%s/%s", delete_path, entry->d_name); + ret = sys_lstat(path, &st); + if (ret == -1) { + gf_msg_debug(this->name, 0, + "Failed to stat entry %s :" + " %s", + path, strerror(errno)); + (void)sys_closedir(dir); + goto out; } - ret = sys_closedir (dir); - if (ret) { - gf_msg_debug (this->name, 0, "Failed to close dir %s. Reason :" - " %s", delete_path, strerror (errno)); - } + if (S_ISDIR(st.st_mode)) + ret = recursive_rmdir(path); + else + ret = sys_unlink(path); - ret = sys_rmdir (delete_path); if (ret) { - gf_msg_debug (this->name, 0, "Failed to rmdir: %s,err: %s", - delete_path, strerror (errno)); + gf_msg_debug(this->name, 0, + " Failed to remove %s. " + "Reason : %s", + path, strerror(errno)); } + gf_msg_debug(this->name, 0, "%s %s", + ret ? "Failed to remove" : "Removed", entry->d_name); + + GF_SKIP_IRRELEVANT_ENTRIES(entry, dir, scratch); + } + + ret = sys_closedir(dir); + if (ret) { + gf_msg_debug(this->name, 0, + "Failed to close dir %s. Reason :" + " %s", + delete_path, strerror(errno)); + } + + ret = sys_rmdir(delete_path); + if (ret) { + gf_msg_debug(this->name, 0, "Failed to rmdir: %s,err: %s", delete_path, + strerror(errno)); + } + out: - return ret; + return ret; } /* * Input: Array of strings 'array' terminating in NULL @@ -4652,197 +4657,198 @@ out: * Output: Index of the element in the array if found, '-1' otherwise */ int -gf_get_index_by_elem (char **array, char *elem) +gf_get_index_by_elem(char **array, char *elem) { - int i = 0; + int i = 0; - for (i = 0; array[i]; i++) { - if (strcmp (elem, array[i]) == 0) - return i; - } + for (i = 0; array[i]; i++) { + if (strcmp(elem, array[i]) == 0) + return i; + } - return -1; + return -1; } static int -get_pathinfo_host (char *pathinfo, char *hostname, size_t size) +get_pathinfo_host(char *pathinfo, char *hostname, size_t size) { - char *start = NULL; - char *end = NULL; - int ret = -1; - int i = 0; + char *start = NULL; + char *end = NULL; + int ret = -1; + int i = 0; - if (!pathinfo) - goto out; + if (!pathinfo) + goto out; - start = strchr (pathinfo, ':'); - if (!start) - goto out; + start = strchr(pathinfo, ':'); + if (!start) + goto out; - end = strrchr (pathinfo, ':'); - if (start == end) - goto out; + end = strrchr(pathinfo, ':'); + if (start == end) + goto out; - memset (hostname, 0, size); - i = 0; - while (++start != end) - hostname[i++] = *start; - ret = 0; + memset(hostname, 0, size); + i = 0; + while (++start != end) + hostname[i++] = *start; + ret = 0; out: - return ret; + return ret; } /*Note: 'pathinfo' should be gathered only from one brick*/ int -glusterfs_is_local_pathinfo (char *pathinfo, gf_boolean_t *is_local) +glusterfs_is_local_pathinfo(char *pathinfo, gf_boolean_t *is_local) { - int ret = 0; - char pathinfohost[1024] = {0}; - char localhost[1024] = {0}; + int ret = 0; + char pathinfohost[1024] = {0}; + char localhost[1024] = {0}; - *is_local = _gf_false; - ret = get_pathinfo_host (pathinfo, pathinfohost, sizeof (pathinfohost)); - if (ret) - goto out; + *is_local = _gf_false; + ret = get_pathinfo_host(pathinfo, pathinfohost, sizeof(pathinfohost)); + if (ret) + goto out; - ret = gethostname (localhost, sizeof (localhost)); - if (ret) - goto out; + ret = gethostname(localhost, sizeof(localhost)); + if (ret) + goto out; - if (!strcmp (localhost, pathinfohost)) - *is_local = _gf_true; + if (!strcmp(localhost, pathinfohost)) + *is_local = _gf_true; out: - return ret; + return ret; } ssize_t -gf_nread (int fd, void *buf, size_t count) -{ - ssize_t ret = 0; - ssize_t read_bytes = 0; - - for (read_bytes = 0; read_bytes < count; read_bytes += ret) { - ret = sys_read (fd, buf + read_bytes, count - read_bytes); - if (ret == 0) { - break; - } else if (ret < 0) { - if (errno == EINTR) - ret = 0; - else - goto out; - } +gf_nread(int fd, void *buf, size_t count) +{ + ssize_t ret = 0; + ssize_t read_bytes = 0; + + for (read_bytes = 0; read_bytes < count; read_bytes += ret) { + ret = sys_read(fd, buf + read_bytes, count - read_bytes); + if (ret == 0) { + break; + } else if (ret < 0) { + if (errno == EINTR) + ret = 0; + else + goto out; } + } - ret = read_bytes; + ret = read_bytes; out: - return ret; + return ret; } ssize_t -gf_nwrite (int fd, const void *buf, size_t count) -{ - ssize_t ret = 0; - ssize_t written = 0; - - for (written = 0; written != count; written += ret) { - ret = sys_write (fd, buf + written, count - written); - if (ret < 0) { - if (errno == EINTR) - ret = 0; - else - goto out; - } +gf_nwrite(int fd, const void *buf, size_t count) +{ + ssize_t ret = 0; + ssize_t written = 0; + + for (written = 0; written != count; written += ret) { + ret = sys_write(fd, buf + written, count - written); + if (ret < 0) { + if (errno == EINTR) + ret = 0; + else + goto out; } + } - ret = written; + ret = written; out: - return ret; + return ret; } void -gf_free_mig_locks (lock_migration_info_t *locks) +gf_free_mig_locks(lock_migration_info_t *locks) { - lock_migration_info_t *current = NULL; - lock_migration_info_t *temp = NULL; + lock_migration_info_t *current = NULL; + lock_migration_info_t *temp = NULL; - if (!locks) - return; + if (!locks) + return; - if (list_empty (&locks->list)) - return; + if (list_empty(&locks->list)) + return; - list_for_each_entry_safe (current, temp, &locks->list, list) { - list_del_init (¤t->list); - GF_FREE (current->client_uid); - GF_FREE (current); - } + list_for_each_entry_safe(current, temp, &locks->list, list) + { + list_del_init(¤t->list); + GF_FREE(current->client_uid); + GF_FREE(current); + } } void -_mask_cancellation (void) +_mask_cancellation(void) { - (void) pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, NULL); + (void)pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); } void -_unmask_cancellation (void) +_unmask_cancellation(void) { - (void) pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL); + (void)pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); } /* This is a wrapper function to add a pointer to a list, * which doesn't contain list member */ -struct list_node* -_list_node_add (void *ptr, struct list_head *list, +struct list_node * +_list_node_add(void *ptr, struct list_head *list, int (*compare)(struct list_head *, struct list_head *)) { - struct list_node *node = NULL; + struct list_node *node = NULL; - if (ptr == NULL || list == NULL) - goto out; + if (ptr == NULL || list == NULL) + goto out; - node = GF_CALLOC (1, sizeof (struct list_node), gf_common_list_node); + node = GF_CALLOC(1, sizeof(struct list_node), gf_common_list_node); - if (node == NULL) - goto out; + if (node == NULL) + goto out; - node->ptr = ptr; - if (compare) - list_add_order (&node->list, list, compare); - else - list_add_tail (&node->list, list); + node->ptr = ptr; + if (compare) + list_add_order(&node->list, list, compare); + else + list_add_tail(&node->list, list); out: - return node; + return node; } -struct list_node* -list_node_add (void *ptr, struct list_head *list) +struct list_node * +list_node_add(void *ptr, struct list_head *list) { - return _list_node_add (ptr, list, NULL); + return _list_node_add(ptr, list, NULL); } -struct list_node* -list_node_add_order (void *ptr, struct list_head *list, - int (*compare)(struct list_head *, struct list_head *)) +struct list_node * +list_node_add_order(void *ptr, struct list_head *list, + int (*compare)(struct list_head *, struct list_head *)) { - return _list_node_add (ptr, list, compare); + return _list_node_add(ptr, list, compare); } void -list_node_del (struct list_node *node) +list_node_del(struct list_node *node) { - if (node == NULL) - return; + if (node == NULL) + return; - list_del_init (&node->list); - GF_FREE (node); + list_del_init(&node->list); + GF_FREE(node); } const char * -fop_enum_to_pri_string (glusterfs_fop_t fop) +fop_enum_to_pri_string(glusterfs_fop_t fop) { - switch (fop) { + switch (fop) { case GF_FOP_OPEN: case GF_FOP_STAT: case GF_FOP_FSTAT: @@ -4857,7 +4863,7 @@ fop_enum_to_pri_string (glusterfs_fop_t fop) case GF_FOP_SETACTIVELK: case GF_FOP_ICREATE: case GF_FOP_NAMELINK: - return "HIGH"; + return "HIGH"; case GF_FOP_CREATE: case GF_FOP_FLUSH: @@ -4883,7 +4889,7 @@ fop_enum_to_pri_string (glusterfs_fop_t fop) case GF_FOP_FREMOVEXATTR: case GF_FOP_IPC: case GF_FOP_LEASE: - return "NORMAL"; + return "NORMAL"; case GF_FOP_READ: case GF_FOP_WRITE: @@ -4897,7 +4903,7 @@ fop_enum_to_pri_string (glusterfs_fop_t fop) case GF_FOP_ZEROFILL: case GF_FOP_FALLOCATE: case GF_FOP_SEEK: - return "LOW"; + return "LOW"; case GF_FOP_NULL: case GF_FOP_FORGET: @@ -4906,187 +4912,184 @@ fop_enum_to_pri_string (glusterfs_fop_t fop) case GF_FOP_GETSPEC: case GF_FOP_MAXVALUE: case GF_FOP_DISCARD: - return "LEAST"; + return "LEAST"; default: - return "UNKNOWN"; - } + return "UNKNOWN"; + } } const char * -gf_inode_type_to_str (ia_type_t type) +gf_inode_type_to_str(ia_type_t type) { - static const char *const str_ia_type[] = { - "UNKNOWN", - "REGULAR FILE", - "DIRECTORY", - "LINK", - "BLOCK DEVICE", - "CHARACTER DEVICE", - "PIPE", - "SOCKET"}; - return str_ia_type[type]; + static const char *const str_ia_type[] = { + "UNKNOWN", "REGULAR FILE", "DIRECTORY", "LINK", + "BLOCK DEVICE", "CHARACTER DEVICE", "PIPE", "SOCKET"}; + return str_ia_type[type]; } gf_boolean_t -gf_is_zero_filled_stat (struct iatt *buf) +gf_is_zero_filled_stat(struct iatt *buf) { - if (!buf) - return 1; + if (!buf) + return 1; - /* Do not use st_dev because it is transformed to store the xlator id - * in place of the device number. Do not use st_ino because by this time - * we've already mapped the root ino to 1 so it is not guaranteed to be - * 0. - */ - if ((buf->ia_nlink == 0) && (buf->ia_ctime == 0)) - return 1; + /* Do not use st_dev because it is transformed to store the xlator id + * in place of the device number. Do not use st_ino because by this time + * we've already mapped the root ino to 1 so it is not guaranteed to be + * 0. + */ + if ((buf->ia_nlink == 0) && (buf->ia_ctime == 0)) + return 1; - return 0; + return 0; } void -gf_zero_fill_stat (struct iatt *buf) +gf_zero_fill_stat(struct iatt *buf) { - buf->ia_nlink = 0; - buf->ia_ctime = 0; + buf->ia_nlink = 0; + buf->ia_ctime = 0; } gf_boolean_t -gf_is_valid_xattr_namespace (char *key) +gf_is_valid_xattr_namespace(char *key) { - static char *xattr_namespaces[] = {"trusted.", "security.", "system.", - "user.", NULL }; - int i = 0; + static char *xattr_namespaces[] = {"trusted.", "security.", "system.", + "user.", NULL}; + int i = 0; - for (i = 0; xattr_namespaces[i]; i++) { - if (strncmp (key, xattr_namespaces[i], - strlen (xattr_namespaces[i])) == 0) - return _gf_true; - } + for (i = 0; xattr_namespaces[i]; i++) { + if (strncmp(key, xattr_namespaces[i], strlen(xattr_namespaces[i])) == 0) + return _gf_true; + } - return _gf_false; + return _gf_false; } ino_t -gfid_to_ino (uuid_t gfid) +gfid_to_ino(uuid_t gfid) { - ino_t ino = 0; - int32_t i; + ino_t ino = 0; + int32_t i; - for (i = 8; i < 16; i++) { - ino <<= 8; - ino += (uint8_t)gfid[i]; - } + for (i = 8; i < 16; i++) { + ino <<= 8; + ino += (uint8_t)gfid[i]; + } - return ino; + return ino; } int -gf_bits_count (uint64_t n) +gf_bits_count(uint64_t n) { - int val = 0; + int val = 0; #if defined(__GNUC__) || defined(__clang__) - val = __builtin_popcountll (n); + val = __builtin_popcountll(n); #else - n -= (n >> 1) & 0x5555555555555555ULL; - n = ((n >> 2) & 0x3333333333333333ULL) + (n & 0x3333333333333333ULL); - n = (n + (n >> 4)) & 0x0F0F0F0F0F0F0F0FULL; - n += n >> 8; - n += n >> 16; - n += n >> 32; - val = n & 0xFF; + n -= (n >> 1) & 0x5555555555555555ULL; + n = ((n >> 2) & 0x3333333333333333ULL) + (n & 0x3333333333333333ULL); + n = (n + (n >> 4)) & 0x0F0F0F0F0F0F0F0FULL; + n += n >> 8; + n += n >> 16; + n += n >> 32; + val = n & 0xFF; #endif - return val; + return val; } int -gf_bits_index (uint64_t n) +gf_bits_index(uint64_t n) { #if defined(__GNUC__) || defined(__clang__) - return __builtin_ffsll (n) - 1; + return __builtin_ffsll(n) - 1; #else - return ffsll (n) - 1; + return ffsll(n) - 1; #endif } -const char* -gf_fop_string (glusterfs_fop_t fop) +const char * +gf_fop_string(glusterfs_fop_t fop) { - if ((fop > GF_FOP_NULL) && (fop < GF_FOP_MAXVALUE)) - return gf_fop_list[fop]; - return "INVALID"; + if ((fop > GF_FOP_NULL) && (fop < GF_FOP_MAXVALUE)) + return gf_fop_list[fop]; + return "INVALID"; } int -gf_fop_int (char *fop) +gf_fop_int(char *fop) { - int i = 0; + int i = 0; - for (i = GF_FOP_NULL + 1; i < GF_FOP_MAXVALUE; i++) { - if (strcasecmp (fop, gf_fop_list[i]) == 0) - return i; - } - return -1; + for (i = GF_FOP_NULL + 1; i < GF_FOP_MAXVALUE; i++) { + if (strcasecmp(fop, gf_fop_list[i]) == 0) + return i; + } + return -1; } int -close_fds_except (int *fdv, size_t count) +close_fds_except(int *fdv, size_t count) { - int i = 0; - size_t j = 0; - gf_boolean_t should_close = _gf_true; + int i = 0; + size_t j = 0; + gf_boolean_t should_close = _gf_true; #ifdef GF_LINUX_HOST_OS - DIR *d = NULL; - struct dirent *de = NULL; - struct dirent scratch[2] = {{0,},}; - char *e = NULL; - - d = sys_opendir ("/proc/self/fd"); - if (!d) - return -1; - - for (;;) { - should_close = _gf_true; - - errno = 0; - de = sys_readdir (d, scratch); - if (!de || errno != 0) - break; - i = strtoul (de->d_name, &e, 10); - if (*e != '\0' || i == dirfd (d)) - continue; - - for (j = 0; j < count; j++) { - if (i == fdv[j]) { - should_close = _gf_false; - break; - } - } - if (should_close) - sys_close (i); - } - sys_closedir (d); -#else /* !GF_LINUX_HOST_OS */ - struct rlimit rl; - int ret = -1; + DIR *d = NULL; + struct dirent *de = NULL; + struct dirent scratch[2] = { + { + 0, + }, + }; + char *e = NULL; + + d = sys_opendir("/proc/self/fd"); + if (!d) + return -1; + + for (;;) { + should_close = _gf_true; - ret = getrlimit (RLIMIT_NOFILE, &rl); - if (ret) - return ret; - - for (i = 0; i < rl.rlim_cur; i++) { - should_close = _gf_true; - for (j = 0; j < count; j++) { - if (i == fdv[j]) { - should_close = _gf_false; - break; - } - } - if (should_close) - sys_close (i); + errno = 0; + de = sys_readdir(d, scratch); + if (!de || errno != 0) + break; + i = strtoul(de->d_name, &e, 10); + if (*e != '\0' || i == dirfd(d)) + continue; + + for (j = 0; j < count; j++) { + if (i == fdv[j]) { + should_close = _gf_false; + break; + } + } + if (should_close) + sys_close(i); + } + sys_closedir(d); +#else /* !GF_LINUX_HOST_OS */ + struct rlimit rl; + int ret = -1; + + ret = getrlimit(RLIMIT_NOFILE, &rl); + if (ret) + return ret; + + for (i = 0; i < rl.rlim_cur; i++) { + should_close = _gf_true; + for (j = 0; j < count; j++) { + if (i == fdv[j]) { + should_close = _gf_false; + break; + } } + if (should_close) + sys_close(i); + } #endif /* !GF_LINUX_HOST_OS */ - return 0; + return 0; } /** @@ -5106,105 +5109,129 @@ close_fds_except (int *fdv, size_t count) * failure: -1 */ int -gf_getgrouplist (const char *user, gid_t group, gid_t **groups) +gf_getgrouplist(const char *user, gid_t group, gid_t **groups) { - int ret = -1; - int ngroups = SMALL_GROUP_COUNT; + int ret = -1; + int ngroups = SMALL_GROUP_COUNT; - *groups = GF_CALLOC (sizeof (gid_t), ngroups, gf_common_mt_groups_t); - if (!*groups) - return -1; + *groups = GF_CALLOC(sizeof(gid_t), ngroups, gf_common_mt_groups_t); + if (!*groups) + return -1; - /* - * We are running getgrouplist() in a loop until we succeed (or hit - * certain exit conditions, see the comments below). This is because - * the indicated number of auxiliary groups that we obtain in case of - * the failure of the first invocation is not guaranteed to keep its - * validity upon the next invocation with a gid buffer of that size. - */ - for (;;) { - int ngroups_old = ngroups; - ret = getgrouplist (user, group, *groups, &ngroups); - if (ret != -1) - break; - - if (ngroups >= GF_MAX_AUX_GROUPS) { - /* - * This should not happen as GF_MAX_AUX_GROUPS is set - * to the max value of number of supported auxiliary - * groups across all platforms supported by GlusterFS. - * However, if it still happened some way, we wouldn't - * care about the incompleteness of the result, we'd - * just go on with what we got. - */ - return GF_MAX_AUX_GROUPS; - } else if (ngroups <= ngroups_old) { - /* - * There is an edge case that getgrouplist() fails but - * ngroups remains the same. This is actually not - * specified in getgrouplist(3), but implementations - * can do this upon internal failure[1]. To avoid - * falling into an infinite loop when this happens, we - * break the loop if the getgrouplist call failed - * without an increase in the indicated group number. - * - * [1] https://sourceware.org/git/?p=glibc.git;a=blob;f=grp/initgroups.c;hb=refs/heads/release/2.25/master#l168 - */ - GF_FREE (*groups); - return -1; - } - - *groups = GF_REALLOC (*groups, ngroups * sizeof (gid_t)); - if (!*groups) - return -1; - } - return ret; + /* + * We are running getgrouplist() in a loop until we succeed (or hit + * certain exit conditions, see the comments below). This is because + * the indicated number of auxiliary groups that we obtain in case of + * the failure of the first invocation is not guaranteed to keep its + * validity upon the next invocation with a gid buffer of that size. + */ + for (;;) { + int ngroups_old = ngroups; + ret = getgrouplist(user, group, *groups, &ngroups); + if (ret != -1) + break; + + if (ngroups >= GF_MAX_AUX_GROUPS) { + /* + * This should not happen as GF_MAX_AUX_GROUPS is set + * to the max value of number of supported auxiliary + * groups across all platforms supported by GlusterFS. + * However, if it still happened some way, we wouldn't + * care about the incompleteness of the result, we'd + * just go on with what we got. + */ + return GF_MAX_AUX_GROUPS; + } else if (ngroups <= ngroups_old) { + /* + * There is an edge case that getgrouplist() fails but + * ngroups remains the same. This is actually not + * specified in getgrouplist(3), but implementations + * can do this upon internal failure[1]. To avoid + * falling into an infinite loop when this happens, we + * break the loop if the getgrouplist call failed + * without an increase in the indicated group number. + * + * [1] + * https://sourceware.org/git/?p=glibc.git;a=blob;f=grp/initgroups.c;hb=refs/heads/release/2.25/master#l168 + */ + GF_FREE(*groups); + return -1; + } + + *groups = GF_REALLOC(*groups, ngroups * sizeof(gid_t)); + if (!*groups) + return -1; + } + return ret; } int -glusterfs_compute_sha256 (const unsigned char *content, size_t size, - char *sha256_hash) { - SHA256_CTX sha256; +glusterfs_compute_sha256(const unsigned char *content, size_t size, + char *sha256_hash) +{ + SHA256_CTX sha256; - SHA256_Init (&sha256); - SHA256_Update (&sha256, (const unsigned char *) (content), size); - SHA256_Final ((unsigned char *) sha256_hash, &sha256); + SHA256_Init(&sha256); + SHA256_Update(&sha256, (const unsigned char *)(content), size); + SHA256_Final((unsigned char *)sha256_hash, &sha256); - return 0; + return 0; } -char* -get_struct_variable (int mem_num, gf_gsync_status_t *sts_val) -{ - switch (mem_num) { - case 0: return (sts_val->node); - case 1: return (sts_val->master); - case 2: return (sts_val->brick); - case 3: return (sts_val->slave_user); - case 4: return (sts_val->slave); - case 5: return (sts_val->slave_node); - case 6: return (sts_val->worker_status); - case 7: return (sts_val->crawl_status); - case 8: return (sts_val->last_synced); - case 9: return (sts_val->entry); - case 10: return (sts_val->data); - case 11: return (sts_val->meta); - case 12: return (sts_val->failures); - case 13: return (sts_val->checkpoint_time); - case 14: return (sts_val->checkpoint_completed); - case 15: return (sts_val->checkpoint_completion_time); - case 16: return (sts_val->brick_host_uuid); - case 17: return (sts_val->last_synced_utc); - case 18: return (sts_val->checkpoint_time_utc); - case 19: return (sts_val->checkpoint_completion_time_utc); - case 20: return (sts_val->slavekey); - case 21: return (sts_val->session_slave); +char * +get_struct_variable(int mem_num, gf_gsync_status_t *sts_val) +{ + switch (mem_num) { + case 0: + return (sts_val->node); + case 1: + return (sts_val->master); + case 2: + return (sts_val->brick); + case 3: + return (sts_val->slave_user); + case 4: + return (sts_val->slave); + case 5: + return (sts_val->slave_node); + case 6: + return (sts_val->worker_status); + case 7: + return (sts_val->crawl_status); + case 8: + return (sts_val->last_synced); + case 9: + return (sts_val->entry); + case 10: + return (sts_val->data); + case 11: + return (sts_val->meta); + case 12: + return (sts_val->failures); + case 13: + return (sts_val->checkpoint_time); + case 14: + return (sts_val->checkpoint_completed); + case 15: + return (sts_val->checkpoint_completion_time); + case 16: + return (sts_val->brick_host_uuid); + case 17: + return (sts_val->last_synced_utc); + case 18: + return (sts_val->checkpoint_time_utc); + case 19: + return (sts_val->checkpoint_completion_time_utc); + case 20: + return (sts_val->slavekey); + case 21: + return (sts_val->session_slave); default: - goto out; - } + goto out; + } out: - return NULL; + return NULL; } /* * Safe wrapper function for strncpy. @@ -5214,73 +5241,73 @@ out: */ char * -gf_strncpy (char *dest, const char *src, const size_t dest_size) +gf_strncpy(char *dest, const char *src, const size_t dest_size) { - strncpy (dest, src, dest_size - 1); - dest[dest_size - 1] = '\0'; - return dest; + strncpy(dest, src, dest_size - 1); + dest[dest_size - 1] = '\0'; + return dest; } int -gf_replace_old_iatt_in_dict (dict_t *xdata) +gf_replace_old_iatt_in_dict(dict_t *xdata) { - int ret; - struct old_iatt *o_iatt; /* old iatt structure */ - struct iatt *c_iatt; /* current iatt */ + int ret; + struct old_iatt *o_iatt; /* old iatt structure */ + struct iatt *c_iatt; /* current iatt */ - if (!xdata) { - return 0; - } + if (!xdata) { + return 0; + } - ret = dict_get_bin (xdata, DHT_IATT_IN_XDATA_KEY, (void **)&c_iatt); - if (ret < 0) { - return 0; - } + ret = dict_get_bin(xdata, DHT_IATT_IN_XDATA_KEY, (void **)&c_iatt); + if (ret < 0) { + return 0; + } - o_iatt = GF_CALLOC (1, sizeof (struct old_iatt), gf_common_mt_char); - if (!o_iatt) { - return -1; - } + o_iatt = GF_CALLOC(1, sizeof(struct old_iatt), gf_common_mt_char); + if (!o_iatt) { + return -1; + } - oldiatt_from_iatt (o_iatt, c_iatt); + oldiatt_from_iatt(o_iatt, c_iatt); - ret = dict_set_bin (xdata, DHT_IATT_IN_XDATA_KEY, o_iatt, - sizeof (struct old_iatt)); - if (ret) { - GF_FREE (o_iatt); - } + ret = dict_set_bin(xdata, DHT_IATT_IN_XDATA_KEY, o_iatt, + sizeof(struct old_iatt)); + if (ret) { + GF_FREE(o_iatt); + } - return ret; + return ret; } int -gf_replace_new_iatt_in_dict (dict_t *xdata) +gf_replace_new_iatt_in_dict(dict_t *xdata) { - int ret; - struct old_iatt *o_iatt; /* old iatt structure */ - struct iatt *c_iatt; /* new iatt */ + int ret; + struct old_iatt *o_iatt; /* old iatt structure */ + struct iatt *c_iatt; /* new iatt */ - if (!xdata) { - return 0; - } + if (!xdata) { + return 0; + } - ret = dict_get_bin (xdata, DHT_IATT_IN_XDATA_KEY, (void **)&o_iatt); - if (ret < 0) { - return 0; - } + ret = dict_get_bin(xdata, DHT_IATT_IN_XDATA_KEY, (void **)&o_iatt); + if (ret < 0) { + return 0; + } - c_iatt = GF_CALLOC (1, sizeof (struct iatt), gf_common_mt_char); - if (!c_iatt) { - return -1; - } + c_iatt = GF_CALLOC(1, sizeof(struct iatt), gf_common_mt_char); + if (!c_iatt) { + return -1; + } - iatt_from_oldiatt (c_iatt, o_iatt); + iatt_from_oldiatt(c_iatt, o_iatt); - ret = dict_set_bin (xdata, DHT_IATT_IN_XDATA_KEY, c_iatt, - sizeof (struct iatt)); - if (ret) { - GF_FREE (c_iatt); - } + ret = dict_set_bin(xdata, DHT_IATT_IN_XDATA_KEY, c_iatt, + sizeof(struct iatt)); + if (ret) { + GF_FREE(c_iatt); + } - return ret; + return ret; } |