/******************************************************************************/ /* */ /* X r d C n s S s i M a i n . c c */ /* */ /* (c) 2009 by the Board of Trustees of the Leland Stanford, Jr., University */ /* Produced by Andrew Hanushevsky for Stanford University under contract */ /* DE-AC02-76-SFO0515 with the Department of Energy */ /* */ /* This file is part of the XRootD software suite. */ /* */ /* XRootD is free software: you can redistribute it and/or modify it under */ /* the terms of the GNU Lesser General Public License as published by the */ /* Free Software Foundation, either version 3 of the License, or (at your */ /* option) any later version. */ /* */ /* XRootD is distributed in the hope that it will be useful, but WITHOUT */ /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */ /* License for more details. */ /* */ /* You should have received a copy of the GNU Lesser General Public License */ /* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */ /* COPYING (GPL license). If not, see . */ /* */ /* The copyright holder's institutional names and contributor's names may not */ /* be used to endorse or promote products derived from this software without */ /* specific prior written permission of the institution or contributor. */ /******************************************************************************/ /* This is the Cluster Name Space utility. The syntax is: cns_ssi {diff | list | updt} [options] options: [-f] [-h] [-m] [-n] [-p] [-s] [-S] [-v] [-l ] Where: The archive (i.e., backup) path to use. All sub-directories in of the form "/cns/" are considered. -l list: Equivalent to specifying '-h -m -n -p -s'. -m list: Displays the file mode. -n list: Displays the space name. -p list: Displays the physical location. -s list: Displays the file size. -S list: Same as -s but displays size in k, m, g, or t. -l updt: Specifies location of the log file. This may also come from the XRDLOGDIR environmental variable. By default, messages go to stderr. -v updt: Increases the verbosity of messages. */ /******************************************************************************/ /* i n c l u d e f i l e s */ /******************************************************************************/ #include #include #include #include #include #include #include #include #include #include "XrdVersion.hh" #include "XrdCns/XrdCnsSsi.hh" #include "XrdCns/XrdCnsSsiCfg.hh" #include "XrdCns/XrdCnsSsiSay.hh" #include "XrdOuc/XrdOucTList.hh" #include "XrdSys/XrdSysError.hh" #include "XrdSys/XrdSysLogger.hh" #include "XrdSys/XrdSysPthread.hh" #include "XrdSys/XrdSysTimer.hh" #include "XrdSys/XrdSysUtils.hh" /******************************************************************************/ /* G l o b a l V a r i a b l e s */ /******************************************************************************/ #define XrdBANNER "Copr. 2004-2013 Stanford University, cns version " XrdVSTRING namespace XrdCns { extern XrdCnsSsiCfg Config; XrdSysError MLog(0,"Cns_"); XrdCnsSsiSay Say(&MLog); } using namespace XrdCns; /******************************************************************************/ /* m a i n */ /******************************************************************************/ int main(int argc, char *argv[]) { XrdSysLogger MLogger; XrdOucTList *tP; const char *xrdLogD = 0; char *hP; int rc = 0; // Establish message routing // MLog.logger(&MLogger); // Turn off sigpipe and host a variety of others before we start any threads // XrdSysUtils::SigBlock(); // Set the default stack size here // if (sizeof(long) > 4) XrdSysThread::setStackSize((size_t)1048576); else XrdSysThread::setStackSize((size_t)786432); // Process the options and arguments // if (!Config.Configure(argc, argv)) exit(1); Say.setV(Config.Verbose); // Construct the logfile path and bind it (command line only) // if (Config.logFN || (xrdLogD = getenv("XRDLOGDIR"))) {char buff[2048]; if (Config.logFN) strcpy(buff, Config.logFN); else {strcpy(buff, xrdLogD); strcat(buff, "cnsssilog");} MLogger.AddMsg(XrdBANNER); MLogger.Bind(buff, 0); } // Process the request // while((tP = Config.dirList)) {hP = tP->text + tP->val; if (Config.Xeq == 'l') rc |= XrdCnsSsi::List(hP, tP->text); else {int i = XrdCnsSsi::Updt(hP, tP->text); if (i) Say.M("Unable to update ", hP, " inventory."); rc |= i; } Config.dirList = tP->next; delete tP; } // All done // exit(rc); }