+Fri Oct 9 18:34:06 EDT 1998 Art Cancro <ajc@uncnsrd.mt-kisco.ny.us>
+ * user_ops.c: added PurgeStaleRelationships() to do processing at
+ session logout time to remove visits for rooms which no longer exist
+
1998-10-09 Nathan Bryant <bryant@cs.usm.maine.edu>
* serv_chat.c: fix buffer overrun that was resulting in segv's
/* Deallocate any message list we might have in memory */
if (CC->msglist != NULL) free(CC->msglist);
+ /* Purge any stale user/room relationships */
+ PurgeStaleRelationships();
+
/* Now get rid of the session and context */
- lprintf(7, "cleanup_stuff() is calling RemoveContext(%d)\n", CC->cs_pid);
+ lprintf(7, "cleanup_stuff() calling RemoveContext(%d)\n", CC->cs_pid);
RemoveContext(CC);
/* While we still have an extra thread with no user attached to it,
}
+void PurgeStaleRelationships(void) {
+
+ struct cdbdata *cdbvisit;
+ struct visit *visits;
+ struct quickroom qrbuf;
+ int num_visits;
+ int a, purge;
+
+ cdbvisit = cdb_fetch(CDB_VISIT, &CC->usersupp.usernum, sizeof(long));
+ if (cdbvisit != NULL) {
+ if ((num_visits = cdbvisit->len / sizeof(struct visit)) == 0) {
+ cdb_free(cdbvisit);
+ return;
+ }
+ visits = (struct visit *)
+ malloc(num_visits * sizeof(struct visit));
+ memcpy(visits, cdbvisit->ptr,
+ (num_visits * sizeof(struct visit)));
+ cdb_free(cdbvisit);
+ }
+ else return;
+
+ for (a=0; a<num_visits; ++a) {
+ if (getroom(&qrbuf, visits[a].v_roomname)!=0) {
+ purge = 1;
+ }
+ else if (qrbuf.QRgen != visits[a].v_generation) {
+ purge = 1;
+ }
+ else {
+ purge = 0;
+ }
+ lprintf(9, "U/R REL: <%s> <%ld> <%ld> <%d> %s\n",
+ visits[a].v_roomname,
+ visits[a].v_generation,
+ visits[a].v_lastseen,
+ visits[a].v_flags,
+ (purge ? "**purging**" : "") );
+
+ if (purge) {
+ memcpy(&visits[a], &visits[a+1],
+ (((num_visits-a)-1) * sizeof(struct visit)) );
+ --num_visits;
+ }
+
+ }
+
+ cdb_store(CDB_VISIT, &CC->usersupp.usernum, sizeof(long),
+ visits, (num_visits * sizeof(struct visit)));
+ free(visits);
+ }
+
+
+
void MailboxName(char *buf, struct usersupp *who, char *prefix) {
sprintf(buf, "%010ld.%s", who->usernum, prefix);
}