ROOT logo
// @(#)root/castor:$Id: TCastorFile.cxx 41356 2011-10-12 13:08:43Z rdm $
// Author: Fons Rademakers + Jean-Damien Durand 17/09/2003 + Ben Couturier 31/05/2005
// + Giulia Taurelli 26/04/2006

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TCastorFile                                                          //
//                                                                      //
// A TCastorFile is like a normal TNetFile except that it obtains the   //
// remote node (disk server) via the CASTOR API, once the disk server   //
// and the local file path are determined, the file will be accessed    //
// via the rootd daemon. File names have to be specified like:          //
//    castor:/castor/cern.ch/user/r/rdm/bla.root.                       //
//                                                                      //
// If Castor 2.1 is used the file names can also be specified           //
// in the following ways:                                               //
//                                                                      //
//  castor://stager_host:stager_port/?path=/castor/cern.ch/user/        //
//    r/rdm/bla.root&svcClass=MYSVCLASS&castorVersion=MYCASTORVERSION   //
//                                                                      //
//  castor://stager_host/?path=/castor/cern.ch/user/                    //
//    r/rdm/bla.root&svcClass=MYSVCLASS&castorVersion=MYCASTORVERSION   //
//                                                                      //
//  castor:///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.  //
//                                                                      //
// Use "&rootAuth=<auth_prot_code>" in the option field to force the    //
// specified authentication protocol when contacting the server, e.g.   //
//                                                                      //
//  castor:///castor?path=/castor/cern.ch/user/r/rdm/bla.root           //
//    &svcClass=MYSVCLASS&castorVersion=MYCASTORVERSION&rootAuth=3      //
//                                                                      //
// will try first the globus/GSI protocol; available protocols are      //
//  0: passwd, 1: srp, 2: krb5, 3: globus, 4: ssh, 5 uidgid             //
// The defaul is taken from the env ROOTCASTORAUTH.                     //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "NetErrors.h"
#include "TCastorFile.h"
#include "TError.h"

#include <stdlib.h>
#include <errno.h>

#ifdef _WIN32
#include <WinDef.h>
#include <WinSock2.h>
#endif

#ifdef R__CASTOR2
#include <stager_api.h>       // For the new CASTOR 2 Stager
#endif
#define RFIO_KERNEL           // Get access to extra symbols in the headers
#include <stage_api.h>        // Dial with CASTOR stager
#include <rfio_api.h>         // Util routines from rfio
#include <Cns_api.h>          // Dial with CASTOR Name Server
#include <Cglobals.h>
#include <rfio_constants.h>

#define RFIO_USE_CASTOR_V2 "RFIO_USE_CASTOR_V2"
#define RFIO_HSM_BASETYPE  0x0
#define RFIO_HSM_CNS       RFIO_HSM_BASETYPE+1

extern "C" { int rfio_HsmIf_reqtoput (char *); }
extern "C" { int DLL_DECL rfio_parse(char *, char **, char **); }
extern "C" { int rfio_HsmIf_IsHsmFile (const char *); }
extern "C" { char *getconfent(char *, char *, int); }

#ifdef R__CASTOR2
extern int tStageHostKey;
extern int tStagePortKey;
extern int tSvcClassKey;
extern int tCastorVersionKey;
extern "C" { int DLL_DECL use_castor2_api(); }

//______________________________________________________________________________
static int UseCastor2API()
{
   // Function that checks whether we should use the old or new stager API.

   int version = use_castor2_api();
   return version;
}

#else

//______________________________________________________________________________
static int UseCastor2API()
{
   // Function that checks whether we should use the old or new stager API.

   char *p;

   if (((p = getenv(RFIO_USE_CASTOR_V2)) == 0) &&
       ((p = getconfent("RFIO","USE_CASTOR_V2",0)) == 0)) {
      // Variable not set: compat mode
      return 0;
   }
   if ((strcmp(p,"YES") == 0) || (strcmp(p,"yes") == 0) || (atoi(p) == 1)) {
      // Variable set to yes or 1 but old CASTOR 1: compat mode + warning
      static int once = 0;
      if (!once) {
         ::Warning("UseCastor2API", "asked to use CASTOR 2, but linked with CASTOR 1");
         once = 1;
      }
      return 0;
   }
   // Variable set but not to 1 : compat mode
   return 0;
}

