- cookie->key = key;
- cookie->value = value;
- cookie->freecb = freecb;
- cookie->next = session->cookies;
- session->cookies = cookie;
- return 0;
+ lock(session);
+ cookie = cookie_search(session, key, &idx);
+ value = cookie ? cookie->value : NULL;
+ unlock(session);
+ return value;
+}
+
+int afb_session_set_cookie(struct afb_session *session, const void *key, void *value, void (*freecb)(void*))
+{
+ int idx;
+ struct cookie *cookie;
+
+ lock(session);
+ cookie = cookie_search(session, key, &idx);
+ if (!cookie)
+ cookie = cookie_add(session, idx, key, value, freecb);
+ else {
+ if (cookie->value != value && cookie->freecb)
+ cookie->freecb(cookie->value);
+ cookie->value = value;
+ cookie->freecb = freecb;
+ }
+ unlock(session);
+ return -!cookie;