summaryrefslogtreecommitdiff
path: root/libmailutils/mailbox/attribute.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmailutils/mailbox/attribute.c')
-rw-r--r--libmailutils/mailbox/attribute.c98
1 files changed, 70 insertions, 28 deletions
diff --git a/libmailutils/mailbox/attribute.c b/libmailutils/mailbox/attribute.c
index 1f00257ac..508a9f203 100644
--- a/libmailutils/mailbox/attribute.c
+++ b/libmailutils/mailbox/attribute.c
@@ -1,5 +1,5 @@
/* GNU Mailutils -- a suite of utilities for electronic mail
- Copyright (C) 1999-2019 Free Software Foundation, Inc.
+ Copyright (C) 1999-2024 Free Software Foundation, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -134,17 +134,21 @@ mu_attribute_unset_flags (mu_attribute_t attr, int flags)
return EINVAL;
/* If the required bits are already cleared, do not modify anything */
- mu_attribute_get_flags (attr, &oflags);
- if ((oflags & flags) == 0)
- return 0;
-
- if (attr->_unset_flags)
- status = attr->_unset_flags (attr, flags);
- else
- attr->flags &= ~flags;
+ status = mu_attribute_get_flags (attr, &oflags);
if (status == 0)
- mu_attribute_set_modified (attr);
- return 0;
+ {
+ if ((oflags & flags) == 0)
+ return 0;
+
+ if (attr->_unset_flags)
+ status = attr->_unset_flags (attr, flags);
+ else
+ attr->flags &= ~flags;
+
+ if (status == 0)
+ mu_attribute_set_modified (attr);
+ }
+ return status;
}
int
@@ -240,6 +244,12 @@ mu_attribute_set_recent (mu_attribute_t attr)
}
int
+mu_attribute_set_forwarded (mu_attribute_t attr)
+{
+ return mu_attribute_set_flags (attr, MU_ATTRIBUTE_FORWARDED);
+}
+
+int
mu_attribute_is_userflag (mu_attribute_t attr, int flag)
{
if (attr == NULL)
@@ -311,6 +321,15 @@ mu_attribute_is_recent (mu_attribute_t attr)
}
int
+mu_attribute_is_forwarded (mu_attribute_t attr)
+{
+ int flags = 0;
+ if (mu_attribute_get_flags (attr, &flags) == 0)
+ return flags & MU_ATTRIBUTE_FORWARDED;
+ return 0;
+}
+
+int
mu_attribute_unset_userflag (mu_attribute_t attr, int flag)
{
if (attr == NULL)
@@ -362,6 +381,12 @@ mu_attribute_unset_recent (mu_attribute_t attr)
}
int
+mu_attribute_unset_forwarded (mu_attribute_t attr)
+{
+ return mu_attribute_unset_flags (attr, MU_ATTRIBUTE_FORWARDED);
+}
+
+int
mu_attribute_is_equal (mu_attribute_t attr, mu_attribute_t attr2)
{
int flags2 = 0, flags = 0;
@@ -400,6 +425,7 @@ static struct flagtrans flagtrans[] = {
{ MU_ATTRIBUTE_DELETED, 'D' },
{ MU_ATTRIBUTE_DRAFT, 'd' },
{ MU_ATTRIBUTE_SEEN, 'O' },
+ { MU_ATTRIBUTE_FORWARDED, 'P' },
{ MU_ATTRIBUTE_READ, 'R' },
{ 0 }
};
@@ -409,17 +435,17 @@ static struct flagtrans flagtrans[] = {
mu_verify (MU_ARRAY_SIZE (flagtrans) == MU_STATUS_BUF_SIZE);
int
-mu_string_to_flags (const char *buffer, int *pflags)
+mu_attribute_string_to_flags (const char *buffer, int *pflags)
{
const char *sep;
if (pflags == NULL)
return EINVAL;
- /* Set the attribute */
+ /* Skip the header name */
if (mu_c_strncasecmp (buffer, "Status:", 7) == 0)
{
- sep = strchr(buffer, ':'); /* pass the ':' */
+ sep = strchr (buffer, ':'); /* pass the ':' */
sep++;
}
else
@@ -439,6 +465,35 @@ mu_string_to_flags (const char *buffer, int *pflags)
return 0;
}
+int
+mu_attribute_flags_to_string (int flags, char *buffer, size_t len, size_t *pn)
+{
+ int i, j;
+ struct flagtrans *ft;
+
+ if (!buffer || len == 0)
+ return EINVAL;
+
+ len--;
+
+ i = j = 0;
+ for (ft = flagtrans; ft->flag; ft++)
+ {
+ if (ft->flag & flags)
+ {
+ if (buffer && i < len)
+ buffer[i++] = ft->letter;
+ j++;
+ }
+ }
+ if (buffer)
+ buffer[i++] = 0;
+
+ if (pn)
+ *pn = j;
+ return j <= len ? 0 : MU_ERR_BUFSPACE;
+}
+
/* NOTE: When adding/removing flags, make sure to update the
MU_STATUS_BUF_SIZE define in include/mailutils/attribute.h */
int
@@ -446,24 +501,11 @@ mu_attribute_to_string (mu_attribute_t attr, char *buffer, size_t len,
size_t *pn)
{
int flags = 0;
- char buf[MU_STATUS_BUF_SIZE];
- int i;
int rc;
- struct flagtrans *ft;
rc = mu_attribute_get_flags (attr, &flags);
if (rc)
return rc;
-
- i = 0;
- for (ft = flagtrans; ft->flag; ft++)
- if (ft->flag & flags)
- buf[i++] = ft->letter;
- buf[i++] = 0;
-
- i = mu_cpystr (buffer, buf, i);
- if (pn)
- *pn = i;
- return 0;
+ return mu_attribute_flags_to_string (flags, buffer, len, pn);
}

Return to:

Send suggestions and report system problems to the System administrator.