home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / progjour / 1991 / 04 / client.asm < prev    next >
Assembly Source File  |  1991-04-19  |  4KB  |  160 lines

  1.     title    simple file transfer client
  2.     include    asm.inc
  3.     include    netbios.inc
  4.  
  5.     public    main
  6.  
  7.     .stack
  8.  
  9.     .const
  10. ertx_no_server        db  'CALL failed.  Probably no server.',0
  11. ertx_driver        db  'No NetBIOS driver',0
  12. ertx_send        db  'SEND failed',0
  13. ertx_receive        db  'RECEIVE failed',0
  14. ertx_disk_full        db  'Disk full',0
  15. ertx_cannot_open    db  'Cannot open output file',0
  16.  
  17. calling_text        db  'Calling server',0
  18. low_iq_client_text    db  'Low IQ Client',0
  19. low_iq_server_text    db  'Low IQ Server',0
  20.  
  21. help_text  db  'client <source> <destination>',13,10
  22.        db  'copies <source> file from file server to <destination>.',13,10
  23.        db  'e.g. client \test\remote.txt local.txt',0
  24.  
  25.  
  26.     .data?
  27.     extrn    argc:word,argv:dword
  28.  
  29. call_ncb    ncb <>
  30.  
  31. ;
  32. ; the order of these four objects is important
  33. ;
  34. position_req    dd  ?            ; file position requested for transfer
  35. length_req    dd  ?            ; length of transfer request
  36. direction_flag    db  ?            ; 'r' for receive, 's' for send
  37. filename_req    db FILENAME_MAX dup(?)    ; requested file and path
  38.         db  ?            ; (ensure path is asciiz)
  39.  
  40. session_number    db  ?
  41.  
  42. file_buffer    db  512 dup(?)
  43.  
  44.  
  45.     .code
  46.     extn  exit_program,netbios_check,puts,clear_ncb,strcpy,netbios_call
  47.     extn  strncpy,netbios_send_wait,open_output_file,netbios_receive_wait
  48.     extn  write_to_file,close_file,netbios_add_name,netbios_delete_name
  49.  
  50.  
  51. ;;    help
  52. ;
  53. help    proc
  54.     lea    si,help_text
  55.     call    puts
  56.     jmp    exit_program
  57. help    endp
  58.  
  59.  
  60. ;;    main
  61. ;
  62. main    proc
  63.     assume    ds:DGROUP        ; (test program is small model)
  64.  
  65.     cmp    argc,3
  66.     jb    help            ;  if not enough arguments
  67.  
  68.     call    netbios_check
  69.     jnc    mai1
  70.     jmp    mai4            ;  if no netbios driver
  71.  
  72. mai1:    lea    si,low_iq_client_text    ; register name with netbios driver
  73.     call    netbios_add_name
  74.  
  75.     lea    si,calling_text        ; *Calling server*
  76.     call    puts
  77.  
  78.     lea    si,call_ncb        ; build CALL control block
  79.     call    clear_ncb
  80.  
  81.     lea    si,low_iq_server_text    ;  set client and server names
  82.     lea    di,call_ncb.Ncb_CallName
  83.     call    strcpy
  84.     lea    si,low_iq_client_text
  85.     lea    di,call_ncb.Ncb_Name
  86.     call    strcpy
  87.  
  88.     lea    si,call_ncb
  89.     mov    Ncb_Rto[si],-1 ;10*2    ;  receive  timeout is 10 seconds
  90.     mov    Ncb_Sto[si],-1 ;5*2    ;  transmit timeout is  5 seconds
  91.  
  92.     mov    Ncb_Command[si],NB_CALL_WAIT
  93.     call    netbios_call
  94.     jc    mai5            ;  if no server (probably)
  95.  
  96.     mov    al,Ncb_Lsn[si]
  97.     mov    session_number,al
  98.  
  99.     mov    ax,-1            ; request entire file
  100.     mov    wptr length_req,ax
  101.     mov    wptr length_req+2,ax
  102.  
  103.     mov    direction_flag,'r'    ; r is a read request to server
  104.  
  105.     lds    si,argv[bp]        ; process server file name
  106.     mov    si,[si+2]
  107.     lea    di,filename_req
  108.     mov    cx,size filename_req
  109.     call    strncpy
  110.     mov    ax,@data
  111.     mov    ds,ax
  112.  
  113.     lea    cx,[di+1]        ; send request packet with file
  114.     lea    di,position_req        ;  position, maximum length, direction
  115.     sub    cx,di            ;  and filename
  116.     mov    al,session_number[bp]
  117.     call    netbios_send_wait
  118.     jc    mai6            ;  if SEND failed
  119.  
  120.     lds    si,argv[bp]        ; open output file
  121.     mov    si,[si+4]
  122.     call    open_output_file
  123.     jc    mai7            ;  if open failed
  124.     mov    ax,@data
  125.     mov    ds,ax
  126.  
  127. mai2:    mov    al,session_number    ; receive data from file server
  128.     mov    cx,size file_buffer
  129.     lea    di,file_buffer
  130.     call    netbios_receive_wait
  131.     jc    mai8            ;  if error
  132.     jcxz    mai3            ;  if end of file (hang up)
  133.  
  134.     call    write_to_file
  135.     jnc    mai2            ;  if write OK
  136.  
  137.     lea    si,ertx_disk_full    ; *Disk full*
  138.     call    puts
  139.  
  140. mai3:    call    close_file
  141.     jmp    mai10
  142.  
  143. mai4:    lea    si,ertx_driver        ; *No NetBIOS driver*
  144.     call    puts
  145.     jmp    exit_program
  146. mai5:    lea    si,ertx_no_server    ; *CALL failed.  Probably no server*
  147.     jmp    mai9
  148. mai6:    lea    si,ertx_send        ; *SEND failed*
  149.     jmp    mai9
  150. mai7:    lea    si,ertx_cannot_open    ; *Cannot open output file*
  151.     jmp    mai9
  152. mai8:    lea    si,ertx_receive        ; *RECEIVE failed*
  153. mai9:    call    puts
  154. mai10:    lea    si,low_iq_client_text    ; delete client's name
  155.     call    netbios_delete_name
  156.     jmp    exit_program
  157. main    endp
  158.  
  159.     end
  160.