2 * Cookie Caching stuff. Adam wrote this, apparently just some
3 * derivatives of n's SNAC work. I cleaned it up, added comments.
8 * I'm assuming that cookies are type-specific. that is, we can have
9 * "1234578" for type 1 and type 2 concurrently. if i'm wrong, then we
10 * lose some error checking. if we assume cookies are not type-specific and are
11 * wrong, we get quirky behavior when cookies step on each others' toes.
18 * aim_cachecookie - appends a cookie to the cookie list
19 * @sess: session to add to
20 * @cookie: pointer to struct to append
22 * if cookie->cookie for type cookie->type is found, updates the
23 * ->addtime of the found structure; otherwise adds the given cookie
26 * returns -1 on error, 0 on append, 1 on update. the cookie you pass
27 * in may be free'd, so don't count on its value after calling this!
30 faim_internal int aim_cachecookie(struct aim_session_t *sess,
31 struct aim_msgcookie_t *cookie)
33 struct aim_msgcookie_t *newcook;
38 if( (newcook = aim_checkcookie(sess, cookie->cookie, cookie->type)) ) {
39 if(newcook != cookie) {
40 aim_cookie_free(sess, newcook);
42 newcook->addtime = time(NULL);
47 cookie->addtime = time(NULL);
49 cookie->next = sess->msgcookies;
50 sess->msgcookies = cookie;
56 * aim_uncachecookie - grabs a cookie from the cookie cache (removes it from the list)
57 * @sess: session to grab cookie from
58 * @cookie: cookie string to look for
59 * @type: cookie type to look for
61 * takes a cookie string and a cookie type and finds the cookie struct associated with that duple, removing it from the cookie list ikn the process.
63 * if found, returns the struct; if none found (or on error), returns NULL:
65 faim_internal struct aim_msgcookie_t *aim_uncachecookie(struct aim_session_t *sess, unsigned char *cookie, int type)
67 struct aim_msgcookie_t *cur, **prev;
69 if (!cookie || !sess->msgcookies)
72 for (prev = &sess->msgcookies; (cur = *prev); ) {
73 if ((cur->type == type) &&
74 (memcmp(cur->cookie, cookie, 8) == 0)) {
85 * aim_mkcookie - generate an aim_msgcookie_t *struct from a cookie string, a type, and a data pointer.
86 * @c: pointer to the cookie string array
87 * @type: cookie type to use
88 * @data: data to be cached with the cookie
90 * returns NULL on error, a pointer to the newly-allocated cookie on
94 faim_internal struct aim_msgcookie_t *aim_mkcookie(unsigned char *c, int type, void *data)
96 struct aim_msgcookie_t *cookie;
101 if (!(cookie = calloc(1, sizeof(struct aim_msgcookie_t))))
106 memcpy(cookie->cookie, c, 8);
112 * aim_checkcookie - check to see if a cookietuple has been cached
113 * @sess: session to check for the cookie in
114 * @cookie: pointer to the cookie string array
115 * @type: type of the cookie to look for
117 * this returns a pointer to the cookie struct (still in the list) on
118 * success; returns NULL on error/not found
122 faim_internal struct aim_msgcookie_t *aim_checkcookie(struct aim_session_t *sess,
123 const unsigned char *cookie,
126 struct aim_msgcookie_t *cur;
128 for (cur = sess->msgcookies; cur; cur = cur->next) {
129 if ((cur->type == type) &&
130 (memcmp(cur->cookie, cookie, 8) == 0))
137 #if 0 /* debugging feature */
138 faim_internal int aim_dumpcookie(struct aim_msgcookie_t *cookie)
142 printf("\tCookie at %p: %d/%s with %p, next %p\n", cookie, cookie->type, cookie->cookie, cookie->data, cookie->next);
148 * aim_cookie_free - free an aim_msgcookie_t struct
149 * @sess: session to remove the cookie from
150 * @cookiep: the address of a pointer to the cookie struct to remove
152 * this function removes the cookie *cookie from teh list of cookies
153 * in sess, and then frees all memory associated with it. including
154 * its data! if you want to use the private data after calling this,
155 * make sure you copy it first.
157 * returns -1 on error, 0 on success.
161 faim_internal int aim_cookie_free(struct aim_session_t *sess,
162 struct aim_msgcookie_t *cookie)
164 struct aim_msgcookie_t *cur, **prev;
166 if (!sess || !cookie)
172 for (prev = &sess->msgcookies; (cur = *prev); ) {
187 faim_internal int aim_msgcookie_gettype(int reqclass) {
188 /* XXX: hokey-assed. needs fixed. */
190 case AIM_CAPS_BUDDYICON:
191 return AIM_COOKIETYPE_OFTICON;
194 return AIM_COOKIETYPE_OFTVOICE;
196 case AIM_CAPS_IMIMAGE:
197 return AIM_COOKIETYPE_OFTIMAGE;
200 return AIM_COOKIETYPE_CHAT;
202 case AIM_CAPS_GETFILE:
203 return AIM_COOKIETYPE_OFTGET;
205 case AIM_CAPS_SENDFILE:
206 return AIM_COOKIETYPE_OFTSEND;
209 return AIM_COOKIETYPE_UNKNOWN;