Move common functions to mail.c
[rmail.git] / src / utils / test_view_mail.c
blob644b2316bdbbd6ce4c066ccd66cd5471e232dca9
1 #define _BSD_SOURCE
3 #include <stdio.h>
4 #include <string.h>
5 #include <limits.h>
6 #include <unistd.h>
7 #include <errno.h>
8 #include <fcntl.h>
9 #include <time.h>
10 #include <ctype.h>
12 #include <sys/types.h>
13 #include <sys/stat.h>
15 #include "string_utils.h"
16 #include "file_utils.h"
17 #include "rfc5322.h"
18 #include "rfc2047.h"
19 #include "rfc822.h"
20 #include "mime.h"
21 #include "md5_utils.h"
22 #include "mail.h"
24 static int hdr_only = 0;
25 static int mime_only = 0;
27 static void plain_body(char *line)
29 printf("%s", line);
33 static void qp_body(char *line)
35 char buf[1024];
37 rfc2047_decode_quoted_printable(buf, line, sizeof(buf) - 1);
38 printf("%s", buf);
41 static void parse_mail_body(FILE *fh, struct mail_header *hdr)
43 char buf[1024];
44 void (*decode_body)(char *line);
46 switch (hdr->mime.transfer_encoding) {
47 case MIME_ENCODING_QUOTED_PRINTABLE:
48 decode_body = qp_body;
49 break;
50 default:
51 decode_body = plain_body;
52 break;
55 (void) fseek(fh, hdr->body_offset, SEEK_SET);
57 while (fgets(buf, sizeof(buf), fh)) {
58 decode_body(buf);
62 void usage(const char *appname)
64 fprintf(stderr, "Usage:\n%s options\n", appname);
65 fprintf(stderr, "Options:\n");
66 fprintf(stderr, " -h Parse header only\n"
67 " -m Parse MIME only\n"
68 " -f <file> Parse file\n"
69 " -d <maildir> Parse maildir\n");
72 static void parse_file(const char *file)
74 FILE *fh;
75 struct mail_header mail_hdr;
77 if (file_type(file))
78 return;
80 fh = fopen(file, "r");
81 if (!fh) {
82 return;
85 init_mail_header(&mail_hdr);
87 strncpy(mail_hdr.filename, file, 1024);
89 parse_mail_header(fh, &mail_hdr);
91 fprintf(stderr, "-------------------------------------------\n");
92 fprintf(stderr, "Test file: %s\n", mail_hdr.filename);
93 fprintf(stderr, "-------------------------------------------\n");
94 if (!mime_only) {
95 fprintf(stderr, "Date : %s\n", rfc822_mkdt(mail_hdr.date));
96 fprintf(stderr, "From : %s\n", mail_hdr.from);
97 fprintf(stderr, "Subject: %s\n", mail_hdr.subject);
100 debug_mime_header(&mail_hdr.mime);
103 if (!hdr_only) {
104 fprintf(stderr, "-------------------------------------------\n");
105 /* Message Body */
106 parse_mail_body(fh, &mail_hdr);
109 fclose(fh);
113 int main(int argc, char **argv)
115 int opt;
117 char *file = NULL;
118 char *maildir_path = NULL;
120 char old_path[PATH_MAX];
121 int rc;
123 while ((opt = getopt(argc, argv, "d:f:hm")) != -1) {
124 switch (opt) {
125 case 'd':
126 maildir_path = optarg;
127 break;
128 case 'f':
129 file = optarg;
130 break;
131 case 'h':
132 hdr_only = 1;
133 break;
134 case 'm':
135 mime_only = 1;
136 break;
137 default:
138 fprintf(stderr, "Unknown parameter.\n");
139 usage(argv[0]);
140 return -1;
144 if ((file == NULL) && (maildir_path == NULL)) {
145 usage(argv[0]);
146 return -1;
148 if ((file != NULL) && (maildir_path != NULL)) {
149 fprintf(stderr, "-f and -d are mutually esclusive!.\n");
150 usage(argv[0]);
153 if (file != NULL) {
154 parse_file(file);
155 return 0;
158 /* Parse all maildir */
159 if (!getcwd(old_path, PATH_MAX)) {
160 fprintf(stderr, "%s - GETCWD: %s\n", __func__, strerror(errno));
161 return -1;
164 if (chdir(maildir_path) < 0) {
165 fprintf(stderr, "%s - CHDIR: %s\n", __func__, strerror(errno));
166 return -1;
169 rc = scan_dir(maildir_path, parse_file);
171 if (chdir(old_path) < 0) {
172 fprintf(stderr, "%s - Cannot restore path %s!\n", __func__, strerror(errno));
175 return rc;