PUBLIC int websTimeOpen() { TimeToken *tt; timeTokens = hashCreate(59); for (tt = days; tt->name; tt++) { hashEnter(timeTokens, tt->name, valueSymbol(tt), 0); } for (tt = fullDays; tt->name; tt++) { hashEnter(timeTokens, tt->name, valueSymbol(tt), 0); } for (tt = months; tt->name; tt++) { hashEnter(timeTokens, tt->name, valueSymbol(tt), 0); } for (tt = fullMonths; tt->name; tt++) { hashEnter(timeTokens, tt->name, valueSymbol(tt), 0); } for (tt = ampm; tt->name; tt++) { hashEnter(timeTokens, tt->name, valueSymbol(tt), 0); } for (tt = zones; tt->name; tt++) { hashEnter(timeTokens, tt->name, valueSymbol(tt), 0); } for (tt = offsets; tt->name; tt++) { hashEnter(timeTokens, tt->name, valueSymbol(tt), 0); } return 0; }
/* Define a function in the "action" map space */ PUBLIC int websDefineAction(char *name, void *fn) { assert(name && *name); assert(fn); if (fn == NULL) { return -1; } hashEnter(actionTable, name, valueSymbol(fn), 0); return 0; }
/* Define a function in the "action" map space */ PUBLIC int websDefineAction(char *name, void *fn) { assure(name && *name); assure(fn); if (fn == NULL) { return -1; } hashEnter(formSymtab, name, valueSymbol(fn), 0); return 0; }
PUBLIC int websFsOpen() { #if BIT_ROM WebsRomIndex *wip; char name[BIT_GOAHEAD_LIMIT_FILENAME]; ssize len; romFs = hashCreate(WEBS_HASH_INIT); for (wip = websRomIndex; wip->path; wip++) { strncpy(name, wip->path, BIT_GOAHEAD_LIMIT_FILENAME); len = strlen(name) - 1; if (len > 0 && (name[len] == '/' || name[len] == '\\')) { name[len] = '\0'; } hashEnter(romFs, name, valueSymbol(wip), 0); } #endif return 0; }
WebsUser *websAddUser(char *username, char *password, char *roles) { WebsUser *user; if (!username) { error("User is missing name"); return 0; } if (websLookupUser(username)) { error("User %s already exists", username); /* Already exists */ return 0; } if ((user = createUser(username, password, roles)) == 0) { return 0; } if (hashEnter(users, username, valueSymbol(user), 0) == 0) { return 0; } return user; }
WebsRole *websAddRole(char *name, WebsHash abilities) { WebsRole *rp; if (!name) { error("Role is missing name"); return 0; } if (hashLookup(roles, name)) { error("Role %s already exists", name); /* Already exists */ return 0; } if ((rp = walloc(sizeof(WebsRole))) == 0) { return 0; } rp->abilities = abilities; if (hashEnter(roles, name, valueSymbol(rp), 0) == 0) { return 0; } return rp; }
static void computeAbilities(WebsHash abilities, char *role, int depth) { WebsRole *rp; WebsKey *key; assure(abilities >= 0); assure(role && *role); assure(depth >= 0); if (depth > 20) { error("Recursive ability definition for %s", role); return; } if (roles >= 0) { if ((key = hashLookup(roles, role)) != 0) { rp = (WebsRole*) key->content.value.symbol; for (key = hashFirst(rp->abilities); key; key = hashNext(rp->abilities, key)) { computeAbilities(abilities, key->name.value.string, ++depth); } } else { hashEnter(abilities, role, valueInteger(0), 0); } } }
static int processContentData(Webs *wp) { WebsUpload *file; WebsBuf *content; ssize size, nbytes; char *data, *bp; content = &wp->input; file = wp->currentFile; size = bufLen(content); if (size < wp->boundaryLen) { /* Incomplete boundary. Return and get more data */ return 0; } if ((bp = getBoundary(wp, content->servp, size)) == 0) { trace(7, "uploadFilter: Got boundary filename %x", wp->clientFilename); if (wp->clientFilename) { /* No signature found yet. probably more data to come. Must handle split boundaries. */ data = content->servp; nbytes = ((int) (content->endp - data)) - (wp->boundaryLen - 1); if (nbytes > 0 && writeToFile(wp, content->servp, nbytes) < 0) { return -1; } websConsumeInput(wp, nbytes); /* Get more data */ return 0; } } data = content->servp; nbytes = (bp) ? (bp - data) : bufLen(content); if (nbytes > 0) { websConsumeInput(wp, nbytes); /* This is the CRLF before the boundary */ if (nbytes >= 2 && data[nbytes - 2] == '\r' && data[nbytes - 1] == '\n') { nbytes -= 2; } if (wp->clientFilename) { /* Write the last bit of file data and add to the list of files and define environment variables */ if (writeToFile(wp, data, nbytes) < 0) { return -1; } hashEnter(wp->files, wp->uploadVar, valueSymbol(file), 0); defineUploadVars(wp); } else { /* Normal string form data variables */ data[nbytes] = '\0'; trace(5, "uploadFilter: form[%s] = %s", wp->uploadVar, data); websDecodeUrl(wp->uploadVar, wp->uploadVar, -1); websDecodeUrl(data, data, -1); websSetVar(wp, wp->uploadVar, data); } } if (wp->clientFilename) { /* Now have all the data (we've seen the boundary) */ close(wp->upfd); wp->upfd = -1; wp->clientFilename = 0; wfree(wp->uploadTmp); wp->uploadTmp = 0; } wp->uploadState = UPLOAD_BOUNDARY; return 0; }