ROOT logo
// @(#)root/net:$Id$
// Author: Adrien Devresse and Fabrizio Furano

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TDavixSystem                                                         //
//                                                                      //
// A TSystem specialization for HTTP and WebDAV                         //
// It supports HTTP and HTTPS in a number of dialects and options       //
//  e.g. S3 is one of them                                              //
// Other caracteristics come from the full support of Davix,            //
//  e.g. full redirection support in any circumstance                   //
//                                                                      //
// Authors:     Adrien Devresse (CERN IT/SDC)                           //
//              Fabrizio Furano (CERN IT/SDC)                           //
//                                                                      //
// September 2013                                                       //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TDavixSystem.h"
#include "TROOT.h"
#include "TSocket.h"
#include "Bytes.h"
#include "TError.h"
#include "TSystem.h"
#include "TEnv.h"
#include "TBase64.h"
#include "TVirtualPerfStats.h"
#include "TDavixFileInternal.h"
#include "TSocket.h"

#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <davix.hpp>
#include <sstream>
#include <string>
#include <cstring>


extern const std::string VERSION;
extern const std::string gUserAgent;

// The prefix that is used to find the variables in the gEnv
#define ENVPFX "Davix."

ClassImp(TDavixSystem)

using namespace Davix;

extern const char* grid_mode_opt;
extern const char* ca_check_opt;
extern const char* s3_seckey_opt;
extern const char* s3_acckey_opt;

//____________________________________________________________________________
TDavixSystem::TDavixSystem(const char *url) :
   TSystem(url),
   d_ptr(new TDavixFileInternal(url, "WEB"))
{
   d_ptr->init();
   SetTitle("WebDAV system administration");
}

//____________________________________________________________________________
TDavixSystem::TDavixSystem() :
   TSystem(),
   d_ptr(new TDavixFileInternal("", "WEB"))
{
   d_ptr->init();
   SetTitle("WebDAV system administration");
}

//____________________________________________________________________________
TDavixSystem::~TDavixSystem()
{
   SafeDelete(d_ptr);
}

//____________________________________________________________________________
void TDavixSystem::FreeDirectory(void *dirp)
{
   d_ptr->davixPosix->closedir(static_cast<DAVIX_DIR *>(dirp), NULL);
   d_ptr->removeDird(dirp);
}

//____________________________________________________________________________
const char *TDavixSystem::GetDirEntry(void *dirp)
{
   struct dirent *dir;
   DavixError *davixErr = NULL;
   if (((dir = d_ptr->davixPosix->readdir(static_cast<DAVIX_DIR *>(dirp), &davixErr)) == NULL)
         && (davixErr != NULL)) {
      Error("DavixReaddir", "failed to readdir the directory: %s (%d)",
            davixErr->getErrMsg().c_str(), davixErr->getStatus());
      DavixError::clearError(&davixErr);
   }
   return (dir) ? (dir->d_name) : NULL;
}

//____________________________________________________________________________
void *TDavixSystem::OpenDirectory(const char *dir)
{
   DavixError *davixErr = NULL;
   DAVIX_DIR *d;
   if ((d = d_ptr->davixPosix->opendir(d_ptr->davixParam, dir, &davixErr)) == NULL) {
      Error("DavixOpendir", "failed to opendir the directory: %s (%d)",
            davixErr->getErrMsg().c_str(), davixErr->getStatus());
      DavixError::clearError(&davixErr);
   } else {
      d_ptr->addDird(d);
   }
   return d;
}

//____________________________________________________________________________
Bool_t TDavixSystem::ConsistentWith(const char * /*path*/, void *dirptr)
{
   return (Bool_t) d_ptr->isMyDird(dirptr);
}

//____________________________________________________________________________
Int_t TDavixSystem::GetPathInfo(const char *path, FileStat_t &buf)
{
   struct stat st;

   if (!d_ptr->DavixStat(path, &st)) return 1;
   buf.fDev = 0;
   buf.fIno = 0;
   buf.fMode = st.st_mode; // protection (combination of EFileModeMask bits)

   buf.fUid = st.st_uid; // user id of owner
   buf.fGid = st.st_gid; // group id of owner
   buf.fSize = st.st_size; // total size in bytes
   buf.fMtime = st.st_mtime; // modification date
   buf.fIsLink = kFALSE; // symbolic link
   buf.fUrl = path; // end point url of file

   return 0;
}

//____________________________________________________________________________
Bool_t TDavixSystem::IsPathLocal(const char *path)
{
   (void) path;
   return kFALSE;
}

