/******************************************************************************/ /* */ /* X r d F r m A d m i n M a i n . 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. */ /******************************************************************************/ /* This is the "main" part of the frm_PreStage command. Syntax is: */ static const char *XrdFrmOpts = "c:dhn:v"; static const char *XrdFrmUsage = " [-c ] [-d] [-h] [-n name] [-v] [help | cmd & opts]\n"; /* Where: -c The configuration file. The default is '/opt/xrootd/etc/xrootd.cf' -d Turns on debugging mode. -h Print helpful information (other options ignored). -n The instance name. cmd Specific commands, see the help information. opts Options specific to the command. */ /******************************************************************************/ /* i n c l u d e f i l e s */ /******************************************************************************/ #include #include #include #include #include #include #include #include #include #ifdef HAVE_READLINE #include #include #endif #include "XrdFrc/XrdFrcTrace.hh" #include "XrdFrm/XrdFrmAdmin.hh" #include "XrdFrm/XrdFrmConfig.hh" #include "XrdNet/XrdNetOpts.hh" #include "XrdNet/XrdNetSocket.hh" #include "XrdOuc/XrdOucTokenizer.hh" #include "XrdSys/XrdSysError.hh" #include "XrdSys/XrdSysHeaders.hh" #include "XrdSys/XrdSysLogger.hh" using namespace XrdFrc; using namespace XrdFrm; /******************************************************************************/ /* G l o b a l V a r i a b l e s */ /******************************************************************************/ XrdFrmConfig XrdFrm::Config(XrdFrmConfig::ssAdmin, XrdFrmOpts, XrdFrmUsage); XrdFrmAdmin XrdFrm::Admin; // The following is needed to resolve symbols for objects included from xrootd // XrdOucTrace *XrdXrootdTrace; XrdSysError XrdLog(0, ""); XrdOucTrace XrdTrace(&Say); /******************************************************************************/ /* r e a d l i n e */ /******************************************************************************/ #ifndef HAVE_READLINE // replacement function for GNU readline // char *readline(const char *prompt) { char buff[4096]; cout << prompt; if (!fgets(buff, 4096, stdin) || *buff == '\n' || !strlen(buff)) return 0; return strdup(buff); } void add_history(const char *cLine) {} void stifle_history(int hnum) {} #endif /******************************************************************************/ /* m a i n */ /******************************************************************************/ int main(int argc, char *argv[]) { XrdSysLogger Logger; sigset_t myset; XrdOucTokenizer Request(0); char *cLine = 0, *pLine = 0, *Cmd = 0, *CmdArgs = 0; int IMode; // Turn off sigpipe and host a variety of others before we start any threads // signal(SIGPIPE, SIG_IGN); // Solaris optimization sigemptyset(&myset); sigaddset(&myset, SIGPIPE); sigaddset(&myset, SIGCHLD); pthread_sigmask(SIG_BLOCK, &myset, NULL); // Perform configuration // Say.logger(&Logger); XrdLog.logger(&Logger); if (!Config.Configure(argc, argv, 0)) exit(4); // Fill out the dummy symbol to avoid crashes // XrdXrootdTrace = new XrdOucTrace(&Say); // We either have a command line or need to enter interactive mode // if (Config.nextArg >= argc) IMode = 1; else {Cmd = argv[Config.nextArg++]; Admin.setArgs(argc-Config.nextArg, &argv[Config.nextArg]); IMode = 0; } // Set readline history list (keep only 256 lines, max) // if (IMode) stifle_history(256); // Process the request(s) // do {if (IMode) {if (!(cLine = readline("frm_admin> "))) Admin.Quit(); if (!pLine || strcmp(pLine, cLine)) {add_history(cLine); if (pLine) free(pLine); pLine = strdup(cLine); } Request.Attach(cLine); if (!Request.GetLine() || !(Cmd=Request.GetToken(&CmdArgs))) Admin.Quit(); Admin.setArgs(CmdArgs); } Admin.xeqArgs(Cmd); if (cLine) free(cLine); } while(IMode); // All done // Admin.Quit(); }