Subversion Repositories Kolibri OS

Rev

Rev 6394 | Rev 6582 | Go to most recent revision | Blame | Compare with Previous | 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 in this simple command parser.
  7.  
  8.         cmp     dword[buf_cmd], "150 "
  9.         je      data_loop
  10.  
  11.         cmp     dword[buf_cmd], "220 "
  12.         je      welcome
  13.  
  14. ;        cmp     dword[buf_cmd], "226 "
  15. ;        je      transfer_ok
  16.  
  17.         cmp     dword[buf_cmd], "227 "
  18.         je      pasv_ok
  19.  
  20.         cmp     dword[buf_cmd], "230 "
  21.         je      login_ok
  22.  
  23. ;        cmp     dword[buf_cmd], "250"
  24. ;        je      op_ok
  25.  
  26.         cmp     dword[buf_cmd], "331 "
  27.         je      pass
  28.  
  29. ;        cmp     dword[buf_cmd], "421 "
  30. ;        je      timeout
  31.  
  32.         cmp     dword[buf_cmd], "503 "         ; login first
  33.         je      welcome
  34.  
  35.         cmp     dword[buf_cmd], "530 "         ; password incorrect
  36.         mov     [use_params], 0
  37.         je      welcome
  38.  
  39.         cmp     dword[buf_cmd], "550 "
  40.         je      close_datacon
  41.  
  42.         cmp     byte[buf_cmd+3], "-"
  43.         je      wait_for_servercommand
  44.         jmp     wait_for_usercommand
  45.  
  46.  
  47. welcome:
  48.  
  49.         mov     [status], STATUS_CONNECTED
  50.         jmp     wait_for_usercommand
  51.  
  52.  
  53. pass:
  54.  
  55.         mov     [status], STATUS_NEEDPASSWORD
  56.         jmp     wait_for_usercommand
  57.  
  58.  
  59. login_ok:
  60.  
  61.         mov     [status], STATUS_LOGGED_IN
  62.         cmp     [use_params], 0
  63.         je      wait_for_usercommand
  64.  
  65.         cmp     [param_path+4], 0
  66.         je      wait_for_usercommand
  67.         ; copy path to buf_cmd and execute CWD
  68.         mov     edi, buf_cmd
  69.         mov     esi, param_path
  70.   @@:
  71.         lodsb
  72.         stosb
  73.         cmp     byte[esi-1], 0
  74.         jne     @b
  75.         jmp     cmd_cwd
  76.  
  77. pasv_ok:
  78.  
  79.         sub     ecx, 4
  80.         jb      .fail
  81.         mov     al, "("
  82.         mov     edi, buf_cmd + 4
  83.         repne   scasb
  84.  
  85.         mcall   socket, AF_INET4, SOCK_STREAM, 0
  86.         cmp     eax, -1
  87.         jne     @f
  88.         mov     eax, str_err_socket
  89.         jmp     error
  90.     @@: mov     [datasocket], eax
  91.  
  92.         mov     esi, edi
  93.         call    ascii_dec
  94.         mov     byte[sockaddr2.ip+0], bl
  95.         call    ascii_dec
  96.         mov     byte[sockaddr2.ip+1], bl
  97.         call    ascii_dec
  98.         mov     byte[sockaddr2.ip+2], bl
  99.         call    ascii_dec
  100.         mov     byte[sockaddr2.ip+3], bl
  101.  
  102.         call    ascii_dec
  103.         mov     byte[sockaddr2.port+0], bl
  104.         call    ascii_dec
  105.         mov     byte[sockaddr2.port+1], bl
  106.  
  107.         invoke  con_write_asciiz, str_open
  108.         mcall   connect, [datasocket], sockaddr2, 18
  109.         cmp     eax, -1
  110.         jne     @f
  111.         mov     eax, str_err_connect
  112.         jmp     error
  113.     @@: jmp     wait_for_servercommand
  114.  
  115.   .fail:
  116.         invoke  con_write_asciiz, str_unknown
  117.         jmp     wait_for_servercommand
  118.  
  119.  
  120. data_loop:
  121.  
  122.         invoke  con_write_asciiz, str_dot
  123.  
  124.         cmp     [operation], OPERATION_STOR
  125.         je      .stor
  126.  
  127. ; we are receiving data
  128.         mcall   recv, [datasocket], buf_buffer2, BUFFERSIZE, 0
  129.         test    ebx, ebx
  130.         jnz     .done
  131.         mov     byte[buf_buffer2 + eax], 0
  132.  
  133.         cmp     [operation], OPERATION_RETR
  134.         je      .retr
  135.  
  136.         cmp     [operation], OPERATION_RDIR
  137.         je      .rdir
  138.        
  139. ; not retreiving, just print to console
  140.         invoke  con_write_asciiz, buf_buffer2
  141.         jmp     data_loop
  142.  
  143. ; retreiving, save to file
  144.   .retr:
  145.         mov     [filestruct.ptr], buf_buffer2
  146.         mov     [filestruct.size], eax
  147.         push    eax
  148.         mcall   70, filestruct
  149.         pop     eax
  150.         add     [filestruct.offset], eax
  151.         jmp     data_loop
  152.  
  153. ; storing, send all data
  154.   .stor:
  155.         mcall   70, filestruct
  156.         cmp     eax, 6          ; end of file
  157.         je      .last_call
  158.         test    eax, eax        ; error
  159. ;        jne     .fileerror
  160.         add     [filestruct.offset], ebx
  161.         mov     esi, ebx
  162.         mcall   send, [datasocket], buf_buffer2, , 0
  163.         jmp     .stor
  164.  
  165.   .last_call:
  166.         mov     esi, ebx
  167.         mcall   send, [datasocket], buf_buffer2, , 0
  168.  
  169.   .done:
  170.         invoke  con_write_asciiz, str_close
  171.         mcall   close, [datasocket]
  172.         mov     [operation], OPERATION_NONE
  173.         jmp     wait_for_servercommand
  174.  
  175.   .rdir:
  176.         ; alloc/realloc memory block to store filenames
  177.         mov     ecx, eax                        ; eax is size of buffer received
  178.         inc     ecx
  179.         add     ecx, [size_fname]               ; added old size to form new required size
  180.         mcall   68, 20, , [ptr_fname]           ; realloc
  181.         test    eax, eax
  182.         je      error_heap
  183.         mov     [ptr_fname], eax                ; eax contains the new block now
  184.         mov     [ptr_queue], eax
  185.  
  186.         ; copy filenames into fname buffer
  187.         mov     esi, buf_buffer2
  188.         mov     edi, eax
  189.         add     edi, [size_fname]
  190.   .copy_buf:
  191.         lodsb
  192.         cmp     al, 13                          ; ignore any carriage return character
  193.         je      .copy_buf
  194.         stosb
  195.         cmp     al, 10                          ; linefeed marks end of filename
  196.         je      @f
  197.         inc     [queued]
  198.   @@:
  199.         test    al, al                          ; 0 marks end of buffer
  200.         jne     .copy_buf
  201.  
  202.         ; All received filenames have been copied, calculate new size of fname buffer
  203.         dec     edi                             ; dont count the trailing 0 byte
  204.         sub     edi, [ptr_fname]
  205.         mov     [size_fname], edi      
  206.         jmp     data_loop
  207.  
  208.  
  209. close_datacon:
  210.         cmp     [operation], OPERATION_NONE
  211.         je      wait_for_usercommand
  212.         invoke  con_write_asciiz, str_close
  213.         mcall   close, [datasocket]
  214.         jmp     wait_for_usercommand
  215.  
  216.  
  217. ascii_dec:
  218.  
  219.         xor     ebx, ebx
  220.         mov     cl, 4                   ; max length is 3 digits + 1 separator
  221.   .loop:
  222.         lodsb
  223.         sub     al, '0'
  224.         jb      .done
  225.         cmp     al, 9
  226.         ja      .done
  227.         lea     ebx, [ebx*4+ebx]        ; ebx *5
  228.         shl     ebx, 1                  ; ebx *2
  229.         add     bl, al
  230.         dec     cl
  231.         jnz     .loop
  232.  
  233.   .done:
  234.         ret