FreeCalypso > hg > falcon-mail-tools
comparison f-demime/main.c @ 0:7e0d08176f32
f-demime starting code
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 06 May 2023 06:14:03 +0000 |
parents | |
children | 612c4d0df768 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:7e0d08176f32 |
---|---|
1 /* | |
2 * This module contains the main() function for f-demime. The following | |
3 * functions are called to pass input to further processing: | |
4 * | |
5 * begin_new_message(): called after processing a "From " line | |
6 * message_input_line(): called for all message lines after the "From " line | |
7 * finish_msg_body(): called when hitting EOF or a new "From " line | |
8 */ | |
9 | |
10 #include <stdio.h> | |
11 #include <stdlib.h> | |
12 #include <string.h> | |
13 #include <strings.h> | |
14 #include <time.h> | |
15 #include "defs.h" | |
16 | |
17 char *att_filename_buf, *att_filename_base, *att_filename_tail; | |
18 unsigned input_lineno; | |
19 | |
20 static void | |
21 get_attachment_dir() | |
22 { | |
23 static char varname[] = "FDEMIME_ATT_DIR"; | |
24 char *env, *cp; | |
25 unsigned dir_name_len; | |
26 time_t curtime; | |
27 struct tm *tm; | |
28 | |
29 env = getenv(varname); | |
30 if (!env) { | |
31 fprintf(stderr, | |
32 "error: required environment variable %s is not set\n", | |
33 varname); | |
34 exit(1); | |
35 } | |
36 if (!env[0]) { | |
37 fprintf(stderr, | |
38 "error: empty string value for %s is not allowed\n", | |
39 varname); | |
40 exit(1); | |
41 } | |
42 dir_name_len = strlen(env); | |
43 att_filename_buf = malloc(dir_name_len + 31); /* Y10K extra margin */ | |
44 if (!att_filename_buf) { | |
45 fprintf(stderr, | |
46 "error: unable to malloc buffer for attachment filenames\n"); | |
47 exit(1); | |
48 } | |
49 strcpy(att_filename_buf, env); | |
50 cp = att_filename_buf + dir_name_len; | |
51 *cp++ = '/'; | |
52 att_filename_base = cp; | |
53 time(&curtime); | |
54 tm = gmtime(&curtime); | |
55 sprintf(cp, "%u%02u%02ua", tm->tm_year + 1900, tm->tm_mon + 1, | |
56 tm->tm_mday); | |
57 att_filename_tail = index(cp, '\0'); | |
58 } | |
59 | |
60 main(argc, argv) | |
61 char **argv; | |
62 { | |
63 char linebuf[LINE_BUF_SIZE], *cp; | |
64 | |
65 if (argc > 3) { | |
66 fprintf(stderr, "usage: %s [infile [outfile]]\n", argv[0]); | |
67 exit(1); | |
68 } | |
69 get_attachment_dir(); | |
70 if (argc > 1 && !freopen(argv[1], "r", stdin)) { | |
71 perror(argv[1]); | |
72 exit(1); | |
73 } | |
74 if (argc > 2 && !freopen(argv[2], "w", stdout)) { | |
75 perror(argv[2]); | |
76 exit(1); | |
77 } | |
78 for (input_lineno = 1; fgets(linebuf, sizeof linebuf, stdin); | |
79 input_lineno++) { | |
80 cp = index(linebuf, '\n'); | |
81 if (cp) { | |
82 *cp = '\0'; | |
83 if (cp > linebuf && cp[-1] == '\r') | |
84 *--cp = '\0'; | |
85 } else { | |
86 fprintf(stderr, | |
87 "f-demime warning: input line %u too long or unterminated\n", | |
88 input_lineno); | |
89 } | |
90 if (!strncmp(linebuf, "From ", 5)) { | |
91 finish_msg_body(); | |
92 puts(linebuf); | |
93 begin_new_message(); | |
94 continue; | |
95 } | |
96 message_input_line(linebuf); | |
97 } | |
98 finish_msg_body(); | |
99 exit(0); | |
100 } |