fordul, nem fut, bad_addr_exc
authorTamas Jung <tamasjung@gmail.com>
Tue, 13 Apr 2010 12:59:30 +0000 (14:59 +0200)
committerTamas Jung <tamasjung@gmail.com>
Tue, 13 Apr 2010 12:59:30 +0000 (14:59 +0200)
12 files changed:
arcclientcTarget.xcconfig
ruby/test.rb [new file with mode: 0644]
src/arc_libs.h [new file with mode: 0644]
src/arcclientc.cpp
src/arcclientc.h
src/common_utils.cpp [new file with mode: 0644]
src/common_utils.h [new file with mode: 0644]
src/config.h [new file with mode: 0644]
src/logger.h [new file with mode: 0644]
src/prefix_header.h [new file with mode: 0644]
src/submit.cpp
src/submit.h

index 9002ba9..0d223d6 100644 (file)
@@ -4,7 +4,7 @@
        DYLIB_COMPATIBILITY_VERSION = 1;
        DYLIB_CURRENT_VERSION = 1;
        GCC_PRECOMPILE_PREFIX_HEADER = YES;
-       GCC_PREFIX_HEADER = arcclientc_Prefix.pch;
+       GCC_PREFIX_HEADER = src/prefix_header.h;
        GCC_ENABLE_CPP_EXCEPTIONS = YES;
        GCC_ENABLE_CPP_RTTI = YES;
        STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = Dynamic;
diff --git a/ruby/test.rb b/ruby/test.rb
new file mode 100644 (file)
index 0000000..672d2af
--- /dev/null
@@ -0,0 +1,24 @@
+require 'ffi'
+require 'pp'
+
+jobdesc = File.read "/Users/tamas/quick/arc/arex/simple.jsdl"
+
+args = "-c ARC1:https://localhost:60000/arex -e".split
+args << jobdesc
+
+module ArcClientCLibrary
+  extend FFI::Library
+  ffi_lib "/Users/tamas/work/iface/grid/ws/gp-arc-client-c/build/Debug/libarcclientc.dylib"
+  attach_function :initialize, [], :string
+  attach_function :submit, [:int, :pointer], :pointer
+
+end
+
+argv = FFI::MemoryPointer.new(:pointer, args.size)
+argv.write_array_of_pointer(args.map {|arg| FFI::MemoryPointer.from_string(arg.to_s)})  
+
+p "the version is: " + ArcClientCLibrary.initialize
+
+result = ArcClientCLibrary.submit(args.size, argv)
+
+p "Done."
\ No newline at end of file
diff --git a/src/arc_libs.h b/src/arc_libs.h
new file mode 100644 (file)
index 0000000..3866fca
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ *  arc_libs.h
+ *  arcclientc
+ *
+ *  Created by Tamas Jung on 4/8/10.
+ *  Copyright 2010 Apple. All rights reserved.
+ *
+ */
+#ifndef arclibs_
+#define arclibs_
+
+#include <arc/ArcConfig.h>
+#include <arc/ArcLocation.h>
+#include <arc/DateTime.h>
+#include <arc/FileLock.h>
+#include <arc/IString.h>
+#include <arc/Logger.h>
+#include <arc/OptionParser.h>
+#include <arc/StringConv.h>
+#include <arc/URL.h>
+#include <arc/Utils.h>
+#include <arc/XMLNode.h>
+#include <arc/client/Submitter.h>
+#include <arc/client/TargetGenerator.h>
+#include <arc/client/JobDescription.h>
+#include <arc/UserConfig.h>
+#include <arc/client/Broker.h>
+
+#endif
\ No newline at end of file
index e180fea..e710a9f 100644 (file)
@@ -3,23 +3,29 @@
  *  arcclientc
  *
  *  Created by Tamas Jung on 4/7/10.
- *  Copyright 2010 Apple. All rights reserved.
+ *  Copyright 2010 Interface Kft. All rights reserved.
  *
  */
 
 #include <iostream>
 #include "arcclientc.h"
-#include "arcclientcPriv.h"
+#include "logger.h"
+#include "arc_libs.h"
 
-void arcclientc::HelloWorld(const char * s)
-{
-        arcclientcPriv *theObj = new arcclientcPriv;
-        theObj->HelloWorldPriv(s);
-        delete theObj;
-};
 
-void arcclientcPriv::HelloWorldPriv(const char * s) 
-{
-       std::cout << s << std::endl;
-};
+const char* initialize(){
+       
+       setlocale(LC_ALL, "");//TBD: do we need this?
+       logger = new Arc::Logger(Arc::Logger::getRootLogger(), "arcclientc");
+       //TBD:  
+       Arc::LogStream logcerr(std::cerr);//TBD on the stack?
+       logcerr.setFormat(Arc::ShortFormat);
+       Arc::Logger::getRootLogger().addDestination(logcerr);
+       Arc::Logger::getRootLogger().setThreshold(Arc::WARNING);//TODO: read threshold from env
+       
+       Arc::ArcLocation::Init("");//set ARC_LOCATION !!!!!!
+       
+       return ARCCLIENTC_VERSION;
+}
+
 
