source: abuse/tags/pd/macabuse/src/net/mac/ddptst.c @ 49

Last change on this file since 49 was 49, checked in by Sam Hocevar, 12 years ago
  • Imported original public domain release, for future reference.
  • Property svn:keywords set to Id
File size: 8.9 KB
Line 
1#include <AppleTalk.h>
2#include <ADSP.h>
3#include <stdio.h>
4#include <stdlib.h>
5#include <stdarg.h>
6#include <string.h>
7
8DDPSocketListenerUPP DDPListener;
9
10#ifdef __POWERPC__
11UniversalProcPtr InitDDPListener;
12#else
13extern asm void DDPEntry(char *buffer);
14#endif
15
16#define PACKET_TYPE 0xaa
17
18int eprintf(char *form, ...)
19{
20        va_list arg;
21       
22        va_start(arg,form);
23        vfprintf(stderr,form,arg);
24        va_end(arg);
25       
26        exit(0);
27
28        return 0;
29}
30
31#define assert(x,y) ((x)? 0 : eprintf("Line %d: %s, error\n",__LINE__, y))
32#define macerr(x,y) ((x)? eprintf("Line %d: %s, error %d\n",__LINE__, y, x) : 0)
33
34unsigned char *pstrcpy(unsigned char *d, unsigned char *s)
35{
36        unsigned int i = (unsigned char)s[0];
37
38        BlockMove(s,d,i+1);
39       
40        return d;
41}
42
43struct sPacket
44{
45        long Count;
46        AddrBlock Addr;
47        long Data;
48};
49struct sDDPBuff
50{
51        struct sPacket *Start,*End,*Head,*Tail;
52        long Count;
53        long Data;
54};
55
56NamesTableEntry myNTEName;
57MPPParamBlock p;
58char buffer[602 + 20 + 602*16];
59ATDDPRec ddp;
60
61unsigned char socket = 0;
62short   mppRef;
63
64void DoWrite(AddrBlock addr,char *buff, short size)
65{
66        char wds[14];
67        char header[20];
68
69        // the connection with the chosen socket is open, so now send to
70        //  the send queue exactly myDataSize number of bytes
71
72        // set up WriteDDP parameters
73
74        fprintf(stderr,"Writing Data\n");
75       
76        BuildDDPwds((Ptr)wds, (Ptr)header, (Ptr)buff, addr, PACKET_TYPE,size);
77
78        p.DDP.ioCompletion = nil;
79        p.DDP.socket = socket;
80        p.DDP.checksumFlag = 0;
81        p.DDP.u.wdsPointer = (Ptr) &wds;
82
83        macerr(PWriteDDP(&p, FALSE), "Write error");
84                                                                // send data to the remote connection
85}
86
87void DoRead(AddrBlock *addr, char *buff, short size)
88{
89        // Now read from the receive queue exactly myDataSize number of bytes.
90
91        fprintf(stderr,"Reading Data\n");
92
93        struct sDDPBuff *db = (struct sDDPBuff *)(&buffer[602]);
94        while ( db->Count == 0) ;
95       
96        db->Count--;
97
98        struct sPacket *pk = db->Tail;
99        char *b = (char*)&pk->Data;
100
101        for (int i=0; i<pk->Count && i<size;i++)
102                buff[i] = b[i];
103
104        *addr = pk->Addr;
105
106        pk = (struct sPacket *)((char *)pk + 602);
107        if (pk>=db->End)
108                pk = db->Start;
109        db->Tail = pk;
110}
111
112int PickSocket(AddrBlock *addr)
113{
114        EntityName      entity;
115        char Buff[105];
116
117        NBPSetEntity((Ptr) &entity, "\p=", "\pAbuseServer", "\p*");
118       
119        p.NBPinterval = 7;// retransmit every 7*8=56 ticks
120        p.NBPcount = 3; // and retry 3 times
121        p.NBPentityPtr = (Ptr) &entity;
122        p.NBPretBuffPtr = (Ptr) Buff;
123        p.NBPretBuffSize = sizeof(Buff);
124        p.NBPmaxToGet = 1;
125
126        macerr(PLookupName(&p,0), "Lookup error");
127       
128        if (p.NBPnumGotten != 1)
129                return 0;
130               
131        macerr(NBPExtract((Ptr)Buff,p.NBPnumGotten,1,&entity,addr),"Extraction error");
132
133        for (int i=0; i<entity.objStr[0]; i++)
134                Buff[i] = entity.objStr[1+i];
135        Buff[entity.objStr[0]] = 0;
136       
137        fprintf(stderr,"Found [%s]\n",Buff);
138
139        return 1;
140}
141
142void main ()
143{
144        AddrBlock       myAddrBlk;
145
146        fprintf(stderr,"Open MPP\n");
147        macerr(OpenDriver("\p.MPP", &mppRef), "MPP Open Error");        // open .MPP driver
148
149#ifdef __POWERPC__
150        // Load 68K listener
151        printf("Loading 68K Resource\n");
152        Handle listener;
153
154        listener = GetResource('SOCK',0);
155
156        if (!listener)
157                return;
158
159        HLock(listener);
160        InitDDPListener = (UniversalProcPtr)NewRoutineDescriptor((ProcPtr)(*listener + 0x12),
161                kRegisterBased
162                 | REGISTER_ROUTINE_PARAMETER(1, kRegisterA1, SIZE_CODE(sizeof(long))),kM68kISA);
163        DDPListener = (UniversalProcPtr) (*listener+0x14);
164#else
165        DDPListener = (DDPSocketListenerUPP)(((char*)(&DDPEntry)) + 6);
166#endif
167
168        struct sDDPBuff *db = (struct sDDPBuff *)(&buffer[602]);
169
170        db->Start = (struct sPacket *)(&db->Data);
171        db->End = (struct sPacket *)(((char*)db->Start) + 602*16);
172        db->Tail = db->Head = db->Start;
173        db->Count = 0;
174
175        // start DDP
176        fprintf(stderr,"Open DDP socket\n");
177        ddp.abResult = 1;
178        ddp.ddpActCount = 0;
179        ddp.ddpReqCount = 586;
180        ddp.ddpDataPtr = buffer;
181        p.MPPioCompletion = 0L;
182        p.MPPioRefNum = mppRef;
183        p.DDPsocket = 0;
184        p.DDPlistener = DDPListener;
185        macerr(POpenSkt(&p,FALSE), "Open Socket Error");
186        socket = p.DDPsocket;
187
188        fprintf(stderr,"Initialize socket listener\n");
189
190#ifdef __POWERPC__
191        CallUniversalProc(InitDDPListener,
192                                kRegisterBased |
193                                REGISTER_ROUTINE_PARAMETER(1, kRegisterA1, SIZE_CODE(sizeof(long))),
194                        (char*)db);
195#else
196        DDPEntry((char*)db);
197#endif
198
199        short node,net;
200        Str255 name;
201       
202        fprintf(stderr,"Get Address...");       
203        macerr(GetNodeAddress(&node,&net),"Can't get node address");
204        sprintf((char*)&name[1],"Abuse@%d:%d:%d",net,node,socket);
205        name[0] = strlen((char*)&name[1]);
206
207        fprintf(stderr,"I'm %s\n",&name[1]);
208       
209        NBPSetNTE((Ptr) &myNTEName, "\pDDPtst", "\pAbuseServer", "\p*", socket);
210                        // set up NBP names table entry
211
212        // set up PRegisterName parameters
213
214        fprintf(stderr,"Registering Name\n");
215
216        p.NBP.interval = 7;                                                                                                     // retransmit every 7*8=56 ticks
217        p.NBP.count = 3;                                                                                                                // and retry 3 times
218        p.NBP.nbpPtrs.entityPtr = (Ptr) &myNTEName;     // name to register
219        p.NBP.parm.verifyFlag = 1;                                                                      // verify this name
220
221        if (PRegisterName(&p, FALSE))
222        {
223                fprintf(stderr,"Couldn't register name\n");
224
225                do
226                {
227                        fprintf(stderr,"Searching for socket\n");
228                } while (!PickSocket(&myAddrBlk));
229
230                fprintf(stderr,"Found %d:%d:%d\n",myAddrBlk.aNet,myAddrBlk.aNode,myAddrBlk.aSocket);
231
232                char st[80];
233
234                DoWrite(myAddrBlk,"Haoel, maestre!",16);
235                DoWrite(myAddrBlk,"Haoel, maestre!",16);
236                DoWrite(myAddrBlk,"Haoel, maestre!",16);
237                DoWrite(myAddrBlk,"Haoel, maestre!",16);
238                DoWrite(myAddrBlk,"Haoel, maestre!",16);
239                DoWrite(myAddrBlk,"Haoel, maestre!",16);
240                DoWrite(myAddrBlk,"Haoel, maestre!",16);
241                DoWrite(myAddrBlk,"Haoel, maestre!",16);
242               
243                DoRead(&myAddrBlk,st,sizeof(st));
244                fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
245                        myAddrBlk.aNet,
246                        myAddrBlk.aNode,
247                        myAddrBlk.aSocket
248                        );     
249               
250                DoWrite(myAddrBlk,"Haoel, maestre!",16);
251                DoWrite(myAddrBlk,"Haoel, maestre!",16);
252                DoWrite(myAddrBlk,"Haoel, maestre!",16);
253                DoWrite(myAddrBlk,"Haoel, maestre!",16);
254                DoWrite(myAddrBlk,"Haoel, maestre!",16);
255                DoWrite(myAddrBlk,"Haoel, maestre!",16);
256                DoWrite(myAddrBlk,"Haoel, maestre!",16);
257                DoWrite(myAddrBlk,"Haoel, maestre!",16);
258                DoWrite(myAddrBlk,"Haoel, maestre!",16);
259        }
260        else
261        {
262                char st[80];
263               
264                DoRead(&myAddrBlk,st,sizeof(st));
265                fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
266                        myAddrBlk.aNet,
267                        myAddrBlk.aNode,
268                        myAddrBlk.aSocket
269                        );
270
271                DoRead(&myAddrBlk,st,sizeof(st));
272                fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
273                        myAddrBlk.aNet,
274                        myAddrBlk.aNode,
275                        myAddrBlk.aSocket
276                        );
277
278                DoWrite(myAddrBlk,"Hello, other!",14);
279
280                DoRead(&myAddrBlk,st,sizeof(st));
281                fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
282                        myAddrBlk.aNet,
283                        myAddrBlk.aNode,
284                        myAddrBlk.aSocket
285                        );
286
287                DoRead(&myAddrBlk,st,sizeof(st));
288                fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
289                        myAddrBlk.aNet,
290                        myAddrBlk.aNode,
291                        myAddrBlk.aSocket
292                        );
293
294                DoRead(&myAddrBlk,st,sizeof(st));
295                fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
296                        myAddrBlk.aNet,
297                        myAddrBlk.aNode,
298                        myAddrBlk.aSocket
299                        );
300
301                DoRead(&myAddrBlk,st,sizeof(st));
302                fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
303                        myAddrBlk.aNet,
304                        myAddrBlk.aNode,
305                        myAddrBlk.aSocket
306                        );
307
308                DoRead(&myAddrBlk,st,sizeof(st));
309                fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
310                        myAddrBlk.aNet,
311                        myAddrBlk.aNode,
312                        myAddrBlk.aSocket
313                        );
314
315                DoRead(&myAddrBlk,st,sizeof(st));
316                fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
317                        myAddrBlk.aNet,
318                        myAddrBlk.aNode,
319                        myAddrBlk.aSocket
320                        );
321
322                DoRead(&myAddrBlk,st,sizeof(st));
323                fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
324                        myAddrBlk.aNet,
325                        myAddrBlk.aNode,
326                        myAddrBlk.aSocket
327                        );
328
329                DoRead(&myAddrBlk,st,sizeof(st));
330                fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
331                        myAddrBlk.aNet,
332                        myAddrBlk.aNode,
333                        myAddrBlk.aSocket
334                        );
335
336                DoRead(&myAddrBlk,st,sizeof(st));
337                fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
338                        myAddrBlk.aNet,
339                        myAddrBlk.aNode,
340                        myAddrBlk.aSocket
341                        );
342
343                DoRead(&myAddrBlk,st,sizeof(st));
344                fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
345                        myAddrBlk.aNet,
346                        myAddrBlk.aNode,
347                        myAddrBlk.aSocket
348                        );
349
350                DoRead(&myAddrBlk,st,sizeof(st));
351                fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
352                        myAddrBlk.aNet,
353                        myAddrBlk.aNode,
354                        myAddrBlk.aSocket
355                        );
356
357                DoRead(&myAddrBlk,st,sizeof(st));
358                fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
359                        myAddrBlk.aNet,
360                        myAddrBlk.aNode,
361                        myAddrBlk.aSocket
362                        );
363
364                DoRead(&myAddrBlk,st,sizeof(st));
365                fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
366                        myAddrBlk.aNet,
367                        myAddrBlk.aNode,
368                        myAddrBlk.aSocket
369                        );
370
371                DoRead(&myAddrBlk,st,sizeof(st));
372                fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
373                        myAddrBlk.aNet,
374                        myAddrBlk.aNode,
375                        myAddrBlk.aSocket
376                        );
377
378                DoRead(&myAddrBlk,st,sizeof(st));
379                fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
380                        myAddrBlk.aNet,
381                        myAddrBlk.aNode,
382                        myAddrBlk.aSocket
383                        );
384
385        }
386
387        // we're done with the connection, so remove it
388
389        fprintf(stderr,"Removing Connection\n");
390
391        EntityName      entity;
392       
393        NBPSetEntity((Ptr) &entity, "\pDDPtst", "\pAbuseServer", "\p*");
394        p.MPPioCompletion = 0L;
395        p.MPPioRefNum = mppRef;
396        p.NBP.nbpPtrs.entityPtr = (Ptr)&entity;
397        macerr(PRemoveName(&p,FALSE),"Unregister name error");
398
399        p.DDPsocket = socket;
400        macerr(PCloseSkt(&p,FALSE), "Error closing socket");
401
402        fprintf(stderr,"Done.\n");
403}       // MyADSP
404
Note: See TracBrowser for help on using the repository browser.