/** * deallocate a room structure immediately. */ static void room_ll_free(struct room *r) { assert(r != NULL); LIST_REMOVE(r, room_cache); LIST_ENTRY_INIT(r, room_cache); free(r->name.short_str); r->name.short_str=NULL; free(r->name.long_str); r->name.long_str=NULL; free(r->desc.short_str); r->desc.short_str=NULL; free(r->desc.long_str); r->desc.long_str=NULL; free(r->owner); r->owner=NULL; free(r->creator); r->creator=NULL; attr_list_free(&r->extra_values); free(r); }
/** * \brief Loads the memo database from disk */ void readMemoData(void) { RegNickList *nick = NULL; RegNickList *from, *rnlb; MemoList *newmemo; char *command; char *topic; int done = 0; unsigned long linenum = 0; db.ms = fopen(MS_DB, "r"); if (db.ms == NULL) return; while (!done) { if (!(sfgets(dbLine, 2048, db.ms))) { if (!done) { unexpected_eof(MS_DB); } done = 1; fclose(db.ms); return; } linenum++; if (parse_init(&state, dbLine) != 0) { /*! \bug XXX be nicer here... */ abort(); } command = parse_getarg(&state); if (strcmp(command, "data") == 0) { nick = getRegNickData(parse_getarg(&state)); /*! \bug Increment the arguments.. we REALLY need to fix the dbs */ (void)parse_getarg(&state); (void)parse_getarg(&state); if (nick) { nick->memos->flags = atoi(parse_getarg(&state)); nick->memos->max = atoi(parse_getarg(&state)); if (nick->memos->max <= 0) nick->memos->max = MS_DEF_RCV_MAX; } } else if (strcmp(command, "mblock") == 0) { MemoBlock *mbitem; if (nick && nick->memos) { char *nickToBlock; if ((nickToBlock = parse_getarg(&state)) && (rnlb = getRegNickData(nickToBlock))) { mbitem = (MemoBlock *) oalloc(sizeof(MemoBlock)); mbitem->blockId = rnlb->regnum; mbitem->next = nick->memos->firstMblock; nick->memos->firstMblock = mbitem; } } } else if (strcmp(command, "redirect") == 0) { nick = getRegNickData(parse_getarg(&state)); if (nick != NULL) nick->memos->forward = getRegNickData(parse_getarg(&state)); } else if (strcmp(command, "memo") == 0) { char *cn; cn = parse_getarg(&state); nick = getRegNickData(cn); if (nick == NULL) { printf("memo: %s not valid\n", cn); continue; } newmemo = (MemoList *) oalloc(sizeof(MemoList)); newmemo->realto = nick; /*! \bug Increment the argument 1, we need to fix the db */ (void)parse_getarg(&state); newmemo->flags = atoi(parse_getarg(&state)); newmemo->sent = (time_t) atol(parse_getarg(&state)); /* Memo expiration code */ if ((time(NULL) - newmemo->sent) >= NICKDROPTIME && !(newmemo->flags & MEMO_SAVE)) { FREE(newmemo); continue; } strncpyzt(newmemo->from, parse_getarg(&state), NICKLEN); from = getRegNickData(newmemo->from); strncpyzt(newmemo->to, parse_getarg(&state), CHANLEN); /* Read the memo, skipping the leading : */ topic = parse_getallargs(&state); if (topic == NULL) { FREE(newmemo); continue; } newmemo->memotxt = strdup(topic); /* Add the memo to the users memobox */ LIST_ENTRY_INIT(newmemo, ml_lst); LIST_INSERT_HEAD(&nick->memos->mb_memos, newmemo, ml_lst); if (from && newmemo->flags & MEMO_UNREAD) LIST_INSERT_HEAD(&from->memos->mb_sent, newmemo, ml_sent); nick->memos->memocnt++; } else if (strcmp(command, "done") == 0) { done = 1; } else { fprintf(stderr, "Error in reading memo data (%s) %lu\n", dbLine, linenum); sshutdown(-1); } #ifdef DBDEBUG sSend(":%s PRIVMSG " DEBUGCHAN " :Read memo data (%s)", MemoServ, dbLine); #endif parse_cleanup(&state); } fclose(db.ms); }