From 06f15c715e9855bf34ec6398ad0957616f52a514 Mon Sep 17 00:00:00 2001 From: jonnosan Date: Sat, 24 Jan 2009 12:25:55 +0000 Subject: [PATCH] git-svn-id: http://svn.code.sf.net/p/netboot65/code@22 93682198-c243-4bdb-bd91-e943c89aac3b --- server/lib/tndp.rb | 17 ++++++++--------- server/lib/tndp_server.rb | 11 ++++++++++- server/test/tc_test_server.rb | 4 +++- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/server/lib/tndp.rb b/server/lib/tndp.rb index d783339..efe6f0f 100644 --- a/server/lib/tndp.rb +++ b/server/lib/tndp.rb @@ -33,7 +33,7 @@ module TNDP } MAX_CATALOG_ENTRIES_PER_MESSAGE=8 - MAX_VOLUME_NAME_LENGTH=57 + MAX_VOLUME_NAME_LENGTH=127 SYSTEM_ARCHITECTURES={ :any=>0x00, :c64=>0x64, @@ -154,10 +154,6 @@ OPCODE: $#{"%02X"%opcode} [#{OPCODES[opcode].nil? ? "UNKNOWN" : OPCODES[ TNDP.hex_dump(raw_bytes) end def initialize(args={}) - # puts "args:" - # args.keys.each do |key| - # puts "#{key}: #{args[key]}\n" - # end @signature=TNDP.coalesce(args[:signature],MESSAGE_SIGNATURE) @version_id=TNDP.coalesce(args[:version_id],0x01) @transaction_id=TNDP.coalesce(args[:transaction_id],TNDP.next_transaction_id) @@ -337,22 +333,25 @@ SECTOR LENGTH: $#{"%04x" % sector_length}" end class SectorReadResponseMessage < SectorReadRequestMessage + OPCODE=0x82 attr_reader :sector_data def initialize(args={}) raise "sector_data must be specified in a #{self.class}" if args[:sector_data].nil? - @sector_data=args[:sector_data] + @sector_data=args[:sector_data] super(args) + @opcode=OPCODE + raise "length of sector_data #{@sector_data.length} must match specified sector_length #{@sector_length}" unless @sector_data.length==@sector_length end def to_s super+"\nSECTOR DATA:\n"+TNDP.hex_dump(sector_data) end def to_buffer - super+sector_data.pack("C#{sector_length}") + super+[sector_data].pack("A#{sector_length}") end - def from_buffer - signature,version_id,transaction_id,opcode,track_no,sector_no,sector_length,volume_name,sector_data=buffer.unpack("Z4CnCnnnZ#{TNDP::MAX_VOLUME_NAME_LENGTH+1}C*") + def self.from_buffer(buffer) + signature,version_id,transaction_id,opcode,track_no,sector_no,sector_length,volume_name,sector_data=buffer.unpack("Z4CnCnnnZ#{TNDP::MAX_VOLUME_NAME_LENGTH+1}a*") self.new({:signature=>signature,:version=>version_id,:transaction_id=>transaction_id, :opcode=>opcode,:track_no=>track_no,:sector_no=>sector_no,:sector_length=>sector_length,:volume_name=>volume_name,:sector_data=>sector_data}) end diff --git a/server/lib/tndp_server.rb b/server/lib/tndp_server.rb index b1e99c8..1884e76 100644 --- a/server/lib/tndp_server.rb +++ b/server/lib/tndp_server.rb @@ -68,6 +68,15 @@ class TNDPServer sector_length=request.sector_length if (track_nofile_system_image.end_track) then response=TNDP::ErrorResponseMessage.create_error_response(data,TNDP::ErrorCodes::INVALID_TRACK_NUMBER,"requested track $#{"%X"% track_no} outside allowable range of $#{"%X"% file_system_image.start_track}..$#{"%X"% file_system_image.end_track}") + else + sector_data=file_system_image.get_sector(track_no,sector_no) + if sector_data.nil? then + response=TNDP::ErrorResponseMessage.create_error_response(data,TNDP::ErrorCodes::INVALID_SECTOR_NUMBER,"requested sector $#{"%X"% sector_no} not found in track $#{"%X"% track_no}") + elsif (sector_data.length)!=sector_length then + response=TNDP::ErrorResponseMessage.create_error_response(data,TNDP::ErrorCodes::INVALID_SECTOR_LENGTH,"requested track $#{"%X"% track_no}/sector $#{"%X"% sector_no} is of length $#{"%X"% sector_data.length}, not $#{"%X"% sector_length}") + else + response=TNDP::SectorReadResponseMessage.new({:track_no=>track_no,:sector_no=>sector_no,:sector_length=>sector_length,:volume_name=>request.volume_name,:sector_data=>sector_data}) + end end end else @@ -75,7 +84,7 @@ class TNDPServer end response.transaction_id=request.transaction_id rescue Exception=>e - response=TNDP::ErrorResponseMessage.create_error_response(data,TNDP::ErrorCodes::INTERNAL_SERVER_ERROR,e.to_s) + response=TNDP::ErrorResponseMessage.create_error_response(data,TNDP::ErrorCodes::INTERNAL_SERVER_ERROR,e.to_s+e.backtrace[0]) end log_msg("Response:") log_msg(response.to_s) diff --git a/server/test/tc_test_server.rb b/server/test/tc_test_server.rb index 66a2057..19a4c73 100644 --- a/server/test/tc_test_server.rb +++ b/server/test/tc_test_server.rb @@ -63,11 +63,13 @@ class TestServer track_no,:sector_no=>sector_no,:sector_length=>0xD00D,:volume_name=>volume_name})).errorcode,"invalid sector length should return error") file_system_image=RipXplore.best_fit_from_filename("#{TEST_IMAGES_DIR}/#{volume_name}") + assert_equal(sector_length,file_system_image.get_sector(track_no,sector_no).length,"sector as read from disk should be of correct length") sector_read_request_msg=TNDP::SectorReadRequestMessage.new({:track_no=>track_no,:sector_no=>sector_no,:sector_length=>sector_length,:volume_name=>volume_name}) sector_read_response_msg=send_request_and_get_response(sector_read_request_msg) assert(sector_read_response_msg.respond_to?(:sector_data),"sector read response message should include sector data") - assert(file_system_image.get_sector(track_no,sector_no)==sector_read_response_msg.sector_data,"data returned from server should match data read directly from disk") + assert_equal(sector_length,sector_read_response_msg.sector_data.length,"sector read response message should include full length sector") + assert_equal(TNDP.hex_dump(file_system_image.get_sector(track_no,sector_no)),TNDP.hex_dump(sector_read_response_msg.sector_data),"data returned from server should match data read directly from disk") end catalog_offset+=volume_catalog_response_msg.catalog_entries.length done=(catalog_offset>volume_catalog_response_msg.total_catalog_size-1)