home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / NETBIO.ZIP / NETDATE.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1990-05-03  |  5.9 KB  |  241 lines

  1. {$V-}
  2. program NetDate;
  3. {
  4.   This is a simple program that allows two NetBIOS workstations to
  5.   synchronize dates.  It was originally written for my personal use on
  6.   my LANtastic system at home. Since there has been some interest in it
  7.   on Compuserve, I decided to upload it.
  8.  
  9.   This program uses Broadcast Datagrams to send the time/date.  Some
  10.   NetBIOS implementations like Novell's NetBIOS emulator do not
  11.   implement Broadcast Datagrams.  Under Novell, this program isn't
  12.   necessary because there is an explicit NetWare function call to
  13.   get the Server's time/date (see the NETWARE unit of B-Tree Filer).
  14.  
  15.   Please address questions or comments regarding this utility on Compuserve in
  16.   the PCVENB forum in section 6.
  17.  
  18.   by Richard S. Sadowsky
  19.   5/3/90
  20. }
  21. uses
  22.      Dos,
  23.      OpCrt,
  24.      NetBIOS; {Services for NetBIOS from B-Tree Filer}
  25.  
  26. const
  27.   TimesToRetry     = 500;
  28.  
  29.   NetDateRec       : NBNameStr = 'NetDateRec*****';
  30.   NetDateSend      : NBNameStr = 'NetDateSend****';
  31.   NetDateSSummons  : NBNameStr = 'NetDateSSummons';
  32.   NetDateRSummons  : NBNameStr = 'NetDateRSummons';
  33.   IDString         : String[11] = 'NetDate-RSS';
  34.  
  35. type
  36.   DateTimePacket   =
  37.     record
  38.       Year,
  39.       Month,
  40.       Day,
  41.       Hour,
  42.       Min,
  43.       Sec          : Word;
  44.       ID           : String[11];
  45.     end;
  46.  
  47. var
  48.   SaveExitProc     : Pointer;
  49.   NameNum          : Byte;
  50.   OurNCB           : NCB;
  51.   ActAsSender      : Boolean;
  52.  
  53. {$F+}
  54. procedure OurExitProc;
  55. {Deletes the netbios name}
  56. var
  57.   Ret : Byte;
  58.  
  59. begin
  60.   ExitProc := SaveExitProc;  {allow chaining to original ExitProc}
  61.  
  62.   {Cancel any pending requests and delete the added names}
  63.   Ret := CancelRequest(OurNCB);
  64.   if ActAsSender then
  65.     Ret := NetBIOSDeleteName(NetDateSend)
  66.   else
  67.     Ret := NetBIOSDeleteName(NetDateRec);
  68. end;
  69. {$F-}
  70.  
  71. procedure CheckForUserBreak;
  72. {Abort if ^C or Esc pressed}
  73. begin
  74.   if not Keypressed then Exit;
  75.   while KeyPressed do begin
  76.     if ReadKey in [^[,^C] then begin
  77.       WriteLn(^M^J,'User break');
  78.       Halt;
  79.     end;
  80.   end;
  81. end;
  82.  
  83. procedure SetDateAndTime(var Packet : DateTimePacket);
  84. var
  85.   Sec100 : Word;
  86.  
  87. begin
  88.   with Packet do begin
  89.     Sec100 := 0;
  90.     SetDate(Year,Month,Day);
  91.     SetTime(Hour,Min,Sec,Sec100);
  92.   end;
  93. end;
  94.  
  95. procedure GetDateAndTime(var Packet : DateTimePacket);
  96. var
  97.   WD,Sec100 : Word;
  98.  
  99. begin
  100.  with Packet do begin
  101.    GetDate(Year,Month,Day,WD);
  102.    GetTime(Hour,Min,Sec,Sec100);
  103.    ID := IDString;
  104.  end;
  105. end;
  106.  
  107. procedure WaitForReceiver;
  108. var
  109.   Msg : String;
  110.   Ret : Byte;
  111.   Retries : Word;
  112. begin
  113.   repeat
  114.     Msg := '';
  115.     SendBDatagram(OurNCB,NameNum,FALSE,
  116.                   Length(NetDateSSummons)+1,NetDateSSummons);
  117.     while OurNCB.CmdComplete <> 0 do
  118.       CheckForUserBreak;
  119.     if OurNCB.RetCode <> 0 then begin
  120.       WriteLn('SendBDatagram error = ',OurNCB.RetCode);
  121.       Halt;
  122.     end;
  123.     Retries := 0;
  124.     ReceiveBDatagram(OurNCB,NameNum,FALSE,SizeOf(Msg),Msg);
  125.     while (Retries < TimesToRetry) and (OurNCB.CmdComplete <> 0) do begin
  126.       CheckForUserBreak;
  127.       Inc(Retries);
  128.     end;
  129.     if Retries < TimesToRetry then begin
  130.       if OurNCB.RetCode <> 0 then begin
  131.         WriteLn('ReceiveBDatagram error = ',OurNCB.RetCode);
  132.         Halt;
  133.       end;
  134.     end
  135.     else begin
  136.       Ret := CancelRequest(OurNCB);
  137.       if (Ret <> 0) and (Ret <> $24) then begin
  138.         WriteLn('Error cancelling netbios event');
  139.         Halt;
  140.       end;
  141.       Delay(50);
  142.     end;
  143.   until Msg = NetDateRSummons;
  144. end;
  145.  
  146. procedure WaitForSender;
  147. var
  148.   Msg : String;
  149. begin
  150.   repeat
  151.     Msg := '';
  152.     ReceiveBDatagram(OurNCB,NameNum,FALSE,SizeOf(Msg),Msg);
  153.     while OurNCB.CmdComplete <> 0 do
  154.       CheckForUserBreak;
  155.     if OurNCB.RetCode <> 0 then begin
  156.       WriteLn('ReceiveBDatagram error = ',OurNCB.RetCode);
  157.       Halt;
  158.     end;
  159.   until Msg = NetDateSSummons;
  160.   Delay(100);
  161.   SendBDatagram(OurNCB,NameNum,FALSE,Length(NetDateRSummons)+1,NetDateRSummons);
  162.   while OurNCB.CmdComplete <> 0 do
  163.     CheckForUserBreak;
  164.   if OurNCB.RetCode <> 0 then begin
  165.     WriteLn('SendBDatagram error = ',OurNCB.RetCode);
  166.     Halt;
  167.   end;
  168. end;
  169.  
  170. procedure NetBIOSReceiver;
  171. {NetBIOS datagram and session demo}
  172. var
  173.   Packet : DateTimePacket;
  174.   Ret : Byte;
  175.  
  176. begin
  177.   Write('Please wait, adding NetBIOS name...');
  178.   if NetBiosAddName(NetDateRec,NameNum) <> 0 then begin
  179.     WriteLn(^M^J,'Unable to add NetBIOS name');
  180.     Exit;
  181.   end;
  182.   WriteLn;
  183.   Write('Waiting for sender...');
  184.   WaitForSender;
  185.   WriteLn;
  186.   ReceiveBDatagram(OurNCB,NameNum,FALSE,SizeOf(Packet),Packet);
  187.   while OurNCB.CmdComplete <> 0 do
  188.     CheckForUserBreak;
  189.   if (OurNCB.RetCode = 0) then begin
  190.     if Packet.ID = IDString then begin
  191.       SetDateAndTime(Packet);
  192.       WriteLn('Date and time set');
  193.     end
  194.     else
  195.       WriteLn('Packet received was corrupt - did not set date and time');
  196.   end
  197.   else
  198.     WriteLn('ReceiveBDatagram error = ',OurNCB.RetCode);
  199.  
  200. end;
  201.  
  202. procedure NetBIOSSender;
  203. {NetBIOS datagram sender}
  204.  
  205. var
  206.   Ret : Byte;
  207.   Packet : DateTimePacket;
  208.  
  209. begin
  210.   Write('Please wait, adding NetBIOS name...');
  211.   if NetBiosAddName(NetDateSend,NameNum) <> 0 then begin
  212.     WriteLn(^M^J,'Unable to add NetBIOS name');
  213.     Exit;
  214.   end;
  215.   WriteLn;
  216.   Write('Waiting for receiver...');
  217.   WaitForReceiver;
  218.   WriteLn;
  219.   GetDateAndTime(Packet);
  220.   SendBDatagram(OurNCB,NameNum,FALSE,SizeOf(Packet),Packet);
  221.   while OurNCB.CmdComplete <> 0 do
  222.     CheckForUserBreak;
  223.   if OurNCB.RetCode = 0 then
  224.     WriteLn('Date sent to receiver')
  225.   else
  226.     WriteLn('SendBDatagram error = ',OurNCB.RetCode)
  227.  
  228. end;
  229.  
  230. begin
  231.   ActAsSender := (ParamCount > 0);
  232.   SaveExitProc := ExitProc;  {save original exitproc}
  233.   ExitProc := @OurExitProc;  {setup our exit procedure}
  234.   Delay(1);                  {get delay working}
  235.   WriteLn('NetDate 1.0 by Richard Sadowsky',^M^J);
  236.   if ActAsSender then
  237.     NetBIOSSender
  238.   else
  239.     NetBIOSReceiver;
  240. end.
  241.