//____________________________________________________________________________
Int_t TDavixSystem::Locate(const char *path, TString &endurl)
{
   DavixError *davixErr = NULL;
   ssize_t ret;
   ReplicaVec vecRep;
   DavFile f(*d_ptr->davixContext, Uri(path));
   if ((ret = f.getAllReplicas(d_ptr->davixParam,
                               vecRep,
                               &davixErr)) < 0) {
      Error("DavixLocate", "failed to Locate file: %s (%d)",
            davixErr->getErrMsg().c_str(), davixErr->getStatus());
      DavixError::clearError(&davixErr);
      return 1;
   }
   if (vecRep.size() > 0) {
      endurl = vecRep[0].uri.getString().c_str();
   } else {
      endurl = path;
   }
   if (gDebug > 0)
      Info("DavixLocate", "Davix Locate %s to %s", path, endurl.Data());

   return 0;
}

//____________________________________________________________________________
Int_t TDavixSystem::MakeDirectory(const char *dir)
{
   DavixError *davixErr = NULL;
   int ret;
   if ((ret = d_ptr->davixPosix->mkdir(d_ptr->davixParam, dir, 0755, &davixErr))  < 0) {
      Error("DavixMkdir", "failed to create the directory: %s (%d)",
            davixErr->getErrMsg().c_str(), davixErr->getStatus());
      DavixError::clearError(&davixErr);
   }
   return ret;
}

