static void cliInitHelp() { int commandslen = sizeof(commandHelp)/sizeof(struct commandHelp); int groupslen = sizeof(commandGroups)/sizeof(char*); int i, len, pos = 0; helpEntry tmp; helpEntriesLen = len = commandslen+groupslen; helpEntries = malloc(sizeof(helpEntry)*len); for (i = 0; i < groupslen; i++) { tmp.argc = 1; tmp.argv = malloc(sizeof(sds)); tmp.argv[0] = sdscatprintf(sdsempty(),"@%s",commandGroups[i]); tmp.full = tmp.argv[0]; tmp.type = CLI_HELP_GROUP; tmp.org = NULL; helpEntries[pos++] = tmp; } for (i = 0; i < commandslen; i++) { tmp.argv = sdssplitargs(commandHelp[i].name,&tmp.argc); tmp.full = sdsnew(commandHelp[i].name); tmp.type = CLI_HELP_COMMAND; tmp.org = &commandHelp[i]; helpEntries[pos++] = tmp; } }
static void repl() { int argc, j; char *line; sds *argv; config.interactive = 1; linenoiseSetCompletionCallback(completionCallback); while((line = linenoise(db ? "redislite> " : "not connected> ")) != NULL) { if (line[0] != '\0') { argv = sdssplitargs(line, &argc); linenoiseHistoryAdd(line); if (config.historyfile) { linenoiseHistorySave(config.historyfile); } if (argv == NULL) { printf("Invalid argument(s)\n"); continue; } else if (argc > 0) { if (strcasecmp(argv[0], "quit") == 0 || strcasecmp(argv[0], "exit") == 0) { exit(0); } else if (argc == 1 && !strcasecmp(argv[0], "clear")) { linenoiseClearScreen(); } else { long long start_time = mstime(), elapsed; if (cliSendCommand(argc, argv, 1) != REDISLITE_OK) { cliConnect(1); /* If we still cannot send the command, * print error and abort. */ if (cliSendCommand(argc, argv, 1) != REDISLITE_OK) { cliPrintContextErrorAndExit(); } } elapsed = mstime() - start_time; if (elapsed >= 500) { printf("(%.2fs)\n", (double)elapsed / 1000); } } } /* Free the argument vector */ for (j = 0; j < argc; j++) { sdsfree(argv[j]); } redislite_free(argv); } /* linenoise() returns malloc-ed lines like readline() */ free(line); } exit(0); }
static int process_inline_buffer(sub_client *c) { char *newline; int argc, i; sds *argv, aux; size_t querylen; newline = strchr(c->read_buf, '\n'); if (newline == NULL) { if (sdslen(c->read_buf) > SUB_READ_BUF_LEN) { srv_log(LOG_ERROR, "Protocol error: too big inline request"); set_protocol_err(c, 0); } return SUBCLI_ERR; } if (newline && newline != c->read_buf && *(newline-1) == '\r') { newline--; } querylen = newline - (c->read_buf); aux = sdsnewlen(c->read_buf, querylen); argv = sdssplitargs(aux, &argc); sdsfree(aux); if (argv == NULL) { set_protocol_err(c, 0); return SUBCLI_ERR; } sdsrange(c->read_buf, querylen+2, -1); /*c->argv = (char **) malloc(sizeof(char *) * argc);*/ c->argv = (char **) malloc(sizeof(sds) * argc); for (c->argc = 0, i = 0; i < argc; i++) { if (sdslen(argv[i])) { /*c->argv[c->argc] = strdup(argv[i]);*/ c->argv[c->argc] = sdsnewlen(argv[i], strlen(argv[i])); c->argc++; } else { sdsfree(argv[i]); } } zfree(argv); return SUBCLI_OK; }
int processInlineBuffer(client *c) { char *newline; int argc; sds *argv, aux; size_t querylen; /* Search for end of line */ newline = strchr(c->querybuf,'\n'); /* Nothing to do without a \r\n */ if (newline == NULL) { if (sdslen(c->querybuf) > PROTO_INLINE_MAX_SIZE) { addReplyError(c,"Protocol error: too big inline request"); setProtocolError(c,0); } return C_ERR; } /* Handle the \r\n case. */ if (newline && newline != c->querybuf && *(newline-1) == '\r') newline--; /* Split the input buffer up to the \r\n */ querylen = newline-(c->querybuf); aux = sdsnewlen(c->querybuf,querylen); argv = sdssplitargs(aux,&argc); sdsfree(aux); if (argv == NULL) { addReplyError(c,"Protocol error: unbalanced quotes in request"); setProtocolError(c,0); return C_ERR; } /* Leave data after the first line of the query in the buffer */ sdsrange(c->querybuf,querylen+2,-1); /* Setup argv array on client structure */ if (argc) { if (c->argv) free(c->argv); c->argv = argv; } c->argc = argc; return C_OK; }
static void repl() { int argc, j; char *line; sds *argv; config.interactive = 1; while((line = linenoise("redis> ")) != NULL) { if (line[0] != '\0') { argv = sdssplitargs(line,&argc); linenoiseHistoryAdd(line); if (config.historyfile) linenoiseHistorySave(config.historyfile); if (argv == NULL) { printf("Invalid argument(s)\n"); continue; } else if (argc > 0) { if (strcasecmp(argv[0],"quit") == 0 || strcasecmp(argv[0],"exit") == 0) { exit(0); } else { int err; if ((err = cliSendCommand(argc, argv, 1)) != 0) { if (err == ECONNRESET) { printf("Reconnecting... "); fflush(stdout); if (cliConnect(1) == -1) exit(1); printf("OK\n"); cliSendCommand(argc,argv,1); } } } } /* Free the argument vector */ for (j = 0; j < argc; j++) sdsfree(argv[j]); zfree(argv); } /* linenoise() returns malloc-ed lines like readline() */ free(line); } exit(0); }
void InnerServerCommandSeqParser::handleInnerDataReceived(InnerClient* connection, char* buff, uint32_t buff_len) { ssize_t nwrite = 0; char* end = strstr(buff, END_OF_COMMAND); if (!end) { DEBUG_MSG_FORMAT<MAX_COMMAND_SIZE>(common::logging::L_WARNING, "UNKNOWN SEQUENCE: %s", buff); const cmd_responce_t resp = make_responce(next_id(), STATE_COMMAND_RESP_FAIL_1S, buff); common::Error err = connection->write(resp, &nwrite); if (err && err->isError()) { DEBUG_MSG_ERROR(err); } connection->close(); delete connection; return; } *end = 0; char* star_seq = NULL; cmd_id_t seq = strtoul(buff, &star_seq, 10); if (*star_seq != ' ') { DEBUG_MSG_FORMAT<MAX_COMMAND_SIZE>(common::logging::L_WARNING, "PROBLEM EXTRACTING SEQUENCE: %s", buff); const cmd_responce_t resp = make_responce(next_id(), STATE_COMMAND_RESP_FAIL_1S, buff); common::Error err = connection->write(resp, &nwrite); if (err && err->isError()) { DEBUG_MSG_ERROR(err); } connection->close(); delete connection; return; } const char* id_ptr = strchr(star_seq + 1, ' '); if (!id_ptr) { DEBUG_MSG_FORMAT<MAX_COMMAND_SIZE>(common::logging::L_WARNING, "PROBLEM EXTRACTING ID: %s", buff); const cmd_responce_t resp = make_responce(next_id(), STATE_COMMAND_RESP_FAIL_1S, buff); common::Error err = connection->write(resp, &nwrite); if (err && err->isError()) { DEBUG_MSG_ERROR(err); } connection->close(); delete connection; return; } size_t len_seq = id_ptr - (star_seq + 1); cmd_seq_t id = std::string(star_seq + 1, len_seq); const char* cmd = id_ptr; int argc; sds* argv = sdssplitargs(cmd, &argc); processRequest(id, argc, argv); if (argv == NULL) { DEBUG_MSG_FORMAT<MAX_COMMAND_SIZE>(common::logging::L_WARNING, "PROBLEM PARSING INNER COMMAND: %s", buff); const cmd_responce_t resp = make_responce(id, STATE_COMMAND_RESP_FAIL_1S, buff); common::Error err = connection->write(resp, &nwrite); if (err && err->isError()) { DEBUG_MSG_ERROR(err); } connection->close(); delete connection; return; } DEBUG_MSG_FORMAT<MAX_COMMAND_SIZE>( common::logging::L_INFO, "HANDLE INNER COMMAND client[%s] seq:% " CID_FMT ", id:%s, cmd: %s", connection->formatedName(), seq, id, cmd); if (seq == REQUEST_COMMAND) { handleInnerRequestCommand(connection, id, argc, argv); } else if (seq == RESPONCE_COMMAND) { handleInnerResponceCommand(connection, id, argc, argv); } else if (seq == APPROVE_COMMAND) { handleInnerApproveCommand(connection, id, argc, argv); } else { NOTREACHED(); } sdsfreesplitres(argv, argc); }
static void repl() { sds historyfile = NULL; int history = 0; char *line; int argc; sds *argv; config.interactive = 1; linenoiseSetCompletionCallback(completionCallback); /* Only use history when stdin is a tty. */ if (isatty(fileno(stdin))) { history = 1; if (getenv("HOME") != NULL) { historyfile = sdscatprintf(sdsempty(),"%s/.rediscli_history",getenv("HOME")); linenoiseHistoryLoad(historyfile); } } cliRefreshPrompt(); while((line = linenoise(context ? config.prompt : "not connected> ")) != NULL) { if (line[0] != '\0') { argv = sdssplitargs(line,&argc); if (history) linenoiseHistoryAdd(line); if (historyfile) linenoiseHistorySave(historyfile); if (argv == NULL) { printf("Invalid argument(s)\n"); free(line); continue; } else if (argc > 0) { if (strcasecmp(argv[0],"quit") == 0 || strcasecmp(argv[0],"exit") == 0) { exit(0); } else if (argc == 3 && !strcasecmp(argv[0],"connect")) { sdsfree(config.hostip); config.hostip = sdsnew(argv[1]); config.hostport = atoi(argv[2]); cliConnect(1); } else if (argc == 1 && !strcasecmp(argv[0],"clear")) { linenoiseClearScreen(); } else { long long start_time = mstime(), elapsed; int repeat, skipargs = 0; repeat = atoi(argv[0]); if (argc > 1 && repeat) { skipargs = 1; } else { repeat = 1; } while (1) { config.cluster_reissue_command = 0; if (cliSendCommand(argc-skipargs,argv+skipargs,repeat) != REDIS_OK) { cliConnect(1); /* If we still cannot send the command print error. * We'll try to reconnect the next time. */ if (cliSendCommand(argc-skipargs,argv+skipargs,repeat) != REDIS_OK) cliPrintContextError(); } /* Issue the command again if we got redirected in cluster mode */ if (config.cluster_mode && config.cluster_reissue_command) { cliConnect(1); } else { break; } } elapsed = mstime()-start_time; if (elapsed >= 500) { printf("(%.2fs)\n",(double)elapsed/1000); } } } /* Free the argument vector */ while(argc--) sdsfree(argv[argc]); zfree(argv); } /* linenoise() returns malloc-ed lines like readline() */ free(line); } exit(0); }
void load_conf_from_string(char *config) { char *err = NULL; int linenum = 0, tlines, i; sds *lines; lines = sdssplitlen(config, strlen(config), "\n", 1, &tlines); for(i = 0; i < tlines; i++) { sds *argv; int argc; linenum = i+1; log_debug(">> %0.3d %s", linenum, lines[i]); lines[i] = sdstrim(lines[i], " \t\r\n"); // skip comments and blank lines if(lines[i][0] == '#' || lines[i][0] == '\0') continue; argv = sdssplitargs(lines[i], &argc); if(argv == NULL) { err = "Unbalanced quotes in configuration line"; goto loaderr; } if(argc == 0) { sdsfreesplitres(argv, argc); continue; } sdstolower(argv[0]); if(!strcasecmp(argv[0], "name") && argc == 2) { server.name = sdsdup(argv[1]); }else if(!strcasecmp(argv[0], "bind") && argc >= 2) { server.bind_addr_count = argc-1; if((argc-1) > ZR_MAX_BIND_ADDR) { err = "Too many bind address specified."; goto loaderr; } int j; for(j = 0; j < server.bind_addr_count; j++) { server.bind_arr[j].addr_str = sdsnew(argv[j+1]); server.bind_arr[j].addr.sin_family = AF_INET; server.bind_arr[j].addr.sin_addr.s_addr = inet_addr(argv[j+1]); if(server.bind_arr[j].addr.sin_addr.s_addr == INADDR_NONE) { err = sdscatprintf(sdsempty(), "Wrong binding ip address: %s", argv[j+1]); goto loaderr; } } }else if(!strcasecmp(argv[0], "port") && argc == 2) { server.port = atoi(argv[1]); if (server.port < 0 || server.port > 65535) { err = "Invalid port"; goto loaderr; } }else if(!strcasecmp(argv[0], "req-log-uds") && argc == 2) { server.req_log_uds = sdsnew(argv[1]); }else if(!strcasecmp(argv[0], "client-max") && argc == 2) { server.client_max = atoi(argv[1]); if(server.client_max < 0) { err = "Invalid server-connection-max value."; goto loaderr; } } else if (!strcasecmp(argv[0],"tcp-backlog") && argc == 2) { server.tcp_backlog = atoi(argv[1]); if (server.tcp_backlog < 0) { err = "Invalid backlog value"; goto loaderr; } /* } else if (!strcasecmp(argv[0],"rr-counter-buffer") && argc == 2) { server.tcp_backlog = atoi(argv[1]); if (server.tcp_backlog < 0) { err = "Invalid rr-counter-buffer value"; goto loaderr; } */ }else if(!strcasecmp(argv[0], "log-level") && argc == 2) { server.log_level = log_get_level_str(argv[1]); }else if(!strcasecmp(argv[0], "log-file") && argc == 2) { server.log_file = sdsdup(argv[1]); if(!strcasecmp(argv[1], "stdout")) { log_set_out(stdout); }else if(!strcasecmp(argv[1], "stderr")) { log_set_out(stderr); }else { FILE *fd; fd = fopen(argv[1], "a"); if(fd == NULL) { err = sdscatprintf(sdsempty(), "Can't open the log file: %s", strerror(errno)); goto loaderr; } log_set_out(fd); } }else if(!strcasecmp(argv[0], "zookeeper-health-uri") && argc == 2) { struct z_conn_info *zcinfo = z_parse_conn_string(argv[1]); if(zcinfo == NULL) { err = "Invalid zookeeper-health-url(Zookeeper URI) value.\n" // "Zookeeper URI must be as below.\n" // " - zoo://[USER[:PASS]@]HOST_STRING/NODE/PATH\n" // " ex) zoo://192.168.1.2:2181/test/node\n" // " ex) zoo://[email protected]:2181,192.168.1.3:2181/test/node\n" // " ex) zoo://foo:[email protected]:2181,192.168.1.3:2181/test/node\n" ""; goto loaderr; } server.z_health_conn = zcinfo; }else if(!strcasecmp(argv[0], "zookeeper-timeout") && argc == 2) { server.zoo_timeout = atoi(argv[1]); if(server.zoo_timeout < 0) { err = "Invalid zookeeper-timeout value"; goto loaderr; } }else if(!strcasecmp(argv[0], "service") && argc == 3) { if(strlen(argv[1]) > ZR_MAX_SVC_NAME) { err = sdscatprintf(sdsempty(), "Service name is too long, first argument(service name) must be less then %d.", ZR_MAX_SVC_NAME); goto loaderr; } struct z_conn_info *cinfo = z_parse_conn_string(argv[2]); if(!cinfo) { err = "Invalid zookeeper-health-url(Zookeeper URI) value.\n" // "Zookeeper URI must be as below.\n" // " - zoo://[USER[:PASS]@]HOST_STRING/NODE/PATH\n" // " ex) zoo://192.168.1.2:2181/test/node\n" // " ex) zoo://[email protected]:2181,192.168.1.3:2181/test/node\n" // " ex) zoo://foo:[email protected]:2181,192.168.1.3:2181/test/node\n" ""; goto loaderr; } int j; for(j = 0; j < server.svc_count; j++) { struct svc *tsvc = server.svc_arr[j]; if(!sdscmp(argv[1], tsvc->name)) { err = sdscatprintf(sdsempty(), "\"%s\" service name already exists.", argv[1]); goto loaderr; } } struct svc *svc = svc_alloc(argv[1], strlen(argv[1]), server.svc_count); svc->z_conn = cinfo; server.svc_arr[server.svc_count] = svc; server.svc_count++; }else { err = "Bad config directive or wrong number of arguments"; goto loaderr; } sdsfreesplitres(argv,argc); } sdsfreesplitres(lines,tlines); return; loaderr: log_eerr("CONFIG FILE ERROR."); log_eerr("Reading configureation file, at line %d", linenum); log_eerr(">> '%s'", lines[i]); log_eerr("%s", err); exit(1); }
void load_config_from_string(sds config) { char *err = NULL; int linenum = 0, totlines, i; sds *lines = sdssplitlen(config, strlen(config), "\n", 1, &totlines); for (i = 0; i < totlines; i++) { sds *argv; int argc; linenum = i + 1; lines[i] = sdstrim(lines[i], " \t\r\n"); if (lines[i][0] == '#' || lines[i][0] == '\0') continue; argv = sdssplitargs(lines[i], &argc); if (argv == NULL) { err = "Unbalanced quotes in configuration line"; goto loaderr; } if (argc == 0) { sdsfreesplitres(argv, argc); continue; } sdstolower(argv[0]); if (strcasecmp(argv[0], "working-directory") == 0 && argc == 2) { destor.working_directory = sdscpy(destor.working_directory, argv[1]); } else if (strcasecmp(argv[0], "simulation-level") == 0 && argc == 2) { if (strcasecmp(argv[1], "all") == 0) { destor.simulation_level = SIMULATION_ALL; } else if (strcasecmp(argv[1], "append") == 0) { destor.simulation_level = SIMULATION_APPEND; } else if (strcasecmp(argv[1], "restore") == 0) { destor.simulation_level = SIMULATION_RESTORE; } else if (strcasecmp(argv[1], "no") == 0) { destor.simulation_level = SIMULATION_NO; } else { err = "Invalid simulation level"; goto loaderr; } } else if (strcasecmp(argv[0], "log-level") == 0 && argc == 2) { if (strcasecmp(argv[1], "debug") == 0) { destor.verbosity = DESTOR_DEBUG; } else if (strcasecmp(argv[1], "verbose") == 0) { destor.verbosity = DESTOR_VERBOSE; } else if (strcasecmp(argv[1], "notice") == 0) { destor.verbosity = DESTOR_NOTICE; } else if (strcasecmp(argv[1], "warning") == 0) { destor.verbosity = DESTOR_WARNING; } else { err = "Invalid log level"; goto loaderr; } } else if (strcasecmp(argv[0], "chunk-algorithm") == 0 && argc == 2) { if (strcasecmp(argv[1], "fixed") == 0) { destor.chunk_algorithm = CHUNK_FIXED; } else if (strcasecmp(argv[1], "rabin") == 0) { destor.chunk_algorithm = CHUNK_RABIN; } else if (strcasecmp(argv[1], "normalized rabin") == 0) { destor.chunk_algorithm = CHUNK_NORMALIZED_RABIN; } else if (strcasecmp(argv[1], "file") == 0) { destor.chunk_algorithm = CHUNK_FILE; } else { err = "Invalid chunk algorithm"; goto loaderr; } } else if (strcasecmp(argv[0], "chunk-avg-size") == 0 && argc == 2) { destor.chunk_avg_size = atoi(argv[1]); } else if (strcasecmp(argv[0], "chunk-max-size") == 0 && argc == 2) { destor.chunk_max_size = atoi(argv[1]); } else if (strcasecmp(argv[0], "chunk-min-size") == 0 && argc == 2) { destor.chunk_min_size = atoi(argv[1]); } else if (strcasecmp(argv[0], "fingerprint-index") == 0 && argc >= 3) { if (strcasecmp(argv[1], "exact") == 0) { destor.index_category[0] = INDEX_CATEGORY_EXACT; } else if (strcasecmp(argv[1], "near-exact") == 0) { destor.index_category[0] = INDEX_CATEGORY_NEAR_EXACT; } else { err = "Invalid index category"; goto loaderr; } if (strcasecmp(argv[2], "physical") == 0) { destor.index_category[1] = INDEX_CATEGORY_PHYSICAL_LOCALITY; } else if (strcasecmp(argv[2], "logical") == 0) { destor.index_category[1] = INDEX_CATEGORY_LOGICAL_LOCALITY; } else { err = "Invalid index category"; goto loaderr; } if (argc > 3) { if (strcasecmp(argv[3], "ddfs") == 0) { assert(destor.index_category[0] == INDEX_CATEGORY_EXACT && destor.index_category[1] == INDEX_CATEGORY_PHYSICAL_LOCALITY); destor.index_specific = INDEX_SPECIFIC_DDFS; } else if (strcasecmp(argv[3], "sampled index") == 0) { assert(destor.index_category[0] == INDEX_CATEGORY_NEAR_EXACT && destor.index_category[1] == INDEX_CATEGORY_PHYSICAL_LOCALITY); destor.index_specific = INDEX_SPECIFIC_SAMPLED; } else if (strcasecmp(argv[3], "block locality caching") == 0) { assert(destor.index_category[0] == INDEX_CATEGORY_EXACT && destor.index_category[1] == INDEX_CATEGORY_LOGICAL_LOCALITY); destor.index_specific = INDEX_SPECIFIC_BLOCK_LOCALITY_CACHING; } else if (strcasecmp(argv[3], "extreme binning") == 0) { assert(destor.index_category[0] == INDEX_CATEGORY_NEAR_EXACT && destor.index_category[1] == INDEX_CATEGORY_LOGICAL_LOCALITY); destor.index_specific = INDEX_SPECIFIC_EXTREME_BINNING; } else if (strcasecmp(argv[3], "sparse index") == 0) { assert(destor.index_category[0] == INDEX_CATEGORY_NEAR_EXACT && destor.index_category[1] == INDEX_CATEGORY_LOGICAL_LOCALITY); destor.index_specific = INDEX_SPECIFIC_SPARSE; } else if (strcasecmp(argv[3], "silo") == 0) { assert(destor.index_category[0] == INDEX_CATEGORY_NEAR_EXACT && destor.index_category[1] == INDEX_CATEGORY_LOGICAL_LOCALITY); destor.index_specific = INDEX_SPECIFIC_SILO; } else { err = "Invalid index specific"; goto loaderr; } } } else if (strcasecmp(argv[0], "fingerprint-index-cache-size") == 0 && argc == 2) { destor.index_cache_size = atoi(argv[1]); } else if (strcasecmp(argv[0], "fingerprint-index-key-value") == 0 && argc == 2) { if (strcasecmp(argv[1], "htable") == 0) { destor.index_key_value_store = INDEX_KEY_VALUE_HTABLE; } else { err = "Invalid key-value store"; goto loaderr; } } else if (strcasecmp(argv[0], "fingerprint-index-key-size") == 0 && argc == 2) { destor.index_key_size = atoi(argv[1]); } else if (strcasecmp(argv[0], "fingerprint-index-value-length") == 0 && argc == 2) { destor.index_value_length = atoi(argv[1]); } else if (strcasecmp(argv[0], "fingerprint-index-bloom-filter") == 0 && argc == 2) { destor.index_bloom_filter_size = atoi(argv[1]); } else if (strcasecmp(argv[0], "fingerprint-index-sampling-method") == 0 && argc >= 2) { if (strcasecmp(argv[1], "optmin") == 0) destor.index_sampling_method[0] = INDEX_SAMPLING_OPTIMIZED_MIN; else if (strcasecmp(argv[1], "random") == 0) destor.index_sampling_method[0] = INDEX_SAMPLING_RANDOM; else if (strcasecmp(argv[1], "min") == 0) destor.index_sampling_method[0] = INDEX_SAMPLING_MIN; else if (strcasecmp(argv[1], "uniform") == 0) destor.index_sampling_method[0] = INDEX_SAMPLING_UNIFORM; else { err = "Invalid feature method!"; goto loaderr; } if (argc > 2) { destor.index_sampling_method[1] = atoi(argv[2]); } else { destor.index_sampling_method[1] = 0; } } else if (strcasecmp(argv[0], "fingerprint-index-segment-algorithm") == 0 && argc >= 2) { if (strcasecmp(argv[1], "fixed") == 0) destor.index_segment_algorithm[0] = INDEX_SEGMENT_FIXED; else if (strcasecmp(argv[1], "file-defined") == 0) destor.index_segment_algorithm[0] = INDEX_SEGMENT_FILE_DEFINED; else if (strcasecmp(argv[1], "content-defined") == 0) destor.index_segment_algorithm[0] = INDEX_SEGMENT_CONTENT_DEFINED; else { err = "Invalid segment algorithm"; goto loaderr; } if (argc > 2) { assert(destor.index_segment_algorithm[0] != INDEX_SEGMENT_FILE_DEFINED); destor.index_segment_algorithm[1] = atoi(argv[2]); } } else if (strcasecmp(argv[0], "fingerprint-index-segment-boundary") == 0 && argc == 3) { destor.index_segment_min = atoi(argv[1]); destor.index_segment_max = atoi(argv[2]); } else if (strcasecmp(argv[0], "fingerprint-index-segment-selection") == 0 && argc >= 2) { destor.index_segment_selection_method[1] = 1; if (strcasecmp(argv[1], "base") == 0) destor.index_segment_selection_method[0] = INDEX_SEGMENT_SELECT_BASE; else if (strcasecmp(argv[1], "top") == 0) { destor.index_segment_selection_method[0] = INDEX_SEGMENT_SELECT_TOP; if (argc > 2) destor.index_segment_selection_method[1] = atoi(argv[2]); } else if (strcasecmp(argv[1], "mix") == 0) destor.index_segment_selection_method[0] = INDEX_SEGMENT_SELECT_MIX; else { err = "Invalid selection method!"; goto loaderr; } } else if (strcasecmp(argv[0], "fingerprint-index-segment-prefetching") == 0 && argc == 2) { destor.index_segment_prefech = atoi(argv[1]); } else if (strcasecmp(argv[0], "rewrite-algorithm") == 0 && argc >= 2) { if (strcasecmp(argv[1], "no") == 0) destor.rewrite_algorithm[0] = REWRITE_NO; else if (strcasecmp(argv[1], "cfl-based selective deduplication") == 0 || strcasecmp(argv[1], "cfl") == 0) destor.rewrite_algorithm[0] = REWRITE_CFL_SELECTIVE_DEDUPLICATION; else if (strcasecmp(argv[1], "context-based rewriting") == 0 || strcasecmp(argv[1], "cbr") == 0) destor.rewrite_algorithm[0] = REWRITE_CONTEXT_BASED; else if (strcasecmp(argv[1], "capping") == 0 || strcasecmp(argv[1], "cap") == 0) destor.rewrite_algorithm[0] = REWRITE_CAPPING; else { err = "Invalid rewriting algorithm"; goto loaderr; } if (argc > 2) { assert(destor.rewrite_algorithm != REWRITE_NO); destor.rewrite_algorithm[1] = atoi(argv[2]); } else { destor.rewrite_algorithm[1] = 1024; } } else if (strcasecmp(argv[0], "rewrite-enable-cfl-switch") == 0 && argc == 2) { destor.rewrite_enable_cfl_switch = yesnotoi(argv[1]); } else if (strcasecmp(argv[0], "rewrite-cfl-require") == 0 && argc == 2) { destor.rewrite_cfl_require = atof(argv[1]); } else if (strcasecmp(argv[0], "rewrite-cfl-usage-threshold") == 0 && argc == 2) { destor.rewrite_cfl_usage_threshold = atof(argv[1]); } else if (strcasecmp(argv[0], "rewrite-cbr-limit") == 0 && argc == 2) { destor.rewrite_cbr_limit = atof(argv[1]); } else if (strcasecmp(argv[0], "rewrite-cbr-minimal-utility") == 0 && argc == 2) { destor.rewrite_cbr_minimal_utility = atof(argv[1]); } else if (strcasecmp(argv[0], "rewrite-capping-level") == 0 && argc == 2) { destor.rewrite_capping_level = atoi(argv[1]); } else if (strcasecmp(argv[0], "rewrite-enable-har") == 0 && argc == 2) { destor.rewrite_enable_har = yesnotoi(argv[1]); } else if (strcasecmp(argv[0], "rewrite-har-utilization-threshold") == 0 && argc == 2) { destor.rewrite_har_utilization_threshold = atof(argv[1]); } else if (strcasecmp(argv[0], "rewrite-har-rewrite-limit") == 0 && argc == 2) { destor.rewrite_har_rewrite_limit = atof(argv[1]); } else if (strcasecmp(argv[0], "rewrite-enable-cache-aware") == 0 && argc == 2) { destor.rewrite_enable_cache_aware = yesnotoi(argv[1]); } else if (strcasecmp(argv[0], "restore-cache") == 0 && argc == 3) { if (strcasecmp(argv[1], "lru") == 0) destor.restore_cache[0] = RESTORE_CACHE_LRU; else if (strcasecmp(argv[1], "optimal cache") == 0 || strcasecmp(argv[1], "opt") == 0) destor.restore_cache[0] = RESTORE_CACHE_OPT; else if (strcasecmp(argv[1], "forward assembly") == 0 || strcasecmp(argv[1], "asm") == 0) destor.restore_cache[0] = RESTORE_CACHE_ASM; else { err = "Invalid restore cache"; goto loaderr; } destor.restore_cache[1] = atoi(argv[2]); } else if (strcasecmp(argv[0], "restore-opt-window-size") == 0 && argc == 2) { destor.restore_opt_window_size = atoi(argv[1]); } else if (strcasecmp(argv[0], "backup-retention-time") == 0 && argc == 2) { destor.backup_retention_time = atoi(argv[1]); } else { err = "Bad directive or wrong number of arguments"; goto loaderr; } sdsfreesplitres(argv, argc); } sdsfreesplitres(lines, totlines); return; loaderr: fprintf(stderr, "\n*** FATAL CONFIG FILE ERROR in destor ***\n"); fprintf(stderr, "Reading the configuration file, at line %d\n", linenum); fprintf(stderr, ">>> '%s'\n", lines[i]); fprintf(stderr, "%s\n", err); exit(1); }
void load_config_from_string(sds config) { char *err = NULL; int linenum = 0, totlines, i; sds *lines = sdssplitlen(config, strlen(config), "\n", 1, &totlines); for (i = 0; i < totlines; i++) { sds *argv; int argc; linenum = i + 1; lines[i] = sdstrim(lines[i], " \t\r\n"); if (lines[i][0] == '#' || lines[i][0] == '\0') continue; argv = sdssplitargs(lines[i], &argc); if (argv == NULL) { err = "Unbalanced quotes in configuration line"; goto loaderr; } if (argc == 0) { sdsfreesplitres(argv, argc); continue; } sdstolower(argv[0]); if (strcasecmp(argv[0], "working-directory") == 0 && argc == 2) { destor.working_directory = sdscpy(destor.working_directory, argv[1]); } else if (strcasecmp(argv[0], "simulation-level") == 0 && argc == 2) { if (strcasecmp(argv[1], "all") == 0) { destor.simulation_level = SIMULATION_ALL; } else if (strcasecmp(argv[1], "append") == 0) { destor.simulation_level = SIMULATION_APPEND; } else if (strcasecmp(argv[1], "restore") == 0) { destor.simulation_level = SIMULATION_RESTORE; } else if (strcasecmp(argv[1], "no") == 0) { destor.simulation_level = SIMULATION_NO; } else { err = "Invalid simulation level"; goto loaderr; } } else if (strcasecmp(argv[0], "log-level") == 0 && argc == 2) { if (strcasecmp(argv[1], "debug") == 0) { destor.verbosity = DESTOR_DEBUG; } else if (strcasecmp(argv[1], "verbose") == 0) { destor.verbosity = DESTOR_VERBOSE; } else if (strcasecmp(argv[1], "notice") == 0) { destor.verbosity = DESTOR_NOTICE; } else if (strcasecmp(argv[1], "warning") == 0) { destor.verbosity = DESTOR_WARNING; } else { err = "Invalid log level"; goto loaderr; } } else if (strcasecmp(argv[0], "chunk-algorithm") == 0 && argc == 2) { if (strcasecmp(argv[1], "fixed") == 0) { destor.chunk_algorithm = CHUNK_FIXED; } else if (strcasecmp(argv[1], "rabin") == 0) { destor.chunk_algorithm = CHUNK_RABIN; } else if (strcasecmp(argv[1], "normalized rabin") == 0) { destor.chunk_algorithm = CHUNK_NORMALIZED_RABIN; } else { err = "Invalid chunk algorithm"; goto loaderr; } } else if (strcasecmp(argv[0], "chunk-avg-size") == 0 && argc == 2) { destor.chunk_avg_size = atoi(argv[1]); int pwr; for (pwr = 0; destor.chunk_avg_size; pwr++) { destor.chunk_avg_size >>= 1; } destor.chunk_avg_size = 1 << (pwr - 1); } else if (strcasecmp(argv[0], "chunk-max-size") == 0 && argc == 2) {
/* I agree, this is a very rudimental way to load a configuration... will improve later if the config gets more complex */ void loadServerConfig(char *filename) { FILE *fp; char buf[REDIS_CONFIGLINE_MAX+1], *err = NULL; int linenum = 0; sds line = NULL; 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 '%s'", filename); exit(1); } } while(fgets(buf,REDIS_CONFIGLINE_MAX+1,fp) != NULL) { sds *argv; int argc, j; linenum++; line = sdsnew(buf); line = sdstrim(line," \t\r\n"); /* Skip comments and blank lines*/ if (line[0] == '#' || line[0] == '\0') { sdsfree(line); continue; } /* Split into arguments */ argv = sdssplitargs(line,&argc); sdstolower(argv[0]); /* Execute config directives */ if (!strcasecmp(argv[0],"timeout") && argc == 2) { server.maxidletime = atoi(argv[1]); if (server.maxidletime < 0) { err = "Invalid timeout value"; goto loaderr; } } else if (!strcasecmp(argv[0],"port") && argc == 2) { server.port = atoi(argv[1]); if (server.port < 0 || server.port > 65535) { err = "Invalid port"; goto loaderr; } } else if (!strcasecmp(argv[0],"bind") && argc == 2) { server.bindaddr = zstrdup(argv[1]); } else if (!strcasecmp(argv[0],"formula") && argc == 2) { void *val = loadfm(argv[1]); if(!val) goto loaderr; int retval = dictAdd(server.fms, sdsnew(argv[1]), val); if(retval != DICT_OK) goto loaderr; } else if (!strcasecmp(argv[0],"dir") && argc == 2) { if (chdir(argv[1]) == -1) { redisLog(REDIS_WARNING,"Can't chdir to '%s': %s", argv[1], strerror(errno)); exit(1); } } else if (!strcasecmp(argv[0],"loglevel") && argc == 2) { if (!strcasecmp(argv[1],"debug")) server.verbosity = REDIS_DEBUG; else if (!strcasecmp(argv[1],"verbose")) server.verbosity = REDIS_VERBOSE; else if (!strcasecmp(argv[1],"notice")) server.verbosity = REDIS_NOTICE; else if (!strcasecmp(argv[1],"warning")) server.verbosity = REDIS_WARNING; else { err = "Invalid log level. Must be one of debug, notice, warning"; goto loaderr; } } else if (!strcasecmp(argv[0],"logfile") && argc == 2) { FILE *logfp; server.logfile = zstrdup(argv[1]); if (!strcasecmp(server.logfile,"stdout")) { zfree(server.logfile); server.logfile = NULL; } 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... */ logfp = fopen(server.logfile,"a"); if (logfp == NULL) { err = sdscatprintf(sdsempty(), "Can't open the log file: %s", strerror(errno)); goto loaderr; } fclose(logfp); } } else if (!strcasecmp(argv[0],"databases") && argc == 2) { server.dbnum = atoi(argv[1]); if (server.dbnum < 1) { err = "Invalid number of databases"; goto loaderr; } } else if (!strcasecmp(argv[0],"maxclients") && argc == 2) { server.maxclients = atoi(argv[1]); } else if (!strcasecmp(argv[0],"daemonize") && argc == 2) { if ((server.daemonize = yesnotoi(argv[1])) == -1) { err = "argument must be 'yes' or 'no'"; goto loaderr; } } else if (!strcasecmp(argv[0],"pidfile") && argc == 2) { zfree(server.pidfile); server.pidfile = zstrdup(argv[1]); } else { err = "Bad directive or wrong number of arguments"; goto loaderr; } for (j = 0; j < argc; j++) sdsfree(argv[j]); zfree(argv); sdsfree(line); } if (fp != stdin) fclose(fp); return; loaderr: fprintf(stderr, "\n*** FATAL CONFIG FILE ERROR ***\n"); fprintf(stderr, "Reading the configuration file, at line %d\n", linenum); fprintf(stderr, ">>> '%s'\n", line); fprintf(stderr, "%s\n", err); exit(1); }
static int initFromConfigBuffer (sds config, conf_t * conf) { char *err = NULL; int linenum = 0, totlines, i; sds *lines; lines = sdssplitlen (config, sdslen (config), "\n", 1, &totlines); for (i = 0; i < totlines; i++) { sds *argv; int argc; linenum = i + 1; lines[i] = sdstrim (lines[i], " \t\r\n"); /* Skip comments and blank lines */ if (lines[i][0] == '#' || lines[i][0] == '\0') continue; /* Split into arguments */ argv = sdssplitargs (lines[i], &argc); if (argv == NULL) { err = "Unbalanced quotes in configuration line"; goto err; } /* Skip this line if the resulting command vector is empty. */ if (argc == 0) { sdsfreesplitres (argv, argc); continue; } sdstolower (argv[0]); if (!strcasecmp (argv[0], "zookeeper") && argc == 2) { conf->zk_addr = strdup (argv[1]); } else if (!strcasecmp (argv[0], "cluster_name") && argc == 2) { conf->cluster_name = strdup (argv[1]); } else if (!strcasecmp (argv[0], "port") && argc == 2) { conf->port = atoi (argv[1]); if (conf->port < 0 || conf->port > 65535) { sdsfreesplitres (argv, argc); err = "Invalid port"; goto err; } } else if (!strcasecmp (argv[0], "daemonize") && argc == 2) { if (!strcasecmp (argv[1], "yes")) { conf->daemonize = 1; } else if (!strcasecmp (argv[1], "no")) { conf->daemonize = 0; } else { sdsfreesplitres (argv, argc); err = "argument must be 'yes' or 'no'"; goto err; } } else if (!strcasecmp (argv[0], "num_conn_per_gw") && argc == 2) { conf->capi_conf.num_conn_per_gw = atoi (argv[1]); if (conf->capi_conf.num_conn_per_gw < 1 || conf->capi_conf.num_conn_per_gw > 32) { sdsfreesplitres (argv, argc); err = "Invalid num_conn_per_gw value"; goto err; } } else if (!strcasecmp (argv[0], "init_timeout_millis") && argc == 2) { conf->capi_conf.init_timeout_millis = atoi (argv[1]); if (conf->capi_conf.init_timeout_millis < 3000 || conf->capi_conf.init_timeout_millis > 600000) { sdsfreesplitres (argv, argc); err = "Invalid init_timeout_millis value"; goto err; } } else if (!strcasecmp (argv[0], "log_level") && argc == 2) { if (!strcasecmp (argv[1], "NOLOG")) { conf->capi_conf.log_level = ARC_LOG_LEVEL_NOLOG; } else if (!strcasecmp (argv[1], "ERROR")) { conf->capi_conf.log_level = ARC_LOG_LEVEL_ERROR; } else if (!strcasecmp (argv[1], "WARN")) { conf->capi_conf.log_level = ARC_LOG_LEVEL_WARN; } else if (!strcasecmp (argv[1], "INFO")) { conf->capi_conf.log_level = ARC_LOG_LEVEL_INFO; } else if (!strcasecmp (argv[1], "DEBUG")) { conf->capi_conf.log_level = ARC_LOG_LEVEL_DEBUG; } else { sdsfreesplitres (argv, argc); err = "Invalid log_level value"; goto err; } } else if (!strcasecmp (argv[0], "log_file_prefix") && argc == 2) { if (argv[1][0] != '\0') { conf->capi_conf.log_file_prefix = strdup (argv[1]); } } else if (!strcasecmp (argv[0], "max_fd") && argc == 2) { conf->capi_conf.max_fd = atoi (argv[1]); if (conf->capi_conf.max_fd < 1024 || conf->capi_conf.max_fd > 16000) { sdsfreesplitres (argv, argc); err = "Invalid max_fd value"; goto err; } } else if (!strcasecmp (argv[0], "conn_reconnect_millis") && argc == 2) { conf->capi_conf.conn_reconnect_millis = atoi (argv[1]); if (conf->capi_conf.conn_reconnect_millis < 100 || conf->capi_conf.conn_reconnect_millis > 600000) { sdsfreesplitres (argv, argc); err = "Invalid conn_reconnect_millis value"; goto err; } } else if (!strcasecmp (argv[0], "zk_reconnect_millis") && argc == 2) { conf->capi_conf.zk_reconnect_millis = atoi (argv[1]); if (conf->capi_conf.zk_reconnect_millis < 100 || conf->capi_conf.zk_reconnect_millis > 600000) { sdsfreesplitres (argv, argc); err = "Invalid zk_reconnect_millis value"; goto err; } } else if (!strcasecmp (argv[0], "zk_session_timeout_millis") && argc == 2) { conf->capi_conf.zk_session_timeout_millis = atoi (argv[1]); if (conf->capi_conf.zk_session_timeout_millis < 1000 || conf->capi_conf.zk_session_timeout_millis > 600000) { sdsfreesplitres (argv, argc); err = "Invalid zk_session_timeout_millis value"; goto err; } } else if (!strcasecmp (argv[0], "local_proxy_query_timeout_millis") && argc == 2) { conf->query_timeout_millis = atoi (argv[1]); if (conf->query_timeout_millis < 1000 || conf->query_timeout_millis > 600000) { sdsfreesplitres (argv, argc); err = "Invalid local_proxy_query_timeout_millis"; goto err; } } else { sdsfreesplitres (argv, argc); err = "Bad directive or wrong number of arguments"; goto err; } sdsfreesplitres (argv, argc); } sdsfreesplitres (lines, totlines); return 0; err: fprintf (stderr, "\n*** FATAL CONFIG FILE ERROR ***\n"); fprintf (stderr, "Reading the configuration file, at line %d\n", linenum); fprintf (stderr, ">>> '%s'\n", lines[i]); fprintf (stderr, "%s\n", err); sdsfreesplitres (lines, totlines); return -1; }