docs: def handle(self, pkt, raddress, rport):
          "Handle an initial RRQ packet as a server."
          log.debug("In TftpStateServerRecvRRQ.handle")
          sendoack = self.serverInitial(pkt, raddress, rport)
          path = self.full_path
          log.info("Opening file %s for reading" % path)
          if os.path.exists(path):
              # Note: Open in binary mode for win32 portability, since win32
              # blows.
              self.context.fileobj = open(path, "rb")
          elif self.context.dyn_file_func:
              log.debug("No such file %s but using dyn_file_func", path)
              self.context.fileobj = \
                  self.context.dyn_file_func(self.context.file_to_transfer, raddress=raddress, rport=rport)
  
              if self.context.fileobj is None:
                  log.debug("dyn_file_func returned 'None', treating as "
                            "FileNotFound")
                  self.sendError(TftpErrors.FileNotFound)
                  raise TftpException("File not found: %s" % path)
          else:
              log.warn("File not found: %s", path)
              self.sendError(TftpErrors.FileNotFound)
              raise TftpException("File not found: {}".format(path))
  
          # Options negotiation.
          if sendoack and 'tsize' in self.context.options:
              # getting the file size for the tsize option. As we handle
              # file-like objects and not only real files, we use this seeking
              # method instead of asking the OS
              self.context.fileobj.seek(0, os.SEEK_END)
              tsize = str(self.context.fileobj.tell())
              self.context.fileobj.seek(0, 0)
              self.context.options['tsize'] = tsize
  
          if sendoack:
              # Note, next_block is 0 here since that's the proper
              # acknowledgement to an OACK.
              # FIXME: perhaps we do need a TftpStateExpectOACK class...
              self.sendOACK()
              # Note, self.context.next_block is already 0.
          else:
              self.context.next_block = 1
              log.debug("No requested options, starting send...")
              self.context.pending_complete = self.sendDAT()
          # Note, we expect an ack regardless of whether we sent a DAT or an
          # OACK.
          return TftpStateExpectACK(self.context)