Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
BitchX
GitHub Repository: BitchX/BitchX1.3
Path: blob/master/dll/possum/possum.c
1069 views
1
/* Possum Mail copyright 1997 Patrick J. Edwards */
2
3
#include <stdio.h>
4
#include <stdlib.h>
5
#include "irc.h"
6
#include "struct.h"
7
#include "dcc.h"
8
#include "ircaux.h"
9
#include "ctcp.h"
10
#include "status.h"
11
#include "lastlog.h"
12
#include "server.h"
13
#include "screen.h"
14
#include "vars.h"
15
#include "misc.h"
16
#include "output.h"
17
#include "list.h"
18
#include "module.h"
19
#define INIT_MODULE
20
#include "modval.h"
21
#include "llist.h"
22
#include "head.h"
23
24
#define MAX_FNAME_LENGTH 2048
25
#define MAX_FBUFFER_SIZE 2048
26
#define MAX_HINFO_SIZE 127
27
28
/* structures */
29
30
struct msg_header_struct {
31
char from[MAX_HINFO_SIZE+1],
32
to[MAX_HINFO_SIZE+1],
33
subject[MAX_HINFO_SIZE+1],
34
date[MAX_HINFO_SIZE+1];
35
long body_offset;
36
};
37
typedef struct msg_header_struct msg_header;
38
39
struct mbox_struct {
40
char filename[2048];
41
int number, lastaccess, size;
42
llist *headers;
43
} MBOX;
44
typedef struct mbox_struct mbox;
45
46
#define cparse convert_output_format
47
#define PM_PROMPT "%W<%GP%gosso%GM%W>%n"
48
#define PM_VERSION "0.2"
49
50
/* prototypes */
51
52
char *strchop(char *s);
53
int parse_header(FILE *f, llist *l);
54
llist *read_mbox(char *fname);
55
56
BUILT_IN_DLL(pm_headers);
57
BUILT_IN_DLL(pm_count);
58
BUILT_IN_DLL(pm_list);
59
BUILT_IN_DLL(pm_read);
60
BUILT_IN_DLL(pm_help);
61
BUILT_IN_DLL(pm_mailbox);
62
63
/*
64
void pm_check
65
void pm_update
66
*/
67
char *Possum_Version(IrcCommandDll **intp)
68
{
69
return PM_VERSION;
70
}
71
72
int Possum_Init(IrcCommandDll **intp, Function_ptr *global_table) {
73
char *tmp = getenv("MAIL");
74
75
initialize_module("possum");
76
77
MBOX.headers = NULL;
78
79
add_module_proc(COMMAND_PROC, "possum", "pmheaders", NULL, 0, 0, pm_headers, NULL);
80
add_module_proc(COMMAND_PROC, "possum", "pmcount", NULL, 0, 0, pm_count, NULL);
81
add_module_proc(COMMAND_PROC, "possum", "pmlist", NULL, 0, 0, pm_list, NULL);
82
add_module_proc(COMMAND_PROC, "possum", "pmread", NULL, 0, 0, pm_read, NULL);
83
add_module_proc(COMMAND_PROC, "possum", "pmmailbox", NULL, 0, 0, pm_mailbox, NULL);
84
add_module_proc(COMMAND_PROC, "possum", "pmhelp", NULL, 0, 0, pm_help, NULL);
85
86
if (tmp) strncpy(MBOX.filename, tmp, MAX_FNAME_LENGTH);
87
88
put_it("%s Possom Mail %s for BitchX has been excited.", cparse(PM_PROMPT, NULL, NULL), PM_VERSION);
89
put_it("%s %s", cparse(PM_PROMPT, NULL, NULL), "Type /PMHELP for help.");
90
if (tmp) {
91
put_it("%s Using %s for default mail box.", cparse(PM_PROMPT, NULL, NULL), MBOX.filename);
92
MBOX.headers = read_mbox(MBOX.filename);
93
} else {
94
put_it("%s Could not find MAIL in your environment.", cparse(PM_PROMPT, NULL, NULL));
95
put_it("%s You will have to manually set it with /PMMAILBOX.", cparse(PM_PROMPT,NULL, NULL));
96
}
97
return 0;
98
}
99
100
int parse_header(FILE *f, llist *l) {
101
msg_header h;
102
char s[MAX_FBUFFER_SIZE];
103
104
if (!feof(f)) {
105
fgets((char *)s, MAX_FBUFFER_SIZE, f);
106
strchop(s);
107
}
108
109
while ((strcmp(s,"")!=0) && (!feof(f))) {
110
if (strstr(s, "From: ")) {
111
char *tmp = strstr(s,": ")+2;
112
if (tmp) strncpy(h.from, tmp, MAX_HINFO_SIZE);
113
} else if (strstr(s, "Subject: ")) {
114
char *tmp = strstr(s,": ")+2;
115
if (tmp) strncpy(h.subject, tmp, MAX_HINFO_SIZE);
116
} else if (strstr(s, "To: ")) {
117
char *tmp = strstr(s,": ")+2;
118
if (tmp) strncpy(h.to, tmp, MAX_HINFO_SIZE);
119
} else if (strstr(s, "Date: ")) {
120
char *tmp = strstr(s,": ")+2;
121
if (tmp) strncpy(h.date, tmp, MAX_HINFO_SIZE);
122
}
123
fgets((char *)s, MAX_FBUFFER_SIZE, f);
124
strchop(s);
125
}
126
h.body_offset = ftell(f);
127
return(lpush(l, &h));
128
}
129
130
char *strchop(char *s) {
131
if (s) s[strlen(s)-1] = '\0';
132
return(s);
133
}
134
135
llist *read_mbox(char *fname)
136
{
137
FILE *f;
138
llist *headers;
139
char *buf = (char *) malloc(MAX_FBUFFER_SIZE);
140
141
f = fopen(fname, "r");
142
if (!f) return(NULL);
143
144
145
headers = lmake(sizeof(msg_header));
146
if (!headers) return(NULL);
147
148
while (!feof(f)) {
149
fgets(buf, MAX_FBUFFER_SIZE, f);
150
strchop(buf);
151
if (ishead(buf)) {
152
parse_header(f, headers);
153
/* put_it("found header %d", headers->length);*/
154
}
155
}
156
157
fclose(f);
158
return(headers);
159
}
160
161
BUILT_IN_DLL(pm_mailbox)
162
{
163
char *tmp;
164
tmp = next_arg(args, &args);
165
if (tmp) {
166
strncpy(MBOX.filename, tmp, MAX_FNAME_LENGTH);
167
put_it("%s Set mail box to: %s ", cparse(PM_PROMPT, NULL, NULL), MBOX.filename);
168
} else
169
put_it("%s You have to enter your mail box.", cparse(PM_PROMPT, NULL, NULL));
170
}
171
172
BUILT_IN_DLL(pm_help)
173
{
174
put_it("%s Possum Mail %s", cparse(PM_PROMPT, NULL, NULL), PM_VERSION);
175
put_it("%s /PMHELP - This help.", cparse(PM_PROMPT, NULL, NULL));
176
put_it("%s /PMMAILBOX - Set your mailbox.", cparse(PM_PROMPT, NULL,NULL));
177
put_it("%s /PMREAD [x] - Read the xth email.", cparse(PM_PROMPT, NULL, NULL));
178
put_it("%s /PMLIST - Lists all email From: lines.", cparse(PM_PROMPT, NULL, NULL));
179
put_it("%s /PMCOUNT - Returns the number of emails in the mail box.", cparse(PM_PROMPT, NULL, NULL));
180
}
181
182
/* this is a rather ugly and inefficent piece of code. blech. */
183
BUILT_IN_DLL(pm_read)
184
{
185
char *number, *s;
186
int num, have_head=0;
187
FILE *f;
188
msg_header *h = NULL;
189
190
number = next_arg(args, &args);
191
if (number) num = atoi(number);
192
else {
193
put_it("%s You have to provide an arguement.", cparse(PM_PROMPT, NULL, NULL));
194
return;
195
}
196
if (MBOX.headers && (num-1 > MBOX.headers->length)) return;
197
198
s = (char *) malloc(MAX_FBUFFER_SIZE);
199
if (!s) return;
200
201
f = fopen(MBOX.filename, "r");
202
if (!f) return;
203
204
h = lindex(MBOX.headers, num-1);
205
206
if (h && !have_head) {
207
put_it("%s", cparse(PM_PROMPT" %W<%YFrom%W>%n $0-", "%s", h->from));
208
put_it("%s", cparse(PM_PROMPT" %W<%YDate%W>%n $0-", "%s", h->date));
209
put_it("%s", cparse(PM_PROMPT" %W<%YSubject%W>%n $0-", "%s", h->subject));
210
fseek(f, h->body_offset, SEEK_SET);
211
do {
212
strchop(fgets(s, 2560, f));
213
if (ishead(s)) {
214
have_head = 1;
215
break;
216
}
217
put_it("%s%s", cparse("%G|%n", NULL, NULL), s);
218
} while (!feof(f));
219
}
220
221
free(s);
222
fclose(f);
223
}
224
225
BUILT_IN_DLL(pm_list)
226
{
227
unsigned long counter = 0;
228
msg_header *h;
229
230
do {
231
h = lindex(MBOX.headers, counter);
232
if (h)
233
put_it("%s", cparse(PM_PROMPT" %W<%Y$0%W>%n $1-", "%d %s", ++counter, h->from));
234
} while (h);
235
}
236
237
238
BUILT_IN_DLL(pm_headers)
239
{
240
}
241
242
BUILT_IN_DLL(pm_count)
243
{
244
if (MBOX.headers)
245
put_it("%s Email Count: %d", cparse(PM_PROMPT,NULL, NULL), MBOX.headers->length);
246
}
247
248