/* * Creates a new session for the user. */ static struct session *create_session(const char *user, const struct http_message *hm) { /* Find first available slot or use the oldest one. */ struct session *s = NULL; struct session *oldest_s = s_sessions; for (int i = 0; i < NUM_SESSIONS; i++) { if (s_sessions[i].id == 0) { s = &s_sessions[i]; break; } if (s_sessions[i].last_used < oldest_s->last_used) { oldest_s = &s_sessions[i]; } } if (s == NULL) { destroy_session(oldest_s); printf("Evicted %" INT64_X_FMT "/%s\n", oldest_s->id, oldest_s->user); s = oldest_s; } /* Initialize new session. */ s->created = s->last_used = mg_time(); s->user = strdup(user); s->lucky_number = rand(); /* Create an ID by putting various volatiles into a pot and stirring. */ cs_sha1_ctx ctx; cs_sha1_init(&ctx); cs_sha1_update(&ctx, (const unsigned char *) hm->message.p, hm->message.len); cs_sha1_update(&ctx, (const unsigned char *) s, sizeof(*s)); unsigned char digest[20]; cs_sha1_final(digest, &ctx); s->id = *((uint64_t *) digest); return s; }
void esp_init_conf(struct v7 *v7) { #ifndef RTOS_TODO int valid; unsigned char sha[20]; cs_sha1_ctx ctx; cs_sha1_init(&ctx); cs_sha1_update(&ctx, (unsigned char *) V7_DEV_CONF_STR, strnlen(V7_DEV_CONF_STR, 0x1000 - 20)); cs_sha1_final(sha, &ctx); valid = (memcmp(V7_DEV_CONF_SHA1, sha, 20) == 0); sj_init_conf(v7, valid ? V7_DEV_CONF_STR : NULL); #else sj_init_conf(v7, NULL); #endif }