home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 14 / MA_Cover_14.iso / internet / atalk_v1 / atalk2.p < prev    next >
Encoding:
Text File  |  1999-12-07  |  11.5 KB  |  476 lines

  1. ; (c) 1999 Cyborg 
  2.  
  3.     {* Include sys:coder/preass/Options.p *}
  4.  
  5.     {* String: Version="$VER: ATalk Net Client (C) CYBORG 1999"*}
  6.  
  7.     {* Structure sockaddr_in(),sin_len(BYTE),sin_family(BYTE),sin_port(WORD)
  8.                  sin_addr(LONG),DUMMY1(LONG),DUMMY2(LONG)*}
  9.     
  10.     {* Structure Sockaddr(),SA_Len(BYTE),SA_Family(BYTE)
  11.                  SA_Data[14]*}
  12.  
  13.     {* Structure Hostent,H_name(CHAR),h_aliases(APTR),h_addrtype(LONG)
  14.                  h_length(LONG),H_addr_list(CHAR)*}
  15.  
  16.     {* IncBlock: Puffer,2048*}
  17.  
  18.     {* Const AF_INET=2
  19.              Sock_STREAM=1
  20.              FIONBIO=$8004667e*}
  21.  
  22.     {* incVar: Addr*}
  23.  
  24.     {* Structure Node,ln_Succ(LONG),ln_pred(LONG),ln_Type(BYTE),ln_Pri(BYTE)
  25.                  ln_Name(LONG)*}
  26.  
  27.     {* Structure MsgList,LH_Head(LONG),LH_Tail(LONG),LH_TailPred(LONG),LH_Type(BYTE)
  28.                  pad(BYTE)*}
  29.  
  30.     {* Structure MsgPort,Node(STRUCT Node),mp_Flags(BYTE),mp_sigbit(BYTE)
  31.                  mp_sigTask(LONG),List(STRUCT MsgList)*}
  32.  
  33.     {* Structure Message,Node(STRUCT Node),Replyport(APTR),Length(WORD)*}
  34.  
  35.     {* Structure Window,NextWindow(APTR),LeftEdge(WORD),TopEdge(WORD),Width(WORD)
  36.                  Height(WORD),MouseY(WORD),MouseX(WORD),MinWidth(WORD),MinHeight(WORD)
  37.                  MaxWidth(WORD),MaxHeight(WORD),Flags(LONG),MenuStrip(APTR),Title(APTR)
  38.                  FirstRequest(APTR),DMRequest(APTR),ReqCount(WORD),WScreen(APTR)
  39.                  RPort(APTR),BorderLeft(BYTE),BorderTop(BYTE),BorderRight(BYTE)
  40.                  BorderBottom(BYTE),BorderRPort(APTR),FirstGadget(APTR),Parent(APTR)
  41.                  Descendant(APTR),Pointer(APTR),PtrHeight(BYTE),PtrWidth(BYTE),XOffset(BYTE)
  42.                  YOffset(BYTE),IDCMPFlags(LONG),UserPort(APTR),WindowPort(APTR)
  43.                  MessageKey(APTR),DetailPen(BYTE),BlockPen(BYTE),CheckMark(APTR)
  44.                  ScreenTitle(APTR),GZZMouseX(WORD),GZZMouseY(WORD),GZZWidth(WORD)
  45.                  GZZHeight(WORD),ExtData(APTR),UserData(APTR),WLayer(APTR),IFont(APTR)
  46.                  MoreFlags(LONG)*}
  47.  
  48.     {* incSysBlock: Windowname,200*}
  49.     {* incSysBlock: Eingabepuffer,500*}
  50.     {* incSysBlock: namepuffer,20*}
  51.  
  52.     {* NewProc=CountString[String][A0]*}
  53.     {* NewProc=Fillbuffer[][A0,d0,d1]*}
  54.     {* NewProc=MatchString[][A0,A1]*}
  55.     {* NewProc=getFilename[][]*}
  56.     {* NewProc=ASC2Zahl[][a5]*}
  57.  
  58.  
  59. recv[d0,d1,d2,d3]:
  60.     {* Stackframe Socket=d0,Zeiger=d1,Laenge=d2,time=d3,Readlen*}
  61.     While Time>0
  62.      {
  63.       Readlen=TCP_recv(Socket,Zeiger,Laenge,0)
  64.       If Readlen>0 breakwhile
  65.       Time==Time-25
  66.       Delay(25)
  67.      }
  68.     {* UnFrameReturn Readlen*}
  69.     
  70. CopyNextString[a0,a3]:
  71.         cmpi.l #0,laenge
  72.         beq .l13
  73.         cmpi.l #1,laenge
  74.         beq .l13
  75.         suba.l a2,a2
  76.         suba.l a1,a1
  77. .l1:    cmpi.b #`"`,(a0)
  78.         beq .l10
  79.         cmpi.b #` `,(a0)+
  80.         beq .l1
  81.         lea -1(a0),a1
  82. .l2:    cmpi.b #`"`,(a0)
  83.         beq .l11
  84.         cmpi.b #$0a,(a0)
  85.         beq .l12
  86.         cmpi.b #$00,(a0)
  87.         beq .l12
  88.         cmpi.b #` `,(a0)+
  89.         bne .l2
  90.         Lea -1(a0),a2
  91. .l3:    suba.l a1,a2
  92.         move.l A0,NextArg
  93.         Copymem(a1,a3,a2)
  94.         Move.l a2,d0
  95.         rts
  96. .l10:   lea 1(a0),a1
  97.         movea.l a1,a0
  98.         bra .l22
  99. .l11:   move.l a0,a2
  100.         bra .l3
  101. .l12:   move.l a0,a2
  102.         bra .l3
  103. .l13:   moveq.l #0,d0
  104.         RTS
  105. .l22:   cmpi.b #`"`,(a0)
  106.         beq .l11
  107.         cmpi.b #$0a,(a0)
  108.         beq .l12
  109.         cmpi.b #$00,(a0)
  110.         beq .l12
  111.         lea 1(a0),a0
  112.         bne .l22
  113.  
  114.     {* IncBlock: Hostname1,50*}
  115.     {* IncBlock: Hostname2,50*}
  116.     {* IncBlock: Port1asc,10*}
  117.     {* IncBlock: Port2asc,10*}
  118.     {* IncBlock: Message,100*}
  119.  
  120.  
  121. TCP_Write[d0,a0,d1,d2]:
  122.     {* StackFrame wr,Socket=d0,msg=a0,MsgLen=d1,flags=d2*}
  123.     While (Wr=TCP_Send(Socket,msg,msglen,flags))#msglen
  124.       {
  125.         Msg==Msg+Wr
  126.         Msglen==MsgLen-Wr
  127.       }
  128.     {* UnFrameReturn *}
  129.  
  130.  
  131. KPA[]:
  132.     TCP_Write(Socket1,"KPA",3,0)
  133.     TCP_Write(Socket2,"KPA",3,0)
  134.     {* Return *}
  135.  
  136. GetSigs[]:
  137.     Signals=SetSignal(0,0)
  138.     Signals==Signals&#$F000
  139.     {* Return Signals*}
  140.     
  141. {* String: Options="localhost localhost    "*}
  142.  
  143. Start:
  144.     OH=output()
  145.     MeineNummer1==#":"
  146.     MeineNummer2==#":"
  147. ;    Adresse==#Options
  148. ;    Laenge=Countstring(&Options)
  149.     If CopyNextString(Adresse,&Hostname1)=0 
  150.      {
  151.        Write(OH,"Kein Hostname angegeben\n",?)
  152.        {* Return 5*}
  153.      }
  154.     If CopyNextString(NextArg,&Hostname2)=0 
  155.      {
  156.        Write(OH,"Keinen 2.Hostnamen angegeben\n",?)
  157.        {* Return 5*}
  158.      }
  159. ;     If CopyNextString(NextArg,&Port1asc)#0 
  160. ;     {
  161. ;       CopynextString(NextArg,&Port2asc)
  162. ;     }
  163.     If (socket1=TCP_Socket(AF_INET,SOCK_STREAM,0))=-1
  164.      {
  165.       TCP_Errno()
  166.       TCP_vsyslog(7,"ATALK-Client V2 konnte Socket nicht öffnen :%m\n",0)
  167.       {* Return 10*}
  168.      }
  169.     If (socket2=TCP_Socket(AF_INET,SOCK_STREAM,0))=-1
  170.      {
  171.       TCP_Errno()
  172.       TCP_vsyslog(7,"ATALK-Client V2 konnte Socket nicht öffnen :%m\n",0)
  173.       TCP_CloseSocket(Socket1)
  174.       {* Return 10*}
  175.      }
  176.     If (he=TCP_gethostbyname(&Hostname1))=0
  177.      {
  178.       TCP_Errno()
  179.       TCP_vsyslog(7,"ATALK-Client V2 :%m\n",0)
  180.       TCP_CloseSocket(Socket1)
  181.       TCP_CloseSocket(Socket2)
  182.       {* Return 20*}
  183.      }
  184.     #AF_Inet=>sockaddr_in.sin_family
  185.     Zeiger=.lhostent.H_addr_list(he)
  186.     addr==(Zeiger)
  187.     addr==(Addr)
  188.     addr=>sockaddr_in.sin_addr
  189.     #518=>sockaddr_in.sin_port
  190.     If Port1asc#0
  191.      {
  192.       Port1=Asc2zahl(&Port1asc)
  193.       Port1=>sockaddr_in.sin_port
  194.      }
  195.     ret=TCP_Connect(Socket1,&Sockaddr_in,sizeof(sockaddr_in))
  196.     If ret=-1
  197.      {
  198.       TCP_Errno()
  199.       TCP_vsyslog(7,"ATALK-Client V2 kein Connect 1:%m\n",0)
  200.       TCP_CloseSocket(Socket1)
  201.       TCP_CloseSocket(Socket2)
  202.       {* Return 20*}
  203.      }
  204.     If (he=TCP_gethostbyname(&Hostname2))=0
  205.      {
  206.       TCP_Errno()
  207.       TCP_vsyslog(7,"ATALK-Client V2 :%m\n",0)
  208.       TCP_CloseSocket(Socket1)
  209.       TCP_CloseSocket(Socket2)
  210.       {* Return 20*}
  211.      }
  212.     
  213.     #AF_Inet=>sockaddr_in.sin_family
  214.     Zeiger=.lhostent.H_addr_list(he)
  215.     addr==(Zeiger)
  216.     addr==(Addr)
  217.     addr=>sockaddr_in.sin_addr
  218.     #518=>sockaddr_in.sin_port
  219.     If Port2asc#0
  220.      {
  221.       Port2=Asc2zahl(&Port2asc)
  222.       Port2=>sockaddr_in.sin_port
  223.      }
  224.     ret=TCP_Connect(Socket2,&Sockaddr_in,sizeof(sockaddr_in))
  225.     If ret=-1
  226.      {
  227.       TCP_Errno()
  228.       TCP_vsyslog(7,"ATALK-Client V2 kein Connect 2:%m\n",0)
  229.       TCP_CloseSocket(Socket1)
  230.       TCP_CloseSocket(Socket2)
  231.       {* Return 20*}
  232.      }
  233.     If TCP_IoCtlSocket(Socket1,FIONBIO,1)=-1
  234.      {
  235.       TCP_Errno()
  236.       TCP_vsyslog(5,"Atalk-Client V2 konnte nicht auf NON-BLOCKING schalten : %m\n",0)
  237.       TCP_Closesocket(Socket1)
  238.       TCP_Closesocket(Socket2)
  239.       {* Return 30*}
  240.      }
  241.     If TCP_IoCtlSocket(Socket2,FIONBIO,1)=-1
  242.      {
  243.       TCP_Errno()
  244.       TCP_vsyslog(5,"Atalk-Client V2 konnte nicht auf NON-BLOCKING schalten : %m\n",0)
  245.       TCP_Closesocket(Socket1)
  246.       TCP_Closesocket(Socket2)
  247.       {* Return 30*}
  248.      }
  249.     Fillbuffer(&Puffer,0,10)
  250. ;    KPA()
  251.     Readlen=recv(Socket1,&Puffer,9,500)
  252.     If readlen=-1 
  253.      {
  254.       TCP_Errno()
  255.       TCP_vsyslog(7,"ATALK-Client V2 - Server does not respond: %m\n",0)
  256.       TCP_CloseSocket(Socket1)
  257.       TCP_CloseSocket(Socket2)
  258.       {* Return 40*}
  259.      }  
  260.     If Matchstring(&Puffer,"AMIGATALK")#1
  261.      {
  262.       TCP_Errno()
  263.       TCP_vsyslog(7,"ATALK-Client V2 - falscher Servertype: %m\n",0)
  264.       TCP_CloseSocket(Socket1)
  265.       TCP_CloseSocket(Socket2)
  266.       {* Return 40*}
  267.      }      
  268. ;    KPA()
  269.     Readlen=recv(Socket2,&Puffer,9,500)
  270.     If readlen=-1 
  271.      {
  272.       TCP_Errno()
  273.       TCP_vsyslog(7,"ATALK-Client V2 - Server does not respond: %m\n",0)
  274.       TCP_CloseSocket(Socket1)
  275.       TCP_CloseSocket(Socket2)
  276.       {* Return 40*}
  277.      }  
  278.     If Matchstring(&Puffer,"AMIGATALK")#1
  279.      {
  280.       TCP_Errno()
  281.       TCP_vsyslog(7,"ATALK-Client V2 - falscher Servertype: %m\n",0)
  282.       TCP_CloseSocket(Socket1)
  283.       TCP_CloseSocket(Socket2)
  284.       {* Return 40*}
  285.      }      
  286. ;    KPA()
  287.     recv(Socket1,&MeineNummer1,3,500)
  288. ;    KPA()
  289.     recv(Socket2,&MeineNummer2,3,500)
  290.     TCP_Write(Socket1,"Netc",4,0)
  291.     TCP_Write(Socket2,"Netc",4,0)
  292.     Fillbuffer(&Puffer,0,1024)
  293.     While GetSigs()=0
  294.      {    
  295.        KPA()
  296.        If (Rl=Recv(Socket1,&Puffer,1024,50))>0
  297.         {
  298.           If Puffer#MeineNummer1
  299.             {
  300.               Message=="von "+Hostname1+" kommt:\n"
  301.               Bytes=Countstring(&Message)
  302.               TCP_Write(Socket2,&MeineNummer2,4,0)
  303.               TCP_Write(Socket2,&Message,Bytes,0)
  304.               TCP_Write(Socket2,&Puffer,rl,0)
  305.               Fillbuffer(&Puffer,0,1024)
  306.             }
  307.         }
  308.        If (Rl=Recv(Socket2,&Puffer,1024,50))>0
  309.         {
  310.           If Puffer#MeineNummer2
  311.             {
  312.               Message=="von "+Hostname2+" kommt:\n"
  313.               Bytes=Countstring(&Message)
  314.               TCP_Write(Socket1,&MeineNummer1,4,0)
  315.               TCP_Write(Socket1,&Message,Bytes,0)
  316.               TCP_Write(Socket1,&Puffer,rl,0)
  317.               Fillbuffer(&Puffer,0,1024)
  318.             }
  319.         }
  320.      }
  321.     TCP_CloseSocket(Socket1)
  322.     TCP_CloseSocket(Socket2)
  323.     TCP_vsyslog(7,"ATALK-Client V2 beendet sich.\n",0)
  324.     {* Return *}
  325.  
  326. CountString:
  327.         move.l a1,-(Sp)
  328.         move.l a0,a1
  329. .l1:    cmpi.b #$00,(a1)+
  330.         bne .l1
  331.         lea -1(a1),a1
  332.         sub.l a0,a1
  333.         move.l a1,d0
  334.         move.l (sp)+,a1
  335.         RTS
  336.  
  337.  
  338. FillBuffer:
  339.     subq.l #1,d1
  340. .l1:move.b d0,(a0)+
  341.     dbra  d1,.l1
  342.     RTS
  343.  
  344. Matchstring:
  345.     cmpi.b #0,(a0)
  346.     beq .error1
  347.     cmpi.b #0,(a1)
  348.     beq .error
  349.     move.b (a0)+,d0
  350.     move.b (a1)+,d1
  351.     bset #5,d0
  352.     bset #5,d1
  353.     cmp.b d0,d1
  354.     beq MatchString
  355.     bra.s .ende1
  356. .ok:moveq.l #1,d0
  357.     rts
  358. .error:
  359.     cmpi.b #0,(a0)
  360.     beq .ok
  361.     cmpi.b #$a,(a0)
  362.     beq .ok
  363.     bra.s .ende1
  364. .error1:
  365.     cmpi.b #0,(a1)
  366.     beq .ok
  367.     cmpi.b #$a,(a1)
  368.     beq .ok
  369. .ende1:
  370.     moveq.l #0,d0
  371.     RTS
  372.  
  373.  
  374. GetFilename:
  375.     {* IncBlock: Filename,256*}
  376.     {* IncVar: NextArg*}
  377.         cmpi.l #0,laenge
  378.         beq .l13
  379.         cmpi.l #1,laenge
  380.         beq .l13
  381.         suba.l a2,a2
  382.         suba.l a1,a1
  383.         Move.l Adresse,a0
  384. .l1:    cmpi.b #`"`,(a0)
  385.         beq .l10
  386.         cmpi.b #` `,(a0)+
  387.         beq .l1
  388.         lea -1(a0),a1
  389. .l2:    cmpi.b #`"`,(a0)
  390.         beq .l11
  391.         cmpi.b #$0a,(a0)
  392.         beq .l12
  393.         cmpi.b #$00,(a0)
  394.         beq .l12
  395.         cmpi.b #` `,(a0)+
  396.         bne .l2
  397.         Lea -1(a0),a2
  398. .l3:    suba.l a1,a2
  399.         move.l A0,NextArg
  400.         Copymem(a1,#Filename,a2)
  401.         Move.l a2,d0
  402.         rts
  403. .l10:   lea 1(a0),a1
  404.         movea.l a1,a0
  405.         bra .l22
  406. .l11:   move.l a0,a2
  407.         bra .l3
  408. .l12:   move.l a0,a2
  409.         bra .l3
  410. .l13:   moveq.l #0,d0
  411.         RTS
  412. .l22:   cmpi.b #`"`,(a0)
  413.         beq .l11
  414.         cmpi.b #$0a,(a0)
  415.         beq .l12
  416.         cmpi.b #$00,(a0)
  417.         beq .l12
  418.         lea 1(a0),a0
  419.         bne .l22
  420.  
  421.  
  422. CountString2[a0]:
  423.         move.l a1,-(Sp)
  424.         move.l a0,a1
  425. .l1:    cmpi.b #$0a,(a1)
  426.         beq .l2
  427.         cmpi.b #",",(a1)
  428.         beq .l2
  429.         cmpi.b #" ",(a1)
  430.         beq .l2
  431.         cmpi.b #$00,(a1)+
  432.         bne .l1
  433.         lea -1(a1),a1
  434. .l2:    sub.l a0,a1
  435.         move.l a1,d0
  436.         move.l (sp)+,a1
  437.         RTS
  438.  
  439. ASC2Zahl[a5]:
  440.     {* IncVar: Potenz*}
  441.     Countstring2(a5)
  442.     move.l d0,d7
  443.     subq.l #2,d7
  444.     move.l #1,d0
  445.     cmpi.w #$FFFF,d7
  446.     beq .la
  447. .l0:mulu.l #10,d0
  448.     dbra d7,.l0
  449. .la:move.l d0,d6
  450.     moveq.l #0,d1
  451.     move.l a5,a0
  452.     move.b #"+",d5
  453. .l1:moveq.l #0,d0
  454.     move.b (A0)+,d0
  455.     cmpi.b #"-",d0
  456.     bne .l2
  457.     move.b d0,d5
  458.     Divs.l #10,d6
  459.     bra .l1
  460. .l2:subi.b #$30,d0
  461.     andi.l #$FF,d0
  462.     Muls.l d6,d0
  463.     divs.l #10,d6
  464.     add.l d0,d1
  465.     cmpi.l #0,d6
  466.     bne .l1
  467.     lea 1(a0),a0
  468. ;    move.l a0,NextArg
  469.     move.l d1,d0
  470.     cmpi.b #"+",d5
  471.     beq .l3
  472.     neg.l d0
  473. .l3:RTS
  474.