[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));