- /* search for a replacement */
- cookie = session->cookies;
- while(cookie != NULL) {
- if (cookie->key == key) {
- if (cookie->value != NULL && cookie->value != value && cookie->freecb != NULL)
- cookie->freecb(cookie->value);
- cookie->value = value;
- cookie->freecb = freecb;
- return 0;
- }
- cookie = cookie->next;
- }
-
- /* allocates */
- cookie = malloc(sizeof *cookie);
- if (cookie == NULL) {
- errno = ENOMEM;
- return -1;
+ 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;