NeoMutt  2024-03-23-142-g2b2e76
Teaching an old dog new tricks
No Matches
body.c File Reference

Representation of the body of an email. More...

#include "config.h"
#include <stdbool.h>
#include <unistd.h>
#include "mutt/lib.h"
#include "body.h"
#include "email.h"
#include "envelope.h"
#include "mime.h"
#include "parameter.h"
+ Include dependency graph for body.c:

Go to the source code of this file.


struct Bodymutt_body_new (void)
 Create a new Body.
void mutt_body_free (struct Body **ptr)
 Free a Body.
bool mutt_body_cmp_strict (const struct Body *b1, const struct Body *b2)
 Strictly compare two email Body's.
char * mutt_body_get_charset (struct Body *b, char *buf, size_t buflen)
 Get a body's character set.

Detailed Description

Representation of the body of an email.

  • Richard Russon
  • Pietro Cerutti

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see

Definition in file body.c.

Function Documentation

◆ mutt_body_new()

struct Body * mutt_body_new ( void  )

Create a new Body.

Return values
ptrNewly allocated Body

Definition at line 44 of file body.c.

46 struct Body *p = mutt_mem_calloc(1, sizeof(struct Body));
49 p->use_disp = true;
51 return p;
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:50
Content is attached.
Definition: mime.h:63
#define TAILQ_INIT(head)
Definition: queue.h:765
The body of an email.
Definition: body.h:36
struct ParameterList parameter
Parameters of the content-type.
Definition: body.h:62
bool use_disp
Content-Disposition uses filename= ?
Definition: body.h:47
unsigned int disposition
content-disposition, ContentDisposition
Definition: body.h:42
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_body_free()

void mutt_body_free ( struct Body **  ptr)

Free a Body.

[out]ptrBody to free

Definition at line 58 of file body.c.

60 if (!ptr || !*ptr)
61 return;
63 struct Body *a = *ptr, *b = NULL;
65 while (a)
66 {
67 b = a;
68 a = a->next;
70 mutt_param_free(&b->parameter);
71 if (b->filename)
72 {
73 if (b->unlink)
74 unlink(b->filename);
75 mutt_debug(LL_DEBUG1, "%sunlinking %s\n", b->unlink ? "" : "not ", b->filename);
76 }
78 FREE(&b->filename);
79 FREE(&b->d_filename);
80 FREE(&b->charset);
81 FREE(&b->content);
82 FREE(&b->xtype);
83 FREE(&b->subtype);
84 FREE(&b->language);
85 FREE(&b->description);
86 FREE(&b->form_name);
88 if (b->email)
89 {
90 /* Don't free twice (b->email->body = b->parts) */
91 b->email->body = NULL;
92 email_free(&b->email);
93 }
95 mutt_env_free(&b->mime_headers);
96 mutt_body_free(&b->parts);
97 FREE(&b);
98 }
100 *ptr = NULL;
void mutt_body_free(struct Body **ptr)
Free a Body.
Definition: body.c:58
void email_free(struct Email **ptr)
Free an Email.
Definition: email.c:46
void mutt_env_free(struct Envelope **ptr)
Free an Envelope.
Definition: envelope.c:126
#define mutt_debug(LEVEL,...)
Definition: logging2.h:89
Log at debug level 1.
Definition: logging2.h:43
#define FREE(x)
Definition: memory.h:45
void mutt_param_free(struct ParameterList *pl)
Free a ParameterList.
Definition: parameter.c:62
bool unlink
If true, filename should be unlink()ed before free()ing this structure.
Definition: body.h:67
struct Body * next
next attachment in the list
Definition: body.h:71
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_body_cmp_strict()

bool mutt_body_cmp_strict ( const struct Body b1,
const struct Body b2 

Strictly compare two email Body's.

b1First Body
b2Second Body
Return values
trueBody's are strictly identical

Definition at line 109 of file body.c.

111 if (!b1 || !b2)
112 return false;
114 if ((b1->type != b2->type) || (b1->encoding != b2->encoding) ||
115 !mutt_str_equal(b1->subtype, b2->subtype) ||
117 !mutt_param_cmp_strict(&b1->parameter, &b2->parameter) || (b1->length != b2->length))
118 {
119 return false;
120 }
121 return true;
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:709
bool mutt_param_cmp_strict(const struct ParameterList *pl1, const struct ParameterList *pl2)
Strictly compare two ParameterLists.
Definition: parameter.c:166
LOFF_T length
length (in bytes) of attachment
Definition: body.h:53
char * description
Definition: body.h:55
char * subtype
content-type subtype
Definition: body.h:60
unsigned int encoding
content-transfer-encoding, ContentEncoding
Definition: body.h:41
unsigned int type
content-type primary type, ContentType
Definition: body.h:40
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_body_get_charset()

char * mutt_body_get_charset ( struct Body b,
char *  buf,
size_t  buflen 

Get a body's character set.

bBody to examine
bufBuffer for the result
buflenLength of the buffer
Return values
ptrBuffer containing character set
NULLOn error, or if not a text type

Definition at line 132 of file body.c.

134 char *p = NULL;
136 if (b && (b->type != TYPE_TEXT))
137 return NULL;
139 if (b)
140 p = mutt_param_get(&b->parameter, "charset");
142 if (p)
143 mutt_ch_canonical_charset(buf, buflen, p);
144 else
145 mutt_str_copy(buf, "us-ascii", buflen);
147 return buf;
Type: 'text/*'.
Definition: mime.h:38
void mutt_ch_canonical_charset(char *buf, size_t buflen, const char *name)
Canonicalise the charset of a string.
Definition: charset.c:374
size_t mutt_str_copy(char *dest, const char *src, size_t dsize)
Copy a string into a buffer (guaranteeing NUL-termination)
Definition: string.c:630
char * mutt_param_get(const struct ParameterList *pl, const char *s)
Find a matching Parameter.
Definition: parameter.c:85
+ Here is the call graph for this function:
+ Here is the caller graph for this function: