#define REDIS_MAX_SYNC_TIME 60 /* Slave can't take more to sync */
#define REDIS_EXPIRELOOKUPS_PER_CRON 100 /* try to expire 100 keys/second */
#define REDIS_MAX_WRITE_PER_EVENT (1024*64)
+#define REDIS_REQUEST_MAX_SIZE (1024*1024*256) /* max bytes in inline command */
/* Hash table parameters */
#define REDIS_HT_MINFILL 10 /* Minimal hash table fill 10% */
/* Check if a background saving in progress terminated */
if (server.bgsaveinprogress) {
int statloc;
- /* XXX: TODO handle the case of the saving child killed */
if (wait4(-1,&statloc,WNOHANG,NULL)) {
int exitcode = WEXITSTATUS(statloc);
int bysignal = WIFSIGNALED(statloc);
/* I agree, this is a very rudimental way to load a configuration...
will improve later if the config gets more complex */
static void loadServerConfig(char *filename) {
- FILE *fp = fopen(filename,"r");
+ FILE *fp;
char buf[REDIS_CONFIGLINE_MAX+1], *err = NULL;
int linenum = 0;
sds line = NULL;
-
- if (!fp) {
- redisLog(REDIS_WARNING,"Fatal error, can't open config file");
- exit(1);
+
+ if (filename[0] == '-' && filename[1] == '\0')
+ fp = stdin;
+ else {
+ if ((fp = fopen(filename,"r")) == NULL) {
+ redisLog(REDIS_WARNING,"Fatal error, can't open config file");
+ exit(1);
+ }
}
+
while(fgets(buf,REDIS_CONFIGLINE_MAX+1,fp) != NULL) {
sds *argv;
int argc, j;
goto loaderr;
}
} else if (!strcasecmp(argv[0],"logfile") && argc == 2) {
- FILE *fp;
+ FILE *logfp;
server.logfile = zstrdup(argv[1]);
if (!strcasecmp(server.logfile,"stdout")) {
if (server.logfile) {
/* Test if we are able to open the file. The server will not
* be able to abort just for this problem later... */
- fp = fopen(server.logfile,"a");
- if (fp == NULL) {
+ logfp = fopen(server.logfile,"a");
+ if (logfp == NULL) {
err = sdscatprintf(sdsempty(),
"Can't open the log file: %s", strerror(errno));
goto loaderr;
}
- fclose(fp);
+ fclose(logfp);
}
} else if (!strcasecmp(argv[0],"databases") && argc == 2) {
server.dbnum = atoi(argv[1]);
zfree(argv);
sdsfree(line);
}
- fclose(fp);
+ if (fp != stdin) fclose(fp);
return;
loaderr:
/* Read the first line of the query */
char *p = strchr(c->querybuf,'\n');
size_t querylen;
+
if (p) {
sds query, *argv;
int argc, j;
* on the query buffer try to process the next command. */
if (processCommand(c) && sdslen(c->querybuf)) goto again;
return;
- } else if (sdslen(c->querybuf) >= 1024*32) {
+ } else if (sdslen(c->querybuf) >= REDIS_REQUEST_MAX_SIZE) {
redisLog(REDIS_DEBUG, "Client protocol error");
freeClient(c);
return;
ln = listLast(list);
listDelNode(list,ln);
}
- addReply(c,shared.ok);
server.dirty++;
+ addReply(c,shared.ok);
}
}
}