#endif

//______________________________________________________________________________
static const char *GetAuthProto(TString &url)
{
   // Determine the authentication protocol to be tried first from the url
   // string or from defaults. The auth option, if any, is removed from 'url'.

   const Int_t rootNumSec = 6;
   const char *protoSec[rootNumSec] = {"rootup", "roots", "rootk",
                                       "rootg", "rooth", "rootug" };
   TString p = url;
   Int_t ii = p.Index("&rootAuth=");
   if (ii != kNPOS) {
      Int_t jj = p.Index("&", ii+1);
      if (jj != kNPOS)
         p.Remove(jj);
      p.Remove(0,ii);
      url.ReplaceAll(p, "");
      p.ReplaceAll("&rootAuth=", "");
   }
   if (p.Length() <= 0)
      // Use defaults
      p = getenv("ROOTCASTORAUTH");

   Int_t sec = -1;
   if (p.Length() > 0 && p.IsDigit()) {
      sec = p.Atoi();
      if (sec < 0 || sec > (rootNumSec - 1))
         sec = -1;
   }

   // Done
   return ((sec > -1 && sec < rootNumSec) ? protoSec[sec] : "root");
}

ClassImp(TCastorFile)

//______________________________________________________________________________
TCastorFile::TCastorFile(const char *url, Option_t *option, const char *ftitle,
                              Int_t compress, Int_t netopt)
      : TNetFile(url, ftitle, compress, kFALSE)
{
   // Create a TCastorFile. A TCastorFile is like a normal TNetFile except
   // that it obtains the remote node (disk server) via the CASTOR API, once
   // the disk server and the local file path are determined, the file will
   // be accessed via the rootd daemon. File names have to be specified like:
   //    castor:/castor/cern.ch/user/r/rdm/bla.root.
   // The other arguments are the same as for TNetFile and TFile.

   fIsCastor  = kFALSE;
   fWrittenTo = kFALSE;

   // Extract the authentication info, if any; removing it from the options
   TString u(url);
   fAuthProto = GetAuthProto(u);
   fUrl.SetUrl(u);

   if (gDebug > 0)
      Info("TCastorFile","fAuthProto = %s, u: %s", fAuthProto.Data(), u.Data());

   // file is always created by stage_out_hsm() and therefore
   // exists when opened by rootd
   TString opt = option;
   opt.ToUpper();
   if (opt == "NEW" || opt == "CREATE")
      opt = "RECREATE";

   Create(url, opt, netopt);
}

