diff --git a/CMakeLists.txt b/CMakeLists.txt index 11f6b0265082e786a478a560a336463549647998..76abf528f660ce5c218eb6d29648e5fe374a0c47 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -149,7 +149,6 @@ ELSE(DEFINED PackageOnly) add_subdirectory(rdbms) add_subdirectory(scheduler) add_subdirectory(tapeserver) - add_subdirectory(XRootdSSiRmcd) add_subdirectory(statistics) diff --git a/XRootdSSiRmcd/CMakeLists.txt b/XRootdSSiRmcd/CMakeLists.txt deleted file mode 100644 index 5f1cdb7cc3a884a1af901ebd0873f3e565194c85..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/CMakeLists.txt +++ /dev/null @@ -1,69 +0,0 @@ -# XRootD SSI/Protocol Buffer Interface Project -# Copyright 2018 CERN -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -cmake_minimum_required (VERSION 2.6) - -find_package(xrootdclient REQUIRED) -find_package(xrootd REQUIRED) -find_package(Protobuf3 REQUIRED) - -add_subdirectory(protobuf) - -# -# XRootD SSI -# -include_directories(${XROOTD_INCLUDE_DIR} ${XROOTD_INCLUDE_DIR}/private) - -# -# XRootD SSI Protocol Buffer bindings -# -include_directories(${CMAKE_SOURCE_DIR}/) - -include_directories (${CMAKE_SOURCE_DIR}/xrootd-ssi-protobuf-interface/include) - -# -# Compiled protocol buffers -# -include_directories(${CMAKE_BINARY_DIR}/XRootdSSiRmcd ${PROTOBUF3_INCLUDE_DIRS}) - -# -# Test Client -# -add_executable(cta-xsmc RmcdClient.cpp) -target_link_libraries(cta-xsmc XrdSsi-4 XrdSsiLib XrdSsiPbRmcd XrdUtils) -set_property(TARGET cta-xsmc APPEND PROPERTY INSTALL_RPATH ${PROTOBUF3_RPATH}) -#install (TARGETS cta-xsmc DESTINATION /usr/bin) -#install (FILES cta-xsmc-mount.1cta DESTINATION /usr/share/man/man1) -#install (FILES cta-xsmc-dismount.1cta DESTINATION /usr/share/man/man1) - -# -# XRootD SSI plugin for Test Server -# -add_library(XrdSsiRmcd MODULE - RmcdServiceProvider.cpp - RmcdRequestProc.cpp - rmc_send_scsi_cmd.cpp - serrno.cpp - rmc_smcsubr.cpp -) -target_link_libraries(XrdSsiRmcd XrdSsi-4 XrdSsiLib XrdSsiPbRmcd XrdUtils) -set_property(TARGET XrdSsiRmcd APPEND PROPERTY INSTALL_RPATH ${PROTOBUF3_RPATH}) -#install(TARGETS XrdSsiRmcd DESTINATION usr/${CMAKE_INSTALL_LIBDIR}) - -#install (FILES cta-xrmcd.conf DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/cta) -#install (FILES cta-xrmcd.logrotate DESTINATION /etc/logrotate.d RENAME cta-xrmcd) -#install (FILES cta-xrmcd.sysconfig DESTINATION /etc/sysconfig RENAME cta-xrmcd) -#install (FILES cta-xrmcd.service DESTINATION /etc/systemd/system) diff --git a/XRootdSSiRmcd/Castor_limits.h b/XRootdSSiRmcd/Castor_limits.h deleted file mode 100644 index be7c898a4fd88278265f117e4ece4d2f4715f932..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/Castor_limits.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Castor_limits.h,v 1.27 2004/02/12 15:38:08 obarring Exp - */ - -/* - * Copyright (C) 1999-2003 by CERN/IT/PDP/DM - * All rights reserved - */ - -/* - * @(#)Castor_limits.h,v 1.27 2004/02/12 15:38:08 CERN IT-PDP/DM Jean-Philippe Baud - */ - -#pragma once - - /* all maximum lengths defined below do not include the trailing null */ - -#define CA_MAXACLENTRIES 300 /* maximum number of ACL entries for a file/dir */ -#define CA_MAXCLASNAMELEN 15 /* maximum length for a fileclass name */ -#define CA_MAXCOMMENTLEN 255 /* maximum length for user comments in metadata */ -#define CA_MAXDENLEN 8 /* maximum length for a alphanumeric density */ -#define CA_MAXDGNLEN 6 /* maximum length for a device group name */ -#define CA_MAXDVNLEN 63 /* maximum length for a device name */ -#define CA_MAXDVTLEN 8 /* maximum length for a device type */ -#define CA_MAXFIDLEN 17 /* maximum length for a fid (DSN) */ -#define CA_MAXFSEQLEN 14 /* maximum length for a fseq string */ -#define CA_MAXGRPNAMELEN 2 /* maximum length for a group name */ -#define CA_MAXGUIDLEN 36 /* maximum length for a guid */ -#define CA_MAXHOSTNAMELEN 63 /* maximum length for a hostname */ -#define CA_MAXSVCCLASSNAMELEN 63 /* maximum length for a svc class name */ -#define CA_MAXLBLTYPLEN 3 /* maximum length for a label type */ -#define CA_MAXLINELEN 1023 /* maximum length for a line in a log */ -#define CA_MAXMANUFLEN 12 /* maximum length for a cartridge manufacturer */ -#define CA_MAXMIGPNAMELEN 15 /* maximum length for a migration policy name */ -#define CA_MAXMIGRNAMELEN 15 /* maximum length for a migrator name */ -#define CA_MAXMLLEN 1 /* maximum length for a cartridge media_letter */ -#define CA_MAXMODELLEN 6 /* maximum length for a cartridge model */ -#define CA_MAXNAMELEN 255 /* maximum length for a pathname component */ -#define CA_MAXNBDRIVES 4 /* maximum number of tape drives per server */ -#define CA_MAXPATHLEN 1023 /* maximum length for a pathname */ -#define CA_MAXPOOLNAMELEN 15 /* maximum length for a pool name */ -#define CA_MAXPROTOLEN 7 /* maximum length for a protocol name */ -#define CA_MAXRBTNAMELEN 17 /* maximum length for a robot name */ -#define CA_MAXRECFMLEN 3 /* maximum length for a record format */ -#define CA_MAXREGEXPLEN 63 /* Maximum length for a regular expression */ -#define CA_MAXCSECNAMELEN 512 /* Maximum length for a Csec authorization id */ -#define CA_MAXCSECPROTOLEN 20 /* Maximum length for a Csec mechanism */ -#define CA_MAXSFNLEN 1103 /* maximum length for a replica */ -#define CA_MAXSHORTHOSTLEN 10 /* maximum length for a hostname without domain */ -#define CA_MAXSNLEN 24 /* maximum length for a cartridge serial nb */ -#define CA_MAXSTGRIDLEN 77 /* maximum length for a stager full request id */ - /* must be >= nb digits in CA_MAXSTGREQID + - CA_MAXHOSTNAMELEN + 8 */ -#define CA_MAXSTGREQID 999999 /* maximum value for a stager request id */ -#define CA_MAXSYMLINKS 5 /* maximum number of symbolic links */ -#define CA_MAXTAGLEN 255 /* maximum length for a volume tag */ -#define CA_MAXTAPELIBLEN 8 /* maximum length for a tape library name */ -#define CA_MAXUNMLEN 8 /* maximum length for a drive name */ -#define CA_MAXUSRNAMELEN 14 /* maximum length for a login name */ -#define CA_MAXVIDLEN 6 /* maximum length for a VID */ -#define CA_MAXVSNLEN 6 /* maximum length for a VSN */ -#define CA_MAXCKSUMNAMELEN 15 /* maximum length for a checksum algorithm name */ -#define CA_MAXCKSUMLEN 32 /* maximum length for a checksum value in an asci form */ -#define CA_MAXDMPROTNAMELEN 15 /* maximum length for Disk Mover protocol name */ -#define CA_MAXJOBIDLEN 36 /* Maximum length for the representation of the Cuuid */ -#define CA_MAXUSERTAGLEN 63 /* Maximum length for a user tag (stage request) */ -#define CA_MAXRFSLINELEN 2047 /* maximum length for the requested filesystem string */ - -/* Max allowed uid/gif */ -#define CA_MAXUID 0x7FFFFFFF /* Maximum uid */ -#define CA_MAXGID 0x7FFFFFFF /* Maximum gid */ diff --git a/XRootdSSiRmcd/RmcdApi.hpp b/XRootdSSiRmcd/RmcdApi.hpp deleted file mode 100644 index 2d2ca0995a2e76d11dfa429b2444c27ce10493c8..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/RmcdApi.hpp +++ /dev/null @@ -1,41 +0,0 @@ -/*! - * @project XRootD SSI/Protocol Buffer Interface Project - * @brief XRootD SSI/Google Protocol Buffer bindings for the rmc_test client/server - * @copyright Copyright 2018 CERN - * @license This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#pragma once - -#include "XrdSsiPbServiceClientSide.hpp" //!< XRootD SSI/Protocol Buffer Service, client-side bindings -#include "protobuf/rmc_test.pb.h" //!< Auto-generated message types from .proto file - -/*! - * Bind the type of the XrdSsiService to the types defined in the .proto file - */ -typedef XrdSsiPb::ServiceClientSide<rmc_test::Request, //!< XrdSSi Request message type - rmc_test::Response, //!< XrdSsi Metadata message type - rmc_test::Data, //!< XrdSsi Data message type - rmc_test::Alert> //!< XrdSsi Alert message type - XrdSsiPbServiceType; - -/*! - * Bind the type of the XrdSsiRequest to the types defined in the .proto file - */ -typedef XrdSsiPb::Request<rmc_test::Request, //!< XrdSSi Request message type - rmc_test::Response, //!< XrdSsi Metadata message type - rmc_test::Data, //!< XrdSsi Data message type - rmc_test::Alert> //!< XrdSsi Alert message type - XrdSsiPbRequestType; - diff --git a/XRootdSSiRmcd/RmcdClient.cpp b/XRootdSSiRmcd/RmcdClient.cpp deleted file mode 100644 index be824e8967b7f6bfcceb7bf318b8b40c598771c4..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/RmcdClient.cpp +++ /dev/null @@ -1,394 +0,0 @@ -/*! - * @project XRootD SSI/Protocol Buffer Interface Project - * @brief Command-line rmc_test client for XRootD SSI/Protocol Buffers - * @copyright Copyright 2018 CERN - * @license This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include <sstream> -#include <iostream> -#include <iomanip> -#include <algorithm> -#include <common/make_unique.hpp> - -#include "XrdSsiPbIStreamBuffer.hpp" -#include "RmcdClient.hpp" - -#include <getopt.h> - -bool is_metadata_done = false; - -// Define XRootD SSI callbacks - -namespace XrdSsiPb { - -/* - * Alert callback. - * - * Defines how Alert messages should be logged - */ -template<> -void RequestCallback<rmc_test::Alert>::operator()(const rmc_test::Alert &alert) -{ - Log::Msg(Log::INFO, LOG_SUFFIX, "Alert received:"); - - // Output message in Json format - Log::DumpProtobuf(Log::INFO, &alert); -} - -} // namespace XrdSsiPb - - -// -// RmcdClient implementation -// - -const std::string DEFAULT_ENDPOINT = "localhost:10956"; - -// Change console text colour - -const char* const TEXT_RED = "\x1b[31;1m"; -const char* const TEXT_NORMAL = "\x1b[0m\n"; - - - -// Convert string to bool - -bool to_bool(std::string str) { - std::transform(str.begin(), str.end(), str.begin(), ::tolower); - if(str == "true") return true; - if(str == "false") return false; - - throw std::runtime_error(str + " is not a valid boolean value"); -} - -void RmcdClientCmd::throwUsage(const std::string &error_txt) const -{ - std::stringstream help; - if(error_txt != "") { - help << m_execname << ": " << error_txt << std::endl << std::endl; - } - help << "Usage:\n" - "\n" - "cta-xsmc [cmdOptions]\n" - "Where cmdOptions can be one of those:\n" - "\n" - "\tmount -V vid -D drive_ordinal\n" - "\tdismount\n" - "\timport\n" - "\texport\n" - "\tread_elem [-N nbelem] [-S starting_slot] [-v]\n" - "\tfind_cartridge V [-N nbelem] [-V vid] [-v]\n" - "\tget_geom\n" - "\n"; - throw std::runtime_error(help.str()); -} - -void RmcdClientCmd::mountUsage(const std::string &error_txt) const -{ - std::stringstream help; - if(error_txt != "") { - help << m_execname << ": " << error_txt << std::endl << std::endl; - } - - help <<"Usage:\n" - "\n" - " mount [options] -V VID -D DRIVE_SLOT\n" - "\n" - "Where:\n" - "\n" - " VID The VID of the volume to be mounted.\n" - " DRIVE_SLOT The slot in the tape library where the drive is located.\n" - " The format of DRIVE_SLOT is as follows:\n" - "\n" - " ACS:LSM:panel:transport\n" - "\n" - "Options:\n" - " -h|--help Print this help message and exit.\n" - "\n" - " -t|--timeout SECONDS Time to wait for the mount to conclude. SECONDS\n" - " must be an integer value greater than 0. The\n" - " default value of SECONDS is " - "\n"; - throw std::runtime_error(help.str()); -} - -void RmcdClientCmd::dismountUsage(const std::string &error_txt) const -{ - std::stringstream help; - - if(error_txt != "") { - help << m_execname << ": " << error_txt << std::endl << std::endl; - } - - help <<"Usage:\n" - "\n" - " dismount [options] -V VID -D DRIVE_SLOT\n" - "\n" - "Where:\n" - "\n" - " VID The VID of the volume to be dismounted.\n" - " DRIVE_SLOT The slot in the tape library where the drive is located.\n" - " The format of DRIVE_SLOT is as follows:\n" - "\n" - " ACS:LSM:panel:transport\n" - "\n" - "Options:\n" - " -h|--help Print this help message and exit.\n" - "\n" - " -t|--timeout SECONDS Time to wait for the dismount to conclude. SECONDS\n" - " must be an integer value greater than 0. The\n" - " default value of SECONDS is " - "\n"; - throw std::runtime_error(help.str()); -} - -RmcdClientCmd::RmcdClientCmd(int argc, char *const *const argv) : - m_execname(argv[0]), - m_endpoint(DEFAULT_ENDPOINT) -{ - // Strip path from execname - - size_t p = m_execname.find_last_of('/'); - if(p != std::string::npos) m_execname.erase(0, p+1); - - // Parse the command - if(argc<2) { - RmcdClientCmd::throwUsage("Missing command option"); - return; - } - - std::string cmdOptions(argv[1]); - - if(cmdOptions == "help") { - throwUsage("help"); - } - else if(cmdOptions == "mount") { - if(argc==3) { - std::string cmdh(argv[2]); - - if(cmdh == "help") { - mountUsage("helping in mount"); - return; - } - } - processMount(argc, argv); - } else if(cmdOptions == "dismount") { - if(argc==3) { - std::string cmdh(argv[2]); - - if(cmdh == "help") { - dismountUsage("helping in dismount"); - return; - } - } - processDismount(argc, argv); - } else { - throwUsage("Unrecognized command: "); - } - - // Read environment variables - - XrdSsiPb::Config config; - - // If XRDDEBUG=1, switch on all logging - if(getenv("XRDDEBUG")) { - config.set("log", "all"); - } - - // XrdSsiPbLogLevel gives more fine-grained control over log level - config.getEnv("log", "XrdSsiPbLogLevel"); - - // Default response timeout - config.getEnv("request_timeout", "XRD_REQUESTTIMEOUT"); - - // Obtain a Service Provider - std::string resource("/rmc_test"); - m_rmc_test_service_ptr = cta::make_unique<XrdSsiPbServiceType>(m_endpoint, resource, config); -} - -void RmcdClientCmd::processMount(int argc, char *const *const argv) { - int errflg = 0; - int drvord = -1; - int n; - char vid[7]; - char *dp; - char c=0; - static struct option longopts[] = { - { "help", no_argument, NULL, 'h'}, - { "Vid", required_argument, NULL, 'V'}, - { "Drive_original", required_argument, NULL, 'D' }, - { NULL, 0, NULL, '\0' } - }; - memset (vid, '\0', sizeof(vid)); - if (argc<6) { - RmcdClientCmd::mountUsage("less arguments provided"); - return; - } - if(*argv[2]!= '-') { - RmcdClientCmd::mountUsage("Unrecognised command format given\n"); - } - - while ((c = getopt_long(argc, argv, "hV:D:",longopts, NULL))!= -1) { - switch (c) { - case 'h': - RmcdClientCmd::mountUsage("help"); - break; - case 'D': /* drive ordinal */ - { - drvord = strtol (optarg, &dp, 10); - if (*dp != '\0' || drvord < 0) { - errflg++; - } - strcpy (dp, optarg); - printf("drive slot = %s\n",dp); - m_request.mutable_mount()->set_drvord(drvord); - break; - } - case 'V': /* vid */ - { - n = strlen (optarg); - if (n > 6) { - errflg++; - } else { - strcpy (vid, optarg); - printf("vid = %s\n",vid); - m_request.mutable_mount()->set_vid(vid);} - break; - } - case '?': /* Unrecognized option */ - default:{ - RmcdClientCmd::mountUsage("Unrecognised commands\n"); - break; - } - } - } -} - -void RmcdClientCmd::processDismount(int argc, char *const *const argv) { - int errflg = 0; - int drvord = -1; - int n; - char vid[7]; - char *dp; - char c; - static struct option longopts[] = { - { "help", required_argument, NULL, 'h'}, - { "Vid", required_argument, NULL, 'V'}, - { "Drive_original", required_argument, NULL, 'D' }, - { NULL, 0, NULL, '\0' } - }; - memset (vid, '\0', sizeof(vid)); - if (argc<6) { - RmcdClientCmd::dismountUsage("less arguments provided"); - return; - } - if(*argv[2]!= '-') { - RmcdClientCmd::dismountUsage("Unrecognised command format given\n"); - } - while ((c = getopt_long(argc, argv, "hV:D:",longopts, NULL))!= -1) { - switch (c) { - case 'h': - RmcdClientCmd::dismountUsage("help"); - break; - case 'D': { /* drive ordinal */ - drvord = strtol (optarg, &dp, 10); - if (*dp != '\0' || drvord < 0) { - errflg++;} - strcpy (dp, optarg); - printf("drive slot = %s\n",dp); - m_request.mutable_dismount()->set_drvord(drvord); - break; - } - case 'V': { /* vid */ - n = strlen (optarg); - if (n > 6) { - errflg++; - } else { - strcpy (vid, optarg); - printf("vid = %s\n",vid); - m_request.mutable_dismount()->set_vid(vid);} - break; - } - case '?': - default:{ - RmcdClientCmd::dismountUsage("Unrecognised command"); - break; - } - } - } -} - - -void RmcdClientCmd::Send() -{ - // Send the Request to the Service and get a Response - rmc_test::Response response; - m_rmc_test_service_ptr->Send(m_request, response); - // Handle responses - switch(response.type()) - { - using namespace rmc_test; - - case Response::RSP_SUCCESS: std::cout << response.message_txt(); break; - case Response::RSP_ERR_PROTOBUF: throw XrdSsiPb::PbException(response.message_txt()); - case Response::RSP_ERR_USER: - case Response::RSP_ERR_SERVER: throw std::runtime_error(response.message_txt()); - default: throw XrdSsiPb::PbException("Invalid response type."); - } - is_metadata_done = true; -} - - -/*! - * Start here - * - * @param argc[in] The number of command-line arguments - * @param argv[in] The command-line arguments - * - * @retval 0 Success - * @retval 1 The client threw an exception - */ -int main(int argc, char **argv) -{ - try { - // Test uninitialised logging : logging is not available until the rmc_test_service object is - // instantiated, so this message should be silently ignored - XrdSsiPb::Log::Msg(XrdSsiPb::Log::ERROR, "main", "Logging is not initialised"); - - // Parse the command line arguments - RmcdClientCmd cmd(argc, argv); - - // Send the protocol buffer - cmd.Send(); - - // Delete all global objects allocated by libprotobuf - google::protobuf::ShutdownProtobufLibrary(); - - return 0; - } catch (XrdSsiPb::PbException &ex) { - std::cerr << "Error in Google Protocol Buffers: " << ex.what() << std::endl; - } catch (XrdSsiPb::XrdSsiException &ex) { - std::cerr << "Error from XRootD SSI Framework: " << ex.what() << std::endl; - } catch (std::runtime_error &ex) { - std::cerr << ex.what() << std::endl; - } catch (std::exception &ex) { - std::cerr << "Caught exception: " << ex.what() << std::endl; - } catch (...) { - std::cerr << "Caught an unknown exception" << std::endl; - } - - return 1; -} - diff --git a/XRootdSSiRmcd/RmcdClient.hpp b/XRootdSSiRmcd/RmcdClient.hpp deleted file mode 100644 index d73d0b7d47208d8bc66250459f0a513afe867da5..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/RmcdClient.hpp +++ /dev/null @@ -1,51 +0,0 @@ -/*! - * @project XRootD SSI/Protocol Buffer Interface Project - * @brief Command-line rmc_test client for XRootD SSI/Protocol Buffers - * @copyright Copyright 2018 CERN - * @license This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#pragma once - -#include "RmcdApi.hpp" - -class RmcdClientCmd -{ -public: - RmcdClientCmd(int argc, char *const *const argv); - - /*! - * Send the protocol buffer across the XRootD SSI transport - */ - void Send(); - /*! - * Throw an exception with usage help - */ - void mountUsage(const std::string &error_txt = "") const; - void dismountUsage(const std::string &error_txt = "") const; - void throwUsage(const std::string &error_txt = "") const; - void processMount(int, char * const *const); - void processDismount(int, char * const *const); - -private: - - /* - * Member variables - */ - std::unique_ptr<XrdSsiPbServiceType> m_rmc_test_service_ptr; //!< Pointer to Service object - std::string m_execname; //!< Executable name of this program - std::string m_endpoint; //!< hostname:port of XRootD server - rmc_test::Request m_request; //!< Protocol Buffer for the command to send to the server -}; - diff --git a/XRootdSSiRmcd/RmcdRequestProc.cpp b/XRootdSSiRmcd/RmcdRequestProc.cpp deleted file mode 100644 index f8ac90eaf44259ea1e790a64a384b752df48150f..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/RmcdRequestProc.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/*! - * @project XRootD SSI/Protocol Buffer Interface Project - * @brief XRootD SSI Responder class implementation - * @copyright Copyright 2018 CERN - * @license This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "XrdSsiPbConfig.hpp" -#include <sstream> -#include <XrdSsi/XrdSsiEntity.hh> -#include "XrdSsiPbLog.hpp" -#include "XrdSsiPbException.hpp" -#include "XrdSsiPbRequestProc.hpp" -#include "RmcdServiceProvider.hpp" -#include <iostream> -#include "rmc_smcsubr.h" -#include "rmc_smcsubr2.h" -#include "smc_struct.h" -#include <string> - -/* - * Class to process Request Messages - */ -class RequestMessage -{ -public: - char* device_file = new char(); - RequestMessage(const XrdSsiEntity &client, const RmcdServiceProvider *service) { - using namespace XrdSsiPb; - Log::Msg(Log::DEBUG, LOG_SUFFIX, "RequestMessage() constructor: request received from client ", - client.name, '@', client.host); - } - - /*! - * Process a Notification request or an Admin command request - * - * @param[in] request - * @param[out] response Response protocol buffer - * @param[out] stream Reference to Response stream pointer - */ - void process(const rmc_test::Request &request, rmc_test::Response &response, std::string &data_buffer, XrdSsiStream* &stream) { - - using namespace XrdSsiPb; - using namespace rmc_test; - if (request.has_mount()) { - std::stringstream message; - response.set_message_txt(message.str()); - response.set_type(Response::RSP_SUCCESS); - /* get robot geometry */ - int c; - robot_info m_robot_info; - - const int max_nb_attempts = 3; - int attempt_nb = 1; - for(attempt_nb = 1; attempt_nb <= max_nb_attempts; attempt_nb++) { - std::cout<<"The device file before the get_geometry is "<<device_file<<std::endl; - c = smc_get_geometry (-1, - device_file, ///dev/sgx for example - &m_robot_info); - if (c==0){ - message << "Got geometry of tape library"<< std::endl; - } - std::string driverStr = std::to_string (request.mount().drvord()); - int n = (request.mount().vid()).length(); - // declaring character array - char *ch_array = new char[n+1]; - - // copying the contents of the string to char array - strcpy(ch_array, (request.mount().vid()).c_str()); - - c = smc_mount (-1,-1, device_file, &m_robot_info, - request.mount().drvord(), ch_array, 0); - } - } else if (request.has_dismount()) { - std::stringstream message; - response.set_message_txt(message.str()); - response.set_type(Response::RSP_SUCCESS); - - /* get robot geometry */ - int c; - robot_info m_robot_info; - const int max_nb_attempts = 3; - int attempt_nb = 1; - for(attempt_nb = 1; attempt_nb <= max_nb_attempts; attempt_nb++) { - c = smc_get_geometry (-1, - device_file, &m_robot_info); - if (c==0){ - message << "Got geometry of tape library"<< std::endl; - } - std::string driverStr = std::to_string (request.dismount().drvord()); - int n = (request.dismount().vid()).length(); - - /* declaring character array */ - char *ch_array = new char[n+1]; - - /* copying the contents of the string to char array */ - strcpy(ch_array, (request.dismount().vid()).c_str()); - - c = smc_dismount (-1,-1, device_file, &m_robot_info, - request.dismount().drvord(), ch_array); - } - } - } - -private: - - // Set reply header in metadata - - void set_header(rmc_test::Response &response) { - const char* const TEXT_RED = "\x1b[31;1m"; - const char* const TEXT_NORMAL = "\x1b[0m\n"; - - std::stringstream header; - - header << TEXT_RED << "Count " - << "Int64 Value " - << "Double Value " - << "Bool String Value" << TEXT_NORMAL; - - response.set_message_txt(header.str()); - } - - static constexpr const char* const LOG_SUFFIX = "Pb::RequestMessage"; //!< Identifier for log messages -}; - - - -/* - * Implementation of XRootD SSI subclasses - */ -namespace XrdSsiPb { - -/* - * Convert a framework exception into a Response - */ - -template<> -void ExceptionHandler<rmc_test::Response, PbException>::operator()(rmc_test::Response &response, const PbException &ex) -{ - response.set_type(rmc_test::Response::RSP_ERR_PROTOBUF); - response.set_message_txt(ex.what()); -} - - - -/* - * Process the Notification Request - */ -template <> -void RequestProc<rmc_test::Request, rmc_test::Response, rmc_test::Alert>::ExecuteAction() -{ - try { - // Perform a capability query on the XrdSsiProviderServer object: it must be a RmcdServiceProvider - - RmcdServiceProvider *rmc_test_service_ptr; - - if(!(rmc_test_service_ptr = dynamic_cast<RmcdServiceProvider*>(XrdSsiProviderServer))) - { - throw std::runtime_error("XRootD Service is not the Test Service"); - } - RequestMessage request_msg(*(m_resource.client), rmc_test_service_ptr); - strcpy(request_msg.device_file,((rmc_test_service_ptr->scsi_device).c_str())); //get the filename to mount/dismount from the configuration file - request_msg.process(m_request, m_metadata, m_response_str, m_response_stream_ptr); - } catch(PbException &ex) { - m_metadata.set_type(rmc_test::Response::RSP_ERR_PROTOBUF); - m_metadata.set_message_txt(ex.what()); - } catch(std::exception &ex) { - // Serialize and send a log message - - rmc_test::Alert alert_msg; - alert_msg.set_message_txt("Something bad happened"); - Alert(alert_msg); - - // Send the metadata response - - m_metadata.set_type(rmc_test::Response::RSP_ERR_SERVER); - m_metadata.set_message_txt(ex.what()); - } -} - -} // namespace XrdSsiPb diff --git a/XRootdSSiRmcd/RmcdServiceProvider.cpp b/XRootdSSiRmcd/RmcdServiceProvider.cpp deleted file mode 100644 index 4ab8465c36f64a7b3d0a5cd9ef54224483aa4304..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/RmcdServiceProvider.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/*! - * @project XRootD SSI/Protocol Buffer Interface Project - * @brief XRootD Service Provider class implementation - * @copyright Copyright 2018 CERN - * @license This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "XrdSsiPbConfig.hpp" -#include "XrdSsiPbAlert.hpp" -#include "XrdSsiPbService.hpp" -#include <iostream> -#include <string> - -#include "protobuf/rmc_test.pb.h" -#include "RmcdServiceProvider.hpp" - - - -/*! - * Global pointer to the Service Provider object. - * - * This must be defined at library load time (i.e. it is a file-level global static symbol). When the - * shared library is loaded, XRootD initialization fails if the appropriate symbol cannot be found (or - * it is a null pointer). - */ -XrdSsiProvider *XrdSsiProviderServer = new RmcdServiceProvider; - - - -/*! - * Initialise the Service Provider - */ -bool RmcdServiceProvider::Init(XrdSsiLogger *logP, XrdSsiCluster *clsP, const std::string cfgFn, const std::string parms, int argc, char **argv) -{ - using namespace XrdSsiPb; - - Log::Say("Called Init(\"", cfgFn, "\",\"", parms, "\")"); - - // Extract configuration items from config file - Config config(cfgFn, "rmc_test"); - auto test_log = config.getOptionList("log"); - if(!test_log.empty()) { - Log::SetLogLevel(test_log); - } else { - Log::SetLogLevel("info"); - } - - auto v_scsi_devices = config.getOptionList("cta.xrmcd.smcdev"); - scsi_device = v_scsi_devices[0]; - Log::SetLogLevel(scsi_device); - if(scsi_device.empty()) { - Log::SetLogLevel("name of the device_file not specified by the user in the configuration file"); - } - return true; -} - - - -/*! - * Instantiate a Service object - */ - -XrdSsiService* RmcdServiceProvider::GetService(XrdSsiErrInfo &eInfo, const std::string &contact, int oHold) -{ - using namespace XrdSsiPb; - - Log::Msg(Log::INFO, LOG_SUFFIX, "Called GetService(", contact, ',', oHold, ')'); - - XrdSsiService *ptr = new XrdSsiPb::Service<rmc_test::Request, rmc_test::Response, rmc_test::Alert>; - - return ptr; -} - - - -/*! - * Query whether a resource exists on a server. - * - * @param[in] rName The resource name - * @param[in] contact Used by client-initiated queries for a resource at a particular endpoint. - * It is set to NULL for server-initiated queries. - * - * @retval XrdSsiProvider::notPresent The resource does not exist - * @retval XrdSsiProvider::isPresent The resource exists - * @retval XrdSsiProvider::isPending The resource exists but is not immediately available. (Useful - * only in clustered environments where the resource may be - * immediately available on some other node.) - */ - -XrdSsiProvider::rStat RmcdServiceProvider::QueryResource(const char *rName, const char *contact) -{ - using namespace XrdSsiPb; - - // We only have one resource - XrdSsiProvider::rStat resourcePresence = (strcmp(rName, "/rmc_test") == 0) ? - XrdSsiProvider::isPresent : XrdSsiProvider::notPresent; - - Log::Msg(Log::INFO, LOG_SUFFIX, "QueryResource(", rName, "): ", - ((resourcePresence == XrdSsiProvider::isPresent) ? "isPresent" : "notPresent")); - - return resourcePresence; -} - diff --git a/XRootdSSiRmcd/RmcdServiceProvider.hpp b/XRootdSSiRmcd/RmcdServiceProvider.hpp deleted file mode 100644 index 270df1f26418f70672abd73f04e402c2ac1190aa..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/RmcdServiceProvider.hpp +++ /dev/null @@ -1,76 +0,0 @@ -/*! - * @project XRootD SSI/Protocol Buffer Interface Project - * @brief XRootD Service Provider class implementation - * @copyright Copyright 2018 CERN - * @license This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#pragma once - -#include <XrdSsi/XrdSsiProvider.hh> -#include "protobuf/rmc_test.pb.h" -#include "XrdSsiPbConfig.hpp" - - - -/*! - * Global pointer to the Service Provider object. - */ -extern XrdSsiProvider *XrdSsiProviderServer; - - - -/*! - * Instantiates a Service to process client requests. - */ -class RmcdServiceProvider : public XrdSsiProvider -{ -public: - RmcdServiceProvider() { - // No logging here as we don't set the log level until Init() is called - } - - virtual ~RmcdServiceProvider() { - using namespace XrdSsiPb; - - Log::Msg(Log::DEBUG, LOG_SUFFIX, "Called RmcdServiceProvider() destructor"); - } - - /*! - * Initialize the object. - * - * This is always called before any other method. - */ - bool Init(XrdSsiLogger *logP, XrdSsiCluster *clsP, const std::string cfgFn, - const std::string parms, int argc, char **argv) override; - - /*! - * Called exactly once after initialisation to obtain an instance of an XrdSsiService object - */ - XrdSsiService *GetService(XrdSsiErrInfo &eInfo, const std::string &contact, int oHold=256) override; - - /*! - * Determine resource availability. Can be called any time the client asks for the resource status. - */ - XrdSsiProvider::rStat QueryResource(const char *rName, const char *contact=0) override; - - /*! - * Defines the device file to mount or dismount the volume - */ - std::string scsi_device; - -private: - static constexpr const char* const LOG_SUFFIX = "TestStream"; //!< Identifier for log messages -}; - diff --git a/XRootdSSiRmcd/cta-xrmcd.conf b/XRootdSSiRmcd/cta-xrmcd.conf deleted file mode 100644 index 14cdf95904280da1842f3a01e5d02e8c2179b0a0..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/cta-xrmcd.conf +++ /dev/null @@ -1,41 +0,0 @@ -# -# XRootD SSI/Protocol Buffer Interface Project -# Copyright 2018 CERN -# - -# Set the log level for the XrdSsiPb messages. -# This is a space-separated list of one or more of the following options: -# -# none error warning info debug protobuf protoraw all -rmc_test.log info protobuf - -# Set the debug level to off/debug/all for no debug/debug/verbose debug -ssi.trace debug - -# Tell XRootD to use only the SSI framework. If you wish to also use the filesystem features of -# XRootD then add the keyword "default", or specify a second plugin. -xrootd.fslib libXrdSsi.so - -# Turn off async processing as this does not work with SSI -xrootd.async off - -# Specify the location of the shared library implementing the SSI service -#ssi.svclib /home/akaracha/CTA_build/XRootdSSiRmcd/libXrdSsiRmcd.so -ssi.svclib libXrdSsiRmcd.so - -# Specify the resource lookup function to be used -#oss.statlib -2 libXrdSsi.so - -# Specify the endpoint -#xrd.allow host localhost -xrd.port 10956 - -# Declare the valid prefix for resource names. You can have as many of these directives as you wish, -# each specifying a different prefix. Use a question mark ? to split the resource into a name and a -# CGI string. - -# Export the /test resource for SSI -all.export /rmc_test nolock r/w - -# User has to specify the name of the device file -cta.xrmcd.smcdev /dev/sg9 diff --git a/XRootdSSiRmcd/cta-xrmcd.logrotate b/XRootdSSiRmcd/cta-xrmcd.logrotate deleted file mode 100644 index 7625211eac53b7920ad775e046301b75f1e340a7..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/cta-xrmcd.logrotate +++ /dev/null @@ -1,11 +0,0 @@ - -/var/log/cta/cta-xrmcd*.log { - compress - daily - missingok - rotate 500 - delaycompress - postrotate - /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true - endscript -} diff --git a/XRootdSSiRmcd/cta-xrmcd.service b/XRootdSSiRmcd/cta-xrmcd.service deleted file mode 100644 index 50d6d8c850fe66f0c5f45c15f978c832837e0f26..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/cta-xrmcd.service +++ /dev/null @@ -1,16 +0,0 @@ - -[Unit] - -Description=CTA rmcd plugin for the XRoot deamon -After=network-online.target - -[Service] -ExecStart=/usr/bin/xrootd -c /etc/cta/cta-xrmcd.conf -k fifo -n cta -User=cta -Type=simple -Restart=no -LimitCORE=infinity -LimitNOFILE=65536 - -[Install] -WantedBy=default.target diff --git a/XRootdSSiRmcd/cta-xrmcd.sysconfig b/XRootdSSiRmcd/cta-xrmcd.sysconfig deleted file mode 100644 index 01e494ed42bae981fb3c3fb5b7d433ad00fe908e..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/cta-xrmcd.sysconfig +++ /dev/null @@ -1,5 +0,0 @@ - -# Arguments for the xrmcd server daemon -# -smc_ldr is the picker device as defined in /dev. -# -f keep process in the foreground, do not fork. -#CTA_XRMCD_OPTIONS="smc_ldr" diff --git a/XRootdSSiRmcd/cta-xsmc-dismount.1cta b/XRootdSSiRmcd/cta-xsmc-dismount.1cta deleted file mode 100644 index 81c426f6e317960c61c85d8b5fae5558dd8b9d19..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/cta-xsmc-dismount.1cta +++ /dev/null @@ -1,47 +0,0 @@ -.\" The CERN Tape Archive (CTA) project -.\" Copyright (C) 2015 CERN -.\" -.\" This program is free software: you can redistribute it and/or modify -.\" it under the terms of the GNU General Public License as published by -.\" the Free Software Foundation, either version 3 of the License, or -.\" (at your option) any later version. -.\" -.\" This program 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 General Public License for more details. -.\" -.\" You should have received a copy of the GNU General Public License -.\" along with this program. If not, see <http://www.gnu.org/licenses/>. -.TH CTA-XSMC DISMOUNT 1CTA "October 2018" CTA CTA -.SH NAME -cta-xsmc dismount \- dismount a volume -.SH SYNOPSIS -.BI "cta-xsmc dismount [options] -V VID -D DRIVE_SLOT" - -.SH DESCRIPTION -\fBWarning\fP, \fBcta-xsmc dismount\fP is a command line tool for dismounting tapes in a library through XRootD SSI/Protocol Buffer Interface Project - -\fBcta-xsmc dismount\fP dismounts the volume with the specified -\fBVID\fP from the drive located in the specified \fBDRIVE_SLOT\fP within the -tape library. \fBDRIVE_SLOT\fP must be in one of the following two forms: -.IP -.B acsACS_NUMBER,LSM_NUMBER,PANEL_NUMBER,TRANSPORT_NUMBER -.IP -.B smcDRIVE_ORDINAL - -.SH OPTIONS -.TP -\fB\-d, \-\-debug -Turns on the printing of debug information. -.TP -\fB\-h, \-\-help -Prints the usage message. -.TP -\fB\-f, \-\-force -Force the dismount (rewind and eject the tape where necessary). - -.SH "RETURN CODES" -.TP -\fB 0 -Ok. diff --git a/XRootdSSiRmcd/cta-xsmc-mount.1cta b/XRootdSSiRmcd/cta-xsmc-mount.1cta deleted file mode 100644 index 6ca8875d8ca18b777312a59c2159f5525109821b..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/cta-xsmc-mount.1cta +++ /dev/null @@ -1,48 +0,0 @@ -.\" The CERN Tape Archive (CTA) project -.\" Copyright (C) 2015 CERN -.\" -.\" This program is free software: you can redistribute it and/or modify -.\" it under the terms of the GNU General Public License as published by -.\" the Free Software Foundation, either version 3 of the License, or -.\" (at your option) any later version. -.\" -.\" This program 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 General Public License for more details. -.\" -.\" You should have received a copy of the GNU General Public License -.\" along with this program. If not, see <http://www.gnu.org/licenses/>. -.TH CTA-XSMC MOUNT 1CTA "October 2018" CTA CTA -.SH NAME -cta-xsmc mount \- mount a volume -.SH SYNOPSIS -.BI "cta-xsmc mount [options] -V VID -D DRIVE_SLOT" - -.SH DESCRIPTION -\fBWarning\fP, \fBcta-xsmc mount\fP is a CTA command line tool to mount tapes in a tape library through XRootD SSI/Protocol Buffer Interface Project - -\fBcta-xsmc mount\fP mounts the volume with the specified -\fBVID\fP into the drive located in the specified \fBDRIVE_SLOT\fP within the -tape library. \fBDRIVE_SLOT\fP must be in one of the following two forms: -.IP -.B acsACS_NUMBER,LSM_NUMBER,PANEL_NUMBER,TRANSPORT_NUMBER -.IP -.B smcDRIVE_ORDINAL - -.SH OPTIONS -.TP -\fB\-d, \-\-debug -Turns on the printing of debug information. -.TP -\fB\-h, \-\-help -Prints the usage message. -.TP -\fB\-r, \-\-readonly -Request the volume is mounted for read-only access. - -.SH "RETURN CODES" -.TP -\fB 0 -Ok. -.TP diff --git a/XRootdSSiRmcd/protobuf/CMakeLists.txt b/XRootdSSiRmcd/protobuf/CMakeLists.txt deleted file mode 100644 index ef46264164068afe6f2105719a254588ea102f84..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/protobuf/CMakeLists.txt +++ /dev/null @@ -1,38 +0,0 @@ -# XRootD SSI/Protocol Buffer Interface Project -# Copyright 2018 CERN -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -cmake_minimum_required (VERSION 2.6) - -find_package(Protobuf3 REQUIRED) - -file(GLOB ProtoFiles "${CMAKE_CURRENT_SOURCE_DIR}/*.proto") -PROTOBUF3_GENERATE_CPP(ProtoSources ProtoHeaders ${ProtoFiles}) -foreach(PROTO_SRC ${ProtoSources}) - set_property(SOURCE ${PROTO_SRC} PROPERTY COMPILE_FLAGS " -Wno-missing-field-initializers -fPIC -Wno-narrowing -Wno-implicit-fallthrough") - - # Add -Wno-narrowing -Wno-implicit-fallthrough compiler flags if using gcc - # version 7 or greater - if (CMAKE_COMPILER_IS_GNUCC) - if (GCC_VERSION VERSION_EQUAL 7 OR GCC_VERSION VERSION_GREATER 7) - set_property(SOURCE ${PROTO_SRC} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-narrowing -Wno-implicit-fallthrough") - endif (GCC_VERSION VERSION_EQUAL 7 OR GCC_VERSION VERSION_GREATER 7) - endif (CMAKE_COMPILER_IS_GNUCC) -endforeach(PROTO_SRC) -set (TEST_PROTO_SRC_FILES ${ProtoSources}) - -include_directories(${PROTOBUF3_INCLUDE_DIRS}) -add_library(XrdSsiPbRmcd ${TEST_PROTO_SRC_FILES}) -target_link_libraries(XrdSsiPbRmcd ${PROTOBUF3_LIBRARIES}) - diff --git a/XRootdSSiRmcd/protobuf/rmc_test.proto b/XRootdSSiRmcd/protobuf/rmc_test.proto deleted file mode 100644 index 160ed19bff436f84332eb446ab02d3fe20f3ed8d..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/protobuf/rmc_test.proto +++ /dev/null @@ -1,120 +0,0 @@ -// @project XRootD SSI/Protocol Buffer Interface Project -// @brief Protocol buffer definitions for test client/server -// @copyright Copyright 2018 CERN -// @license This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. - -syntax = "proto3"; -package rmc_test; - - -message MountOptions { - string vid = 4; // char * template - uint32 drvord = 6; -} - -message DismountOptions { - string vid = 4; // char * template - uint32 drvord = 5; // maybe given as a string -} - - -message FindcartOptions { - uint32 uid = 1; - uint32 gid = 2; - string smc_ldr = 3; // char * - string template = 4; // char * - int32 type = 5; - int64 startaddr = 6; - int64 nbelem = 7; -} - -message GetGeomOptions { - uint32 uid = 1; - uint32 gid = 2; - string smc_ldr = 3; // char * -} - -message ImportExportOptions { - uint32 uid = 1; - uint32 gid = 2; - string smc_ldr = 3; // char * - string vid = 4; // char * template -} - -message ReadelemOptions { - int32 uid = 1; - uint32 gid = 2; - string smc_ldr = 3; // char * - int32 type = 4; - int64 startaddr = 5; - int64 nbelem = 6; -} - - -// -// Requests sent to the Test Server -// -message Record { -} - - -// -// Requests sent to the Test Server -// -message Request { - oneof cmdOptions { - MountOptions mount = 1; - DismountOptions dismount = 2; - FindcartOptions findcart = 3; - GetGeomOptions getGeometry = 4; - ImportExportOptions export = 5; - ImportExportOptions import = 6; - ReadelemOptions readelem = 7; - } -} - - -// -// Metadata responses sent by the Test Server -// -message Response { - enum ResponseType { - RSP_INVALID = 0; //< Response type was not set - RSP_SUCCESS = 1; //< Request is valid and was accepted for processing - RSP_ERR_PROTOBUF = 2; //< Framework error caused by Google Protocol Buffers layer - RSP_ERR_SERVER = 3; //< Server error - RSP_ERR_USER = 4; //< User request is invalid - } - ResponseType type = 1; //< Encode the type of this response - string message_txt = 2; //< Optional response message text -} - - - -// -// Stream/Data responses sent by the Test Server -// -message Data { - Response record = 1; //< Response record -} - - - -// -// Alert Messages -// -message Alert { - string message_txt = 1; //< Text of the alert message -} - diff --git a/XRootdSSiRmcd/rbtsubr_constants.h b/XRootdSSiRmcd/rbtsubr_constants.h deleted file mode 100644 index 9cce18c281994db51c59bf83f7a65df4c97f02b2..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/rbtsubr_constants.h +++ /dev/null @@ -1,39 +0,0 @@ -/****************************************************************************** - * - * This file is part of the Castor project. - * See http://castor.web.cern.ch/castor - * - * Copyright (C) 2003 CERN - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * This program 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 General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * - * - * - * @author Castor Dev team, castor-dev@cern.ch - *****************************************************************************/ - -#pragma once - - /* rbtsubr return codes */ - -#define RBT_OK 0 /* Ok or error should be ignored */ -#define RBT_NORETRY 1 /* Unrecoverable error (just log it) */ -#define RBT_SLOW_RETRY 2 /* Should release drive & retry in 600 seconds */ -#define RBT_FAST_RETRY 3 /* Should retry in 60 seconds */ -#define RBT_DMNT_FORCE 4 /* Should do first a demount force */ -#define RBT_CONF_DRV_DN 5 /* Should configure the drive down */ -#define RBT_OMSG_NORTRY 6 /* Should send a msg to operator and exit */ -#define RBT_OMSG_SLOW_R 7 /* Ops msg (nowait) + release drive + slow retry */ -#define RBT_OMSGR 8 /* Should send a msg to operator and wait */ -#define RBT_UNLD_DMNT 9 /* Should unload the tape and retry demount */ - diff --git a/XRootdSSiRmcd/rmc_constants.h b/XRootdSSiRmcd/rmc_constants.h deleted file mode 100644 index 684b45dddaf2ecb599dcf8216add6fb85a43d9c1..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/rmc_constants.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * $Id: rmc_constants.h,v 1.1 2002/12/01 07:31:57 baud Exp $ - */ - -/* - * Copyright (C) 2001 by CERN/IT/PDP/DM - * All rights reserved - */ - -/* - */ - -#pragma once -#include "Castor_limits.h" - -#define RMC_CHECKI 5 /* max interval to check for work to be done */ -#define RMC_PRTBUFSZ 180 -#define RMC_REPBUFSZ 524288 /* must be >= max media changer server reply size */ -#define RMC_REQBUFSZ 256 /* must be >= max media changer server request size */ -#define RMC_MAGIC 0x120D0301 -#define RMC_TIMEOUT 5 /* netread timeout while receiving a request */ -#define RMC_RETRYI 60 -#define RMC_LOGBUFSZ 1024 - -#define RMC_PORT 5014 - -#define RMC_MAXRQSTATTEMPTS 10 /* Maximum number of attempts a retriable RMC request should be issued */ - - /* SCSI media changer utilities exit codes */ - -#define USERR 1 /* user error */ -#define SYERR 2 /* system error */ -#define CONFERR 4 /* configuration error */ - - /* Request types */ - -#define RMC_GETGEOM 1 /* Get robot geometry */ -#define RMC_FINDCART 2 /* Find cartridge(s) */ -#define RMC_READELEM 3 /* Read element status */ -#define RMC_MOUNT 4 /* Mount request */ -#define RMC_UNMOUNT 5 /* Unmount request */ -#define RMC_EXPORT 6 /* Export tape request */ -#define RMC_IMPORT 7 /* Import tape request */ -#define RMC_GENERICMOUNT 8 /* Generic (SCSI or ACS) mount request */ -#define RMC_GENERICUNMOUNT 9 /* Generic (SCSI or ACS) mount request */ - - /* SCSI media changer server reply types */ - -#define MSG_ERR 1 -#define MSG_DATA 2 -#define RMC_RC 3 - - /* SCSI media changer server messages */ - -#define RMC00 "RMC00 - SCSI media changer server not available on %s\n" -#define RMC01 "RMC01 - robot parameter is mandatory\n" -#define RMC02 "RMC02 - %s error : %s\n" -#define RMC03 "RMC03 - illegal function %d\n" -#define RMC04 "RMC04 - error getting request, netread = %d\n" -#define RMC05 "RMC05 - cannot allocate enough memory\n" -#define RMC06 "RMC06 - invalid value for %s\n" -#define RMC09 "RMC09 - fatal configuration error: %s %s\n" -#define RMC46 "RMC46 - request too large (max. %d)\n" -#define RMC92 "RMC92 - %s request by %d,%d from %s\n" -#define RMC98 "RMC98 - %s\n" - diff --git a/XRootdSSiRmcd/rmc_send_scsi_cmd.cpp b/XRootdSSiRmcd/rmc_send_scsi_cmd.cpp deleted file mode 100644 index 1003b3f438f8486a1c1c78bc1c5a446619def5e1..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/rmc_send_scsi_cmd.cpp +++ /dev/null @@ -1,303 +0,0 @@ -/* - * Copyright (C) 1996-2000 by CERN/IT/PDP/DM - * All rights reserved - */ - -/* rmc_send_scsi_cmd - Send a SCSI command to a device */ -/* return -5 if not supported on this platform (serrno = SEOPNOTSUP) - * -4 if SCSI error (serrno = EIO) - * -3 if CAM error (serrno = EIO) - * -2 if ioctl fails with errno (serrno = errno) - * -1 if open/stat fails with errno (message fully formatted) - * 0 if successful with no data transfer - * >0 number of bytes transferred - */ - -#include <iostream> -#include <unistd.h> -#include <sys/ioctl.h> -#include <stdio.h> -#include <string.h> -#include <errno.h> -#include <sys/types.h> -#include <fcntl.h> -#include <stdlib.h> -#include <dirent.h> -#include <sys/stat.h> -#include <linux/version.h> -#include <sys/param.h> -/* Impossible unless very very old kernels: */ -#ifndef KERNEL_VERSION -#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) -#endif -#include "/usr/include/scsi/sg.h" -#include <sys/stat.h> -#include "scsictl.h" -#include "serrno.h" -#include "rmc_send_scsi_cmd.h" -static char rmc_err_msgbuf[132]; -static const char *sk_msg[] = { - "No sense", - "Recovered error", - "Not ready", - "Medium error", - "Hardware error", - "Illegal request", - "Unit attention", - "Data protect", - "Blank check", - "Vendor unique", - "Copy aborted", - "Aborted command", - "Equal", - "Volume overflow", - "Miscompare", - "Reserved", -}; - -static void find_sgpath(char *const sgpath, const int maj, const int min) { - - /* - Find the sg device for a pair of major and minor device IDs - of a tape device. The match is done by - - . identifying the tape's st device node - . getting the device's unique ID from sysfs - . searching the sg device with the same ID (in sysfs) - - If no match is found, the returned sg path will be an empty - string. - */ - - char systape[] = "/sys/class/scsi_tape"; - char sysgen[] = "/sys/class/scsi_generic"; - char syspath[256]; - - char tlink[256]; - char glink[256]; - - int match = 0; - DIR *dir_tape, *dir_gen; - struct dirent *dirent; - char st_dev[64]; - - struct stat sbuf; - - sgpath[0] = '\0'; - - /* find the st sysfs entry */ - if (!(dir_tape = opendir(systape))) return; - while ((dirent = readdir(dir_tape))) { - - if (0 == strcmp(".", dirent->d_name)) continue; - if (0 == strcmp("..", dirent->d_name)) continue; - - sprintf(st_dev, "/dev/%s", dirent->d_name); - stat(st_dev, &sbuf); - if (maj == (int)major(sbuf.st_rdev) && min == (int)minor(sbuf.st_rdev)) { - sprintf(syspath, "%s/%s/device", systape, dirent->d_name); - match = 1; - break; - } - } - closedir(dir_tape); - - if (0 == match) return; - - memset(tlink, 0, 256); - readlink(syspath, tlink, 256); - - /* find the corresponding sg sysfs entry */ - if (!(dir_gen = opendir(sysgen))) return; - while ((dirent = readdir(dir_gen))) { - - if (0 == strcmp(".", dirent->d_name)) continue; - if (0 == strcmp("..", dirent->d_name)) continue; - - sprintf(syspath, "%s/%s/device", sysgen, dirent->d_name); - - memset(glink, 0, 256); - readlink(syspath, glink, 256); - - if (0 == strcmp(glink, tlink)) { - sprintf(sgpath, "/dev/%s", dirent->d_name); - goto out; - } - } - out: - closedir(dir_gen); - return; -} - - -int rmc_send_scsi_cmd ( - const int tapefd, - const char *const path, - const int do_not_open, - const unsigned char *const cdb, - const int cdblen, - unsigned char *const buffer, - const int buflen, - char *const sense, - const int senselen, - const int flags, - int *const nb_sense_ret, - const char **const msgaddr) -{ - /* The timeout used when sending SCSI commands through the sg driver is in */ - /* milliseconds and should equal that used by the st driver which on the */ - /* 28/01/2014 is 900 seconds and therefore 900000 milliseconds */ - const int timeout = 900000; /* milliseconds */ - int fd; - FILE *fopen(); - int n; - int resid = 0; - struct stat sbuf; - struct stat sbufa; - static char *sg_buffer; - static int sg_bufsiz = 0; - struct sg_header *sg_hd; - char sgpath[80]; - int timeout_in_jiffies = 0; - int sg_big_buff_val = SG_BIG_BUFF; - int procfd, nbread; - char procbuf[80]; - - (void)senselen; - /* First the value in /proc of the max buffer size for the sg driver */ - procfd = open("/proc/scsi/sg/def_reserved_size", O_RDONLY); - if (procfd >= 0) { - memset(procbuf, 0, sizeof(procbuf)); - nbread = read(procfd, procbuf, sizeof(procbuf) - 1); - if (nbread > 0) { - long int tmp; - char *endptr = NULL; - tmp = strtol(procbuf, &endptr, 10); - if (endptr == NULL || *endptr == '\n') { - sg_big_buff_val = (int) tmp; - } - } - close(procfd); - } - - if ((int)sizeof(struct sg_header) + cdblen + buflen > sg_big_buff_val) { - sprintf (rmc_err_msgbuf, "blocksize too large (max %zd)\n", - sg_big_buff_val - sizeof(struct sg_header) - cdblen); - *msgaddr = rmc_err_msgbuf; - serrno = EINVAL; - return (-1); - } - if ((int)sizeof(struct sg_header)+cdblen+buflen > sg_bufsiz) { - if (sg_bufsiz > 0) free (sg_buffer); - if ((sg_buffer = (char *)malloc (sizeof(struct sg_header)+cdblen+buflen)) == NULL) { - serrno = errno; - sprintf (rmc_err_msgbuf, "cannot get memory"); - *msgaddr = rmc_err_msgbuf; - return (-1); - } - sg_bufsiz = sizeof(struct sg_header) + cdblen + buflen; - } - if (do_not_open) { - fd = tapefd; - strcpy (sgpath, path); - } else { - if (stat (path, &sbuf) < 0) { - serrno = errno; - snprintf (rmc_err_msgbuf, sizeof(rmc_err_msgbuf), "%s : stat error : %s\n", path, strerror(errno)); - rmc_err_msgbuf[sizeof(rmc_err_msgbuf) - 1] = '\0'; - *msgaddr = rmc_err_msgbuf; - return (-1); - } - - /* get the major device ID of the sg devices ... */ - if (stat ("/dev/sg0", &sbufa) < 0) { - serrno = errno; - snprintf (rmc_err_msgbuf, sizeof(rmc_err_msgbuf), "/dev/sg0 : stat error : %s\n", strerror(errno)); - rmc_err_msgbuf[sizeof(rmc_err_msgbuf) - 1] = '\0'; - *msgaddr = rmc_err_msgbuf; - return (-1); - } - /* ... to detect links and use the path directly! */ - if (major(sbuf.st_rdev) == major(sbufa.st_rdev)) { - strcpy (sgpath, path); - } else { - find_sgpath(sgpath, major(sbuf.st_rdev), minor(sbuf.st_rdev)); - } - - if ((fd = open (sgpath, O_RDWR)) < 0) { - serrno = errno; - snprintf (rmc_err_msgbuf, sizeof(rmc_err_msgbuf), "%s : open error : %s\n", sgpath, strerror(errno)); - rmc_err_msgbuf[sizeof(rmc_err_msgbuf) - 1] = '\0'; - *msgaddr = rmc_err_msgbuf; - return (-1); - } - } - - /* set the sg timeout (in jiffies) */ - timeout_in_jiffies = timeout * HZ / 1000; - ioctl (fd, SG_SET_TIMEOUT, &timeout_in_jiffies); - - memset (sg_buffer, 0, sizeof(struct sg_header)); - sg_hd = (struct sg_header *) sg_buffer; - sg_hd->reply_len = sizeof(struct sg_header) + ((flags & SCSI_IN) ? buflen : 0); - sg_hd->twelve_byte = cdblen == 12; - memcpy (sg_buffer+sizeof(struct sg_header), cdb, cdblen); - n = sizeof(struct sg_header) + cdblen; - if (buflen && (flags & SCSI_OUT)) { - memcpy (sg_buffer+n, buffer, buflen); - n+= buflen; - } - if (write (fd, sg_buffer, n) < 0) { - *msgaddr = (char *) strerror(errno); - serrno = errno; - snprintf (rmc_err_msgbuf, sizeof(rmc_err_msgbuf), "%s : write error : %s\n", sgpath, *msgaddr); - rmc_err_msgbuf[sizeof(rmc_err_msgbuf) - 1] = '\0'; - *msgaddr = rmc_err_msgbuf; - if (! do_not_open) close (fd); - return (-2); - } - if ((n = read (fd, sg_buffer, sizeof(struct sg_header) + - ((flags & SCSI_IN) ? buflen : 0))) < 0) { - *msgaddr = (char *) strerror(errno); - serrno = errno; - snprintf (rmc_err_msgbuf, sizeof(rmc_err_msgbuf), "%s : read error : %s\n", sgpath, *msgaddr); - rmc_err_msgbuf[sizeof(rmc_err_msgbuf) - 1] = '\0'; - *msgaddr = rmc_err_msgbuf; - if (! do_not_open) close (fd); - return (-2); - } - if (! do_not_open) close (fd); - if (sg_hd->sense_buffer[0]) { - memcpy (sense, sg_hd->sense_buffer, sizeof(sg_hd->sense_buffer)); - *nb_sense_ret = sizeof(sg_hd->sense_buffer); - } - if (sg_hd->sense_buffer[0] & 0x80) { /* valid */ - resid = sg_hd->sense_buffer[3] << 24 | sg_hd->sense_buffer[4] << 16 | - sg_hd->sense_buffer[5] << 8 | sg_hd->sense_buffer[6]; - } - if ((sg_hd->sense_buffer[0] & 0x70) && - ((sg_hd->sense_buffer[2] & 0xE0) == 0 || - (sg_hd->sense_buffer[2] & 0xF) != 0)) { - char tmp_msgbuf[132]; - snprintf (tmp_msgbuf, sizeof(tmp_msgbuf), "%s ASC=%X ASCQ=%X", - sk_msg[*(sense+2) & 0xF], *(sense+12), *(sense+13)); - tmp_msgbuf[sizeof(tmp_msgbuf) - 1] = '\0'; - serrno = EIO; - snprintf (rmc_err_msgbuf, sizeof(rmc_err_msgbuf), "%s : scsi error : %s\n", sgpath, tmp_msgbuf); - rmc_err_msgbuf[sizeof(rmc_err_msgbuf) - 1] = '\0'; - *msgaddr = rmc_err_msgbuf; - return (-4); - } else if (sg_hd->result) { - *msgaddr = (char *) strerror(sg_hd->result); - serrno = sg_hd->result; - snprintf (rmc_err_msgbuf, sizeof(rmc_err_msgbuf), "%s : read error : %s\n", sgpath, *msgaddr); - rmc_err_msgbuf[sizeof(rmc_err_msgbuf) - 1] = '\0'; - *msgaddr = rmc_err_msgbuf; - return (-2); - } - if (n) - n -= sizeof(struct sg_header) + resid; - if (n && (flags & SCSI_IN)) - memcpy (buffer, sg_buffer+sizeof(struct sg_header), n); - return ((flags & SCSI_IN) ? n : buflen - resid); -} diff --git a/XRootdSSiRmcd/rmc_send_scsi_cmd.h b/XRootdSSiRmcd/rmc_send_scsi_cmd.h deleted file mode 100644 index 0ea32e0692f6d8857446d6bf5f1b763ca8ac568d..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/rmc_send_scsi_cmd.h +++ /dev/null @@ -1,40 +0,0 @@ -/****************************************************************************** - * - * This file is part of the Castor project. - * See http://castor.web.cern.ch/castor - * - * Copyright (C) 2003 CERN - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * This program 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 General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * - * - * - * @author Castor Dev team, castor-dev@cern.ch - *****************************************************************************/ - -#pragma once - - int rmc_send_scsi_cmd ( - const int tapefd, - const char *const path, - const int do_not_open, - const unsigned char *const cdb, - const int cdblen, - unsigned char *const buffer, - const int buflen, - char *const sense, - const int senselen, - const int flags, - int *const nb_sense_ret, - const char **const msgaddr); - diff --git a/XRootdSSiRmcd/rmc_sendrep.h b/XRootdSSiRmcd/rmc_sendrep.h deleted file mode 100644 index 04af53cf91044dfa0ec2519c150fc5cf5a7e04a1..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/rmc_sendrep.h +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (C) 1998-2002 by CERN/IT/PDP/DM - * All rights reserved - */ - -#pragma once - -//#include "osdep.h" - -//EXTERN_C int rmc_sendrep(const int rpfd, const int rep_type, ...); -int rmc_sendrep(const int rpfd, const int rep_type, ...); - diff --git a/XRootdSSiRmcd/rmc_smcsubr.cpp b/XRootdSSiRmcd/rmc_smcsubr.cpp deleted file mode 100644 index 512e44585bce2a870ef724ffe64e7418ca460c8e..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/rmc_smcsubr.cpp +++ /dev/null @@ -1,848 +0,0 @@ -/* - * Copyright (C) 1998-2003 by CERN/IT/PDP/DM - * All rights reserved - */ - -#include <sstream> -#include <iostream> -#include <iomanip> -#include <algorithm> - -#include <iostream> -#include <errno.h> -#include <stdarg.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/types.h> - -#include "rbtsubr_constants.h" -#include "rmc_constants.h" -#include "rmc_send_scsi_cmd.h" -#include "rmc_smcsubr.h" -#include "rmc_smcsubr2.h" -#include "scsictl.h" -#include "serrno.h" -#include "smc_constants.h" - -#define RBT_XTRA_PROC 10 - - -int rmc_logit(const char *const func, const char *const msg, ...) -{ - return 0; -} - -char *getconfent_fromfile(const char *filename, - const char *category, - const char *name, - int flags) -{ - throw std::runtime_error("Not impemented"); -} - -static struct smc_status smc_status; -static const char *smc_msgaddr; - -static void save_error( - const int rc, - const int nb_sense, - const char *const sense, - const char *const msgaddr) -{ - smc_msgaddr = msgaddr; - smc_status.rc = rc; - smc_status.skvalid = 0; - smc_status.save_errno = serrno; - if (rc == -4 && nb_sense >= 14) { - smc_status.asc = sense[12]; - smc_status.ascq = sense[13]; - smc_status.sensekey = sense[2] &0xF; - smc_status.skvalid = 1; - } else { - smc_status.asc = 0; - smc_status.ascq = 0; - smc_status.sensekey = 0; - } -} - -static int vmatch (const char *const pattern, const char *const vid) -{ - const char *p; - const char *v; - - for (p = pattern, v = vid; *p; p++, v++) { - if (*v == 0 && *p != '*') - return (1); - switch (*p) { - case '?': /* match any single character */ - continue; - case '*': - if (*(++p) == 0) - return (0); /* trailing * matches the rest */ - while (vmatch (p, v)) { - if (*(++v) == 0) - return (1); - } - return (0); - default: - if (*p != *v) - return (1); - } - } - return (*v != 0); -} - -static int get_element_size( - const int fd, - const char *const rbtdev, - const int type) -{ - unsigned char buf[128]; - unsigned char cdb[12]; - const char *msgaddr; - int nb_sense_ret; - int rc; - char sense[MAXSENSE]; - int voltag = 0x10; - int pause_mode = 1; - int nretries = 0; - - memset (cdb, 0, sizeof(cdb)); - cdb[0] = 0xB8; /* read element status */ - cdb[1] = voltag + type; /* we request volume tag info and this type */ - cdb[5] = 1; /* we only need one element */ - cdb[9] = 128; /* limit for the report */ - - /* IBM library in pause mode */ - while (pause_mode && nretries <= 900) { - rc = rmc_send_scsi_cmd (fd, rbtdev, 0, cdb, 12, buf, 128, - sense, 38, SCSI_IN, &nb_sense_ret, &msgaddr); - if (rc < 0) { - if (rc == -4 && nb_sense_ret >= 14 && (sense[12] == 0x04) && (sense[13] == -0X7B )) { - sleep(60); - pause_mode = 1; - } else { - pause_mode = 0; - } - } else { - pause_mode = 0; - } - nretries++; - } - - if (rc < 0) { - save_error (rc, nb_sense_ret, sense, msgaddr); - return (-1); - } - return (buf[10] * 256 + buf[11]); -} - -static int get_element_info( - const char opcode, - const int fd, - const char *const rbtdev, - const int type, - const int start, - const int nbelem, - struct smc_element_info element_info[]) -{ - int avail_elem; - unsigned char cdb[12]; - unsigned char *data; - int edl; - int element_size; - char func[16]; - int i; - int len; - const char *msgaddr; - int nb_sense_ret; - unsigned char *p; - unsigned char *page_end, *page_start; - unsigned char *q; - int rc; - char sense[MAXSENSE]; - int pause_mode = 1; - int nretries = 0; - int nbReportBytesRemaining = 0; - int nbElementsInReport = 0; - - strncpy (func, "get_elem_info", sizeof(func)); - func[sizeof(func) - 1] = '\0'; - if (type) { - element_size = get_element_size (fd, rbtdev, type); - if (element_size < 0) return (-1); - } else { - element_size = get_element_size (fd, rbtdev, 1); /* transport */ - if (element_size < 0) return (-1); - i = get_element_size (fd, rbtdev, 2); /* slot */ - if (i < 0) return (-1); - if (i > element_size) element_size = i; - i = get_element_size (fd, rbtdev, 3); /* port */ - if (i < 0) return (-1); - if (i > element_size) element_size = i; - i = get_element_size (fd, rbtdev, 4); /* device */ - if (i < 0) return (-1); - if (i > element_size) element_size = i; - } - len = nbelem * element_size + 8; - if (type != 0 || nbelem == 1) - len += 8; /* one element header */ - else - len += 32; /* possibly four element headers */ - data = (unsigned char *)malloc (len); - memset (cdb, 0, sizeof(cdb)); - cdb[0] = opcode; /* read element status or request volume element address */ - cdb[1] = 0x10 + type; - cdb[2] = start >> 8; - cdb[3] = start & 0xFF; - cdb[4] = nbelem >> 8; - cdb[5] = nbelem & 0xFF; - cdb[7] = len >> 16; - cdb[8] = (len >> 8) & 0xFF; - cdb[9] = len & 0xFF; - - /* IBM library in pause mode */ - while (pause_mode && nretries <= 900) { - rc = rmc_send_scsi_cmd (fd, rbtdev, 0, cdb, 12, data, len, - sense, 38, SCSI_IN, &nb_sense_ret, &msgaddr); - if (rc < 0) { - if (rc == -4 && nb_sense_ret >= 14 && (sense[12] == 0x04) && (sense[13] == -0X7B )) { - sleep(60); - pause_mode = 1; - } else { - pause_mode = 0; - } - } else { - pause_mode = 0; - } - nretries++; - } - - if (rc < 0) { - save_error (rc, nb_sense_ret, sense, msgaddr); - free (data); - return (-1); - } - avail_elem = *(data+2) * 256 + *(data+3); - nbReportBytesRemaining = *(data+5) * 256 * 256 + *(data+6) * 256 + *(data+7); - i = 0; - p = data + 8; /* point after data header */ - while (i < avail_elem && 0 < nbReportBytesRemaining) { - nbReportBytesRemaining -= 8; - edl = *(p+2) * 256 + *(p+3); - page_start = p + 8; /* point after page header */ - page_end = page_start + - (((*(p+5) * 256 + *(p+6)) * 256) + *(p+7)); - if (page_end > (data + len)) page_end = data + len; - for (p = page_start; p < page_end && i < avail_elem; p += edl, i++) { - nbElementsInReport++; - nbReportBytesRemaining -= edl; - element_info[i].element_address = *p * 256 + *(p+1); - element_info[i].element_type = *(page_start-8); - element_info[i].state = *(p+2); - element_info[i].asc = *(p+4); - element_info[i].ascq = *(p+5); - element_info[i].flags = *(p+9); - element_info[i].source_address = *(p+10) * 256 + *(p+11); - if ((*(page_start-7) & 0x80) == 0 || - (*(p+12) == '\0') || (*(p+12) == ' ')) - element_info[i].name[0] = '\0'; - else { - q = (unsigned char *) strchr ((char *)p+12, ' '); - if (q) { - strncpy (element_info[i].name, (char *)p+12, q-p-12); - element_info[i].name[q-p-12] = '\0'; - } else - strcpy (element_info[i].name, (char *)p+12); - if (strlen (element_info[i].name) > CA_MAXVIDLEN) - element_info[i].name[CA_MAXVIDLEN] = '\0'; - } - } - } - free (data); - return (nbElementsInReport); -} - -int smc_get_geometry( - const int fd, - const char *const rbtdev, - struct robot_info *const robot_info) -{ - unsigned char buf[36]; - unsigned char cdb[6]; - char func[16]; - const char *msgaddr; - int nb_sense_ret; - int rc; - char sense[MAXSENSE]; - int pause_mode = 1; - int nretries = 0; - - - strncpy(func, "get_geometry", sizeof(func)); - func[sizeof(func) - 1] = '\0'; - - memset (cdb, 0, sizeof(cdb)); - cdb[0] = 0x12; /* inquiry */ - cdb[4] = 36; - - /* IBM library in pause mode */ - while (pause_mode && nretries <= 900) { - rc = rmc_send_scsi_cmd (fd, rbtdev, 0, cdb, 6, buf, 36, - sense, 38, SCSI_IN, &nb_sense_ret, &msgaddr); - if (rc < 0) { - if (rc == -4 && nb_sense_ret >= 14 && (sense[12] == 0x04) && (sense[13] == -0X7B )) { - sleep(60); - pause_mode = 1; - } else { - pause_mode = 0; - } - } else { - pause_mode = 0; - } - nretries++; - } - - if (rc < 0) { - save_error (rc, nb_sense_ret, sense, msgaddr); - return (-1); - } - memcpy (robot_info->inquiry, buf+8, 28); - robot_info->inquiry[28] = '\0'; - memset (cdb, 0, sizeof(cdb)); - cdb[0] = 0x1A; /* mode sense */ - cdb[1] = 0x08; /* DBD bit - Disable block descriptors */ - cdb[2] = 0x1D; /* element address assignment page */ - cdb[4] = 24; - pause_mode = 1; - nretries = 0; - - /* IBM library in pause mode */ - while (pause_mode && nretries<=900) { - rc = rmc_send_scsi_cmd (fd, rbtdev, 0, cdb, 6, buf, 24, - sense, 38, SCSI_IN, &nb_sense_ret, &msgaddr); - if (rc < 0) { - if (rc == -4 && nb_sense_ret >= 14 && (sense[12] == 0x04) && (sense[13] == -0X7B )) { - sleep(60); - pause_mode = 1; - } else { - pause_mode = 0; - } - } else { - pause_mode = 0; - } - nretries++; - } - - if (rc < 0) { - save_error (rc, nb_sense_ret, sense, msgaddr); - return (-1); - } - robot_info->transport_start = buf[6] * 256 + buf[7]; - robot_info->transport_count = buf[8] * 256 + buf[9]; - robot_info->slot_start = buf[10] * 256 + buf[11]; - robot_info->slot_count = buf[12] * 256 + buf[13]; - robot_info->port_start = buf[14] * 256 + buf[15]; - robot_info->port_count = buf[16] * 256 + buf[17]; - robot_info->device_start = buf[18] * 256 + buf[19]; - robot_info->device_count = buf[20] * 256 + buf[21]; - - return (0); -} - -int smc_read_elem_status( - const int fd, - const char *const rbtdev, - const int type, - const int start, - const int nbelem, - struct smc_element_info element_info[]) -{ - char func[16]; - - strncpy(func, "read_elem_statu", sizeof(func)); - func[sizeof(func) - 1] = '\0'; - - return get_element_info ('\xB8', fd, rbtdev, type, start, nbelem, element_info); -} - -int smc_find_cartridgeWithoutSendVolumeTag ( - const int fd, - const char *const rbtdev, - const char *const find_template, - const int type, - const int start, - const int nbelem, - struct smc_element_info element_info[]) -{ - static char err_msgbuf[132]; - int nbFound = 0; - char func[16]; - int i; - struct smc_element_info *inventory_info; - char *msgaddr; - const int patternMatching = strchr (find_template, '*') || strchr (find_template, '?'); - struct robot_info robot_info; - int tot_nbelem = 0; - int nbElementsInReport = 0; - - strncpy(func, "findWithoutVT", sizeof(func)); - func[sizeof(func) - 1] = '\0'; - - { - const int smc_get_geometry_rc = smc_get_geometry (fd, rbtdev, &robot_info); - if(smc_get_geometry_rc) { - return smc_get_geometry_rc; - } - } - - tot_nbelem = robot_info.transport_count + robot_info.slot_count + - robot_info.port_count + robot_info.device_count; - - if ((inventory_info = (struct smc_element_info *)malloc (tot_nbelem * sizeof(struct smc_element_info))) == NULL) { - serrno = errno; - sprintf (err_msgbuf, "malloc error: %s", strerror(errno)); - msgaddr = err_msgbuf; - save_error (-1, 0, NULL, msgaddr); - return (-1); - } - - nbElementsInReport = smc_read_elem_status (fd, rbtdev, type, start, tot_nbelem, inventory_info); - if(0 > nbElementsInReport) { - free (inventory_info); - return (nbElementsInReport); - } - for (i = 0 ; i < nbElementsInReport && nbFound < nbelem; i++) { - if (inventory_info[i].state & 0x1) { - if (patternMatching) { - if (vmatch (find_template, inventory_info[i].name) == 0) { - memcpy (&element_info[nbFound], &inventory_info[i], - sizeof(struct smc_element_info)); - nbFound++; - } - } else { - if (strcmp (find_template, inventory_info[i].name) == 0) { - memcpy (element_info, &inventory_info[i], - sizeof(struct smc_element_info)); - nbFound = 1; - break; - } - } - } - } - free (inventory_info); - return (nbFound); -} - - -int smc_find_cartridge( - const int fd, - const char *const rbtdev, - const char *const find_template, - const int type, - const int start, - const int nbelem, - struct smc_element_info element_info[], - const bool sendVolumeTag) -{ - unsigned char cdb[12]; - char func[16]; - const char *msgaddr; - int nb_sense_ret; - char plist[40]; - int rc; - char sense[MAXSENSE]; - int pause_mode = 1; - int nretries = 0; - - strncpy(func, "findWithVT", sizeof(func)); - func[sizeof(func) - 1] = '\0'; - - if(!sendVolumeTag) { - /* Skip the 0xB6 cdb command if the tape library is Spectra like */ - rc = smc_find_cartridgeWithoutSendVolumeTag (fd, rbtdev, find_template, type, start, nbelem, - element_info); - if (rc >= 0) - return (rc); - return (-1); - } - - memset (cdb, 0, sizeof(cdb)); - cdb[0] = 0xB6; /* send volume tag */ - cdb[1] = type; - cdb[2] = start >> 8; - cdb[3] = start & 0xFF; - cdb[5] = 5; - cdb[9] = 40; - memset (plist, 0, sizeof(plist)); - strcpy (plist, find_template); - - /* IBM library in pause mode */ - while (pause_mode && nretries <= 900) { - - rc = rmc_send_scsi_cmd (fd, rbtdev, 0, cdb, 12, (unsigned char*)plist, 40, - sense, 38, SCSI_OUT, &nb_sense_ret, &msgaddr); - if (rc < 0) { - if (rc == -4 && nb_sense_ret >= 14 && (sense[12] == 0x04) && (sense[13] == -0X7B )) { - sleep(60); - pause_mode = 1; - } else { - pause_mode = 0; - } - } else { - pause_mode = 0; - } - nretries++; - } - - if (rc < 0) { - save_error (rc, nb_sense_ret, sense, msgaddr); - if (rc == -4 && nb_sense_ret >= 14 && (sense[2] & 0xF) == 5) { - rc = smc_find_cartridgeWithoutSendVolumeTag (fd, rbtdev, find_template, type, - start, nbelem, element_info); - if (rc >= 0) - return (rc); - } - return (-1); - } - return get_element_info ('\xB5', fd, rbtdev, type, start, nbelem, element_info); -} - - -/* SCSI 3 additional sense code and additional sense qualifier */ -struct scsierr_codact { - unsigned char sensekey; - unsigned char asc; - unsigned char ascq; - short action; - const char *txt; -}; -static struct scsierr_codact scsierr_acttbl[] = { - {0x02, 0x04, 0x00, RBT_FAST_RETRY, "Logical Unit Not Ready, Cause Not Reportable"}, - {0x02, 0x04, 0x01, RBT_FAST_RETRY, "Logical Unit Is In Process of Becoming Ready"}, - {0x02, 0x04, 0x02, RBT_NORETRY, "Logical Unit Not Ready, initialization required"}, - {0x02, 0x04, 0x03, RBT_NORETRY, "Logical Unit Not Ready, Manual Intervention Required"}, - {0x0B, 0x08, 0x00, RBT_NORETRY, "Logical Unit Communication Failure"}, - {0x0B, 0x08, 0x01, RBT_NORETRY, "Logical Unit Communication Time-out"}, - {0x05, 0x1A, 0x00, RBT_NORETRY, "Parameter List Length Error"}, - {0x05, 0x20, 0x00, RBT_NORETRY, "Invalid Command Operation Code"}, - {0x05, 0x21, 0x01, RBT_NORETRY, "Invalid Element Address"}, - {0x05, 0x24, 0x00, RBT_NORETRY, "Invalid field in CDB"}, - {0x05, 0x25, 0x00, RBT_NORETRY, "Logical Unit Not Supported"}, - {0x05, 0x26, 0x00, RBT_NORETRY, "Invalid field in Parameter List"}, - {0x05, 0x26, 0x01, RBT_NORETRY, "Parameter Not Supported"}, - {0x05, 0x26, 0x02, RBT_NORETRY, "Parameter Value Invalid"}, - {0x06, 0x28, 0x00, RBT_FAST_RETRY, "Not Ready to Ready Transition"}, - {0x06, 0x28, 0x01, RBT_FAST_RETRY, "Import or Export Element Accessed"}, - {0x06, 0x29, 0x00, RBT_FAST_RETRY, "Power On, Reset, or Bus Device Reset Occurred"}, - {0x06, 0x2A, 0x01, RBT_FAST_RETRY, "Mode Parameters Changed"}, - {0x05, 0x30, 0x00, RBT_NORETRY, "Incompatible Medium Installed"}, - {0x00, 0x30, 0x03, RBT_FAST_RETRY, "Cleaning Cartridge Installed"}, - {0x05, 0x39, 0x00, RBT_NORETRY, "Saving Parameters Not Supported"}, - {0x05, 0x3A, 0x00, RBT_XTRA_PROC, "Medium Not Present"}, - {0x05, 0x3B, 0x0D, RBT_XTRA_PROC, "Medium Destination Element Full"}, - {0x05, 0x3B, 0x0E, RBT_XTRA_PROC, "Medium Source Element Empty"}, - {0x04, 0x40, 0x01, RBT_NORETRY, "Hardware Error, General"}, - {0x04, 0x40, 0x02, RBT_NORETRY, "Hardware Error, Tape Transport"}, - {0x04, 0x40, 0x03, RBT_NORETRY, "Hardware Error, CAP"}, - {0x0B, 0x43, 0x00, RBT_NORETRY, "Message Error"}, - {0x02, 0x44, 0x00, RBT_NORETRY, "Internal Target Failure"}, - {0x0B, 0x45, 0x00, RBT_NORETRY, "Select or Reselect Failure"}, - {0x0B, 0x47, 0x00, RBT_NORETRY, "SCSI Parity Error"}, - {0x0B, 0x48, 0x00, RBT_NORETRY, "Initiator Detected Error"}, - {0x02, 0x4C, 0x00, RBT_NORETRY, "Logical Unit Failed Self-Configuration"}, - {0x05, 0x4E, 0x00, RBT_NORETRY, "Overlapped Commands Attempted"}, - {0x05, 0x53, 0x02, RBT_NORETRY, "Medium Removal Prevented"}, - {0x06, 0x54, 0x00, RBT_NORETRY, "SCSI To Host System Interface Failure"}, - {0x02, 0x5A, 0x01, RBT_NORETRY, "Operator Medium Removal Request"} -}; - -static const char* action_to_str(const short action) { - switch(action) { - case RBT_FAST_RETRY: return "RBT_FAST_RETRY"; - case RBT_NORETRY : return "RBT_NORETRY"; - case RBT_XTRA_PROC : return "RBT_XTRA_PROC"; - default : return "UNKNOWN"; - } -} - -int smc_lasterror( - struct smc_status *const smc_stat, - const char **const msgaddr) -{ - unsigned int i; - char func[16]; - - strncpy (func, "lasterror", sizeof(func)); - func[sizeof(func) - 1] = '\0'; - - rmc_logit(func, "Function entered:" - " asc=%d ascq=%d save_errno=%d rc=%d sensekey=%d skvalid=%d\n", - smc_status.asc, smc_status.ascq, smc_status.save_errno, - smc_status.rc, smc_status.sensekey, smc_status.skvalid); - - smc_stat->rc = smc_status.rc; - smc_stat->skvalid = smc_status.skvalid; - *msgaddr = smc_msgaddr; - if ((smc_status.rc == -1 || smc_status.rc == -2) && - smc_status.save_errno == EBUSY) - return (EBUSY); - if (! smc_status.skvalid) - return (RBT_NORETRY); - smc_stat->sensekey = smc_status.sensekey; - smc_stat->asc = smc_status.asc; - smc_stat->ascq = smc_status.ascq; - for (i = 0; i < sizeof(scsierr_acttbl)/sizeof(struct scsierr_codact); i++) { - if (smc_status.asc == scsierr_acttbl[i].asc && - smc_status.ascq == scsierr_acttbl[i].ascq && - smc_status.sensekey == scsierr_acttbl[i].sensekey) { - const char *const action_str = - action_to_str(scsierr_acttbl[i].action); - *msgaddr = scsierr_acttbl[i].txt; - - rmc_logit(func, "Entry found in scsierr_acttbl:" - " action_str=%s\n", action_str); - - return (scsierr_acttbl[i].action); - } - } - - rmc_logit(func, "No matching entry in scsierr_acttbl\n"); - - return (RBT_NORETRY); -} - -int smc_move_medium( - const int fd, - const char *const rbtdev, - const int from, - const int to, - const int invert) -{ - unsigned char cdb[12]; - char func[16]; - const char *msgaddr; - int nb_sense_ret; - int rc; - char sense[MAXSENSE]; - int pause_mode = 1; - int nretries = 0; - - strncpy(func, "move_medium", sizeof(func)); - func[sizeof(func) - 1] = '\0'; - - memset (cdb, 0, sizeof(cdb)); - cdb[0] = 0xA5; /* move medium */ - cdb[4] = from >> 8; - cdb[5] = from & 0xFF; - cdb[6] = to >> 8; - cdb[7] = to & 0xFF; - cdb[10] = invert; - - while (pause_mode) { - rc = rmc_send_scsi_cmd (fd, rbtdev, 0, cdb, 12, NULL, 0, - sense, 38, SCSI_NONE, &nb_sense_ret, &msgaddr); - if (rc < 0) { - if (rc == -4 && nb_sense_ret >= 14 && (sense[12] == 0x04) && (sense[13] == -0X7B )) { - sleep(60); - pause_mode = 1; - } else { - pause_mode = 0; - } - } else { - pause_mode = 0; - } - nretries++; - } - - if (rc < 0) { - save_error (rc, nb_sense_ret, sense, msgaddr); - return (-1); - } - return (0); -} - -static int rmc_usrmsg( - const int rpfd, - const char *func, - const char *const msg, - ...) -{ - va_list args; - char prtbuf[RMC_PRTBUFSZ]; - const int save_errno = errno; - - va_start (args, msg); - snprintf (prtbuf, sizeof(prtbuf), "%s: ", func); - prtbuf[sizeof(prtbuf) - 1] = '\0'; - { - const size_t nbBytesUsed = strlen (prtbuf); - - /* If there is still space in the print buffer */ - if(nbBytesUsed < (sizeof(prtbuf))) { - const size_t nbBytesRemaining = sizeof(prtbuf) - - nbBytesUsed; - char *const p = prtbuf + nbBytesUsed; - vsnprintf (p, nbBytesRemaining, msg, args); - prtbuf[sizeof(prtbuf) - 1] = '\0'; - } - } -// rmc_sendrep (rpfd, MSG_ERR, "%s", prtbuf); - va_end (args); - errno = save_errno; - return (0); -} - -int smc_mount ( - const int rpfd, - const int fd, - const char *const loader, - const struct robot_info *const robot_info, - const int drvord, - const char *const vid, - const int invert) -{ - int c; - const bool sendVolumeTag = true; - struct smc_element_info element_info; - char func[16]; - const char *msgaddr; - struct smc_status smc_status; - - strncpy (func, "smc_mount", sizeof(func)); - func[sizeof(func) - 1] = '\0'; - - if ((c = smc_find_cartridge (fd, loader, vid, 0, 0, 1, &element_info, sendVolumeTag)) < 0) { - c = smc_lasterror (&smc_status, &msgaddr); - rmc_usrmsg ( rpfd, func, SR017, "find_cartridge", vid, msgaddr); - return (c); - } - if (c == 0) { - rmc_usrmsg ( rpfd, func, SR018, "mount", vid, drvord, "volume not in library"); - return (RBT_NORETRY); - } - if (element_info.element_type != 2) { - - /* compare requested and replied vid */ - rmc_usrmsg ( rpfd, func, "Asked for %s, got reply for %s\n", - vid, element_info.name ); - - /* detail on a tape's current location */ - switch (element_info.element_type) { - - case 1: - rmc_usrmsg ( rpfd, func, "Location: medium transport element (0x%x)\n", - element_info.element_type ); - break; - case 2: - /* normal case: in its home slot, not possible inside the if */ - break; - case 3: - rmc_usrmsg ( rpfd, func, "Location: import/export element (0x%x)\n", - element_info.element_type ); - break; - case 4: - rmc_usrmsg ( rpfd, func, "Location: data transfer element (0x%x)\n", - element_info.element_type ); - break; - default: - rmc_usrmsg ( rpfd, func, "Location: unknown (0x%x)\n", - element_info.element_type ); - } - - rmc_usrmsg ( rpfd, func, SR018, "mount", vid, drvord, "volume in use"); - return (RBT_SLOW_RETRY); - } - if ((c = smc_move_medium (fd, loader, element_info.element_address, - robot_info->device_start+drvord, invert)) < 0) { - c = smc_lasterror (&smc_status, &msgaddr); - rmc_usrmsg ( rpfd, func, SR018, "mount", vid, drvord, msgaddr); - return (c); - } - return (0); -} - -int smc_dismount ( - const int rpfd, - const int fd, - const char *const loader, - struct robot_info *const robot_info, - const int drvord, - const char *const vid) -{ - const bool sendVolumeTag = true; - const unsigned int max_element_status_reads = 20; - const unsigned int dismount_status_read_delay = 1; // In seconds - unsigned int nb_element_status_reads = 0; - int drive_not_unloaded = 1; - struct smc_element_info drive_element_info; - char func[16]; - const char *msgaddr = 0; - struct smc_status smc_status; - - strncpy (func, "smc_dismount", sizeof(func)); - func[sizeof(func) - 1] = '\0'; - - memset(&smc_status, '\0', sizeof(smc_status)); - - /* IBM libraries sometimes disagree with the eject of their drives. */ - /* Sometimes the access bit of the result of Read Element Status */ - /* (XB8) indicates the gripper cannot access the tape even though */ - /* the eject was successful. Reading the element status at a later */ - /* point in time eventually indicates the tape is accessible. */ - while(drive_not_unloaded && nb_element_status_reads < max_element_status_reads) { - if (0 > smc_read_elem_status (fd, loader, 4, robot_info->device_start+drvord, - 1, &drive_element_info)) { - const int smc_error = smc_lasterror (&smc_status, &msgaddr); - rmc_usrmsg ( rpfd, func, SR020, "read_elem_status", msgaddr); - return (smc_error); - } - if (0 == (drive_element_info.state & 0x1)) { - rmc_usrmsg ( rpfd, func, SR018, "demount", vid, drvord, "Medium Not Present"); - return (RBT_OK); - } - - drive_not_unloaded = (0 == (drive_element_info.state & 0x8)); - if (drive_not_unloaded) { - rmc_usrmsg ( rpfd, func, "read_elem_status of %s on drive %d detected Drive Not Unloaded\n", vid, drvord); - } - - nb_element_status_reads++; - - if(nb_element_status_reads < max_element_status_reads) { - sleep(dismount_status_read_delay); - } - } - if(drive_not_unloaded) { - rmc_usrmsg ( rpfd, func, SR018, "demount", vid, drvord, "Drive Not Unloaded"); - return (RBT_UNLD_DMNT); - } - - if (*vid && strcmp (drive_element_info.name, vid)) { - rmc_usrmsg ( rpfd, func, SR009, vid, drive_element_info.name); - return (RBT_NORETRY); - } - if (0 > smc_move_medium (fd, loader, robot_info->device_start+drvord, - drive_element_info.source_address, (drive_element_info.flags & 0x40) ? 1 : 0)) { - const int smc_error = smc_lasterror (&smc_status, &msgaddr); - rmc_usrmsg ( rpfd, func, SR018, "demount", vid, drvord, msgaddr); - return (smc_error); - } - // check that the vid is in a slot before returning - while (1) { - struct smc_element_info vol_element_info; - if (0 > smc_find_cartridge (fd, loader, drive_element_info.name, 0, 0, 1, &vol_element_info, sendVolumeTag )) { - const int smc_error = smc_lasterror (&smc_status, &msgaddr); - rmc_usrmsg ( rpfd, func, SR017, "find_cartridge", drive_element_info.name, msgaddr); - return (smc_error); - } - - // vid is in a storage slot - if (vol_element_info.element_type == 2) break; - // give time for the tape enter the slot - sleep (2); - } - - return (0); -} diff --git a/XRootdSSiRmcd/rmc_smcsubr.h b/XRootdSSiRmcd/rmc_smcsubr.h deleted file mode 100644 index 3e2bd2eec9e3e616779f812f9cc74329173946c7..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/rmc_smcsubr.h +++ /dev/null @@ -1,70 +0,0 @@ -/****************************************************************************** - * - * This file is part of the Castor project. - * See http://castor.web.cern.ch/castor - * - * Copyright (C) 2003 CERN - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * This program 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 General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * - * - * @author Castor Dev team, castor-dev@cern.ch - *****************************************************************************/ - -#pragma once - -#include "smc_struct.h" - -int smc_get_geometry( - const int fd, - const char *const rbtdev, - struct robot_info *const robot_info); - -int smc_read_elem_status( - const int fd, - const char *const rbtdev, - const int type, - const int start, - const int nbelem, - struct smc_element_info element_info[]); - -int smc_find_cartridgeWithoutSendVolumeTag ( - const int fd, - const char *const rbtdev, - const char *const find_template, - const int type, - const int start, - const int nbelem, - struct smc_element_info element_info[]); - -int smc_find_cartridge( - const int fd, - const char *const rbtdev, - const char *const find_template, - const int type, - const int start, - const int nbelem, - struct smc_element_info element_info[], - const bool sendVolumeTag); - -int smc_lasterror( - struct smc_status *const smc_stat, - const char **const msgaddr); - -int smc_move_medium( - const int fd, - const char *const rbtdev, - const int from, - const int to, - const int invert); - diff --git a/XRootdSSiRmcd/rmc_smcsubr2.h b/XRootdSSiRmcd/rmc_smcsubr2.h deleted file mode 100644 index f67f4c9b440fe567b2b000bedd270a4da396aa41..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/rmc_smcsubr2.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 1998-2002 by CERN/IT/PDP/DM - * All rights reserved - */ - -#pragma once - -#include "smc_struct.h" - -int smc_dismount ( - const int rpfd, - const int fd, - const char *const loader, - struct robot_info *const robot_info, - const int drvord, - const char *const vid); - -int smc_export ( - const int rpfd, - const int fd, - const char *const loader, - struct robot_info *const robot_info, - const char *const vid); - -int smc_import ( - const int rpfd, - const int fd, - const char *const loader, - struct robot_info *const robot_info, - const char *const vid); - -int smc_mount ( - const int rpfd, - const int fd, - const char *const loader, - const struct robot_info *const robot_info, - const int drvord, - const char *const vid, - const int invert); - diff --git a/XRootdSSiRmcd/scsictl.h b/XRootdSSiRmcd/scsictl.h deleted file mode 100644 index e5e15e1e3741ca5ff58bfa9ca191cb6050738b2f..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/scsictl.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * $Id: scsictl.h,v 1.2 1999/12/09 13:46:22 jdurand Exp $ - */ - -/* - * Copyright (C) 1995-1996 by CERN/CN/SW/SC - * All rights reserved - */ - -/* - * @(#)scsictl.h 1.1 12/10/96 CERN CN-SW/SC Fabien Collin - */ - -#pragma once - -#define MAXSENSE 255 - -/* Values of the 'flags' field for function send_cmd */ -#define SCSI_IN 1 -#define SCSI_OUT 2 -#define SCSI_IN_OUT 4 -#define SCSI_NONE 8 -#define SCSI_SEL_WITH_ATN 16 -#define SCSI_SYNC 32 -#define SCSI_WIDE 64 - -/* SCSI status values */ -#define SCSI_STATUS_GOOD 0x00 -#define SCSI_STATUS_CHECK_CONDITION 0x02 -#define SCSI_STATUS_CONDITION_MET_GOOD 0x04 -#define SCSI_STATUS_BUSY 0x08 -#define SCSI_STATUS_INTERMEDIATE_GOOD 0x10 -#define SCSI_STATUS_INTERMEDIATE_CONDITION_MET 0x14 -#define SCSI_STATUS_RESERVATION_CONFLICT 0x18 -#define SCSI_STATUS_COMMAND_TERMINATED 0x22 -#define SCSI_STATUS_QUEUE_FULL 0x28 - -/* Generic SCSI driver status */ -#define CAM_OK 0 /* No error at the CAM level */ -#define CAM_TIMEOUT 1 /* Command timeout */ -#define CAM_ERROR 2 /* Error at the CAM level */ -#define CAM_NODEVICE 3 /* Device doesn't respond (inexistant device) */ - -/* SCSI 3 Sense key */ -#define SCSI_SENSEKEY_NO_SENSE 0 -#define SCSI_SENSEKEY_RECOVERED_ERROR 1 -#define SCSI_SENSEKEY_NOT_READY 2 -#define SCSI_SENSEKEY_MEDIUM_ERROR 3 -#define SCSI_SENSEKEY_HARDWARE_ERROR 4 -#define SCSI_SENSEKEY_ILLEGAL_REQUEST 5 -#define SCSI_SENSEKEY_UNIT_ATTENTION 6 -#define SCSI_SENSEKEY_DATA_PROTECT 7 -#define SCSI_SENSEKEY_BLANK_CHECK 8 -#define SCSI_SENSEKEY_VENDOR_SPECIFIC 9 -#define SCSI_SENSEKEY_COPY_ABORTED 10 -#define SCSI_SENSEKEY_ABORTED_COMMAND 11 -#define SCSI_SENSEKEY_EQUAL 12 -#define SCSI_SENSEKEY_VOLUME_OVERFLOW 13 -#define SCSI_SENSEKEY_MISCOMPARE 14 -#define SCSI_SENSEKEY_RESERVED 15 - -/* SCSI 3 Peripheric device types */ -#define SCSI_PERIPH_DIRECT_ACCESS 0 -#define SCSI_PERIPH_SEQUENTIAL_ACCESS 1 -#define SCSI_PERIPH_PRINTER 2 -#define SCSI_PERIPH_PROCESSOR 3 -#define SCSI_PERIPH_WORM 4 -#define SCSI_PERIPH_CDROM 5 -#define SCSI_PERIPH_SCANNER 6 -#define SCSI_PERIPH_OPTICAL 7 -#define SCSI_PERIPH_AUTOCHANGER 8 -#define SCSI_PERIPH_COMMUNICATION 9 -#define SCSI_PERIPH_ASC1 10 -#define SCSI_PERIPH_ASC2 11 -#define SCSI_PERIPH_RAID 12 -#define SCSI_PERIPH_UNKNOWN 31 - diff --git a/XRootdSSiRmcd/serrno.cpp b/XRootdSSiRmcd/serrno.cpp deleted file mode 100644 index 7f4408cfba8c68e7b152fbc4a939974fa22988b7..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/serrno.cpp +++ /dev/null @@ -1 +0,0 @@ -int serrno = 0; diff --git a/XRootdSSiRmcd/serrno.h b/XRootdSSiRmcd/serrno.h deleted file mode 100644 index 7b0be7cdb077ed8fa8987b83ffa3bd2aca4a1be6..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/serrno.h +++ /dev/null @@ -1,464 +0,0 @@ -/* - * Copyright (C) 1990-2002 by CERN/IT/PDP/DM - * All rights reserved - */ - -/* - * serrno.h,v 1.65 2002/11/27 14:45:53 - */ - -/* serrno.h Special error numbers - not in errno.h */ - -#pragma once - -#include <sys/types.h> /* For size_t */ -#include <stddef.h> /* For size_t on _WIN32 */ - -#define SEBASEOFF 1000 /* Base offset for special err. */ -#define EDBBASEOFF 1200 /* CDB error base offset */ -#define EMSBASEOFF 1300 /* MSG error base offset */ -#define ENSBASEOFF 1400 /* NS error base offset */ -#define ERFBASEOFF 1500 /* RFIO error base offset */ -#define ERTBASEOFF 1600 /* RTCOPY error base offset */ -#define ESTBASEOFF 1700 /* STAGE error base offset */ -#define ESQBASEOFF 1800 /* SYSREQ error base offset */ -#define ETBASEOFF 1900 /* TAPE error base offset */ -#define EVMBASEOFF 2000 /* VMGR error base offset */ -#define EVQBASEOFF 2100 /* VDQM error base offset */ -#define ERMBASEOFF 2200 /* RMC error base offset */ -#define EMONBASEOFF 2300 /* Monitoring Error base offset */ -#define EUPBASEOFF 2400 /* UPV error base offset */ -#define ESECBASEOFF 2700 /* Security error base offset */ -#define EDNSBASEOFF 3000 /* DNS error base offset */ - -#define SENOERR SEBASEOFF /* No error */ -#define SENOSHOST SEBASEOFF+1 /* Host not known */ -#define SENOSSERV SEBASEOFF+2 /* Service unknown */ -#define SENOTRFILE SEBASEOFF+3 /* Not a remote file */ -#define SETIMEDOUT SEBASEOFF+4 /* Has timed out */ -#define SEBADFFORM SEBASEOFF+5 /* Bad fortran format specifier */ -#define SEBADFOPT SEBASEOFF+6 /* Bad fortran option specifier */ -#define SEINCFOPT SEBASEOFF+7 /* Incompatible fortran options */ -#define SENAMETOOLONG SEBASEOFF+8 /* File name too long */ -#define SENOCONFIG SEBASEOFF+9 /* Can't open configuration file*/ -#define SEBADVERSION SEBASEOFF+10 /* Version ID mismatch */ -#define SEUBUF2SMALL SEBASEOFF+11 /* User buffer too small */ -#define SEMSGINVRNO SEBASEOFF+12 /* Invalid reply number */ -#define SEUMSG2LONG SEBASEOFF+13 /* User message too long */ -#define SEENTRYNFND SEBASEOFF+14 /* Entry not found */ -#define SEINTERNAL SEBASEOFF+15 /* Internal error */ -#define SECONNDROP SEBASEOFF+16 /* Connection closed by rem. end*/ -#define SEBADIFNAM SEBASEOFF+17 /* Can't get interface name */ -#define SECOMERR SEBASEOFF+18 /* Communication error */ -#define SENOMAPDB SEBASEOFF+19 /* Can't open mapping database */ -#define SENOMAPFND SEBASEOFF+20 /* No user mapping */ -#define SERTYEXHAUST SEBASEOFF+21 /* Retry count exhausted */ -#define SEOPNOTSUP SEBASEOFF+22 /* Operation not supported */ -#define SEWOULDBLOCK SEBASEOFF+23 /* Resource temporarily unavailable */ -#define SEINPROGRESS SEBASEOFF+24 /* Operation now in progress */ -#define SECTHREADINIT SEBASEOFF+25 /* Cthread initialization error */ -#define SECTHREADERR SEBASEOFF+26 /* Thread interface call error */ -#define SESYSERR SEBASEOFF+27 /* System error */ -#define SENOTADMIN SEBASEOFF+32 /* requestor is not administrator */ -#define SEUSERUNKN SEBASEOFF+33 /* User unknown */ -#define SEDUPKEY SEBASEOFF+34 /* Duplicate key value */ -#define SEENTRYEXISTS SEBASEOFF+35 /* Entry already exists */ -#define SEGROUPUNKN SEBASEOFF+36 /* Group Unknown */ -#define SECHECKSUM SEBASEOFF+37 /* Bad checksum */ -#define SESVCCLASSNFND SEBASEOFF+38 /* This service class is not available for this host */ -#define SESQLERR SEBASEOFF+39 /* Got SQL exception from database */ -#define SELOOP SEBASEOFF+40 /* Too many symbolic links */ -#define SENOPORTINRANGE SEBASEOFF+41 /* No port in range */ -#define SENOVALUE SEBASEOFF+42 /* No value */ -#define SEINVALIDCONFIG SEBASEOFF+43 /* Invalid configuration */ -#define SEPYTHONEXEC SEBASEOFF+44 /* Failed to execute Python */ -#define SEMISSINGOPER SEBASEOFF+45 /* Missing operand */ -#define SEMISMATCH SEBASEOFF+46 /* Mismatch */ -#define SEREQUESTFAILED SEBASEOFF+47 /* Request failed */ -#define SEINVALIDNBARGS SEBASEOFF+48 /* Invalid number of arguments */ -#define SEALREADYINIT SEBASEOFF+49 /* Already initialized */ -#define SECMDLNNOTPRSD SEBASEOFF+50 /* Command line not parsed */ -#define SEACCPTCONNINTR SEBASEOFF+51 /* Accept connection was interrupted */ -#define SEBADALLOC SEBASEOFF+52 /* Failed to allocate memory */ -#define SENOTANOWNER SEBASEOFF+53 /* Not an owner */ - -#define SEMAXERR SEBASEOFF+53 /* Maximum error number */ - -#define SERRNO (serrno - SEBASEOFF) /* User convenience */ -/* - * Backward compatibility - */ -#define SEFNAM2LONG SENAMETOOLONG - -/* - * Package specific error messages (don't forget to update commmon/serror.c) - */ - -/* - *------------------------------------------------------------------------ - * DB errors - *------------------------------------------------------------------------ - */ -#define EDB_A_ESESSION EDBBASEOFF+1 /* Cdb api : invalid session */ -#define EDB_A_EDB EDBBASEOFF+2 /* Cdb api : invalid db */ -#define EDB_A_EINVAL EDBBASEOFF+3 /* Cdb api : invalid value */ -#define EDB_A_RESHOST EDBBASEOFF+4 /* Cdb api : host res error */ -#define EDB_A_TOOMUCH EDBBASEOFF+5 /* Cdb api : data size rejected */ -#define EDB_AS_SOCKET EDBBASEOFF+6 /* Cdb api system : socket() error */ -#define EDB_AS_SOCKOPT EDBBASEOFF+7 /* Cdb api system : [set/get]sockopt() error */ -#define EDB_AS_MALLOC EDBBASEOFF+8 /* Cdb api system : malloc() error */ -#define EDB_A_NOERROR EDBBASEOFF+9 /* Cdb api : no last error */ -#define EDB_A_IEINVAL EDBBASEOFF+10 /* Cdb api : interface invalid value */ -#define EDB_AS_BIND EDBBASEOFF+11 /* Cdb api : bind() error */ -#define EDB_AS_LISTEN EDBBASEOFF+12 /* Cdb api : listen() error */ -#define EDB_AS_GETSOCKNAME EDBBASEOFF+13 /* Cdb api : getsockname() error */ -#define EDB_AS_ACCEPT EDBBASEOFF+14 /* Cdb api : accept() error */ -#define EDB_AS_GETPEERNAME EDBBASEOFF+15 /* Cdb api : getpeername() error */ -#define EDB_A_WHOISIT EDBBASEOFF+16 /* Cdb api : Connection from bad host */ - -#define EDB_D_EINVAL EDBBASEOFF+20 /* Cdb daemon : invalid value */ -#define EDB_D_EAGAIN EDBBASEOFF+21 /* Cdb daemon : yet done */ -#define EDB_D_AUTH EDBBASEOFF+22 /* Cdb daemon : unauthorized */ -#define EDB_D_LOGIN EDBBASEOFF+23 /* Cdb daemon : login refused */ -#define EDB_D_PWDCORR EDBBASEOFF+24 /* Cdb daemon : pwd file corrupted */ -#define EDB_D_ANA EDBBASEOFF+25 /* Cdb daemon : db analysis error */ -#define EDB_D_HASHSIZE EDBBASEOFF+26 /* Cdb daemon : bad hash size */ -#define EDB_D_UNKNOWN EDBBASEOFF+27 /* Cdb daemon : unkn. db/table/key */ -#define EDB_D_NOLOCK EDBBASEOFF+28 /* Cdb daemon : lock is required */ -#define EDB_D_CORRUPT EDBBASEOFF+29 /* Cdb daemon : probably corrupted */ -#define EDB_D_TOOMUCH EDBBASEOFF+30 /* Cdb daemon : data size rejected */ -#define EDB_D_ENOENT EDBBASEOFF+31 /* Cdb daemon : no entry */ -#define EDB_D_ETYPE EDBBASEOFF+32 /* Cdb daemon : unknown member type*/ -#define EDB_D_EVALUE EDBBASEOFF+33 /* Cdb daemon : unknown member val */ -#define EDB_D_NULLVALUE EDBBASEOFF+34 /* Cdb daemon : null member value */ -#define EDB_D_LOCK EDBBASEOFF+35 /* Cdb daemon : cannot gain lock */ -#define EDB_D_FREE EDBBASEOFF+36 /* Cdb daemon : unsafe free attempt*/ -#define EDB_D_SHUTDOWN EDBBASEOFF+37 /* Cdb daemon : shutdown in progress */ -#define EDB_D_DEADLOCK EDBBASEOFF+38 /* Cdb daemon : deadlock detected */ -#define EDB_D_EXIST EDBBASEOFF+39 /* Cdb daemon : yet exists */ -#define EDB_D_NOSPC EDBBASEOFF+40 /* Cdb daemon : no more space */ -#define EDB_D_DUMPEND EDBBASEOFF+41 /* Cdb daemon : end of dump */ -#define EDB_D_UNIQUE EDBBASEOFF+42 /* Cdb daemon : uniqued key yet exist */ -#define EDB_D_LISTEND EDBBASEOFF+43 /* Cdb daemon : end of list */ -#define EDB_D_NOTDUMP EDBBASEOFF+44 /* Cdb daemon : not in dump mode */ -#define EDB_D_DNSCHECK EDBBASEOFF+45 /* Cdb daemon : double DNS check error */ -#define EDB_D_REJECTED EDBBASEOFF+46 /* Cdb daemon : Connection rejected (not authorised) */ -#define EDB_D_INIT EDBBASEOFF+47 /* Cdb daemon : init in progress */ -#define EDB_D_INCONST EDBBASEOFF+48 /* Cdb daemon : inconsistent request (unstop and no previous stop, unfreeze and no previous freeze) */ -#define EDB_D_FREEHASHSIZE EDBBASEOFF+49 /* Cdb daemon : bad free hash size */ - -#define EDB_DS_MALLOC EDBBASEOFF+50 /* Cdb daemon system : malloc() error */ -#define EDB_DS_CALLOC EDBBASEOFF+51 /* Cdb daemon system : calloc() error */ -#define EDB_DS_REALLOC EDBBASEOFF+52 /* Cdb daemon system : realloc() error */ -#define EDB_DS_OPEN EDBBASEOFF+53 /* Cdb daemon system : open() error */ -#define EDB_DS_FSTAT EDBBASEOFF+54 /* Cdb daemon system : fstat() error */ -#define EDB_DS_LSEEK EDBBASEOFF+55 /* Cdb daemon system : lseek() error */ -#define EDB_DS_READ EDBBASEOFF+56 /* Cdb daemon system : read() error */ -#define EDB_DS_WRITE EDBBASEOFF+57 /* Cdb daemon system : write() error */ -#define EDB_DS_RENAME EDBBASEOFF+58 /* Cdb daemon system : rename() error */ -#define EDB_DS_FTRUNC EDBBASEOFF+59 /* Cdb daemon system : ftruncate() error */ -#define EDB_DS_TMPNAM EDBBASEOFF+60 /* Cdb daemon system : tmpnam() error */ -#define EDB_DS_FCNTL EDBBASEOFF+61 /* Cdb daemon system : fcntl() error */ -#define EDB_DS_MKDIR EDBBASEOFF+62 /* Cdb daemon system : mkdir() error */ -#define EDB_DS_TIMES EDBBASEOFF+63 /* Cdb daemon system : times() error */ -#define EDB_DS_SYSCONF EDBBASEOFF+64 /* Cdb daemon system : sysconf() err/unav */ -#define EDB_DS_GETHOSTNAME EDBBASEOFF+65 /* Cdb daemon system : gethostname() error*/ -#define EDB_DS_GETPEERNAME EDBBASEOFF+66 /* Cdb daemon system : getpeername() error*/ -#define EDB_DS_INET_NTOA EDBBASEOFF+67 /* Cdb daemon system : getpeername() error*/ -#define EDB_DS_REMOVE EDBBASEOFF+68 /* Cdb daemon system : remove() error */ -#define EDB_DS_SIGACTION EDBBASEOFF+69 /* Cdb daemon system : sigaction() error */ -#define EDB_DS_GETSOCKNAME EDBBASEOFF+70 /* Cdb daemon system : getsockname() error*/ -#define EDB_DS_BIND EDBBASEOFF+71 /* Cdb daemon system : bind() error*/ -#define EDB_DS_LISTEN EDBBASEOFF+72 /* Cdb daemon system : listen() error*/ -#define EDB_DS_CONNECT EDBBASEOFF+73 /* Cdb daemon system : connect() error*/ -#define EDB_DS_SOCKET EDBBASEOFF+74 /* Cdb daemon system : socket() error*/ -#define EDB_DS_SOCKOPT EDBBASEOFF+75 /* Cdb daemon system : [set/get]sockopt() error*/ -#define EDB_D_RESHOST EDBBASEOFF+76 /* Cdb daemon : host res error */ -#define EDB_D_REQSIZE EDBBASEOFF+77 /* Cdb daemon : request too big */ - -#define EDB_C_EINVAL EDBBASEOFF+80 /* Cdb config : invalid value */ -#define EDB_C_ENOENT EDBBASEOFF+81 /* Cdb config : configuration error*/ -#define EDB_C_TOOMUCH EDBBASEOFF+82 /* Cdb config : conf. size rejected */ -#define EDB_CS_GETHOSTNAME EDBBASEOFF+83 /* Cdb config system : gethostname() error*/ - -#define EDB_NOMOREDB EDBBASEOFF+90 /* Cdb : nomoredb */ - -#define EDBMAXERR EDBBASEOFF+90 - -/* - *------------------------------------------------------------------------ - * MSG daemon errors - *------------------------------------------------------------------------ - */ -#define EMSMSGU2REP EMSBASEOFF+1 /* msg daemon unable to reply */ -#define EMSMSGSYERR EMSBASEOFF+2 /* msg daemon system error */ -#define EMSNOPERM EMSBASEOFF+3 /* Permission denied */ -#define EMSMAXERR EMSBASEOFF+3 /* Maximum error number of MSG */ -/* - * Backward compatibility - */ -#define SEMSGU2REP EMSMSGU2REP -#define SEMSGSYERR EMSMSGSYERR -#define SENOPERM EMSNOPERM - -/* - *------------------------------------------------------------------------ - * NS (Name Server) errors - *------------------------------------------------------------------------ - */ -#define ENSNACT ENSBASEOFF+1 /* Name server not active */ -#define ENSFILECHG ENSBASEOFF+2 /* File has been overwritten, request ignored */ -#define ENSNOSEG ENSBASEOFF+3 /* Segment had been deleted */ -#define ENSISLINK ENSBASEOFF+4 /* Is a link */ -#define ENSCLASSNOSEGS ENSBASEOFF+5 /* File class does not allow a copy on tape */ -#define ENSTOOMANYSEGS ENSBASEOFF+6 /* Too many copies on tape */ -#define ENSOVERWHENREP ENSBASEOFF+7 /* Cannot overwrite valid segment when replacing */ -#define ENHOSTNOTSET ENSBASEOFF+8 /* CNS HOST not set */ -#define ENSMAXERR ENSBASEOFF+8 - -/* - *------------------------------------------------------------------------ - * RFIO errors - *------------------------------------------------------------------------ - */ -#define ERFNORCODE ERFBASEOFF+1 /* RFIO communication error */ -#define ERFHOSTREFUSED ERFBASEOFF+2 /* RFIO rejected connect attempt*/ -#define ERFXHOST ERFBASEOFF+3 /* Cross-host link (rename()) */ -#define ERFPROTONOTSUP ERFBASEOFF+4 /* RFIO protocol not supported */ -#define ERFMAXERR ERFBASEOFF+4 /* Maximum error number of RFIO */ -/* - * Backward compatibility - */ -#define SENORCODE ERFNORCODE -#define SEHOSTREFUSED ERFHOSTREFUSED -#define SEXHOST ERFXHOST -#define SEPROTONOTSUP ERFPROTONOTSUP - -/* - *------------------------------------------------------------------------ - * RTCOPY errors - *------------------------------------------------------------------------ - */ -#define ERTTMSERR ERTBASEOFF+1 /* TMS call failed */ -#define ERTBLKSKPD ERTBASEOFF+2 /* Blocks were skipped in file */ -#define ERTTPE_LSZ ERTBASEOFF+3 /* Blocks skipped and file truncated */ -#define ERTMNYPARY ERTBASEOFF+4 /* Too many skipped blocks */ -#define ERTLIMBYSZ ERTBASEOFF+5 /* File limited by size */ -#define ERTUSINTR ERTBASEOFF+6 /* Request interrupted by user */ -#define ERTOPINTR ERTBASEOFF+7 /* Request interrupted by operator */ -#define ERTNOTCLIST ERTBASEOFF+8 /* Request list is not circular */ -#define ERTBADREQ ERTBASEOFF+9 /* Bad request structure */ -#define ERTMORETODO ERTBASEOFF+10 /* Request partially processed */ -#define ERTDBERR ERTBASEOFF+11 /* Catalogue DB error */ -#define ERTZEROSIZE ERTBASEOFF+12 /* Zero sized file */ -#define ERTWRONGSIZE ERTBASEOFF+13 /* Recalled file size incorrect */ -#define ERTWRONGFSEQ ERTBASEOFF+14 /* Inconsistent FSEQ in VMGR and Cns */ -#define ERTMAXERR ERTBASEOFF+14 - -/* - *------------------------------------------------------------------------ - * STAGE errors - *------------------------------------------------------------------------ - */ -#define ESTCLEARED ESTBASEOFF+1 /* aborted */ -#define ESTENOUGHF ESTBASEOFF+2 /* enough free space */ -#define ESTLNKNCR ESTBASEOFF+3 /* symbolic link not created */ -#define ESTLNKNSUP ESTBASEOFF+4 /* symbolic link not supported */ -#define ESTNACT ESTBASEOFF+5 /* Stager not active */ -#define ESTGROUP ESTBASEOFF+6 /* Your group is invalid */ -#define ESTGRPUSER ESTBASEOFF+7 /* No GRPUSER in configuration */ -#define ESTUSER ESTBASEOFF+8 /* Invalid user */ -#define ESTHSMHOST ESTBASEOFF+9 /* HSM HOST not specified */ -#define ESTTMSCHECK ESTBASEOFF+10 /* tmscheck error */ -#define ESTLINKNAME ESTBASEOFF+11 /* User link name processing error */ -#define ESTWRITABLE ESTBASEOFF+12 /* User path in a non-writable directory */ -#define ESTKILLED ESTBASEOFF+13 /* aborted by kill */ -#define ESTMEM ESTBASEOFF+14 /* request too long (api) */ -#define ESTCONF ESTBASEOFF+15 /* Stage configuration error */ -#define ESTSEGNOACC ESTBASEOFF+16 /* Unreadable file on tape (segments not all accessible) */ -#define ESTREPLFAILED ESTBASEOFF+17 /* File replication failed */ -#define ESTNOTAVAIL ESTBASEOFF+18 /* File is currently not available */ -#define ESTJOBKILLED ESTBASEOFF+19 /* Job killed by service administrator */ -#define ESTJOBTIMEDOUT ESTBASEOFF+20 /* Job timed out while waiting to be scheduled */ -#define ESTSCHEDERR ESTBASEOFF+21 /* Scheduler error */ -#define ESTSVCCLASSNOFS ESTBASEOFF+22 /* No filesystems available in service class */ -#define ESTNOSEGFOUND ESTBASEOFF+23 /* File has no copy on tape and no diskcopies are accessible */ -#define ESTTAPEOFFLINE ESTBASEOFF+24 /* File is on an offline tape */ -#define ESTREQCANCELED ESTBASEOFF+25 /* Request canceled while queuing */ -#define ESTTCNOTFOUND ESTBASEOFF+26 /* Tape-copy not found */ -#define ESTNOTAPEROUTE ESTBASEOFF+27 /* The file cannot be routed to tape */ -#define ESTMAXERR ESTBASEOFF+27 - -/* - *------------------------------------------------------------------------ - * SYSREQ errors - *------------------------------------------------------------------------ - */ -#define ESQTMSNOTACT ESQBASEOFF+1 /* TMS not active */ -#define ESQMAXERR ESQBASEOFF+1 /* Maximum error number of SYSREQ */ -/* - * Backward compatibility - */ -#define SETMSNOTACT ESQTMSNOTACT - -/* - *------------------------------------------------------------------------ - * TAPE errors - *------------------------------------------------------------------------ - */ -#define ETDNP ETBASEOFF+1 /* daemon not available */ -#define ETSYS ETBASEOFF+2 /* system error */ -#define ETPRM ETBASEOFF+3 /* bad parameter */ -#define ETRSV ETBASEOFF+4 /* reserv already issued */ -#define ETNDV ETBASEOFF+5 /* too many drives requested */ -#define ETIDG ETBASEOFF+6 /* invalid device group name */ -#define ETNRS ETBASEOFF+7 /* reserv not done */ -#define ETIDN ETBASEOFF+8 /* no drive with requested characteristics */ -#define ETLBL ETBASEOFF+9 /* bad label structure */ -#define ETFSQ ETBASEOFF+10 /* bad file sequence number */ -#define ETINTR ETBASEOFF+11 /* interrupted by user */ -#define ETEOV ETBASEOFF+12 /* EOV found in multivolume set */ -#define ETRLSP ETBASEOFF+13 /* release pending */ -#define ETBLANK ETBASEOFF+14 /* blank tape */ -#define ETCOMPA ETBASEOFF+15 /* compatibility problem */ -#define ETHWERR ETBASEOFF+16 /* device malfunction */ -#define ETPARIT ETBASEOFF+17 /* parity error */ -#define ETUNREC ETBASEOFF+18 /* unrecoverable media error */ -#define ETNOSNS ETBASEOFF+19 /* no sense */ -#define ETRSLT ETBASEOFF+20 /* reselect server */ -#define ETVBSY ETBASEOFF+21 /* volume busy or inaccessible */ -#define ETDCA ETBASEOFF+22 /* drive currently assigned */ -#define ETNRDY ETBASEOFF+23 /* drive not ready */ -#define ETABSENT ETBASEOFF+24 /* volume absent */ -#define ETARCH ETBASEOFF+25 /* volume archived */ -#define ETHELD ETBASEOFF+26 /* volume held or disabled */ -#define ETNXPD ETBASEOFF+27 /* file not expired */ -#define ETOPAB ETBASEOFF+28 /* operator cancel */ -#define ETVUNKN ETBASEOFF+29 /* volume unknown */ -#define ETWLBL ETBASEOFF+30 /* wrong label type */ -#define ETWPROT ETBASEOFF+31 /* cartridge write protected */ -#define ETWVSN ETBASEOFF+32 /* wrong vsn */ -#define ETBADMIR ETBASEOFF+33 /* Tape has a bad MIR */ -#define ETNETACCEPTINTR ETBASEOFF+34 /* castor::tape::net::acceptConnection interrupted */ -#define ETNOLBLINFO ETBASEOFF+35 /* Label information not found in memory */ -#define ETMLTDRVRSV ETBASEOFF+36 /* Multi-drive reservations are not supported */ -#define ETNOLBLINFOMEM ETBASEOFF+37 /* No memory available for label information */ -#define ETSESSIONERROR ETBASEOFF+38 /* Tape-session error */ -#define ETINVALIDTFSEQ ETBASEOFF+39 /* Invalid tape-file sequence-number */ -#define ETINVALIDTFSIZE ETBASEOFF+40 /* Invalid tape-file file-size */ -#define ETMOUNTFAILED ETBASEOFF+41 /* Failed to mount volume */ -#define ETDISMOUNTFAILED ETBASEOFF+42 /* Failed to dismount volume */ -#define ETQUERYVOLFAILED ETBASEOFF+43 /* Failed to query volume */ -#define ETFDISMOUNTFAILED ETBASEOFF+44 /* Failed to force dismount volume */ -#define ETDRVNOTREADYFORMNT ETBASEOFF+45 /* Drive not ready for mount */ -#define ETMAXERR ETBASEOFF+45 - -/* - *------------------------------------------------------------------------ - * VMGR (Volume Manager) errors - *------------------------------------------------------------------------ - */ -#define EVMGRNACT EVMBASEOFF+1 /* volume manager not active or service being drained */ -#define EVMGRNOHOST EVMBASEOFF+2 /* VMGR HOST not set */ -#define EVMMAXERR EVMBASEOFF+2 - -/* - *------------------------------------------------------------------------ - * UPV (User Privilege Validator) errors - *------------------------------------------------------------------------ - */ -#define ECUPVNACT EUPBASEOFF+1 /* User Privilege Validator not active or service being drained */ -#define EUPMAXERR EUPBASEOFF+1 - -/* - *------------------------------------------------------------------------ - * DNS errors - See netdb.h for details - *------------------------------------------------------------------------ - */ -#define EDNSHOSTNOTFOUND EDNSBASEOFF+1 /* Authoritative Answer Host not found. */ -#define EDNSTRYAGAIN EDNSBASEOFF+2 /* Non-Authoritative Host not found, or SERVERFAIL */ -#define EDNSNORECOVERY EDNSBASEOFF+3 /* Non recoverable errors, FORMERR, REFUSED, NOTIMP. */ -#define EDNSNODATA EDNSBASEOFF+4 /* Valid name, no data record of requested type. */ -#define EDNSNOADDRESS EDNSBASEOFF+5 /* No address, look for MX record. */ -#define EDNSMAXERR EDNSBASEOFF+6 - -/* - *------------------------------------------------------------------------ - * VDQM (Volume & Drive Queue Manager) errors - *------------------------------------------------------------------------ - */ -#define EVQSYERR EVQBASEOFF+1 /* Failed system call */ -#define EVQINCONSIST EVQBASEOFF+2 /* Internal DB inconsistency */ -#define EVQREPLICA EVQBASEOFF+3 /* DB replication failed */ -#define EVQNOVOL EVQBASEOFF+4 /* No volume request queued */ -#define EVQNODRV EVQBASEOFF+5 /* No free drive available */ -#define EVQNOSVOL EVQBASEOFF+6 /* Specified vol. req. not found */ -#define EVQNOSDRV EVQBASEOFF+7 /* Specified drv. req. not found */ -#define EVQALREADY EVQBASEOFF+8 /* Specified vol. req. already exists */ -#define EVQUNNOTUP EVQBASEOFF+9 /* Unit not up */ -#define EVQBADSTAT EVQBASEOFF+10 /* Bad unit status request */ -#define EVQBADID EVQBASEOFF+11 /* Incorrect vol.req or job ID */ -#define EVQBADJOBID EVQBASEOFF+12 /* Incorrect job ID */ -#define EVQNOTASS EVQBASEOFF+13 /* Unit not assigned */ -#define EVQBADVOLID EVQBASEOFF+14 /* Attempt to mount with wrong VOLID */ -#define EVQREQASS EVQBASEOFF+15 /* Attempt to delete an assigned req */ -#define EVQDGNINVL EVQBASEOFF+16 /* Vol. req. for non-existing DGN */ -#define EVQPIPEFULL EVQBASEOFF+17 /* Replication pipe is full */ -#define EVQHOLD EVQBASEOFF+18 /* Server is held */ -#define EVQEOQREACHED EVQBASEOFF+19 /* End of query reached */ - -#define EVQMAXERR EVQBASEOFF+19 - -/* - *------------------------------------------------------------------------ - * RMC (Remote SCSI media changer server) errors - *------------------------------------------------------------------------ - */ -#define ERMCNACT ERMBASEOFF+1 /* Remote SCSI media changer server not active or service being drained */ -#define ERMCRBTERR (ERMBASEOFF+2) /* Remote SCSI media changer error */ -#define ERMCUNREC ERMCRBTERR+1 /* Remote SCSI media changer unrec. error */ -#define ERMCSLOWR ERMCRBTERR+2 /* Remote SCSI media changer error (slow retry) */ -#define ERMCFASTR ERMCRBTERR+3 /* Remote SCSI media changer error (fast retry) */ -#define ERMCDFORCE ERMCRBTERR+4 /* Remote SCSI media changer error (demount force) */ -#define ERMCDDOWN ERMCRBTERR+5 /* Remote SCSI media changer error (drive down) */ -#define ERMCOMSGN ERMCRBTERR+6 /* Remote SCSI media changer error (ops message) */ -#define ERMCOMSGS ERMCRBTERR+7 /* Remote SCSI media changer error (ops message + retry) */ -#define ERMCOMSGR ERMCRBTERR+8 /* Remote SCSI media changer error (ops message + wait) */ -#define ERMCUNLOAD ERMCRBTERR+9 /* Remote SCSI media changer error (unload + demount) */ -#define ERMMAXERR ERMBASEOFF+11 - -/* - *------------------------------------------------------------------------ - * MONITORING ERRORS - *------------------------------------------------------------------------ - */ - -#define EMON_SYSTEM EMONBASEOFF+1 /* When a system error causes the monitoring to stop */ -#define EMON_NO_HOST EMONBASEOFF+2 /* No monitoring host defined in the configuration */ -#define EMON_NO_PORT EMONBASEOFF+3 /* No monitoring port defined in the configuration */ -#define EMON_NO_CLIENTPORT EMONBASEOFF+4 /* No port for client requests defined in the configuration */ - -#define EMONMAXERR EMONBASEOFF+4 - -/* - *------------------------------------------------------------------------ - * SECURITY ERRORS - *------------------------------------------------------------------------ - */ -#define ESEC_SYSTEM ESECBASEOFF + 1 /* System error in the security package */ -#define ESEC_BAD_CREDENTIALS ESECBASEOFF + 2 /* Bad credentials */ -#define ESEC_NO_CONTEXT ESECBASEOFF + 3 /* Could not establish context */ -#define ESEC_BAD_MAGIC ESECBASEOFF + 4 /* Bad magic number */ -#define ESEC_NO_USER ESECBASEOFF + 5 /* Could not map username to uid/gid */ -#define ESEC_NO_PRINC ESECBASEOFF + 6 /* Could not map principal to username */ -#define ESEC_NO_SECMECH ESECBASEOFF + 7 /* Could not load security mechanism */ -#define ESEC_CTX_NOT_INITIALIZED ESECBASEOFF + 8 /* Context not initialized */ -#define ESEC_PROTNOTSUPP ESECBASEOFF + 9 /* Security protocol not supported */ -#define ESEC_NO_SVC_NAME ESECBASEOFF + 10 /* Service name not set */ -#define ESEC_NO_SVC_TYPE ESECBASEOFF + 11 /* Service type not set */ -#define ESEC_NO_SECPROT ESECBASEOFF + 12 /* Could not lookup security protocol */ -#define ESEC_BAD_CSEC_VERSION ESECBASEOFF + 13 /* Csec incompatability */ -#define ESEC_BAD_PEER_RESP ESECBASEOFF + 14 /* Unexpected response from peer */ -#define ESECMAXERR ESECBASEOFF + 14 - -extern int serrno; diff --git a/XRootdSSiRmcd/smc_constants.h b/XRootdSSiRmcd/smc_constants.h deleted file mode 100644 index 86cdf71600c28269ad465867a4d3adbd5b914a0f..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/smc_constants.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 1998-2002 by CERN/IT/PDP/DM - * All rights reserved - */ - -#pragma once - - /* error messages */ - -#define SR001 "SR001 - drive ordinal must be a non negative integer\n" -#define SR002 "SR002 - option -%c and -%c are mutually exclusive\n" -#define SR003 "SR003 - invalid query type %c\n" -#define SR004 "SR004 - vid %s must be at most 6 characters long\n" -#define SR005 "SR005 - loader must be specified\n" -#define SR006 "SR006 - drive ordinal is mandatory for demount operations\n" -#define SR007 "SR007 - drive ordinal and vid are mandatory for mount operations\n" -#define SR008 "SR008 - invalid device ordinal (must be < %d)\n" -#define SR009 "SR009 - vid mismatch: %s on request, %s on drive\n" -#define SR010 "SR010 - number of elements must be a positive integer\n" -#define SR011 "SR011 - vid is mandatory for export operations\n" -#define SR012 "SR012 - cannot allocate enough memory\n" -#define SR013 "SR013 - export slots are full\n" -#define SR014 "SR014 - slot ordinal must be a non negative integer\n" -#define SR015 "SR015 - storage cells are full\n" -#define SR016 "SR016 - invalid slot address (must be < %d)\n" -#define SR017 "SR017 - %s %s failed : %s\n" -#define SR018 "SR018 - %s of %s on drive %d failed : %s\n" -#define SR019 "SR019 - %s : %s error : %s\n" -#define SR020 "SR020 - %s failed : %s\n" -#define SR021 "SR021 - specify source slot and target slot\n" - diff --git a/XRootdSSiRmcd/smc_struct.h b/XRootdSSiRmcd/smc_struct.h deleted file mode 100644 index 4d518908a0734e2a175a2a827fd2e92742e25117..0000000000000000000000000000000000000000 --- a/XRootdSSiRmcd/smc_struct.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 1998-2002 by CERN/IT/PDP/DM - * All rights reserved - */ - -#pragma once - -#include "Castor_limits.h" - -struct robot_info { - char inquiry[32]; - int transport_start; - int transport_count; - int slot_start; - int slot_count; - int port_start; - int port_count; - int device_start; - int device_count; -}; - -struct extended_robot_info { - int smc_fd; - char smc_ldr[CA_MAXRBTNAMELEN+1]; - struct robot_info robot_info; -}; - -struct smc_element_info { - int element_address; - int element_type; - int state; - unsigned char asc; - unsigned char ascq; - int flags; - int source_address; - char name[9]; -}; - -struct smc_status { - unsigned char asc; - unsigned char ascq; - int save_errno; - int rc; /* return code from send_scsi_cmd */ - unsigned char sensekey; - int skvalid; /* sense key is valid */ -}; - diff --git a/xrootd-ssi-protobuf-interface b/xrootd-ssi-protobuf-interface index 57e4db551bbc617fc52a0b592f0d802f663f2b77..bb95ae8b5acfc8424b6a5537a5738bd92b4dfb2a 160000 --- a/xrootd-ssi-protobuf-interface +++ b/xrootd-ssi-protobuf-interface @@ -1 +1 @@ -Subproject commit 57e4db551bbc617fc52a0b592f0d802f663f2b77 +Subproject commit bb95ae8b5acfc8424b6a5537a5738bd92b4dfb2a