From b6645f9eea7fb53e3312c08e30ffb049aaed9b05 Mon Sep 17 00:00:00 2001 From: jonnosan Date: Thu, 12 Feb 2009 09:58:16 +0000 Subject: [PATCH] git-svn-id: http://svn.code.sf.net/p/netboot65/code@41 93682198-c243-4bdb-bd91-e943c89aac3b --- server/lib/tndp.rb | 20 +++++++++++++++++++- server/lib/tndp_server.rb | 28 ++++++++++++++++++++++++++++ server/test/tc_test_server.rb | 17 +++++++++++++---- 3 files changed, 60 insertions(+), 5 deletions(-) diff --git a/server/lib/tndp.rb b/server/lib/tndp.rb index e149205..0d4809c 100644 --- a/server/lib/tndp.rb +++ b/server/lib/tndp.rb @@ -302,7 +302,7 @@ CATALOG OFFSET: $#{"%04x" % catalog_offset}" attr_reader :track_no,:sector_no,:sector_length,:volume_name OPCODE=0x02 def initialize(args={}) - args[:opcode]=OPCODE + args[:opcode]=OPCODE [:track_no,:sector_no,:sector_length,:volume_name].each do |arg| raise "#{arg} must be specified in a #{self.class}" if args[arg].nil? end @@ -359,6 +359,24 @@ SECTOR LENGTH: $#{"%04x" % sector_length}" end end + class SectorWriteRequestMessage < SectorReadResponseMessage + OPCODE=0x03 + def initialize(args={}) + super(args) + @opcode=OPCODE + end + end + + + class SectorWriteResponseMessage < SectorReadRequestMessage + OPCODE=0x83 + def initialize(args={}) + super(args) + @opcode=OPCODE + end + end + + class CreateVolumeRequestMessage < BaseMessage attr_reader :system_architecture,:volume_name,:track_count,:sector_length OPCODE=0x04 diff --git a/server/lib/tndp_server.rb b/server/lib/tndp_server.rb index d8b9544..72ee628 100644 --- a/server/lib/tndp_server.rb +++ b/server/lib/tndp_server.rb @@ -83,6 +83,34 @@ class TNDPServer end end end + when TNDP::SectorWriteRequestMessage::OPCODE + file_system_image=nil + begin + file_system_image_path="#{@root_directory}/#{request.volume_name}" + file_system_image=RipXplore.best_fit_from_filename(file_system_image_path) + rescue Exception=>e + response=TNDP::ErrorResponseMessage.create_error_response(data,TNDP::ErrorCodes::INVALID_VOLUME_NAME,e.to_s) + end + if !(file_system_image.nil?) then + track_no=request.track_no + sector_no=request.sector_no + sector_length=request.sector_length + sector_data=request.sector_data + 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 + existing_sector_data=file_system_image.get_sector(track_no,sector_no) + if existing_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 (existing_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 + file_system_image.set_sector(track_no,sector_no,sector_data) + file_system_image.save_as(file_system_image_path) + response=TNDP::SectorWriteResponseMessage.new({:track_no=>track_no,:sector_no=>sector_no,:sector_length=>sector_length,:volume_name=>request.volume_name}) + end + end + end when TNDP::CreateVolumeRequestMessage::OPCODE volume_file="#{@root_directory}/#{request.volume_name}" volume_creation_paramaters=VOLUME_CREATION_PARAMATERS[request.system_architecture] diff --git a/server/test/tc_test_server.rb b/server/test/tc_test_server.rb index ce5230b..3777b33 100644 --- a/server/test/tc_test_server.rb +++ b/server/test/tc_test_server.rb @@ -44,18 +44,27 @@ class TestServer image_name,:system_architecture=>system_architecture,:track_count=>track_count,:sector_length=>sector_length}) + create_volume_request_msg=TNDP::CreateVolumeRequestMessage.new({:volume_name=>volume_name,:system_architecture=>system_architecture,:track_count=>track_count,:sector_length=>sector_length}) create_volume_response_msg=send_request_and_get_response(create_volume_request_msg) - assert_equal(TNDP::CreateVolumeResponseMessage::OPCODE,create_volume_response_msg.opcode,"init volume request message should have correct opcode") + assert_equal(TNDP::CreateVolumeResponseMessage::OPCODE,create_volume_response_msg.opcode,"init volume response message should have correct opcode") assert_equal(system_architecture,create_volume_response_msg.system_architecture) assert(File.exist?(image_full_path),"file just created should exist at #{image_full_path}") + sector_data=([system_architecture.to_s,volume_name,track_count,sector_length].pack("Z12Z30CC")*200)[0,sector_length] + track_no=track_count-1 + sector_no=1 + sector_write_request_msg=TNDP::SectorWriteRequestMessage.new({:track_no=>track_no,:sector_no=>sector_no,:sector_length=>sector_length,:volume_name=>volume_name,:sector_data=>sector_data}) + sector_write_response_msg=send_request_and_get_response(sector_write_request_msg) + assert_equal(TNDP::SectorWriteResponseMessage::OPCODE,sector_write_response_msg.opcode,"sector write response message should have correct opcode") + file_system_image=RipXplore.best_fit_from_filename(image_full_path) assert_equal(track_count,file_system_image.track_count,"file just created should have correct number of tracks") + assert_equal(sector_data,file_system_image.get_sector(track_no,sector_no),"file just created should have sector data set correctly") + end raise "done" #test every combination of host and file system