//______________________________________________________________________________
void TCastorFile::FindServerAndPath()
{
   // Find the CASTOR disk server and internal file path.

   // just call rfio_parse and no extra parsing is added here to that

   TString castorturl;
   char *host=0;
   char *name=0;

   // to be able to use the turl starting with  castor:
   if (!strcmp(fUrl.GetProtocol(),"castor"))
      castorturl = Form("%s://%s", "rfio", fUrl.GetFile());
   else
      castorturl = Form("%s://%s", fUrl.GetProtocol(), fUrl.GetFile());
   if (strlen(fUrl.GetOptions()) > 0)
      castorturl += Form("?%s", fUrl.GetOptions());

   // the complete turl in fname
   TString fname = castorturl; // for compatibility with rfio_parse interface
   if (::rfio_parse((char *)fname.Data(), &host, &name)>=0) {
      castorturl = Form("%s",(!name || !strstr(name,"/castor"))?fname.Data():name);
      fname = castorturl.Data();

   } else {
      Error("FindServerAndPath", "error parsing %s", fUrl.GetUrl());
      return;
   }

   if (!UseCastor2API()) {

      struct stgcat_entry *stcp_output = 0;
      if (rfio_HsmIf_IsHsmFile(fUrl.GetFile()) == RFIO_HSM_CNS) {
         // This is a CASTOR file
         int flags = O_RDONLY;
         struct Cns_filestat st;
         int rc;
         char stageoutbuf[1025];
         char stageerrbuf[1025];

         // Check with internal stage limits - preventing overflow afterwards
         if (strlen(fUrl.GetFile()) > STAGE_MAX_HSMLENGTH) {
            serrno = ENAMETOOLONG;
            Error("FindServerAndPath", "can't open %s, error %d (%s)", fUrl.GetFile(), serrno, sstrerror(serrno));
            return;
         }

         // Prepare the flags
         if (fOption == "CREATE" || fOption == "RECREATE" || fOption == "UPDATE")
            flags |= O_RDWR;
         if (fOption == "CREATE" || fOption == "RECREATE")
            flags |= O_CREAT | O_TRUNC;

         // Check if an existing file is going to be updated
         memset(&st, 0, sizeof(st));
         rc = Cns_stat(fUrl.GetFile(), &st);

         // Make sure that filesize is 0 if file doesn't exist
         // or that we will create (stage_out) if O_TRUNC.
         if (rc == -1 || ((flags & O_TRUNC) != 0))
            st.filesize = 0;

         // Makes sure stage api does not write automatically to stdout/stderr
         if (stage_setoutbuf(stageoutbuf, 1024) != 0) {
            Error("FindServerAndPath", "can't open %s, stage_setoutbuf, error %d (%s)",
                  fUrl.GetFile(), serrno, sstrerror(serrno));
            return;
         }
         if (stage_seterrbuf(stageerrbuf, 1024) != 0) {
            Error("FindServerAndPath", "can't open %s, stage_seterrbuf, error %d (%s)",
                  fUrl.GetFile(), serrno, sstrerror(serrno));
            return;
         }

         struct stgcat_entry stcp_input;
         int nstcp_output;

         memset(&stcp_input, 0, sizeof(struct stgcat_entry));
         strlcpy(stcp_input.u1.h.xfile, fUrl.GetFile(), sizeof(stcp_input.u1.h.xfile));
         if (flags == O_RDONLY || st.filesize > 0) {
         // Do a recall
            if (stage_in_hsm((u_signed64) 0,          // Ebusy is possible...
                             (int) flags,             // open flags
                             (char *) 0,              // hostname
                             (char *) 0,              // pooluser
                             (int) 1,                 // nstcp_input
                             (struct stgcat_entry *) &stcp_input, // stcp_input
                             (int *) &nstcp_output,   // nstcp_output
                             (struct stgcat_entry **) &stcp_output, // stcp_output
                             (int) 0,                 // nstpp_input
                             (struct stgpath_entry *) 0 // stpp_input
                            ) != 0) {
               Error("FindServerAndPath", "can't open %s, stage_in_hsm error %d (%s)",
                     fUrl.GetFile(), serrno, sstrerror(serrno));
               return;
            }
         } else {
            // Do a creation
            if (stage_out_hsm((u_signed64) 0,          // Ebusy is possible...
                              (int) flags,             // open flags
                              (mode_t) 0666,           // open mode (c.f. also umask)
                              // Note: This is S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH, c.f. fopen(2)
                              (char *) 0,              // hostname
                              (char *) 0,              // pooluser
                              (int) 1,                 // nstcp_input
                              (struct stgcat_entry *) &stcp_input, // stcp_input
                              (int *) &nstcp_output,   // nstcp_output
                              (struct stgcat_entry **) &stcp_output, // stcp_output
                              (int) 0,                       // nstpp_input
                              (struct stgpath_entry *) 0     // stpp_input
                             ) != 0) {
               Error("FindServerAndPath", "can't open %s, stage_out_hsm error %d (%s)",
               fUrl.GetFile(), serrno, sstrerror(serrno));
               return;
            }
         }
         if ((nstcp_output != 1) || (stcp_output == 0) ||
            (*(stcp_output->ipath) == '\0')) {
            // Impossible
            serrno = SEINTERNAL;
            if (stcp_output != 0) free(stcp_output);
            Error("FindServerAndPath", "can't open %s, error %d (%s)",
            fUrl.GetFile(), serrno, sstrerror(serrno));
            return;
         }

         // Parse orig string to get disk server host
         char *filename;
         char *realhost = 0;

         rfio_parse(stcp_output->ipath, &realhost, &filename);
         if (realhost == 0) {
            serrno = SEINTERNAL;
            Error("FindServerAndPath", "can't open %s, get disk server hostname from %s error %d (%s)",
                  fUrl.GetFile(), stcp_output->ipath, errno, sstrerror(serrno));
            free(stcp_output);
            return;
         }
         // Save real host and internal path
         fDiskServer = realhost;
         if (filename[0] != '/') {
            // Make file 'local' to the host
            fInternalPath  = "/";
            fInternalPath += filename;
         } else {
            fInternalPath = filename;
         }

         if (st.filesize == 0) {
            // Will force notification to stage when the file is closed
            fWrittenTo = kTRUE;
         }
      }

      // Set the protocol prefix for TNetFile.
      // For the cern.ch domain we set the default authentication
      // method to UidGid, i.e. as for rfiod, unless there is a specific
      // request (from options or envs); for this we need
      // the full FQDN or address in "nnn.mmm.iii.jjj" form
      TString r = fAuthProto;
      if (fAuthProto == "root") {
         TString fqdn;
         TInetAddress addr = gSystem->GetHostByName(fDiskServer);
         if (addr.IsValid()) {
            fqdn = addr.GetHostName();
            if (fqdn.EndsWith(".cern.ch") || fqdn.BeginsWith("137.138."))
               r = "rootug://";
            else
               r = "root://";
         } else
            r = "root://";
      } else {
         // Fix the format
         r += "://";
      }

      // Update fUrl with new path
      r += fDiskServer + "/";
      r += fInternalPath;
      TUrl rurl(r);
      fUrl = rurl;

      if (gDebug > 0)
         Info("FindServerAndPath"," fDiskServer: %s, r: %s", fDiskServer.Data(), r.Data());

      // Now ipath is not null and contains the real internal path on the disk
      // server 'host', e.g. it is fDiskServer:fInternalPath
      fInternalPath = stcp_output==0?0:stcp_output->ipath;
      if (stcp_output)
         free(stcp_output);
   } else {

#ifdef R__CASTOR2

      // We use the new stager API
      // I use fname which has the Turl already parsed correctly

      int flags = O_RDONLY;
      int rc;
      struct stage_io_fileresp *response = 0;
      char *requestId = 0, *url = 0;
      char stageerrbuf[1025];

      // Prepare the flags
      if (fOption == "CREATE" || fOption == "RECREATE" || fOption == "UPDATE")
         flags |= O_RDWR;
      if (fOption == "CREATE" || fOption == "RECREATE")
         flags |= O_CREAT | O_TRUNC;

      stage_seterrbuf(stageerrbuf, 1024);

      int* auxVal;
      char ** auxPoint;
      struct stage_options opts;
      opts.stage_host=0;
      opts.stage_port=0;
      opts.service_class=0;
      opts.stage_version=0;

      void *ptrPoint = &auxPoint;
      void *ptrVal = &auxVal;
      int ret=Cglobals_get(& tStageHostKey, (void**)ptrPoint,sizeof(void*));
      if(ret==0){
         opts.stage_host=*auxPoint;
      }
      ret=Cglobals_get(& tStagePortKey, (void**)ptrVal,sizeof(int));
      if(ret==0){
         opts.stage_port=*auxVal;
      }
      opts.stage_version=2;
      ret=Cglobals_get(& tSvcClassKey, (void**)ptrPoint,sizeof(void*));
      if (ret==0){
         opts.service_class=*auxPoint;
      }

      // in stage_open I use the fname which is the result of the rfio_parsing
      rc = stage_open(0,
                      MOVER_PROTOCOL_ROOT,
                      (char *)fname.Data(),
                      flags,
                      (mode_t) 0666,
                      0,
                      &response,
                      &requestId,
                      &opts); // global values used as options

      if (rc != 0) {
         Error("FindServerAndPath", "stage_open failed: %s (%s)",
               sstrerror(serrno), stageerrbuf);
         if (response) free(response);
         if (requestId) free(requestId);
         return;
      }

      if (response == 0) {
         Error("FindServerAndPath", "response was null for %s (Request %s) %d/%s",
               fname.Data(), requestId,
               serrno, sstrerror(serrno));
         if (requestId) free(requestId);
         return;
      }

      if (response->errorCode != 0) {
         serrno = response->errorCode;
         Error("FindServerAndPath", "error getting file %s (Request %s) %d/%s",
               fname.Data(), requestId,
               serrno, sstrerror(serrno));
         free(response);
         if (requestId) free(requestId);
         return;
      }

      url = stage_geturl(response);

      if (url == 0) {
         Error("FindServerAndPath", "error getting file %s (Request %s) %d/%s",
               fname.Data(), requestId,
               serrno, sstrerror(serrno));
         free(response);
         if (requestId) free(requestId);
         return;
      }

      TUrl rurl(url);
      // Set the protocol prefix for TNetFile.
      // For the cern.ch domain we set the default authentication
      // method to UidGid, i.e. as for rfiod, unless there is a specific
      // request (from options or envs); for this we need
      // the full FQDN or address in "nnn.mmm.iii.jjj" form
      TString p = fAuthProto;
      if (fAuthProto == "root") {
         TString fqdn = rurl.GetHostFQDN();
         if (fqdn.EndsWith(".cern.ch") || fqdn.BeginsWith("137.138."))
            fAuthProto = "rootug";
      }

      // Update protocol and fUrl
      rurl.SetProtocol(fAuthProto);
      fUrl = rurl;

      if (response) free(response);
      if (url) free(url);
      if (requestId) free(requestId);
#endif

   }

   fIsCastor = kTRUE;
}

