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
_Pkt2WriteMsgHdr(HPKT hp,PKT2MSGHEADER * msghdr)19 static sword _Pkt2WriteMsgHdr(HPKT hp, PKT2MSGHEADER *msghdr)
20 {
21 if (writePKT2MSGHEADER(P2d->pfd, msghdr) != sizeof(PKT2MSGHEADER))
22 {
23 return -1;
24 }
25
26 return 0; /* Ok */
27 }
28
_Pkt2WriteField(HPKT hp,char * buf,dword len)29 static sword _Pkt2WriteField(HPKT hp, char *buf, dword len)
30 {
31 char endmark = 0;
32
33 if (!buf)
34 {
35 buf = &endmark;
36 len = 1;
37 }
38
39 if (write(P2d->pfd, buf, len) != len)
40 {
41 return -1;
42 }
43
44 return 0;
45 }
46
47 /* Convert P2-Msghdr Information to XMSG Structur */
48
_Pkt2ConvertXmsgToMsghdr(PKT2MSGHEADER * msghdr,XMSG * xmsg)49 static void _Pkt2ConvertXmsgToMsghdr(PKT2MSGHEADER *msghdr, XMSG *xmsg)
50 {
51 msghdr->signatur = 2;
52 msghdr->orig_node = xmsg->orig.node;
53 msghdr->dest_node = xmsg->dest.node;
54
55 msghdr->orig_net = xmsg->orig.net;
56 msghdr->dest_net = xmsg->dest.net;
57 msghdr->attrib = (word) (xmsg->attr & 0xFFFF);
58
59 /* Copy 19 byte to make sure, Byte 20 is '\0' */
60 memcpy(msghdr->datetime, xmsg->__ftsc_date, 19);
61 }
62
Pkt2WriteMsg(HPKT hp,XMSG * xmsg,word fAppend,byte * textptr)63 sword PKTAPI Pkt2WriteMsg(HPKT hp, XMSG *xmsg, word fAppend, byte *textptr)
64 {
65 PKT2MSGHEADER msghdr;
66 sword rc;
67
68 if (PktInvalidPh(hp))
69 return -1;
70
71 if (hp->mode != PKTMODE_WRITE)
72 {
73 pktapierr = PERR_BADM;
74 return -1;
75 }
76
77 /* When XMSG = 0, then write Text */
78 if (xmsg)
79 {
80 memset(&msghdr, 0, sizeof(PKT2MSGHEADER));
81
82 if (P2d->in_msg)
83 {
84 _Pkt2WriteField(hp, 0, 0);
85 P2d->in_msg = 0;
86 }
87
88 _Pkt2ConvertXmsgToMsghdr(&msghdr, xmsg);
89
90 if ((rc=_Pkt2WriteMsgHdr(hp, &msghdr)) != 0)
91 return rc;
92
93 _Pkt2WriteField(hp, xmsg->to, strlen(xmsg->to)+1);
94
95 _Pkt2WriteField(hp, xmsg->from, strlen(xmsg->from)+1);
96
97 _Pkt2WriteField(hp, xmsg->subj, strlen(xmsg->subj)+1);
98
99 /* Filepointer is in Mail */
100 }
101
102 if (fAppend)
103 {
104 P2d->in_msg = 1;
105 /* If fAppend != 0 and textptr = 0 -> messagebody is written later */
106 if (textptr)
107 _Pkt2WriteField(hp, textptr, strlen(textptr));
108 }
109 else
110 {
111 /* If fAppend = 0 and textptr = 0 -> no messagebody ! */
112 P2d->in_msg = 0;
113 _Pkt2WriteField(hp, textptr, strlen(textptr)+1);
114 }
115
116 return 0;
117 }
118