Mercurial > pidgin
view libfaim/aim_snac.c @ 166:c3970e022b72
[gaim-migrate @ 176]
I'll commit this back for nwo ..
committer: Tailor Script <tailor@pidgin.im>
author | Rob Flynn <gaim@robflynn.com> |
---|---|
date | Mon, 24 Apr 2000 17:57:52 +0000 |
parents | 68b230f8da5f |
children | 6ced2f1c8b24 |
line wrap: on
line source
/* * * Various SNAC-related dodads... * * outstanding_snacs is a list of aim_snac_t structs. A SNAC should be added * whenever a new SNAC is sent and it should remain in the list until the * response for it has been receieved. * * First edition badly written by Adam Fritzler (afritz@delphid.ml.org) * Current edition nicely rewritten (it even works) by n (n@ml.org) * */ #include <aim.h> #include <assert.h> struct aim_snac_t *aim_outstanding_snacs = NULL; u_long aim_snac_nextid = 0x00000001; u_long aim_newsnac(struct aim_snac_t *newsnac) { struct aim_snac_t *snac = NULL, *cur = aim_outstanding_snacs; assert(newsnac != NULL); snac = calloc(1, sizeof(struct aim_snac_t)); assert(snac != NULL); memcpy(snac, newsnac, sizeof(struct aim_snac_t)); snac->issuetime = time(&snac->issuetime); snac->next = NULL; if (cur == NULL) { aim_outstanding_snacs = snac; return(snac->id); } while (cur->next != NULL) cur = cur->next; cur->next = snac; return(snac->id); } struct aim_snac_t *aim_remsnac(u_long id) { struct aim_snac_t *cur = aim_outstanding_snacs; if (cur == NULL) return(NULL); if (cur->id == id) { aim_outstanding_snacs = cur->next; return(cur); } while (cur->next != NULL) { if (cur->next->id == id) { struct aim_snac_t *tmp = NULL; tmp = cur->next; cur->next = cur->next->next; return(tmp); } cur = cur->next; } return(NULL); } /* * This is for cleaning up old SNACs that either don't get replies or * a reply was never received for. Garabage collection. Plain and simple. * * maxage is the _minimum_ age in seconds to keep SNACs (though I don't know * why its called _max_age). * */ int aim_cleansnacs(int maxage) { struct aim_snac_t *cur = aim_outstanding_snacs; struct aim_snac_t *remed = NULL; time_t curtime; curtime = time(&curtime); while (cur) { if ( (cur) && (((cur->issuetime) + maxage) < curtime)) { #if DEBUG > 1 printf("aimsnac: WARNING purged obsolete snac %ul\n", cur->id); #endif remed = aim_remsnac(cur->id); if (remed) { if (remed->data) free(remed->data); free(remed); } } cur = cur->next; } return 0; } int aim_putsnac(u_char *buf, int family, int subtype, int flags, u_long snacid) { int curbyte = 0; curbyte += aimutil_put16(buf+curbyte,family&0xffff); curbyte += aimutil_put16(buf+curbyte,subtype&0xffff); curbyte += aimutil_put16(buf+curbyte,flags&0xffff); curbyte += aimutil_put32(buf+curbyte,snacid); return curbyte; }