Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. server_parser:
  2.  
  3. ; Commands are always 3 numbers and followed by a space
  4. ; If a server decides it needs multiline output,
  5. ; first lines will have a dash instead of space after numbers,
  6. ; thus they are simply ignored.
  7.  
  8.         cmp     dword[s], "150 "
  9.         je      data_ok
  10.  
  11.         cmp     dword[s], "220 "
  12.         je      welcome
  13.  
  14.         cmp     dword[s], "227 "
  15.         je      pasv_ok
  16.  
  17.         cmp     dword[s], "230 "
  18.         je      login_ok
  19.  
  20.         cmp     dword[s], "331 "
  21.         je      pass
  22.  
  23.         ret
  24.  
  25.  
  26. welcome:
  27.  
  28.         mov     [status], STATUS_CONNECTED
  29.         ret
  30.  
  31.  
  32. pass:
  33.  
  34.         mov     [status], STATUS_NEEDPASSWORD
  35.         ret
  36.  
  37.  
  38. login_ok:
  39.  
  40.         mov     [status], STATUS_LOGGED_IN
  41.         ret
  42.  
  43.  
  44. pasv_ok:
  45.  
  46.         sub     ecx, 5
  47.         jb      .fail
  48.         mov     al, "("
  49.         mov     edi, s + 5
  50.         repne   scasb
  51.  
  52.         mcall   socket, AF_INET4, SOCK_STREAM, 0
  53.         cmp     eax, -1
  54.         je      fail
  55.         mov     [datasocket], eax
  56.  
  57.         mov     esi, edi
  58.         call    ascii_dec
  59.         mov     byte[sockaddr2.ip+0], bl
  60.         call    ascii_dec
  61.         mov     byte[sockaddr2.ip+1], bl
  62.         call    ascii_dec
  63.         mov     byte[sockaddr2.ip+2], bl
  64.         call    ascii_dec
  65.         mov     byte[sockaddr2.ip+3], bl
  66.  
  67.         call    ascii_dec
  68.         mov     byte[sockaddr2.port+1], bl
  69.         call    ascii_dec
  70.         mov     byte[sockaddr2.port+0], bl
  71.  
  72.         push    str_open
  73.         call    [con_write_asciiz]
  74.  
  75.         mcall   connect, [datasocket], sockaddr2, 18
  76.  
  77.   .fail:
  78.         ret
  79.  
  80.  
  81. data_ok:
  82.  
  83.         mcall   recv, [datasocket], buffer_ptr, BUFFERSIZE, 0   ; fixme: use other buffer
  84.         inc     eax
  85.         jz      .fail
  86.         dec     eax
  87.         jz      .fail
  88.  
  89.         mov     byte[buffer_ptr + eax], 0
  90.         pushd   buffer_ptr
  91.         call    [con_write_asciiz]
  92.  
  93.   .fail:
  94.         ret
  95.  
  96.  
  97. ascii_dec:
  98.  
  99.         xor     ebx, ebx
  100.         mov     cl, 3
  101.   .loop:
  102.         lodsb
  103.         sub     al, '0'
  104.         jb      .done
  105.         cmp     al, 9
  106.         ja      .done
  107.         lea     ebx, [ebx*4+ebx]
  108.         shl     ebx, 1
  109.         add     bl, al
  110.         dec     cl
  111.         jnz     .loop
  112.  
  113.   .done:
  114.         ret