//______________________________________________________________________________
Int_t TCastorFile::SysClose(Int_t fd)
{
   // Close currently open file.

   Int_t r = TNetFile::SysClose(fd);

   if (!UseCastor2API()) {
      if (fIsCastor && fWrittenTo) {
#ifndef R__CASTOR2
         // CASTOR file was created or modified
         rfio_HsmIf_reqtoput((char *)fInternalPath.Data());
#endif
         fWrittenTo = kFALSE;
      }
   }

   return r;
}

//______________________________________________________________________________
Bool_t TCastorFile::WriteBuffer(const char *buf, Int_t len)
{
   // Write specified byte range to remote file via rootd daemon.
   // Returns kTRUE in case of error.

   if (TNetFile::WriteBuffer(buf, len))
      return kTRUE;

   if (!UseCastor2API()) {
      if (fIsCastor && !fWrittenTo && len > 0) {
         stage_hsm_t hsmfile;

         // Change status of file in stage catalog from STAGED to STAGEOUT
         memset(&hsmfile, 0, sizeof(hsmfile));
         hsmfile.upath = StrDup(fInternalPath);
         if (stage_updc_filchg(0, &hsmfile) < 0) {
            Error("WriteBuffer", "error calling stage_updc_filchg");
            delete [] hsmfile.upath;
            return kTRUE;
         }
         delete [] hsmfile.upath;
         fWrittenTo = kTRUE;
      }
   }

   return kFALSE;
}

//______________________________________________________________________________
void TCastorFile::ConnectServer(Int_t *stat, EMessageTypes *kind, Int_t netopt,
                                Int_t tcpwindowsize, Bool_t forceOpen,
                                Bool_t forceRead)
{
   // Connect to remote rootd server on CASTOR disk server.

   FindServerAndPath();

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