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

  1.     title    simple file server
  2.     include    asm.inc
  3.     include    netbios.inc
  4.  
  5.     public    main
  6.  
  7.     .stack
  8.  
  9.     .const
  10. ertx_add_name        db  'Add Name error',0
  11. ertx_driver        db  'No NetBIOS driver',0
  12. ertx_send        db  'SEND error',0
  13. ertx_listen        db  'LISTEN error',0
  14. ertx_receive        db  'RECEIVE error',0
  15. ertx_read_only        db  'Server only supports read requests',0
  16. ertx_file_not_found    db  'File not found',0
  17. ertx_read        db  'File read error',0
  18.  
  19. exiting_text        db  'Exiting',0
  20. low_iq_server_text    db  'Low IQ Server',0
  21. logo_text        db  'Simple NetBIOS File Server',13,10
  22.             db  'Press ESC to exit',0
  23.  
  24.     .data?
  25.  
  26. listen_ncb    ncb <>
  27.  
  28. ;
  29. ; the order of these four objects is important
  30. ;
  31. position_req    dd  ?            ; file position requested for transfer
  32. length_req    dd  ?            ; length of transfer request
  33. direction_flag    db  ?            ; 'r' for receive, 's' for send
  34. filename_req    db FILENAME_MAX dup(?)    ; requested file and path
  35.         db  ?            ; (ensure path is asciiz)
  36.  
  37. add_name    db  ?
  38. session_number    db  ?
  39.  
  40. file_buffer    db  512 dup(?)
  41.  
  42.  
  43.     .code
  44.     extn  startup,netbios_check,netbios_add_name,clear_ncb,strcpy
  45.     extn  netbios_receive_wait,get_input_state,puts,netbios_hang_up
  46.     extn  exit_program,netbios_delete_name,netbios_cancel,close_file
  47.     extn  netbios_send_wait,read_from_file,select_min_count,netbios_call
  48.     extn  move_file_pointer,open_input_file
  49.  
  50. ;;    main
  51. ;
  52. main    proc
  53.     assume    ds:DGROUP        ; (test program is small model)
  54.  
  55.     lea    si,logo_text
  56.     call    puts
  57.  
  58.     call    netbios_check
  59.     jc    mai3            ;  if no netbios driver
  60.  
  61.     lea    si,low_iq_server_text    ; *Low IQ Server*
  62.     call    netbios_add_name
  63.     jc    mai5            ;  if add name failed
  64.     mov    add_name,al
  65.  
  66. mai1:    lea    si,listen_ncb        ; build listen control block
  67.     call    clear_ncb
  68.  
  69.     mov    Ncb_Command[si],NB_LISTEN
  70.     mov    Ncb_CallName[si],'*'    ;  (accept CALLs from anyone)
  71.  
  72.     lea    si,low_iq_server_text    ;  enter server name
  73.     lea    di,listen_ncb.Ncb_Name
  74.     call    strcpy
  75.  
  76.     lea    si,listen_ncb
  77.     mov    Ncb_Rto[si],-1 ;4*2    ;  receive  timeout is 4 seconds
  78.     mov    Ncb_Sto[si],-1 ;30*2    ;  transmit timeout is 30 seconds
  79.  
  80.     call    netbios_call        ; begin listening for client
  81.     jc    mai6            ;  if error posting listen command
  82.  
  83. mai2:    call    get_input_state
  84.     jnz    mai7            ;  if keyboard exit request
  85.     mov    al,Ncb_Cmd_Cplt[si]
  86.     cmp    al,0FFh
  87.     je    mai2            ;  if listen still pending
  88.     cmp    al,0
  89.     jne    mai6            ;  if listen failed
  90.  
  91.     mov    al,Ncb_Lsn[si]        ; save session number
  92.     mov    session_number,al
  93.  
  94.     lea    di,position_req        ; get transfer request from client
  95.     mov    cx,size position_req+size length_req+1+size filename_req
  96.     call    netbios_receive_wait    ;  (AL is session)
  97.     jc    mai10            ;  if unexpected error
  98.  
  99.     cmp    direction_flag,'r'    ; check request code
  100.     jne    mai12            ;  if not read file
  101.  
  102.     call    process_read_request    ;  else transfer file to client
  103.     jnc    mai1            ;  if no errors, continue
  104.  
  105. mai3:    lea    si,ertx_driver        ; *No NetBIOS driver*
  106. mai4:    call    puts
  107.     jmp    exit_program
  108.  
  109. mai5:    lea    si,ertx_add_name    ; *ADD NAME error*
  110.     jmp    mai4
  111.  
  112. mai6:    lea    si,ertx_listen        ; *LISTEN error*
  113.     jmp    mai8
  114.  
  115. mai7:    lea    si,listen_ncb
  116.     call    netbios_cancel
  117.     lea    si,exiting_text        ; *Exiting*
  118.  
  119. mai8:    call    puts
  120. mai9:    lea    si,low_iq_server_text
  121.     call    netbios_delete_name
  122.     jmp    exit_program
  123.  
  124. mai10:    lea    si,ertx_receive        ; *RECEIVE error*
  125. mai11:    call    puts
  126.     mov    al,session_number
  127.     call    netbios_hang_up
  128.     jmp    mai9
  129.  
  130. mai12:    lea    si,ertx_read_only    ; *Server only supports read requests*
  131.     jmp    mai11
  132. main    endp
  133.  
  134.  
  135. ;;    process read request
  136. ;
  137. ;    entry    DS    DGROUP
  138. ;    uses    AX,BX,CX,DX,SI,DI
  139. ;
  140. process_read_request proc
  141.     assume    ds:DGROUP        ; (test program is small model)
  142.  
  143.     lea    si,filename_req        ; open requested file
  144.     call    open_input_file
  145.     jc    prr2            ;  if file not found
  146.  
  147.     mov    ax,wptr position_req    ; set file position
  148.     mov    dx,wptr position_req+2
  149.     call    move_file_pointer
  150.  
  151. prr1:    mov    cx,size file_buffer    ; choose transfer size
  152.     mov    ax,wptr length_req
  153.     mov    dx,wptr length_req+2
  154.     call    select_min_count
  155.     jcxz    prr5            ;  if length limit reached
  156.  
  157.     lea    di,file_buffer        ; read file data
  158.     call    read_from_file
  159.     jc    prr3            ;  if file read error
  160.     mov    cx,ax
  161.     jcxz    prr5            ;  if end of file
  162.  
  163.     sub    wptr length_req,cx    ; update transfer limit
  164.     sbb    wptr length_req+2,ZER0
  165.  
  166.     mov    al,session_number    ; send file data to client
  167.     call    netbios_send_wait    ;  (ES:DI->file_buffer)
  168.     jnc    prr1            ;  if OK, continue transfer
  169.  
  170.     lea    si,ertx_send        ; *SEND error*
  171.     jmp    prr4
  172.  
  173. prr2:    lea    si,ertx_file_not_found    ; *File not found*
  174.     jmp    prr4
  175.  
  176. prr3:    lea    si,ertx_read        ; *File read error*
  177. prr4:    call    puts
  178.     stc
  179.     ret
  180.  
  181. prr5:    call    close_file        ; close file and hang up session at
  182.     mov    al,session_number    ;   end of file or when requested
  183.     call    netbios_hang_up        ;   transfer count
  184.     ret
  185. process_read_request endp
  186.  
  187.     end
  188.