summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2013-05-09 16:57:59 +0200
committerantirez <antirez@gmail.com>2013-05-09 16:57:59 +0200
commit5947f170f91f1985eb316a9fd59c9ca8f2ea73f9 (patch)
treebdfffa33fd2a99df073cf432a36095572141c2c3
parente938575220c1b925dcdc608f46dc24e42aa6b2ed (diff)
downloadredis-5947f170f91f1985eb316a9fd59c9ca8f2ea73f9.tar.gz
Obtain absoute path of configuration file, expose it in INFO.
-rw-r--r--src/redis.c60
-rw-r--r--src/redis.h1
2 files changed, 59 insertions, 2 deletions
diff --git a/src/redis.c b/src/redis.c
index 1e8e5d779..feb4a14a1 100644
--- a/src/redis.c
+++ b/src/redis.c
@@ -1199,6 +1199,7 @@ void createSharedObjects(void) {
void initServerConfig() {
getRandomHexChars(server.runid,REDIS_RUN_ID_SIZE);
+ server.configfile = NULL;
server.hz = REDIS_DEFAULT_HZ;
server.runid[REDIS_RUN_ID_SIZE] = '\0';
server.arch_bits = (sizeof(long) == 8) ? 64 : 32;
@@ -2077,7 +2078,8 @@ sds genRedisInfoString(char *section) {
"uptime_in_seconds:%ld\r\n"
"uptime_in_days:%ld\r\n"
"hz:%d\r\n"
- "lru_clock:%ld\r\n",
+ "lru_clock:%ld\r\n"
+ "config_file:%s\r\n",
REDIS_VERSION,
redisGitSHA1(),
strtol(redisGitDirty(),NULL,10) > 0,
@@ -2097,7 +2099,8 @@ sds genRedisInfoString(char *section) {
uptime,
uptime/(3600*24),
server.hz,
- (unsigned long) server.lruclock);
+ (unsigned long) server.lruclock,
+ server.configfile ? server.configfile : "");
}
/* Clients */
@@ -2772,6 +2775,58 @@ void redisSetProcTitle(char *title) {
#endif
}
+/* Given the filename, return the absolute path as an SDS string, or NULL
+ * if it fails for some reason. Note that "filename" may be an absolute path
+ * already, this will be detected and handled correctly.
+ *
+ * The function does not try to normalize everything, but only the obvious
+ * case of one or more "../" appearning at the start of "filename"
+ * relative path. */
+sds getAbsolutePath(char *filename) {
+ char cwd[1024];
+ sds abspath;
+ sds relpath = sdsnew(filename);
+
+ relpath = sdstrim(relpath," \r\n\t");
+ if (relpath[0] == '/') return relpath; /* Path is already absolute. */
+
+ /* If path is relative, join cwd and relative path. */
+ if (getcwd(cwd,sizeof(cwd)) == NULL) {
+ sdsfree(relpath);
+ return NULL;
+ }
+ abspath = sdsnew(cwd);
+ if (sdslen(abspath) && abspath[sdslen(abspath)-1] != '/')
+ abspath = sdscat(abspath,"/");
+
+ /* At this point we have the current path always ending with "/", and
+ * the trimmed relative path. Try to normalize the obvious case of
+ * trailing ../ elements at the start of the path.
+ *
+ * For every "../" we find in the filename, we remove it and also remove
+ * the last element of the cwd, unless the current cwd is "/". */
+ while (sdslen(relpath) >= 3 &&
+ relpath[0] == '.' && relpath[1] == '.' && relpath[2] == '/')
+ {
+ relpath = sdsrange(relpath,3,-1);
+ if (sdslen(abspath) > 1) {
+ char *p = abspath + sdslen(abspath)-2;
+ int trimlen = 1;
+
+ while(*p != '/') {
+ p--;
+ trimlen++;
+ }
+ abspath = sdsrange(abspath,0,-(trimlen+1));
+ }
+ }
+
+ /* Finally glue the two parts together. */
+ abspath = sdscatsds(abspath,relpath);
+ sdsfree(relpath);
+ return abspath;
+}
+
int main(int argc, char **argv) {
struct timeval tv;
@@ -2839,6 +2894,7 @@ int main(int argc, char **argv) {
resetServerSaveParams();
loadServerConfig(configfile,options);
sdsfree(options);
+ if (configfile) server.configfile = getAbsolutePath(configfile);
} else {
redisLog(REDIS_WARNING, "Warning: no config file specified, using the default config. In order to specify a config file use %s /path/to/%s.conf", argv[0], server.sentinel_mode ? "sentinel" : "redis");
}
diff --git a/src/redis.h b/src/redis.h
index 11fc7d662..784992248 100644
--- a/src/redis.h
+++ b/src/redis.h
@@ -672,6 +672,7 @@ typedef struct {
struct redisServer {
/* General */
+ char *configfile; /* Absolute config file path, or NULL */
int hz; /* serverCron() calls frequency in hertz */
redisDb *db;
dict *commands; /* Command table */