From 0a20ad40de3395eb5e71b163e1bd4119ab099709 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Thu, 19 Jul 2012 21:25:30 +0900 Subject: [PATCH 1/4] don't define _XOPEN_SOURCE for NetBSD on NetBSD, defining _XOPEN_SOURCE hides extensions like inet_aton, strcasecmp, etc. --- src/fmacros.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/fmacros.h b/src/fmacros.h index a6cf3578..c16f5e20 100644 --- a/src/fmacros.h +++ b/src/fmacros.h @@ -36,9 +36,13 @@ #define _GNU_SOURCE #endif -#if defined(__linux__) || defined(__OpenBSD__) || defined(__NetBSD__) +#if defined(__linux__) || defined(__OpenBSD__) #define _XOPEN_SOURCE 700 -#else +/* + * On NetBSD, _XOPEN_SOURCE undefines _NETBSD_SOURCE and + * thus hides inet_aton etc. + */ +#elif !defined(__NetBSD__) #define _XOPEN_SOURCE #endif From b2dd0849ce7f229ea5eb9fb88a112b7ad2c31642 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Thu, 19 Jul 2012 21:28:11 +0900 Subject: [PATCH 2/4] rename popcount to popcount_binary to avoid a conflict with NetBSD libc NetBSD-current's libc has a function named popcount. hiding these extensions using feature macros is not possible because redis uses other extensions covered by the same feature macro. eg. inet_aton --- src/bitops.c | 4 ++-- src/redis.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bitops.c b/src/bitops.c index 47f768c3..1c2e13dd 100644 --- a/src/bitops.c +++ b/src/bitops.c @@ -58,7 +58,7 @@ static int getBitOffsetFromArgument(redisClient *c, robj *o, size_t *offset) { /* Count number of bits set in the binary array pointed by 's' and long * 'count' bytes. The implementation of this function is required to * work with a input string length up to 512 MB. */ -size_t popcount(void *s, long count) { +size_t popcount_binary(void *s, long count) { size_t bits = 0; unsigned char *p; uint32_t *p4 = s; @@ -407,6 +407,6 @@ void bitcountCommand(redisClient *c) { } else { long bytes = end-start+1; - addReplyLongLong(c,popcount(p+start,bytes)); + addReplyLongLong(c,popcount_binary(p+start,bytes)); } } diff --git a/src/redis.h b/src/redis.h index 3002dd97..a39f3d81 100644 --- a/src/redis.h +++ b/src/redis.h @@ -1010,7 +1010,7 @@ long long mstime(void); void getRandomHexChars(char *p, unsigned int len); uint64_t crc64(uint64_t crc, const unsigned char *s, uint64_t l); void exitFromChild(int retcode); -size_t popcount(void *s, long count); +size_t popcount_binary(void *s, long count); void redisSetProcTitle(char *title); /* networking.c -- Networking and Client related operations */ From ae828676649f05feb113078fa166c78dd0ad0266 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Thu, 19 Jul 2012 21:37:34 +0900 Subject: [PATCH 3/4] use nanosleep instead of usleep SUSv3 says that: The useconds argument shall be less than one million. If the value of useconds is 0, then the call has no effect. and actually NetBSD's implementation rejects such a value with EINVAL. use nanosleep which has no such a limitation instead. --- src/debug.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index 2f62bedb..6cfa61b9 100644 --- a/src/debug.c +++ b/src/debug.c @@ -329,8 +329,11 @@ void debugCommand(redisClient *c) { } else if (!strcasecmp(c->argv[1]->ptr,"sleep") && c->argc == 3) { double dtime = strtod(c->argv[2]->ptr,NULL); long long utime = dtime*1000000; + struct timespec tv; - usleep(utime); + tv.tv_sec = utime / 1000000; + tv.tv_nsec = (utime % 1000000) * 1000; + nanosleep(&tv, NULL); addReply(c,shared.ok); } else if (!strcasecmp(c->argv[1]->ptr,"set-active-expire") && c->argc == 3) From 9fcead7a5967f31cc391fbed25c256406247b638 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Sun, 28 Oct 2012 13:33:04 +0900 Subject: [PATCH 4/4] don't assume time_t == long time_t is always 64bit on recent versions of NetBSD. --- src/config.c | 4 ++-- src/redis.c | 44 ++++++++++++++++++++++---------------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/config.c b/src/config.c index c41d5718..b4b128e8 100644 --- a/src/config.c +++ b/src/config.c @@ -974,8 +974,8 @@ void configGetCommand(redisClient *c) { int j; for (j = 0; j < server.saveparamslen; j++) { - buf = sdscatprintf(buf,"%ld %d", - server.saveparams[j].seconds, + buf = sdscatprintf(buf,"%jd %d", + (intmax_t)server.saveparams[j].seconds, server.saveparams[j].changes); if (j != server.saveparamslen-1) buf = sdscatlen(buf," ",1); diff --git a/src/redis.c b/src/redis.c index f86dafa5..2045176c 100644 --- a/src/redis.c +++ b/src/redis.c @@ -2070,8 +2070,8 @@ sds genRedisInfoString(char *section) { "process_id:%ld\r\n" "run_id:%s\r\n" "tcp_port:%d\r\n" - "uptime_in_seconds:%ld\r\n" - "uptime_in_days:%ld\r\n" + "uptime_in_seconds:%jd\r\n" + "uptime_in_days:%jd\r\n" "hz:%d\r\n" "lru_clock:%ld\r\n" "config_file:%s\r\n", @@ -2091,8 +2091,8 @@ sds genRedisInfoString(char *section) { (long) getpid(), server.runid, server.port, - uptime, - uptime/(3600*24), + (intmax_t)uptime, + (intmax_t)(uptime/(3600*24)), server.hz, (unsigned long) server.lruclock, server.configfile ? server.configfile : ""); @@ -2149,30 +2149,30 @@ sds genRedisInfoString(char *section) { "loading:%d\r\n" "rdb_changes_since_last_save:%lld\r\n" "rdb_bgsave_in_progress:%d\r\n" - "rdb_last_save_time:%ld\r\n" + "rdb_last_save_time:%jd\r\n" "rdb_last_bgsave_status:%s\r\n" - "rdb_last_bgsave_time_sec:%ld\r\n" - "rdb_current_bgsave_time_sec:%ld\r\n" + "rdb_last_bgsave_time_sec:%jd\r\n" + "rdb_current_bgsave_time_sec:%jd\r\n" "aof_enabled:%d\r\n" "aof_rewrite_in_progress:%d\r\n" "aof_rewrite_scheduled:%d\r\n" - "aof_last_rewrite_time_sec:%ld\r\n" - "aof_current_rewrite_time_sec:%ld\r\n" + "aof_last_rewrite_time_sec:%jd\r\n" + "aof_current_rewrite_time_sec:%jd\r\n" "aof_last_bgrewrite_status:%s\r\n", server.loading, server.dirty, server.rdb_child_pid != -1, - server.lastsave, + (intmax_t)server.lastsave, (server.lastbgsave_status == REDIS_OK) ? "ok" : "err", - server.rdb_save_time_last, - (server.rdb_child_pid == -1) ? - -1 : time(NULL)-server.rdb_save_time_start, + (intmax_t)server.rdb_save_time_last, + (intmax_t)((server.rdb_child_pid == -1) ? + -1 : time(NULL)-server.rdb_save_time_start), server.aof_state != REDIS_AOF_OFF, server.aof_child_pid != -1, server.aof_rewrite_scheduled, - server.aof_rewrite_time_last, - (server.aof_child_pid == -1) ? - -1 : time(NULL)-server.aof_rewrite_time_start, + (intmax_t)server.aof_rewrite_time_last, + (intmax_t)((server.aof_child_pid == -1) ? + -1 : time(NULL)-server.aof_rewrite_time_start), (server.aof_lastbgrewrite_status == REDIS_OK) ? "ok" : "err"); if (server.aof_state != REDIS_AOF_OFF) { @@ -2211,16 +2211,16 @@ sds genRedisInfoString(char *section) { } info = sdscatprintf(info, - "loading_start_time:%ld\r\n" + "loading_start_time:%jd\r\n" "loading_total_bytes:%llu\r\n" "loading_loaded_bytes:%llu\r\n" "loading_loaded_perc:%.2f\r\n" - "loading_eta_seconds:%ld\r\n" - ,(unsigned long) server.loading_start_time, + "loading_eta_seconds:%jd\r\n", + (intmax_t) server.loading_start_time, (unsigned long long) server.loading_total_bytes, (unsigned long long) server.loading_loaded_bytes, perc, - eta + (intmax_t)eta ); } } @@ -2299,8 +2299,8 @@ sds genRedisInfoString(char *section) { if (server.repl_state != REDIS_REPL_CONNECTED) { info = sdscatprintf(info, - "master_link_down_since_seconds:%ld\r\n", - (long)server.unixtime-server.repl_down_since); + "master_link_down_since_seconds:%jd\r\n", + (intmax_t)server.unixtime-server.repl_down_since); } info = sdscatprintf(info, "slave_priority:%d\r\n"