home *** CD-ROM | disk | FTP | other *** search
- unit eco_ipx;
-
- interface
-
- const
- temporary_socket = 0;
- permanent_socket = $ff;
- okay = 0;
- invite_socket = $0150;
- chat_socket = $0250;
-
-
- type
- ipxnode = array[1..6] of byte;
- ipxaddress = record
- network : longint; { high-low}
- node : ipxnode; { high low }
- socket : word; { high-low }
- end;
-
- ipxpacket = record
- packetchecksum : word; { high-low }
- packetlength : word; { high-low }
- packettransportcontrol : byte;
- packettype : byte;
- destination : ipxaddress;
- source : ipxaddress;
- data : array[0..546] of byte;
- end;
-
- ecbfragment = record
- address : pointer; { offset-segment }
- size : word; { low-high }
- end;
-
- ecb = record
- link : pointer; { offset - segment }
- esraddress : pointer; { offset - segment }
- inuseflag : byte;
- completioncode : byte;
- ecbsocket : word; { high-low }
- ipxworkspace : longint; { n / a }
- driverworkspace : array[1..12] of byte; { n / a }
- immediateaddress : ipxnode; { high low }
- fragmentcount : word; { low-high }
- fragmentdescriptor : array[0..1] of ecbfragment;
- end;
-
-
-
- function asciiz(var x):string;
-
- function ipxopensocket(var socketnumber:word;sockettype:byte):integer;
- function ipxclosesocket(socketnumber:word):integer;
- function ipxgetlocaltarget(
- var networkaddress: ipxaddress;
- var immediateaddress:ipxnode;
- var transporttime:word
- ):integer;
-
- procedure ipxsendpacket(var eventcontrolblock: ecb);
- function ipxlistenforpacket(var eventcontrolblock:ecb):integer;
- procedure ipxscheduleipxevent(timeunits:word; var eventcontrolblock: ecb);
- function ipxcancelevent(var eventcontrolblock: ecb):integer;
- function ipxschedulespecialevent(
- timeunits: word; var eventcontrolblock: ecb
- ):integer;
-
- function ipxgetintervalmarker: word;
- procedure ipxgetinternetworkaddress(var networkaddress: ipxaddress);
- procedure ipxrelinquishcontrol;
- procedure ipxdisconnectfromtarget(var networkaddress:ipxaddress);
- procedure setupsendpacket(
- var ecbvar : ecb; var ipxvar : ipxpacket; network : longint;
- node : ipxnode; socketin : word; var buffer; buffsize : word; esr : pointer
- );
-
- procedure setuprcvpacket(
- var ecbvar : ecb; var ipxvar : ipxpacket; socket : word; var buffer;
- buffsize : word; esr : pointer
- );
-
- function ncpserverpresent: boolean;
- procedure ncpgetinternetaddr(
- connection : byte; var targetnetwork : longint; var targetnode : ipxnode;
- var targetsocket : word
- );
-
- function ncpgetourstnnum:word;
- function ncpgetconninfo(
- connection : byte; var typex : word; var name : string
- ) : integer;
-
- function swap(x: word): word;
-
-
-
-
-
-
-
-
-
-
-
-
- implementation
-
-
-
-
-
-
-
-
-
-
-
-
- uses
- dos
-
- ;
-
-
-
- var
- regs : registers;
-
-
-
- function swap;
- begin
- swap := (x shl 8) or (x shr 8);
- end;
-
-
-
- function ipxopensocket;
- begin
- regs.bx := 0;
- regs.dx := socketnumber;
- regs.al := sockettype;
- intr($7a,regs);
- ipxopensocket := regs.al;
- socketnumber := regs.dx;
- end;
-
-
-
- function ipxclosesocket;
- begin
- regs.bx := 1;
- regs.dx := socketnumber;
- intr($7a,regs);
- end;
-
-
-
- function ipxgetlocaltarget;
- begin
- {let op beide segment adressen van de eerste twee var's moeten gelijk zijn }
- regs.bx := 2;
- regs.si := ofs(networkaddress);
- regs.ds := seg(networkaddress);
- regs.di := ofs(immediateaddress);
- regs.es := seg(immediateaddress);
- if regs.ds = regs.es then intr($7a,regs) else regs.al := $ff;
- transporttime := regs.cx;
- ipxgetlocaltarget := regs.al;
- end;
-
-
-
- procedure ipxsendpacket;
- begin
- regs.bx := 3;
- regs.es := seg(eventcontrolblock);
- regs.si := ofs(eventcontrolblock);
- intr($7a, regs);
- end;
-
-
-
- function ipxlistenforpacket;
- begin
- regs.bx := 4;
- regs.es := seg(eventcontrolblock);
- regs.si := ofs(eventcontrolblock);
- intr($7a, regs);
- ipxlistenforpacket := regs.al;
- end;
-
-
-
- procedure ipxscheduleipxevent;
- begin
- regs.bx := 5;
- regs.es := seg(eventcontrolblock);
- regs.si := ofs(eventcontrolblock);
- regs.ax := timeunits;
- intr($7a, regs);
- end;
-
-
-
- function ipxcancelevent;
- begin
- regs.bx := 6;
- regs.es := seg(eventcontrolblock);
- regs.si := ofs(eventcontrolblock);
- intr($7a, regs);
- ipxcancelevent := regs.al;
- end;
-
-
-
- function ipxschedulespecialevent;
- begin
- regs.bx := 7;
- regs.ax := timeunits;
- regs.es := seg(eventcontrolblock);
- regs.si := ofs(eventcontrolblock);
- intr($7a, regs);
- ipxschedulespecialevent := regs.al;
- end;
-
-
-
- function ipxgetintervalmarker: word;
- begin
- regs.bx := 8;
- intr($7a, regs);
- ipxgetintervalmarker := regs.ax;
- end;
-
-
-
- procedure ipxgetinternetworkaddress;
- begin
- regs.bx := 9;
- regs.si := ofs(networkaddress);
- regs.es := seg(networkaddress);
- intr($7a,regs);
- end;
-
-
-
- procedure ipxrelinquishcontrol;
- begin
- regs.bx := $0a;
- intr($7a,regs);
- end;
-
-
-
- procedure ipxdisconnectfromtarget;
- begin
- regs.bx := $0b;
- regs.si := ofs(networkaddress);
- regs.es := seg(networkaddress);
- intr($7a,regs);
- end;
-
-
-
- procedure setupsendpacket;
- var
- ttime,i : word;
- ipxaddr : ipxaddress;
- immnode : ipxnode; { zelfde segment als ipxaddr ! }
-
- begin
- ipxaddr.network := network;
- ipxaddr.node := node;
- ipxaddr.socket := socketin;
-
- ecbvar.esraddress := esr;
-
- ecbvar.inuseflag := $ff;
- ecbvar.ecbsocket := socketin;
- ecbvar.fragmentcount := 2;
-
- ecbvar.fragmentdescriptor[0].address := @ipxvar;
- ecbvar.fragmentdescriptor[0].size := sizeof(ipxvar);
-
- ecbvar.fragmentdescriptor[1].address := @buffer;
- ecbvar.fragmentdescriptor[1].size := buffsize;
-
- ipxvar.packettype := 0;
-
- if ipxgetlocaltarget( ipxaddr, immnode, ttime ) = $fa then begin
- writeln('no network path found');
- write('network: ',network,' socket: ', socketin,' adress: ');
- for i := 1 to 6 do write(node[i]:4);
- writeln;
- end;
- ecbvar.immediateaddress := immnode;
- ipxvar.destination.network := network;
- ipxvar.destination.node := node;
- ipxvar.destination.socket := ecbvar.ecbsocket;
- end;
-
-
-
- procedure setuprcvpacket;
- begin
- ecbvar.esraddress := esr;
- ecbvar.inuseflag := $ff;
- ecbvar.ecbsocket := socket;
- ecbvar.fragmentcount := 2;
- ecbvar.fragmentdescriptor[0].address := @ipxvar;
- ecbvar.fragmentdescriptor[0].size := sizeof(ipxvar);
- ecbvar.fragmentdescriptor[1].address := @buffer;
- ecbvar.fragmentdescriptor[1].size := buffsize;
- end;
-
-
-
- function asciiz(var x): string;
- var
- y : array[1..128] of char absolute x;
- i : integer;
- u : string;
-
- begin
- i := 1; u := '';
- while (i < 128) and (y[i] <> #0) do begin
- u := u + y[i];
- inc(i);
- end;
- asciiz := u;
- end;
-
-
-
- function ncpgetourstnnum:word;
- begin
- regs.ah := $dc; { get station number }
- msdos( regs );
- ncpgetourstnnum := regs.al;
- end;
-
-
-
- function ncpgetconninfo;
- type
- connectionpacketrequest = record
- packetlength : word;
- functie : byte;
- connectionnumber : byte;
- end;
- connectionpacketreply = record
- returnlength : word;
- uniqueid : longint;
- typex : word;
- objectname : array[1..48] of byte;
- logtime : array[1..8] of byte;
- end;
-
- var
- request : connectionpacketrequest;
- reply : connectionpacketreply;
-
- begin
- request.packetlength := 2;
- request.functie := 22;
- reply.returnlength := 62;
- with regs do begin
- ah := $e3;
- si := ofs(request);
- ds := seg(request);
- di := ofs(reply);
- es := seg(reply);
- end;
- request.connectionnumber := connection;
- msdos(regs);
- name := asciiz(reply.objectname);
- typex := reply.typex;
- ncpgetconninfo := regs.al;
- end;
-
-
-
- procedure ncpgetinternetaddr;
- type
- internetpacketrequest = record
- packetlength : word;
- functie : byte;
- connectionnumber : byte;
- end;
- internetpacketreply = record
- returnlength : word;
- internetnetwork : longint;
- internethost : ipxnode;
- internetsocket : word;
- end;
-
- var
- request : internetpacketrequest;
- reply : internetpacketreply;
-
- begin
- request.packetlength := 2;
- request.functie := 19; { 19 := get internet address }
- request.connectionnumber := connection;
- reply.returnlength := 12;
- with regs do begin
- ah := $e3;
- si := ofs(request);
- ds := seg(request);
- di := ofs(reply);
- es := seg(reply);
- end;
- request.connectionnumber := connection;
- msdos(regs);
- targetnetwork := reply.internetnetwork;
- targetnode := reply.internethost;
- targetsocket := reply.internetsocket;
- end;
-
-
-
- function ncpserverpresent;
- type
- getserverinforequest = record
- packetlength : word;
- functie : byte;
- end;
- getserverinforeply = record
- returnlength : word;
- servername : array[0..47] of char;
- netwareversion : byte;
- netwaresubversion : byte;
- connectionssupported : word;
- connectionsinuse : word;
- maxconnectedvolumes : word;
- undefined : array[1..72] of byte;
- end;
-
- var
- request : getserverinforequest;
- reply : getserverinforeply;
-
- begin
- request.packetlength := 1;
- request.functie := 17; { 17 := get server info }
- reply.returnlength := sizeof( reply ) - 2;
- reply.servername[0] := #0;
- with regs do begin
- ah := $e3;
- si := ofs(request);
- ds := seg(request);
- di := ofs(reply);
- es := seg(reply);
- end;
- msdos( regs);
- ncpserverpresent := reply.servername[0] <> #0;
- end;
-
-
-
- end.
-
- ------------ ipx routines voor novell -----------------------------------
-
- g. bokma november 1991
-
- documentatie : zie hoofdstuk 14 programmers guide to netware
-