index c3fdb09..00e405c 100644 (file)
 #ifndef arcclientc_
 #define arcclientc_
 
-/* The classes below are exported */
+#define ARCCLIENTC_VERSION "0.1"
+#include "submit.h"
+/* Things below are exported */
 #pragma GCC visibility push(default)
+extern "C" {
 
-class arcclientc
-{
-       public:
-               void HelloWorld(const char *);
-};
+
+const char* initialize();
+       
+}
 
 #pragma GCC visibility pop
 #endif
diff --git a/src/common_utils.cpp b/src/common_utils.cpp
new file mode 100644 (file)
index 0000000..4e010b2
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ *  common_utils.cpp
+ *  arcclientc
+ *
+ *  Created by Tamas Jung on 4/8/10.
+ *  Copyright 2010 Apple. All rights reserved.
+ *
+ */
+
+#include "common_utils.h"
+
+char* new_str(const char* str){
+       if (!str) {
+               return NULL;
+       }
+       int length = strlen(str);
+       char* result = (char*)malloc(length + 1);
+       strcpy(result, str);
+       return result;
+       
+}
+
+char* ostringstream2cstring(std::ostringstream& ostr){
+       char* cstr;
+       std::string str = ostr.str();
+       cstr = new_str(str.c_str());
+       return cstr;
+}
+
+
+
+
diff --git a/src/common_utils.h b/src/common_utils.h
new file mode 100644 (file)
index 0000000..0e187b7
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ *  common_utils.h
+ *  arcclientc
+ *
+ *  Created by Tamas Jung on 4/8/10.
+ *  Copyright 2010 Apple. All rights reserved.
+ *
+ */
+#ifndef common_utils_
+#define common_utils_
+
+#include <sstream>
+char* ostringstream2cstring(std::ostringstream& string);       
+char* new_str(const char* str);
+
+#endif
\ No newline at end of file
diff --git a/src/config.h b/src/config.h
new file mode 100644 (file)
index 0000000..d5d21bf
--- /dev/null
@@ -0,0 +1,553 @@
+/* config.h.  Generated from config.h.in by configure.  */
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to 1 if the `closedir' function returns void instead of `int'. */
+/* #undef CLOSEDIR_VOID */
+
+/* Define to 1 if translation of program messages to the user's native
+ language is requested. */     
+/* #undef ENABLE_NLS */
+
+/* Globus IO version */
+#define GLOBUS_IO_VERSION 0
+
+/* define if gSOAP prepends names of class members with namespace */
+#define GSOAP_ALWAYS_USES_NAMESPACES_FOR_MEMBER_NAMES /**/
+
+/* Define to 1 if you have the `acl' function. */
+/* #undef HAVE_ACL */
+
+/* Define to 1 if you have the `alarm' function. */
+#define HAVE_ALARM 1
+
+/* Define to 1 if you have the <arpa/inet.h> header file. */
+#define HAVE_ARPA_INET_H 1
+
+/* Define to 1 if your system has a working `chown' function. */
+#define HAVE_CHOWN 1
+
+/* define if the Berkeley DB has DbDeadLockException */
+/* #undef HAVE_DBDEADLOCKEXCEPTION */
+
+/* Define to 1 if you have the <db_cxx.h> header file. */
+/* #undef HAVE_DB_CXX_H */
+
+/* Define if the GNU dcgettext() function is already present or preinstalled.
+ */
+/* #undef HAVE_DCGETTEXT */
+
+/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRERROR_R 1
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+ */
+#define HAVE_DIRENT_H 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the `dup2' function. */
+#define HAVE_DUP2 1
+
+/* Define to 1 if you have the <dustat.h> header file. */
+/* #undef HAVE_DUSTAT_H */
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define to 1 if you have the <float.h> header file. */
+#define HAVE_FLOAT_H 1
+
+/* Define to 1 if you have the `floor' function. */
+#define HAVE_FLOOR 1
+
+/* Define to 1 if you have the `fork' function. */
+#define HAVE_FORK 1
+
+/* Define to 1 if you have the `ftruncate' function. */
+#define HAVE_FTRUNCATE 1
+
+/* let's suppose the unix-alike (except solaris) has gethostname method */
+#define HAVE_GETDOMAINNAME /**/
+
+/* Define to 1 if you have the `gethostname' function. */
+#define HAVE_GETHOSTNAME 1
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#define HAVE_GETOPT_H 1
+
+/* Define to 1 if you have the `getopt_long_only' function. */
+#define HAVE_GETOPT_LONG_ONLY 1
+
+/* Define to 1 if you have the `getpid' function. */
+#define HAVE_GETPID 1
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+/* #undef HAVE_GETTEXT */
+
+/* define if giomm is supported in glibmm */
+#define HAVE_GIOMM /**/
+
+/* define if glibmm have support local symbol resolution in shared libraries
+ */
+#define HAVE_GLIBMM_BIND_LOCAL /**/
+
+/* define if glibmm have support for controling state of children processes */
+#define HAVE_GLIBMM_CHILDWATCH /**/
+
+/* define if glibmm have getenv operations */
+#define HAVE_GLIBMM_GETENV /**/
+
+/* define if glibmm has Glib::OptionContext::get_help() */
+#define HAVE_GLIBMM_OPTIONCONTEXT_GET_HELP /**/
+
+/* define if glibmm has Glib::OptionContext::set_summary() */
+#define HAVE_GLIBMM_OPTIONCONTEXT_SET_SUMMARY /**/
+
+/* define if glibmm have setenv operations */
+#define HAVE_GLIBMM_SETENV /**/
+
+/* define if glibmm have unsetenv operations */
+#define HAVE_GLIBMM_UNSETENV /**/
+
+/* Define to 1 if you have the `globus_ftp_client_handleattr_set_gridftp2'
+ function. */
+/* #undef HAVE_GLOBUS_FTP_CLIENT_HANDLEATTR_SET_GRIDFTP2 */
+
+/* define if GLOBUS RLS client package is available */
+/* #undef HAVE_GLOBUS_RLS_CLIENT */
+
+/* Define to 1 if you have the `gmtime_r' function. */
+#define HAVE_GMTIME_R 1
+
+/* Define if you have the iconv() function. */
+#define HAVE_ICONV 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the `lchown' function. */
+#define HAVE_LCHOWN 1
+
+/* Define if you have ldap_initialize function */
+#define HAVE_LDAP_INITIALIZE /**/
+
+/* Define to 1 if you have the `lfc' library (-llfc). */
+/* #undef HAVE_LIBLFC */
+
+/* Define to 1 if you have the `nsl' library (-lnsl). */
+/* #undef HAVE_LIBNSL */
+
+/* Define to 1 if you have the `z' library (-lz). */
+#define HAVE_LIBZ 1
+
+/* Define to 1 if you have the <limits.h> header file. */
+#define HAVE_LIMITS_H 1
+
+/* Define to 1 if you have the `localtime_r' function. */
+#define HAVE_LOCALTIME_R 1
+
+/* Define to 1 if `lstat' has the bug that it succeeds when given the
+ zero-length file name argument. */
+/* #undef HAVE_LSTAT_EMPTY_STRING_BUG */
+
+/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
+ to 0 otherwise. */
+#define HAVE_MALLOC 1
+
+/* Define to 1 if you have the `memchr' function. */
+#define HAVE_MEMCHR 1
+
+/* Define to 1 if you have the `memmove' function. */
+#define HAVE_MEMMOVE 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the `memset' function. */
+#define HAVE_MEMSET 1
+
+/* Define to 1 if you have the `mkdir' function. */
+#define HAVE_MKDIR 1
+
+/* Define to 1 if you have the `mkfifo' function. */
+#define HAVE_MKFIFO 1
+
+/* define if the compiler implements namespaces */
+#define HAVE_NAMESPACES /**/
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+/* #undef HAVE_NDIR_H */
+
+/* Define to 1 if you have the <netdb.h> header file. */
+#define HAVE_NETDB_H 1
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#define HAVE_NETINET_IN_H 1
+
+/* define if OPENSSL has old RSA generation interface */
+/* #undef HAVE_OPENSSL_OLDRSA */
+
+/* define if OPENSSL has PROXY capabilities */
+#define HAVE_OPENSSL_PROXY /**/
+
+/* define if OPENSSL has X509_VERIFY_PARAM structure */
+#define HAVE_OPENSSL_X509_VERIFY_PARAM /**/
+
+/* Define to 1 if the system has the type `ptrdiff_t'. */
+#define HAVE_PTRDIFF_T 1
+
+/* Define if you have Py_InitializeEx function */
+#define HAVE_PYTHON_INITIALIZE_EX /**/
+
+/* Define to 1 if your system has a GNU libc compatible `realloc' function,
+ and to 0 otherwise. */
+#define HAVE_REALLOC 1
+
+/* Define to 1 if you have the `regcomp' function. */
+#define HAVE_REGCOMP 1
+
+/* Define to 1 if you have the `rmdir' function. */
+#define HAVE_RMDIR 1
+
+/* Define to 1 if you have the <sasl.h> header file. */
+/* #undef HAVE_SASL_H */
+
+/* Define to 1 if you have the <sasl/sasl.h> header file. */
+#define HAVE_SASL_SASL_H 1
+
+/* Define to 1 if you have the `select' function. */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the `setenv' function. */
+#define HAVE_SETENV 1
+
+/* Define to 1 if you have the `socket' function. */
+#define HAVE_SOCKET 1
+
+/* define if the compiler has stringstream */
+#define HAVE_SSTREAM /**/
+
+/* Define to 1 if `stat' has the bug that it succeeds when given the
+ zero-length file name argument. */
+/* #undef HAVE_STAT_EMPTY_STRING_BUG */
+
+/* Define to 1 if stdbool.h conforms to C99. */
+#define HAVE_STDBOOL_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#define HAVE_STRCASECMP 1
+
+/* Define to 1 if you have the `strchr' function. */
+#define HAVE_STRCHR 1
+
+/* Define to 1 if you have the `strcspn' function. */
+#define HAVE_STRCSPN 1
+
+/* Define to 1 if you have the `strdup' function. */
+#define HAVE_STRDUP 1
+
+/* Define to 1 if you have the `strerror' function. */
+#define HAVE_STRERROR 1
+
+/* Define to 1 if you have the `strerror_r' function. */
+#define HAVE_STRERROR_R 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the `strncasecmp' function. */
+#define HAVE_STRNCASECMP 1
+
+/* Define to 1 if you have the `strstr' function. */
+#define HAVE_STRSTR 1
+
+/* Define to 1 if you have the `strtol' function. */
+#define HAVE_STRTOL 1
+
+/* Define to 1 if you have the `strtoul' function. */
+#define HAVE_STRTOUL 1
+
+/* Define to 1 if you have the `strtoull' function. */
+#define HAVE_STRTOULL 1
+
+/* Define to 1 if `st_blksize' is a member of `struct stat'. */
+#define HAVE_STRUCT_STAT_ST_BLKSIZE 1
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+ */
+/* #undef HAVE_SYS_DIR_H */
+
+/* Define to 1 if you have the <sys/file.h> header file. */
+#define HAVE_SYS_FILE_H 1
+
+/* Define to 1 if you have the <sys/filsys.h> header file. */
+/* #undef HAVE_SYS_FILSYS_H */
+
+/* Define to 1 if you have the <sys/fs/s5param.h> header file. */
+/* #undef HAVE_SYS_FS_S5PARAM_H */
+
+/* Define to 1 if you have the <sys/fs_types.h> header file. */
+/* #undef HAVE_SYS_FS_TYPES_H */
+
+/* Define to 1 if you have the <sys/mount.h> header file. */
+#define HAVE_SYS_MOUNT_H 1
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+ */
+/* #undef HAVE_SYS_NDIR_H */
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#define HAVE_SYS_PARAM_H 1
+
+/* Define to 1 if you have the <sys/select.h> header file. */
+#define HAVE_SYS_SELECT_H 1
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#define HAVE_SYS_SOCKET_H 1
+
+/* Define to 1 if you have the <sys/statfs.h> header file. */
+/* #undef HAVE_SYS_STATFS_H */
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <sys/vfs.h> header file. */
+/* #undef HAVE_SYS_VFS_H */
+
+/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
+#define HAVE_SYS_WAIT_H 1
+
+/* Define to 1 if you have the `timegm' function. */
+#define HAVE_TIMEGM 1
+
+/* Define to 1 if you have the `tzset' function. */
+#define HAVE_TZSET 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the `unsetenv' function. */
+#define HAVE_UNSETENV 1
+
+/* Define to 1 if you have the <uuid/uuid.h> header file. */
+#define HAVE_UUID_UUID_H 1
+
+/* Define to 1 if you have the `vfork' function. */
+#define HAVE_VFORK 1
+
+/* Define to 1 if you have the <vfork.h> header file. */
+/* #undef HAVE_VFORK_H */
+
+/* Define to 1 if `fork' works. */
+#define HAVE_WORKING_FORK 1
+
+/* Define to 1 if `vfork' works. */
+#define HAVE_WORKING_VFORK 1
+
+/* define if XMLSEC package is available */
+#define HAVE_XMLSEC /**/
+
+/* Define to 1 if the system has the type `_Bool'. */
+#define HAVE__BOOL 1
+
+/* installation prefix */
+#define INSTPREFIX "/Users/tamas/my_arc"
+
+/* library installation subdirectory */
+#define LIBSUBDIR "lib"
+
+/* Define to 1 if `lstat' dereferences a symlink specified with a trailing
+ slash. */
+/* #undef LSTAT_FOLLOWS_SLASHED_SYMLINK */
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+ */
+#define LT_OBJDIR ".libs/"
+
+/* Name of package */
+#define PACKAGE "arc"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "http://bugzilla.nordugrid.org/"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "arc"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "arc 1.1.0rc5~"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "arc"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "1.1.0rc5~"
+
+/* arc data dir */
+#define PKGDATADIR "/Users/tamas/my_arc/share/arc"
+
+/* package data subdirectory */
+#define PKGDATASUBDIR "share/arc"
+
+/* helper programs installation subdirectory */
+#define PKGLIBEXECSUBDIR "libexec/arc"
+
+/* plugin installation subdirectory */
+#define PKGLIBSUBDIR "lib/arc"
+
+/* arc system configuration directory */
+#define PKGSYSCONFDIR "/Users/tamas/my_arc/etc/arc"
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#define RETSIGTYPE void
+
+/* Define to the type of arg 1 for `select'. */
+#define SELECT_TYPE_ARG1 int
+
+/* Define to the type of args 2, 3 and 4 for `select'. */
+#define SELECT_TYPE_ARG234 (fd_set *)
+
+/* Define to the type of arg 5 for `select'. */
+#define SELECT_TYPE_ARG5 (struct timeval *)
+
+/* Define if the block counts reported by statfs may be truncated to 2GB and
+ the correct values may be stored in the f_spare array. (SunOS 4.1.2, 4.1.3,
+ and 4.1.3_U1 are reported to have this problem. SunOS 4.1.1 seems not to be
+ affected.) */
+/* #undef STATFS_TRUNCATES_BLOCK_COUNTS */
+
+/* Define if there is no specific function for reading file systems usage
+ information and you have the <sys/filsys.h> header file. (SVR2) */
+/* #undef STAT_READ_FILSYS */
+
+/* Define if statfs takes 2 args and struct statfs has a field named f_bsize.
+ (4.3BSD, SunOS 4, HP-UX, AIX PS/2) */
+/* #undef STAT_STATFS2_BSIZE */
+
+/* Define if statfs takes 2 args and struct statfs has a field named f_fsize.
+ (4.4BSD, NetBSD) */
+/* #undef STAT_STATFS2_FSIZE */
+
+/* Define if statfs takes 2 args and the second argument has type struct
+ fs_data. (Ultrix) */
+/* #undef STAT_STATFS2_FS_DATA */
+
+/* Define if statfs takes 3 args. (DEC Alpha running OSF/1) */
+/* #undef STAT_STATFS3_OSF1 */
+
+/* Define if statfs takes 4 args. (SVR3, Dynix, Irix, Dolphin) */
+/* #undef STAT_STATFS4 */
+
+/* Define if there is a function named statvfs. (SVR4) */
+#define STAT_STATVFS 1
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to 1 if strerror_r returns char *. */
+/* #undef STRERROR_R_CHAR_P */
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#define TIME_WITH_SYS_TIME 1
+
+/* Define to 1 if your <sys/time.h> declares `struct tm'. */
+/* #undef TM_IN_SYS_TIME */
+
+/* Enable extensions on AIX 3, Interix.  */
+#ifndef _ALL_SOURCE
+# define _ALL_SOURCE 1
+#endif
+/* Enable GNU extensions on systems that have them.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+/* Enable threading extensions on Solaris.  */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# define _POSIX_PTHREAD_SEMANTICS 1
+#endif
+/* Enable extensions on HP NonStop.  */
+#ifndef _TANDEM_SOURCE
+# define _TANDEM_SOURCE 1
+#endif
+/* Enable general extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+# define __EXTENSIONS__ 1
+#endif
+
+
+/* Define if using WIN32 LDAP API */
+/* #undef USE_WIN32_LDAP_API */
+
+/* Version number of package */
+#define VERSION "1.1.0rc5~"
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+/* Define to 1 if on MINIX. */
+/* #undef _MINIX */
+
+/* Define to 2 if the system does not provide POSIX.1 features except with
+ this defined. */
+/* #undef _POSIX_1_SOURCE */
+
+/* Define to 1 if you need to in order for `stat' and other things to work. */
+/* #undef _POSIX_SOURCE */
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define to `int' if <sys/types.h> doesn't define. */
+/* #undef gid_t */
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+/* #undef inline */
+#endif
+
+/* Define to rpl_malloc if the replacement function should be used. */
+/* #undef malloc */
+
+/* Define to `int' if <sys/types.h> does not define. */
+/* #undef mode_t */
+
+/* Define to `long int' if <sys/types.h> does not define. */
+/* #undef off_t */
+
+/* Define to `int' if <sys/types.h> does not define. */
+/* #undef pid_t */
+
+/* Define to rpl_realloc if the replacement function should be used. */
+/* #undef realloc */
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* #undef size_t */
+
+/* Define to `int' if <sys/types.h> doesn't define. */
+/* #undef uid_t */
+
+/* Define as `fork' if `vfork' does not work. */
+/* #undef vfork */
diff --git a/src/logger.h b/src/logger.h
new file mode 100644 (file)
index 0000000..b4f5533
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ *  logger.h
+ *  arcclientc
+ *
+ *  Created by Tamas Jung on 4/8/10.
+ *  Copyright 2010 Apple. All rights reserved.
+ *
+ */
+
+#ifndef logger_
+#define logger_
+
+#include "arc_libs.h"
+static Arc::Logger* logger; 
+
+#endif
+
+
diff --git a/src/prefix_header.h b/src/prefix_header.h
new file mode 100644 (file)
index 0000000..ee574e4
--- /dev/null
@@ -0,0 +1,9 @@
+/*
+ *  prefix_header.h
+ *  arcclientc
+ *
+ *  Created by Tamas Jung on 4/8/10.
+ *  Copyright 2010 Apple. All rights reserved.
+ *
+ */
+
index 7dda03a..d7337bb 100644 (file)
@@ -8,6 +8,9 @@
  */
 
 #include "submit.h"
