// Session UUID are store in a simple array [for 10 sessions this should be enough]
static struct {
pthread_mutex_t mutex; // declare a mutex to protect hash table
- struct afb_session **store; // sessions store
+ struct afb_session **store; // sessions store
int count; // current number of sessions
int max;
int timeout;
}
// Free context [XXXX Should be protected again memory abort XXXX]
-static void free_data (struct afb_session *session)
+static void remove_all_cookies(struct afb_session *session)
{
int idx;
struct cookie *cookie, *next;
{
struct afb_session *session;
+ if (!AFB_SESSION_TIMEOUT_IS_VALID(timeout)
+ || (uuid && strlen(uuid) >= sizeof session->uuid)) {
+ errno = EINVAL;
+ goto error;
+ }
+
/* allocates a new one */
session = calloc(1, sizeof *session);
if (session == NULL) {
if (uuid == NULL) {
do { new_uuid(session->uuid); } while(search(session->uuid));
} else {
- if (strlen(uuid) >= sizeof session->uuid) {
- errno = EINVAL;
- goto error2;
- }
strcpy(session->uuid, uuid);
}
/* init the token */
strcpy(session->token, sessions.initok);
+
+ /* init timeout */
+ if (timeout == AFB_SESSION_TIMEOUT_DEFAULT)
+ timeout = sessions.timeout;
session->timeout = timeout;
- if (timeout != 0)
- session->expiration = now + timeout;
- else {
+ session->expiration = now + timeout;
+ if (timeout == AFB_SESSION_TIMEOUT_INFINITE || session->expiration < 0) {
session->expiration = (time_t)(~(time_t)0);
if (session->expiration < 0)
session->expiration = (time_t)(((unsigned long long)session->expiration) >> 1);
return NULL;
}
+/* Creates a new session with 'timeout' */
struct afb_session *afb_session_create (int timeout)
{
time_t now;
return make_session(NULL, timeout, now);
}
-// This function will return exiting session or newly created session
-struct afb_session *afb_session_get (const char *uuid, int *created)
+/* Searchs the session of 'uuid' */
+struct afb_session *afb_session_search (const char *uuid)
+{
+ time_t now;
+ struct afb_session *session;
+
+ /* cleaning */
+ now = NOW;
+ cleanup (now);
+ session = search(uuid);
+ return session;
+
+}
+
+/* This function will return exiting session or newly created session */
+struct afb_session *afb_session_get (const char *uuid, int timeout, int *created)
{
struct afb_session *session;
time_t now;
/* search for an existing one not too old */
if (uuid != NULL) {
session = search(uuid);
- if (!created)
- return session;
if (session != NULL) {
- *created = 0;
+ if (created)
+ *created = 0;
session->access = now;
session->refcount++;
return session;
}
}
+ /* no existing session found, create it */
+ session = make_session(uuid, timeout, now);
if (created)
- *created = 1;
+ *created = !!session;
- return make_session(uuid, sessions.timeout, now);
+ return session;
}
struct afb_session *afb_session_addref(struct afb_session *session)
assert(session != NULL);
if (session->uuid[0] != 0) {
session->uuid[0] = 0;
- free_data (session);
+ remove_all_cookies(session);
if (session->refcount == 0) {
destroy (session);
free(session);
session->expiration = NOW + session->timeout;
}
+/* Returns the uuid of 'session' */
const char *afb_session_uuid (struct afb_session *session)
{
assert(session != NULL);
return session->uuid;
}
+/* Returns the token of 'session' */
const char *afb_session_token (struct afb_session *session)
{
assert(session != NULL);
return session->token;
}
+/* Set, get, replace, remove a cookie key */
void *afb_session_cookie(struct afb_session *session, const void *key, void *(*makecb)(void *closure), void (*freecb)(void *item), void *closure, int replace)
{
int idx;