ROOT logo
// @(#)root/rfio:$Id: TRFIOFile.cxx 23095 2008-04-09 15:53:24Z rdm $
// Author: Fons Rademakers 20/01/99 + Giulia Taurelli 29/06/2006 + Andreas Peters 07/12/2007

/*************************************************************************
 * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

///////////////////////////////////////////////////////////////////////////
//                                                                       //
// TRFIOFile                                                             //
//                                                                       //
// A TRFIOFile is like a normal TFile except that it reads and writes    //
// its data via a rfiod server (for more on the rfiod daemon see         //
// http://wwwinfo.cern.ch/pdp/serv/shift.html). TRFIOFile file names     //
// are in standard URL format with protocol "rfio". The following are    //
// valid TRFIOFile URL's:                                                //
//                                                                       //
//    rfio:/afs/cern.ch/user/r/rdm/galice.root                           //
//         where galice.root is a symlink of the type /shift/.../...     //
//    rfio:na49db1:/data1/raw.root                                       //
//    rfio:/castor/cern.ch/user/r/rdm/test.root                          //
//                                                                       //
// If Castor 2.1 is used the file names can be given also in the         //
// following ways:                                                       //
//                                                                       //
//  rfio://host:port/?path=FILEPATH                                      //
//  rfio://host/?path=FILEPATH                                           //
//  rfio:///castor?path=FILEPATH                                         //
//  rfio://stager_host:stager_port/?path=/castor/cern.ch/user/r/         //
//    rdm/bla.root&svcClass=MYSVCLASS&castorVersion=MYCASTORVERSION      //
//  rfio://stager_host/?path=/castor/cern.ch/user/r/                     //
//    rdm/bla.root&svcClass=MYSVCLASS&castorVersion=MYCASTORVERSION      //
//  rfio:///castor?path=/castor/cern.ch/user/r/                          //
//    rdm/bla.root&svcClass=MYSVCLASS&castorVersion=MYCASTORVERSION      //
//                                                                       //
// path is mandatory as parameter but all the other ones are optional.   //
//                                                                       //
// For the ultimate description of supported urls see:                   //
//    https://twiki.cern.ch/twiki/bin/view/FIOgroup/RfioRootTurl         //
//                                                                       //
///////////////////////////////////////////////////////////////////////////

#include "TRFIOFile.h"
#include "TROOT.h"

#include <sys/stat.h>
#include <sys/types.h>
#include <stdlib.h>
#ifndef R__WIN32
#include <unistd.h>
#if defined(R__SUN) || defined(R__SGI) || defined(R__HPUX) ||         \
defined(R__AIX) || defined(R__LINUX) || defined(R__SOLARIS) ||        \
defined(R__ALPHA) || defined(R__HIUX) || defined(R__FBSD) ||          \
defined(R__MACOSX) || defined(R__HURD) || defined(R__OBSD)
#define HAS_DIRENT
#endif
#endif

#ifdef HAS_DIRENT
#include <dirent.h>
#endif

#include <rfio.h>
#include <rfio_api.h>
#include <serrno.h>


ClassImp(TRFIOFile)
ClassImp(TRFIOSystem)

//______________________________________________________________________________
TRFIOFile::TRFIOFile(const char *url, Option_t *option, const char *ftitle,
                     Int_t compress)
   : TFile(url, "NET", ftitle, compress)
{
   // Create a RFIO file object. A RFIO file is the same as a TFile
   // except that it is being accessed via a rfiod server. The url
   // argument must be of the form: rfio:/path/file.root (where file.root
   // is a symlink of type /shift/aaa/bbb/ccc) or rfio:server:/path/file.root.
   // If the file specified in the URL does not exist, is not accessable
   // or can not be created the kZombie bit will be set in the TRFIOFile
   // object. Use IsZombie() to see if the file is accessable.
   // For a description of the option and other arguments see the TFile ctor.
   // The preferred interface to this constructor is via TFile::Open().

   fOption = option;
   fOption.ToUpper();

   Int_t readopt = RFIO_READBUF;
   ::rfiosetopt(RFIO_READOPT, &readopt, 4);

   if (fOption == "NEW")
      fOption = "CREATE";

   Bool_t create   = (fOption == "CREATE") ? kTRUE : kFALSE;
   Bool_t recreate = (fOption == "RECREATE") ? kTRUE : kFALSE;
   Bool_t update   = (fOption == "UPDATE") ? kTRUE : kFALSE;
   Bool_t read     = (fOption == "READ") ? kTRUE : kFALSE;
   if (!create && !recreate && !update && !read) {
      read    = kTRUE;
      fOption = "READ";
   }

   // to be able to use the turl starting with castor:
   if (!strcmp(fUrl.GetProtocol(), "castor"))
      fUrl.SetProtocol("rfio");

   // old RFIO client does not ignore ?filetpye=raw, remove it
   TString opt = fUrl.GetOptions();
   if (opt.Contains("&filetype=raw")) {
      opt.ReplaceAll("&filetype=raw", "");
      fUrl.SetOptions(opt);
   } else if (opt.Contains("filetype=raw")) {
      opt.ReplaceAll("filetype=raw", "");
      fUrl.SetOptions(opt);
   }

   // old RFIO client lib does not support :///, need to change to :////
   Bool_t addSlash = kFALSE;
   if ((strstr(url, ":/")   && !strstr(url, "://")) ||
       (strstr(url, ":///") && !strstr(url, ":////")))
      addSlash = kTRUE;

   // the complete turl in fname
   TString fname;
   if (!addSlash)
      fname.Form("%s://%s", fUrl.GetProtocol(), fUrl.GetFile());
   else
      fname.Form("%s:///%s", fUrl.GetProtocol(), fUrl.GetFile());
   if (strlen(fUrl.GetOptions()))
      fname += Form("?%s", fUrl.GetOptions());

   if (recreate) {
      if (::rfio_access((char*)fname.Data(), kFileExists) == 0)
         ::rfio_unlink((char*)fname.Data());
      recreate = kFALSE;
      create   = kTRUE;
      fOption  = "CREATE";
   }
   if (create && ::rfio_access((char*)fname.Data(), kFileExists) == 0) {
      Error("TRFIOFile", "file %s already exists", fname.Data());
      goto zombie;
   }
   if (update) {
      if (::rfio_access((char*)fname.Data(), kFileExists) != 0) {
         update = kFALSE;
         create = kTRUE;
      }
      if (update && ::rfio_access((char*)fname.Data(), kWritePermission) != 0) {
         Error("TRFIOFile", "no write permission, could not open file %s", fname.Data());
         goto zombie;
      }
   }

   // Connect to file system stream
   fRealName = fname;

   if (create || update) {
#ifndef WIN32
      fD = SysOpen(fname.Data(), O_RDWR | O_CREAT, 0644);
#else
      fD = SysOpen(fname.Data(), O_RDWR | O_CREAT | O_BINARY, S_IREAD | S_IWRITE);
#endif
      if (fD == -1) {
         SysError("TRFIOFile", "file %s can not be opened", fname.Data());
         goto zombie;
      }
      fWritable = kTRUE;
   } else {
#ifndef WIN32
      fD = SysOpen(fname.Data(), O_RDONLY, 0644);
#else
      fD = SysOpen(fname.Data(), O_RDONLY | O_BINARY, S_IREAD | S_IWRITE);
#endif
      if (fD == -1) {
         SysError("TRFIOFile", "file %s can not be opened for reading", fname.Data());
         goto zombie;
      }
      fWritable = kFALSE;
   }

   Init(create);

   return;

zombie:
   // error in file opening occured, make this object a zombie
   MakeZombie();
   gDirectory = gROOT;
}

//______________________________________________________________________________
TRFIOFile::~TRFIOFile()
{
   // RFIO file dtor. Close and flush directory structure.

   Close();
}

//______________________________________________________________________________
Bool_t TRFIOFile::ReadBuffers(char *buf, Long64_t *pos, Int_t *len, Int_t nbuf)
{
   // Read a list of buffers given in pos[] and len[] and return it
   // in a single buffer. Returns kTRUE in case of error.

   static struct iovec64 *iov = 0;
   static Int_t iovsize = 128;
   Int_t n;

   if (IsZombie()) {
      Error("ReadBuffers", "cannot read because object is in 'zombie' state");
      return kTRUE;
   }

   if (!IsOpen()) {
      Error("ReadBuffers", "the remote file is not open");
      return kTRUE;
   }

   // we maintain a static iove64 buffer to avoid malloc/free with every call
   if (!iov) {
      if (nbuf > iovsize)
         iovsize = nbuf;

      iov = (struct iovec64*)malloc(sizeof(struct iovec64) * iovsize);
      if (gDebug > 1)
         Info("TRFIOFile", "allocating iovec64 with size %d", iovsize);
      if (!iov) {
         Error("TRFIOFile", "error allocating preseek vector of size %d",
               sizeof(struct iovec64) * iovsize);
         return kTRUE;
      }
   } else {
      if (nbuf > iovsize) {
         iovsize = nbuf;
         iov = (struct iovec64*) realloc(iov, sizeof(struct iovec64) * iovsize);
         if (gDebug > 1)
            Info("TRFIOFile", "re-allocating iovec64 with size %d", iovsize);
         if (!iov) {
            Error("TRFIOFile", "error reallocating preseek vector of size %d",
                  sizeof(struct iovec64) * iovsize);
            return kTRUE;
         }
      }
   }


   for (n = 0; n < nbuf; n++) {
      if (gDebug>1)
         Info("TFIOFile", "adding chunk %lld, %d %d", n, pos[n], len[n]);
      iov[n].iov_base = pos[n];
      iov[n].iov_len  = len[n];
   }

   // prefetch the stuff
   if (rfio_preseek64(fD, iov, nbuf) < 0) {
      Error("TRFIOFile", "error doing rfio_preseek");
      return kTRUE;
   }

   // read the chunks
   Int_t k = 0;

   for (n = 0; n < nbuf; n++) {
      if (rfio_lseek64(fD, (off_t) iov[n].iov_base, SEEK_SET) < 0) {
         Error("TRFIOFile", "error doing rfio_lseek");
         return kTRUE;
      }
      if (rfio_read(fD, buf+k, iov[n].iov_len) < 0) {
         Error("TRFIOFile", "error doing rfio_read");
         return kTRUE;
      }
      k += iov[n].iov_len;
   }

   fOffset    += k;
   fBytesRead += k;
#ifdef WIN32
   SetFileBytesRead(GetFileBytesRead() + k);
   SetFileReadCalls(GetFileReadCalls() + 1);
#else
   fgBytesRead += k;
   fgReadCalls++;
#endif

   return kFALSE;
}

//______________________________________________________________________________
Int_t TRFIOFile::SysOpen(const char *pathname, Int_t flags, UInt_t mode)
{
   // Interface to system open. All arguments like in POSIX open.
   Int_t ret = ::rfio_open64((char*)pathname, flags, (Int_t) mode);
   if (ret < 0)
      gSystem->SetErrorStr(::rfio_serror());
   return ret;
}

//______________________________________________________________________________
Int_t TRFIOFile::SysClose(Int_t fd)
{
   // Interface to system close. All arguments like in POSIX close.

   Int_t ret = ::rfio_close(fd);
   if (ret < 0)
      gSystem->SetErrorStr(::rfio_serror());
   return ret;
}

//______________________________________________________________________________
Int_t TRFIOFile::SysRead(Int_t fd, void *buf, Int_t len)
{
   // Interface to system read. All arguments like in POSIX read.

   fOffset += len;
   Int_t ret = ::rfio_read(fd, (char *)buf, len);
   if (ret < 0)
      gSystem->SetErrorStr(::rfio_serror());
   return ret;
}

//______________________________________________________________________________
Int_t TRFIOFile::SysWrite(Int_t fd, const void *buf, Int_t len)
{
   // Interface to system write. All arguments like in POSIX write.

   fOffset += len;
   Int_t ret = ::rfio_write(fd, (char *)buf, len);
   if (ret < 0)
      gSystem->SetErrorStr(::rfio_serror());
   return ret;
}

//______________________________________________________________________________
Long64_t TRFIOFile::SysSeek(Int_t fd, Long64_t offset, Int_t whence)
{
   // Interface to system lseek. All arguments like in POSIX lseek
   // except that the offset and return value are Long_t to be able to
   // handle 64 bit file systems.

   if (whence == SEEK_SET && offset == fOffset) return offset;

   Long64_t ret = ::rfio_lseek64(fd, offset, whence);

   if (ret < 0)
      gSystem->SetErrorStr(::rfio_serror());
   else
      fOffset = ret;

   return ret;
}

//______________________________________________________________________________
Int_t TRFIOFile::SysStat(Int_t fd, Long_t *id, Long64_t *size, Long_t *flags,
                         Long_t *modtime)
{
   // Interface to TSystem:GetPathInfo(). Generally implemented via
   // stat() or fstat().

   struct stat64 statbuf;

   if (::rfio_fstat64(fd, &statbuf) >= 0) {
      if (id)
         *id = (statbuf.st_dev << 24) + statbuf.st_ino;
      if (size)
         *size = statbuf.st_size;
      if (modtime)
         *modtime = statbuf.st_mtime;
      if (flags) {
         *flags = 0;
         if (statbuf.st_mode & ((S_IEXEC)|(S_IEXEC>>3)|(S_IEXEC>>6)))
            *flags |= 1;
         if ((statbuf.st_mode & S_IFMT) == S_IFDIR)
            *flags |= 2;
         if ((statbuf.st_mode & S_IFMT) != S_IFREG &&
             (statbuf.st_mode & S_IFMT) != S_IFDIR)
            *flags |= 4;
      }
      return 0;
   }

   gSystem->SetErrorStr(::rfio_serror());
   return 1;
}

//______________________________________________________________________________
Int_t TRFIOFile::GetErrno() const
{
   // Method returning rfio_errno. For RFIO files must use this
   // function since we need to check rfio_errno then serrno and finally errno.

   if (rfio_errno)
      return rfio_errno;
   if (serrno)
      return serrno;
   return TSystem::GetErrno();
}

//______________________________________________________________________________
void TRFIOFile::ResetErrno() const
{
   // Method resetting the rfio_errno, serrno and errno.

   rfio_errno = 0;
   serrno = 0;
   TSystem::ResetErrno();
}


//______________________________________________________________________________
TRFIOSystem::TRFIOSystem() : TSystem("-rfio", "RFIO Helper System")
{
   // Create helper class that allows directory access via rfiod.
   // The name must start with '-' to bypass the TSystem singleton check.

   SetName("rfio");

   fDirp = 0;
}

//______________________________________________________________________________
Int_t TRFIOSystem::MakeDirectory(const char *dir)
{
   // Make a directory via rfiod.

   TUrl url(dir);
   Int_t ret = ::rfio_mkdir((char*)url.GetFileAndOptions(), 0755);
   if (ret < 0)
      gSystem->SetErrorStr(::rfio_serror());
   return ret;
}

//______________________________________________________________________________
void *TRFIOSystem::OpenDirectory(const char *dir)
{
   // Open a directory via rfiod. Returns an opaque pointer to a dir
   // structure. Returns 0 in case of error.

   if (fDirp) {
      Error("OpenDirectory", "invalid directory pointer (should never happen)");
      fDirp = 0;
   }

   TUrl url(dir);

   struct stat finfo;
   if (::rfio_stat((char*)url.GetFileAndOptions(), &finfo) < 0)
      return 0;

   if ((finfo.st_mode & S_IFMT) != S_IFDIR)
      return 0;

   fDirp = (void*) ::rfio_opendir((char*)url.GetFileAndOptions());

   if (!fDirp)
      gSystem->SetErrorStr(::rfio_serror());

   return fDirp;
}

//______________________________________________________________________________
void TRFIOSystem::FreeDirectory(void *dirp)
{
   // Free directory via rfiod.

   if (dirp != fDirp) {
      Error("FreeDirectory", "invalid directory pointer (should never happen)");
      return;
   }

   if (dirp)
      ::rfio_closedir((DIR*)dirp);

   fDirp = 0;
}

//______________________________________________________________________________
const char *TRFIOSystem::GetDirEntry(void *dirp)
{
   // Get directory entry via rfiod. Returns 0 in case no more entries.

   if (dirp != fDirp) {
      Error("GetDirEntry", "invalid directory pointer (should never happen)");
      return 0;
   }

   struct dirent *dp;

   if (dirp) {
      dp = (struct dirent *) ::rfio_readdir((DIR*)dirp);
      if (!dp)
         return 0;
      return dp->d_name;
   }
   return 0;
}

//______________________________________________________________________________
Int_t TRFIOSystem::GetPathInfo(const char *path, FileStat_t &buf)
{
   // Get info about a file. Info is returned in the form of a FileStat_t
   // structure (see TSystem.h).
   // The function returns 0 in case of success and 1 if the file could
   // not be stat'ed.

   TUrl url(path);

   struct stat64 sbuf;
   if (path && ::rfio_stat64((char*)url.GetFileAndOptions(), &sbuf) >= 0) {

      buf.fDev    = sbuf.st_dev;
      buf.fIno    = sbuf.st_ino;
      buf.fMode   = sbuf.st_mode;
      buf.fUid    = sbuf.st_uid;
      buf.fGid    = sbuf.st_gid;
      buf.fSize   = sbuf.st_size;
      buf.fMtime  = sbuf.st_mtime;
      buf.fIsLink = kFALSE;

      return 0;
   }
   return 1;
}

//______________________________________________________________________________
Bool_t TRFIOSystem::AccessPathName(const char *path, EAccessMode mode)
{
   // Returns FALSE if one can access a file using the specified access mode.
   // Mode is the same as for the Unix access(2) function.
   // Attention, bizarre convention of return value!!

   TUrl url(path);
   if (::rfio_access((char*)url.GetFileAndOptions(), mode) == 0)
      return kFALSE;
   gSystem->SetErrorStr(::rfio_serror());
   return kTRUE;
}

//______________________________________________________________________________
Int_t TRFIOSystem::Unlink(const char *path)
{
   // Unlink, i.e. remove, a file or directory. Returns 0 when succesfull,
   // -1 in case of failure.

   TUrl url(path);

   struct stat finfo;
   if (rfio_stat((char*)url.GetFileAndOptions(), &finfo) < 0)
      return -1;

   if (R_ISDIR(finfo.st_mode))
      return rfio_rmdir((char*)url.GetFileAndOptions());
   else
      return rfio_unlink((char*)url.GetFileAndOptions());
}
 TRFIOFile.cxx:1
 TRFIOFile.cxx:2
 TRFIOFile.cxx:3
 TRFIOFile.cxx:4
 TRFIOFile.cxx:5
 TRFIOFile.cxx:6
 TRFIOFile.cxx:7
 TRFIOFile.cxx:8
 TRFIOFile.cxx:9
 TRFIOFile.cxx:10
 TRFIOFile.cxx:11
 TRFIOFile.cxx:12
 TRFIOFile.cxx:13
 TRFIOFile.cxx:14
 TRFIOFile.cxx:15
 TRFIOFile.cxx:16
 TRFIOFile.cxx:17
 TRFIOFile.cxx:18
 TRFIOFile.cxx:19
 TRFIOFile.cxx:20
 TRFIOFile.cxx:21
 TRFIOFile.cxx:22
 TRFIOFile.cxx:23
 TRFIOFile.cxx:24
 TRFIOFile.cxx:25
 TRFIOFile.cxx:26
 TRFIOFile.cxx:27
 TRFIOFile.cxx:28
 TRFIOFile.cxx:29
 TRFIOFile.cxx:30
 TRFIOFile.cxx:31
 TRFIOFile.cxx:32
 TRFIOFile.cxx:33
 TRFIOFile.cxx:34
 TRFIOFile.cxx:35
 TRFIOFile.cxx:36
 TRFIOFile.cxx:37
 TRFIOFile.cxx:38
 TRFIOFile.cxx:39
 TRFIOFile.cxx:40
 TRFIOFile.cxx:41
 TRFIOFile.cxx:42
 TRFIOFile.cxx:43
 TRFIOFile.cxx:44
 TRFIOFile.cxx:45
 TRFIOFile.cxx:46
 TRFIOFile.cxx:47
 TRFIOFile.cxx:48
 TRFIOFile.cxx:49
 TRFIOFile.cxx:50
 TRFIOFile.cxx:51
 TRFIOFile.cxx:52
 TRFIOFile.cxx:53
 TRFIOFile.cxx:54
 TRFIOFile.cxx:55
 TRFIOFile.cxx:56
 TRFIOFile.cxx:57
 TRFIOFile.cxx:58
 TRFIOFile.cxx:59
 TRFIOFile.cxx:60
 TRFIOFile.cxx:61
 TRFIOFile.cxx:62
 TRFIOFile.cxx:63
 TRFIOFile.cxx:64
 TRFIOFile.cxx:65
 TRFIOFile.cxx:66
 TRFIOFile.cxx:67
 TRFIOFile.cxx:68
 TRFIOFile.cxx:69
 TRFIOFile.cxx:70
 TRFIOFile.cxx:71
 TRFIOFile.cxx:72
 TRFIOFile.cxx:73
 TRFIOFile.cxx:74
 TRFIOFile.cxx:75
 TRFIOFile.cxx:76
 TRFIOFile.cxx:77
 TRFIOFile.cxx:78
 TRFIOFile.cxx:79
 TRFIOFile.cxx:80
 TRFIOFile.cxx:81
 TRFIOFile.cxx:82
 TRFIOFile.cxx:83
 TRFIOFile.cxx:84
 TRFIOFile.cxx:85
 TRFIOFile.cxx:86
 TRFIOFile.cxx:87
 TRFIOFile.cxx:88
 TRFIOFile.cxx:89
 TRFIOFile.cxx:90
 TRFIOFile.cxx:91
 TRFIOFile.cxx:92
 TRFIOFile.cxx:93
 TRFIOFile.cxx:94
 TRFIOFile.cxx:95
 TRFIOFile.cxx:96
 TRFIOFile.cxx:97
 TRFIOFile.cxx:98
 TRFIOFile.cxx:99
 TRFIOFile.cxx:100
 TRFIOFile.cxx:101
 TRFIOFile.cxx:102
 TRFIOFile.cxx:103
 TRFIOFile.cxx:104
 TRFIOFile.cxx:105
 TRFIOFile.cxx:106
 TRFIOFile.cxx:107
 TRFIOFile.cxx:108
 TRFIOFile.cxx:109
 TRFIOFile.cxx:110
 TRFIOFile.cxx:111
 TRFIOFile.cxx:112
 TRFIOFile.cxx:113
 TRFIOFile.cxx:114
 TRFIOFile.cxx:115
 TRFIOFile.cxx:116
 TRFIOFile.cxx:117
 TRFIOFile.cxx:118
 TRFIOFile.cxx:119
 TRFIOFile.cxx:120
 TRFIOFile.cxx:121
 TRFIOFile.cxx:122
 TRFIOFile.cxx:123
 TRFIOFile.cxx:124
 TRFIOFile.cxx:125
 TRFIOFile.cxx:126
 TRFIOFile.cxx:127
 TRFIOFile.cxx:128
 TRFIOFile.cxx:129
 TRFIOFile.cxx:130
 TRFIOFile.cxx:131
 TRFIOFile.cxx:132
 TRFIOFile.cxx:133
 TRFIOFile.cxx:134
 TRFIOFile.cxx:135
 TRFIOFile.cxx:136
 TRFIOFile.cxx:137
 TRFIOFile.cxx:138
 TRFIOFile.cxx:139
 TRFIOFile.cxx:140
 TRFIOFile.cxx:141
 TRFIOFile.cxx:142
 TRFIOFile.cxx:143
 TRFIOFile.cxx:144
 TRFIOFile.cxx:145
 TRFIOFile.cxx:146
 TRFIOFile.cxx:147
 TRFIOFile.cxx:148
 TRFIOFile.cxx:149
 TRFIOFile.cxx:150
 TRFIOFile.cxx:151
 TRFIOFile.cxx:152
 TRFIOFile.cxx:153
 TRFIOFile.cxx:154
 TRFIOFile.cxx:155
 TRFIOFile.cxx:156
 TRFIOFile.cxx:157
 TRFIOFile.cxx:158
 TRFIOFile.cxx:159
 TRFIOFile.cxx:160
 TRFIOFile.cxx:161
 TRFIOFile.cxx:162
 TRFIOFile.cxx:163
 TRFIOFile.cxx:164
 TRFIOFile.cxx:165
 TRFIOFile.cxx:166
 TRFIOFile.cxx:167
 TRFIOFile.cxx:168
 TRFIOFile.cxx:169
 TRFIOFile.cxx:170
 TRFIOFile.cxx:171
 TRFIOFile.cxx:172
 TRFIOFile.cxx:173
 TRFIOFile.cxx:174
 TRFIOFile.cxx:175
 TRFIOFile.cxx:176
 TRFIOFile.cxx:177
 TRFIOFile.cxx:178
 TRFIOFile.cxx:179
 TRFIOFile.cxx:180
 TRFIOFile.cxx:181
 TRFIOFile.cxx:182
 TRFIOFile.cxx:183
 TRFIOFile.cxx:184
 TRFIOFile.cxx:185
 TRFIOFile.cxx:186
 TRFIOFile.cxx:187
 TRFIOFile.cxx:188
 TRFIOFile.cxx:189
 TRFIOFile.cxx:190
 TRFIOFile.cxx:191
 TRFIOFile.cxx:192
 TRFIOFile.cxx:193
 TRFIOFile.cxx:194
 TRFIOFile.cxx:195
 TRFIOFile.cxx:196
 TRFIOFile.cxx:197
 TRFIOFile.cxx:198
 TRFIOFile.cxx:199
 TRFIOFile.cxx:200
 TRFIOFile.cxx:201
 TRFIOFile.cxx:202
 TRFIOFile.cxx:203
 TRFIOFile.cxx:204
 TRFIOFile.cxx:205
 TRFIOFile.cxx:206
 TRFIOFile.cxx:207
 TRFIOFile.cxx:208
 TRFIOFile.cxx:209
 TRFIOFile.cxx:210
 TRFIOFile.cxx:211
 TRFIOFile.cxx:212
 TRFIOFile.cxx:213
 TRFIOFile.cxx:214
 TRFIOFile.cxx:215
 TRFIOFile.cxx:216
 TRFIOFile.cxx:217
 TRFIOFile.cxx:218
 TRFIOFile.cxx:219
 TRFIOFile.cxx:220
 TRFIOFile.cxx:221
 TRFIOFile.cxx:222
 TRFIOFile.cxx:223
 TRFIOFile.cxx:224
 TRFIOFile.cxx:225
 TRFIOFile.cxx:226
 TRFIOFile.cxx:227
 TRFIOFile.cxx:228
 TRFIOFile.cxx:229
 TRFIOFile.cxx:230
 TRFIOFile.cxx:231
 TRFIOFile.cxx:232
 TRFIOFile.cxx:233
 TRFIOFile.cxx:234
 TRFIOFile.cxx:235
 TRFIOFile.cxx:236
 TRFIOFile.cxx:237
 TRFIOFile.cxx:238
 TRFIOFile.cxx:239
 TRFIOFile.cxx:240
 TRFIOFile.cxx:241
 TRFIOFile.cxx:242
 TRFIOFile.cxx:243
 TRFIOFile.cxx:244
 TRFIOFile.cxx:245
 TRFIOFile.cxx:246
 TRFIOFile.cxx:247
 TRFIOFile.cxx:248
 TRFIOFile.cxx:249
 TRFIOFile.cxx:250
 TRFIOFile.cxx:251
 TRFIOFile.cxx:252
 TRFIOFile.cxx:253
 TRFIOFile.cxx:254
 TRFIOFile.cxx:255
 TRFIOFile.cxx:256
 TRFIOFile.cxx:257
 TRFIOFile.cxx:258
 TRFIOFile.cxx:259
 TRFIOFile.cxx:260
 TRFIOFile.cxx:261
 TRFIOFile.cxx:262
 TRFIOFile.cxx:263
 TRFIOFile.cxx:264
 TRFIOFile.cxx:265
 TRFIOFile.cxx:266
 TRFIOFile.cxx:267
 TRFIOFile.cxx:268
 TRFIOFile.cxx:269
 TRFIOFile.cxx:270
 TRFIOFile.cxx:271
 TRFIOFile.cxx:272
 TRFIOFile.cxx:273
 TRFIOFile.cxx:274
 TRFIOFile.cxx:275
 TRFIOFile.cxx:276
 TRFIOFile.cxx:277
 TRFIOFile.cxx:278
 TRFIOFile.cxx:279
 TRFIOFile.cxx:280
 TRFIOFile.cxx:281
 TRFIOFile.cxx:282
 TRFIOFile.cxx:283
 TRFIOFile.cxx:284
 TRFIOFile.cxx:285
 TRFIOFile.cxx:286
 TRFIOFile.cxx:287
 TRFIOFile.cxx:288
 TRFIOFile.cxx:289
 TRFIOFile.cxx:290
 TRFIOFile.cxx:291
 TRFIOFile.cxx:292
 TRFIOFile.cxx:293
 TRFIOFile.cxx:294
 TRFIOFile.cxx:295
 TRFIOFile.cxx:296
 TRFIOFile.cxx:297
 TRFIOFile.cxx:298
 TRFIOFile.cxx:299
 TRFIOFile.cxx:300
 TRFIOFile.cxx:301
 TRFIOFile.cxx:302
 TRFIOFile.cxx:303
 TRFIOFile.cxx:304
 TRFIOFile.cxx:305
 TRFIOFile.cxx:306
 TRFIOFile.cxx:307
 TRFIOFile.cxx:308
 TRFIOFile.cxx:309
 TRFIOFile.cxx:310
 TRFIOFile.cxx:311
 TRFIOFile.cxx:312
 TRFIOFile.cxx:313
 TRFIOFile.cxx:314
 TRFIOFile.cxx:315
 TRFIOFile.cxx:316
 TRFIOFile.cxx:317
 TRFIOFile.cxx:318
 TRFIOFile.cxx:319
 TRFIOFile.cxx:320
 TRFIOFile.cxx:321
 TRFIOFile.cxx:322
 TRFIOFile.cxx:323
 TRFIOFile.cxx:324
 TRFIOFile.cxx:325
 TRFIOFile.cxx:326
 TRFIOFile.cxx:327
 TRFIOFile.cxx:328
 TRFIOFile.cxx:329
 TRFIOFile.cxx:330
 TRFIOFile.cxx:331
 TRFIOFile.cxx:332
 TRFIOFile.cxx:333
 TRFIOFile.cxx:334
 TRFIOFile.cxx:335
 TRFIOFile.cxx:336
 TRFIOFile.cxx:337
 TRFIOFile.cxx:338
 TRFIOFile.cxx:339
 TRFIOFile.cxx:340
 TRFIOFile.cxx:341
 TRFIOFile.cxx:342
 TRFIOFile.cxx:343
 TRFIOFile.cxx:344
 TRFIOFile.cxx:345
 TRFIOFile.cxx:346
 TRFIOFile.cxx:347
 TRFIOFile.cxx:348
 TRFIOFile.cxx:349
 TRFIOFile.cxx:350
 TRFIOFile.cxx:351
 TRFIOFile.cxx:352
 TRFIOFile.cxx:353
 TRFIOFile.cxx:354
 TRFIOFile.cxx:355
 TRFIOFile.cxx:356
 TRFIOFile.cxx:357
 TRFIOFile.cxx:358
 TRFIOFile.cxx:359
 TRFIOFile.cxx:360
 TRFIOFile.cxx:361
 TRFIOFile.cxx:362
 TRFIOFile.cxx:363
 TRFIOFile.cxx:364
 TRFIOFile.cxx:365
 TRFIOFile.cxx:366
 TRFIOFile.cxx:367
 TRFIOFile.cxx:368
 TRFIOFile.cxx:369
 TRFIOFile.cxx:370
 TRFIOFile.cxx:371
 TRFIOFile.cxx:372
 TRFIOFile.cxx:373
 TRFIOFile.cxx:374
 TRFIOFile.cxx:375
 TRFIOFile.cxx:376
 TRFIOFile.cxx:377
 TRFIOFile.cxx:378
 TRFIOFile.cxx:379
 TRFIOFile.cxx:380
 TRFIOFile.cxx:381
 TRFIOFile.cxx:382
 TRFIOFile.cxx:383
 TRFIOFile.cxx:384
 TRFIOFile.cxx:385
 TRFIOFile.cxx:386
 TRFIOFile.cxx:387
 TRFIOFile.cxx:388
 TRFIOFile.cxx:389
 TRFIOFile.cxx:390
 TRFIOFile.cxx:391
 TRFIOFile.cxx:392
 TRFIOFile.cxx:393
 TRFIOFile.cxx:394
 TRFIOFile.cxx:395
 TRFIOFile.cxx:396
 TRFIOFile.cxx:397
 TRFIOFile.cxx:398
 TRFIOFile.cxx:399
 TRFIOFile.cxx:400
 TRFIOFile.cxx:401
 TRFIOFile.cxx:402
 TRFIOFile.cxx:403
 TRFIOFile.cxx:404
 TRFIOFile.cxx:405
 TRFIOFile.cxx:406
 TRFIOFile.cxx:407
 TRFIOFile.cxx:408
 TRFIOFile.cxx:409
 TRFIOFile.cxx:410
 TRFIOFile.cxx:411
 TRFIOFile.cxx:412
 TRFIOFile.cxx:413
 TRFIOFile.cxx:414
 TRFIOFile.cxx:415
 TRFIOFile.cxx:416
 TRFIOFile.cxx:417
 TRFIOFile.cxx:418
 TRFIOFile.cxx:419
 TRFIOFile.cxx:420
 TRFIOFile.cxx:421
 TRFIOFile.cxx:422
 TRFIOFile.cxx:423
 TRFIOFile.cxx:424
 TRFIOFile.cxx:425
 TRFIOFile.cxx:426
 TRFIOFile.cxx:427
 TRFIOFile.cxx:428
 TRFIOFile.cxx:429
 TRFIOFile.cxx:430
 TRFIOFile.cxx:431
 TRFIOFile.cxx:432
 TRFIOFile.cxx:433
 TRFIOFile.cxx:434
 TRFIOFile.cxx:435
 TRFIOFile.cxx:436
 TRFIOFile.cxx:437
 TRFIOFile.cxx:438
 TRFIOFile.cxx:439
 TRFIOFile.cxx:440
 TRFIOFile.cxx:441
 TRFIOFile.cxx:442
 TRFIOFile.cxx:443
 TRFIOFile.cxx:444
 TRFIOFile.cxx:445
 TRFIOFile.cxx:446
 TRFIOFile.cxx:447
 TRFIOFile.cxx:448
 TRFIOFile.cxx:449
 TRFIOFile.cxx:450
 TRFIOFile.cxx:451
 TRFIOFile.cxx:452
 TRFIOFile.cxx:453
 TRFIOFile.cxx:454
 TRFIOFile.cxx:455
 TRFIOFile.cxx:456
 TRFIOFile.cxx:457
 TRFIOFile.cxx:458
 TRFIOFile.cxx:459
 TRFIOFile.cxx:460
 TRFIOFile.cxx:461
 TRFIOFile.cxx:462
 TRFIOFile.cxx:463
 TRFIOFile.cxx:464
 TRFIOFile.cxx:465
 TRFIOFile.cxx:466
 TRFIOFile.cxx:467
 TRFIOFile.cxx:468
 TRFIOFile.cxx:469
 TRFIOFile.cxx:470
 TRFIOFile.cxx:471
 TRFIOFile.cxx:472
 TRFIOFile.cxx:473
 TRFIOFile.cxx:474
 TRFIOFile.cxx:475
 TRFIOFile.cxx:476
 TRFIOFile.cxx:477
 TRFIOFile.cxx:478
 TRFIOFile.cxx:479
 TRFIOFile.cxx:480
 TRFIOFile.cxx:481
 TRFIOFile.cxx:482
 TRFIOFile.cxx:483
 TRFIOFile.cxx:484
 TRFIOFile.cxx:485
 TRFIOFile.cxx:486
 TRFIOFile.cxx:487
 TRFIOFile.cxx:488
 TRFIOFile.cxx:489
 TRFIOFile.cxx:490
 TRFIOFile.cxx:491
 TRFIOFile.cxx:492
 TRFIOFile.cxx:493
 TRFIOFile.cxx:494
 TRFIOFile.cxx:495
 TRFIOFile.cxx:496
 TRFIOFile.cxx:497
 TRFIOFile.cxx:498
 TRFIOFile.cxx:499
 TRFIOFile.cxx:500
 TRFIOFile.cxx:501
 TRFIOFile.cxx:502
 TRFIOFile.cxx:503
 TRFIOFile.cxx:504
 TRFIOFile.cxx:505
 TRFIOFile.cxx:506
 TRFIOFile.cxx:507
 TRFIOFile.cxx:508
 TRFIOFile.cxx:509
 TRFIOFile.cxx:510
 TRFIOFile.cxx:511
 TRFIOFile.cxx:512
 TRFIOFile.cxx:513
 TRFIOFile.cxx:514
 TRFIOFile.cxx:515
 TRFIOFile.cxx:516
 TRFIOFile.cxx:517
 TRFIOFile.cxx:518
 TRFIOFile.cxx:519
 TRFIOFile.cxx:520
 TRFIOFile.cxx:521
 TRFIOFile.cxx:522
 TRFIOFile.cxx:523
 TRFIOFile.cxx:524
 TRFIOFile.cxx:525
 TRFIOFile.cxx:526
 TRFIOFile.cxx:527
 TRFIOFile.cxx:528
 TRFIOFile.cxx:529
 TRFIOFile.cxx:530
 TRFIOFile.cxx:531
 TRFIOFile.cxx:532
 TRFIOFile.cxx:533
 TRFIOFile.cxx:534
 TRFIOFile.cxx:535
 TRFIOFile.cxx:536
 TRFIOFile.cxx:537
 TRFIOFile.cxx:538
 TRFIOFile.cxx:539
 TRFIOFile.cxx:540
 TRFIOFile.cxx:541
 TRFIOFile.cxx:542
 TRFIOFile.cxx:543
 TRFIOFile.cxx:544
 TRFIOFile.cxx:545
 TRFIOFile.cxx:546
 TRFIOFile.cxx:547
 TRFIOFile.cxx:548
 TRFIOFile.cxx:549
 TRFIOFile.cxx:550
 TRFIOFile.cxx:551
 TRFIOFile.cxx:552
 TRFIOFile.cxx:553
 TRFIOFile.cxx:554
 TRFIOFile.cxx:555
 TRFIOFile.cxx:556
 TRFIOFile.cxx:557
 TRFIOFile.cxx:558
 TRFIOFile.cxx:559