+#include "common_utils.h"
+#include "logger.h"
+#include "config.h"
 // -*- indent-tabs-mode: nil -*-
 
 #ifdef HAVE_CONFIG_H
 #include <sys/stat.h>
 #include <unistd.h>
 
-#include <arc/ArcConfig.h>
-#include <arc/ArcLocation.h>
-#include <arc/DateTime.h>
-#include <arc/FileLock.h>
-#include <arc/IString.h>
-#include <arc/Logger.h>
-#include <arc/OptionParser.h>
-#include <arc/StringConv.h>
-#include <arc/URL.h>
-#include <arc/Utils.h>
-#include <arc/XMLNode.h>
-#include <arc/client/Submitter.h>
-#include <arc/client/TargetGenerator.h>
-#include <arc/client/JobDescription.h>
-#include <arc/UserConfig.h>
-#include <arc/client/Broker.h>
+#include "arc_libs.h"
+#pragma GCC visibility push(default)
+extern "C" {
+submit_result_t* submit(int argc, char **argv) {
+       
+       submit_result_t* result = (submit_result_t*)malloc(sizeof(submit_result_t));
+       if (!result) {
+               return NULL;//TBD: throw sth?
+       }
+       result->message = NULL;
+       result->job_id = NULL;
 
-int main(int argc, char **argv) {
-       
-       setlocale(LC_ALL, "");
-       
-       Arc::Logger logger(Arc::Logger::getRootLogger(), "arcsub");
-       Arc::LogStream logcerr(std::cerr);
-       logcerr.setFormat(Arc::ShortFormat);
-       Arc::Logger::getRootLogger().addDestination(logcerr);
-       Arc::Logger::getRootLogger().setThreshold(Arc::WARNING);
-       
-       Arc::ArcLocation::Init(argv[0]);
-       
+       //TODO: what necessary here?
        Arc::OptionParser options(istring("[filename ...]"),
                                                          istring("The arcsub command is used for "
                                                                          "submitting jobs to grid enabled "
@@ -80,38 +67,21 @@ int main(int argc, char **argv) {
                                          istring("[-]name"),
                                          indexurls);
        
-       std::list<std::string> jobdescriptionstrings;
+       std::string jobdescriptionstring;
        options.AddOption('e', "jobdescrstring",
                                          istring("jobdescription string describing the job to "
                                                          "be submitted"),
                                          istring("string"),
-                                         jobdescriptionstrings);
+                                         jobdescriptionstring);
        
-       std::list<std::string> jobdescriptionfiles;
-       options.AddOption('f', "jobdescrfile",
-                                         istring("jobdescription file describing the job to "
-                                                         "be submitted"),
-                                         istring("string"),
-                                         jobdescriptionfiles);
+
        
-       std::string joblist;
-       options.AddOption('j', "joblist",
-                                         istring("file where the jobs will be stored"),
-                                         istring("filename"),
-                                         joblist);
        
-       /*
+       //jt: dryrun was commented out in the original file, I try to use it TODO:
      bool dryrun = false;
      options.AddOption('D', "dryrun", istring("add dryrun option"),
         dryrun);
         
-        */
-       bool dumpdescription = false;
-       options.AddOption('x', "dumpdescription",
-                                         istring("do not submit - dump job description "
-                                                         "in the language accepted by the target"),
-                                         dumpdescription);
-       
        int timeout = -1;
        options.AddOption('t', "timeout", istring("timeout in seconds (default 20)"),
                                          istring("seconds"), timeout);
@@ -120,56 +90,30 @@ int main(int argc, char **argv) {
        options.AddOption('z', "conffile",
                                          istring("configuration file (default ~/.arc/client.conf)"),
                                          istring("filename"), conffile);
-       
-       std::string debug;
-       options.AddOption('d', "debug",
-                                         istring("FATAL, ERROR, WARNING, INFO, VERBOSE or DEBUG"),
-                                         istring("debuglevel"), debug);
-       
+               
        std::string broker;
        options.AddOption('b', "broker",
                                          istring("select broker method (Random (default), FastestQueue, or custom)"),
                                          istring("broker"), broker);
        
-       /**
-        * Sandboxing is always done atm. Maybe there should be a switch to turn it off? 'n' "nolocalsandbox"
-        bool dolocalsandbox = true;
-        options.AddOption('n', "dolocalsandbox",
-        istring("store job descriptions in local sandbox."),
-        dolocalsandbox);
-        */
-       
-       bool version = false;
-       options.AddOption('v', "version", istring("print version information"),
-                                         version);
        
        std::list<std::string> params = options.Parse(argc, argv);
        
-       // If debug is specified as argument, it should be set before loading the configuration.
-       if (!debug.empty())
-               Arc::Logger::getRootLogger().setThreshold(Arc::string_to_level(debug));
-       
-       Arc::UserConfig usercfg(conffile, joblist);
+       std::cout << "conffile:";
+       std::cout << conffile.size();//TODO: clean
+       Arc::UserConfig usercfg(conffile);
        if (!usercfg) {
-               logger.msg(Arc::ERROR, "Failed configuration initialization");
-               return 1;
+               result->message = new_str("Failed configuration initialization");
+               return result;
        }
        
-       if (debug.empty() && !usercfg.Verbosity().empty())
-               Arc::Logger::getRootLogger().setThreshold(Arc::string_to_level(usercfg.Verbosity()));
        
        if (timeout > 0)
                usercfg.Timeout(timeout);
        
        if (!broker.empty())
                usercfg.Broker(broker);
-       
-       if (version) {
-               std::cout << Arc::IString("%s version %s", "arcsub", VERSION)
-               << std::endl;
-               return 0;
-       }
-       
+               
        if (!clusters.empty() || !indexurls.empty())
                usercfg.ClearSelectedServices();
        
@@ -179,167 +123,79 @@ int main(int argc, char **argv) {
        if (!indexurls.empty())
                usercfg.AddServices(indexurls, Arc::INDEX);
        
-       jobdescriptionfiles.insert(jobdescriptionfiles.end(),
-                                                          params.begin(), params.end());
-       
-       if (jobdescriptionfiles.empty() && jobdescriptionstrings.empty()) {
-               logger.msg(Arc::ERROR, "No job description input specified");
-               return 1;
+       if (jobdescriptionstring.empty()) {
+               result->message = new_str("No job description input specified");
+               return result;
        }
        
-       std::list<Arc::JobDescription> jobdescriptionlist;
        
-       //Loop over input job description files
-       for (std::list<std::string>::iterator it = jobdescriptionfiles.begin();
-                it != jobdescriptionfiles.end(); it++) {
-               
-               std::ifstream descriptionfile(it->c_str());
-               
-               if (!descriptionfile) {
-                       logger.msg(Arc::ERROR, "Can not open job description file: %s", *it);
-                       return 1;
-               }
-               
-               descriptionfile.seekg(0, std::ios::end);
-               std::streamsize length = descriptionfile.tellg();
-               descriptionfile.seekg(0, std::ios::beg);
-               
-               char *buffer = new char[length + 1];
-               descriptionfile.read(buffer, length);
-               descriptionfile.close();
-               
-               buffer[length] = '\0';
-               Arc::JobDescription jobdesc;
-               jobdesc.Parse((std::string)buffer);
+
                
-               if (jobdesc)
-                       jobdescriptionlist.push_back(jobdesc);
-               else {
-                       logger.msg(Arc::ERROR, "Invalid JobDescription:");
-                       std::cout << buffer << std::endl;
-                       delete[] buffer;
-                       return 1;
-               }
-               delete[] buffer;
-       }
+       Arc::JobDescription jobdesc;
        
-       //Loop over job description input strings
-       for (std::list<std::string>::iterator it = jobdescriptionstrings.begin();
-                it != jobdescriptionstrings.end(); it++) {
-               
-               Arc::JobDescription jobdesc;
-               
-               jobdesc.Parse(*it);
-               
-               if (jobdesc)
-                       jobdescriptionlist.push_back(jobdesc);
-               else {
-                       logger.msg(Arc::ERROR, "Invalid JobDescription:");
-                       std::cout << *it << std::endl;
-                       return 1;
-               }
+       jobdesc.Parse(jobdescriptionstring);
+       
+       if (!jobdesc){
+               std::ostringstream sstr;
+               sstr << "Invalid JobDescription:";
+               sstr << jobdescriptionstring;
+               result->message = ostringstream2cstring(sstr);
+               return result;
        }
        
        Arc::TargetGenerator targen(usercfg);
        targen.GetTargets(0, 1);
        
        if (targen.FoundTargets().empty()) {
-               std::cout << Arc::IString("Job submission aborted because no clusters returned any information") << std::endl;
-               return 1;
+               
+               result->message = new_str("Job submission aborted because no clusters returned any information");
+               return result;
        }
        
-       std::map<int, std::string> notsubmitted;
        
-       int jobnr = 1;
-       std::list<std::string> jobids;
        
        Arc::BrokerLoader loader;
        Arc::Broker *ChosenBroker = loader.load(usercfg.Broker().first, usercfg);
        if (!ChosenBroker) {
-               logger.msg(Arc::ERROR, "Unable to load broker %s", usercfg.Broker().first);
-               return 1;
+               std::ostringstream sstream;
+               sstream << "Unable to load broker " << usercfg.Broker().first;
+               result->message = ostringstream2cstring(sstream);
+               return result;
        }
-       logger.msg(Arc::INFO, "Broker %s loaded", usercfg.Broker().first);
+       logger->msg(Arc::INFO, "Broker %s loaded", usercfg.Broker().first);
        
-       for (std::list<Arc::JobDescription>::iterator it =
-         jobdescriptionlist.begin(); it != jobdescriptionlist.end();
-                it++, jobnr++) {
                
-               ChosenBroker->PreFilterTargets(targen.ModifyFoundTargets(), *it);
+       ChosenBroker->PreFilterTargets(targen.ModifyFoundTargets(), jobdesc);
+       
+       while (true) {
+               const Arc::ExecutionTarget* target = ChosenBroker->GetBestTarget();
                
-               while (true) {
-                       const Arc::ExecutionTarget* target = ChosenBroker->GetBestTarget();
-                       
-                       if (!target) {
-                               if (dumpdescription) {
-                                       std::cout << Arc::IString("Unable to print job description: No target found.") << std::endl;
-                                       return 1;
-                               }
-                               std::cout << Arc::IString("Job submission failed, no more possible targets") << std::endl;
-                               break;
-                       }
-                       
-                       Arc::Submitter *submitter = target->GetSubmitter(usercfg);
-                       
-                       if (dumpdescription) {
-                               Arc::JobDescription jobdescdump(*it);
-                               if (!submitter->ModifyJobDescription(jobdescdump, *target)) {
-                                       std::cout << "Unable to modify job description according to needs for target cluster." << std::endl;
-                                       return 1;
-                               }
-                               
-                               std::string jobdesclang = "ARCJSDL";
-                               if (target->GridFlavour == "ARC0")
-                                       jobdesclang = "XRSL";
-                               else if (target->GridFlavour == "CREAM")
-                                       jobdesclang = "JDL";
-                               const std::string jobdesc = jobdescdump.UnParse(jobdesclang);
-                               if (jobdesc.empty()) {
-                                       std::cout << Arc::IString("An error occurred during the generation of the job description output.") << std::endl;
-                                       return 1;
-                               }
+               if (!target) {
+                       result->message = new_str("Job submission failed, no more possible targets");
+                       break;
+               }
+               
+               Arc::Submitter *submitter = target->GetSubmitter(usercfg);
                                
-                               std::cout << Arc::IString("Job description to be send to ") << target->Cluster.str() << ":" << std::endl;
-                               std::cout << jobdesc << std::endl;
-                               return 0;
-                       }
-                       
-                       
-                       //submit the job
-                       Arc::URL jobid = submitter->Submit(*it, *target);
-                       if (!jobid) {
-                               std::cout << Arc::IString("Submission to %s failed, trying next target", target->url.str()) << std::endl;
-                               continue;
-                       }
-                       
-                       ChosenBroker->RegisterJobsubmission();
-                       std::cout << Arc::IString("Job submitted with jobid: %s", jobid.str())
-                       << std::endl;
-                       
+               if (dryrun) {
+                       result->message = new_str("Dry run, job submission is skipped");
                        break;
-               } //end loop over all possible targets
-       } //end loop over all job descriptions
-       
-       if (jobdescriptionlist.size() > 1) {
-               std::cout << std::endl << Arc::IString("Job submission summary:")
-               << std::endl;
-               std::cout << "-----------------------" << std::endl;
-               std::cout << Arc::IString("%d of %d jobs were submitted",
-                                                                 jobdescriptionlist.size() - notsubmitted.size(),
-                                                                 jobdescriptionlist.size()) << std::endl;
-               if (notsubmitted.size())
-                       std::cout << Arc::IString("The following %d were not submitted",
-                                                                         notsubmitted.size()) << std::endl;
-               /*
-                std::map<int, std::string>::iterator it;
-                for (it = notsubmitted.begin(); it != notsubmitted.end(); it++) {
-                std::cout << _("Job nr.") << " " << it->first;
-                if (it->second.size()>0) std::cout << ": " << it->second;
-                std::cout << std::endl;
-                }
-                */
-       }
+               }
+               //submit the job
+               Arc::URL jobid = submitter->Submit(jobdesc, *target);
+               if (!jobid) {
+                       logger->msg(Arc::INFO, "Submission to %s failed, trying next target", target->url.str());
+                       continue;
+               }
+               
+               ChosenBroker->RegisterJobsubmission();
+               result->job_id = new_str(jobid.str().c_str());
+               logger->msg(Arc::DEBUG, "Job submitted with jobid: %s", jobid.str());
+               
+               break;
+       } //end loop over all possible targets
        
-       return 0;
+       return result;
+}
 }
 
index a26bb94..987ce44 100644 (file)
@@ -3,7 +3,23 @@
  *  arcclientc
  *
  *  Created by Tamas Jung on 4/7/10.
- *  Copyright 2010 Apple. All rights reserved.
+ *  Copyright 2010 Interface Kft. All rights reserved.
  *
  */
 
+#ifndef submit_
+#define submit_
+
+#pragma GCC visibility push(default)
+extern "C" {
+
+typedef struct{
+       char* message;//might be NULL
+       char* job_id;//might be NULL
+} submit_result_t;
+
+submit_result_t* submit(int argc, char **argv);
+}
+#pragma GCC visibility pop
+#endif
+