AtomListPtr findProxyClient(char *line) { AtomListPtr alv; AtomPtr name, value; int i=0; alv = makeAtomList(NULL, 0); if(alv == NULL) { do_log(L_ERROR, "couldn't allocate atom list.\n"); return NULL; } while(1) { i = parseAtom1(line, i, &value,1); //if(i < 0) goto syntax; if(!value) { do_log(L_ERROR, "couldn't allocate atom.\n"); return NULL; } //printf("%s\n",value->string); atomListCons(value, alv); i = skipWhitespace(line, i); if(line[i] == '\n' || line[i] == '\0' || line[i] == '#') break; if(line[i] != ',') { destroyAtomList(alv); //goto syntax; } i = skipWhitespace(line, i + 1); } return alv; }
int httpSpecialDoSideFinish(AtomPtr data, HTTPRequestPtr requestor) { ObjectPtr object = requestor->object; if (matchUrl("/s_server/config", object)) { AtomListPtr list = NULL; int i, rc; if (disableConfiguration) { abortObject(object, 403, internAtom("Action not allowed")); goto out; } list = urlDecode(data->string, data->length); if (list == NULL) { abortObject(object, 400, internAtom ("Couldn't parse variable to set")); goto out; } for (i = 0; i < list->length; i++) { rc = parseConfigLine(list->list[i]->string, NULL, 0, 1); if (rc < 0) { abortObject(object, 400, rc == -1 ? internAtom ("Couldn't parse variable to set") : internAtom ("Variable is not settable")); destroyAtomList(list); goto out; } } destroyAtomList(list); object->date = current_time.tv_sec; object->age = current_time.tv_sec; object->headers = internAtom("\r\nLocation: /s_server/config?"); object->code = 303; object->message = internAtom("Done"); object->flags &= ~OBJECT_INITIAL; object->length = 0; } else if (matchUrl("/s_server/status", object)) { AtomListPtr list = NULL; int i; if (disableConfiguration) { abortObject(object, 403, internAtom("Action not allowed")); goto out; } list = urlDecode(data->string, data->length); if (list == NULL) { abortObject(object, 400, internAtom("Couldn't parse action")); goto out; } for (i = 0; i < list->length; i++) { char *equals = memchr(list->list[i]->string, '=', list->list[i]->length); AtomPtr name = equals ? internAtomN(list->list[i]->string, equals - list-> list[i]->string) : retainAtom(list->list[i]); if (name == atomInitForbidden) initForbidden(); else if (name == atomReopenLog) reopenLog(); else if (name == atomDiscardObjects) discardObjects(1, 0); else if (name == atomWriteoutObjects) writeoutObjects(1); else if (name == atomFreeChunkArenas) free_chunk_arenas(); else { abortObject(object, 400, internAtomF("Unknown action %s", name->string)); releaseAtom(name); destroyAtomList(list); goto out; } releaseAtom(name); } destroyAtomList(list); object->date = current_time.tv_sec; object->age = current_time.tv_sec; object->headers = internAtom("\r\nLocation: /s_server/status?"); object->code = 303; object->message = internAtom("Done"); object->flags &= ~OBJECT_INITIAL; object->length = 0; } else { abortObject(object, 405, internAtom("Method not allowed")); } out: releaseAtom(data); notifyObject(object); requestor->connection->flags &= ~CONN_READER; return 1; }
int parseConfigLine(char *line, char *filename, int lineno, int set) { int x0, x1; int i, from, to; AtomPtr name, value; ConfigVariablePtr var; int iv; float fv; AtomPtr av; AtomListPtr alv; IntListPtr ilv; i = skipWhitespace(line, 0); if(line[i] == '\n' || line[i] == '\0' || line[i] == '#') return 0; x0 = i; while(letter(line[i]) || digit(line[i])) i++; x1 = i; i = skipWhitespace(line, i); if(line[i] != '=') { goto syntax; } i++; i = skipWhitespace(line, i); name = internAtomN(line + x0, x1 - x0); var = findConfigVariable(name); releaseAtom(name); if(set && var->setter == NULL) return -2; if(var == NULL) { if(!set) { do_log(L_ERROR, "%s:%d: unknown config variable ", filename, lineno); do_log_n(L_ERROR, line + x0, x1 - x0); do_log(L_ERROR, "\n"); } return -1; } i = skipWhitespace(line, i); switch(var->type) { case CONFIG_INT: case CONFIG_OCTAL: case CONFIG_HEX: i = parseInt(line, i, &iv); if(i < 0) goto syntax; if(set) var->setter(var, &iv); else *var->value.i = iv; break; case CONFIG_TIME: i = parseTime(line, i, &iv); if(i < 0) goto syntax; i = skipWhitespace(line, i); if(line[i] != '\n' && line[i] != '\0' && line[i] != '#') goto syntax; if(set) var->setter(var, &iv); else *var->value.i = iv; break; case CONFIG_BOOLEAN: case CONFIG_TRISTATE: case CONFIG_TETRASTATE: case CONFIG_PENTASTATE: iv = parseState(line, i, var->type); if(iv < 0) goto syntax; if(set) var->setter(var, &iv); else *var->value.i = iv; break; case CONFIG_FLOAT: if(!digit(line[i]) && line[i] != '.') goto syntax; fv = atof(line + i); if(set) var->setter(var, &fv); else *var->value.f = fv; break; case CONFIG_ATOM: case CONFIG_ATOM_LOWER: case CONFIG_PASSWORD: i = parseAtom(line, i, &av, (var->type == CONFIG_ATOM_LOWER)); if(i < 0) goto syntax; if(!av) { if(!set) do_log(L_ERROR, "%s:%d: couldn't allocate atom.\n", filename, lineno); return -1; } i = skipWhitespace(line, i); if(line[i] != '\n' && line[i] != '\0' && line[i] != '#') { releaseAtom(av); goto syntax; } if(set) var->setter(var, &av); else { if(*var->value.a) releaseAtom(*var->value.a); *var->value.a = av; } break; case CONFIG_INT_LIST: ilv = makeIntList(0); if(ilv == NULL) { if(!set) do_log(L_ERROR, "%s:%d: couldn't allocate int list.\n", filename, lineno); return -1; } while(1) { i = parseInt(line, i, &from); if(i < 0) goto syntax; to = from; i = skipWhitespace(line, i); if(line[i] == '-') { i = skipWhitespace(line, i + 1); i = parseInt(line, i, &to); if(i < 0) { destroyIntList(ilv); goto syntax; } i = skipWhitespace(line, i); } intListCons(from, to, ilv); if(line[i] == '\n' || line[i] == '\0' || line[i] == '#') break; if(line[i] != ',') { destroyIntList(ilv); goto syntax; } i = skipWhitespace(line, i + 1); } if(set) var->setter(var, &ilv); else { if(*var->value.il) destroyIntList(*var->value.il); *var->value.il = ilv; } break; case CONFIG_ATOM_LIST: case CONFIG_ATOM_LIST_LOWER: alv = makeAtomList(NULL, 0); if(alv == NULL) { if(!set) do_log(L_ERROR, "%s:%d: couldn't allocate atom list.\n", filename, lineno); return -1; } while(1) { i = parseAtom(line, i, &value, (var->type == CONFIG_ATOM_LIST_LOWER)); if(i < 0) goto syntax; if(!value) { if(!set) do_log(L_ERROR, "%s:%d: couldn't allocate atom.\n", filename, lineno); return -1; } atomListCons(value, alv); i = skipWhitespace(line, i); if(line[i] == '\n' || line[i] == '\0' || line[i] == '#') break; if(line[i] != ',') { destroyAtomList(alv); goto syntax; } i = skipWhitespace(line, i + 1); } if(set) var->setter(var, &alv); else { if(*var->value.al) destroyAtomList(*var->value.al); *var->value.al = alv; } break; default: abort(); } return 1; syntax: if(!set) do_log(L_ERROR, "%s:%d: parse error.\n", filename, lineno); return -1; }