From: Bruno Haible Date: Wed, 3 May 2006 11:38:54 +0000 (+0000) Subject: Determine the Java version supported by javaexec. X-Git-Tag: v0.15~201 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4f76264c9161f42cbb1157a20863cb6fbb631a34;p=thirdparty%2Fgettext.git Determine the Java version supported by javaexec. --- diff --git a/gettext-tools/lib/javaversion.c b/gettext-tools/lib/javaversion.c new file mode 100644 index 000000000..a0dea953e --- /dev/null +++ b/gettext-tools/lib/javaversion.c @@ -0,0 +1,119 @@ +/* Determine the Java version supported by javaexec. + Copyright (C) 2006 Free Software Foundation, Inc. + Written by Bruno Haible , 2006. + + 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, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include "javaversion.h" + +#include +#include +#include + +#if ENABLE_RELOCATABLE +# include "relocatable.h" +#else +# define relocate(pathname) (pathname) +#endif + +#include "javaexec.h" +#include "pipe.h" +#include "wait-process.h" +#include "error.h" +#include "getline.h" +#include "gettext.h" + +#define _(str) gettext (str) + + +struct locals +{ + /* OUT */ + char *line; +}; + +static bool +execute_and_read_line (const char *progname, + const char *prog_path, char **prog_argv, + void *private_data) +{ + struct locals *l = (struct locals *) private_data; + pid_t child; + int fd[1]; + FILE *fp; + char *line; + size_t linesize; + size_t linelen; + int exitstatus; + + /* Open a pipe to the JVM. */ + child = create_pipe_in (progname, prog_path, prog_argv, DEV_NULL, false, + true, false, fd); + + if (child == -1) + return false; + + /* Retrieve its result. */ + fp = fdopen (fd[0], "r"); + if (fp == NULL) + { + error (0, errno, _("fdopen() failed")); + return false; + } + + line = NULL; linesize = 0; + linelen = getline (&line, &linesize, fp); + if (linelen == (size_t)(-1)) + { + error (0, 0, _("%s subprocess I/O error"), progname); + return false; + } + if (linelen > 0 && line[linelen - 1] == '\n') + line[linelen - 1] = '\0'; + + fclose (fp); + + /* Remove zombie process from process list, and retrieve exit status. */ + exitstatus = wait_subprocess (child, progname, true, false, true, false); + if (exitstatus != 0) + { + free (line); + return false; + } + + l->line = line; + return false; +} + +char * +javaexec_version (void) +{ + const char *class_name = "javaversion"; + const char *pkgdatadir = relocate (PKGDATADIR); + const char *args[1]; + struct locals locals; + + args[0] = NULL; + locals.line = NULL; + execute_java_class (class_name, &pkgdatadir, 1, true, NULL, args, + false, false, execute_and_read_line, &locals); + + return locals.line; +} diff --git a/gettext-tools/lib/javaversion.h b/gettext-tools/lib/javaversion.h new file mode 100644 index 000000000..803e64690 --- /dev/null +++ b/gettext-tools/lib/javaversion.h @@ -0,0 +1,40 @@ +/* Determine the Java version supported by javaexec. + Copyright (C) 2006 Free Software Foundation, Inc. + Written by Bruno Haible , 2006. + + 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, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _JAVAVERSION_H +#define _JAVAVERSION_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Return information about the Java version used by execute_java_class(). + This is the value of System.getProperty("java.specification.version"). + Some possible values are: 1.1, 1.2, 1.3, 1.4, 1.5, 1.6. Return NULL if + the Java version cannot be determined. */ +extern char * javaexec_version (void); + + +#ifdef __cplusplus +} +#endif + + +#endif /* _JAVAVERSION_H */