1 /*
2 PKTAPI Source, Version 1.00
3
4 (c) & (p) 1999-2000 by Oliver 'Attila' Grimm
5
6 Alle Rechte vorbehalten.
7 */
8
9 #include <fcntl.h>
10 #include <sys\stat.h>
11 #include <share.h>
12 #include <io.h>
13 #include <string.h>
14
15 #include "pktapi.h"
16 #include "api_pkt2.h"
17 #include "platform_pkt.h"
18
_Pkt2ReadMsgHdr(HPKT hp,PKT2MSGHEADER * msghdr)19 static sword _Pkt2ReadMsgHdr(HPKT hp, PKT2MSGHEADER *msghdr)
20 {
21 if (readPKT2MSGHEADER(P2d->pfd, msghdr) < 2l)
22 {
23 pktapierr = PERR_BADMSG;
24 return -1;
25 }
26
27 if (msghdr->signatur == 0)
28 {
29 pktapierr = PERR_EOF;
30 return -1; /* EOF Packet */
31 }
32
33 if (msghdr->signatur != 2)
34 {
35 pktapierr = PERR_BADSIGN;
36 return -1; /* Bad packet */
37 }
38
39 return 0; /* Ok */
40 }
41
_Pkt2ReadField(HPKT hp,char * buf,int len)42 static sword _Pkt2ReadField(HPKT hp, char *buf, int len)
43 {
44 dword fpos=tell(P2d->pfd);
45 dword rlen;
46 sword rc = 1;
47
48 if (read(P2d->pfd, buf, len) == 0)
49 {
50 pktapierr = PERR_EOF;
51 return -1;
52 }
53
54 buf[len] = 0;
55
56 rlen = strlen(buf);
57
58 /* Filepos = Filepos + Length of String */
59 fpos += rlen;
60
61 /* If Length of String < Requested Len, rc = 0 */
62 if (rlen != len)
63 {
64 fpos ++;
65 rc = 0;
66 P2d->in_msg = 0;
67 }
68
69 lseek(P2d->pfd, fpos, SEEK_SET);
70
71 return rc;
72 }
73
74 /* Convert P2-Msghdr Information to XMSG Structur */
75
_Pkt2ConvertMsghdrToXmsg(XMSG * xmsg,PKT2MSGHEADER * msghdr)76 static void _Pkt2ConvertMsghdrToXmsg(XMSG *xmsg, PKT2MSGHEADER *msghdr)
77 {
78 xmsg->orig.node = msghdr->orig_node;
79 xmsg->dest.node = msghdr->dest_node;
80 xmsg->orig.net = msghdr->orig_net;
81 xmsg->dest.net = msghdr->dest_net;
82 xmsg->attr = msghdr->attrib;
83
84 /* Copy 19 byte to make sure, Byte 20 is '\0' */
85 memcpy(xmsg->__ftsc_date, msghdr->datetime, 19);
86
87 MsgCvtFTSCDateToBinary(xmsg->__ftsc_date, (union stamp_combo *)&xmsg->date_written);
88 }
89
Pkt2ReadMsg(HPKT hp,XMSG * xmsg,dword textlen,byte * textptr)90 sword PKTAPI Pkt2ReadMsg(HPKT hp, XMSG *xmsg, dword textlen, byte *textptr)
91 {
92 PKT2MSGHEADER msghdr;
93 sword rc;
94
95 if (PktInvalidPh(hp))
96 return -1;
97
98 if (hp->mode != PKTMODE_READ)
99 {
100 pktapierr = PERR_BADM;
101 return -1;
102 }
103
104 /* When XMSG = 0, then read Text */
105 if (xmsg)
106 {
107 memset(xmsg, 0, sizeof(XMSG));
108
109 if (P2d->in_msg)
110 {
111 char *buf = malloc(4096);
112 while (_Pkt2ReadField(hp, buf, 4095) == 1);
113 free(buf);
114 }
115
116 if ((rc=_Pkt2ReadMsgHdr(hp, &msghdr)) != 0)
117 return rc;
118
119 _Pkt2ConvertMsghdrToXmsg(xmsg, &msghdr);
120
121 _Pkt2ReadField(hp, xmsg->to , 35);
122
123 _Pkt2ReadField(hp, xmsg->from, 35);
124
125 _Pkt2ReadField(hp, xmsg->subj, 71);
126
127 /* Filepointer is in Mail */
128 P2d->in_msg = 1;
129 }
130
131 /* If Body is'nt requested, don't read Body */
132 /* If we're not in a message - do nothing */
133 if (P2d->in_msg && textptr && (textlen > 1))
134 return _Pkt2ReadField(hp, textptr, textlen-1);
135 else
136 if (textptr)
137 *textptr = 0;
138
139 return P2d->in_msg;
140 }
141
Pkt2ReadMsgComplete(HPKT hp,XMSG * xmsg,byte ** textptr)142 sword PKTAPI Pkt2ReadMsgComplete(HPKT hp, XMSG *xmsg, byte **textptr)
143 {
144 dword len = 8192;
145 dword ofs = 0;
146
147 if (Pkt2ReadMsg(hp, xmsg, 0, 0) == -1)
148 return -1;
149
150 *textptr = realloc(*textptr, len);
151
152 while (Pkt2ReadMsg(hp, 0, 8192, (*textptr)+ofs) == 1)
153 {
154 ofs += 8191;
155 len += 8192;
156 *textptr = realloc(*textptr, len);
157 }
158
159 return 0;
160 }
161