summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt6
-rw-r--r--cmake/gengetopt.cmake33
-rw-r--r--src/CMakeLists.txt9
-rw-r--r--src/cssh.c26
-rw-r--r--src/cssh_options.ggo9
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)
diff --git a/src/cssh.c b/src/cssh.c
index e7fd546..e62e287 100644
--- a/src/cssh.c
+++ b/src/cssh.c
@@ -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