/******************************************************************************/ /* */ /* X r d C n s S s i C f g . c c */ /* */ /* (c) 2009 by the Board of Trustees of the Leland Stanford, Jr., University */ /* All Rights Reserved */ /* 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. */ /******************************************************************************/ #include #include #include #include #include "XrdOuc/XrdOuca2x.hh" #include "XrdOuc/XrdOucArgs.hh" #include "XrdOuc/XrdOucTList.hh" #include "XrdOuc/XrdOucUtils.hh" #include "XrdSys/XrdSysError.hh" #include "XrdSys/XrdSysLogger.hh" #include "XrdCns/XrdCnsLog.hh" #include "XrdCns/XrdCnsSsiCfg.hh" #include "XrdCns/XrdCnsSsiSay.hh" /******************************************************************************/ /* G l o b a l C o n f i g u r a t i o n O b j e c t */ /******************************************************************************/ namespace XrdCns { XrdCnsSsiCfg Config; extern XrdSysError MLog; extern XrdCnsSsiSay Say; } using namespace XrdCns; /******************************************************************************/ /* C o n f i g u r e */ /******************************************************************************/ int XrdCnsSsiCfg::Configure(int argc, char **argv) { const char *Opts = 0; // Determine the function and configure for that // if (argc <= 1) Usage("Function not specified."); else if (!strcmp("diff", argv[1])) {Xeq = 'd'; Opts = "fFhmnps"; Say.M("The diff function is not yet implemented."); return 0; } else if (!strcmp("list", argv[1])) {Xeq = 'l'; Opts = "fhlmnpsSz";} else if (!strcmp("updt", argv[1])) {Xeq = 'u'; Opts = "vz";} else Usage("Invalid function - ", argv[1]); Func = strdup(argv[1]); return Configure(argc-1, argv+1, Opts); } /******************************************************************************/ int XrdCnsSsiCfg::Configure(int argc, char **argv, const char *Opts) { /* Function: Establish configuration at start up time via arglist. Input: None. Output: 1 upon success or 0 otherwise. */ XrdOucArgs Spec(&MLog, "cns_ssi: ", Opts); struct stat Stat; char buff[2048], *dP; char theOpt, *theArg; int n, NoGo = 0; // Setup the arguments // Spec.Set(argc-1, argv+1); // Parse the options // while((theOpt = Spec.getopt()) != (char)-1) {switch(theOpt) { case 'h': Lopt |= Lhost; break; case 'l': if (Xeq == 'l') Lopt |= Lfull; else {logFN = Spec.argval; if (*logFN == '=') logFN++; } break; case 'm': Lopt |= Lmode; break; case 'n': Lopt |= Lname; break; case 'p': Lopt |= Lmount; break; case 's': Lopt |= Lsize; break; case 'S': Lopt |= Lsize | Lfmts; break; case 'v': Verbose = 1; break; case 'z': MLog.logger()->setHiRes(); break; default: NoGo = 1; } } // Get the destination for the name space // if ((theArg = Spec.getarg())) bPath = strdup(theArg); else Usage("Inventory directory not specified."); // Verify that the target directory exists and is a directory // if (stat(bPath, &Stat)) n = errno; else if ((Stat.st_mode & S_IFMT) != S_IFDIR) n = ENOTDIR; else n = 0; if (n) {Say.M("Unable to process '",bPath,"'; ", XrdOucUtils::eText(n, buff, sizeof(buff))); return 0; } // Strip trailing slashes from the path // dP = bPath + strlen(bPath) - 1; while(*dP == '/') {*dP = '\0'; dP--;} // Make sure we have some host entries // if (!(dirList = XrdCnsLog::Dirs(bPath, n))) {Say.M("No server inventories found in '",bPath,"'."); return 0;} // Issue warning if errors occurred // if (n) Say.M("Errors encountered; ",Func, " may be incomplete!"); // All done here // return !NoGo; } /******************************************************************************/ /* U s a g e */ /******************************************************************************/ void XrdCnsSsiCfg::Usage(const char *T1, const char *T2) { const char *What= "cns_ssi {diff npath | list [lopts] | updt [uopts]} \n\n" "lopts: [-h] [-l] [-m] [-n] [-p] [-s] [-S]\n" "uopts: [-l ] [-v]"; MLog.Say("cns_ssi: ", T1, T2); MLog.Say("\nUsage: ", What); exit(4); }