//____________________________________________________________________________
int TDavixSystem::Unlink(const char *path)
{
   DavixError *davixErr = NULL;
   int ret;
   if ((ret = d_ptr->davixPosix->unlink(d_ptr->davixParam, path, &davixErr))  < 0) {
      Error("DavixUnlink", "failed to unlink the file: %s (%d)",
            davixErr->getErrMsg().c_str(), davixErr->getStatus());
      DavixError::clearError(&davixErr);
   }
   return ret;
}
 TDavixSystem.cxx:1
 TDavixSystem.cxx:2
 TDavixSystem.cxx:3
 TDavixSystem.cxx:4
 TDavixSystem.cxx:5
 TDavixSystem.cxx:6
 TDavixSystem.cxx:7
 TDavixSystem.cxx:8
 TDavixSystem.cxx:9
 TDavixSystem.cxx:10
 TDavixSystem.cxx:11
 TDavixSystem.cxx:12
 TDavixSystem.cxx:13
 TDavixSystem.cxx:14
 TDavixSystem.cxx:15
 TDavixSystem.cxx:16
 TDavixSystem.cxx:17
 TDavixSystem.cxx:18
 TDavixSystem.cxx:19
 TDavixSystem.cxx:20
 TDavixSystem.cxx:21
 TDavixSystem.cxx:22
 TDavixSystem.cxx:23
 TDavixSystem.cxx:24
 TDavixSystem.cxx:25
 TDavixSystem.cxx:26
 TDavixSystem.cxx:27
 TDavixSystem.cxx:28
 TDavixSystem.cxx:29
 TDavixSystem.cxx:30
 TDavixSystem.cxx:31
 TDavixSystem.cxx:32
 TDavixSystem.cxx:33
 TDavixSystem.cxx:34
 TDavixSystem.cxx:35
 TDavixSystem.cxx:36
 TDavixSystem.cxx:37
 TDavixSystem.cxx:38
 TDavixSystem.cxx:39
 TDavixSystem.cxx:40
 TDavixSystem.cxx:41
 TDavixSystem.cxx:42
 TDavixSystem.cxx:43
 TDavixSystem.cxx:44
 TDavixSystem.cxx:45
 TDavixSystem.cxx:46
 TDavixSystem.cxx:47
 TDavixSystem.cxx:48
 TDavixSystem.cxx:49
 TDavixSystem.cxx:50
 TDavixSystem.cxx:51
 TDavixSystem.cxx:52
 TDavixSystem.cxx:53
 TDavixSystem.cxx:54
 TDavixSystem.cxx:55
 TDavixSystem.cxx:56
 TDavixSystem.cxx:57
 TDavixSystem.cxx:58
 TDavixSystem.cxx:59
 TDavixSystem.cxx:60
 TDavixSystem.cxx:61
 TDavixSystem.cxx:62
 TDavixSystem.cxx:63
 TDavixSystem.cxx:64
 TDavixSystem.cxx:65
 TDavixSystem.cxx:66
 TDavixSystem.cxx:67
 TDavixSystem.cxx:68
 TDavixSystem.cxx:69
 TDavixSystem.cxx:70
 TDavixSystem.cxx:71
 TDavixSystem.cxx:72
 TDavixSystem.cxx:73
 TDavixSystem.cxx:74
 TDavixSystem.cxx:75
 TDavixSystem.cxx:76
 TDavixSystem.cxx:77
 TDavixSystem.cxx:78
 TDavixSystem.cxx:79
 TDavixSystem.cxx:80
 TDavixSystem.cxx:81
 TDavixSystem.cxx:82
 TDavixSystem.cxx:83
 TDavixSystem.cxx:84
 TDavixSystem.cxx:85
 TDavixSystem.cxx:86
 TDavixSystem.cxx:87
 TDavixSystem.cxx:88
 TDavixSystem.cxx:89
 TDavixSystem.cxx:90
 TDavixSystem.cxx:91
 TDavixSystem.cxx:92
 TDavixSystem.cxx:93
 TDavixSystem.cxx:94
 TDavixSystem.cxx:95
 TDavixSystem.cxx:96
 TDavixSystem.cxx:97
 TDavixSystem.cxx:98
 TDavixSystem.cxx:99
 TDavixSystem.cxx:100
 TDavixSystem.cxx:101
 TDavixSystem.cxx:102
 TDavixSystem.cxx:103
 TDavixSystem.cxx:104
 TDavixSystem.cxx:105
 TDavixSystem.cxx:106
 TDavixSystem.cxx:107
 TDavixSystem.cxx:108
 TDavixSystem.cxx:109
 TDavixSystem.cxx:110
 TDavixSystem.cxx:111
 TDavixSystem.cxx:112
 TDavixSystem.cxx:113
 TDavixSystem.cxx:114
 TDavixSystem.cxx:115
 TDavixSystem.cxx:116
 TDavixSystem.cxx:117
 TDavixSystem.cxx:118
 TDavixSystem.cxx:119
 TDavixSystem.cxx:120
 TDavixSystem.cxx:121
 TDavixSystem.cxx:122
 TDavixSystem.cxx:123
 TDavixSystem.cxx:124
 TDavixSystem.cxx:125
 TDavixSystem.cxx:126
 TDavixSystem.cxx:127
 TDavixSystem.cxx:128
 TDavixSystem.cxx:129
 TDavixSystem.cxx:130
 TDavixSystem.cxx:131
 TDavixSystem.cxx:132
 TDavixSystem.cxx:133
 TDavixSystem.cxx:134
 TDavixSystem.cxx:135
 TDavixSystem.cxx:136
 TDavixSystem.cxx:137
 TDavixSystem.cxx:138
 TDavixSystem.cxx:139
 TDavixSystem.cxx:140
 TDavixSystem.cxx:141
 TDavixSystem.cxx:142
 TDavixSystem.cxx:143
 TDavixSystem.cxx:144
 TDavixSystem.cxx:145
 TDavixSystem.cxx:146
 TDavixSystem.cxx:147
 TDavixSystem.cxx:148
 TDavixSystem.cxx:149
 TDavixSystem.cxx:150
 TDavixSystem.cxx:151
 TDavixSystem.cxx:152
 TDavixSystem.cxx:153
 TDavixSystem.cxx:154
 TDavixSystem.cxx:155
 TDavixSystem.cxx:156
 TDavixSystem.cxx:157
 TDavixSystem.cxx:158
 TDavixSystem.cxx:159
 TDavixSystem.cxx:160
 TDavixSystem.cxx:161
 TDavixSystem.cxx:162
 TDavixSystem.cxx:163
 TDavixSystem.cxx:164
 TDavixSystem.cxx:165
 TDavixSystem.cxx:166
 TDavixSystem.cxx:167
 TDavixSystem.cxx:168
 TDavixSystem.cxx:169
 TDavixSystem.cxx:170
 TDavixSystem.cxx:171
 TDavixSystem.cxx:172
 TDavixSystem.cxx:173
 TDavixSystem.cxx:174
 TDavixSystem.cxx:175
 TDavixSystem.cxx:176
 TDavixSystem.cxx:177
 TDavixSystem.cxx:178
 TDavixSystem.cxx:179
 TDavixSystem.cxx:180
 TDavixSystem.cxx:181
 TDavixSystem.cxx:182
 TDavixSystem.cxx:183
 TDavixSystem.cxx:184
 TDavixSystem.cxx:185
 TDavixSystem.cxx:186
 TDavixSystem.cxx:187
 TDavixSystem.cxx:188
 TDavixSystem.cxx:189
 TDavixSystem.cxx:190
 TDavixSystem.cxx:191
 TDavixSystem.cxx:192
 TDavixSystem.cxx:193
 TDavixSystem.cxx:194
 TDavixSystem.cxx:195
 TDavixSystem.cxx:196
 TDavixSystem.cxx:197
 TDavixSystem.cxx:198
 TDavixSystem.cxx:199
 TDavixSystem.cxx:200
 TDavixSystem.cxx:201
 TDavixSystem.cxx:202
 TDavixSystem.cxx:203
 TDavixSystem.cxx:204
 TDavixSystem.cxx:205
 TDavixSystem.cxx:206
 TDavixSystem.cxx:207
 TDavixSystem.cxx:208
 TDavixSystem.cxx:209