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