From 473b9356a6c69d2a85c403affc462126aafab607 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Fri, 1 Dec 2017 11:42:49 +0800 Subject: [PATCH] =?UTF-8?q?ShellSession=E8=B7=9F=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E9=9A=94=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 104 +++-- src/Shell/CMD.cpp | 107 ------ src/Shell/CMD.h | 272 ------------- src/Shell/ShellCMD.cpp | 60 +++ src/Shell/ShellSession.cpp | 101 ++--- src/Shell/ShellSession.h | 30 +- src/win32/getopt.c | 757 ------------------------------------- src/win32/getopt.h | 128 ------- src/win32/tailor.h | 329 ---------------- tests/CMakeLists.txt | 59 ++- tests/test_server.cpp | 1 + 11 files changed, 183 insertions(+), 1765 deletions(-) delete mode 100644 src/Shell/CMD.cpp delete mode 100644 src/Shell/CMD.h create mode 100644 src/Shell/ShellCMD.cpp delete mode 100644 src/win32/getopt.c delete mode 100644 src/win32/getopt.h delete mode 100644 src/win32/tailor.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 6d7bef1b..6e47303a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,21 +10,17 @@ set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) #设置子目录 set(SUB_DIR_LIST "Codec" "Common" "Device" "H264" "Http" "MediaFile" "Player" "Rtmp" "RTP" "Rtsp" "Shell") -if(WIN32) -list(APPEND SUB_DIR_LIST "win32") -endif() - #使能GOP缓存 add_definitions(-DENABLE_RING_USEBUF) #安装目录 if(WIN32) -set(INSTALL_PATH_LIB $ENV{HOME}/${CMAKE_PROJECT_NAME}/lib) -set(INSTALL_PATH_INCLUDE $ENV{HOME}/${CMAKE_PROJECT_NAME}/include) + set(INSTALL_PATH_LIB $ENV{HOME}/${CMAKE_PROJECT_NAME}/lib) + set(INSTALL_PATH_INCLUDE $ENV{HOME}/${CMAKE_PROJECT_NAME}/include) else() -set(INSTALL_PATH_LIB lib) -set(INSTALL_PATH_INCLUDE include) + set(INSTALL_PATH_LIB lib) + set(INSTALL_PATH_INCLUDE include) endif() @@ -32,64 +28,64 @@ foreach(SUB_DIR ${SUB_DIR_LIST}) #遍历源文件 aux_source_directory(src/${SUB_DIR} SRC_LIST) #安装头文件至系统目录 - install(DIRECTORY src/${SUB_DIR} DESTINATION ${INSTALL_PATH_INCLUDE}/${CMAKE_PROJECT_NAME} FILES_MATCHING PATTERN "*.h") -endforeach(SUB_DIR ${SUB_DIR_LIST}) + install(DIRECTORY src/${SUB_DIR} DESTINATION ${INSTALL_PATH_INCLUDE} FILES_MATCHING PATTERN "*.h") +endforeach() set(LINK_LIB_LIST) #查找openssl是否安装 find_package(OpenSSL QUIET) if(OPENSSL_FOUND) -message(STATUS "找到openssl库:\"${OPENSSL_INCLUDE_DIR}\",ENABLE_OPENSSL宏已打开") -include_directories(${OPENSSL_INCLUDE_DIR}) -add_definitions(-DENABLE_OPENSSL) -list(APPEND LINK_LIB_LIST ${OPENSSL_LIBRARIES}) -endif(OPENSSL_FOUND) + message(STATUS "找到openssl库:\"${OPENSSL_INCLUDE_DIR}\",ENABLE_OPENSSL宏已打开") + include_directories(${OPENSSL_INCLUDE_DIR}) + add_definitions(-DENABLE_OPENSSL) + list(APPEND LINK_LIB_LIST ${OPENSSL_LIBRARIES}) +endif() #查找mysql是否安装 find_package(MYSQL QUIET) if(MYSQL_FOUND) -message(STATUS "找到mysqlclient库:\"${MYSQL_INCLUDE_DIR}\",ENABLE_MYSQL宏已打开") -include_directories(${MYSQL_INCLUDE_DIR}) -add_definitions(-DENABLE_MYSQL) -list(APPEND LINK_LIB_LIST ${MYSQL_LIBRARIES}) -endif(MYSQL_FOUND) + message(STATUS "找到mysqlclient库:\"${MYSQL_INCLUDE_DIR}\",ENABLE_MYSQL宏已打开") + include_directories(${MYSQL_INCLUDE_DIR}) + add_definitions(-DENABLE_MYSQL) + list(APPEND LINK_LIB_LIST ${MYSQL_LIBRARIES}) +endif() #查找mp4v2是否安装 find_package(MP4V2 QUIET) if(MP4V2_FOUND) -message(STATUS "找到mp4v2库:\"${MP4V2_INCLUDE_DIR}\",ENABLE_MP4V2宏已打开") -include_directories(${MP4V2_INCLUDE_DIR}) -add_definitions(-DENABLE_MP4V2) -list(APPEND LINK_LIB_LIST ${MP4V2_LIBRARIES}) -endif(MP4V2_FOUND) + message(STATUS "找到mp4v2库:\"${MP4V2_INCLUDE_DIR}\",ENABLE_MP4V2宏已打开") + include_directories(${MP4V2_INCLUDE_DIR}) + add_definitions(-DENABLE_MP4V2) + list(APPEND LINK_LIB_LIST ${MP4V2_LIBRARIES}) +endif() #查找x264是否安装 find_package(X264 QUIET) if(X264_FOUND) -message(STATUS "找到x264库:\"${X264_INCLUDE_DIRS}\",ENABLE_X264宏已打开") -include_directories(${X264_INCLUDE_DIRS}) -add_definitions(-DENABLE_X264) -list(APPEND LINK_LIB_LIST ${X264_LIBRARIES}) -endif(X264_FOUND) + message(STATUS "找到x264库:\"${X264_INCLUDE_DIRS}\",ENABLE_X264宏已打开") + include_directories(${X264_INCLUDE_DIRS}) + add_definitions(-DENABLE_X264) + list(APPEND LINK_LIB_LIST ${X264_LIBRARIES}) +endif() #查找faac是否安装 find_package(FAAC QUIET) if(FAAC_FOUND) -message(STATUS "找到faac库:\"${FAAC_INCLUDE_DIR}\",ENABLE_FAAC宏已打开") -include_directories(${FAAC_INCLUDE_DIR}) -add_definitions(-DENABLE_FAAC) -list(APPEND LINK_LIB_LIST ${FAAC_LIBRARIES}) -endif(FAAC_FOUND) + message(STATUS "找到faac库:\"${FAAC_INCLUDE_DIR}\",ENABLE_FAAC宏已打开") + include_directories(${FAAC_INCLUDE_DIR}) + add_definitions(-DENABLE_FAAC) + list(APPEND LINK_LIB_LIST ${FAAC_LIBRARIES}) +endif() #查找ZLToolKit是否安装 find_package(ZLTOOLKIT QUIET) if(ZLTOOLKIT_FOUND) -message(STATUS "找到ZLToolKit库:\"${ZLTOOLKIT_INCLUDE_DIR}\"") -include_directories(${ZLTOOLKIT_INCLUDE_DIR}) -list(APPEND LINK_LIB_LIST ${ZLTOOLKIT_LIBRARIES}) -endif(ZLTOOLKIT_FOUND) + message(STATUS "找到ZLToolKit库:\"${ZLTOOLKIT_INCLUDE_DIR}\"") + include_directories(${ZLTOOLKIT_INCLUDE_DIR}) + list(APPEND LINK_LIB_LIST ${ZLTOOLKIT_LIBRARIES}) +endif() #打印库文件 message(STATUS "将链接依赖库:${LINK_LIB_LIST}") @@ -103,29 +99,31 @@ include_directories(${PROJECT_SOURCE_DIR}/src) set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}") if(NOT WIN32) -#关闭过期接口警告 -add_compile_options(-Wno-deprecated-declarations) -#关闭__FUNCTION__宏在函数外警告 -add_compile_options(-Wno-predefined-identifier-outside-function) -endif(NOT WIN32) + #关闭过期接口警告 + add_compile_options(-Wno-deprecated-declarations) + #关闭__FUNCTION__宏在函数外警告 + add_compile_options(-Wno-predefined-identifier-outside-function) +endif() #编译动态库 if(NOT IOS AND NOT ANDROID) -add_library(${CMAKE_PROJECT_NAME}_shared SHARED ${SRC_LIST}) -set_target_properties(${CMAKE_PROJECT_NAME}_shared PROPERTIES OUTPUT_NAME "${CMAKE_PROJECT_NAME}") -install(TARGETS ${CMAKE_PROJECT_NAME}_shared ARCHIVE DESTINATION ${INSTALL_PATH_LIB} LIBRARY DESTINATION ${INSTALL_PATH_LIB}) -target_link_libraries(${CMAKE_PROJECT_NAME}_shared ${LINK_LIB_LIST}) + add_library(${CMAKE_PROJECT_NAME}_shared SHARED ${SRC_LIST}) + set_target_properties(${CMAKE_PROJECT_NAME}_shared PROPERTIES OUTPUT_NAME "${CMAKE_PROJECT_NAME}") + install(TARGETS ${CMAKE_PROJECT_NAME}_shared ARCHIVE DESTINATION ${INSTALL_PATH_LIB} LIBRARY DESTINATION ${INSTALL_PATH_LIB}) + target_link_libraries(${CMAKE_PROJECT_NAME}_shared ${LINK_LIB_LIST}) endif() #编译静态库 -add_library(${CMAKE_PROJECT_NAME}_static STATIC ${SRC_LIST}) -set_target_properties(${CMAKE_PROJECT_NAME}_static PROPERTIES OUTPUT_NAME "${CMAKE_PROJECT_NAME}") -install(TARGETS ${CMAKE_PROJECT_NAME}_static ARCHIVE DESTINATION ${INSTALL_PATH_LIB}) +if(NOT WIN32) + add_library(${CMAKE_PROJECT_NAME}_static STATIC ${SRC_LIST}) + set_target_properties(${CMAKE_PROJECT_NAME}_static PROPERTIES OUTPUT_NAME "${CMAKE_PROJECT_NAME}") + install(TARGETS ${CMAKE_PROJECT_NAME}_static ARCHIVE DESTINATION ${INSTALL_PATH_LIB}) +endif() #测试程序 if(NOT IOS) -add_subdirectory(tests) -endif(NOT IOS) + add_subdirectory(tests) +endif() diff --git a/src/Shell/CMD.cpp b/src/Shell/CMD.cpp deleted file mode 100644 index 03442141..00000000 --- a/src/Shell/CMD.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2016 xiongziliang <771730766@qq.com> - * - * This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit). - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#include "CMD.h" -#include "ShellSession.h" -#include "Rtsp/RtspMediaSource.h" -#include "Rtmp/RtmpMediaSource.h" -using namespace ZL::Rtsp; -using namespace ZL::Rtmp; - - -namespace ZL { -namespace Shell { - -mutex OptionParser::mtx_opt; - -CMD::CMD() { -} - -CMD::~CMD() { -} - -CMD_help::CMD_help() { - parser.reset( new OptionParser(nullptr)); - (*parser) << Option('c', "cmd", Option::ArgNone, "list all command", [](OutStream *stream,const char *arg) { - _StrPrinter printer; - for (auto &pr : ShellSession::g_mapCmd) { - printer << "\t" << pr.first << ":" << pr.second.description() << "\r\n"; - } - stream->response(printer << endl); - return false; - }) << endl; -} - -CMD_rtsp::CMD_rtsp() { - parser.reset(new OptionParser(nullptr)); - (*parser) << Option('l', "list", Option::ArgNone, "list all media source of rtsp", [](OutStream *stream,const char *arg) { - _StrPrinter printer; - auto mediaSet = RtspMediaSource::getMediaSet(); - for (auto &src : mediaSet) { - printer << "\t" << src << "\r\n"; - } - stream->response(printer << endl); - return false; - }) << endl; -} - -CMD_rtmp::CMD_rtmp() { - parser.reset(new OptionParser(nullptr)); - (*parser) << Option('l', "list", Option::ArgNone, "list all media source of rtmp", [](OutStream *stream,const char *arg) { - _StrPrinter printer; - auto mediaSet = RtmpMediaSource::getMediaSet(); - for (auto &src : mediaSet) { - printer << "\t" << src << "\r\n"; - } - stream->response(printer << endl); - return false; - }) << endl; -} - - - - - - - - - - - - - - - - - - - - - -} /* namespace Shell */ -} /* namespace ZL */ - - diff --git a/src/Shell/CMD.h b/src/Shell/CMD.h deleted file mode 100644 index f8c201de..00000000 --- a/src/Shell/CMD.h +++ /dev/null @@ -1,272 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2016 xiongziliang <771730766@qq.com> - * - * This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit). - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef SRC_SHELL_CMD_H_ -#define SRC_SHELL_CMD_H_ - -#if defined(_WIN32) -#include "win32/getopt.h" -#else -#include -#endif //defined(_WIN32) - -#include -#include -#include -#include -#include -#include "Util/util.h" -#include "Util/logger.h" - -using namespace std; -using namespace ZL::Util; - -namespace ZL { -namespace Shell { - -class OutStream { -public: - virtual ~OutStream() { - } - virtual void response(const string &str) =0; - virtual string &operator[](const string &) =0; - virtual int erase(const string &) =0; -}; - -class Option { -public: - typedef function OptionHandler; - enum ArgType { - ArgNone = no_argument, - ArgRequired = required_argument, - ArgOptional = optional_argument - }; - Option() { - } - Option(char _shortOpt, const char *_longOpt, enum ArgType _argType, - const char *_des, const OptionHandler &_cb) { - shortOpt = _shortOpt; - longOpt = _longOpt; - argType = _argType; - des = _des; - cb = _cb; - } - virtual ~Option() { - } - bool operator()(OutStream *stream, const char *arg){ - return cb ? cb(stream,arg): true; - } -private: - friend class OptionParser; - char shortOpt; - string longOpt; - enum ArgType argType; - string des; - OptionHandler cb; -}; - -class OptionParser { -public: - typedef function< void(OutStream *stream, const unordered_multimap &)> OptionCompleted; - OptionParser(const OptionCompleted &_cb) { - onCompleted = _cb; - helper = Option('h', "help", Option::ArgNone, "print this message", [this](OutStream *stream,const char *arg)->bool { - _StrPrinter printer; - for (auto &pr : options) { - printer<<"\t-"<response(sendStr); - return false; - }); - } - virtual ~OptionParser() { - } - OptionParser &operator <<(const Option &option) { - options.emplace(option.shortOpt, option); - return *this; - } - void operator <<(ostream&(*f)(ostream&)) { - str_shortOpt.clear(); - vec_longOpt.clear(); - (*this) << helper; - struct option tmp; - for (auto &pr : options) { - //long opt - tmp.name = (char *)pr.second.longOpt.data(); - tmp.has_arg = pr.second.argType; - tmp.flag = NULL; - tmp.val = pr.first; - vec_longOpt.emplace_back(tmp); - //short opt - str_shortOpt.push_back(pr.first); - switch (pr.second.argType) { - case Option::ArgRequired: - str_shortOpt.append(":"); - break; - case Option::ArgOptional: - str_shortOpt.append("::"); - break; - default: - break; - } - } - tmp.flag=0; - tmp.name=0; - tmp.has_arg=0; - tmp.val=0; - vec_longOpt.emplace_back(tmp); - - } - bool operator ()(OutStream *stream, int argc, char *argv[]) { - lock_guard lck(mtx_opt); - unordered_multimap allArg; - int opt; - optind = 0; - while ((opt = getopt_long(argc, argv, &str_shortOpt[0], &vec_longOpt[0],NULL)) != -1) { - auto it = options.find(opt); - if (it == options.end()) { - string sendStr = StrPrinter << "\tUnrecognized option. Enter \"-h\" to get help.\r\n" << endl; - stream->response(sendStr); - return true; - } - allArg.emplace(it->first, optarg ? optarg : ""); - if (!it->second(stream, optarg)) { - return true; - } - optarg = NULL; - } - if(!allArg.size() && options.size()){ - helper(stream,""); - return true; - } - if (onCompleted) { - onCompleted(stream, allArg); - } - return true; - } -private: - unordered_map options; - OptionCompleted onCompleted; - vector vec_longOpt; - string str_shortOpt; - Option helper; - static mutex mtx_opt; -}; - -class CMD { -public: - CMD(); - virtual ~CMD(); - virtual const char *description() const { - return "description"; - } - bool operator ()(OutStream *stream, int argc, char *argv[]) const { - return (*parser)(stream, argc, argv); - } -protected: - mutable std::shared_ptr parser; -}; -template -class CMDInstance { -public: - static CMD &Instance() { - static C instance; - return (CMD &) instance; - } -}; -class CMD_help: public CMD { -public: - CMD_help(); - virtual ~CMD_help() { - } - const char *description() const override { - return "打印帮助信息."; - } -}; - -class CMD_rtsp: public CMD { -public: - CMD_rtsp(); - virtual ~CMD_rtsp() { - } - const char *description() const override { - return "查看rtsp服务器相关信息."; - } -}; -class CMD_rtmp: public CMD { -public: - CMD_rtmp(); - virtual ~CMD_rtmp() { - } - const char *description() const override { - return "查看rtmp服务器相关信息."; - } -}; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -} /* namespace Shell */ -} /* namespace ZL */ - -#endif /* SRC_SHELL_CMD_H_ */ diff --git a/src/Shell/ShellCMD.cpp b/src/Shell/ShellCMD.cpp new file mode 100644 index 00000000..1b8b78a3 --- /dev/null +++ b/src/Shell/ShellCMD.cpp @@ -0,0 +1,60 @@ +// +// Created by xzl on 2017/12/1. +// + +#include "Util/CMD.h" +#include "Rtsp/RtspMediaSource.h" +#include "Rtmp/RtmpMediaSource.h" + +using namespace ZL::Util; +using namespace ZL::Rtsp; +using namespace ZL::Rtmp; + +namespace ZL { +namespace Shell { + +class CMD_rtsp: public CMD { +public: + CMD_rtsp(){ + _parser.reset(new OptionParser(nullptr)); + (*_parser) << Option('l', "list", Option::ArgNone, nullptr,false, "list all media source of rtsp", + [](const std::shared_ptr &stream, const string &arg) { + auto mediaSet = RtspMediaSource::getMediaSet(); + for (auto &src : mediaSet) { + (*stream) << "\t" << src << "\r\n"; + } + return false; + }); + } + virtual ~CMD_rtsp() {} + const char *description() const override { + return "查看rtsp服务器相关信息."; + } +}; +class CMD_rtmp: public CMD { +public: + CMD_rtmp(){ + _parser.reset(new OptionParser(nullptr)); + (*_parser) << Option('l', "list", Option::ArgNone,nullptr,false, "list all media source of rtmp", + [](const std::shared_ptr &stream, const string &arg) { + auto mediaSet = RtmpMediaSource::getMediaSet(); + for (auto &src : mediaSet) { + (*stream) << "\t" << src << "\r\n"; + } + return false; + }); + } + virtual ~CMD_rtmp() {} + const char *description() const override { + return "查看rtmp服务器相关信息."; + } +}; + +static onceToken s_token([]() { + REGIST_CMD(rtmp); + REGIST_CMD(rtsp); +}, nullptr); + + +}/* namespace Shell */ +} /* namespace ZL */ \ No newline at end of file diff --git a/src/Shell/ShellSession.cpp b/src/Shell/ShellSession.cpp index cc5b6750..8c2ce229 100644 --- a/src/Shell/ShellSession.cpp +++ b/src/Shell/ShellSession.cpp @@ -24,12 +24,10 @@ * SOFTWARE. */ -#include "Common/config.h" #include "ShellSession.h" -#include "Util/logger.h" -#include "Util/util.h" +#include "Common/config.h" +#include "Util/CMD.h" #include "Util/onceToken.h" -#include "Util/mini.h" using namespace ZL::Util; @@ -37,20 +35,16 @@ namespace ZL { namespace Shell { unordered_map ShellSession::g_mapUser; -map ShellSession::g_mapCmd; string ShellSession::g_serverName; -#define SHELL_REG_CMD(cmd) g_mapCmd.emplace(#cmd,CMDInstance::Instance()) ShellSession::ShellSession(const std::shared_ptr &_th, - const Socket::Ptr &_sock) : - TcpLimitedSession(_th, _sock) { - static onceToken token([]() { - SHELL_REG_CMD(rtmp); - SHELL_REG_CMD(rtsp); - SHELL_REG_CMD(help); - g_serverName = mINI::Instance()[Config::Shell::kServerName]; - }, nullptr); - requestLogin(); + const Socket::Ptr &_sock) : + TcpLimitedSession(_th, _sock) { + + static onceToken token([]() { + g_serverName = mINI::Instance()[Config::Shell::kServerName]; + }, nullptr); + pleaseInputUser(); } ShellSession::~ShellSession() { @@ -77,16 +71,13 @@ void ShellSession::onRecv(const Socket::Buffer::Ptr&buf) { while ((index = m_strRecvBuf.find("\r\n")) != std::string::npos) { line = m_strRecvBuf.substr(0, index); m_strRecvBuf.erase(0, index + 2); - if (!onProcessLine(line)) { + if (!onCommandLine(line)) { shutdown(); return; } } } -void ShellSession::onError(const SockException& err) { -} - void ShellSession::onManager() { if (m_beatTicker.elapsedTime() > 1000 * 60 * 5) { //5 miniutes for alive @@ -94,66 +85,39 @@ void ShellSession::onManager() { return; } } -static int getArgs(char *buf, char *argv[], int max_argc = 16) { - int argc = 0; - bool start = false; - int len = strlen(buf); - for (int i = 0; i < len; i++) { - if (argc == max_argc) { - break; - } - if (buf[i] != ' ' && buf[i] != '\t' && buf[i] != '\r' - && buf[i] != '\n') { - if (!start) { - start = true; - argv[argc++] = buf + i; - } - } else { - buf[i] = '\0'; - start = false; - } - } - return argc; -} -inline bool ShellSession::onProcessLine(const string& line) { +inline bool ShellSession::onCommandLine(const string& line) { if (m_requestCB) { bool ret = m_requestCB(line); return ret; } - //cmd process - char *argv[16]; - int argc = getArgs((char *) line.data(), argv, sizeof(argv)); - if (argc == 0) { - sendHead(); - return true; - } - string cmd = argv[0]; - auto it = g_mapCmd.find(cmd); - if (it == g_mapCmd.end()) { - auto sendStr = StrPrinter << "\tUnrecognized option:\"" << cmd << "\",Enter \"help\" to get help.\r\n" << endl; - send(sendStr); - sendHead(); - return true; - } - bool ret = it->second(this, argc, argv); - sendHead(); - return ret; + try { + std::shared_ptr ss(new stringstream); + CMDRegister::Instance()(line,ss); + send(ss->str()); + }catch(ExitException &ex){ + return false; + }catch(std::exception &ex){ + send(ex.what()); + send("\r\n"); + } + printShellPrefix(); + return true; } -inline void ShellSession::requestLogin() { +inline void ShellSession::pleaseInputUser() { send("\033[0m"); send(StrPrinter << g_serverName << " login: " << endl); m_requestCB = [this](const string &line) { m_strUserName=line; - requestPasswd(); + pleaseInputPasswd(); return true; }; } -inline void ShellSession::requestPasswd() { +inline void ShellSession::pleaseInputPasswd() { send("Password: \033[8m"); m_requestCB = [this](const string &passwd) { - if(!authUser(m_strUserName,passwd)) { + if(!onAuth(m_strUserName, passwd)) { send(StrPrinter <<"\033[0mPermission denied," <<" please try again.\r\n" @@ -166,17 +130,17 @@ inline void ShellSession::requestPasswd() { send("-----------------------------------------\r\n"); send(StrPrinter<<"欢迎来到"<second == pwd; } -} -/* namespace Shell */ +}/* namespace Shell */ } /* namespace ZL */ diff --git a/src/Shell/ShellSession.h b/src/Shell/ShellSession.h index 88d79480..f58285a9 100644 --- a/src/Shell/ShellSession.h +++ b/src/Shell/ShellSession.h @@ -28,7 +28,6 @@ #define SRC_SHELL_SHELLSESSION_H_ #include -#include "CMD.h" #include "Common/config.h" #include "Util/TimeTicker.h" #include "Network/TcpLimitedSession.h" @@ -40,40 +39,31 @@ using namespace ZL::Network; namespace ZL { namespace Shell { -class ShellSession: public TcpLimitedSession, public OutStream { +class ShellSession: public TcpLimitedSession { public: ShellSession(const std::shared_ptr &_th, const Socket::Ptr &_sock); virtual ~ShellSession(); + void onRecv(const Socket::Buffer::Ptr &) override; - void onError(const SockException &err) override; + void onError(const SockException &err) override {}; void onManager() override; + static void addUser(const string &userName,const string &userPwd){ g_mapUser[userName] = userPwd; } private: - friend class CMD_help; - inline bool onProcessLine(const string &); - inline void requestLogin(); - inline void requestPasswd(); - inline void sendHead(); - inline bool authUser(const string &user, const string &pwd); - void response(const string &str) override{ - send(str); - } - string &operator[](const string &key) override{ - return m_mapConfig[key]; - } - int erase(const string &key) override{ - return m_mapConfig.erase(key); - } + inline bool onCommandLine(const string &); + inline bool onAuth(const string &user, const string &pwd); + inline void pleaseInputUser(); + inline void pleaseInputPasswd(); + inline void printShellPrefix(); function m_requestCB; string m_strRecvBuf; Ticker m_beatTicker; string m_strUserName; - unordered_map m_mapConfig; + static unordered_map g_mapUser; - static map g_mapCmd; static string g_serverName; }; diff --git a/src/win32/getopt.c b/src/win32/getopt.c deleted file mode 100644 index e8932a5e..00000000 --- a/src/win32/getopt.c +++ /dev/null @@ -1,757 +0,0 @@ -/* Getopt for GNU. - NOTE: getopt is now part of the C library, so if you don't know what - "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu - before changing it! - - Copyright (C) 1987, 88, 89, 90, 91, 92, 1993 - Free Software Foundation, Inc. - - 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, 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, 675 Mass Ave, Cambridge, MA 02139, USA. */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifndef __STDC__ -# ifndef const -# define const -# endif -#endif - -/* This tells Alpha OSF/1 not to define a getopt prototype in . */ -#ifndef _NO_PROTO -#define _NO_PROTO -#endif - -#include -#include "tailor.h" - -/* Comment out all this code if we are using the GNU C Library, and are not - actually compiling the library itself. This code is part of the GNU C - Library, but also included in many other GNU distributions. Compiling - and linking in this code is a waste when using the GNU C library - (especially if it is a shared library). Rather than having every GNU - program understand `configure --with-gnu-libc' and omit the object files, - it is simpler to just do this in the source for each such file. */ - -#if defined (_LIBC) || !defined (__GNU_LIBRARY__) - - -/* This needs to come after some library #include - to get __GNU_LIBRARY__ defined. */ -#ifdef __GNU_LIBRARY__ -/* Don't include stdlib.h for non-GNU C libraries because some of them - contain conflicting prototypes for getopt. */ -#include -#endif /* GNU C library. */ - -/* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a - long-named option. Because this is not POSIX.2 compliant, it is - being phased out. */ -/* #define GETOPT_COMPAT */ - -/* This version of `getopt' appears to the caller like standard Unix `getopt' - but it behaves differently for the user, since it allows the user - to intersperse the options with the other arguments. - - As `getopt' works, it permutes the elements of ARGV so that, - when it is done, all the options precede everything else. Thus - all application programs are extended to handle flexible argument order. - - Setting the environment variable POSIXLY_CORRECT disables permutation. - Then the behavior is completely standard. - - GNU application programs can use a third alternative mode in which - they can distinguish the relative order of options and other arguments. */ - -#include "getopt.h" - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -char *optarg = 0; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -/* XXX 1003.2 says this must be 1 before any call. */ -int optind = 0; - -/* The next char to be scanned in the option-element - in which the last option character we returned was found. - This allows us to pick up the scan where we left off. - - If this is zero, or a null string, it means resume the scan - by advancing to the next ARGV-element. */ - -static char *nextchar; - -/* Callers store zero here to inhibit the error message - for unrecognized options. */ - -int opterr = 1; - -/* Set to an option character which was unrecognized. - This must be initialized on some systems to avoid linking in the - system's own getopt implementation. */ - -#define BAD_OPTION '\0' -int optopt = BAD_OPTION; - -/* Describe how to deal with options that follow non-option ARGV-elements. - - If the caller did not specify anything, - the default is REQUIRE_ORDER if the environment variable - POSIXLY_CORRECT is defined, PERMUTE otherwise. - - REQUIRE_ORDER means don't recognize them as options; - stop option processing when the first non-option is seen. - This is what Unix does. - This mode of operation is selected by either setting the environment - variable POSIXLY_CORRECT, or using `+' as the first character - of the list of option characters. - - PERMUTE is the default. We permute the contents of ARGV as we scan, - so that eventually all the non-options are at the end. This allows options - to be given in any order, even with programs that were not written to - expect this. - - RETURN_IN_ORDER is an option available to programs that were written - to expect options and other ARGV-elements in any order and that care about - the ordering of the two. We describe each non-option ARGV-element - as if it were the argument of an option with character code 1. - Using `-' as the first character of the list of option characters - selects this mode of operation. - - The special argument `--' forces an end of option-scanning regardless - of the value of `ordering'. In the case of RETURN_IN_ORDER, only - `--' can cause `getopt' to return EOF with `optind' != ARGC. */ - -static enum -{ - REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER -} ordering; - -#include - -#ifdef __GNU_LIBRARY__ -/* We want to avoid inclusion of string.h with non-GNU libraries - because there are many ways it can cause trouble. - On some systems, it contains special magic macros that don't work - in GCC. */ - -#define my_index strchr -#define my_strlen strlen -#else - -/* Avoid depending on library functions or files - whose names are inconsistent. */ - -#if __STDC__ || defined(PROTO) -extern char *getenv(const char *name); -extern int strcmp (const char *s1, const char *s2); -extern int strncmp(const char *s1, const char *s2, int n); - -static int my_strlen(const char *s); -static char *my_index (const char *str, int chr); -#else -extern char *getenv (); -#endif - -static int -my_strlen (str) - const char *str; -{ - int n = 0; - while (*str++) - n++; - return n; -} - -static char * -my_index (str, chr) - const char *str; - int chr; -{ - while (*str) - { - if (*str == chr) - return (char *) str; - str++; - } - return 0; -} - -#endif /* GNU C library. */ - -/* Handle permutation of arguments. */ - -/* Describe the part of ARGV that contains non-options that have - been skipped. `first_nonopt' is the index in ARGV of the first of them; - `last_nonopt' is the index after the last of them. */ - -static int first_nonopt; -static int last_nonopt; - -/* Exchange two adjacent subsequences of ARGV. - One subsequence is elements [first_nonopt,last_nonopt) - which contains all the non-options that have been skipped so far. - The other is elements [last_nonopt,optind), which contains all - the options processed since those non-options were skipped. - - `first_nonopt' and `last_nonopt' are relocated so that they describe - the new indices of the non-options in ARGV after they are moved. - - To perform the swap, we first reverse the order of all elements. So - all options now come before all non options, but they are in the - wrong order. So we put back the options and non options in original - order by reversing them again. For example: - original input: a b c -x -y - reverse all: -y -x c b a - reverse options: -x -y c b a - reverse non options: -x -y a b c -*/ - -#if __STDC__ || defined(PROTO) -static void exchange (char **argv); -#endif - -static void -exchange (argv) - char **argv; -{ - char *temp, **first, **last; - - /* Reverse all the elements [first_nonopt, optind) */ - first = &argv[first_nonopt]; - last = &argv[optind-1]; - while (first < last) { - temp = *first; *first = *last; *last = temp; first++; last--; - } - /* Put back the options in order */ - first = &argv[first_nonopt]; - first_nonopt += (optind - last_nonopt); - last = &argv[first_nonopt - 1]; - while (first < last) { - temp = *first; *first = *last; *last = temp; first++; last--; - } - - /* Put back the non options in order */ - first = &argv[first_nonopt]; - last_nonopt = optind; - last = &argv[last_nonopt-1]; - while (first < last) { - temp = *first; *first = *last; *last = temp; first++; last--; - } -} - -/* Scan elements of ARGV (whose length is ARGC) for option characters - given in OPTSTRING. - - If an element of ARGV starts with '-', and is not exactly "-" or "--", - then it is an option element. The characters of this element - (aside from the initial '-') are option characters. If `getopt' - is called repeatedly, it returns successively each of the option characters - from each of the option elements. - - If `getopt' finds another option character, it returns that character, - updating `optind' and `nextchar' so that the next call to `getopt' can - resume the scan with the following option character or ARGV-element. - - If there are no more option characters, `getopt' returns `EOF'. - Then `optind' is the index in ARGV of the first ARGV-element - that is not an option. (The ARGV-elements have been permuted - so that those that are not options now come last.) - - OPTSTRING is a string containing the legitimate option characters. - If an option character is seen that is not listed in OPTSTRING, - return BAD_OPTION after printing an error message. If you set `opterr' to - zero, the error message is suppressed but we still return BAD_OPTION. - - If a char in OPTSTRING is followed by a colon, that means it wants an arg, - so the following text in the same ARGV-element, or the text of the following - ARGV-element, is returned in `optarg'. Two colons mean an option that - wants an optional arg; if there is text in the current ARGV-element, - it is returned in `optarg', otherwise `optarg' is set to zero. - - If OPTSTRING starts with `-' or `+', it requests different methods of - handling the non-option ARGV-elements. - See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. - - Long-named options begin with `--' instead of `-'. - Their names may be abbreviated as long as the abbreviation is unique - or is an exact match for some defined option. If they have an - argument, it follows the option name in the same ARGV-element, separated - from the option name by a `=', or else the in next ARGV-element. - When `getopt' finds a long-named option, it returns 0 if that option's - `flag' field is nonzero, the value of the option's `val' field - if the `flag' field is zero. - - The elements of ARGV aren't really const, because we permute them. - But we pretend they're const in the prototype to be compatible - with other systems. - - LONGOPTS is a vector of `struct option' terminated by an - element containing a name which is zero. - - LONGIND returns the index in LONGOPT of the long-named option found. - It is only valid when a long-named option has been found by the most - recent call. - - If LONG_ONLY is nonzero, '-' as well as '--' can introduce - long-named options. */ - -int -_getopt_internal (argc, argv, optstring, longopts, longind, long_only) - int argc; - char *const *argv; - const char *optstring; - const struct option *longopts; - int *longind; - int long_only; -{ - int option_index; - - optarg = 0; - - /* Initialize the internal data when the first call is made. - Start processing options with ARGV-element 1 (since ARGV-element 0 - is the program name); the sequence of previously skipped - non-option ARGV-elements is empty. */ - - if (optind == 0) - { - first_nonopt = last_nonopt = optind = 1; - - nextchar = NULL; - - /* Determine how to handle the ordering of options and nonoptions. */ - - if (optstring[0] == '-') - { - ordering = RETURN_IN_ORDER; - ++optstring; - } - else if (optstring[0] == '+') - { - ordering = REQUIRE_ORDER; - ++optstring; - } - else if (getenv ("POSIXLY_CORRECT") != NULL) - ordering = REQUIRE_ORDER; - else - ordering = PERMUTE; - } - - if (nextchar == NULL || *nextchar == '\0') - { - if (ordering == PERMUTE) - { - /* If we have just processed some options following some non-options, - exchange them so that the options come first. */ - - if (first_nonopt != last_nonopt && last_nonopt != optind) - exchange ((char **) argv); - else if (last_nonopt != optind) - first_nonopt = optind; - - /* Now skip any additional non-options - and extend the range of non-options previously skipped. */ - - while (optind < argc - && (argv[optind][0] != '-' || argv[optind][1] == '\0') -#ifdef GETOPT_COMPAT - && (longopts == NULL - || argv[optind][0] != '+' || argv[optind][1] == '\0') -#endif /* GETOPT_COMPAT */ - ) - optind++; - last_nonopt = optind; - } - - /* Special ARGV-element `--' means premature end of options. - Skip it like a null option, - then exchange with previous non-options as if it were an option, - then skip everything else like a non-option. */ - - if (optind != argc && !strcmp (argv[optind], "--")) - { - optind++; - - if (first_nonopt != last_nonopt && last_nonopt != optind) - exchange ((char **) argv); - else if (first_nonopt == last_nonopt) - first_nonopt = optind; - last_nonopt = argc; - - optind = argc; - } - - /* If we have done all the ARGV-elements, stop the scan - and back over any non-options that we skipped and permuted. */ - - if (optind == argc) - { - /* Set the next-arg-index to point at the non-options - that we previously skipped, so the caller will digest them. */ - if (first_nonopt != last_nonopt) - optind = first_nonopt; - return EOF; - } - - /* If we have come to a non-option and did not permute it, - either stop the scan or describe it to the caller and pass it by. */ - - if ((argv[optind][0] != '-' || argv[optind][1] == '\0') -#ifdef GETOPT_COMPAT - && (longopts == NULL - || argv[optind][0] != '+' || argv[optind][1] == '\0') -#endif /* GETOPT_COMPAT */ - ) - { - if (ordering == REQUIRE_ORDER) - return EOF; - optarg = argv[optind++]; - return 1; - } - - /* We have found another option-ARGV-element. - Start decoding its characters. */ - - nextchar = (argv[optind] + 1 - + (longopts != NULL && argv[optind][1] == '-')); - } - - if (longopts != NULL - && ((argv[optind][0] == '-' - && (argv[optind][1] == '-' || long_only)) -#ifdef GETOPT_COMPAT - || argv[optind][0] == '+' -#endif /* GETOPT_COMPAT */ - )) - { - const struct option *p; - char *s = nextchar; - int exact = 0; - int ambig = 0; - const struct option *pfound = NULL; - int indfound = 0; - - while (*s && *s != '=') - s++; - - /* Test all options for either exact match or abbreviated matches. */ - for (p = longopts, option_index = 0; p->name; - p++, option_index++) - if (!strncmp (p->name, nextchar, s - nextchar)) - { - if (s - nextchar == my_strlen (p->name)) - { - /* Exact match found. */ - pfound = p; - indfound = option_index; - exact = 1; - break; - } - else if (pfound == NULL) - { - /* First nonexact match found. */ - pfound = p; - indfound = option_index; - } - else - /* Second nonexact match found. */ - ambig = 1; - } - - if (ambig && !exact) - { - if (opterr) - fprintf (stderr, "%s: option `%s' is ambiguous\n", - argv[0], argv[optind]); - nextchar += my_strlen (nextchar); - optind++; - return BAD_OPTION; - } - - if (pfound != NULL) - { - option_index = indfound; - optind++; - if (*s) - { - /* Don't test has_arg with >, because some C compilers don't - allow it to be used on enums. */ - if (pfound->has_arg) - optarg = s + 1; - else - { - if (opterr) - { - if (argv[optind - 1][1] == '-') - /* --option */ - fprintf (stderr, - "%s: option `--%s' doesn't allow an argument\n", - argv[0], pfound->name); - else - /* +option or -option */ - fprintf (stderr, - "%s: option `%c%s' doesn't allow an argument\n", - argv[0], argv[optind - 1][0], pfound->name); - } - nextchar += my_strlen (nextchar); - return BAD_OPTION; - } - } - else if (pfound->has_arg == 1) - { - if (optind < argc) - optarg = argv[optind++]; - else - { - if (opterr) - fprintf (stderr, "%s: option `%s' requires an argument\n", - argv[0], argv[optind - 1]); - nextchar += my_strlen (nextchar); - return optstring[0] == ':' ? ':' : BAD_OPTION; - } - } - nextchar += my_strlen (nextchar); - if (longind != NULL) - *longind = option_index; - if (pfound->flag) - { - *(pfound->flag) = pfound->val; - return 0; - } - return pfound->val; - } - /* Can't find it as a long option. If this is not getopt_long_only, - or the option starts with '--' or is not a valid short - option, then it's an error. - Otherwise interpret it as a short option. */ - if (!long_only || argv[optind][1] == '-' -#ifdef GETOPT_COMPAT - || argv[optind][0] == '+' -#endif /* GETOPT_COMPAT */ - || my_index (optstring, *nextchar) == NULL) - { - if (opterr) - { - if (argv[optind][1] == '-') - /* --option */ - fprintf (stderr, "%s: unrecognized option `--%s'\n", - argv[0], nextchar); - else - /* +option or -option */ - fprintf (stderr, "%s: unrecognized option `%c%s'\n", - argv[0], argv[optind][0], nextchar); - } - nextchar = (char *) ""; - optind++; - return BAD_OPTION; - } - } - - /* Look at and handle the next option-character. */ - - { - char c = *nextchar++; - char *temp = my_index (optstring, c); - - /* Increment `optind' when we start to process its last character. */ - if (*nextchar == '\0') - ++optind; - - if (temp == NULL || c == ':') - { - if (opterr) - { -#if 0 - if (c < 040 || c >= 0177) - fprintf (stderr, "%s: unrecognized option, character code 0%o\n", - argv[0], c); - else - fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c); -#else - /* 1003.2 specifies the format of this message. */ - fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c); -#endif - } - optopt = c; - return BAD_OPTION; - } - if (temp[1] == ':') - { - if (temp[2] == ':') - { - /* This is an option that accepts an argument optionally. */ - if (*nextchar != '\0') - { - optarg = nextchar; - optind++; - } - else - optarg = 0; - nextchar = NULL; - } - else - { - /* This is an option that requires an argument. */ - if (*nextchar != '\0') - { - optarg = nextchar; - /* If we end this ARGV-element by taking the rest as an arg, - we must advance to the next element now. */ - optind++; - } - else if (optind == argc) - { - if (opterr) - { -#if 0 - fprintf (stderr, "%s: option `-%c' requires an argument\n", - argv[0], c); -#else - /* 1003.2 specifies the format of this message. */ - fprintf (stderr, "%s: option requires an argument -- %c\n", - argv[0], c); -#endif - } - optopt = c; - if (optstring[0] == ':') - c = ':'; - else - c = BAD_OPTION; - } - else - /* We already incremented `optind' once; - increment it again when taking next ARGV-elt as argument. */ - optarg = argv[optind++]; - nextchar = NULL; - } - } - return c; - } -} - -int -getopt (argc, argv, optstring) - int argc; - char *const *argv; - const char *optstring; -{ - return _getopt_internal (argc, argv, optstring, - (const struct option *) 0, - (int *) 0, - 0); -} - -int -getopt_long (argc, argv, options, long_options, opt_index) - int argc; - char *const *argv; - const char *options; - const struct option *long_options; - int *opt_index; -{ - return _getopt_internal (argc, argv, options, long_options, opt_index, 0); -} - -#endif /* _LIBC or not __GNU_LIBRARY__. */ - -#ifdef TEST - -/* Compile with -DTEST to make an executable for use in testing - the above definition of `getopt'. */ - -int -main (argc, argv) - int argc; - char **argv; -{ - int c; - int digit_optind = 0; - - while (1) - { - int this_option_optind = optind ? optind : 1; - - c = getopt (argc, argv, "abc:d:0123456789"); - if (c == EOF) - break; - - switch (c) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - if (digit_optind != 0 && digit_optind != this_option_optind) - printf ("digits occur in two different argv-elements.\n"); - digit_optind = this_option_optind; - printf ("option %c\n", c); - break; - - case 'a': - printf ("option a\n"); - break; - - case 'b': - printf ("option b\n"); - break; - - case 'c': - printf ("option c with value `%s'\n", optarg); - break; - - case BAD_OPTION: - break; - - default: - printf ("?? getopt returned character code 0%o ??\n", c); - } - } - - if (optind < argc) - { - printf ("non-option ARGV-elements: "); - while (optind < argc) - printf ("%s ", argv[optind++]); - printf ("\n"); - } - - exit (0); -} - -#endif /* TEST */ - diff --git a/src/win32/getopt.h b/src/win32/getopt.h deleted file mode 100644 index 3f4733cd..00000000 --- a/src/win32/getopt.h +++ /dev/null @@ -1,128 +0,0 @@ -/* Declarations for getopt. - Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. - - 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, 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, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#ifndef _GETOPT_H -#define _GETOPT_H 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -extern char *optarg; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -extern int optind; - -/* Callers store zero here to inhibit the error message `getopt' prints - for unrecognized options. */ - -extern int opterr; - -/* Set to an option character which was unrecognized. */ - -extern int optopt; - -/* Describe the long-named options requested by the application. - The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector - of `struct option' terminated by an element containing a name which is - zero. - - The field `has_arg' is: - no_argument (or 0) if the option does not take an argument, - required_argument (or 1) if the option requires an argument, - optional_argument (or 2) if the option takes an optional argument. - - If the field `flag' is not NULL, it points to a variable that is set - to the value given in the field `val' when the option is found, but - left unchanged if the option is not found. - - To have a long-named option do something other than set an `int' to - a compiled-in constant, such as set a value from `optarg', set the - option's `flag' field to zero and its `val' field to a nonzero - value (the equivalent single-letter option character, if there is - one). For long options that have a zero `flag' field, `getopt' - returns the contents of the `val' field. */ - -struct option -{ -#if __STDC__ - const char *name; -#else - char *name; -#endif - /* has_arg can't be an enum because some compilers complain about - type mismatches in all the code that assumes it is an int. */ - int has_arg; - int *flag; - int val; -}; - -/* Names for the values of the `has_arg' field of `struct option'. */ - -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -//#if __STDC__ || defined(PROTO) -//#if defined(__GNU_LIBRARY__) -/* Many other libraries have conflicting prototypes for getopt, with - differences in the consts, in stdlib.h. To avoid compilation - errors, only prototype getopt for the GNU C library. */ -extern int getopt (int argc, char *const *argv, const char *shortopts); -//#endif /* not __GNU_LIBRARY__ */ -extern int getopt_long (int argc, char *const *argv, const char *shortopts, - const struct option *longopts, int *longind); -extern int getopt_long_only (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind); - -/* Internal only. Users should not call this directly. */ -/* extern int _getopt_internal (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind, - int long_only); */ -//#else /* not __STDC__ */ -//extern int getopt (); -//extern int getopt_long (); -//extern int getopt_long_only (); - -//extern int _getopt_internal (); -//#endif /* not __STDC__ */ - -#ifdef __cplusplus -} -#endif - -#endif /* _GETOPT_H */ - diff --git a/src/win32/tailor.h b/src/win32/tailor.h deleted file mode 100644 index 3444cd3e..00000000 --- a/src/win32/tailor.h +++ /dev/null @@ -1,329 +0,0 @@ -/* tailor.h -- target dependent definitions - * Copyright (C) 1992-1993 Jean-loup Gailly. - * This is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License, see the file COPYING. - */ - -/* The target dependent definitions should be defined here only. - * The target dependent functions should be defined in tailor.c. - */ - -/* $Id: tailor.h,v 0.18 1993/06/14 19:32:20 jloup Exp $ */ - -#if defined(__MSDOS__) && !defined(MSDOS) -# define MSDOS -#endif - -#if defined(__OS2__) && !defined(OS2) -# define OS2 -#endif - -#if defined(OS2) && defined(MSDOS) /* MS C under OS/2 */ -# undef MSDOS -#endif - -#ifdef MSDOS -# ifdef __GNUC__ - /* DJGPP version 1.09+ on MS-DOS. - * The DJGPP 1.09 stat() function must be upgraded before gzip will - * fully work. - * No need for DIRENT, since defines POSIX_SOURCE which - * implies DIRENT. - */ -# define near -# else -# define MAXSEG_64K -# ifdef __TURBOC__ -# define NO_OFF_T -# ifdef __BORLANDC__ -# define DIRENT -# else -# define NO_UTIME -# endif -# else /* MSC */ -# define HAVE_SYS_UTIME_H -# define NO_UTIME_H -# endif -# endif -# define PATH_SEP2 '\\' -# define PATH_SEP3 ':' -# define MAX_PATH_LEN 128 -# define NO_MULTIPLE_DOTS -# define MAX_EXT_CHARS 3 -# define Z_SUFFIX "z" -# define NO_CHOWN -# define PROTO -# define STDC_HEADERS -# define NO_SIZE_CHECK -# define casemap(c) tolow(c) /* Force file names to lower case */ -# include -# define OS_CODE 0x00 -# define SET_BINARY_MODE(fd) setmode(fd, O_BINARY) -# if !defined(NO_ASM) && !defined(ASMV) -# define ASMV -# endif -#else -# define near -#endif - -#ifdef OS2 -# define PATH_SEP2 '\\' -# define PATH_SEP3 ':' -# define MAX_PATH_LEN 260 -# ifdef OS2FAT -# define NO_MULTIPLE_DOTS -# define MAX_EXT_CHARS 3 -# define Z_SUFFIX "z" -# define casemap(c) tolow(c) -# endif -# define NO_CHOWN -# define PROTO -# define STDC_HEADERS -# include -# define OS_CODE 0x06 -# define SET_BINARY_MODE(fd) setmode(fd, O_BINARY) -# ifdef _MSC_VER -# define HAVE_SYS_UTIME_H -# define NO_UTIME_H -# define MAXSEG_64K -# undef near -# define near _near -# endif -# ifdef __EMX__ -# define HAVE_SYS_UTIME_H -# define NO_UTIME_H -# define DIRENT -# define EXPAND(argc,argv) \ - {_response(&argc, &argv); _wildcard(&argc, &argv);} -# endif -# ifdef __BORLANDC__ -# define DIRENT -# endif -# ifdef __ZTC__ -# define NO_DIR -# define NO_UTIME_H -# include -# define EXPAND(argc,argv) \ - {response_expand(&argc, &argv);} -# endif -#endif - -#ifdef WIN32 /* Windows NT */ -# define HAVE_SYS_UTIME_H -# define NO_UTIME_H -# define PATH_SEP2 '\\' -# define PATH_SEP3 ':' -# define MAX_PATH_LEN 260 -# define NO_CHOWN -# define PROTO -# define STDC_HEADERS -# define SET_BINARY_MODE(fd) setmode(fd, O_BINARY) -# include -# include -# ifdef NTFAT -# define NO_MULTIPLE_DOTS -# define MAX_EXT_CHARS 3 -# define Z_SUFFIX "z" -# define casemap(c) tolow(c) /* Force file names to lower case */ -# endif -# define OS_CODE 0x0b -#endif - -#ifdef MSDOS -# ifdef __TURBOC__ -# include -# define DYN_ALLOC - /* Turbo C 2.0 does not accept static allocations of large arrays */ - void * fcalloc (unsigned items, unsigned size); - void fcfree (void *ptr); -# else /* MSC */ -# include -# define fcalloc(nitems,itemsize) halloc((long)(nitems),(itemsize)) -# define fcfree(ptr) hfree(ptr) -# endif -#else -# ifdef MAXSEG_64K -# define fcalloc(items,size) calloc((items),(size)) -# else -# define fcalloc(items,size) malloc((size_t)(items)*(size_t)(size)) -# endif -# define fcfree(ptr) free(ptr) -#endif - -#if defined(VAXC) || defined(VMS) -# define PATH_SEP ']' -# define PATH_SEP2 ':' -# define SUFFIX_SEP ';' -# define NO_MULTIPLE_DOTS -# define Z_SUFFIX "-gz" -# define RECORD_IO 1 -# define casemap(c) tolow(c) -# define OS_CODE 0x02 -# define OPTIONS_VAR "GZIP_OPT" -# define STDC_HEADERS -# define NO_UTIME -# define EXPAND(argc,argv) vms_expand_args(&argc,&argv); -# include -# define unlink delete -# ifdef VAXC -# define NO_FCNTL_H -# include -# endif -#endif - -#ifdef AMIGA -# define PATH_SEP2 ':' -# define STDC_HEADERS -# define OS_CODE 0x01 -# define ASMV -# ifdef __GNUC__ -# define DIRENT -# define HAVE_UNISTD_H -# else /* SASC */ -# define NO_STDIN_FSTAT -# define SYSDIR -# define NO_SYMLINK -# define NO_CHOWN -# define NO_FCNTL_H -# include /* for read() and write() */ -# define direct dirent - extern void _expand_args(int *argc, char ***argv); -# define EXPAND(argc,argv) _expand_args(&argc,&argv); -# undef O_BINARY /* disable useless --ascii option */ -# endif -#endif - -#if defined(ATARI) || defined(atarist) -# ifndef STDC_HEADERS -# define STDC_HEADERS -# define HAVE_UNISTD_H -# define DIRENT -# endif -# define ASMV -# define OS_CODE 0x05 -# ifdef TOSFS -# define PATH_SEP2 '\\' -# define PATH_SEP3 ':' -# define MAX_PATH_LEN 128 -# define NO_MULTIPLE_DOTS -# define MAX_EXT_CHARS 3 -# define Z_SUFFIX "z" -# define NO_CHOWN -# define casemap(c) tolow(c) /* Force file names to lower case */ -# define NO_SYMLINK -# endif -#endif - -#ifdef MACOS -# define PATH_SEP ':' -# define DYN_ALLOC -# define PROTO -# define NO_STDIN_FSTAT -# define NO_CHOWN -# define NO_UTIME -# define chmod(file, mode) (0) -# define OPEN(name, flags, mode) open(name, flags) -# define OS_CODE 0x07 -# ifdef MPW -# define isatty(fd) ((fd) <= 2) -# endif -#endif - -#ifdef __50SERIES /* Prime/PRIMOS */ -# define PATH_SEP '>' -# define STDC_HEADERS -# define NO_MEMORY_H -# define NO_UTIME_H -# define NO_UTIME -# define NO_CHOWN -# define NO_STDIN_FSTAT -# define NO_SIZE_CHECK -# define NO_SYMLINK -# define RECORD_IO 1 -# define casemap(c) tolow(c) /* Force file names to lower case */ -# define put_char(c) put_byte((c) & 0x7F) -# define get_char(c) ascii2pascii(get_byte()) -# define OS_CODE 0x0F /* temporary, subject to change */ -# ifdef SIGTERM -# undef SIGTERM /* We don't want a signal handler for SIGTERM */ -# endif -#endif - -#if defined(pyr) && !defined(NOMEMCPY) /* Pyramid */ -# define NOMEMCPY /* problem with overlapping copies */ -#endif - -#ifdef TOPS20 -# define OS_CODE 0x0a -#endif - -#ifndef unix -# define NO_ST_INO /* don't rely on inode numbers */ -#endif - - - /* Common defaults */ - -#ifndef OS_CODE -# define OS_CODE 0x03 /* assume Unix */ -#endif - -#ifndef PATH_SEP -# define PATH_SEP '/' -#endif - -#ifndef casemap -# define casemap(c) (c) -#endif - -#ifndef OPTIONS_VAR -# define OPTIONS_VAR "GZIP" -#endif - -#ifndef Z_SUFFIX -# define Z_SUFFIX ".gz" -#endif - -#ifdef MAX_EXT_CHARS -# define MAX_SUFFIX MAX_EXT_CHARS -#else -# define MAX_SUFFIX 30 -#endif - -#ifndef MAKE_LEGAL_NAME -# ifdef NO_MULTIPLE_DOTS -# define MAKE_LEGAL_NAME(name) make_simple_name(name) -# else -# define MAKE_LEGAL_NAME(name) -# endif -#endif - -#ifndef MIN_PART -# define MIN_PART 3 - /* keep at least MIN_PART chars between dots in a file name. */ -#endif - -#ifndef EXPAND -# define EXPAND(argc,argv) -#endif - -#ifndef RECORD_IO -# define RECORD_IO 0 -#endif - -#ifndef SET_BINARY_MODE -# define SET_BINARY_MODE(fd) -#endif - -#ifndef OPEN -# define OPEN(name, flags, mode) open(name, flags, mode) -#endif - -#ifndef get_char -# define get_char() get_byte() -#endif - -#ifndef put_char -# define put_char(c) put_byte(c) -#endif - diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index c4d80dd8..25aee438 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,51 +1,50 @@ #查找SDL是否安装 find_package(SDL QUIET) if(SDL_FOUND) -include_directories(${SDL_INCLUDE_DIR}) -list(APPEND LINK_LIB_LIST ${SDL_LIBRARY}) -message(STATUS "找到SDL") -endif(SDL_FOUND) + include_directories(${SDL_INCLUDE_DIR}) + list(APPEND LINK_LIB_LIST ${SDL_LIBRARY}) + message(STATUS "找到SDL") +endif() #查找ffmpeg/libutil是否安装 find_package(AVUTIL QUIET) if(AVUTIL_FOUND) -include_directories(${AVUTIL_INCLUDE_DIR}) -list(APPEND LINK_LIB_LIST ${AVUTIL_LIBRARIES}) -message(STATUS "找到libutil") -endif(AVUTIL_FOUND) + include_directories(${AVUTIL_INCLUDE_DIR}) + list(APPEND LINK_LIB_LIST ${AVUTIL_LIBRARIES}) + message(STATUS "找到libutil") +endif() #查找ffmpeg/libavcodec是否安装 find_package(AVCODEC QUIET) if(AVCODEC_FOUND) -include_directories(${AVCODEC_INCLUDE_DIR}) -list(APPEND LINK_LIB_LIST ${AVCODEC_LIBRARIES}) -message(STATUS "找到libavcodec") -endif(AVCODEC_FOUND) + include_directories(${AVCODEC_INCLUDE_DIR}) + list(APPEND LINK_LIB_LIST ${AVCODEC_LIBRARIES}) + message(STATUS "找到libavcodec") +endif() aux_source_directory(. TEST_SRC_LIST) #如果ffmpeg/libavcodec ffmpeg/libavcodec SDL 都安装了则编译 test_player if(SDL_FOUND AND AVCODEC_FOUND AND AVUTIL_FOUND) -message(STATUS "test_player被编译") -else(SDL_FOUND AND AVCODEC_FOUND AND AVUTIL_FOUND) -message(STATUS "test_player被忽略,如需编译,请先安装sdl ffmpeg/libavcodec ffmpeg/libavcodec") -list(REMOVE_ITEM TEST_SRC_LIST ./test_player.cpp) -endif(SDL_FOUND AND AVCODEC_FOUND AND AVUTIL_FOUND) - -foreach(TEST_SRC ${TEST_SRC_LIST}) -STRING(REGEX REPLACE ".cpp" "" TEST_EXE_NAME ${TEST_SRC}) -STRING(REGEX REPLACE "./" "" TEST_EXE_NAME ${TEST_EXE_NAME}) -message(STATUS "add test program:${TEST_EXE_NAME}") -add_executable(${TEST_EXE_NAME} ${TEST_SRC}) - -if(ANDROID) -target_link_libraries(${TEST_EXE_NAME} ${CMAKE_PROJECT_NAME}_static ${LINK_LIB_LIST}) -elseif(WIN32) -target_link_libraries(${TEST_EXE_NAME} ${CMAKE_PROJECT_NAME}_shared ${LINK_LIB_LIST}) + message(STATUS "test_player被编译") else() -target_link_libraries(${TEST_EXE_NAME} ${CMAKE_PROJECT_NAME}_shared ${LINK_LIB_LIST} pthread) + message(STATUS "test_player被忽略,如需编译,请先安装sdl ffmpeg/libavcodec ffmpeg/libavcodec") + list(REMOVE_ITEM TEST_SRC_LIST ./test_player.cpp) endif() -endforeach(TEST_SRC ${TEST_SRC_LIST}) +foreach(TEST_SRC ${TEST_SRC_LIST}) + STRING(REGEX REPLACE "^\\./|\\.c[a-zA-Z0-9_]*$" "" TEST_EXE_NAME ${TEST_SRC}) + message(STATUS "添加测试程序:${TEST_EXE_NAME}") + add_executable(${TEST_EXE_NAME} ${TEST_SRC}) + + if(ANDROID) + target_link_libraries(${TEST_EXE_NAME} ${CMAKE_PROJECT_NAME}_static ${LINK_LIB_LIST}) + elseif(WIN32) + target_link_libraries(${TEST_EXE_NAME} ${CMAKE_PROJECT_NAME}_shared ${LINK_LIB_LIST}) + else() + target_link_libraries(${TEST_EXE_NAME} ${CMAKE_PROJECT_NAME}_shared ${LINK_LIB_LIST} pthread) + endif() + +endforeach() diff --git a/tests/test_server.cpp b/tests/test_server.cpp index 64a0c1c7..c3f9d301 100644 --- a/tests/test_server.cpp +++ b/tests/test_server.cpp @@ -94,6 +94,7 @@ int main(int argc,char *argv[]){ #ifdef ENABLE_OPENSSL //请把证书"test_server.pem"放置在本程序可执行程序同目录下 try{ + //加载证书,证书包含公钥和私钥 SSL_Initor::Instance().loadServerPem((exePath() + ".pem").data()); }catch(...){ FatalL << "请把证书:" << (exeName() + ".pem") << "放置在本程序可执行程序同目录下:" << exeDir() << endl;