XRootD
Loading...
Searching...
No Matches
XrdClFS.cc File Reference
#include "XrdCl/XrdClFileSystem.hh"
#include "XrdCl/XrdClFileSystemUtils.hh"
#include "XrdCl/XrdClFSExecutor.hh"
#include "XrdCl/XrdClURL.hh"
#include "XrdCl/XrdClLog.hh"
#include "XrdCl/XrdClDefaultEnv.hh"
#include "XrdCl/XrdClConstants.hh"
#include "XrdCl/XrdClUtils.hh"
#include "XrdCl/XrdClCopyProcess.hh"
#include "XrdCl/XrdClFile.hh"
#include "XrdCl/XrdClFileSystemOperations.hh"
#include "XrdCl/XrdClParallelOperation.hh"
#include "XrdOuc/XrdOucPrivateUtils.hh"
#include "XrdSys/XrdSysE2T.hh"
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <iomanip>
#include <cmath>
Include dependency graph for XrdClFS.cc:

Go to the source code of this file.

Classes

class  ProgressDisplay

Functions

void add_history (const char *)
XRootDStatus BuildPath (std::string &newPath, Env *env, const std::string &path)
std::string BuildPrompt (Env *env, const URL &url)
XRootDStatus ConvertMode (Access::Mode &mode, const std::string &modeStr)
FSExecutorCreateExecutor (const URL &url)
XRootDStatus DoCache (FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
XRootDStatus DoCat (FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
XRootDStatus DoCD (FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
XRootDStatus DoChMod (FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
XRootDStatus DoLocate (FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
XRootDStatus DoLS (FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
XRootDStatus DoMkDir (FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
XRootDStatus DoMv (FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
XRootDStatus DoPrepare (FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
XRootDStatus DoQuery (FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
XRootDStatus DoRm (FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
XRootDStatus DoRmDir (FileSystem *query, Env *env, const FSExecutor::CommandParams &args)
XRootDStatus DoSpaceInfo (FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
XRootDStatus DoStat (FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
XRootDStatus DoStatVFS (FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
XRootDStatus DoTail (FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
XRootDStatus DoTruncate (FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
XRootDStatus DoXAttr (FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
int ExecuteCommand (const URL &url, int argc, char **argv)
int ExecuteCommand (FSExecutor *ex, int argc, char **argv)
int ExecuteInteractive (const URL &url, bool noCwd=false)
bool getArguments (std::vector< std::string > &result, const std::string &input)
std::string getSizeStr (uint64_t size, bool human, uint64_t base)
int main (int argc, char **argv)
uint32_t nbDigits (uint64_t nb)
void PrintDirListStatInfo (StatInfo *info, bool hascks=false, uint32_t ownerwidth=0, uint32_t groupwidth=0, uint32_t sizewidth=0, bool human=false, uint64_t base=1000)
XRootDStatus PrintHelp (FileSystem *, Env *, const FSExecutor::CommandParams &)
XRootDStatus ProcessStatQuery (StatInfo &info, const std::string &query)
int read_history (const char *)
char * readline (const char *prompt)
void rl_bind_key (char, uint16_t)
int write_history (const char *)

Variables

uint16_t rl_insert = 0

Function Documentation

◆ add_history()

void add_history ( const char * )

Definition at line 2172 of file XrdClFS.cc.

2173{
2174}

Referenced by ExecuteInteractive().

Here is the caller graph for this function:

◆ BuildPath()

XRootDStatus BuildPath ( std::string & newPath,
Env * env,
const std::string & path )

Definition at line 56 of file XrdClFS.cc.

58{
59 if( path.empty() )
61
62 int noCwd = 0;
63 env->GetInt( "NoCWD", noCwd );
64
65 if( path[0] == '/' || noCwd )
66 {
67 newPath = path;
68 return XRootDStatus();
69 }
70
71 std::string cwd = "/";
72 env->GetString( "CWD", cwd );
73 newPath = cwd;
74 newPath += "/";
75 newPath += path;
76
77 //----------------------------------------------------------------------------
78 // Collapse the dots
79 //----------------------------------------------------------------------------
80 std::list<std::string> pathComponents;
81 std::list<std::string>::iterator it;
82 XrdCl::Utils::splitString( pathComponents, newPath, "/" );
83 newPath = "/";
84 for( it = pathComponents.begin(); it != pathComponents.end(); )
85 {
86 if( *it == "." )
87 {
88 it = pathComponents.erase( it );
89 continue;
90 }
91
92 if( *it == ".." )
93 {
94 if( it == pathComponents.begin() )
96 std::list<std::string>::iterator it1 = it;
97 --it1;
98 it = pathComponents.erase( it1 );
99 it = pathComponents.erase( it );
100 continue;
101 }
102 ++it;
103 }
104
105 newPath = "/";
106 for( it = pathComponents.begin(); it != pathComponents.end(); ++it )
107 {
108 newPath += *it;
109 newPath += "/";
110 }
111 if( newPath.length() > 1 )
112 newPath.erase( newPath.length()-1, 1 );
113
114 return XRootDStatus();
115}
bool GetString(const std::string &key, std::string &value)
Definition XrdClEnv.cc:31
bool GetInt(const std::string &key, int &value)
Definition XrdClEnv.cc:89
static void splitString(Container &result, const std::string &input, const std::string &delimiter)
Split a string.
Definition XrdClUtils.hh:56
const uint16_t stError
An error occurred that could potentially be retried.
const uint16_t errInvalidArgs

References XrdCl::errInvalidArgs, XrdCl::Env::GetInt(), XrdCl::Env::GetString(), XrdCl::Utils::splitString(), and XrdCl::stError.

Referenced by DoCache(), DoCat(), DoCD(), DoChMod(), DoLocate(), DoLS(), DoMkDir(), DoMv(), DoQuery(), DoRm(), DoRmDir(), DoStat(), DoStatVFS(), DoTail(), DoTruncate(), and DoXAttr().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ BuildPrompt()

std::string BuildPrompt ( Env * env,
const URL & url )

Definition at line 2196 of file XrdClFS.cc.

2197{
2198 std::ostringstream prompt;
2199 std::string cwd = "/";
2200 env->GetString( "CWD", cwd );
2201 prompt << "[" << url.GetHostId() << "] " << cwd << " > ";
2202 return prompt.str();
2203}
std::string GetHostId() const
Get the host part of the URL (user:password@host:port).
Definition XrdClURL.hh:99

References XrdCl::URL::GetHostId(), and XrdCl::Env::GetString().

Referenced by ExecuteInteractive().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ConvertMode()

XRootDStatus ConvertMode ( Access::Mode & mode,
const std::string & modeStr )

Definition at line 120 of file XrdClFS.cc.

121{
122 if( modeStr.length() != 9 )
124
125 mode = Access::None;
126 for( int i = 0; i < 3; ++i )
127 {
128 if( modeStr[i] == 'r' )
129 mode |= Access::UR;
130 else if( modeStr[i] == 'w' )
131 mode |= Access::UW;
132 else if( modeStr[i] == 'x' )
133 mode |= Access::UX;
134 else if( modeStr[i] != '-' )
136 }
137 for( int i = 3; i < 6; ++i )
138 {
139 if( modeStr[i] == 'r' )
140 mode |= Access::GR;
141 else if( modeStr[i] == 'w' )
142 mode |= Access::GW;
143 else if( modeStr[i] == 'x' )
144 mode |= Access::GX;
145 else if( modeStr[i] != '-' )
147 }
148 for( int i = 6; i < 9; ++i )
149 {
150 if( modeStr[i] == 'r' )
151 mode |= Access::OR;
152 else if( modeStr[i] == 'w' )
153 mode |= Access::OW;
154 else if( modeStr[i] == 'x' )
155 mode |= Access::OX;
156 else if( modeStr[i] != '-' )
158 }
159 return XRootDStatus();
160}
@ OX
world executable/browsable
@ OW
world writeable
@ UR
owner readable
@ GR
group readable
@ UW
owner writable
@ GX
group executable/browsable
@ GW
group writable
@ UX
owner executable/browsable
@ OR
world readable

References XrdCl::errInvalidArgs, XrdCl::Access::GR, XrdCl::Access::GW, XrdCl::Access::GX, XrdCl::Access::None, XrdCl::Access::OR, XrdCl::Access::OW, XrdCl::Access::OX, XrdCl::stError, XrdCl::Access::UR, XrdCl::Access::UW, and XrdCl::Access::UX.

Referenced by DoChMod(), and DoMkDir().

Here is the caller graph for this function:

◆ CreateExecutor()

FSExecutor * CreateExecutor ( const URL & url)

Definition at line 2108 of file XrdClFS.cc.

2109{
2110 Env *env = new Env();
2111 env->PutString( "CWD", "/" );
2112 FSExecutor *executor = new FSExecutor( url, env );
2113 executor->AddCommand( "cache", DoCache );
2114 executor->AddCommand( "cd", DoCD );
2115 executor->AddCommand( "chmod", DoChMod );
2116 executor->AddCommand( "ls", DoLS );
2117 executor->AddCommand( "help", PrintHelp );
2118 executor->AddCommand( "stat", DoStat );
2119 executor->AddCommand( "statvfs", DoStatVFS );
2120 executor->AddCommand( "locate", DoLocate );
2121 executor->AddCommand( "mv", DoMv );
2122 executor->AddCommand( "mkdir", DoMkDir );
2123 executor->AddCommand( "rm", DoRm );
2124 executor->AddCommand( "rmdir", DoRmDir );
2125 executor->AddCommand( "query", DoQuery );
2126 executor->AddCommand( "truncate", DoTruncate );
2127 executor->AddCommand( "prepare", DoPrepare );
2128 executor->AddCommand( "cat", DoCat );
2129 executor->AddCommand( "tail", DoTail );
2130 executor->AddCommand( "spaceinfo", DoSpaceInfo );
2131 executor->AddCommand( "xattr", DoXAttr );
2132 return executor;
2133}
XRootDStatus DoQuery(FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
Definition XrdClFS.cc:1243
XRootDStatus DoLocate(FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
Definition XrdClFS.cc:849
XRootDStatus DoMkDir(FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
Definition XrdClFS.cc:524
XRootDStatus DoRmDir(FileSystem *query, Env *env, const FSExecutor::CommandParams &args)
Definition XrdClFS.cc:587
XRootDStatus DoRm(FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
Definition XrdClFS.cc:680
XRootDStatus DoTail(FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
Definition XrdClFS.cc:1620
XRootDStatus DoStat(FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
Definition XrdClFS.cc:1045
XRootDStatus DoCat(FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
Definition XrdClFS.cc:1505
XRootDStatus DoMv(FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
Definition XrdClFS.cc:628
XRootDStatus DoPrepare(FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
Definition XrdClFS.cc:1350
XRootDStatus DoChMod(FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
Definition XrdClFS.cc:800
XRootDStatus DoLS(FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
Definition XrdClFS.cc:348
XRootDStatus DoCD(FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
Definition XrdClFS.cc:227
XRootDStatus DoXAttr(FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
Definition XrdClFS.cc:1792
XRootDStatus DoStatVFS(FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
Definition XrdClFS.cc:1181
XRootDStatus DoCache(FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
Definition XrdClFS.cc:165
XRootDStatus DoSpaceInfo(FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
Definition XrdClFS.cc:1749
XRootDStatus DoTruncate(FileSystem *fs, Env *env, const FSExecutor::CommandParams &args)
Definition XrdClFS.cc:751
XRootDStatus PrintHelp(FileSystem *, Env *, const FSExecutor::CommandParams &)
Definition XrdClFS.cc:1956
bool PutString(const std::string &key, const std::string &value)
Definition XrdClEnv.cc:52
Execute queries given as a commandline.
bool AddCommand(const std::string &name, Command command)

References XrdCl::FSExecutor::AddCommand(), DoCache(), DoCat(), DoCD(), DoChMod(), DoLocate(), DoLS(), DoMkDir(), DoMv(), DoPrepare(), DoQuery(), DoRm(), DoRmDir(), DoSpaceInfo(), DoStat(), DoStatVFS(), DoTail(), DoTruncate(), DoXAttr(), PrintHelp(), and XrdCl::Env::PutString().

Referenced by ExecuteCommand(), and ExecuteInteractive().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoCache()

XRootDStatus DoCache ( FileSystem * fs,
Env * env,
const FSExecutor::CommandParams & args )

Definition at line 165 of file XrdClFS.cc.

168{
169 //----------------------------------------------------------------------------
170 // Check up the args
171 //----------------------------------------------------------------------------
172 Log *log = DefaultEnv::GetLog();
173 uint32_t argc = args.size();
174
175 if( argc != 3 )
176 {
177 log->Error( AppMsg, "Wrong number of arguments." );
179 "Wrong number of arguments." );
180 }
181
182 if( args[1] != "evict" && args[1] != "fevict")
183 {
184 log->Error( AppMsg, "Invalid cache operation." );
185 return XRootDStatus( stError, errInvalidArgs, 0, "Invalid cache operation." );
186 }
187
188 std::string fullPath;
189 if( !BuildPath( fullPath, env, args[2] ).IsOK() )
190 {
191 log->Error( AppMsg, "Invalid cache path." );
192 return XRootDStatus( stError, errInvalidArgs, 0, "Invalid cache path." );
193 }
194
195 //----------------------------------------------------------------------------
196 // Create the command
197 //----------------------------------------------------------------------------
198 std::string cmd = args[1];
199 cmd.append(" ");
200 cmd.append(fullPath);
201
202 //----------------------------------------------------------------------------
203 // Run the operation
204 //----------------------------------------------------------------------------
205 Buffer *response = 0;
206 XRootDStatus st = fs->SendCache( cmd, response );
207 if( !st.IsOK() )
208 {
209 log->Error( AppMsg, "Unable set cache %s: %s",
210 fullPath.c_str(),
211 st.ToStr().c_str() );
212 return st;
213 }
214
215 if( response )
216 {
217 std::cout << response->ToString() << '\n';
218 }
219
220 delete response;
221
222 return XRootDStatus();
223}
XRootDStatus BuildPath(std::string &newPath, Env *env, const std::string &path)
Definition XrdClFS.cc:56
Binary blob representation.
std::string ToString() const
Convert the buffer to a string.
static Log * GetLog()
Get default log.
XRootDStatus SendCache(const std::string &info, ResponseHandler *handler, time_t timeout=0) XRD_WARN_UNUSED_RESULT
Handle diagnostics.
Definition XrdClLog.hh:101
void Error(uint64_t topic, const char *format,...)
Report an error.
Definition XrdClLog.cc:231
std::string ToStr() const
Convert to string.
const uint64_t AppMsg
bool IsOK() const
We're fine.

References XrdCl::AppMsg, BuildPath(), XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::DefaultEnv::GetLog(), XrdCl::Status::IsOK(), XrdCl::FileSystem::SendCache(), XrdCl::stError, XrdCl::XRootDStatus::ToStr(), and XrdCl::Buffer::ToString().

Referenced by CreateExecutor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoCat()

XRootDStatus DoCat ( FileSystem * fs,
Env * env,
const FSExecutor::CommandParams & args )

Definition at line 1505 of file XrdClFS.cc.

1508{
1509 //----------------------------------------------------------------------------
1510 // Check up the args
1511 //----------------------------------------------------------------------------
1512 Log *log = DefaultEnv::GetLog();
1513 uint32_t argc = args.size();
1514
1515 if( argc < 2 )
1516 {
1517 log->Error( AppMsg, "Wrong number of arguments." );
1519 }
1520
1521 std::string server;
1522 env->GetString( "ServerURL", server );
1523 if( server.empty() )
1524 {
1525 log->Error( AppMsg, "Invalid address: \"%s\".", server.c_str() );
1527 }
1528
1529 std::vector<std::string> remotes;
1530 std::string local;
1531
1532 for( uint32_t i = 1; i < args.size(); ++i )
1533 {
1534 if( args[i] == "-o" )
1535 {
1536 if( i < args.size()-1 )
1537 {
1538 local = args[i+1];
1539 ++i;
1540 }
1541 else
1542 {
1543 log->Error( AppMsg, "Parameter '-o' requires an argument." );
1545 }
1546 }
1547 else
1548 remotes.emplace_back( args[i] );
1549 }
1550
1551 if( !local.empty() && remotes.size() > 1 )
1552 {
1553 log->Error( AppMsg, "If '-o' is used only can be used with only one remote file." );
1555 }
1556
1557 std::vector<URL> remoteUrls;
1558 remoteUrls.reserve( remotes.size() );
1559 for( auto &remote : remotes )
1560 {
1561 std::string remoteFile;
1562 if( !BuildPath( remoteFile, env, remote ).IsOK() )
1563 {
1564 log->Error( AppMsg, "Invalid path." );
1566 }
1567
1568 remoteUrls.emplace_back( server );
1569 remoteUrls.back().SetPath( remoteFile );
1570 }
1571
1572 //----------------------------------------------------------------------------
1573 // Fetch the data
1574 //----------------------------------------------------------------------------
1575 CopyProgressHandler *handler = 0; ProgressDisplay d;
1576 CopyProcess process;
1577 std::vector<PropertyList> props( remoteUrls.size() ), results( remoteUrls.size() );
1578
1579 for( size_t i = 0; i < remoteUrls.size(); ++i )
1580 {
1581 props[i].Set( "source", remoteUrls[i].GetURL() );
1582 if( !local.empty() )
1583 {
1584 props[i].Set( "target", std::string( "file://" ) + local );
1585 handler = &d;
1586 }
1587 else
1588 props[i].Set( "target", "stdio://-" );
1589
1590 props[i].Set( "dynamicSource", true );
1591
1592 XRootDStatus st = process.AddJob( props[i], &results[i] );
1593 if( !st.IsOK() )
1594 {
1595 log->Error( AppMsg, "Job adding failed: %s.", st.ToStr().c_str() );
1596 return st;
1597 }
1598 }
1599
1600 XRootDStatus st = process.Prepare();
1601 if( !st.IsOK() )
1602 {
1603 log->Error( AppMsg, "Copy preparation failed: %s.", st.ToStr().c_str() );
1604 return st;
1605 }
1606
1607 st = process.Run(handler);
1608 if( !st.IsOK() )
1609 {
1610 log->Error( AppMsg, "Cope process failed: %s.", st.ToStr().c_str() );
1611 return st;
1612 }
1613
1614 return XRootDStatus();
1615}
Copy the data from one point to another.
XRootDStatus Run(CopyProgressHandler *handler)
Run the copy jobs.
XRootDStatus AddJob(const PropertyList &properties, PropertyList *results)
Interface for copy progress notification.
const uint16_t errInvalidAddr

References XrdCl::CopyProcess::AddJob(), XrdCl::AppMsg, BuildPath(), XrdCl::errInvalidAddr, XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::DefaultEnv::GetLog(), XrdCl::Env::GetString(), XrdCl::Status::IsOK(), XrdCl::CopyProcess::Prepare(), XrdCl::CopyProcess::Run(), XrdCl::stError, and XrdCl::XRootDStatus::ToStr().

Referenced by CreateExecutor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoCD()

XRootDStatus DoCD ( FileSystem * fs,
Env * env,
const FSExecutor::CommandParams & args )

Definition at line 227 of file XrdClFS.cc.

230{
231 //----------------------------------------------------------------------------
232 // Check up the args
233 //----------------------------------------------------------------------------
234 Log *log = DefaultEnv::GetLog();
235 if( args.size() != 2 )
236 {
237 log->Error( AppMsg, "Invalid arguments. Expected a path." );
239 }
240
241 //----------------------------------------------------------------------------
242 // cd excludes NoCWD
243 //----------------------------------------------------------------------------
244 env->PutInt( "NoCWD", 0 );
245
246 std::string newPath;
247 if( !BuildPath( newPath, env, args[1] ).IsOK() )
248 {
249 log->Error( AppMsg, "Invalid path." );
251 }
252
253 //----------------------------------------------------------------------------
254 // Check if the path exist and is not a directory
255 //----------------------------------------------------------------------------
256 StatInfo *info;
257 XRootDStatus st = fs->Stat( newPath, info );
258 if( !st.IsOK() )
259 {
260 log->Error( AppMsg, "Unable to stat the path: %s", st.ToStr().c_str() );
261 return st;
262 }
263
264 if( !info->TestFlags( StatInfo::IsDir ) )
265 {
266 log->Error( AppMsg, "%s is not a directory.", newPath.c_str() );
268 }
269
270 env->PutString( "CWD", newPath );
271 delete info;
272 return XRootDStatus();
273}
bool PutInt(const std::string &key, int value)
Definition XrdClEnv.cc:110
XRootDStatus Stat(const std::string &path, ResponseHandler *handler, time_t timeout=0) XRD_WARN_UNUSED_RESULT
Object stat info.
bool TestFlags(uint32_t flags) const
Test flags.
@ IsDir
This is a directory.

References XrdCl::AppMsg, BuildPath(), XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::DefaultEnv::GetLog(), XrdCl::StatInfo::IsDir, XrdCl::Status::IsOK(), XrdCl::Env::PutInt(), XrdCl::Env::PutString(), XrdCl::FileSystem::Stat(), XrdCl::stError, XrdCl::StatInfo::TestFlags(), and XrdCl::XRootDStatus::ToStr().

Referenced by CreateExecutor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoChMod()

XRootDStatus DoChMod ( FileSystem * fs,
Env * env,
const FSExecutor::CommandParams & args )

Definition at line 800 of file XrdClFS.cc.

803{
804 //----------------------------------------------------------------------------
805 // Check up the args
806 //----------------------------------------------------------------------------
807 Log *log = DefaultEnv::GetLog();
808 uint32_t argc = args.size();
809
810 if( argc != 3 )
811 {
812 log->Error( AppMsg, "Wrong number of arguments." );
814 }
815
816 std::string fullPath;
817 if( !BuildPath( fullPath, env, args[1] ).IsOK() )
818 {
819 log->Error( AppMsg, "Invalid path." );
821 }
822
824 XRootDStatus st = ConvertMode( mode, args[2] );
825 if( !st.IsOK() )
826 {
827 log->Error( AppMsg, "Invalid mode string." );
828 return st;
829 }
830
831 //----------------------------------------------------------------------------
832 // Run the query
833 //----------------------------------------------------------------------------
834 st = fs->ChMod( fullPath, mode );
835 if( !st.IsOK() )
836 {
837 log->Error( AppMsg, "Unable change mode of %s: %s",
838 fullPath.c_str(),
839 st.ToStr().c_str() );
840 return st;
841 }
842
843 return XRootDStatus();
844}
XRootDStatus ConvertMode(Access::Mode &mode, const std::string &modeStr)
Definition XrdClFS.cc:120
XRootDStatus ChMod(const std::string &path, Access::Mode mode, ResponseHandler *handler, time_t timeout=0) XRD_WARN_UNUSED_RESULT

References XrdCl::AppMsg, BuildPath(), XrdCl::FileSystem::ChMod(), ConvertMode(), XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::DefaultEnv::GetLog(), XrdCl::Status::IsOK(), XrdCl::Access::None, XrdCl::stError, and XrdCl::XRootDStatus::ToStr().

Referenced by CreateExecutor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoLocate()

XRootDStatus DoLocate ( FileSystem * fs,
Env * env,
const FSExecutor::CommandParams & args )

Definition at line 849 of file XrdClFS.cc.

852{
853 //----------------------------------------------------------------------------
854 // Check up the args
855 //----------------------------------------------------------------------------
856 Log *log = DefaultEnv::GetLog();
857 uint32_t argc = args.size();
858
859 if( argc > 4 )
860 {
861 log->Error( AppMsg, "Wrong number of arguments." );
863 }
864
866 std::string path;
867 bool hasPath = false;
868 bool doDeepLocate = false;
869 for( uint32_t i = 1; i < argc; ++i )
870 {
871 if( args[i] == "-n" )
872 flags |= OpenFlags::NoWait;
873 else if( args[i] == "-r" )
874 flags |= OpenFlags::Refresh;
875 else if( args[i] == "-m" || args[i] == "-h" )
876 flags |= OpenFlags::PrefName;
877 else if( args[i] == "-i" )
878 flags |= OpenFlags::Force;
879 else if( args[i] == "-d" )
880 doDeepLocate = true;
881 else if( args[i] == "-p" )
882 {
883 Env *env = DefaultEnv::GetEnv();
884 env->PutInt( "PreserveLocateTried", 0 );
885 }
886 else if( !hasPath )
887 {
888 path = args[i];
889 hasPath = true;
890 }
891 else
892 {
893 log->Error( AppMsg, "Invalid argument: %s.", args[i].c_str() );
895 }
896 }
897
898 std::string fullPath;
899 if( path[0] == '*' )
900 fullPath = path;
901 else
902 {
903 if( !BuildPath( fullPath, env, path ).IsOK() )
904 {
905 log->Error( AppMsg, "Invalid path." );
907 }
908 }
909
910 //----------------------------------------------------------------------------
911 // Run the query
912 //----------------------------------------------------------------------------
913 LocationInfo *info = 0;
914 XRootDStatus st;
915 if( doDeepLocate )
916 st = fs->DeepLocate( fullPath, flags, info );
917 else
918 st = fs->Locate( fullPath, flags, info );
919
920 if( !st.IsOK() )
921 {
922 log->Error( AppMsg, "Unable locate %s: %s",
923 fullPath.c_str(),
924 st.ToStr().c_str() );
925 return st;
926 }
927
928 //----------------------------------------------------------------------------
929 // Print the result
930 //----------------------------------------------------------------------------
931 if( st.code == suPartial )
932 {
933 std::cerr << "[!] Some of the requests failed. The result may be ";
934 std::cerr << "incomplete." << std::endl;
935 }
936
938 for( it = info->Begin(); it != info->End(); ++it )
939 {
940 std::cout << it->GetAddress() << " ";
941 switch( it->GetType() )
942 {
944 std::cout << "Manager ";
945 break;
947 std::cout << "ManagerPending ";
948 break;
950 std::cout << "Server ";
951 break;
953 std::cout << "ServerPending ";
954 break;
955 default:
956 std::cout << "Unknown ";
957 };
958
959 switch( it->GetAccessType() )
960 {
962 std::cout << "Read";
963 break;
965 std::cout << "ReadWrite ";
966 break;
967 default:
968 std::cout << "Unknown ";
969 };
970 std::cout << std::endl;
971 }
972
973 delete info;
974 return XRootDStatus();
975}
static Env * GetEnv()
Get default client environment.
XRootDStatus Locate(const std::string &path, OpenFlags::Flags flags, ResponseHandler *handler, time_t timeout=0) XRD_WARN_UNUSED_RESULT
XRootDStatus DeepLocate(const std::string &path, OpenFlags::Flags flags, ResponseHandler *handler, time_t timeout=0) XRD_WARN_UNUSED_RESULT
Path location info.
Iterator Begin()
Get the location begin iterator.
@ Read
read access is allowed
@ ReadWrite
write access is allowed
@ ServerPending
server node where the file is pending to be online
@ ManagerOnline
manager node where the file is online
@ ServerOnline
server node where the file is online
@ ManagerPending
manager node where the file is pending to be online
LocationList::iterator Iterator
Iterator over locations.
Iterator End()
Get the location end iterator.
const uint16_t suPartial
Flags
Open flags, may be or'd when appropriate.
uint16_t code
Error type, or additional hints on what to do.

References XrdCl::AppMsg, XrdCl::LocationInfo::Begin(), BuildPath(), XrdCl::Status::code, XrdCl::FileSystem::DeepLocate(), XrdCl::LocationInfo::End(), XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::OpenFlags::Force, XrdCl::DefaultEnv::GetEnv(), XrdCl::DefaultEnv::GetLog(), XrdCl::Status::IsOK(), XrdCl::FileSystem::Locate(), XrdCl::LocationInfo::ManagerOnline, XrdCl::LocationInfo::ManagerPending, XrdCl::OpenFlags::None, XrdCl::OpenFlags::NoWait, XrdCl::OpenFlags::PrefName, XrdCl::Env::PutInt(), XrdCl::LocationInfo::Read, XrdCl::LocationInfo::ReadWrite, XrdCl::OpenFlags::Refresh, XrdCl::LocationInfo::ServerOnline, XrdCl::LocationInfo::ServerPending, XrdCl::stError, XrdCl::suPartial, and XrdCl::XRootDStatus::ToStr().

Referenced by CreateExecutor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoLS()

XRootDStatus DoLS ( FileSystem * fs,
Env * env,
const FSExecutor::CommandParams & args )

Definition at line 348 of file XrdClFS.cc.

351{
352 //----------------------------------------------------------------------------
353 // Check up the args
354 //----------------------------------------------------------------------------
355 Log *log = DefaultEnv::GetLog();
356 uint32_t argc = args.size();
357 bool stats = false;
358 bool showUrls = false;
359 bool hascks = false;
360 bool human = false;
361 uint64_t base = 1024;
362 std::string path;
364
365 if( argc > 6 )
366 {
367 log->Error( AppMsg, "Too many arguments." );
369 }
370
371 for( uint32_t i = 1; i < args.size(); ++i )
372 {
373 if( args[i] == "-l" )
374 {
375 stats = true;
376 flags |= DirListFlags::Stat;
377 }
378 else if( args[i] == "-u" )
379 showUrls = true;
380 else if( args[i] == "-R" )
381 {
383 }
384 else if( args[i] == "-D" )
385 {
386 // show duplicates
387 flags &= ~DirListFlags::Merge;
388 }
389 else if( args[i] == "-Z" )
390 {
391 // check if file is a ZIP archive if yes list content
392 flags |= DirListFlags::Zip;
393 }
394 else if( args[i] == "-C" )
395 {
396 // query checksum for each entry in the directory
397 hascks = true;
398 stats = true;
399 flags |= DirListFlags::Cksm;
400 }
401 else if ( args [i] == "-h" )
402 {
403 human = true;
404 }
405 else
406 path = args[i];
407 }
408
409 if( showUrls )
410 // we don't merge the duplicate entries
411 // in case we print the full URL
412 flags &= ~DirListFlags::Merge;
413
414 std::string newPath = "/";
415 if( path.empty() )
416 env->GetString( "CWD", newPath );
417 else
418 {
419 if( !BuildPath( newPath, env, path ).IsOK() )
420 {
421 log->Error( AppMsg, "Invalid arguments. Invalid path." );
423 }
424 }
425
426 //----------------------------------------------------------------------------
427 // Stat the entry so we know if it is a file or a directory
428 //----------------------------------------------------------------------------
429 log->Debug( AppMsg, "Attempting to stat: %s", newPath.c_str() );
430
431 StatInfo *info = 0;
432 XRootDStatus st = fs->Stat( newPath, info );
433 std::unique_ptr<StatInfo> ptr( info );
434 if( !st.IsOK() )
435 {
436 log->Error( AppMsg, "Unable to stat the path: %s", st.ToStr().c_str() );
437 return st;
438 }
439
440 if( !info->TestFlags( StatInfo::IsDir ) &&
441 !( flags & DirListFlags::Zip ) )
442 {
443 if( stats )
444 PrintDirListStatInfo( info, false, 0, 0, 0, human, base );
445
446 if( showUrls )
447 {
448 std::string url;
449 fs->GetProperty( "LastURL", url );
450 std::cout << url;
451 }
452 std::cout << newPath << std::endl;
453 return XRootDStatus();
454 }
455
456
457 //----------------------------------------------------------------------------
458 // Ask for the list
459 //----------------------------------------------------------------------------
460 log->Debug( AppMsg, "Attempting to list: %s", newPath.c_str() );
461
462 DirectoryList *list;
463 st = fs->DirList( newPath, flags, list );
464 if( !st.IsOK() )
465 {
466 log->Error( AppMsg, "Unable to list the path: %s", st.ToStr().c_str() );
467 return st;
468 }
469
470 if( st.code == suPartial )
471 {
472 std::cerr << "[!] Some of the requests failed. The result may be ";
473 std::cerr << "incomplete." << std::endl;
474 }
475
476 uint32_t ownerwidth = 0, groupwidth = 0, sizewidth = 0, ckswidth = 0;
478 for( it = list->Begin(); it != list->End() && stats; ++it )
479 {
480 StatInfo *info = (*it)->GetStatInfo();
481
482 std::string size = getSizeStr(info->GetSize(),human,base);
483 uint32_t sizeWidthComp;
484 if (human) {
485 sizeWidthComp = size.size();
486 } else {
487 sizeWidthComp = nbDigits( info->GetSize());
488 }
489
490 if( ownerwidth < info->GetOwner().size() )
491 ownerwidth = info->GetOwner().size();
492 if( groupwidth < info->GetGroup().size() )
493 groupwidth = info->GetGroup().size();
494 if( sizewidth < sizeWidthComp )
495 sizewidth = sizeWidthComp;
496 if( ckswidth < info->GetChecksum().size() )
497 ckswidth = info->GetChecksum().size();
498 }
499
500 //----------------------------------------------------------------------------
501 // Print the results
502 //----------------------------------------------------------------------------
503 for( it = list->Begin(); it != list->End(); ++it )
504 {
505 if( stats )
506 {
507 StatInfo *info = (*it)->GetStatInfo();
508 if( !info )
509 std::cout << "---- 0000-00-00 00:00:00 ? ";
510 else
511 PrintDirListStatInfo( info, hascks, ownerwidth, groupwidth, sizewidth, human, base );
512 }
513 if( showUrls )
514 std::cout << "root://" << (*it)->GetHostAddress() << "/";
515 std::cout << list->GetParentName() << (*it)->GetName() << std::endl;
516 }
517 delete list;
518 return XRootDStatus();
519}
void PrintDirListStatInfo(StatInfo *info, bool hascks=false, uint32_t ownerwidth=0, uint32_t groupwidth=0, uint32_t sizewidth=0, bool human=false, uint64_t base=1000)
Definition XrdClFS.cc:294
uint32_t nbDigits(uint64_t nb)
Definition XrdClFS.cc:278
std::string getSizeStr(uint64_t size, bool human, uint64_t base)
Definition XrdClFS.cc:284
const std::string & GetParentName() const
Get parent directory name.
DirList::iterator Iterator
Directory listing iterator.
Iterator End()
Get the end iterator.
Iterator Begin()
Get the begin iterator.
XRootDStatus DirList(const std::string &path, DirListFlags::Flags flags, ResponseHandler *handler, time_t timeout=0) XRD_WARN_UNUSED_RESULT
bool GetProperty(const std::string &name, std::string &value) const
void Debug(uint64_t topic, const char *format,...)
Print a debug message.
Definition XrdClLog.cc:282
uint64_t GetSize() const
Get size (in bytes).
const std::string & GetOwner() const
Get owner.
const std::string & GetGroup() const
Get group.
const std::string & GetChecksum() const
Get checksum.
@ Stat
Stat each entry.
@ Merge
Merge duplicates.
@ Zip
List content of ZIP files.
@ Recursive
Do a recursive listing.
@ Cksm
Get checksum for every entry.

References XrdCl::AppMsg, XrdCl::DirectoryList::Begin(), BuildPath(), XrdCl::DirListFlags::Cksm, XrdCl::Status::code, XrdCl::Log::Debug(), XrdCl::FileSystem::DirList(), XrdCl::DirectoryList::End(), XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::StatInfo::GetChecksum(), XrdCl::StatInfo::GetGroup(), XrdCl::DefaultEnv::GetLog(), XrdCl::StatInfo::GetOwner(), XrdCl::DirectoryList::GetParentName(), XrdCl::FileSystem::GetProperty(), XrdCl::StatInfo::GetSize(), getSizeStr(), XrdCl::Env::GetString(), XrdCl::StatInfo::IsDir, XrdCl::Status::IsOK(), XrdCl::DirListFlags::Locate, XrdCl::DirListFlags::Merge, nbDigits(), PrintDirListStatInfo(), XrdCl::DirListFlags::Recursive, XrdCl::DirListFlags::Stat, XrdCl::FileSystem::Stat(), XrdCl::stError, XrdCl::suPartial, XrdCl::StatInfo::TestFlags(), XrdCl::XRootDStatus::ToStr(), and XrdCl::DirListFlags::Zip.

Referenced by CreateExecutor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoMkDir()

XRootDStatus DoMkDir ( FileSystem * fs,
Env * env,
const FSExecutor::CommandParams & args )

Definition at line 524 of file XrdClFS.cc.

527{
528 //----------------------------------------------------------------------------
529 // Check up the args
530 //----------------------------------------------------------------------------
531 Log *log = DefaultEnv::GetLog();
532 uint32_t argc = args.size();
533
534 if( argc < 2 || argc > 4 )
535 {
536 log->Error( AppMsg, "Too few arguments." );
538 }
539
542 std::string modeStr = "rwxr-x---";
543 std::string path = "";
544
545 for( uint32_t i = 1; i < args.size(); ++i )
546 {
547 if( args[i] == "-p" )
548 flags |= MkDirFlags::MakePath;
549 else if( !args[i].compare( 0, 2, "-m" ) )
550 modeStr = args[i].substr( 2, 9 );
551 else
552 path = args[i];
553 }
554
555 XRootDStatus st = ConvertMode( mode, modeStr );
556 if( !st.IsOK() )
557 {
558 log->Error( AppMsg, "Invalid mode string." );
559 return st;
560 }
561
562 std::string newPath;
563 if( !BuildPath( newPath, env, path ).IsOK() )
564 {
565 log->Error( AppMsg, "Invalid path." );
567 }
568
569 //----------------------------------------------------------------------------
570 // Run the query
571 //----------------------------------------------------------------------------
572 st = fs->MkDir( newPath, flags, mode );
573 if( !st.IsOK() )
574 {
575 log->Error( AppMsg, "Unable create directory %s: %s",
576 newPath.c_str(),
577 st.ToStr().c_str() );
578 return st;
579 }
580
581 return XRootDStatus();
582}
XRootDStatus MkDir(const std::string &path, MkDirFlags::Flags flags, Access::Mode mode, ResponseHandler *handler, time_t timeout=0) XRD_WARN_UNUSED_RESULT
@ None
Nothing special.
@ MakePath
create the entire directory tree if it doesn't exist

References XrdCl::AppMsg, BuildPath(), ConvertMode(), XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::DefaultEnv::GetLog(), XrdCl::Status::IsOK(), XrdCl::MkDirFlags::MakePath, XrdCl::FileSystem::MkDir(), XrdCl::Access::None, XrdCl::MkDirFlags::None, XrdCl::stError, and XrdCl::XRootDStatus::ToStr().

Referenced by CreateExecutor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoMv()

XRootDStatus DoMv ( FileSystem * fs,
Env * env,
const FSExecutor::CommandParams & args )

Definition at line 628 of file XrdClFS.cc.

631{
632 //----------------------------------------------------------------------------
633 // Check up the args
634 //----------------------------------------------------------------------------
635 Log *log = DefaultEnv::GetLog();
636 uint32_t argc = args.size();
637
638 if( argc != 3 )
639 {
640 log->Error( AppMsg, "Wrong number of arguments." );
642 }
643
644 std::string fullPath1;
645 if( !BuildPath( fullPath1, env, args[1] ).IsOK() )
646 {
647 log->Error( AppMsg, "Invalid source path." );
649 }
650
651 std::string fullPath2;
652 if( !BuildPath( fullPath2, env, args[2] ).IsOK() )
653 {
654 log->Error( AppMsg, "Invalid destination path." );
656 }
657
658 if( is_subdirectory(fullPath1, fullPath2) )
660 "cannot move directory to a subdirectory of itself." );
661
662 //----------------------------------------------------------------------------
663 // Run the query
664 //----------------------------------------------------------------------------
665 XRootDStatus st = fs->Mv( fullPath1, fullPath2 );
666 if( !st.IsOK() )
667 {
668 log->Error( AppMsg, "Unable move %s to %s: %s",
669 fullPath1.c_str(), fullPath2.c_str(),
670 st.ToStr().c_str() );
671 return st;
672 }
673
674 return XRootDStatus();
675}
static bool is_subdirectory(const std::string &dir, const std::string &subdir)
XRootDStatus Mv(const std::string &source, const std::string &dest, ResponseHandler *handler, time_t timeout=0) XRD_WARN_UNUSED_RESULT

References XrdCl::AppMsg, BuildPath(), XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::DefaultEnv::GetLog(), is_subdirectory(), XrdCl::Status::IsOK(), XrdCl::FileSystem::Mv(), XrdCl::stError, and XrdCl::XRootDStatus::ToStr().

Referenced by CreateExecutor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoPrepare()

XRootDStatus DoPrepare ( FileSystem * fs,
Env * env,
const FSExecutor::CommandParams & args )

Definition at line 1350 of file XrdClFS.cc.

1353{
1354 //----------------------------------------------------------------------------
1355 // Check up the args
1356 //----------------------------------------------------------------------------
1357 Log *log = DefaultEnv::GetLog();
1358 uint32_t argc = args.size();
1359
1360 if( argc < 2 )
1361 {
1362 log->Error( AppMsg, "Wrong number of arguments." );
1364 }
1365
1367 std::vector<std::string> files;
1368 uint8_t priority = 0;
1369 std::string reqid;
1370
1371 for( uint32_t i = 1; i < args.size(); ++i )
1372 {
1373 if( args[i] == "-p" )
1374 {
1375 if( i < args.size()-1 )
1376 {
1377 char *result;
1378 int32_t param = ::strtol( args[i+1].c_str(), &result, 0 );
1379 if( *result != 0 || param > 3 || param < 0 )
1380 {
1381 log->Error( AppMsg, "Size priotiry needs to be an integer between 0 "
1382 "and 3" );
1384 }
1385 priority = (uint8_t)param;
1386 ++i;
1387 }
1388 else
1389 {
1390 log->Error( AppMsg, "Parameter '-p' requires an argument." );
1392 }
1393 }
1394 else if( args[i] == "-c" )
1395 flags |= PrepareFlags::Colocate;
1396 else if( args[i] == "-f" )
1397 flags |= PrepareFlags::Fresh;
1398 else if( args[i] == "-s" )
1399 flags |= PrepareFlags::Stage;
1400 else if( args[i] == "-w" )
1401 flags |= PrepareFlags::WriteMode;
1402 else if( args[i] == "-e" )
1403 flags |= PrepareFlags::Evict;
1404 else if( args[i] == "-a" )
1405 {
1406 flags |= PrepareFlags::Cancel;
1407 if( i < args.size()-1 )
1408 {
1409 // by convention the request ID appears as the the first token
1410 // in the list of files
1411 files.push_back( args[i+1] );
1412 ++i;
1413 }
1414 else
1415 {
1416 log->Error( AppMsg, "Parameter '-a' requires an argument." );
1418 }
1419 }
1420 else
1421 files.push_back( args[i] );
1422 }
1423
1424 if( files.empty() )
1425 {
1426 log->Error( AppMsg, "Filename missing." );
1428 }
1429
1430 //----------------------------------------------------------------------------
1431 // Run the command
1432 //----------------------------------------------------------------------------
1433 Buffer *response = 0;
1434 XRootDStatus st = fs->Prepare( files, flags, priority, response );
1435 if( !st.IsOK() )
1436 {
1437 log->Error( AppMsg, "Prepare request failed: %s", st.ToStr().c_str() );
1438 return st;
1439 }
1440
1441 if( ( flags & PrepareFlags::Stage ) && response )
1442 {
1443 std::cout << response->ToString() << '\n';
1444 }
1445
1446 delete response;
1447 return XRootDStatus();
1448}
XRootDStatus Prepare(const std::vector< std::string > &fileList, PrepareFlags::Flags flags, uint8_t priority, ResponseHandler *handler, time_t timeout=0) XRD_WARN_UNUSED_RESULT
@ Cancel
cancel staging request
@ Colocate
co-locate staged files, if possible

References XrdCl::AppMsg, XrdCl::PrepareFlags::Cancel, XrdCl::PrepareFlags::Colocate, XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::PrepareFlags::Evict, XrdCl::PrepareFlags::Fresh, XrdCl::DefaultEnv::GetLog(), XrdCl::Status::IsOK(), XrdCl::PrepareFlags::None, XrdCl::FileSystem::Prepare(), XrdCl::PrepareFlags::Stage, XrdCl::stError, XrdCl::XRootDStatus::ToStr(), XrdCl::Buffer::ToString(), and XrdCl::PrepareFlags::WriteMode.

Referenced by CreateExecutor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoQuery()

XRootDStatus DoQuery ( FileSystem * fs,
Env * env,
const FSExecutor::CommandParams & args )

Definition at line 1243 of file XrdClFS.cc.

1246{
1247 //----------------------------------------------------------------------------
1248 // Check up the args
1249 //----------------------------------------------------------------------------
1250 Log *log = DefaultEnv::GetLog();
1251 uint32_t argc = args.size();
1252
1253 if( !( argc >= 3 ) )
1254 {
1255 log->Error( AppMsg, "Wrong number of arguments." );
1257 }
1258
1259 QueryCode::Code qCode;
1260 if( args[1] == "config" )
1261 qCode = QueryCode::Config;
1262 else if( args[1] == "checksumcancel" )
1264 else if( args[1] == "checksum" )
1265 qCode = QueryCode::Checksum;
1266 else if( args[1] == "opaque" )
1267 qCode = QueryCode::Opaque;
1268 else if( args[1] == "opaquefile" )
1269 qCode = QueryCode::OpaqueFile;
1270 else if( args[1] == "prepare" )
1271 qCode = QueryCode::Prepare;
1272 else if( args[1] == "space" )
1273 qCode = QueryCode::Space;
1274 else if( args[1] == "stats" )
1275 qCode = QueryCode::Stats;
1276 else if( args[1] == "xattr" )
1277 qCode = QueryCode::XAttr;
1278 else
1279 {
1280 log->Error( AppMsg, "Invalid query code." );
1282 }
1283
1284 if( !( qCode & QueryCode::Prepare ) && argc != 3 )
1285 {
1286 log->Error( AppMsg, "Wrong number of arguments." );
1288 }
1289
1290 std::string strArg = args[2];
1291 if( qCode & QueryCode::Prepare )
1292 {
1293 // strArg is supposed to contain already the request ID
1294
1295 for( size_t i = 3; i < args.size(); ++i )
1296 {
1297 std::string path = args[i];
1298 if( !BuildPath( path, env, path ).IsOK() )
1299 {
1300 log->Error( AppMsg, "Invalid path." );
1302 }
1303 // we use new line character as delimiter
1304 strArg += '\n';
1305 strArg += path;
1306 }
1307 }
1308 else
1309 {
1310 std::string strArg = args[2];
1311 if( qCode == QueryCode::ChecksumCancel ||
1312 qCode == QueryCode::Checksum ||
1313 qCode == QueryCode::XAttr )
1314 {
1315 if( !BuildPath( strArg, env, args[2] ).IsOK() )
1316 {
1317 log->Error( AppMsg, "Invalid path." );
1319 }
1320 }
1321 }
1322
1323 //----------------------------------------------------------------------------
1324 // Run the query
1325 //----------------------------------------------------------------------------
1326 Buffer arg( strArg.size() );
1327 arg.FromString( strArg );
1328 Buffer *response = 0;
1329 XRootDStatus st = fs->Query( qCode, arg, response );
1330
1331 if( !st.IsOK() )
1332 {
1333 log->Error( AppMsg, "Unable run query %s: %s",
1334 args[1].c_str(),
1335 st.ToStr().c_str() );
1336 return st;
1337 }
1338
1339 //----------------------------------------------------------------------------
1340 // Print the result
1341 //----------------------------------------------------------------------------
1342 std::cout << response->ToString() << std::endl;
1343 delete response;
1344 return XRootDStatus();
1345}
XRootDStatus Query(QueryCode::Code queryCode, const Buffer &arg, ResponseHandler *handler, time_t timeout=0) XRD_WARN_UNUSED_RESULT
Code
XRootD query request codes.
@ OpaqueFile
Implementation dependent.
@ XAttr
Query file extended attributes.
@ Opaque
Implementation dependent.
@ Config
Query server configuration.
@ Stats
Query server stats.
@ ChecksumCancel
Query file checksum cancellation.
@ Checksum
Query file checksum.
@ Space
Query logical space stats.
@ Prepare
Query prepare status.

References XrdCl::AppMsg, BuildPath(), XrdCl::QueryCode::Checksum, XrdCl::QueryCode::ChecksumCancel, XrdCl::QueryCode::Config, XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::Buffer::FromString(), XrdCl::DefaultEnv::GetLog(), XrdCl::Status::IsOK(), XrdCl::QueryCode::Opaque, XrdCl::QueryCode::OpaqueFile, XrdCl::QueryCode::Prepare, XrdCl::FileSystem::Query(), XrdCl::QueryCode::Space, XrdCl::QueryCode::Stats, XrdCl::stError, XrdCl::XRootDStatus::ToStr(), XrdCl::Buffer::ToString(), and XrdCl::QueryCode::XAttr.

Referenced by CreateExecutor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoRm()

XRootDStatus DoRm ( FileSystem * fs,
Env * env,
const FSExecutor::CommandParams & args )

Definition at line 680 of file XrdClFS.cc.

683{
684 //----------------------------------------------------------------------------
685 // Check up the args
686 //----------------------------------------------------------------------------
687 Log *log = DefaultEnv::GetLog();
688 uint32_t argc = args.size();
689
690 if( argc < 2 )
691 {
692 log->Error( AppMsg, "Wrong number of arguments." );
694 }
695
696 struct print_t
697 {
698 void print( const std::string &msg )
699 {
700 std::unique_lock<std::mutex> lck( mtx );
701 std::cout << msg << '\n';
702 }
703 std::mutex mtx;
704 };
705 std::shared_ptr<print_t> print;
706 if( argc - 1 > 0 )
707 print = std::make_shared<print_t>();
708
709 std::vector<Pipeline> rms;
710 rms.reserve( argc - 1 );
711 for( size_t i = 1; i < argc; ++i )
712 {
713 std::string fullPath;
714 if( !BuildPath( fullPath, env, args[i] ).IsOK() )
715 {
716 log->Error( AppMsg, "Invalid path: %s", fullPath.c_str() );
718 }
719 rms.emplace_back( Rm( fs, fullPath ) >>
720 [log, fullPath, print]( XRootDStatus &st )
721 {
722 if( !st.IsOK() )
723 {
724 log->Error( AppMsg, "Unable remove %s: %s",
725 fullPath.c_str(),
726 st.ToStr().c_str() );
727 }
728 if( print )
729 {
730 print->print( "rm " + fullPath + " : " + st.ToString() );
731 }
732 } );
733 }
734
735 //----------------------------------------------------------------------------
736 // Run the query:
737 // Parallel() will take the vector of Pipeline by reference and empty the
738 // vector, so rms.size() will change after the call.
739 //----------------------------------------------------------------------------
740 const size_t rs = rms.size();
741 XRootDStatus st = WaitFor( Parallel( rms ).AtLeast( rs ) );
742 if( !st.IsOK() )
743 return st;
744
745 return XRootDStatus();
746}
RmImpl< false > Rm
XRootDStatus WaitFor(Pipeline pipeline, time_t timeout=0)
ParallelOperation< false > Parallel(Container &&container)
Factory function for creating parallel operation from a vector.
std::string ToString() const
Create a string representation.

References XrdCl::AppMsg, BuildPath(), XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::DefaultEnv::GetLog(), XrdCl::Status::IsOK(), XrdCl::Parallel(), XrdCl::stError, XrdCl::XRootDStatus::ToStr(), XrdCl::Status::ToString(), and XrdCl::WaitFor().

Referenced by CreateExecutor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoRmDir()

XRootDStatus DoRmDir ( FileSystem * query,
Env * env,
const FSExecutor::CommandParams & args )

Definition at line 587 of file XrdClFS.cc.

590{
591 //----------------------------------------------------------------------------
592 // Check up the args
593 //----------------------------------------------------------------------------
594 Log *log = DefaultEnv::GetLog();
595 uint32_t argc = args.size();
596
597 if( argc != 2 )
598 {
599 log->Error( AppMsg, "Wrong number of arguments." );
601 }
602
603 std::string fullPath;
604 if( !BuildPath( fullPath, env, args[1] ).IsOK() )
605 {
606 log->Error( AppMsg, "Invalid path." );
608 }
609
610 //----------------------------------------------------------------------------
611 // Run the query
612 //----------------------------------------------------------------------------
613 XRootDStatus st = query->RmDir( fullPath );
614 if( !st.IsOK() )
615 {
616 log->Error( AppMsg, "Unable remove directory %s: %s",
617 fullPath.c_str(),
618 st.ToStr().c_str() );
619 return st;
620 }
621
622 return XRootDStatus();
623}
XRootDStatus RmDir(const std::string &path, ResponseHandler *handler, time_t timeout=0) XRD_WARN_UNUSED_RESULT

References XrdCl::AppMsg, BuildPath(), XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::DefaultEnv::GetLog(), XrdCl::Status::IsOK(), XrdCl::FileSystem::RmDir(), XrdCl::stError, and XrdCl::XRootDStatus::ToStr().

Referenced by CreateExecutor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoSpaceInfo()

XRootDStatus DoSpaceInfo ( FileSystem * fs,
Env * env,
const FSExecutor::CommandParams & args )

Definition at line 1749 of file XrdClFS.cc.

1752{
1753 using namespace XrdCl;
1754
1755 //----------------------------------------------------------------------------
1756 // Check up the args
1757 //----------------------------------------------------------------------------
1758 Log *log = DefaultEnv::GetLog();
1759 uint32_t argc = args.size();
1760
1761 if( argc != 2 )
1762 {
1763 log->Error( AppMsg, "Wrong number of arguments." );
1765 }
1766
1768
1769 XRootDStatus st = FileSystemUtils::GetSpaceInfo( i, fs, args[1] );
1770 if( !st.IsOK() )
1771 return st;
1772
1773 if( st.code == suPartial )
1774 {
1775 std::cerr << "[!] Some of the requests failed. The result may be ";
1776 std::cerr << "incomplete." << std::endl;
1777 }
1778
1779 std::cout << "Path: " << args[1] << std::endl;
1780 std::cout << "Total: " << i->GetTotal() << std::endl;
1781 std::cout << "Free: " << i->GetFree() << std::endl;
1782 std::cout << "Used: " << i->GetUsed() << std::endl;
1783 std::cout << "Largest free chunk: " << i->GetLargestFreeChunk() << std::endl;
1784
1785 delete i;
1786 return XRootDStatus();
1787}
Container for space information.
uint64_t GetUsed() const
Amount of used space in MB.
uint64_t GetLargestFreeChunk() const
Largest single chunk of free space.
uint64_t GetTotal() const
Amount of total space in MB.
uint64_t GetFree() const
Amount of free space in MB.
static XRootDStatus GetSpaceInfo(SpaceInfo *&result, FileSystem *fs, const std::string &path)
Recursively get space information for given path.

References XrdCl::AppMsg, XrdCl::Status::code, XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::FileSystemUtils::SpaceInfo::GetFree(), XrdCl::FileSystemUtils::SpaceInfo::GetLargestFreeChunk(), XrdCl::DefaultEnv::GetLog(), XrdCl::FileSystemUtils::GetSpaceInfo(), XrdCl::FileSystemUtils::SpaceInfo::GetTotal(), XrdCl::FileSystemUtils::SpaceInfo::GetUsed(), XrdCl::Status::IsOK(), XrdCl::stError, and XrdCl::suPartial.

Referenced by CreateExecutor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoStat()

XRootDStatus DoStat ( FileSystem * fs,
Env * env,
const FSExecutor::CommandParams & args )

Definition at line 1045 of file XrdClFS.cc.

1048{
1049 //----------------------------------------------------------------------------
1050 // Check up the args
1051 //----------------------------------------------------------------------------
1052 Log *log = DefaultEnv::GetLog();
1053 uint32_t argc = args.size();
1054
1055 if( argc < 2 )
1056 {
1057 log->Error( AppMsg, "Wrong number of arguments." );
1059 }
1060
1061 std::vector<std::string> paths;
1062 std::string query;
1063
1064 for( uint32_t i = 1; i < args.size(); ++i )
1065 {
1066 if( args[i] == "-q" )
1067 {
1068 if( i < args.size()-1 )
1069 {
1070 query = args[i+1];
1071 ++i;
1072 }
1073 else
1074 {
1075 log->Error( AppMsg, "Parameter '-q' requires an argument." );
1077 }
1078 }
1079 else
1080 paths.emplace_back( args[i] );
1081 }
1082
1083 std::vector<XrdCl::Pipeline> stats;
1084 std::vector<std::tuple<std::future<StatInfo>, std::string>> results;
1085 for( auto &path : paths )
1086 {
1087 std::string fullPath;
1088 if( !BuildPath( fullPath, env, path ).IsOK() )
1089 {
1090 log->Error( AppMsg, "Invalid path." );
1092 }
1093 std::future<XrdCl::StatInfo> ftr;
1094 stats.emplace_back( XrdCl::Stat( fs, fullPath ) >> ftr );
1095 results.emplace_back( std::move( ftr ), std::move( fullPath ) );
1096 }
1097
1098 //----------------------------------------------------------------------------
1099 // Run the query
1100 //----------------------------------------------------------------------------
1101 XrdCl::Async( XrdCl::Parallel( stats ) );
1102
1103 //----------------------------------------------------------------------------
1104 // Print the result
1105 //----------------------------------------------------------------------------
1107 for( auto &tpl : results )
1108 {
1109 auto &ftr = std::get<0>( tpl );
1110 auto &fullPath = std::get<1>( tpl );
1111 std::cout << std::endl;
1112 try
1113 {
1114 XrdCl::StatInfo info( ftr.get() );
1115 std::string flags;
1116
1117 if( info.TestFlags( StatInfo::XBitSet ) )
1118 flags += "XBitSet|";
1119 if( info.TestFlags( StatInfo::IsDir ) )
1120 flags += "IsDir|";
1121 if( info.TestFlags( StatInfo::Other ) )
1122 flags += "Other|";
1123 if( info.TestFlags( StatInfo::Offline ) )
1124 flags += "Offline|";
1125 if( info.TestFlags( StatInfo::POSCPending ) )
1126 flags += "POSCPending|";
1127 if( info.TestFlags( StatInfo::IsReadable ) )
1128 flags += "IsReadable|";
1129 if( info.TestFlags( StatInfo::IsWritable ) )
1130 flags += "IsWritable|";
1131 if( info.TestFlags( StatInfo::BackUpExists ) )
1132 flags += "BackUpExists|";
1133
1134 if( !flags.empty() )
1135 flags.erase( flags.length()-1, 1 );
1136
1137 std::cout << "Path: " << fullPath << std::endl;
1138 std::cout << "Id: " << info.GetId() << std::endl;
1139 std::cout << "Size: " << info.GetSize() << std::endl;
1140 std::cout << "MTime: " << info.GetModTimeAsString() << std::endl;
1141 // if extended stat information is available we can print also
1142 // change time and access time
1143 if( info.ExtendedFormat() )
1144 {
1145 std::cout << "CTime: " << info.GetChangeTimeAsString() << std::endl;
1146 std::cout << "ATime: " << info.GetAccessTimeAsString() << std::endl;
1147 }
1148 std::cout << "Flags: " << info.GetFlags() << " (" << flags << ")";
1149
1150 // check if extended stat information is available
1151 if( info.ExtendedFormat() )
1152 {
1153 std::cout << "\nMode: " << info.GetModeAsString() << std::endl;
1154 std::cout << "Owner: " << info.GetOwner() << std::endl;
1155 std::cout << "Group: " << info.GetGroup();
1156 }
1157
1158 std::cout << std::endl;
1159
1160 if( query.length() != 0 )
1161 {
1162 XRootDStatus s = ProcessStatQuery( info, query );
1163 if( !s.IsOK() )
1164 st = s;
1165 std::cout << "Query: " << query << " " << std::endl;
1166 }
1167 }
1168 catch( XrdCl::PipelineException &ex )
1169 {
1170 st = ex.GetError();
1171 log->Error( AppMsg, "Unable stat %s: %s", fullPath.c_str(), st.ToStr().c_str() );
1172 }
1173 }
1174
1175 return st;
1176}
XRootDStatus ProcessStatQuery(StatInfo &info, const std::string &query)
Definition XrdClFS.cc:980
Pipeline exception, wrapps an XRootDStatus.
const XRootDStatus & GetError() const
@ IsReadable
Read access is allowed.
@ Other
Neither a file nor a directory.
@ BackUpExists
Back up copy exists.
@ XBitSet
Executable/searchable bit set.
@ Offline
File is not online (ie. on disk).
@ IsWritable
Write access is allowed.
StatImpl< false > Stat(Ctx< File > file, Arg< bool > force, time_t timeout=0)
std::future< XRootDStatus > Async(Pipeline pipeline, time_t timeout=0)

References XrdCl::AppMsg, XrdCl::Async(), XrdCl::StatInfo::BackUpExists, BuildPath(), XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::StatInfo::ExtendedFormat(), XrdCl::StatInfo::GetAccessTimeAsString(), XrdCl::StatInfo::GetChangeTimeAsString(), XrdCl::PipelineException::GetError(), XrdCl::StatInfo::GetFlags(), XrdCl::StatInfo::GetGroup(), XrdCl::StatInfo::GetId(), XrdCl::DefaultEnv::GetLog(), XrdCl::StatInfo::GetModeAsString(), XrdCl::StatInfo::GetModTimeAsString(), XrdCl::StatInfo::GetOwner(), XrdCl::StatInfo::GetSize(), XrdCl::StatInfo::IsDir, XrdCl::Status::IsOK(), XrdCl::StatInfo::IsReadable, XrdCl::StatInfo::IsWritable, XrdCl::StatInfo::Offline, XrdCl::StatInfo::Other, XrdCl::Parallel(), XrdCl::StatInfo::POSCPending, ProcessStatQuery(), XrdCl::Stat(), XrdCl::stError, XrdCl::StatInfo::TestFlags(), XrdCl::XRootDStatus::ToStr(), and XrdCl::StatInfo::XBitSet.

Referenced by CreateExecutor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoStatVFS()

XRootDStatus DoStatVFS ( FileSystem * fs,
Env * env,
const FSExecutor::CommandParams & args )

Definition at line 1181 of file XrdClFS.cc.

1184{
1185 //----------------------------------------------------------------------------
1186 // Check up the args
1187 //----------------------------------------------------------------------------
1188 Log *log = DefaultEnv::GetLog();
1189 uint32_t argc = args.size();
1190
1191 if( argc != 2 )
1192 {
1193 log->Error( AppMsg, "Wrong number of arguments." );
1195 }
1196
1197 std::string fullPath;
1198 if( !BuildPath( fullPath, env, args[1] ).IsOK() )
1199 {
1200 log->Error( AppMsg, "Invalid path." );
1202 }
1203
1204 //----------------------------------------------------------------------------
1205 // Run the query
1206 //----------------------------------------------------------------------------
1207 StatInfoVFS *info = 0;
1208 XRootDStatus st = fs->StatVFS( fullPath, info );
1209
1210 if( !st.IsOK() )
1211 {
1212 log->Error( AppMsg, "Unable stat VFS at %s: %s",
1213 fullPath.c_str(),
1214 st.ToStr().c_str() );
1215 return st;
1216 }
1217
1218 //----------------------------------------------------------------------------
1219 // Print the result
1220 //----------------------------------------------------------------------------
1221 std::cout << "Path: ";
1222 std::cout << fullPath << std::endl;
1223 std::cout << "Nodes with RW space: ";
1224 std::cout << info->GetNodesRW() << std::endl;
1225 std::cout << "Size of largest RW space (MB): ";
1226 std::cout << info->GetFreeRW() << std::endl;
1227 std::cout << "Utilization of RW space (%): ";
1228 std::cout << (uint16_t)info->GetUtilizationRW() << std::endl;
1229 std::cout << "Nodes with staging space: ";
1230 std::cout << info->GetNodesStaging() << std::endl;
1231 std::cout << "Size of largest staging space (MB): ";
1232 std::cout << info->GetFreeStaging() << std::endl;
1233 std::cout << "Utilization of staging space (%): ";
1234 std::cout << (uint16_t)info->GetUtilizationStaging() << std::endl;
1235
1236 delete info;
1237 return XRootDStatus();
1238}
XRootDStatus StatVFS(const std::string &path, ResponseHandler *handler, time_t timeout=0) XRD_WARN_UNUSED_RESULT
uint64_t GetFreeRW() const
Get size of the largest contiguous area of free r/w space (in MB).
uint64_t GetNodesStaging() const
Get number of nodes that can provide staging space.
uint8_t GetUtilizationStaging() const
Get percentage of the partition utilization represented by FreeStaging.
uint64_t GetFreeStaging() const
Get size of the largest contiguous area of free staging space (in MB).
uint8_t GetUtilizationRW() const
Get percentage of the partition utilization represented by FreeRW.
uint64_t GetNodesRW() const
Get number of nodes that can provide read/write space.

References XrdCl::AppMsg, BuildPath(), XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::StatInfoVFS::GetFreeRW(), XrdCl::StatInfoVFS::GetFreeStaging(), XrdCl::DefaultEnv::GetLog(), XrdCl::StatInfoVFS::GetNodesRW(), XrdCl::StatInfoVFS::GetNodesStaging(), XrdCl::StatInfoVFS::GetUtilizationRW(), XrdCl::StatInfoVFS::GetUtilizationStaging(), XrdCl::Status::IsOK(), XrdCl::FileSystem::StatVFS(), XrdCl::stError, and XrdCl::XRootDStatus::ToStr().

Referenced by CreateExecutor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoTail()

XRootDStatus DoTail ( FileSystem * fs,
Env * env,
const FSExecutor::CommandParams & args )

Definition at line 1620 of file XrdClFS.cc.

1623{
1624 //----------------------------------------------------------------------------
1625 // Check up the args
1626 //----------------------------------------------------------------------------
1627 Log *log = DefaultEnv::GetLog();
1628 uint32_t argc = args.size();
1629
1630 if( argc < 2 || argc > 5 )
1631 {
1632 log->Error( AppMsg, "Wrong number of arguments." );
1634 }
1635
1636 std::string server;
1637 env->GetString( "ServerURL", server );
1638 if( server.empty() )
1639 {
1640 log->Error( AppMsg, "Invalid address: \"%s\".", server.c_str() );
1642 }
1643
1644 std::string remote;
1645 bool followMode = false;
1646 uint32_t offset = 512;
1647
1648 for( uint32_t i = 1; i < args.size(); ++i )
1649 {
1650 if( args[i] == "-f" )
1651 followMode = true;
1652 else if( args[i] == "-c" )
1653 {
1654 if( i < args.size()-1 )
1655 {
1656 char *result;
1657 offset = ::strtol( args[i+1].c_str(), &result, 0 );
1658 if( *result != 0 )
1659 {
1660 log->Error( AppMsg, "Offset from the end needs to be a number: %s",
1661 args[i+1].c_str() );
1663 }
1664 ++i;
1665 }
1666 else
1667 {
1668 log->Error( AppMsg, "Parameter '-n' requires an argument." );
1670 }
1671 }
1672 else
1673 remote = args[i];
1674 }
1675
1676 std::string remoteFile;
1677 if( !BuildPath( remoteFile, env, remote ).IsOK() )
1678 {
1679 log->Error( AppMsg, "Invalid path." );
1681 }
1682
1683 URL remoteUrl( server );
1684 remoteUrl.SetPath( remoteFile );
1685
1686 //----------------------------------------------------------------------------
1687 // Fetch the data
1688 //----------------------------------------------------------------------------
1689 File file;
1690 XRootDStatus st = file.Open( remoteUrl.GetURL(), OpenFlags::Read );
1691 if( !st.IsOK() )
1692 {
1693 log->Error( AppMsg, "Unable to open file %s: %s",
1694 remoteUrl.GetObfuscatedURL().c_str(), st.ToStr().c_str() );
1695 return st;
1696 }
1697
1698 StatInfo *info = 0;
1699 uint64_t size = 0;
1700 st = file.Stat( false, info );
1701 if (st.IsOK()) size = info->GetSize();
1702
1703 if( size < offset )
1704 offset = 0;
1705 else
1706 offset = size - offset;
1707
1708 uint32_t chunkSize = 1*1024*1024;
1709 char *buffer = new char[chunkSize];
1710 uint32_t bytesRead = 0;
1711 while(1)
1712 {
1713 st = file.Read( offset, chunkSize, buffer, bytesRead );
1714 if( !st.IsOK() )
1715 {
1716 log->Error( AppMsg, "Unable to read from %s: %s",
1717 remoteUrl.GetObfuscatedURL().c_str(), st.ToStr().c_str() );
1718 delete [] buffer;
1719 return st;
1720 }
1721
1722 offset += bytesRead;
1723 int ret = write( 1, buffer, bytesRead );
1724 if( ret == -1 )
1725 {
1726 log->Error( AppMsg, "Unable to write to stdout: %s",
1727 XrdSysE2T(errno) );
1728 delete [] buffer;
1729 return st;
1730 }
1731
1732 if( bytesRead < chunkSize )
1733 {
1734 if( !followMode )
1735 break;
1736 sleep(1);
1737 }
1738 }
1739 delete [] buffer;
1740
1741 XRootDStatus stC = file.Close();
1742
1743 return XRootDStatus();
1744}
#define write(a, b, c)
Definition XrdPosix.hh:115
const char * XrdSysE2T(int errcode)
Definition XrdSysE2T.cc:104
A file.
Definition XrdClFile.hh:52
XRootDStatus Open(const std::string &url, OpenFlags::Flags flags, Access::Mode mode, ResponseHandler *handler, time_t timeout=0) XRD_WARN_UNUSED_RESULT
Definition XrdClFile.cc:125
XRootDStatus Read(uint64_t offset, uint32_t size, void *buffer, ResponseHandler *handler, time_t timeout=0) XRD_WARN_UNUSED_RESULT
Definition XrdClFile.cc:265
XRootDStatus Close(ResponseHandler *handler, time_t timeout=0) XRD_WARN_UNUSED_RESULT
Definition XrdClFile.cc:210
XRootDStatus Stat(bool force, ResponseHandler *handler, time_t timeout=0) XRD_WARN_UNUSED_RESULT
Definition XrdClFile.cc:236
URL representation.
Definition XrdClURL.hh:31
@ Read
Open only for reading.

References XrdCl::AppMsg, BuildPath(), XrdCl::File::Close(), XrdCl::errInvalidAddr, XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::DefaultEnv::GetLog(), XrdCl::URL::GetObfuscatedURL(), XrdCl::StatInfo::GetSize(), XrdCl::Env::GetString(), XrdCl::URL::GetURL(), XrdCl::Status::IsOK(), XrdCl::File::Open(), XrdCl::File::Read(), XrdCl::OpenFlags::Read, XrdCl::URL::SetPath(), XrdCl::File::Stat(), XrdCl::stError, XrdCl::XRootDStatus::ToStr(), write, and XrdSysE2T().

Referenced by CreateExecutor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoTruncate()

XRootDStatus DoTruncate ( FileSystem * fs,
Env * env,
const FSExecutor::CommandParams & args )

Definition at line 751 of file XrdClFS.cc.

754{
755 //----------------------------------------------------------------------------
756 // Check up the args
757 //----------------------------------------------------------------------------
758 Log *log = DefaultEnv::GetLog();
759 uint32_t argc = args.size();
760
761 if( argc != 3 )
762 {
763 log->Error( AppMsg, "Wrong number of arguments." );
765 }
766
767 std::string fullPath;
768 if( !BuildPath( fullPath, env, args[1] ).IsOK() )
769 {
770 log->Error( AppMsg, "Invalid path." );
772 }
773
774 char *result;
775 uint64_t size = ::strtoll( args[2].c_str(), &result, 0 );
776 if( *result != 0 )
777 {
778 log->Error( AppMsg, "Size parameter needs to be an integer" );
780 }
781
782 //----------------------------------------------------------------------------
783 // Run the query
784 //----------------------------------------------------------------------------
785 XRootDStatus st = fs->Truncate( fullPath, size );
786 if( !st.IsOK() )
787 {
788 log->Error( AppMsg, "Unable truncate %s: %s",
789 fullPath.c_str(),
790 st.ToStr().c_str() );
791 return st;
792 }
793
794 return XRootDStatus();
795}
XRootDStatus Truncate(const std::string &path, uint64_t size, ResponseHandler *handler, time_t timeout=0) XRD_WARN_UNUSED_RESULT

References XrdCl::AppMsg, BuildPath(), XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::DefaultEnv::GetLog(), XrdCl::Status::IsOK(), XrdCl::stError, XrdCl::XRootDStatus::ToStr(), and XrdCl::FileSystem::Truncate().

Referenced by CreateExecutor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoXAttr()

XRootDStatus DoXAttr ( FileSystem * fs,
Env * env,
const FSExecutor::CommandParams & args )

Definition at line 1792 of file XrdClFS.cc.

1795{
1796 //----------------------------------------------------------------------------
1797 // Check up the args
1798 //----------------------------------------------------------------------------
1799 Log *log = DefaultEnv::GetLog();
1800 uint32_t argc = args.size();
1801
1802 if( argc < 3 )
1803 {
1804 log->Error( AppMsg, "Wrong number of arguments." );
1806 }
1807
1808 kXR_char code = 0;
1809 if( args[2] == "set")
1810 code = kXR_fattrSet;
1811 else if( args[2] == "get" )
1812 code = kXR_fattrGet;
1813 else if( args[2] == "del" )
1814 code = kXR_fattrDel;
1815 else if( args[2] == "list" )
1816 code = kXR_fattrList;
1817 else
1818 {
1819 log->Error( AppMsg, "Invalid xattr code." );
1821 }
1822
1823 std::string path;
1824 if( !BuildPath( path, env, args[1] ).IsOK() )
1825 {
1826 log->Error( AppMsg, "Invalid path." );
1828 }
1829
1830 //----------------------------------------------------------------------------
1831 // Issue the xattr operation
1832 //----------------------------------------------------------------------------
1833 XRootDStatus status;
1834 switch( code )
1835 {
1836 case kXR_fattrSet:
1837 {
1838 if( argc != 4 )
1839 {
1840 log->Error( AppMsg, "Wrong number of arguments." );
1842 }
1843
1844 std::string key_value = args[3];
1845 size_t pos = key_value.find( '=' );
1846 std::string key = key_value.substr( 0, pos );
1847 std::string value = key_value.substr( pos + 1 );
1848 std::vector<xattr_t> attrs;
1849 attrs.push_back( std::make_tuple( key, value ) );
1850
1851 std::vector<XAttrStatus> result;
1852 XRootDStatus status = fs->SetXAttr( path, attrs, result );
1853 XAttrStatus xst = status.IsOK() ? result.front() : XAttrStatus( key, status );
1854
1855 if( !xst.status.IsOK() )
1856 status = xst.status;
1857
1858 if( !status.IsOK() )
1859 log->Error( AppMsg, "Unable to xattr set %s %s: %s",
1860 key.c_str(), value.c_str(),
1861 status.ToStr().c_str() );
1862 return status;
1863 }
1864
1865 case kXR_fattrGet:
1866 {
1867 if( argc != 4 )
1868 {
1869 log->Error( AppMsg, "Wrong number of arguments." );
1871 }
1872
1873 std::string key = args[3];
1874 std::vector<std::string> attrs;
1875 attrs.push_back( key );
1876
1877 std::vector<XAttr> result;
1878 XRootDStatus status = fs->GetXAttr( path, attrs, result );
1879 XAttr xattr = status.IsOK() ? result.front() : XAttr( key, status );
1880
1881 if( !xattr.status.IsOK() )
1882 status = xattr.status;
1883
1884 if( !status.IsOK() )
1885 log->Error( AppMsg, "Unable to xattr get %s : %s",
1886 key.c_str(),
1887 status.ToStr().c_str() );
1888 else
1889 {
1890 std::cout << "# file: " << path << '\n';
1891 std::cout << xattr.name << "=\"" << xattr.value << "\"\n";
1892 }
1893
1894 return status;
1895 }
1896
1897 case kXR_fattrDel:
1898 {
1899 if( argc != 4 )
1900 {
1901 log->Error( AppMsg, "Wrong number of arguments." );
1903 }
1904
1905 std::string key = args[3];
1906 std::vector<std::string> attrs;
1907 attrs.push_back( key );
1908
1909 std::vector<XAttrStatus> result ;
1910 XRootDStatus status = fs->DelXAttr( path, attrs, result );
1911 XAttrStatus xst = status.IsOK() ? result.front() : XAttrStatus( key, status );
1912
1913 if( !xst.status.IsOK() )
1914 status = xst.status;
1915
1916 if( !status.IsOK() )
1917 log->Error( AppMsg, "Unable to xattr del %s : %s",
1918 key.c_str(),
1919 status.ToStr().c_str() );
1920 return status;
1921 }
1922
1923 case kXR_fattrList:
1924 {
1925 if( argc != 3 )
1926 {
1927 log->Error( AppMsg, "Wrong number of arguments." );
1929 }
1930
1931 std::vector<XAttr> result;
1932 XRootDStatus status = fs->ListXAttr( path, result );
1933
1934 if( !status.IsOK() )
1935 log->Error( AppMsg, "Unable to xattr list : %s",
1936 status.ToStr().c_str() );
1937 else
1938 {
1939 std::cout << "# file: " << path << '\n';
1940 auto itr = result.begin();
1941 for( ; itr != result.end(); ++itr )
1942 std::cout << itr->name << "=\"" << itr->value << "\"\n";
1943 }
1944
1945 return status;
1946 }
1947
1948 default:
1950 }
1951}
@ kXR_fattrDel
Definition XProtocol.hh:300
@ kXR_fattrSet
Definition XProtocol.hh:303
@ kXR_fattrList
Definition XProtocol.hh:302
@ kXR_fattrGet
Definition XProtocol.hh:301
unsigned char kXR_char
Definition XPtypes.hh:65
XRootDStatus ListXAttr(const std::string &path, ResponseHandler *handler, time_t timeout=0)
XRootDStatus GetXAttr(const std::string &path, const std::vector< std::string > &attrs, ResponseHandler *handler, time_t timeout=0)
XRootDStatus DelXAttr(const std::string &path, const std::vector< std::string > &attrs, ResponseHandler *handler, time_t timeout=0)
XRootDStatus SetXAttr(const std::string &path, const std::vector< xattr_t > &attrs, ResponseHandler *handler, time_t timeout=0)
Extended attribute operation status.
Extended attributes with status.

References XrdCl::AppMsg, BuildPath(), XrdCl::FileSystem::DelXAttr(), XrdCl::errInvalidAddr, XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::DefaultEnv::GetLog(), XrdCl::FileSystem::GetXAttr(), XrdCl::Status::IsOK(), kXR_fattrDel, kXR_fattrGet, kXR_fattrList, kXR_fattrSet, XrdCl::FileSystem::ListXAttr(), XrdCl::XAttrStatus::name, XrdCl::FileSystem::SetXAttr(), XrdCl::XAttrStatus::status, XrdCl::stError, XrdCl::XRootDStatus::ToStr(), and XrdCl::XAttr::value.

Referenced by CreateExecutor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ExecuteCommand() [1/2]

int ExecuteCommand ( const URL & url,
int argc,
char ** argv )

Definition at line 2329 of file XrdClFS.cc.

2330{
2331 //----------------------------------------------------------------------------
2332 // Build the command to be executed
2333 //----------------------------------------------------------------------------
2334 std::string commandline;
2335 for( int i = 0; i < argc; ++i )
2336 {
2337 commandline += argv[i];
2338 commandline += " ";
2339 }
2340
2341 FSExecutor *ex = CreateExecutor( url );
2342 ex->GetEnv()->PutInt( "NoCWD", 1 );
2343 int st = ExecuteCommand( ex, argc, argv );
2344 delete ex;
2345 return st;
2346}
int ExecuteCommand(FSExecutor *ex, int argc, char **argv)
Definition XrdClFS.cc:2138
FSExecutor * CreateExecutor(const URL &url)
Definition XrdClFS.cc:2108
Env * GetEnv()
Get the environment.

References CreateExecutor(), ExecuteCommand(), XrdCl::FSExecutor::GetEnv(), and XrdCl::Env::PutInt().

Here is the call graph for this function:

◆ ExecuteCommand() [2/2]

int ExecuteCommand ( FSExecutor * ex,
int argc,
char ** argv )

Definition at line 2138 of file XrdClFS.cc.

2139{
2140 // std::vector<std::string> args (argv, argv + argc);
2141 std::vector<std::string> args;
2142 args.reserve(argc);
2143 for (int i = 0; i < argc; ++i)
2144 {
2145 args.push_back(argv[i]);
2146 }
2147 XRootDStatus st = ex->Execute( args );
2148 if( !st.IsOK() )
2149 std::cerr << st.ToStr() << std::endl;
2150 return st.GetShellCode();
2151}
XRootDStatus Execute(const CommandParams &args)
int GetShellCode() const
Get the status code that may be returned to the shell.

References XrdCl::FSExecutor::Execute(), XrdCl::Status::GetShellCode(), XrdCl::Status::IsOK(), and XrdCl::XRootDStatus::ToStr().

Referenced by ExecuteCommand(), and main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ExecuteInteractive()

int ExecuteInteractive ( const URL & url,
bool noCwd = false )

Definition at line 2270 of file XrdClFS.cc.

2271{
2272 //----------------------------------------------------------------------------
2273 // Set up the environment
2274 //----------------------------------------------------------------------------
2275 std::string historyFile = getenv( "HOME" );
2276 historyFile += "/.xrdquery.history";
2277 rl_bind_key( '\t', rl_insert );
2278 read_history( historyFile.c_str() );
2279 FSExecutor *ex = CreateExecutor( url );
2280
2281 if( noCwd )
2282 ex->GetEnv()->PutInt( "NoCWD", 1 );
2283
2284 //----------------------------------------------------------------------------
2285 // Execute the commands
2286 //----------------------------------------------------------------------------
2287 std::string cmdline;
2288 while(1)
2289 {
2290 char *linebuf = 0;
2291 // print new prompt only if the previous line was complete
2292 // (a line is considered not to be complete if a quote has
2293 // been opened but it has not been closed)
2294 linebuf = readline( cmdline.empty() ? BuildPrompt( ex->GetEnv(), url ).c_str() : "> " );
2295 if( !linebuf || !strncmp( linebuf, "exit", 4 ) || !strncmp( linebuf, "quit", 4 ) )
2296 {
2297 std::cout << "Goodbye." << std::endl << std::endl;
2298 break;
2299 }
2300 if( !*linebuf)
2301 {
2302 free( linebuf );
2303 continue;
2304 }
2305 std::vector<std::string> args;
2306 cmdline += linebuf;
2307 free( linebuf );
2308 if (getArguments( args, cmdline ))
2309 {
2310 XRootDStatus st = ex->Execute( args );
2311 add_history( cmdline.c_str() );
2312 cmdline.erase();
2313 if( !st.IsOK() )
2314 std::cerr << st.ToStr() << std::endl;
2315 }
2316 }
2317
2318 //----------------------------------------------------------------------------
2319 // Cleanup
2320 //----------------------------------------------------------------------------
2321 delete ex;
2322 write_history( historyFile.c_str() );
2323 return 0;
2324}
int write_history(const char *)
Definition XrdClFS.cc:2187
void add_history(const char *)
Definition XrdClFS.cc:2172
void rl_bind_key(char, uint16_t)
Definition XrdClFS.cc:2176
std::string BuildPrompt(Env *env, const URL &url)
Definition XrdClFS.cc:2196
bool getArguments(std::vector< std::string > &result, const std::string &input)
Definition XrdClFS.cc:2212
char * readline(const char *prompt)
Definition XrdClFS.cc:2157
int read_history(const char *)
Definition XrdClFS.cc:2182
uint16_t rl_insert
Definition XrdClFS.cc:2180

References add_history(), BuildPrompt(), CreateExecutor(), XrdCl::FSExecutor::Execute(), getArguments(), XrdCl::FSExecutor::GetEnv(), XrdCl::Status::IsOK(), XrdCl::Env::PutInt(), read_history(), readline(), rl_bind_key(), rl_insert, XrdCl::XRootDStatus::ToStr(), and write_history().

Referenced by main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getArguments()

bool getArguments ( std::vector< std::string > & result,
const std::string & input )

parse command line

@ result : command parameters @ input : string containing the command line @ return : true if the command has been completed, false otherwise

Definition at line 2212 of file XrdClFS.cc.

2213{
2214 // the delimiter (space in the case of command line)
2215 static const char delimiter = ' ';
2216 // two types of quotes: single and double quotes
2217 const char singleQuote = '\'', doubleQuote = '\"';
2218 // if the current character of the command has been
2219 // quoted 'currentQuote' holds the type of quote,
2220 // otherwise it holds the null character
2221 char currentQuote = '\0';
2222
2223 std::string tmp;
2224 for (std::string::const_iterator it = input.begin (); it != input.end (); ++it)
2225 {
2226 // if we encountered a quote character ...
2227 if (*it == singleQuote || *it == doubleQuote)
2228 {
2229 // if we are not within quoted text ...
2230 if (!currentQuote)
2231 {
2232 currentQuote = *it; // set the type of quote
2233 continue; // and continue, the quote character itself is not a part of the parameter
2234 }
2235 // otherwise if it is the closing quote character ...
2236 else if (currentQuote == *it)
2237 {
2238 currentQuote = '\0'; // reset the current quote type
2239 continue; // and continue, the quote character itself is not a part of the parameter
2240 }
2241 }
2242 // if we are within quoted text or the character is not a delimiter ...
2243 if (currentQuote || *it != delimiter)
2244 {
2245 // concatenate it
2246 tmp += *it;
2247 }
2248 else
2249 {
2250 // otherwise add a parameter and erase the tmp string
2251 if (!tmp.empty ())
2252 {
2253 result.push_back(tmp);
2254 tmp.erase ();
2255 }
2256 }
2257 }
2258 // if the there are some remainders of the command add them
2259 if (!tmp.empty())
2260 {
2261 result.push_back(tmp);
2262 }
2263 // return true if the quotation has been closed
2264 return currentQuote == '\0';
2265}

Referenced by ExecuteInteractive().

Here is the caller graph for this function:

◆ getSizeStr()

std::string getSizeStr ( uint64_t size,
bool human,
uint64_t base )

Definition at line 284 of file XrdClFS.cc.

284 {
285 std::ostringstream oss;
286 if (!human) {
287 oss << size;
288 } else {
289 oss << XrdOucUtils::genHumanSize(size,base);
290 }
291 return oss.str();
292}
static std::string genHumanSize(size_t size, uint64_t base)

References XrdOucUtils::genHumanSize().

Referenced by DoLS(), and PrintDirListStatInfo().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ main()

int main ( int argc,
char ** argv )

Definition at line 2351 of file XrdClFS.cc.

2352{
2353 //----------------------------------------------------------------------------
2354 // Check the commandline parameters
2355 //----------------------------------------------------------------------------
2357 if( argc == 1 )
2358 {
2359 PrintHelp( 0, 0, params );
2360 return 1;
2361 }
2362
2363 if( !strcmp( argv[1], "--help" ) ||
2364 !strcmp( argv[1], "-h" ) )
2365 {
2366 PrintHelp( 0, 0, params );
2367 return 0;
2368 }
2369
2370 bool noCwd = false;
2371 int urlIndex = 1;
2372 if( !strcmp( argv[1], "--no-cwd") )
2373 {
2374 ++urlIndex;
2375 noCwd = true;
2376 }
2377
2378 URL url( argv[urlIndex] );
2379 if( !url.IsValid() )
2380 {
2381 PrintHelp( 0, 0, params );
2382 return 1;
2383 }
2384
2385 if( argc == urlIndex + 1 )
2386 return ExecuteInteractive( url, noCwd );
2387 int shift = urlIndex + 1;
2388 return ExecuteCommand( url, argc-shift, argv+shift );
2389}
int ExecuteInteractive(const URL &url, bool noCwd=false)
Definition XrdClFS.cc:2270
std::vector< std::string > CommandParams
Definition of command argument list.

References ExecuteCommand(), ExecuteInteractive(), XrdCl::URL::IsValid(), and PrintHelp().

Here is the call graph for this function:

◆ nbDigits()

uint32_t nbDigits ( uint64_t nb)

Definition at line 278 of file XrdClFS.cc.

279{
280 if( nb == 0 ) return 1;
281 return uint32_t( log10( double(nb) ) + 1);
282}

Referenced by DoLS().

Here is the caller graph for this function:

◆ PrintDirListStatInfo()

void PrintDirListStatInfo ( StatInfo * info,
bool hascks = false,
uint32_t ownerwidth = 0,
uint32_t groupwidth = 0,
uint32_t sizewidth = 0,
bool human = false,
uint64_t base = 1000 )

Definition at line 294 of file XrdClFS.cc.

295{
296 if( info->ExtendedFormat() )
297 {
298 if( info->TestFlags( StatInfo::IsDir ) )
299 std::cout << "d";
300 else
301 std::cout << "-";
302 std::cout << info->GetModeAsOctString();
303
304 std::cout << " " << std::setw( ownerwidth ) << info->GetOwner();
305 std::cout << " " << std::setw( groupwidth ) << info->GetGroup();
306 std::cout << " " << std::setw( sizewidth ) << getSizeStr(info->GetSize(),human, base);
307 if( hascks && info->HasChecksum() )
308 std::cout << " " << std::setw( sizewidth ) << info->GetChecksum();
309 std::cout << " " << info->GetModTimeAsString() << " ";
310 }
311 else
312 {
313 if( info->TestFlags( StatInfo::IsDir ) )
314 std::cout << "d";
315 else
316 std::cout << "-";
317
318 if( info->TestFlags( StatInfo::IsReadable ) )
319 std::cout << "r";
320 else
321 std::cout << "-";
322
323 if( info->TestFlags( StatInfo::IsWritable ) )
324 std::cout << "w";
325 else
326 std::cout << "-";
327
328 if( info->TestFlags( StatInfo::XBitSet ) )
329 std::cout << "x";
330 else
331 std::cout << "-";
332
333 std::cout << " " << info->GetModTimeAsString();
334
335 uint64_t size = info->GetSize();
336 std::string displaySize = getSizeStr(size,human,base);
337 int width = displaySize.size() + 2;
338 if (width < 12) {
339 width = 12;
340 }
341 std::cout << std::setw( width ) << displaySize << " ";
342 }
343}
std::string GetModTimeAsString() const
Get modification time.
bool HasChecksum() const
Has checksum.
const std::string GetModeAsOctString() const
Get mode.
bool ExtendedFormat() const
Has extended stat information.

References XrdCl::StatInfo::ExtendedFormat(), XrdCl::StatInfo::GetChecksum(), XrdCl::StatInfo::GetGroup(), XrdCl::StatInfo::GetModeAsOctString(), XrdCl::StatInfo::GetModTimeAsString(), XrdCl::StatInfo::GetOwner(), XrdCl::StatInfo::GetSize(), getSizeStr(), XrdCl::StatInfo::HasChecksum(), XrdCl::StatInfo::IsDir, XrdCl::StatInfo::IsReadable, XrdCl::StatInfo::IsWritable, XrdCl::StatInfo::TestFlags(), and XrdCl::StatInfo::XBitSet.

Referenced by DoLS().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ PrintHelp()

XRootDStatus PrintHelp ( FileSystem * ,
Env * ,
const FSExecutor::CommandParams &  )

Definition at line 1956 of file XrdClFS.cc.

1958{
1959 printf( "Usage:\n" );
1960 printf( " xrdfs [--no-cwd] host[:port] - interactive mode\n" );
1961 printf( " xrdfs host[:port] command args - batch mode\n\n" );
1962
1963 printf( "Available options:\n\n" );
1964
1965 printf( " --no-cwd no CWD is being preset\n\n" );
1966
1967 printf( "Available commands:\n\n" );
1968
1969 printf( " exit\n" );
1970 printf( " Exits from the program.\n\n" );
1971
1972 printf( " help\n" );
1973 printf( " This help screen.\n\n" );
1974
1975 printf( " cache {evict | fevict} <path>\n" );
1976 printf( " Evict a file from a cache if not in use; while fevict\n" );
1977 printf( " forcibly evicts the file causing any current uses of the\n" );
1978 printf( " file to get read failures on a subsequent read\n\n" );
1979
1980 printf( " cd <path>\n" );
1981 printf( " Change the current working directory\n\n" );
1982
1983 printf( " chmod <path> <user><group><other>\n" );
1984 printf( " Modify permissions. Permission string example:\n" );
1985 printf( " rwxr-x--x\n\n" );
1986
1987 printf( " ls [-l] [-u] [-R] [-D] [-Z] [-C] [dirname]\n" );
1988 printf( " Get directory listing.\n" );
1989 printf( " -l stat every entry and print long listing\n" );
1990 printf( " -u print paths as URLs\n" );
1991 printf( " -R list subdirectories recursively\n" );
1992 printf( " -D show duplicate entries\n" );
1993 printf( " -Z if a ZIP archive list its content\n" );
1994 printf( " -C checksum every entry\n\n" );
1995
1996 printf( " locate [-n] [-r] [-d] [-m] [-i] [-p] <path>\n" );
1997 printf( " Get the locations of the path.\n" );
1998 printf( " -r refresh, don't use cached locations\n" );
1999 printf( " -n make the server return the response immediately even\n" );
2000 printf( " though it may be incomplete\n" );
2001 printf( " -d do a recursive (deep) locate\n" );
2002 printf( " -m|-h prefer host names to IP addresses\n" );
2003 printf( " -i ignore network dependencies\n" );
2004 printf( " -p be passive: ignore tried/triedrc cgi opaque info\n\n" );
2005
2006 printf( " mkdir [-p] [-m<user><group><other>] <dirname>\n" );
2007 printf( " Creates a directory/tree of directories.\n\n" );
2008
2009 printf( " mv <path1> <path2>\n" );
2010 printf( " Move path1 to path2 locally on the same server.\n\n" );
2011
2012 printf( " stat [-q query] <path>\n" );
2013 printf( " Get info about the file or directory.\n" );
2014 printf( " -q query optional flag query parameter that makes\n" );
2015 printf( " xrdfs return error code to the shell if the\n" );
2016 printf( " requested flag combination is not present;\n" );
2017 printf( " flags may be combined together using '|' or '&'\n" );
2018 printf( " Available flags:\n" );
2019 printf( " XBitSet, IsDir, Other, Offline, POSCPending,\n" );
2020 printf( " IsReadable, IsWritable\n\n" );
2021
2022 printf( " statvfs <path>\n" );
2023 printf( " Get info about a virtual file system.\n\n" );
2024
2025 printf( " query <code> <parameters>\n" );
2026 printf( " Obtain server information. Query codes:\n\n" );
2027
2028 printf( " config <what> Server configuration; <what> is\n" );
2029 printf( " one of the following:\n" );
2030 printf( " bind_max - the maximum number of parallel streams\n" );
2031 printf( " chksum - the supported checksum\n" );
2032 printf( " cms - the status of the cmsd\n" );
2033 printf( " pio_max - maximum number of parallel I/O requests\n" );
2034 printf( " readv_ior_max - maximum size of a readv element\n" );
2035 printf( " readv_iov_max - maximum number of readv entries\n" );
2036 printf( " role - the role in a cluster\n" );
2037 printf( " sitename - the site name\n" );
2038 printf( " tpc - support for third party copies\n" );
2039 printf( " version - the version of the server\n" );
2040 printf( " wan_port - the port to use for wan copies\n" );
2041 printf( " wan_window - the wan_port window size\n" );
2042 printf( " window - the tcp window size\n" );
2043 printf( " checksumcancel <path> File checksum cancellation\n" );
2044 printf( " checksum <path> File checksum\n" );
2045 printf( " opaque <arg> Implementation dependent\n" );
2046 printf( " opaquefile <arg> Implementation dependent\n" );
2047 printf( " space <space> Logical space stats\n" );
2048 printf( " stats <what> Server stats; <what> is a list\n" );
2049 printf( " of letters indicating information\n");
2050 printf( " to be returned:\n" );
2051 printf( " a - all statistics\n" );
2052 printf( " p - protocol statistics\n" );
2053 printf( " b - buffer usage statistics\n" );
2054 printf( " s - scheduling statistics\n" );
2055 printf( " d - device polling statistics\n" );
2056 printf( " u - usage statistics\n" );
2057 printf( " i - server identification\n" );
2058 printf( " z - synchronized statistics\n" );
2059 printf( " l - connection statistics\n" );
2060 printf( " xattr <path> Extended attributes\n" );
2061 printf( " prepare <reqid> [filenames] Prepare request status\n\n" );
2062
2063 printf( " rm <filename>\n" );
2064 printf( " Remove a file.\n\n" );
2065
2066 printf( " rmdir <dirname>\n" );
2067 printf( " Remove a directory.\n\n" );
2068
2069 printf( " truncate <filename> <length>\n" );
2070 printf( " Truncate a file.\n\n" );
2071
2072 printf( " prepare [-c] [-f] [-s] [-w] [-e] [-p priority] [-a requestid] filenames\n" );
2073 printf( " Prepare one or more files for access.\n" );
2074 printf( " -c co-locate staged files if possible\n" );
2075 printf( " -f refresh file access time even if the location is known\n" );
2076 printf( " -s stage the files to disk if they are not online\n" );
2077 printf( " -w the files will be accessed for modification\n" );
2078 printf( " -p priority of the request, 0 (lowest) - 3 (highest)\n" );
2079 printf( " -a abort stage request\n" );
2080 printf( " -e evict the file from disk cache\n\n" );
2081
2082 printf( " cat [-o local file] files\n" );
2083 printf( " Print contents of one or more files to stdout.\n" );
2084 printf( " -o print to the specified local file\n\n" );
2085
2086 printf( " tail [-c bytes] [-f] file\n" );
2087 printf( " Output last part of files to stdout.\n" );
2088 printf( " -c num_bytes out last num_bytes\n" );
2089 printf( " -f output appended data as file grows\n\n" );
2090
2091 printf( " spaceinfo path\n" );
2092 printf( " Get space statistics for given path.\n\n" );
2093
2094 printf( " xattr <path> <code> <params> \n" );
2095 printf( " Operation on extended attributes. Codes:\n\n" );
2096 printf( " set <attr> Set extended attribute; <attr> is\n" );
2097 printf( " string of form name=value\n" );
2098 printf( " get <name> Get extended attribute\n" );
2099 printf( " del <name> Delete extended attribute\n" );
2100 printf( " list List extended attributes\n\n" );
2101
2102 return XRootDStatus();
2103}

Referenced by CreateExecutor(), and main().

Here is the caller graph for this function:

◆ ProcessStatQuery()

XRootDStatus ProcessStatQuery ( StatInfo & info,
const std::string & query )

Definition at line 980 of file XrdClFS.cc.

981{
982 Log *log = DefaultEnv::GetLog();
983
984 //----------------------------------------------------------------------------
985 // Process the query
986 //----------------------------------------------------------------------------
987 bool isOrQuery = false;
988 bool status = true;
989 if( query.find( '|' ) != std::string::npos )
990 {
991 isOrQuery = true;
992 status = false;
993 }
994 std::vector<std::string> queryFlags;
995 if( isOrQuery )
996 Utils::splitString( queryFlags, query, "|" );
997 else
998 Utils::splitString( queryFlags, query, "&" );
999
1000 //----------------------------------------------------------------------------
1001 // Initialize flag translation map and check the input flags
1002 //----------------------------------------------------------------------------
1003 std::map<std::string, StatInfo::Flags> flagMap;
1004 flagMap["XBitSet"] = StatInfo::XBitSet;
1005 flagMap["IsDir"] = StatInfo::IsDir;
1006 flagMap["Other"] = StatInfo::Other;
1007 flagMap["Offline"] = StatInfo::Offline;
1008 flagMap["POSCPending"] = StatInfo::POSCPending;
1009 flagMap["IsReadable"] = StatInfo::IsReadable;
1010 flagMap["IsWritable"] = StatInfo::IsWritable;
1011 flagMap["BackUpExists"] = StatInfo::BackUpExists;
1012
1013 std::vector<std::string>::iterator it;
1014 for( it = queryFlags.begin(); it != queryFlags.end(); ++it )
1015 if( flagMap.find( *it ) == flagMap.end() )
1016 {
1017 log->Error( AppMsg, "Flag '%s' is not recognized.", it->c_str() );
1019 }
1020
1021 //----------------------------------------------------------------------------
1022 // Process the query
1023 //----------------------------------------------------------------------------
1024 if( isOrQuery )
1025 {
1026 for( it = queryFlags.begin(); it != queryFlags.end(); ++it )
1027 if( info.TestFlags( flagMap[*it] ) )
1028 return XRootDStatus();
1029 }
1030 else
1031 {
1032 for( it = queryFlags.begin(); it != queryFlags.end(); ++it )
1033 if( !info.TestFlags( flagMap[*it] ) )
1035 }
1036
1037 if( status )
1038 return XRootDStatus();
1040}
const uint16_t errResponseNegative
Query response was negative.

References XrdCl::AppMsg, XrdCl::StatInfo::BackUpExists, XrdCl::errInvalidArgs, XrdCl::Log::Error(), XrdCl::errResponseNegative, XrdCl::DefaultEnv::GetLog(), XrdCl::StatInfo::IsDir, XrdCl::StatInfo::IsReadable, XrdCl::StatInfo::IsWritable, XrdCl::StatInfo::Offline, XrdCl::StatInfo::Other, XrdCl::StatInfo::POSCPending, XrdCl::Utils::splitString(), XrdCl::stError, XrdCl::StatInfo::TestFlags(), and XrdCl::StatInfo::XBitSet.

Referenced by DoStat().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ read_history()

int read_history ( const char * )

Definition at line 2182 of file XrdClFS.cc.

2183{
2184 return 0;
2185}

Referenced by ExecuteInteractive().

Here is the caller graph for this function:

◆ readline()

char * readline ( const char * prompt)

Definition at line 2157 of file XrdClFS.cc.

2158{
2159 std::cout << prompt << std::flush;
2160 std::string input;
2161 std::getline( std::cin, input );
2162
2163 if( !std::cin.good() )
2164 return 0;
2165
2166 char *linebuf = (char *)malloc( input.size()+1 );
2167 strncpy( linebuf, input.c_str(), input.size()+1 );
2168
2169 return linebuf;
2170}

Referenced by ExecuteInteractive().

Here is the caller graph for this function:

◆ rl_bind_key()

void rl_bind_key ( char ,
uint16_t  )

Definition at line 2176 of file XrdClFS.cc.

2177{
2178}

Referenced by ExecuteInteractive().

Here is the caller graph for this function:

◆ write_history()

int write_history ( const char * )

Definition at line 2187 of file XrdClFS.cc.

2188{
2189 return 0;
2190}

Referenced by ExecuteInteractive().

Here is the caller graph for this function:

Variable Documentation

◆ rl_insert

uint16_t rl_insert = 0

Definition at line 2180 of file XrdClFS.cc.

Referenced by ExecuteInteractive().