diff options
-rw-r--r-- | CMakeLists.txt | 6 | ||||
-rw-r--r-- | cmake/gengetopt.cmake | 33 | ||||
-rw-r--r-- | src/CMakeLists.txt | 9 | ||||
-rw-r--r-- | src/cssh.c | 26 | ||||
-rw-r--r-- | src/cssh_options.ggo | 9 |
5 files changed, 80 insertions, 3 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index ee3367f..0d0292f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,12 @@ cmake_minimum_required(VERSION 2.6 FATAL_ERROR) +set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") + +include(cmake/gengetopt.cmake) + project(cssh C) -set( CMAKE_C_FLAGS "-std=c99 -Wall -pedantic -Wfatal-errors -Werror -fPIC -O0" ) +set(CMAKE_C_FLAGS "-std=c99 -Wall -pedantic -Wfatal-errors -Werror -fPIC -O0 -Wno-unused-but-set-variable") add_subdirectory(src) diff --git a/cmake/gengetopt.cmake b/cmake/gengetopt.cmake new file mode 100644 index 0000000..3caea3e --- /dev/null +++ b/cmake/gengetopt.cmake @@ -0,0 +1,33 @@ +MACRO(FIND_GENGETOPT) + IF(NOT GENGETOPT_EXECUTABLE) + FIND_PROGRAM(GENGETOPT_EXECUTABLE gengetopt) + IF (NOT GENGETOPT_EXECUTABLE) + MESSAGE(FATAL_ERROR "gengetopt not found - aborting") + ENDIF (NOT GENGETOPT_EXECUTABLE) + ENDIF(NOT GENGETOPT_EXECUTABLE) +ENDMACRO(FIND_GENGETOPT) + +MACRO(ADD_GENGETOPT_FILES _sources ) + FIND_GENGETOPT() + + FOREACH (_current_FILE ${ARGN}) + GET_FILENAME_COMPONENT(_in ${_current_FILE} ABSOLUTE) + GET_FILENAME_COMPONENT(_basename ${_current_FILE} NAME_WE) + + SET(_out ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.c) + SET(_header ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h) + + ADD_CUSTOM_COMMAND( + OUTPUT ${_out} ${_header} + COMMAND ${GENGETOPT_EXECUTABLE} + ARGS + -F ${_basename} + --unamed-opts + --input=${_in} + DEPENDS ${_in} + ) + + SET(${_sources} ${${_sources}} ${_out} ) + SET(${_sources} ${${_sources}} ${_header} ) + ENDFOREACH (_current_FILE) +ENDMACRO(ADD_GENGETOPT_FILES) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 975552d..0bde562 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,11 @@ include_directories(${LIBSSH_PUBLIC_INCLUDE_DIRS}) -add_executable(cssh cssh.c) +set(SRC + cssh.c +) + +ADD_GENGETOPT_FILES(SRC cssh_options.ggo) + +add_executable(cssh ${SRC}) + target_link_libraries(cssh ssh) @@ -3,15 +3,39 @@ #include <stdlib.h> #include <stdio.h> +#include "cssh_options.h" + +#define CSSH_VERSION "0.0.1" + +static int parse_options_and_arguments( int argc, char *argv[], struct gengetopt_args_info *args_info ) { + cmdline_parser_init( args_info ); + + if( cmdline_parser2( argc, argv, args_info, 1, 0, 1 ) != 0 ) { + cmdline_parser_free( args_info ); + return 1; + } + + return 0; +} + int main( int argc, char *argv[] ) { + struct gengetopt_args_info args_info; ssh_session session; int verbosity = SSH_LOG_PROTOCOL; int port = 22; const char *host = "localhost"; int rc; + + if( parse_options_and_arguments( argc, argv, &args_info ) != 0 ) { + exit( EXIT_FAILURE ); + } - puts( ssh_copyright( ) ); + if( args_info.long_version_given ) { + printf( "cssh version: %s\n", CSSH_VERSION ); + printf( "libssh version: %s\n", ssh_copyright( ) ); + exit( EXIT_SUCCESS ); + } session = ssh_new( ); if( session == NULL ) { diff --git a/src/cssh_options.ggo b/src/cssh_options.ggo new file mode 100644 index 0000000..d4cfd04 --- /dev/null +++ b/src/cssh_options.ggo @@ -0,0 +1,9 @@ +package "cssh" +version "0.0.1" +usage "cssh [options] <command>" +description "Execute a command on a set of machines" + +section "Main Options" + option "long-version" - + "Full version and credentials" + optional |