• Patch: Elm ME+ 2.5 PLalpha50 -> Elm ME+ 2.5 PLalpha51 [3/6] (2/4)

    From Kari Hurtta@21:1/5 to All on Tue Feb 11 20:04:52 2020
    [continued from previous message]

    + "free_mail_quotaroot_internal",
    + "Bad magic number (mail_quota_type)",0);
    +
    + (*quotaroot)->quota_type->mq_dest_mqr_it(*quotaroot);
    +
    + if ((*quotaroot)->name)
    + free_string(& ((*quotaroot)->name));
    +
    + if ((*quotaroot)->p.dummy) {
    + /* Should not be set -- this may leak memory */
    +
    + DPRINT(Debug,1,(&Debug,
    + "free_mail_quotaroot_internal: (*quotaroot)->p.dummy != NULL -- freeing !\n"));
    +
    + free ((*quotaroot)->p.dummy);
    + (*quotaroot)->p.dummy = NULL;
    + }
    +
    + (*quotaroot)->magic = 0; /* Invalidate */
    + free(*quotaroot);
    + *quotaroot = NULL;
    +
    + }
    +
    +
    +
    + void free_mail_quotaroot(quotaroot)
    + struct mail_quotaroot **quotaroot;
    + {
    + free_mail_quotaroot_internal(quotaroot,mq_normal_free);
    + }
    +
    + void inc_mail_quotaroot_refcount(quotaroot)
    + struct mail_quotaroot *quotaroot;
    + {
    + if (MAIL_QUOTAROOT_magic != quotaroot->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "inc_mail_quotaroot_refcount",
    + "Bad magic number (mail_quotaroot)",0);
    +
    + quotaroot->refcount++;
    + }
    +
    + /* Caller must call free_string */
    + struct string *quotaroot_name(quotaroot,tok_r)
    + struct mail_quotaroot *quotaroot;
    + enum quota_reserved_quotaroot *tok_r /* return value */;
    + {
    + if (MAIL_QUOTAROOT_magic != quotaroot->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "quotaroot_name",
    + "Bad magic number (mail_quotaroot)",0);
    +
    + if (tok_r)
    + *tok_r = quotaroot->name_token;
    +
    + if (quotaroot->name) {
    + return dup_string(quotaroot->name);
    + }
    +
    + return NULL;
    + }
    +
    + size_t quotaroot_item_count(quotaroot)
    + struct mail_quotaroot *quotaroot;
    + {
    + if (MAIL_QUOTAROOT_magic != quotaroot->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "quotaroot_item_count",
    + "Bad magic number (mail_quotaroot)",0);
    +
    + if (quotaroot->mail_quota) {
    +
    + if (MAIL_QUOTA_magic != quotaroot->mail_quota->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "quotaroot_item_count",
    + "Bad magic number (mail_quota)",0);
    +
    + if (MAIL_QUOTA_TYPE_magic != quotaroot->quota_type->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "quotaroot_item_count",
    + "Bad magic number (mail_quota_type)",0);
    +
    + return quotaroot->quota_type->mq_itemcount_mqr_it(quotaroot->mail_quota,
    + quotaroot);
    + }
    +
    + return 0;
    + }
    +
    + struct mail_quota_item *quotaroot_item(quotaroot,idx)
    + struct mail_quotaroot *quotaroot;
    + size_t idx;
    + {
    + if (MAIL_QUOTAROOT_magic != quotaroot->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "quotaroot_item",
    + "Bad magic number (mail_quotaroot)",0);
    +
    + if (quotaroot->mail_quota) {
    + size_t count;
    +
    + if (MAIL_QUOTA_magic != quotaroot->mail_quota->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "quotaroot_item",
    + "Bad magic number (mail_quota)",0);
    +
    + if (MAIL_QUOTA_TYPE_magic != quotaroot->quota_type->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "quotaroot_item",
    + "Bad magic number (mail_quota_type)",0);
    +
    + count = quotaroot->quota_type->mq_itemcount_mqr_it(quotaroot->mail_quota,
    + quotaroot);
    +
    + if (idx >= count)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "quotaroot_item",
    + "Bad magic number index",0);
    +
    + return quotaroot->quota_type->mq_item_mqr_it(quotaroot->mail_quota,
    + quotaroot,idx);
    +
    + }
    +
    + return NULL;
    + }
    +
    + enum quota_quotaroot_status quotaroot_status(quotaroot)
    + struct mail_quotaroot *quotaroot;
    + {
    + if (MAIL_QUOTAROOT_magic != quotaroot->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "quotaroot_status",
    + "Bad magic number (mail_quotaroot)",0);
    +
    + if (quotaroot->mail_quota) {
    + if (MAIL_QUOTA_magic != quotaroot->mail_quota->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "quotaroot_status",
    + "Bad magic number (mail_quota)",0);
    +
    + if (MAIL_QUOTA_TYPE_magic != quotaroot->quota_type->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "quotaroot_status",
    + "Bad magic number (mail_quota_type)",0);
    +
    + return quotaroot->quota_type->mq_status_mqr_it(quotaroot->mail_quota,
    + quotaroot);
    + }
    +
    + return qr_stat_none;
    + }
    +
    + struct mail_quota_item * malloc_mail_quota_item(mail_quota,name,name_token) + struct mail_quota * mail_quota;
    + struct string * name /* May be NULL */;
    + enum quota_reserved_resource name_token;
    + {
    + struct mail_quota_item * ret =
    + safe_zero_alloc(sizeof (*ret));
    + size_t quotaitem_list_pos;
    + size_t new_quotaitem_count;
    +
    + if (MAIL_QUOTA_magic != mail_quota->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "malloc_mail_quota_item",
    + "Bad magic number (mail_quota)",0);
    +
    + ret->magic = MAIL_QUOTA_ITEM_magic;
    + ret->refcount = 1; /* mail_quota->quotaitem_list[] not counted */
    + ret->mail_quota = mail_quota;
    + if (name)
    + ret->name = dup_string(name);
    + else
    + ret->name = NULL;
    + ret->name_token = name_token;
    +
    + ret->p.dummy = NULL;
    +
    + if (MAIL_QUOTA_TYPE_magic != mail_quota->quota_type->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "malloc_mail_quota_item",
    + "Bad magic number (mail_quota_type)",0);
    + ret->quota_type = mail_quota->quota_type;
    +
    + if (mail_quota->quotaitem_list) {
    + size_t i;
    +
    + for (i = 0; i < mail_quota->quotaitem_count; i++) {
    + if (! mail_quota->quotaitem_list[i]) {
    + quotaitem_list_pos = i;
    +
    + goto found_free_pos;
    + }
    + }
    + }
    +
    + new_quotaitem_count = mail_quota->quotaitem_count+1;
    + mail_quota->quotaitem_list =
    + safe_array_realloc(mail_quota->quotaitem_list,
    + new_quotaitem_count,
    + sizeof (mail_quota->quotaitem_list[0]));
    +
    + quotaitem_list_pos = mail_quota->quotaitem_count;
    + mail_quota->quotaitem_list[quotaitem_list_pos] = NULL;
    + mail_quota->quotaitem_count = new_quotaitem_count;
    +
    + found_free_pos:
    + if (quotaitem_list_pos >= mail_quota->quotaitem_count ||
    + mail_quota->quotaitem_list[quotaitem_list_pos])
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "malloc_mail_quota_item",
    + "Bad quotaitem_list_pos",0);
    +
    + mail_quota->quotaitem_list[quotaitem_list_pos] = ret;
    +
    + ret->quota_type->mq_init_mqi_it(mail_quota,ret);
    +
    + return ret;
    + }
    +
    + void inc_mail_quota_item_refcount(quota_item)
    + struct mail_quota_item *quota_item;
    + {
    + if (MAIL_QUOTA_ITEM_magic != quota_item->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "free_mail_quota_item_internal",
    + "Bad magic number (mail_quota_item)",0);
    +
    + quota_item->refcount++;
    + }
    +
    +
    +
    + static void free_mail_quota_item_internal(quota_item,reset_mail_quota)
    + struct mail_quota_item **quota_item;
    + enum mq_freemode reset_mail_quota;
    + {
    +
    + if (MAIL_QUOTA_ITEM_magic != (*quota_item)->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "free_mail_quota_item_internal",
    + "Bad magic number (mail_quota_item)",0);
    +
    + if ((*quota_item)->refcount < 1)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "free_mail_quota_internal",
    + "Bad refcount",0);
    +
    + switch (reset_mail_quota) {
    + case mq_normal_free: break;
    + case mq_reset_mail_quota:
    +
    + /* mail_quota is going to be released.
    + Disconnect linking between mail_quota and quota_item
    + */
    +
    + if ((*quota_item)->mail_quota) {
    +
    + if (MAIL_QUOTA_magic != (*quota_item)->mail_quota->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "free_mail_quota_item_internal",
    + "Bad magic number (mail_quota)",0);
    +
    + if (MAIL_QUOTA_TYPE_magic != (*quota_item)->quota_type->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "free_mail_quota_item_internal",
    + "Bad magic number (mail_quota_type)",0);
    +
    + (*quota_item)->quota_type->mq_disc_mqi_it((*quota_item)->mail_quota,
    + *quota_item);
    +
    + (*quota_item)->mail_quota = NULL;
    + } else
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "free_mail_quota_item_internal",
    + "mail_quota link not set (mail_quota_item)",0);
    +
    +
    + /* not refounting -- so no free */
    + *quota_item = NULL;
    + return;
    + }
    +
    +
    + (*quota_item)->refcount--;
    + if ((*quota_item)->refcount > 0) {
    + /* Just reset this reference */
    +
    + *quota_item = NULL;
    + return;
    + }
    +
    + if (MAIL_QUOTA_TYPE_magic != (*quota_item)->quota_type->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "free_mail_quota_item_internal",
    + "Bad magic number (mail_quota_type)",0);
    +
    +
    + if ((*quota_item)->mail_quota) {
    + size_t i;
    +
    + /* Disconnect linking between mail_quota and quota_item */
    +
    + if (MAIL_QUOTA_magic != (*quota_item)->mail_quota->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "free_mail_quota_item_internal",
    + "Bad magic number (mail_quota)",0);
    +
    + /* Remove from mail_quota->quotaitem_list */
    +
    + for (i = 0; i < (*quota_item)->mail_quota->quotaitem_count; i++) {
    + if ((*quota_item)->mail_quota->quotaitem_list[i]) {
    +
    + if (MAIL_QUOTA_ITEM_magic != (*quota_item)->mail_quota->quotaitem_list[i]->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "free_mail_quota_item_internal",
    + "Bad magic number (quotaitem_list... mail_quota_item)",0);
    +
    + if ((*quota_item) == (*quota_item)->mail_quota->quotaitem_list[i]) {
    +
    + (*quota_item)->mail_quota->quotaitem_list[i] = NULL;
    + goto item_found;
    + }
    + }
    + }
    +
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "free_mail_quota_item_internal",
    + "*quota_item not found from quotaitem_list",0);
    +
    + item_found:
    +
    + (*quota_item)->quota_type->mq_disc_mqi_it((*quota_item)->mail_quota,
    + *quota_item);
    +
    + (*quota_item)->mail_quota = NULL;
    +
    + }
    +
    + (*quota_item)->quota_type->mq_dest_mqi_it(*quota_item);
    +
    + if ((*quota_item)->name)
    + free_string(& ((*quota_item)->name));
    +
    + if ((*quota_item)->p.dummy) {
    + /* Should not be set -- this may leak memory */
    +
    + DPRINT(Debug,1,(&Debug,
    + "free_mail_quota_item_internal: ((*quota_item)->p.dummy != NULL -- freeing !\n"));
    +
    + free((*quota_item)->p.dummy);
    + (*quota_item)->p.dummy = NULL;
    + }
    +
    + (*quota_item)->magic = 0; /* Invalidate */
    +
    + free(*quota_item);
    + *quota_item = NULL;
    + }
    +
    + void free_mail_quota_item(quota_item)
    + struct mail_quota_item **quota_item;
    + {
    + free_mail_quota_item_internal(quota_item,mq_normal_free);
    + }
    +
    +
    + /* Caller must free_string() result */
    +
    + struct string *quota_item_name(quota_item,tok_r)
    + struct mail_quota_item *quota_item;
    + enum quota_reserved_resource *tok_r /* return value */;
    + {
    + if (MAIL_QUOTA_ITEM_magic != quota_item->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "quota_item_name",
    + "Bad magic number (mail_quota_item)",0);
    +
    +
    + if (tok_r)
    + *tok_r = quota_item->name_token;
    +
    + if (quota_item->name) {
    + return dup_string(quota_item->name);;
    + }
    +
    + return NULL;
    + }
    +
    + int quota_item_values(quota_item, usage_r, limit_r)
    + struct mail_quota_item *quota_item;
    + uint32 * usage_r /* return value */;
    + uint32 * limit_r /* return value */;
    + {
    + if (usage_r)
    + *usage_r = 0;
    + if (limit_r)
    + *limit_r = 0;
    +
    + if (MAIL_QUOTA_ITEM_magic != quota_item->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "quota_item_values",
    + "Bad magic number (mail_quota_item)",0);
    +
    + if (quota_item->mail_quota) {
    +
    + if (MAIL_QUOTA_magic != quota_item->mail_quota->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "quota_item_values",
    + "Bad magic number (mail_quota)",0);
    +
    + if (MAIL_QUOTA_TYPE_magic != quota_item->quota_type->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "quota_item_values",
    + "Bad magic number (mail_quota_type)",0);
    +
    + return quota_item->quota_type->mq_values_mqi_it(quota_item->mail_quota, + quota_item,
    + usage_r,limit_r);
    + }
    +
    + return 0;
    + }
    +
    + void mail_quota_unlink_con(quota,con)
    + struct mail_quota *quota;
    + struct connection_cache *con;
    + {
    + if (MAIL_QUOTA_magic != quota->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "mail_quota_unlink_con",
    + "Bad magic number (mail_quota)",0);
    +
    + if (MAIL_QUOTA_TYPE_magic != quota->quota_type->magic)
    + panic("MBX PANIC",__FILE__,__LINE__,
    + "mail_quota_unlink_con",
    + "Bad magic number (mail_quota_type)",0);
    +
    + quota->quota_type->mq_unlink_con_it(quota,con);
    + }
    +
    +
    + /*
    + * Local Variables:
    + * mode:c
    + * c-basic-offset:4
    + * buffer-file-coding-system: iso-8859-1
    + * End:
    + */
    Index: elmME+.2.5.alpha51-cvs/lib/misc/terminal.c
    *** elmME+.2.5.alpha50/lib/misc/terminal.c Sun Jun 18 20:46:54 2017
    --- elmME+.2.5.alpha51-cvs/lib/misc/terminal.c Sat Jan 18 22:07:41 2020 ***************
    *** 1,7 ****
    ! static char rcsid[] = "@(#)$Id: terminal.c,v 2.12 2017/05/03 19:34:22 hurtta Exp $";

    /******************************************************************************
    ! * The Elm (ME+) Mail System - $Revision: 2.12 $ $State: Exp $
    *
    * Author: Kari Hurtta <hurtta+elm@siilo.FMI.FI> (was hurtta+elm@posti.FMI.FI)
    * or Kari Hurtta <elm@elmme-mailer.org>
    --- 1,7 ----
    ! static char rcsid[] = "@(#)$Id: terminal.c,v 2.13 2020/01/18 20:07:41 hurtta Exp $";

    /******************************************************************************
    ! * The Elm (ME+) Mail System - $Revision: 2.13 $ $State: Exp $
    *
    * Author: Kari Hurtta <hurtta+elm@siilo.FMI.FI> (was hurtta+elm@posti.FMI.FI)
    * or Kari Hurtta <elm@elmme-mailer.org>
    ***************
    *** 79,94 ****
    };

    static void strXcat P_((char **ret,char *val,
    ! int maybe_signal, char *buffer, int size));