guacamole-server-0.9.9/0000775000175100017510000000000012645400336012002 500000000000000guacamole-server-0.9.9/test-driver0000755000175100017510000001027712645400276014130 00000000000000#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2013-07-13.22; # UTC # Copyright (C) 2011-2013 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then estatus=1 fi case $estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: guacamole-server-0.9.9/README0000664000175100017510000001042412612226234012600 00000000000000 ------------------------------------------------------------ About this README ------------------------------------------------------------ This README is intended to provide quick and to-the-point documentation for technical users intending to compile parts of Guacamole themselves. Source archives are available from the files section of the main project page: http://sourceforge.net/projects/guacamole/files/ A full manual is provided on the Guacamole web site: http://guac-dev.org/ ------------------------------------------------------------ What is guacamole-server? ------------------------------------------------------------ The guacamole-server package is a set of software which forms the basis of the Guacamole stack. It consists of guacd, libguac, and several protocol support libraries. guacd is the Guacamole proxy daemon used by the Guacamole web application and framework. As JavaScript cannot handle binary protocols (like VNC and remote desktop) efficiently, a new test-based protocol was developed which would contain a common superset of the operations needed for efficient remote desktop access, but would be easy for JavaScript programs to process. guacd is the proxy which translates between arbitrary protocols and the Guacamole protocol. ------------------------------------------------------------ Compiling and installing guacd, libguac, etc. ------------------------------------------------------------ All software within guacamole-server is built using the popular GNU Automake, and thus provides the standard configure script. Before compiling, you need to have compiled and installed libguac, the core Guacamole library. This is available from the main Guacamole site at http://guac-dev.org/. 1) Run configure $ ./configure Assuming all dependencies have been installed, this should succeed without errors. If you wish to install the init script as well, you need to specify the location where your system init scripts are located (typically /etc/init.d): $ ./configure --with-init-dir=/etc/init.d Running configure in this manner will cause the "make install" step to install an init script to the specified directory, which you can then activate using the service management mechanism provided by your distribution). 2) Run make $ make guacd, libguac, and any available protocol support libraries will now compile. 3) Install (as root) # make install All software that was just built, including documentation, will be installed. guacd will install to your /usr/local/sbin directory by default. You can change the install location by using the --prefix option for configure. ------------------------------------------------------------ Running guacd ------------------------------------------------------------ If you installed the init script during compile and install, you should be able to start guacd through the service management utilities provided by your distribution (if any) or by running the init script directly (as root): # /etc/init.d/guacd start Root access is needed to write the pidfile /var/run/guacd.pid. You can also run guacd itself directly without the init script (as any user): $ guacd guacd currently takes several command-line options: -b HOST Changes the host or address that guacd listens on. -l PORT Changes the port that guacd listens on (the default is port 4822). -p PIDFILE Causes guacd to write the PID of the daemon process to the specified file. This is useful for init scripts and is used by the provided init script. -L LEVEL Sets the maximum level at which guacd will log messages to syslog and, if running in the foreground, the console. Legal values are debug, info, warning, and error. The default value is info. -f Causes guacd to run in the foreground, rather than automatically forking into the background. Additional information can be found in the guacd man page: $ man guacd ------------------------------------------------------------ Reporting problems ------------------------------------------------------------ Please report any bugs encountered by opening a new issue in the JIRA system hosted at: http://glyptodon.org/jira/ guacamole-server-0.9.9/tests/0000775000175100017510000000000012645400336013144 500000000000000guacamole-server-0.9.9/tests/protocol/0000775000175100017510000000000012645400336015005 500000000000000guacamole-server-0.9.9/tests/protocol/suite.c0000664000175100017510000000400012536405625016221 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "suite.h" #include int protocol_suite_init() { return 0; } int protocol_suite_cleanup() { return 0; } int register_protocol_suite() { /* Add protocol test suite */ CU_pSuite suite = CU_add_suite("protocol", protocol_suite_init, protocol_suite_cleanup); if (suite == NULL) { CU_cleanup_registry(); return CU_get_error(); } /* Add tests */ if ( CU_add_test(suite, "base64-decode", test_base64_decode) == NULL || CU_add_test(suite, "instruction-parse", test_instruction_parse) == NULL || CU_add_test(suite, "instruction-read", test_instruction_read) == NULL || CU_add_test(suite, "instruction-write", test_instruction_write) == NULL || CU_add_test(suite, "nest-write", test_nest_write) == NULL ) { CU_cleanup_registry(); return CU_get_error(); } return 0; } guacamole-server-0.9.9/tests/protocol/instruction_read.c0000664000175100017510000000645712643542623020465 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "suite.h" #include #include #include #include #include #include #include #include void test_instruction_read() { int rfd, wfd; int fd[2], childpid; char test_string[] = "4.test,6.a" UTF8_4 "b," "5.12345,10.a" UTF8_8 "c;" "5.test2,10.hellohello,15.worldworldworld;"; /* Create pipe */ CU_ASSERT_EQUAL_FATAL(pipe(fd), 0); /* File descriptors */ rfd = fd[0]; wfd = fd[1]; /* Fork */ if ((childpid = fork()) == -1) { /* ERROR */ perror("fork"); return; } /* Child (pipe writer) */ if (childpid != 0) { close(rfd); CU_ASSERT_EQUAL( write(wfd, test_string, sizeof(test_string)), sizeof(test_string) ); exit(0); } /* Parent (unit test) */ else { guac_socket* socket; guac_instruction* instruction; close(wfd); /* Open guac socket */ socket = guac_socket_open(rfd); CU_ASSERT_PTR_NOT_NULL_FATAL(socket); /* Read instruction */ instruction = guac_instruction_read(socket, 1000000); CU_ASSERT_PTR_NOT_NULL_FATAL(instruction); /* Validate contents */ CU_ASSERT_STRING_EQUAL(instruction->opcode, "test"); CU_ASSERT_EQUAL_FATAL(instruction->argc, 3); CU_ASSERT_STRING_EQUAL(instruction->argv[0], "a" UTF8_4 "b"); CU_ASSERT_STRING_EQUAL(instruction->argv[1], "12345"); CU_ASSERT_STRING_EQUAL(instruction->argv[2], "a" UTF8_8 "c"); /* Read another instruction */ guac_instruction_free(instruction); instruction = guac_instruction_read(socket, 1000000); /* Validate contents */ CU_ASSERT_STRING_EQUAL(instruction->opcode, "test2"); CU_ASSERT_EQUAL_FATAL(instruction->argc, 2); CU_ASSERT_STRING_EQUAL(instruction->argv[0], "hellohello"); CU_ASSERT_STRING_EQUAL(instruction->argv[1], "worldworldworld"); guac_instruction_free(instruction); guac_socket_free(socket); } } guacamole-server-0.9.9/tests/protocol/base64_decode.c0000664000175100017510000000426312536405625017472 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "suite.h" #include #include #include #include #include void test_base64_decode() { /* Test strings */ char test_HELLO[] = "SEVMTE8="; char test_AVOCADO[] = "QVZPQ0FETw=="; char test_GUACAMOLE[] = "R1VBQ0FNT0xF"; /* Invalid strings */ char invalid1[] = "===="; char invalid2[] = ""; /* Test one character of padding */ CU_ASSERT_EQUAL(guac_protocol_decode_base64(test_HELLO), 5); CU_ASSERT_NSTRING_EQUAL(test_HELLO, "HELLO", 5); /* Test two characters of padding */ CU_ASSERT_EQUAL(guac_protocol_decode_base64(test_AVOCADO), 7); CU_ASSERT_NSTRING_EQUAL(test_AVOCADO, "AVOCADO", 7); /* Test three characters of padding */ CU_ASSERT_EQUAL(guac_protocol_decode_base64(test_GUACAMOLE), 9); CU_ASSERT_NSTRING_EQUAL(test_GUACAMOLE, "GUACAMOLE", 9); /* Verify invalid strings stop early as expected */ CU_ASSERT_EQUAL(guac_protocol_decode_base64(invalid1), 0); CU_ASSERT_EQUAL(guac_protocol_decode_base64(invalid2), 0); } guacamole-server-0.9.9/tests/protocol/nest_write.c0000664000175100017510000000575312643542623017272 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "suite.h" #include #include #include #include #include #include #include #include void test_nest_write() { int rfd, wfd; int fd[2], childpid; /* Create pipe */ CU_ASSERT_EQUAL_FATAL(pipe(fd), 0); /* File descriptors */ rfd = fd[0]; wfd = fd[1]; /* Fork */ if ((childpid = fork()) == -1) { /* ERROR */ perror("fork"); return; } /* Child (pipe writer) */ if (childpid != 0) { guac_socket* nested_socket; guac_socket* socket; close(rfd); /* Open guac socket */ socket = guac_socket_open(wfd); /* Nest socket */ nested_socket = guac_socket_nest(socket, 0); /* Write instruction */ guac_protocol_send_name(nested_socket, "a" UTF8_4 "b" UTF8_4 "c"); guac_protocol_send_sync(nested_socket, 12345); guac_socket_flush(nested_socket); guac_socket_flush(socket); guac_socket_free(nested_socket); guac_socket_free(socket); exit(0); } /* Parent (unit test) */ else { char expected[] = "4.nest,1.0,37." "4.name,11.a" UTF8_4 "b" UTF8_4 "c;" "4.sync,5.12345;" ";"; int numread; char buffer[1024]; int offset = 0; close(wfd); /* Read everything available into buffer */ while ((numread = read(rfd, &(buffer[offset]), sizeof(buffer)-offset)) != 0) { offset += numread; } /* Add NULL terminator */ buffer[offset] = '\0'; /* Read value should be equal to expected value */ CU_ASSERT_STRING_EQUAL(buffer, expected); } } guacamole-server-0.9.9/tests/protocol/instruction_write.c0000664000175100017510000000535012643542623020673 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "suite.h" #include #include #include #include #include #include #include #include void test_instruction_write() { int rfd, wfd; int fd[2], childpid; /* Create pipe */ CU_ASSERT_EQUAL_FATAL(pipe(fd), 0); /* File descriptors */ rfd = fd[0]; wfd = fd[1]; /* Fork */ if ((childpid = fork()) == -1) { /* ERROR */ perror("fork"); return; } /* Child (pipe writer) */ if (childpid != 0) { guac_socket* socket; close(rfd); /* Open guac socket */ socket = guac_socket_open(wfd); /* Write instruction */ guac_protocol_send_name(socket, "a" UTF8_4 "b" UTF8_4 "c"); guac_protocol_send_sync(socket, 12345); guac_socket_flush(socket); guac_socket_free(socket); exit(0); } /* Parent (unit test) */ else { char expected[] = "4.name,11.a" UTF8_4 "b" UTF8_4 "c;" "4.sync,5.12345;"; int numread; char buffer[1024]; int offset = 0; close(wfd); /* Read everything available into buffer */ while ((numread = read(rfd, &(buffer[offset]), sizeof(buffer)-offset)) != 0) { offset += numread; } /* Add NULL terminator */ buffer[offset] = '\0'; /* Read value should be equal to expected value */ CU_ASSERT_STRING_EQUAL(buffer, expected); } } guacamole-server-0.9.9/tests/protocol/instruction_parse.c0000664000175100017510000000541612643542623020656 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "suite.h" #include #include #include #include #include void test_instruction_parse() { /* Allocate instruction space */ guac_instruction* instruction = guac_instruction_alloc(); CU_ASSERT_PTR_NOT_NULL_FATAL(instruction); /* Instruction input */ char buffer[] = "4.test,8.testdata,5.zxcvb,13.guacamoletest;XXXXXXXXXXXXXXXXXX"; char* current = buffer; /* While data remains */ int remaining = sizeof(buffer)-1; while (remaining > 18) { /* Parse more data */ int parsed = guac_instruction_append(instruction, current, remaining); if (parsed == 0) break; current += parsed; remaining -= parsed; } CU_ASSERT_EQUAL(remaining, 18); CU_ASSERT_EQUAL(instruction->state, GUAC_INSTRUCTION_PARSE_COMPLETE); /* Parse is complete - no more data should be read */ CU_ASSERT_EQUAL(guac_instruction_append(instruction, current, 18), 0); CU_ASSERT_EQUAL(instruction->state, GUAC_INSTRUCTION_PARSE_COMPLETE); /* Validate resulting structure */ CU_ASSERT_EQUAL(instruction->argc, 3); CU_ASSERT_PTR_NOT_NULL_FATAL(instruction->opcode); CU_ASSERT_PTR_NOT_NULL_FATAL(instruction->argv[0]); CU_ASSERT_PTR_NOT_NULL_FATAL(instruction->argv[1]); CU_ASSERT_PTR_NOT_NULL_FATAL(instruction->argv[2]); /* Validate resulting content */ CU_ASSERT_STRING_EQUAL(instruction->opcode, "test"); CU_ASSERT_STRING_EQUAL(instruction->argv[0], "testdata"); CU_ASSERT_STRING_EQUAL(instruction->argv[1], "zxcvb"); CU_ASSERT_STRING_EQUAL(instruction->argv[2], "guacamoletest"); } guacamole-server-0.9.9/tests/protocol/suite.h0000664000175100017510000000332612536405625016240 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_TEST_PROTOCOL_SUITE_H #define _GUAC_TEST_PROTOCOL_SUITE_H #include "config.h" /* Unicode (UTF-8) strings */ #define UTF8_1 "\xe7\x8a\xac" /* One character */ #define UTF8_2 UTF8_1 "\xf0\x90\xac\x80" /* Two characters */ #define UTF8_3 UTF8_2 "z" /* Three characters */ #define UTF8_4 UTF8_3 "\xc3\xa1" /* Four characters */ #define UTF8_8 UTF8_4 UTF8_4 /* Eight characters */ int register_protocol_suite(); void test_base64_decode(); void test_instruction_parse(); void test_instruction_read(); void test_instruction_write(); void test_nest_write(); #endif guacamole-server-0.9.9/tests/Makefile.in0000664000175100017510000022671612645400276015152 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Copyright (C) 2015 Glyptodon LLC # # 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. # VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ TESTS = test_libguac$(EXEEXT) check_PROGRAMS = test_libguac$(EXEEXT) subdir = tests DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) \ $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__dirstamp = $(am__leading_dot)dirstamp am_test_libguac_OBJECTS = test_libguac-test_libguac.$(OBJEXT) \ client/test_libguac-client_suite.$(OBJEXT) \ client/test_libguac-buffer_pool.$(OBJEXT) \ client/test_libguac-layer_pool.$(OBJEXT) \ common/test_libguac-common_suite.$(OBJEXT) \ common/test_libguac-guac_iconv.$(OBJEXT) \ common/test_libguac-guac_string.$(OBJEXT) \ common/test_libguac-guac_rect.$(OBJEXT) \ protocol/test_libguac-suite.$(OBJEXT) \ protocol/test_libguac-base64_decode.$(OBJEXT) \ protocol/test_libguac-instruction_parse.$(OBJEXT) \ protocol/test_libguac-instruction_read.$(OBJEXT) \ protocol/test_libguac-instruction_write.$(OBJEXT) \ protocol/test_libguac-nest_write.$(OBJEXT) \ util/test_libguac-util_suite.$(OBJEXT) \ util/test_libguac-guac_pool.$(OBJEXT) \ util/test_libguac-guac_unicode.$(OBJEXT) test_libguac_OBJECTS = $(am_test_libguac_OBJECTS) test_libguac_DEPENDENCIES = AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = test_libguac_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test_libguac_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(test_libguac_SOURCES) DIST_SOURCES = $(test_libguac_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COMMON_INCLUDE = @COMMON_INCLUDE@ COMMON_LTLIB = @COMMON_LTLIB@ COMMON_SSH_INCLUDE = @COMMON_SSH_INCLUDE@ COMMON_SSH_LTLIB = @COMMON_SSH_LTLIB@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CUNIT_LIBS = @CUNIT_LIBS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBADD_DLOPEN = @LIBADD_DLOPEN@ LIBGUAC_INCLUDE = @LIBGUAC_INCLUDE@ LIBGUAC_LTLIB = @LIBGUAC_LTLIB@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MATH_LIBS = @MATH_LIBS@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@ PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@ PANGO_CFLAGS = @PANGO_CFLAGS@ PANGO_LIBS = @PANGO_LIBS@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_LIBS = @PNG_LIBS@ PTHREAD_LIBS = @PTHREAD_LIBS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ RDP_LIBS = @RDP_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSH_LIBS = @SSH_LIBS@ SSL_LIBS = @SSL_LIBS@ STRIP = @STRIP@ TELNET_LIBS = @TELNET_LIBS@ TERMINAL_INCLUDE = @TERMINAL_INCLUDE@ TERMINAL_LTLIB = @TERMINAL_LTLIB@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VNC_LIBS = @VNC_LIBS@ VORBIS_LIBS = @VORBIS_LIBS@ WEBP_LIBS = @WEBP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ init_dir = @init_dir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 noinst_HEADERS = \ client/client_suite.h \ common/common_suite.h \ protocol/suite.h \ util/util_suite.h test_libguac_SOURCES = \ test_libguac.c \ client/client_suite.c \ client/buffer_pool.c \ client/layer_pool.c \ common/common_suite.c \ common/guac_iconv.c \ common/guac_string.c \ common/guac_rect.c \ protocol/suite.c \ protocol/base64_decode.c \ protocol/instruction_parse.c \ protocol/instruction_read.c \ protocol/instruction_write.c \ protocol/nest_write.c \ util/util_suite.c \ util/guac_pool.c \ util/guac_unicode.c test_libguac_CFLAGS = \ -Werror -Wall -pedantic \ @COMMON_INCLUDE@ \ @LIBGUAC_INCLUDE@ test_libguac_LDADD = \ @COMMON_LTLIB@ \ @CUNIT_LIBS@ \ @LIBGUAC_LTLIB@ all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list client/$(am__dirstamp): @$(MKDIR_P) client @: > client/$(am__dirstamp) client/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) client/$(DEPDIR) @: > client/$(DEPDIR)/$(am__dirstamp) client/test_libguac-client_suite.$(OBJEXT): client/$(am__dirstamp) \ client/$(DEPDIR)/$(am__dirstamp) client/test_libguac-buffer_pool.$(OBJEXT): client/$(am__dirstamp) \ client/$(DEPDIR)/$(am__dirstamp) client/test_libguac-layer_pool.$(OBJEXT): client/$(am__dirstamp) \ client/$(DEPDIR)/$(am__dirstamp) common/$(am__dirstamp): @$(MKDIR_P) common @: > common/$(am__dirstamp) common/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) common/$(DEPDIR) @: > common/$(DEPDIR)/$(am__dirstamp) common/test_libguac-common_suite.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) common/test_libguac-guac_iconv.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) common/test_libguac-guac_string.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) common/test_libguac-guac_rect.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) protocol/$(am__dirstamp): @$(MKDIR_P) protocol @: > protocol/$(am__dirstamp) protocol/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) protocol/$(DEPDIR) @: > protocol/$(DEPDIR)/$(am__dirstamp) protocol/test_libguac-suite.$(OBJEXT): protocol/$(am__dirstamp) \ protocol/$(DEPDIR)/$(am__dirstamp) protocol/test_libguac-base64_decode.$(OBJEXT): \ protocol/$(am__dirstamp) protocol/$(DEPDIR)/$(am__dirstamp) protocol/test_libguac-instruction_parse.$(OBJEXT): \ protocol/$(am__dirstamp) protocol/$(DEPDIR)/$(am__dirstamp) protocol/test_libguac-instruction_read.$(OBJEXT): \ protocol/$(am__dirstamp) protocol/$(DEPDIR)/$(am__dirstamp) protocol/test_libguac-instruction_write.$(OBJEXT): \ protocol/$(am__dirstamp) protocol/$(DEPDIR)/$(am__dirstamp) protocol/test_libguac-nest_write.$(OBJEXT): protocol/$(am__dirstamp) \ protocol/$(DEPDIR)/$(am__dirstamp) util/$(am__dirstamp): @$(MKDIR_P) util @: > util/$(am__dirstamp) util/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) util/$(DEPDIR) @: > util/$(DEPDIR)/$(am__dirstamp) util/test_libguac-util_suite.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/test_libguac-guac_pool.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/test_libguac-guac_unicode.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) test_libguac$(EXEEXT): $(test_libguac_OBJECTS) $(test_libguac_DEPENDENCIES) $(EXTRA_test_libguac_DEPENDENCIES) @rm -f test_libguac$(EXEEXT) $(AM_V_CCLD)$(test_libguac_LINK) $(test_libguac_OBJECTS) $(test_libguac_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f client/*.$(OBJEXT) -rm -f common/*.$(OBJEXT) -rm -f protocol/*.$(OBJEXT) -rm -f util/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_libguac-test_libguac.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@client/$(DEPDIR)/test_libguac-buffer_pool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@client/$(DEPDIR)/test_libguac-client_suite.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@client/$(DEPDIR)/test_libguac-layer_pool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/test_libguac-common_suite.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/test_libguac-guac_iconv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/test_libguac-guac_rect.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/test_libguac-guac_string.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@protocol/$(DEPDIR)/test_libguac-base64_decode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@protocol/$(DEPDIR)/test_libguac-instruction_parse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@protocol/$(DEPDIR)/test_libguac-instruction_read.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@protocol/$(DEPDIR)/test_libguac-instruction_write.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@protocol/$(DEPDIR)/test_libguac-nest_write.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@protocol/$(DEPDIR)/test_libguac-suite.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/test_libguac-guac_pool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/test_libguac-guac_unicode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/test_libguac-util_suite.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< test_libguac-test_libguac.o: test_libguac.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT test_libguac-test_libguac.o -MD -MP -MF $(DEPDIR)/test_libguac-test_libguac.Tpo -c -o test_libguac-test_libguac.o `test -f 'test_libguac.c' || echo '$(srcdir)/'`test_libguac.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_libguac-test_libguac.Tpo $(DEPDIR)/test_libguac-test_libguac.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test_libguac.c' object='test_libguac-test_libguac.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o test_libguac-test_libguac.o `test -f 'test_libguac.c' || echo '$(srcdir)/'`test_libguac.c test_libguac-test_libguac.obj: test_libguac.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT test_libguac-test_libguac.obj -MD -MP -MF $(DEPDIR)/test_libguac-test_libguac.Tpo -c -o test_libguac-test_libguac.obj `if test -f 'test_libguac.c'; then $(CYGPATH_W) 'test_libguac.c'; else $(CYGPATH_W) '$(srcdir)/test_libguac.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_libguac-test_libguac.Tpo $(DEPDIR)/test_libguac-test_libguac.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test_libguac.c' object='test_libguac-test_libguac.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o test_libguac-test_libguac.obj `if test -f 'test_libguac.c'; then $(CYGPATH_W) 'test_libguac.c'; else $(CYGPATH_W) '$(srcdir)/test_libguac.c'; fi` client/test_libguac-client_suite.o: client/client_suite.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT client/test_libguac-client_suite.o -MD -MP -MF client/$(DEPDIR)/test_libguac-client_suite.Tpo -c -o client/test_libguac-client_suite.o `test -f 'client/client_suite.c' || echo '$(srcdir)/'`client/client_suite.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) client/$(DEPDIR)/test_libguac-client_suite.Tpo client/$(DEPDIR)/test_libguac-client_suite.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client/client_suite.c' object='client/test_libguac-client_suite.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o client/test_libguac-client_suite.o `test -f 'client/client_suite.c' || echo '$(srcdir)/'`client/client_suite.c client/test_libguac-client_suite.obj: client/client_suite.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT client/test_libguac-client_suite.obj -MD -MP -MF client/$(DEPDIR)/test_libguac-client_suite.Tpo -c -o client/test_libguac-client_suite.obj `if test -f 'client/client_suite.c'; then $(CYGPATH_W) 'client/client_suite.c'; else $(CYGPATH_W) '$(srcdir)/client/client_suite.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) client/$(DEPDIR)/test_libguac-client_suite.Tpo client/$(DEPDIR)/test_libguac-client_suite.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client/client_suite.c' object='client/test_libguac-client_suite.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o client/test_libguac-client_suite.obj `if test -f 'client/client_suite.c'; then $(CYGPATH_W) 'client/client_suite.c'; else $(CYGPATH_W) '$(srcdir)/client/client_suite.c'; fi` client/test_libguac-buffer_pool.o: client/buffer_pool.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT client/test_libguac-buffer_pool.o -MD -MP -MF client/$(DEPDIR)/test_libguac-buffer_pool.Tpo -c -o client/test_libguac-buffer_pool.o `test -f 'client/buffer_pool.c' || echo '$(srcdir)/'`client/buffer_pool.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) client/$(DEPDIR)/test_libguac-buffer_pool.Tpo client/$(DEPDIR)/test_libguac-buffer_pool.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client/buffer_pool.c' object='client/test_libguac-buffer_pool.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o client/test_libguac-buffer_pool.o `test -f 'client/buffer_pool.c' || echo '$(srcdir)/'`client/buffer_pool.c client/test_libguac-buffer_pool.obj: client/buffer_pool.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT client/test_libguac-buffer_pool.obj -MD -MP -MF client/$(DEPDIR)/test_libguac-buffer_pool.Tpo -c -o client/test_libguac-buffer_pool.obj `if test -f 'client/buffer_pool.c'; then $(CYGPATH_W) 'client/buffer_pool.c'; else $(CYGPATH_W) '$(srcdir)/client/buffer_pool.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) client/$(DEPDIR)/test_libguac-buffer_pool.Tpo client/$(DEPDIR)/test_libguac-buffer_pool.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client/buffer_pool.c' object='client/test_libguac-buffer_pool.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o client/test_libguac-buffer_pool.obj `if test -f 'client/buffer_pool.c'; then $(CYGPATH_W) 'client/buffer_pool.c'; else $(CYGPATH_W) '$(srcdir)/client/buffer_pool.c'; fi` client/test_libguac-layer_pool.o: client/layer_pool.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT client/test_libguac-layer_pool.o -MD -MP -MF client/$(DEPDIR)/test_libguac-layer_pool.Tpo -c -o client/test_libguac-layer_pool.o `test -f 'client/layer_pool.c' || echo '$(srcdir)/'`client/layer_pool.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) client/$(DEPDIR)/test_libguac-layer_pool.Tpo client/$(DEPDIR)/test_libguac-layer_pool.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client/layer_pool.c' object='client/test_libguac-layer_pool.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o client/test_libguac-layer_pool.o `test -f 'client/layer_pool.c' || echo '$(srcdir)/'`client/layer_pool.c client/test_libguac-layer_pool.obj: client/layer_pool.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT client/test_libguac-layer_pool.obj -MD -MP -MF client/$(DEPDIR)/test_libguac-layer_pool.Tpo -c -o client/test_libguac-layer_pool.obj `if test -f 'client/layer_pool.c'; then $(CYGPATH_W) 'client/layer_pool.c'; else $(CYGPATH_W) '$(srcdir)/client/layer_pool.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) client/$(DEPDIR)/test_libguac-layer_pool.Tpo client/$(DEPDIR)/test_libguac-layer_pool.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client/layer_pool.c' object='client/test_libguac-layer_pool.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o client/test_libguac-layer_pool.obj `if test -f 'client/layer_pool.c'; then $(CYGPATH_W) 'client/layer_pool.c'; else $(CYGPATH_W) '$(srcdir)/client/layer_pool.c'; fi` common/test_libguac-common_suite.o: common/common_suite.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT common/test_libguac-common_suite.o -MD -MP -MF common/$(DEPDIR)/test_libguac-common_suite.Tpo -c -o common/test_libguac-common_suite.o `test -f 'common/common_suite.c' || echo '$(srcdir)/'`common/common_suite.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/test_libguac-common_suite.Tpo common/$(DEPDIR)/test_libguac-common_suite.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/common_suite.c' object='common/test_libguac-common_suite.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o common/test_libguac-common_suite.o `test -f 'common/common_suite.c' || echo '$(srcdir)/'`common/common_suite.c common/test_libguac-common_suite.obj: common/common_suite.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT common/test_libguac-common_suite.obj -MD -MP -MF common/$(DEPDIR)/test_libguac-common_suite.Tpo -c -o common/test_libguac-common_suite.obj `if test -f 'common/common_suite.c'; then $(CYGPATH_W) 'common/common_suite.c'; else $(CYGPATH_W) '$(srcdir)/common/common_suite.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/test_libguac-common_suite.Tpo common/$(DEPDIR)/test_libguac-common_suite.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/common_suite.c' object='common/test_libguac-common_suite.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o common/test_libguac-common_suite.obj `if test -f 'common/common_suite.c'; then $(CYGPATH_W) 'common/common_suite.c'; else $(CYGPATH_W) '$(srcdir)/common/common_suite.c'; fi` common/test_libguac-guac_iconv.o: common/guac_iconv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT common/test_libguac-guac_iconv.o -MD -MP -MF common/$(DEPDIR)/test_libguac-guac_iconv.Tpo -c -o common/test_libguac-guac_iconv.o `test -f 'common/guac_iconv.c' || echo '$(srcdir)/'`common/guac_iconv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/test_libguac-guac_iconv.Tpo common/$(DEPDIR)/test_libguac-guac_iconv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/guac_iconv.c' object='common/test_libguac-guac_iconv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o common/test_libguac-guac_iconv.o `test -f 'common/guac_iconv.c' || echo '$(srcdir)/'`common/guac_iconv.c common/test_libguac-guac_iconv.obj: common/guac_iconv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT common/test_libguac-guac_iconv.obj -MD -MP -MF common/$(DEPDIR)/test_libguac-guac_iconv.Tpo -c -o common/test_libguac-guac_iconv.obj `if test -f 'common/guac_iconv.c'; then $(CYGPATH_W) 'common/guac_iconv.c'; else $(CYGPATH_W) '$(srcdir)/common/guac_iconv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/test_libguac-guac_iconv.Tpo common/$(DEPDIR)/test_libguac-guac_iconv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/guac_iconv.c' object='common/test_libguac-guac_iconv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o common/test_libguac-guac_iconv.obj `if test -f 'common/guac_iconv.c'; then $(CYGPATH_W) 'common/guac_iconv.c'; else $(CYGPATH_W) '$(srcdir)/common/guac_iconv.c'; fi` common/test_libguac-guac_string.o: common/guac_string.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT common/test_libguac-guac_string.o -MD -MP -MF common/$(DEPDIR)/test_libguac-guac_string.Tpo -c -o common/test_libguac-guac_string.o `test -f 'common/guac_string.c' || echo '$(srcdir)/'`common/guac_string.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/test_libguac-guac_string.Tpo common/$(DEPDIR)/test_libguac-guac_string.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/guac_string.c' object='common/test_libguac-guac_string.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o common/test_libguac-guac_string.o `test -f 'common/guac_string.c' || echo '$(srcdir)/'`common/guac_string.c common/test_libguac-guac_string.obj: common/guac_string.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT common/test_libguac-guac_string.obj -MD -MP -MF common/$(DEPDIR)/test_libguac-guac_string.Tpo -c -o common/test_libguac-guac_string.obj `if test -f 'common/guac_string.c'; then $(CYGPATH_W) 'common/guac_string.c'; else $(CYGPATH_W) '$(srcdir)/common/guac_string.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/test_libguac-guac_string.Tpo common/$(DEPDIR)/test_libguac-guac_string.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/guac_string.c' object='common/test_libguac-guac_string.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o common/test_libguac-guac_string.obj `if test -f 'common/guac_string.c'; then $(CYGPATH_W) 'common/guac_string.c'; else $(CYGPATH_W) '$(srcdir)/common/guac_string.c'; fi` common/test_libguac-guac_rect.o: common/guac_rect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT common/test_libguac-guac_rect.o -MD -MP -MF common/$(DEPDIR)/test_libguac-guac_rect.Tpo -c -o common/test_libguac-guac_rect.o `test -f 'common/guac_rect.c' || echo '$(srcdir)/'`common/guac_rect.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/test_libguac-guac_rect.Tpo common/$(DEPDIR)/test_libguac-guac_rect.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/guac_rect.c' object='common/test_libguac-guac_rect.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o common/test_libguac-guac_rect.o `test -f 'common/guac_rect.c' || echo '$(srcdir)/'`common/guac_rect.c common/test_libguac-guac_rect.obj: common/guac_rect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT common/test_libguac-guac_rect.obj -MD -MP -MF common/$(DEPDIR)/test_libguac-guac_rect.Tpo -c -o common/test_libguac-guac_rect.obj `if test -f 'common/guac_rect.c'; then $(CYGPATH_W) 'common/guac_rect.c'; else $(CYGPATH_W) '$(srcdir)/common/guac_rect.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/test_libguac-guac_rect.Tpo common/$(DEPDIR)/test_libguac-guac_rect.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/guac_rect.c' object='common/test_libguac-guac_rect.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o common/test_libguac-guac_rect.obj `if test -f 'common/guac_rect.c'; then $(CYGPATH_W) 'common/guac_rect.c'; else $(CYGPATH_W) '$(srcdir)/common/guac_rect.c'; fi` protocol/test_libguac-suite.o: protocol/suite.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT protocol/test_libguac-suite.o -MD -MP -MF protocol/$(DEPDIR)/test_libguac-suite.Tpo -c -o protocol/test_libguac-suite.o `test -f 'protocol/suite.c' || echo '$(srcdir)/'`protocol/suite.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) protocol/$(DEPDIR)/test_libguac-suite.Tpo protocol/$(DEPDIR)/test_libguac-suite.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='protocol/suite.c' object='protocol/test_libguac-suite.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o protocol/test_libguac-suite.o `test -f 'protocol/suite.c' || echo '$(srcdir)/'`protocol/suite.c protocol/test_libguac-suite.obj: protocol/suite.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT protocol/test_libguac-suite.obj -MD -MP -MF protocol/$(DEPDIR)/test_libguac-suite.Tpo -c -o protocol/test_libguac-suite.obj `if test -f 'protocol/suite.c'; then $(CYGPATH_W) 'protocol/suite.c'; else $(CYGPATH_W) '$(srcdir)/protocol/suite.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) protocol/$(DEPDIR)/test_libguac-suite.Tpo protocol/$(DEPDIR)/test_libguac-suite.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='protocol/suite.c' object='protocol/test_libguac-suite.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o protocol/test_libguac-suite.obj `if test -f 'protocol/suite.c'; then $(CYGPATH_W) 'protocol/suite.c'; else $(CYGPATH_W) '$(srcdir)/protocol/suite.c'; fi` protocol/test_libguac-base64_decode.o: protocol/base64_decode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT protocol/test_libguac-base64_decode.o -MD -MP -MF protocol/$(DEPDIR)/test_libguac-base64_decode.Tpo -c -o protocol/test_libguac-base64_decode.o `test -f 'protocol/base64_decode.c' || echo '$(srcdir)/'`protocol/base64_decode.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) protocol/$(DEPDIR)/test_libguac-base64_decode.Tpo protocol/$(DEPDIR)/test_libguac-base64_decode.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='protocol/base64_decode.c' object='protocol/test_libguac-base64_decode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o protocol/test_libguac-base64_decode.o `test -f 'protocol/base64_decode.c' || echo '$(srcdir)/'`protocol/base64_decode.c protocol/test_libguac-base64_decode.obj: protocol/base64_decode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT protocol/test_libguac-base64_decode.obj -MD -MP -MF protocol/$(DEPDIR)/test_libguac-base64_decode.Tpo -c -o protocol/test_libguac-base64_decode.obj `if test -f 'protocol/base64_decode.c'; then $(CYGPATH_W) 'protocol/base64_decode.c'; else $(CYGPATH_W) '$(srcdir)/protocol/base64_decode.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) protocol/$(DEPDIR)/test_libguac-base64_decode.Tpo protocol/$(DEPDIR)/test_libguac-base64_decode.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='protocol/base64_decode.c' object='protocol/test_libguac-base64_decode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o protocol/test_libguac-base64_decode.obj `if test -f 'protocol/base64_decode.c'; then $(CYGPATH_W) 'protocol/base64_decode.c'; else $(CYGPATH_W) '$(srcdir)/protocol/base64_decode.c'; fi` protocol/test_libguac-instruction_parse.o: protocol/instruction_parse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT protocol/test_libguac-instruction_parse.o -MD -MP -MF protocol/$(DEPDIR)/test_libguac-instruction_parse.Tpo -c -o protocol/test_libguac-instruction_parse.o `test -f 'protocol/instruction_parse.c' || echo '$(srcdir)/'`protocol/instruction_parse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) protocol/$(DEPDIR)/test_libguac-instruction_parse.Tpo protocol/$(DEPDIR)/test_libguac-instruction_parse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='protocol/instruction_parse.c' object='protocol/test_libguac-instruction_parse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o protocol/test_libguac-instruction_parse.o `test -f 'protocol/instruction_parse.c' || echo '$(srcdir)/'`protocol/instruction_parse.c protocol/test_libguac-instruction_parse.obj: protocol/instruction_parse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT protocol/test_libguac-instruction_parse.obj -MD -MP -MF protocol/$(DEPDIR)/test_libguac-instruction_parse.Tpo -c -o protocol/test_libguac-instruction_parse.obj `if test -f 'protocol/instruction_parse.c'; then $(CYGPATH_W) 'protocol/instruction_parse.c'; else $(CYGPATH_W) '$(srcdir)/protocol/instruction_parse.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) protocol/$(DEPDIR)/test_libguac-instruction_parse.Tpo protocol/$(DEPDIR)/test_libguac-instruction_parse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='protocol/instruction_parse.c' object='protocol/test_libguac-instruction_parse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o protocol/test_libguac-instruction_parse.obj `if test -f 'protocol/instruction_parse.c'; then $(CYGPATH_W) 'protocol/instruction_parse.c'; else $(CYGPATH_W) '$(srcdir)/protocol/instruction_parse.c'; fi` protocol/test_libguac-instruction_read.o: protocol/instruction_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT protocol/test_libguac-instruction_read.o -MD -MP -MF protocol/$(DEPDIR)/test_libguac-instruction_read.Tpo -c -o protocol/test_libguac-instruction_read.o `test -f 'protocol/instruction_read.c' || echo '$(srcdir)/'`protocol/instruction_read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) protocol/$(DEPDIR)/test_libguac-instruction_read.Tpo protocol/$(DEPDIR)/test_libguac-instruction_read.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='protocol/instruction_read.c' object='protocol/test_libguac-instruction_read.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o protocol/test_libguac-instruction_read.o `test -f 'protocol/instruction_read.c' || echo '$(srcdir)/'`protocol/instruction_read.c protocol/test_libguac-instruction_read.obj: protocol/instruction_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT protocol/test_libguac-instruction_read.obj -MD -MP -MF protocol/$(DEPDIR)/test_libguac-instruction_read.Tpo -c -o protocol/test_libguac-instruction_read.obj `if test -f 'protocol/instruction_read.c'; then $(CYGPATH_W) 'protocol/instruction_read.c'; else $(CYGPATH_W) '$(srcdir)/protocol/instruction_read.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) protocol/$(DEPDIR)/test_libguac-instruction_read.Tpo protocol/$(DEPDIR)/test_libguac-instruction_read.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='protocol/instruction_read.c' object='protocol/test_libguac-instruction_read.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o protocol/test_libguac-instruction_read.obj `if test -f 'protocol/instruction_read.c'; then $(CYGPATH_W) 'protocol/instruction_read.c'; else $(CYGPATH_W) '$(srcdir)/protocol/instruction_read.c'; fi` protocol/test_libguac-instruction_write.o: protocol/instruction_write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT protocol/test_libguac-instruction_write.o -MD -MP -MF protocol/$(DEPDIR)/test_libguac-instruction_write.Tpo -c -o protocol/test_libguac-instruction_write.o `test -f 'protocol/instruction_write.c' || echo '$(srcdir)/'`protocol/instruction_write.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) protocol/$(DEPDIR)/test_libguac-instruction_write.Tpo protocol/$(DEPDIR)/test_libguac-instruction_write.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='protocol/instruction_write.c' object='protocol/test_libguac-instruction_write.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o protocol/test_libguac-instruction_write.o `test -f 'protocol/instruction_write.c' || echo '$(srcdir)/'`protocol/instruction_write.c protocol/test_libguac-instruction_write.obj: protocol/instruction_write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT protocol/test_libguac-instruction_write.obj -MD -MP -MF protocol/$(DEPDIR)/test_libguac-instruction_write.Tpo -c -o protocol/test_libguac-instruction_write.obj `if test -f 'protocol/instruction_write.c'; then $(CYGPATH_W) 'protocol/instruction_write.c'; else $(CYGPATH_W) '$(srcdir)/protocol/instruction_write.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) protocol/$(DEPDIR)/test_libguac-instruction_write.Tpo protocol/$(DEPDIR)/test_libguac-instruction_write.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='protocol/instruction_write.c' object='protocol/test_libguac-instruction_write.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o protocol/test_libguac-instruction_write.obj `if test -f 'protocol/instruction_write.c'; then $(CYGPATH_W) 'protocol/instruction_write.c'; else $(CYGPATH_W) '$(srcdir)/protocol/instruction_write.c'; fi` protocol/test_libguac-nest_write.o: protocol/nest_write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT protocol/test_libguac-nest_write.o -MD -MP -MF protocol/$(DEPDIR)/test_libguac-nest_write.Tpo -c -o protocol/test_libguac-nest_write.o `test -f 'protocol/nest_write.c' || echo '$(srcdir)/'`protocol/nest_write.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) protocol/$(DEPDIR)/test_libguac-nest_write.Tpo protocol/$(DEPDIR)/test_libguac-nest_write.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='protocol/nest_write.c' object='protocol/test_libguac-nest_write.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o protocol/test_libguac-nest_write.o `test -f 'protocol/nest_write.c' || echo '$(srcdir)/'`protocol/nest_write.c protocol/test_libguac-nest_write.obj: protocol/nest_write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT protocol/test_libguac-nest_write.obj -MD -MP -MF protocol/$(DEPDIR)/test_libguac-nest_write.Tpo -c -o protocol/test_libguac-nest_write.obj `if test -f 'protocol/nest_write.c'; then $(CYGPATH_W) 'protocol/nest_write.c'; else $(CYGPATH_W) '$(srcdir)/protocol/nest_write.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) protocol/$(DEPDIR)/test_libguac-nest_write.Tpo protocol/$(DEPDIR)/test_libguac-nest_write.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='protocol/nest_write.c' object='protocol/test_libguac-nest_write.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o protocol/test_libguac-nest_write.obj `if test -f 'protocol/nest_write.c'; then $(CYGPATH_W) 'protocol/nest_write.c'; else $(CYGPATH_W) '$(srcdir)/protocol/nest_write.c'; fi` util/test_libguac-util_suite.o: util/util_suite.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT util/test_libguac-util_suite.o -MD -MP -MF util/$(DEPDIR)/test_libguac-util_suite.Tpo -c -o util/test_libguac-util_suite.o `test -f 'util/util_suite.c' || echo '$(srcdir)/'`util/util_suite.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/test_libguac-util_suite.Tpo util/$(DEPDIR)/test_libguac-util_suite.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/util_suite.c' object='util/test_libguac-util_suite.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o util/test_libguac-util_suite.o `test -f 'util/util_suite.c' || echo '$(srcdir)/'`util/util_suite.c util/test_libguac-util_suite.obj: util/util_suite.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT util/test_libguac-util_suite.obj -MD -MP -MF util/$(DEPDIR)/test_libguac-util_suite.Tpo -c -o util/test_libguac-util_suite.obj `if test -f 'util/util_suite.c'; then $(CYGPATH_W) 'util/util_suite.c'; else $(CYGPATH_W) '$(srcdir)/util/util_suite.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/test_libguac-util_suite.Tpo util/$(DEPDIR)/test_libguac-util_suite.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/util_suite.c' object='util/test_libguac-util_suite.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o util/test_libguac-util_suite.obj `if test -f 'util/util_suite.c'; then $(CYGPATH_W) 'util/util_suite.c'; else $(CYGPATH_W) '$(srcdir)/util/util_suite.c'; fi` util/test_libguac-guac_pool.o: util/guac_pool.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT util/test_libguac-guac_pool.o -MD -MP -MF util/$(DEPDIR)/test_libguac-guac_pool.Tpo -c -o util/test_libguac-guac_pool.o `test -f 'util/guac_pool.c' || echo '$(srcdir)/'`util/guac_pool.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/test_libguac-guac_pool.Tpo util/$(DEPDIR)/test_libguac-guac_pool.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/guac_pool.c' object='util/test_libguac-guac_pool.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o util/test_libguac-guac_pool.o `test -f 'util/guac_pool.c' || echo '$(srcdir)/'`util/guac_pool.c util/test_libguac-guac_pool.obj: util/guac_pool.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT util/test_libguac-guac_pool.obj -MD -MP -MF util/$(DEPDIR)/test_libguac-guac_pool.Tpo -c -o util/test_libguac-guac_pool.obj `if test -f 'util/guac_pool.c'; then $(CYGPATH_W) 'util/guac_pool.c'; else $(CYGPATH_W) '$(srcdir)/util/guac_pool.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/test_libguac-guac_pool.Tpo util/$(DEPDIR)/test_libguac-guac_pool.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/guac_pool.c' object='util/test_libguac-guac_pool.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o util/test_libguac-guac_pool.obj `if test -f 'util/guac_pool.c'; then $(CYGPATH_W) 'util/guac_pool.c'; else $(CYGPATH_W) '$(srcdir)/util/guac_pool.c'; fi` util/test_libguac-guac_unicode.o: util/guac_unicode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT util/test_libguac-guac_unicode.o -MD -MP -MF util/$(DEPDIR)/test_libguac-guac_unicode.Tpo -c -o util/test_libguac-guac_unicode.o `test -f 'util/guac_unicode.c' || echo '$(srcdir)/'`util/guac_unicode.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/test_libguac-guac_unicode.Tpo util/$(DEPDIR)/test_libguac-guac_unicode.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/guac_unicode.c' object='util/test_libguac-guac_unicode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o util/test_libguac-guac_unicode.o `test -f 'util/guac_unicode.c' || echo '$(srcdir)/'`util/guac_unicode.c util/test_libguac-guac_unicode.obj: util/guac_unicode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -MT util/test_libguac-guac_unicode.obj -MD -MP -MF util/$(DEPDIR)/test_libguac-guac_unicode.Tpo -c -o util/test_libguac-guac_unicode.obj `if test -f 'util/guac_unicode.c'; then $(CYGPATH_W) 'util/guac_unicode.c'; else $(CYGPATH_W) '$(srcdir)/util/guac_unicode.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/test_libguac-guac_unicode.Tpo util/$(DEPDIR)/test_libguac-guac_unicode.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/guac_unicode.c' object='util/test_libguac-guac_unicode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_libguac_CFLAGS) $(CFLAGS) -c -o util/test_libguac-guac_unicode.obj `if test -f 'util/guac_unicode.c'; then $(CYGPATH_W) 'util/guac_unicode.c'; else $(CYGPATH_W) '$(srcdir)/util/guac_unicode.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test_libguac.log: test_libguac$(EXEEXT) @p='test_libguac$(EXEEXT)'; \ b='test_libguac'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f client/$(DEPDIR)/$(am__dirstamp) -rm -f client/$(am__dirstamp) -rm -f common/$(DEPDIR)/$(am__dirstamp) -rm -f common/$(am__dirstamp) -rm -f protocol/$(DEPDIR)/$(am__dirstamp) -rm -f protocol/$(am__dirstamp) -rm -f util/$(DEPDIR)/$(am__dirstamp) -rm -f util/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) client/$(DEPDIR) common/$(DEPDIR) protocol/$(DEPDIR) util/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) client/$(DEPDIR) common/$(DEPDIR) protocol/$(DEPDIR) util/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: guacamole-server-0.9.9/tests/common/0000775000175100017510000000000012645400336014434 500000000000000guacamole-server-0.9.9/tests/common/guac_string.c0000664000175100017510000000443512536405625017040 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "common_suite.h" #include "guac_string.h" #include #include void test_guac_string() { char** tokens; /* Test occurrence counting */ CU_ASSERT_EQUAL(4, guac_count_occurrences("this is a test string", 's')); CU_ASSERT_EQUAL(3, guac_count_occurrences("this is a test string", 'i')); CU_ASSERT_EQUAL(0, guac_count_occurrences("", 's')); /* Split test string */ tokens = guac_split("this is a test string", ' '); CU_ASSERT_PTR_NOT_NULL(tokens); /* Check resulting tokens */ CU_ASSERT_PTR_NOT_NULL_FATAL(tokens[0]); CU_ASSERT_STRING_EQUAL("this", tokens[0]); CU_ASSERT_PTR_NOT_NULL_FATAL(tokens[1]); CU_ASSERT_STRING_EQUAL("is", tokens[1]); CU_ASSERT_PTR_NOT_NULL_FATAL(tokens[2]); CU_ASSERT_STRING_EQUAL("a", tokens[2]); CU_ASSERT_PTR_NOT_NULL_FATAL(tokens[3]); CU_ASSERT_STRING_EQUAL("test", tokens[3]); CU_ASSERT_PTR_NOT_NULL_FATAL(tokens[4]); CU_ASSERT_STRING_EQUAL("string", tokens[4]); CU_ASSERT_PTR_NULL(tokens[5]); /* Clean up */ free(tokens[0]); free(tokens[1]); free(tokens[2]); free(tokens[3]); free(tokens[4]); free(tokens); } guacamole-server-0.9.9/tests/common/guac_rect.c0000664000175100017510000002234312626133327016462 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "config.h" #include "common_suite.h" #include "guac_rect.h" #include #include #include void test_guac_rect() { guac_common_rect max; /* * Test init method */ guac_common_rect_init(&max, 0, 0, 100, 100); CU_ASSERT_EQUAL(0, max.x); CU_ASSERT_EQUAL(0, max.y); CU_ASSERT_EQUAL(100, max.width); CU_ASSERT_EQUAL(100, max.height); /* * Test constrain method */ guac_common_rect rect; guac_common_rect_init(&rect, -10, -10, 110, 110); guac_common_rect_init(&max, 0, 0, 100, 100); guac_common_rect_constrain(&rect, &max); CU_ASSERT_EQUAL(0, rect.x); CU_ASSERT_EQUAL(0, rect.y); CU_ASSERT_EQUAL(100, rect.width); CU_ASSERT_EQUAL(100, rect.height); /* * Test extend method */ guac_common_rect_init(&rect, 10, 10, 90, 90); guac_common_rect_init(&max, 0, 0, 100, 100); guac_common_rect_extend(&rect, &max); CU_ASSERT_EQUAL(0, rect.x); CU_ASSERT_EQUAL(0, rect.y); CU_ASSERT_EQUAL(100, rect.width); CU_ASSERT_EQUAL(100, rect.height); /* * Test adjust method */ int cell_size = 16; /* Simple adjustment */ guac_common_rect_init(&rect, 0, 0, 25, 25); guac_common_rect_init(&max, 0, 0, 100, 100); guac_common_rect_expand_to_grid(cell_size, &rect, &max); CU_ASSERT_EQUAL(0, rect.x); CU_ASSERT_EQUAL(0, rect.y); CU_ASSERT_EQUAL(32, rect.width); CU_ASSERT_EQUAL(32, rect.height); /* Adjustment with moving of rect */ guac_common_rect_init(&rect, 75, 75, 25, 25); guac_common_rect_init(&max, 0, 0, 100, 100); guac_common_rect_expand_to_grid(cell_size, &rect, &max); CU_ASSERT_EQUAL(max.width - 32, rect.x); CU_ASSERT_EQUAL(max.height - 32, rect.y); CU_ASSERT_EQUAL(32, rect.width); CU_ASSERT_EQUAL(32, rect.height); guac_common_rect_init(&rect, -5, -5, 25, 25); guac_common_rect_init(&max, 0, 0, 100, 100); guac_common_rect_expand_to_grid(cell_size, &rect, &max); CU_ASSERT_EQUAL(0, rect.x); CU_ASSERT_EQUAL(0, rect.y); CU_ASSERT_EQUAL(32, rect.width); CU_ASSERT_EQUAL(32, rect.height); /* Adjustment with moving and clamping of rect */ guac_common_rect_init(&rect, 0, 0, 25, 15); guac_common_rect_init(&max, 0, 5, 32, 15); guac_common_rect_expand_to_grid(cell_size, &rect, &max); CU_ASSERT_EQUAL(max.x, rect.x); CU_ASSERT_EQUAL(max.y, rect.y); CU_ASSERT_EQUAL(max.width, rect.width); CU_ASSERT_EQUAL(max.height, rect.height); /* * Rectangle intersection tests */ guac_common_rect min; guac_common_rect_init(&min, 10, 10, 10, 10); /* Rectangle intersection - empty * rectangle is outside */ guac_common_rect_init(&rect, 25, 25, 5, 5); int res = guac_common_rect_intersects(&rect, &min); CU_ASSERT_EQUAL(0, res); /* Rectangle intersection - complete * rectangle is completely inside */ guac_common_rect_init(&rect, 11, 11, 5, 5); res = guac_common_rect_intersects(&rect, &min); CU_ASSERT_EQUAL(2, res); /* Rectangle intersection - partial * rectangle intersects UL */ guac_common_rect_init(&rect, 8, 8, 5, 5); res = guac_common_rect_intersects(&rect, &min); CU_ASSERT_EQUAL(1, res); /* Rectangle intersection - partial * rectangle intersects LR */ guac_common_rect_init(&rect, 18, 18, 5, 5); res = guac_common_rect_intersects(&rect, &min); CU_ASSERT_EQUAL(1, res); /* Rectangle intersection - complete * rect intersects along UL but inside */ guac_common_rect_init(&rect, 10, 10, 5, 5); res = guac_common_rect_intersects(&rect, &min); CU_ASSERT_EQUAL(2, res); /* Rectangle intersection - partial * rectangle intersects along L but outside */ guac_common_rect_init(&rect, 5, 10, 5, 5); res = guac_common_rect_intersects(&rect, &min); CU_ASSERT_EQUAL(1, res); /* Rectangle intersection - complete * rectangle intersects along LR but rest is inside */ guac_common_rect_init(&rect, 15, 15, 5, 5); res = guac_common_rect_intersects(&rect, &min); CU_ASSERT_EQUAL(2, res); /* Rectangle intersection - partial * rectangle intersects along R but rest is outside */ guac_common_rect_init(&rect, 20, 10, 5, 5); res = guac_common_rect_intersects(&rect, &min); CU_ASSERT_EQUAL(1, res); /* Rectangle intersection - partial * rectangle encloses min; which is a partial intersection */ guac_common_rect_init(&rect, 5, 5, 20, 20); res = guac_common_rect_intersects(&rect, &min); CU_ASSERT_EQUAL(1, res); /* * Basic test of clip and split method */ guac_common_rect_init(&min, 10, 10, 10, 10); guac_common_rect cut; /* Clip top */ guac_common_rect_init(&rect, 10, 5, 10, 10); res = guac_common_rect_clip_and_split(&rect, &min, &cut); CU_ASSERT_EQUAL(1, res); CU_ASSERT_EQUAL(10, cut.x); CU_ASSERT_EQUAL(5, cut.y); CU_ASSERT_EQUAL(10, cut.width); CU_ASSERT_EQUAL(5, cut.height); CU_ASSERT_EQUAL(10, rect.x); CU_ASSERT_EQUAL(10, rect.y); CU_ASSERT_EQUAL(10, rect.width); CU_ASSERT_EQUAL(5, rect.height); /* Clip bottom */ guac_common_rect_init(&rect, 10, 15, 10, 10); res = guac_common_rect_clip_and_split(&rect, &min, &cut); CU_ASSERT_EQUAL(1, res); CU_ASSERT_EQUAL(10, cut.x); CU_ASSERT_EQUAL(20, cut.y); CU_ASSERT_EQUAL(10, cut.width); CU_ASSERT_EQUAL(5, cut.height); CU_ASSERT_EQUAL(10, rect.x); CU_ASSERT_EQUAL(15, rect.y); CU_ASSERT_EQUAL(10, rect.width); CU_ASSERT_EQUAL(5, rect.height); /* Clip left */ guac_common_rect_init(&rect, 5, 10, 10, 10); res = guac_common_rect_clip_and_split(&rect, &min, &cut); CU_ASSERT_EQUAL(1, res); CU_ASSERT_EQUAL(5, cut.x); CU_ASSERT_EQUAL(10, cut.y); CU_ASSERT_EQUAL(5, cut.width); CU_ASSERT_EQUAL(10, cut.height); CU_ASSERT_EQUAL(10, rect.x); CU_ASSERT_EQUAL(10, rect.y); CU_ASSERT_EQUAL(5, rect.width); CU_ASSERT_EQUAL(10, rect.height); /* Clip right */ guac_common_rect_init(&rect, 15, 10, 10, 10); res = guac_common_rect_clip_and_split(&rect, &min, &cut); CU_ASSERT_EQUAL(1, res); CU_ASSERT_EQUAL(20, cut.x); CU_ASSERT_EQUAL(10, cut.y); CU_ASSERT_EQUAL(5, cut.width); CU_ASSERT_EQUAL(10, cut.height); CU_ASSERT_EQUAL(15, rect.x); CU_ASSERT_EQUAL(10, rect.y); CU_ASSERT_EQUAL(5, rect.width); CU_ASSERT_EQUAL(10, rect.height); /* * Test a rectangle which completely covers the hole. * Clip and split until done. */ guac_common_rect_init(&rect, 5, 5, 20, 20); /* Clip top */ res = guac_common_rect_clip_and_split(&rect, &min, &cut); CU_ASSERT_EQUAL(1, res); CU_ASSERT_EQUAL(5, cut.x); CU_ASSERT_EQUAL(5, cut.y); CU_ASSERT_EQUAL(20, cut.width); CU_ASSERT_EQUAL(5, cut.height); CU_ASSERT_EQUAL(5, rect.x); CU_ASSERT_EQUAL(10, rect.y); CU_ASSERT_EQUAL(20, rect.width); CU_ASSERT_EQUAL(15, rect.height); /* Clip left */ res = guac_common_rect_clip_and_split(&rect, &min, &cut); CU_ASSERT_EQUAL(1, res); CU_ASSERT_EQUAL(5, cut.x); CU_ASSERT_EQUAL(10, cut.y); CU_ASSERT_EQUAL(5, cut.width); CU_ASSERT_EQUAL(15, cut.height); CU_ASSERT_EQUAL(10, rect.x); CU_ASSERT_EQUAL(10, rect.y); CU_ASSERT_EQUAL(15, rect.width); CU_ASSERT_EQUAL(15, rect.height); /* Clip bottom */ res = guac_common_rect_clip_and_split(&rect, &min, &cut); CU_ASSERT_EQUAL(1, res); CU_ASSERT_EQUAL(10, cut.x); CU_ASSERT_EQUAL(20, cut.y); CU_ASSERT_EQUAL(15, cut.width); CU_ASSERT_EQUAL(5, cut.height); CU_ASSERT_EQUAL(10, rect.x); CU_ASSERT_EQUAL(10, rect.y); CU_ASSERT_EQUAL(15, rect.width); CU_ASSERT_EQUAL(10, rect.height); /* Clip right */ res = guac_common_rect_clip_and_split(&rect, &min, &cut); CU_ASSERT_EQUAL(20, cut.x); CU_ASSERT_EQUAL(10, cut.y); CU_ASSERT_EQUAL(5, cut.width); CU_ASSERT_EQUAL(10, cut.height); CU_ASSERT_EQUAL(10, rect.x); CU_ASSERT_EQUAL(10, rect.y); CU_ASSERT_EQUAL(10, rect.width); CU_ASSERT_EQUAL(10, rect.height); /* Make sure nothing is left to do */ res = guac_common_rect_clip_and_split(&rect, &min, &cut); CU_ASSERT_EQUAL(0, res); } guacamole-server-0.9.9/tests/common/guac_iconv.c0000664000175100017510000001063712536405625016651 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "common_suite.h" #include "guac_iconv.h" #include #include static void test_conversion( guac_iconv_read* reader, unsigned char* in_string, int in_length, guac_iconv_write* writer, unsigned char* out_string, int out_length) { char output[4096]; char input[4096]; const char* current_input = input; char* current_output = output; memcpy(input, in_string, in_length); guac_iconv(reader, ¤t_input, sizeof(input), writer, ¤t_output, sizeof(output)); /* Verify output length */ CU_ASSERT_EQUAL(out_length, current_output - output); /* Verify entire input read */ CU_ASSERT_EQUAL(in_length, current_input - input); /* Verify output content */ CU_ASSERT_EQUAL(0, memcmp(output, out_string, out_length)); } void test_guac_iconv() { /* UTF8 for "papà è bello" */ unsigned char test_string_utf8[] = { 'p', 'a', 'p', 0xC3, 0xA0, ' ', 0xC3, 0xA8, ' ', 'b', 'e', 'l', 'l', 'o', 0x00 }; /* UTF16 for "papà è bello" */ unsigned char test_string_utf16[] = { 'p', 0x00, 'a', 0x00, 'p', 0x00, 0xE0, 0x00, ' ', 0x00, 0xE8, 0x00, ' ', 0x00, 'b', 0x00, 'e', 0x00, 'l', 0x00, 'l', 0x00, 'o', 0x00, 0x00, 0x00 }; /* ISO-8859-1 for "papà è bello" */ unsigned char test_string_iso8859_1[] = { 'p', 'a', 'p', 0xE0, ' ', 0xE8, ' ', 'b', 'e', 'l', 'l', 'o', 0x00 }; /* CP1252 for "papà è bello" */ unsigned char test_string_cp1252[] = { 'p', 'a', 'p', 0xE0, ' ', 0xE8, ' ', 'b', 'e', 'l', 'l', 'o', 0x00 }; /* UTF8 identity */ test_conversion( GUAC_READ_UTF8, test_string_utf8, sizeof(test_string_utf8), GUAC_WRITE_UTF8, test_string_utf8, sizeof(test_string_utf8)); /* UTF16 identity */ test_conversion( GUAC_READ_UTF16, test_string_utf16, sizeof(test_string_utf16), GUAC_WRITE_UTF16, test_string_utf16, sizeof(test_string_utf16)); /* UTF8 to UTF16 */ test_conversion( GUAC_READ_UTF8, test_string_utf8, sizeof(test_string_utf8), GUAC_WRITE_UTF16, test_string_utf16, sizeof(test_string_utf16)); /* UTF16 to UTF8 */ test_conversion( GUAC_READ_UTF16, test_string_utf16, sizeof(test_string_utf16), GUAC_WRITE_UTF8, test_string_utf8, sizeof(test_string_utf8)); /* UTF16 to ISO-8859-1 */ test_conversion( GUAC_READ_UTF16, test_string_utf16, sizeof(test_string_utf16), GUAC_WRITE_ISO8859_1, test_string_iso8859_1, sizeof(test_string_iso8859_1)); /* UTF16 to CP1252 */ test_conversion( GUAC_READ_UTF16, test_string_utf16, sizeof(test_string_utf16), GUAC_WRITE_CP1252, test_string_cp1252, sizeof(test_string_cp1252)); /* CP1252 to UTF8 */ test_conversion( GUAC_READ_CP1252, test_string_cp1252, sizeof(test_string_cp1252), GUAC_WRITE_UTF8, test_string_utf8, sizeof(test_string_utf8)); /* ISO-8859-1 to UTF8 */ test_conversion( GUAC_READ_ISO8859_1, test_string_iso8859_1, sizeof(test_string_iso8859_1), GUAC_WRITE_UTF8, test_string_utf8, sizeof(test_string_utf8)); } guacamole-server-0.9.9/tests/common/common_suite.c0000664000175100017510000000351012626133327017222 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "common_suite.h" #include int common_suite_init() { return 0; } int common_suite_cleanup() { return 0; } int register_common_suite() { /* Add common test suite */ CU_pSuite suite = CU_add_suite("common", common_suite_init, common_suite_cleanup); if (suite == NULL) { CU_cleanup_registry(); return CU_get_error(); } /* Add tests */ if ( CU_add_test(suite, "guac-iconv", test_guac_iconv) == NULL || CU_add_test(suite, "guac-string", test_guac_string) == NULL || CU_add_test(suite, "guac-rect", test_guac_rect) == NULL ) { CU_cleanup_registry(); return CU_get_error(); } return 0; } guacamole-server-0.9.9/tests/common/common_suite.h0000664000175100017510000000333712626133327017236 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_TEST_COMMON_SUITE_H #define _GUAC_TEST_COMMON_SUITE_H /** * Test suite containing unit tests for the "common" utility library included * for the sake of simplifying guacamole-server development, but not included * as part of libguac. * * @file common_suite.h */ #include "config.h" /** * Registers the common test suite with CUnit. */ int register_common_suite(); /** * Unit test for string utility functions. */ void test_guac_string(); /** * Unit test for character conversion functions. */ void test_guac_iconv(); /** * Unit test for rectangle calculation functions. */ void test_guac_rect(); #endif guacamole-server-0.9.9/tests/client/0000775000175100017510000000000012645400336014422 500000000000000guacamole-server-0.9.9/tests/client/client_suite.h0000664000175100017510000000242212536405625017207 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_TEST_CLIENT_SUITE_H #define _GUAC_TEST_CLIENT_SUITE_H #include "config.h" int register_client_suite(); void test_layer_pool(); void test_buffer_pool(); #endif guacamole-server-0.9.9/tests/client/layer_pool.c0000664000175100017510000000470512536405625016666 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client_suite.h" #include #include #include void test_layer_pool() { guac_client* client; int i; int seen[GUAC_BUFFER_POOL_INITIAL_SIZE] = {0}; guac_layer* layer; /* Get client */ client = guac_client_alloc(); CU_ASSERT_PTR_NOT_NULL_FATAL(client); /* Fill pool */ for (i=0; iindex > 0); CU_ASSERT_FATAL(layer->index <= GUAC_BUFFER_POOL_INITIAL_SIZE); /* This should be a layer we have not seen yet */ CU_ASSERT_FALSE(seen[layer->index - 1]); seen[layer->index - 1] = 1; guac_client_free_layer(client, layer); } /* Now that pool is filled, we should get a previously seen layer */ layer = guac_client_alloc_layer(client); CU_ASSERT_FATAL(layer->index > 0); CU_ASSERT_FATAL(layer->index <= GUAC_BUFFER_POOL_INITIAL_SIZE); CU_ASSERT_TRUE(seen[layer->index - 1]); /* Free client */ guac_client_free(client); } guacamole-server-0.9.9/tests/client/buffer_pool.c0000664000175100017510000000471512536405625017024 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client_suite.h" #include #include #include void test_buffer_pool() { guac_client* client; int i; int seen[GUAC_BUFFER_POOL_INITIAL_SIZE] = {0}; guac_layer* layer; /* Get client */ client = guac_client_alloc(); CU_ASSERT_PTR_NOT_NULL_FATAL(client); /* Fill pool */ for (i=0; iindex < 0); CU_ASSERT_FATAL(layer->index >= -GUAC_BUFFER_POOL_INITIAL_SIZE); /* This should be a layer we have not seen yet */ CU_ASSERT_FALSE(seen[-layer->index - 1]); seen[-layer->index - 1] = 1; guac_client_free_buffer(client, layer); } /* Now that pool is filled, we should get a previously seen layer */ layer = guac_client_alloc_buffer(client); CU_ASSERT_FATAL(layer->index < 0); CU_ASSERT_FATAL(layer->index >= -GUAC_BUFFER_POOL_INITIAL_SIZE); CU_ASSERT_TRUE(seen[-layer->index - 1]); /* Free client */ guac_client_free(client); } guacamole-server-0.9.9/tests/client/client_suite.c0000664000175100017510000000340712536405625017206 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client_suite.h" #include int client_suite_init() { return 0; } int client_suite_cleanup() { return 0; } int register_client_suite() { /* Add client test suite */ CU_pSuite suite = CU_add_suite("client", client_suite_init, client_suite_cleanup); if (suite == NULL) { CU_cleanup_registry(); return CU_get_error(); } /* Add tests */ if ( CU_add_test(suite, "layer-pool", test_layer_pool) == NULL || CU_add_test(suite, "buffer-pool", test_buffer_pool) == NULL ) { CU_cleanup_registry(); return CU_get_error(); } return 0; } guacamole-server-0.9.9/tests/test_libguac.c0000664000175100017510000000323712536405625015707 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client/client_suite.h" #include "common/common_suite.h" #include "protocol/suite.h" #include "util/util_suite.h" #include int main() { /* Init registry */ if (CU_initialize_registry() != CUE_SUCCESS) return CU_get_error(); /* Register suites */ register_protocol_suite(); register_client_suite(); register_util_suite(); register_common_suite(); /* Run tests */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return CU_get_error(); } guacamole-server-0.9.9/tests/Makefile.am0000664000175100017510000000416012626133327015123 00000000000000# # Copyright (C) 2015 Glyptodon LLC # # 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. # AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 TESTS = test_libguac check_PROGRAMS = test_libguac noinst_HEADERS = \ client/client_suite.h \ common/common_suite.h \ protocol/suite.h \ util/util_suite.h test_libguac_SOURCES = \ test_libguac.c \ client/client_suite.c \ client/buffer_pool.c \ client/layer_pool.c \ common/common_suite.c \ common/guac_iconv.c \ common/guac_string.c \ common/guac_rect.c \ protocol/suite.c \ protocol/base64_decode.c \ protocol/instruction_parse.c \ protocol/instruction_read.c \ protocol/instruction_write.c \ protocol/nest_write.c \ util/util_suite.c \ util/guac_pool.c \ util/guac_unicode.c test_libguac_CFLAGS = \ -Werror -Wall -pedantic \ @COMMON_INCLUDE@ \ @LIBGUAC_INCLUDE@ test_libguac_LDADD = \ @COMMON_LTLIB@ \ @CUNIT_LIBS@ \ @LIBGUAC_LTLIB@ guacamole-server-0.9.9/tests/util/0000775000175100017510000000000012645400336014121 500000000000000guacamole-server-0.9.9/tests/util/util_suite.h0000664000175100017510000000473312536405625016414 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_TEST_UTIL_SUITE_H #define _GUAC_TEST_UTIL_SUITE_H /** * Test suite containing unit tests for utility functions built into libguac. * These utility functions are included for convenience rather as integral * requirements of the core. * * @file util_suite.h */ #include "config.h" /** * A single Unicode character encoded as one byte with UTF-8. */ #define UTF8_1b "g" /** * A single Unicode character encoded as two bytes with UTF-8. */ #define UTF8_2b "\xc4\xa3" /** * A single Unicode character encoded as three bytes with UTF-8. */ #define UTF8_3b "\xe7\x8a\xac" /** * A single Unicode character encoded as four bytes with UTF-8. */ #define UTF8_4b "\xf0\x90\x84\xa3" /** * Registers the utility test suite with CUnit. */ int register_util_suite(); /** * Unit test for the guac_pool structure and related functions. The guac_pool * structure provides a consistent source of pooled integers. This unit test * checks that the associated functions behave as documented (returning * integers in the proper order, allocating new integers as necessary, etc.). */ void test_guac_pool(); /** * Unit test for libguac's Unicode convenience functions. This test checks that * the functions provided for determining string length, character length, and * for reading and writing UTF-8 behave as specified in the documentation. */ void test_guac_unicode(); #endif guacamole-server-0.9.9/tests/util/util_suite.c0000664000175100017510000000340312536405625016400 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "util_suite.h" #include int util_suite_init() { return 0; } int util_suite_cleanup() { return 0; } int register_util_suite() { /* Add util test suite */ CU_pSuite suite = CU_add_suite("util", util_suite_init, util_suite_cleanup); if (suite == NULL) { CU_cleanup_registry(); return CU_get_error(); } /* Add tests */ if ( CU_add_test(suite, "guac-pool", test_guac_pool) == NULL || CU_add_test(suite, "guac-unicode", test_guac_unicode) == NULL ) { CU_cleanup_registry(); return CU_get_error(); } return 0; } guacamole-server-0.9.9/tests/util/guac_unicode.c0000664000175100017510000000661112536405625016643 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "util_suite.h" #include #include void test_guac_unicode() { int codepoint; char buffer[16]; /* Test character length */ CU_ASSERT_EQUAL(1, guac_utf8_charsize(UTF8_1b[0])); CU_ASSERT_EQUAL(2, guac_utf8_charsize(UTF8_2b[0])); CU_ASSERT_EQUAL(3, guac_utf8_charsize(UTF8_3b[0])); CU_ASSERT_EQUAL(4, guac_utf8_charsize(UTF8_4b[0])); /* Test string length */ CU_ASSERT_EQUAL(0, guac_utf8_strlen("")); CU_ASSERT_EQUAL(1, guac_utf8_strlen(UTF8_4b)); CU_ASSERT_EQUAL(2, guac_utf8_strlen(UTF8_4b UTF8_1b)); CU_ASSERT_EQUAL(2, guac_utf8_strlen(UTF8_2b UTF8_3b)); CU_ASSERT_EQUAL(3, guac_utf8_strlen(UTF8_1b UTF8_3b UTF8_4b)); CU_ASSERT_EQUAL(3, guac_utf8_strlen(UTF8_2b UTF8_1b UTF8_3b)); CU_ASSERT_EQUAL(3, guac_utf8_strlen(UTF8_4b UTF8_2b UTF8_1b)); CU_ASSERT_EQUAL(3, guac_utf8_strlen(UTF8_3b UTF8_4b UTF8_2b)); CU_ASSERT_EQUAL(5, guac_utf8_strlen("hello")); CU_ASSERT_EQUAL(9, guac_utf8_strlen("guacamole")); /* Test writes */ CU_ASSERT_EQUAL(1, guac_utf8_write(0x00065, &(buffer[0]), 10)); CU_ASSERT_EQUAL(2, guac_utf8_write(0x00654, &(buffer[1]), 9)); CU_ASSERT_EQUAL(3, guac_utf8_write(0x00876, &(buffer[3]), 7)); CU_ASSERT_EQUAL(4, guac_utf8_write(0x12345, &(buffer[6]), 4)); CU_ASSERT_EQUAL(0, guac_utf8_write(0x00066, &(buffer[10]), 0)); /* Test result of write */ CU_ASSERT(memcmp("\x65", &(buffer[0]), 1) == 0); /* U+0065 */ CU_ASSERT(memcmp("\xD9\x94", &(buffer[1]), 2) == 0); /* U+0654 */ CU_ASSERT(memcmp("\xE0\xA1\xB6", &(buffer[3]), 3) == 0); /* U+0876 */ CU_ASSERT(memcmp("\xF0\x92\x8D\x85", &(buffer[6]), 4) == 0); /* U+12345 */ /* Test reads */ CU_ASSERT_EQUAL(1, guac_utf8_read(&(buffer[0]), 10, &codepoint)); CU_ASSERT_EQUAL(0x0065, codepoint); CU_ASSERT_EQUAL(2, guac_utf8_read(&(buffer[1]), 9, &codepoint)); CU_ASSERT_EQUAL(0x0654, codepoint); CU_ASSERT_EQUAL(3, guac_utf8_read(&(buffer[3]), 7, &codepoint)); CU_ASSERT_EQUAL(0x0876, codepoint); CU_ASSERT_EQUAL(4, guac_utf8_read(&(buffer[6]), 4, &codepoint)); CU_ASSERT_EQUAL(0x12345, codepoint); CU_ASSERT_EQUAL(0, guac_utf8_read(&(buffer[10]), 0, &codepoint)); CU_ASSERT_EQUAL(0x12345, codepoint); } guacamole-server-0.9.9/tests/util/guac_pool.c0000664000175100017510000000521412536405625016164 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "util_suite.h" #include #include #define UNSEEN 0 #define SEEN_PHASE_1 1 #define SEEN_PHASE_2 2 #define POOL_SIZE 128 void test_guac_pool() { guac_pool* pool; int i; int seen[POOL_SIZE] = {0}; int value; /* Get pool */ pool = guac_pool_alloc(POOL_SIZE); CU_ASSERT_PTR_NOT_NULL_FATAL(pool); /* Fill pool */ for (i=0; i= 0); CU_ASSERT_FATAL(value < POOL_SIZE); /* This should be an integer we have not seen yet */ CU_ASSERT_EQUAL(UNSEEN, seen[value]); seen[value] = SEEN_PHASE_1; /* Return value to pool */ guac_pool_free_int(pool, value); } /* Now that pool is filled, we should get ONLY previously seen integers */ for (i=0; i= 0); CU_ASSERT_FATAL(value < POOL_SIZE); /* This should be an integer we have seen already */ CU_ASSERT_EQUAL(SEEN_PHASE_1, seen[value]); seen[value] = SEEN_PHASE_2; } /* Pool is filled to minimum now. Next value should be equal to size. */ value = guac_pool_next_int(pool); CU_ASSERT_EQUAL(POOL_SIZE, value); /* Free pool */ guac_pool_free(pool); } guacamole-server-0.9.9/depcomp0000755000175100017510000005601612645400276013310 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2013 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: guacamole-server-0.9.9/doc/0000775000175100017510000000000012645400336012547 500000000000000guacamole-server-0.9.9/doc/Doxyfile0000664000175100017510000000142312637656315014210 00000000000000 # # Project name / version # PROJECT_NAME = libguac PROJECT_NUMBER = 0.9.9 # # Warn about undocumented parameters and return values, but do not fill output # with verbose progress info. # QUIET = YES WARN_NO_PARAMDOC = YES # # Output format # ALPHABETICAL_INDEX = YES GENERATE_HTML = YES GENERATE_LATEX = NO IGNORE_PREFIX = guac_ vguac_ OPTIMIZE_OUTPUT_FOR_C = YES OUTPUT_DIRECTORY = doxygen-output RECURSIVE = YES SHOW_INCLUDE_FILES = NO # # Input format # CASE_SENSE_NAMES = YES EXCLUDE_SYMBOLS = __* guac_palette* FILE_PATTERNS = *.h INPUT = ../src/libguac/guacamole JAVADOC_AUTOBRIEF = YES STRIP_FROM_PATH = ../src/libguac TAB_SIZE = 4 TYPEDEF_HIDES_STRUCT = YES guacamole-server-0.9.9/src/0000775000175100017510000000000012645400336012571 500000000000000guacamole-server-0.9.9/src/terminal/0000775000175100017510000000000012645400336014404 500000000000000guacamole-server-0.9.9/src/terminal/cursor.c0000664000175100017510000000372412643542623016017 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "cursor.h" #include #include #include guac_terminal_cursor* guac_terminal_cursor_alloc(guac_client* client) { /* Alloc new cursor, initialize buffer */ guac_terminal_cursor* cursor = malloc(sizeof(guac_terminal_cursor)); cursor->buffer = guac_client_alloc_buffer(client); return cursor; } void guac_terminal_cursor_free(guac_client* client, guac_terminal_cursor* cursor) { /* Free buffer */ guac_client_free_buffer(client, cursor->buffer); /* Free cursor */ free(cursor); } void guac_terminal_set_cursor(guac_client* client, guac_terminal_cursor* cursor) { /* Set cursor */ guac_protocol_send_cursor(client->socket, cursor->hotspot_x, cursor->hotspot_y, cursor->buffer, 0, 0, cursor->width, cursor->height); } guacamole-server-0.9.9/src/terminal/char_mappings.c0000664000175100017510000001510712536405625017314 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" const int vt100_map[] = { ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', 0x25C6, 0x2592, 0x2409, 0x240C, 0x240D, 0x240A, 0x00B0, 0x00B1, 0x2424, 0x240B, 0x2518, 0x2510, 0x250C, 0x2514, 0x253C, 0x23BA, 0x23BB, 0x2500, 0x23BC, 0x23BD, 0x251C, 0x2524, 0x2534, 0x252C, 0x2502, 0x2264, 0x2265, 0x03C0, 0x2260, 0x00A3, 0x00B7, 0x007F, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF }; const int null_map[] = { ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', 0x007F, 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x000A }; const int user_map[] = { ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', 0x00A7, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 0x00C4, 0x00D6, 0x00DC, '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 0x00E4, 0x00F6, 0x00FC, 0x00DF, 0x007F, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF }; guacamole-server-0.9.9/src/terminal/ibar.c0000664000175100017510000000566112643542623015421 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "cursor.h" #include #include #include #include /* Macros for prettying up the embedded image. */ #define X 0x00,0x00,0x00,0xFF #define U 0x80,0x80,0x80,0xFF #define O 0xFF,0xFF,0xFF,0xFF #define _ 0x00,0x00,0x00,0x00 /* Dimensions */ const int guac_terminal_ibar_width = 7; const int guac_terminal_ibar_height = 16; /* Format */ const cairo_format_t guac_terminal_ibar_format = CAIRO_FORMAT_ARGB32; const int guac_terminal_ibar_stride = 28; /* Embedded pointer graphic */ unsigned char guac_terminal_ibar[] = { X,X,X,X,X,X,X, X,O,O,U,O,O,X, X,X,X,O,X,X,X, _,_,X,O,X,_,_, _,_,X,O,X,_,_, _,_,X,O,X,_,_, _,_,X,O,X,_,_, _,_,X,O,X,_,_, _,_,X,O,X,_,_, _,_,X,O,X,_,_, _,_,X,O,X,_,_, _,_,X,O,X,_,_, _,_,X,O,X,_,_, X,X,X,O,X,X,X, X,O,O,U,O,O,X, X,X,X,X,X,X,X }; guac_terminal_cursor* guac_terminal_create_ibar(guac_client* client) { guac_socket* socket = client->socket; guac_terminal_cursor* cursor = guac_terminal_cursor_alloc(client); /* Draw to buffer */ cairo_surface_t* graphic = cairo_image_surface_create_for_data( guac_terminal_ibar, guac_terminal_ibar_format, guac_terminal_ibar_width, guac_terminal_ibar_height, guac_terminal_ibar_stride); guac_client_stream_png(client, socket, GUAC_COMP_SRC, cursor->buffer, 0, 0, graphic); cairo_surface_destroy(graphic); /* Initialize cursor properties */ cursor->width = guac_terminal_ibar_width; cursor->height = guac_terminal_ibar_height; cursor->hotspot_x = guac_terminal_ibar_width / 2; cursor->hotspot_y = guac_terminal_ibar_height / 2; return cursor; } guacamole-server-0.9.9/src/terminal/common.h0000664000175100017510000000477512626133327016004 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_TERMINAL_COMMON_H #define _GUAC_TERMINAL_COMMON_H #include "config.h" #include /** * Returns the closest value to the value given that is also * within the given range. */ int guac_terminal_fit_to_range(int value, int min, int max); /** * Encodes the given codepoint as UTF-8, storing the result within the * provided buffer, and returning the number of bytes stored. */ int guac_terminal_encode_utf8(int codepoint, char* utf8); /** * Returns whether a codepoint has a corresponding glyph, or is rendered * as a blank space. */ bool guac_terminal_has_glyph(int codepoint); /** * Similar to write, but automatically retries the write operation until * an error occurs. */ int guac_terminal_write_all(int fd, const char* buffer, int size); /** * Similar to read, but automatically retries the read until an error occurs, * filling all available space within the buffer. Unless it is known that the * given amount of space is available on the file descriptor, there is a good * chance this function will block. * * @param fd * The file descriptor to read data from. * * @param buffer * The buffer to store data within. * * @param size * The number of bytes available within the buffer. * * @return * The number of bytes read if successful, or a negative value if an error * occurs. */ int guac_terminal_fill_buffer(int fd, char* buffer, int size); #endif guacamole-server-0.9.9/src/terminal/terminal.h0000664000175100017510000004377112645364210016324 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_TERMINAL_H #define _GUAC_TERMINAL_H #include "config.h" #include "buffer.h" #include "cursor.h" #include "display.h" #include "guac_clipboard.h" #include "scrollbar.h" #include "types.h" #include #include #include #include /** * The maximum duration of a single frame, in milliseconds. */ #define GUAC_TERMINAL_FRAME_DURATION 40 /** * The maximum amount of time to wait for more data before declaring a frame * complete, in milliseconds. */ #define GUAC_TERMINAL_FRAME_TIMEOUT 10 /** * The maximum number of custom tab stops. */ #define GUAC_TERMINAL_MAX_TABS 16 /** * The number of rows to scroll per scroll wheel event. */ #define GUAC_TERMINAL_WHEEL_SCROLL_AMOUNT 3 /** * The maximum number of bytes to allow within the clipboard. */ #define GUAC_TERMINAL_CLIPBOARD_MAX_LENGTH 262144 /** * The name of the color scheme having black foreground and white background. */ #define GUAC_TERMINAL_SCHEME_BLACK_WHITE "black-white" /** * The name of the color scheme having gray foreground and black background. */ #define GUAC_TERMINAL_SCHEME_GRAY_BLACK "gray-black" /** * The name of the color scheme having green foreground and black background. */ #define GUAC_TERMINAL_SCHEME_GREEN_BLACK "green-black" /** * The name of the color scheme having white foreground and black background. */ #define GUAC_TERMINAL_SCHEME_WHITE_BLACK "white-black" typedef struct guac_terminal guac_terminal; /** * Handler for characters printed to the terminal. When a character is printed, * the current char handler for the terminal is called and given that * character. */ typedef int guac_terminal_char_handler(guac_terminal* term, unsigned char c); /** * Handler for setting the destination path for file uploads. */ typedef void guac_terminal_upload_path_handler(guac_client* client, char* path); /** * Handler for creating an outbound file download stream for a specified file. */ typedef guac_stream* guac_terminal_file_download_handler(guac_client* client, char* filename); /** * Represents a terminal emulator which uses a given Guacamole client to * render itself. */ struct guac_terminal { /** * The Guacamole client this terminal emulator will use for rendering. */ guac_client* client; /** * Called whenever the necessary terminal codes are sent to change * the path for future file uploads. */ guac_terminal_upload_path_handler* upload_path_handler; /** * Called whenever the necessary terminal codes are sent to initiate * a download of a given remote file. */ guac_terminal_file_download_handler* file_download_handler; /** * Lock which restricts simultaneous access to this terminal via the root * guac_terminal_* functions. */ pthread_mutex_t lock; /** * Pipe which should be written to (and read from) to provide output to * this terminal. Another thread should read from this pipe when writing * data to the terminal. It would make sense for the terminal to provide * this thread, but for simplicity, that logic is left to the guac * message handler (to give the message handler something to block with). */ int stdout_pipe_fd[2]; /** * Pipe which will be the source of user input. When a terminal code * generates synthesized user input, that data will be written to * this pipe. */ int stdin_pipe_fd[2]; /** * Graphical representation of the current scroll state. */ guac_terminal_scrollbar* scrollbar; /** * The relative offset of the display. A positive value indicates that * many rows have been scrolled into view, zero indicates that no * scrolling has occurred. Negative values are illegal. */ int scroll_offset; /** * The width of the terminal, in characters. */ int term_width; /** * The height of the terminal, in characters. */ int term_height; /** * The index of the first row in the scrolling region. */ int scroll_start; /** * The index of the last row in the scrolling region. */ int scroll_end; /** * The current row location of the cursor. */ int cursor_row; /** * The current column location of the cursor. */ int cursor_col; /** * The row of the rendered cursor. */ int visible_cursor_row; /** * The column of the rendered cursor. */ int visible_cursor_col; /** * The row of the saved cursor (ESC 7). */ int saved_cursor_row; /** * The column of the saved cursor (ESC 7). */ int saved_cursor_col; /** * The attributes which will be applied to future characters. */ guac_terminal_attributes current_attributes; /** * The character whose attributes dictate the default attributes * of all characters. When new screen space is allocated, this * character fills the gaps. */ guac_terminal_char default_char; /** * Handler which will receive all printed characters, updating the terminal * accordingly. */ guac_terminal_char_handler* char_handler; /** * The difference between the currently-rendered screen and the current * state of the terminal. */ guac_terminal_display* display; /** * Current terminal display state. All characters present on the screen * are within this buffer. This has nothing to do with the display, which * facilitates transfer of a set of changes to the remote display. */ guac_terminal_buffer* buffer; /** * Automatically place a tabstop every N characters. If zero, then no * tabstops exist automatically. */ int tab_interval; /** * Array of all tabs set. Each entry is the column number of a tab + 1, * or 0 if that tab cell is unset. */ int custom_tabs[GUAC_TERMINAL_MAX_TABS]; /** * Array of arrays of mapped characters, where the character N is located at the N-32 * position within the array. Each element in a contained array is the corresponding Unicode * codepoint. If NULL, a direct mapping from Unicode is used. The entries of the main array * correspond to the character set in use (G0, G1, etc.) */ const int* char_mapping[2]; /** * The active character set. For example, 0 for G0, 1 for G1, etc. */ int active_char_set; /** * Whether text is being selected. */ bool text_selected; /** * The row that the selection starts at. */ int selection_start_row; /** * The column that the selection starts at. */ int selection_start_column; /** * The width of the character at selection start. */ int selection_start_width; /** * The row that the selection ends at. */ int selection_end_row; /** * The column that the selection ends at. */ int selection_end_column; /** * The width of the character at selection end. */ int selection_end_width; /** * Whether the cursor (arrow) keys should send cursor sequences * or application sequences (DECCKM). */ bool application_cursor_keys; /** * Whether a CR should automatically follow a LF, VT, or FF. */ bool automatic_carriage_return; /** * Whether insert mode is enabled (DECIM). */ bool insert_mode; /** * Whether the alt key is currently being held down. */ int mod_alt; /** * Whether the control key is currently being held down. */ int mod_ctrl; /** * Whether the shift key is currently being held down. */ int mod_shift; /** * The current mouse button state. */ int mouse_mask; /** * The cached pointer cursor. */ guac_terminal_cursor* pointer_cursor; /** * The cached I-bar cursor. */ guac_terminal_cursor* ibar_cursor; /** * The cached invisible (blank) cursor. */ guac_terminal_cursor* blank_cursor; /** * The current cursor, used to avoid re-setting the cursor. */ guac_terminal_cursor* current_cursor; /** * The current contents of the clipboard. */ guac_common_clipboard* clipboard; }; /** * Creates a new guac_terminal, having the given width and height, and * rendering to the given client. * * @param client * The client to which the terminal will be rendered. * * @param font_name * The name of the font to use when rendering glyphs. * * @param font_size * The size of each glyph, in points. * * @param dpi * The DPI of the display. The given font size will be adjusted to produce * glyphs at the given DPI. * * @param width * The width of the terminal, in pixels. * * @param height * The height of the terminal, in pixels. * * @param color_scheme * The name of the color scheme to use. This string must be one of the * names defined by the GUAC_TERMINAL_SCHEME_* constants. If blank or NULL, * the default scheme of GUAC_TERMINAL_SCHEME_GRAY_BLACK will be used. If * invalid, a warning will be logged, and the terminal will fall back on * GUAC_TERMINAL_SCHEME_GRAY_BLACK. * * @return * A new guac_terminal having the given font, dimensions, and attributes * which renders all text to the given client. */ guac_terminal* guac_terminal_create(guac_client* client, const char* font_name, int font_size, int dpi, int width, int height, const char* color_scheme); /** * Frees all resources associated with the given terminal. */ void guac_terminal_free(guac_terminal* term); /** * Renders a single frame of terminal data. If data is not yet available, * this function will block until data is written. */ int guac_terminal_render_frame(guac_terminal* terminal); /** * Reads from this terminal's STDIN. Input comes from key and mouse events * supplied by calls to guac_terminal_send_key() and * guac_terminal_send_mouse(). If input is not yet available, this function * will block. */ int guac_terminal_read_stdin(guac_terminal* terminal, char* c, int size); /** * Writes to this terminal's STDOUT. This function may block until space * is freed in the output buffer by guac_terminal_render_frame(). */ int guac_terminal_write_stdout(guac_terminal* terminal, const char* c, int size); /** * Notifies the terminal that an event has occurred and the terminal should * flush itself when reasonable. * * @param terminal * The terminal to notify. * * @return * Zero if notification succeeded, non-zero if an error occurred while * notifying the terminal. */ int guac_terminal_notify(guac_terminal* terminal); /** * Reads a single line from this terminal's STDIN. Input is retrieved in * the same manner as guac_terminal_read_stdin() and the same restrictions * apply. */ void guac_terminal_prompt(guac_terminal* terminal, const char* title, char* str, int size, bool echo); /** * Writes the given format string and arguments to this terminal's STDOUT in * the same manner as printf(). This function may block until space is * freed in the output buffer by guac_terminal_render_frame(). */ int guac_terminal_printf(guac_terminal* terminal, const char* format, ...); /** * Handles the given key event, sending data, scrolling, pasting clipboard * data, etc. as necessary. */ int guac_terminal_send_key(guac_terminal* term, int keysym, int pressed); /** * Handles the given mouse event, sending data, scrolling, pasting clipboard * data, etc. as necessary. */ int guac_terminal_send_mouse(guac_terminal* term, int x, int y, int mask); /** * Handles a scroll event received from the scrollbar associated with a * terminal. * * @param scrollbar * The scrollbar that has been scrolled. * * @param value * The new value that should be stored within the scrollbar, and * represented within the terminal display. */ void guac_terminal_scroll_handler(guac_terminal_scrollbar* scrollbar, int value); /** * Clears the current clipboard contents and sets the mimetype for future * contents. */ void guac_terminal_clipboard_reset(guac_terminal* term, const char* mimetype); /** * Appends the given data to the current clipboard. */ void guac_terminal_clipboard_append(guac_terminal* term, const void* data, int length); /* INTERNAL FUNCTIONS */ /** * Acquires exclusive access to the terminal. Note that enforcing this * exclusive access requires that ALL users of the terminal call this * function before making further calls to the terminal. */ void guac_terminal_lock(guac_terminal* terminal); /** * Releases exclusive access to the terminal. */ void guac_terminal_unlock(guac_terminal* terminal); /** * Resets the state of the given terminal, as if it were just allocated. */ void guac_terminal_reset(guac_terminal* term); /** * Writes the given string of characters to the terminal. */ int guac_terminal_write(guac_terminal* term, const char* c, int size); /** * Sets the character at the given row and column to the specified value. */ int guac_terminal_set(guac_terminal* term, int row, int col, int codepoint); /** * Clears the given region within a single row. */ int guac_terminal_clear_columns(guac_terminal* term, int row, int start_col, int end_col); /** * Clears the given region from right-to-left, top-to-bottom, replacing * all characters with the current background color and attributes. */ int guac_terminal_clear_range(guac_terminal* term, int start_row, int start_col, int end_row, int end_col); /** * Scrolls the terminal's current scroll region up by one row. */ int guac_terminal_scroll_up(guac_terminal* term, int start_row, int end_row, int amount); /** * Scrolls the terminal's current scroll region down by one row. */ int guac_terminal_scroll_down(guac_terminal* term, int start_row, int end_row, int amount); /** * Commits the current cursor location, updating the visible cursor * on the screen. */ void guac_terminal_commit_cursor(guac_terminal* term); /** * Scroll down the display by the given amount, replacing the new space with * data from the buffer. If not enough data is available, the maximum * amount will be scrolled. */ void guac_terminal_scroll_display_down(guac_terminal* terminal, int amount); /** * Scroll up the display by the given amount, replacing the new space with data * from either the buffer or the terminal buffer. If not enough data is * available, the maximum amount will be scrolled. */ void guac_terminal_scroll_display_up(guac_terminal* terminal, int amount); /** * Marks the start of text selection at the given row and column. */ void guac_terminal_select_start(guac_terminal* terminal, int row, int column); /** * Updates the end of text selection at the given row and column. */ void guac_terminal_select_update(guac_terminal* terminal, int row, int column); /** * Ends text selection, removing any highlight. Character data is stored in the * string buffer provided. */ void guac_terminal_select_end(guac_terminal* terminal, char* string); /* LOW-LEVEL TERMINAL OPERATIONS */ /** * Copies the given range of columns to a new location, offset from * the original by the given number of columns. */ void guac_terminal_copy_columns(guac_terminal* terminal, int row, int start_column, int end_column, int offset); /** * Copies the given range of rows to a new location, offset from the * original by the given number of rows. */ void guac_terminal_copy_rows(guac_terminal* terminal, int start_row, int end_row, int offset); /** * Sets the given range of columns within the given row to the given * character. */ void guac_terminal_set_columns(guac_terminal* terminal, int row, int start_column, int end_column, guac_terminal_char* character); /** * Resize the terminal to the given dimensions. */ int guac_terminal_resize(guac_terminal* term, int width, int height); /** * Flushes all pending operations within the given guac_terminal. */ void guac_terminal_flush(guac_terminal* terminal); /** * Sends the given string as if typed by the user. */ int guac_terminal_send_data(guac_terminal* term, const char* data, int length); /** * Sends the given string as if typed by the user. */ int guac_terminal_send_string(guac_terminal* term, const char* data); /** * Sends data through STDIN as if typed by the user, using the format * string given and any args (similar to printf). */ int guac_terminal_sendf(guac_terminal* term, const char* format, ...); /** * Sets a tabstop in the given column. */ void guac_terminal_set_tab(guac_terminal* term, int column); /** * Removes the tabstop at the given column. */ void guac_terminal_unset_tab(guac_terminal* term, int column); /** * Removes all tabstops. */ void guac_terminal_clear_tabs(guac_terminal* term); /** * Given a column within the given terminal, returns the location of the * next tabstop (or the rightmost character, if no more tabstops exist). */ int guac_terminal_next_tab(guac_terminal* term, int column); #endif guacamole-server-0.9.9/src/terminal/blank.c0000664000175100017510000000350512643542623015566 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "cursor.h" #include #include #include #include guac_terminal_cursor* guac_terminal_create_blank(guac_client* client) { guac_socket* socket = client->socket; guac_terminal_cursor* cursor = guac_terminal_cursor_alloc(client); /* Set buffer to a single 1x1 transparent rectangle */ guac_protocol_send_rect(socket, cursor->buffer, 0, 0, 1, 1); guac_protocol_send_cfill(socket, GUAC_COMP_SRC, cursor->buffer, 0x00, 0x00, 0x00, 0x00); /* Initialize cursor properties */ cursor->width = 1; cursor->height = 1; cursor->hotspot_x = 0; cursor->hotspot_y = 0; return cursor; } guacamole-server-0.9.9/src/terminal/ibar.h0000664000175100017510000000404312643542623015417 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_TERMINAL_IBAR_H #define _GUAC_TERMINAL_IBAR_H #include "config.h" #include #include /** * Width of the embedded mouse cursor graphic. */ extern const int guac_terminal_ibar_width; /** * Height of the embedded mouse cursor graphic. */ extern const int guac_terminal_ibar_height; /** * Number of bytes in each row of the embedded mouse cursor graphic. */ extern const int guac_terminal_ibar_stride; /** * The Cairo grapic format of the mouse cursor graphic. */ extern const cairo_format_t guac_terminal_ibar_format; /** * Embedded mouse cursor graphic. */ extern unsigned char guac_terminal_ibar[]; /** * Creates a new I-bar cursor, returning the corresponding cursor object. * * @param client The guac_client to send the cursor to. * @return A new cursor which must be free'd via guac_terminal_cursor_free()/ */ guac_terminal_cursor* guac_terminal_create_ibar(guac_client* client); #endif guacamole-server-0.9.9/src/terminal/packet.h0000664000175100017510000000566712626133327015764 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 GUAC_TERMINAL_PACKET_H #define GUAC_TERMINAL_PACKET_H /** * The maximum size of a packet written or read by the * guac_terminal_packet_write() or guac_terminal_packet_read() functions. */ #define GUAC_TERMINAL_PACKET_SIZE 4096 /** * An arbitrary data packet with minimal framing. */ typedef struct guac_terminal_packet { /** * The number of bytes in the data portion of this packet. */ int length; /** * Arbitrary data. */ char data[GUAC_TERMINAL_PACKET_SIZE]; } guac_terminal_packet; /** * Writes a single packet of data to the given file descriptor. The provided * length MUST be no greater than GUAC_TERMINAL_PACKET_SIZE. Zero-length * writes are legal and do result in a packet being written to the file * descriptor. * * @param fd * The file descriptor to write to. * * @param data * A buffer containing the data to write. * * @param length * The number of bytes to write to the file descriptor. * * @return * The number of bytes written on success, which may be zero if the data * length is zero, or a negative value on error. */ int guac_terminal_packet_write(int fd, const void* data, int length); /** * Reads a single packet of data from the given file descriptor. The provided * length MUST be at least GUAC_TERMINAL_PACKET_SIZE to ensure any packet * read will fit in the buffer. Zero-length reads are possible if a zero-length * packet was written. * * @param fd * The file descriptor to read from. * * @param data * The buffer to store data within. * * @param length * The number of bytes available within the buffer. * * @return * The number of bytes read on success, which may be zero if the read * packet had a length of zero, or a negative value on error. */ int guac_terminal_packet_read(int fd, void* data, int length); #endif guacamole-server-0.9.9/src/terminal/packet.c0000664000175100017510000000414012626133327015740 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "common.h" #include "packet.h" #include int guac_terminal_packet_write(int fd, const void* data, int length) { guac_terminal_packet out; /* Do not attempt to write packets beyond maximum size */ if (length > GUAC_TERMINAL_PACKET_SIZE) return -1; /* Calculate final packet length */ int packet_length = sizeof(int) + length; /* Copy data into packet */ out.length = length; memcpy(out.data, data, length); /* Write packet */ return guac_terminal_write_all(fd, (const char*) &out, packet_length); } int guac_terminal_packet_read(int fd, void* data, int length) { int bytes; /* Read buffers MUST be at least GUAC_TERMINAL_PACKET_SIZE */ if (length < GUAC_TERMINAL_PACKET_SIZE) return -1; /* Read length */ if (guac_terminal_fill_buffer(fd, (char*) &bytes, sizeof(int)) < 0) return -1; /* Read body */ if (guac_terminal_fill_buffer(fd, (char*) data, bytes) < 0) return -1; return bytes; } guacamole-server-0.9.9/src/terminal/terminal.c0000664000175100017510000015424312645364210016314 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "buffer.h" #include "blank.h" #include "common.h" #include "cursor.h" #include "display.h" #include "ibar.h" #include "guac_clipboard.h" #include "packet.h" #include "pointer.h" #include "scrollbar.h" #include "terminal.h" #include "terminal_handlers.h" #include "types.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** * Sets the given range of columns to the given character. */ static void __guac_terminal_set_columns(guac_terminal* terminal, int row, int start_column, int end_column, guac_terminal_char* character) { guac_terminal_display_set_columns(terminal->display, row + terminal->scroll_offset, start_column, end_column, character); guac_terminal_buffer_set_columns(terminal->buffer, row, start_column, end_column, character); } /** * Enforces a character break at the given edge, ensuring that the left side * of the edge is the final column of a character, and the right side of the * edge is the initial column of a DIFFERENT character. * * For a character in a column N, the left edge number is N, and the right * edge is N+1. */ static void __guac_terminal_force_break(guac_terminal* terminal, int row, int edge) { guac_terminal_buffer_row* buffer_row = guac_terminal_buffer_get_row(terminal->buffer, row, 0); /* Ensure character to left of edge is unbroken */ if (edge > 0) { int end_column = edge - 1; int start_column = end_column; guac_terminal_char* start_char = &(buffer_row->characters[start_column]); /* Determine start column */ while (start_column > 0 && start_char->value == GUAC_CHAR_CONTINUATION) { start_char--; start_column--; } /* Advance to start of broken character if necessary */ if (start_char->value != GUAC_CHAR_CONTINUATION && start_char->width < end_column - start_column + 1) { start_column += start_char->width; start_char += start_char->width; } /* Clear character if broken */ if (start_char->value == GUAC_CHAR_CONTINUATION || start_char->width != end_column - start_column + 1) { guac_terminal_char cleared_char; cleared_char.value = ' '; cleared_char.attributes = start_char->attributes; cleared_char.width = 1; __guac_terminal_set_columns(terminal, row, start_column, end_column, &cleared_char); } } /* Ensure character to right of edge is unbroken */ if (edge >= 0 && edge < buffer_row->length) { int start_column = edge; int end_column = start_column; guac_terminal_char* start_char = &(buffer_row->characters[start_column]); guac_terminal_char* end_char = &(buffer_row->characters[end_column]); /* Determine end column */ while (end_column+1 < buffer_row->length && (end_char+1)->value == GUAC_CHAR_CONTINUATION) { end_char++; end_column++; } /* Advance to start of broken character if necessary */ if (start_char->value != GUAC_CHAR_CONTINUATION && start_char->width < end_column - start_column + 1) { start_column += start_char->width; start_char += start_char->width; } /* Clear character if broken */ if (start_char->value == GUAC_CHAR_CONTINUATION || start_char->width != end_column - start_column + 1) { guac_terminal_char cleared_char; cleared_char.value = ' '; cleared_char.attributes = start_char->attributes; cleared_char.width = 1; __guac_terminal_set_columns(terminal, row, start_column, end_column, &cleared_char); } } } void guac_terminal_reset(guac_terminal* term) { int row; /* Set current state */ term->char_handler = guac_terminal_echo; term->active_char_set = 0; term->char_mapping[0] = term->char_mapping[1] = NULL; /* Reset cursor location */ term->cursor_row = term->visible_cursor_row = term->saved_cursor_row = 0; term->cursor_col = term->visible_cursor_col = term->saved_cursor_col = 0; /* Clear scrollback, buffer, and scroll region */ term->buffer->top = 0; term->buffer->length = 0; term->scroll_start = 0; term->scroll_end = term->term_height - 1; term->scroll_offset = 0; /* Reset scrollbar bounds */ guac_terminal_scrollbar_set_bounds(term->scrollbar, term->term_height - term->buffer->length, 0); guac_terminal_scrollbar_set_value(term->scrollbar, -term->scroll_offset); /* Reset flags */ term->text_selected = false; term->application_cursor_keys = false; term->automatic_carriage_return = false; term->insert_mode = false; /* Reset tabs */ term->tab_interval = 8; memset(term->custom_tabs, 0, sizeof(term->custom_tabs)); /* Clear terminal */ for (row=0; rowterm_height; row++) guac_terminal_set_columns(term, row, 0, term->term_width, &(term->default_char)); } /** * Paints or repaints the background of the terminal display. This painting * occurs beneath the actual terminal and scrollbar layers, and thus will not * overwrite any text or other content currently on the screen. This is only * necessary to paint over parts of the terminal background which may otherwise * be transparent (the default layer background). * * @param terminal * The terminal whose background should be painted or repainted. * * @param width * The width of the background to draw, in pixels. * * @param height * The height of the background to draw, in pixels. */ static void guac_terminal_paint_background(guac_terminal* terminal, int width, int height) { guac_terminal_display* display = terminal->display; guac_client* client = display->client; guac_socket* socket = client->socket; /* Get background color */ const guac_terminal_color* color = &guac_terminal_palette[display->default_background]; /* Paint background color */ guac_protocol_send_rect(socket, GUAC_DEFAULT_LAYER, 0, 0, width, height); guac_protocol_send_cfill(socket, GUAC_COMP_OVER, GUAC_DEFAULT_LAYER, color->red, color->green, color->blue, 0xFF); } guac_terminal* guac_terminal_create(guac_client* client, const char* font_name, int font_size, int dpi, int width, int height, const char* color_scheme) { int default_foreground; int default_background; /* Default to "gray-black" color scheme if no scheme provided */ if (color_scheme == NULL || color_scheme[0] == '\0') { default_foreground = GUAC_TERMINAL_COLOR_GRAY; default_background = GUAC_TERMINAL_COLOR_BLACK; } /* Otherwise, parse color scheme */ else if (strcmp(color_scheme, GUAC_TERMINAL_SCHEME_GRAY_BLACK) == 0) { default_foreground = GUAC_TERMINAL_COLOR_GRAY; default_background = GUAC_TERMINAL_COLOR_BLACK; } else if (strcmp(color_scheme, GUAC_TERMINAL_SCHEME_BLACK_WHITE) == 0) { default_foreground = GUAC_TERMINAL_COLOR_BLACK; default_background = GUAC_TERMINAL_COLOR_WHITE; } else if (strcmp(color_scheme, GUAC_TERMINAL_SCHEME_GREEN_BLACK) == 0) { default_foreground = GUAC_TERMINAL_COLOR_DARK_GREEN; default_background = GUAC_TERMINAL_COLOR_BLACK; } else if (strcmp(color_scheme, GUAC_TERMINAL_SCHEME_WHITE_BLACK) == 0) { default_foreground = GUAC_TERMINAL_COLOR_WHITE; default_background = GUAC_TERMINAL_COLOR_BLACK; } /* If invalid, default to "gray-black" */ else { guac_client_log(client, GUAC_LOG_WARNING, "Invalid color scheme: \"%s\". Defaulting to \"gray-black\".", color_scheme); default_foreground = GUAC_TERMINAL_COLOR_GRAY; default_background = GUAC_TERMINAL_COLOR_BLACK; } /* Build default character using default colors */ guac_terminal_char default_char = { .value = 0, .attributes = { .foreground = default_foreground, .background = default_background, .bold = false, .reverse = false, .underscore = false }, .width = 1 }; /* Calculate available display area */ int available_width = width - GUAC_TERMINAL_SCROLLBAR_WIDTH; if (available_width < 0) available_width = 0; guac_terminal* term = malloc(sizeof(guac_terminal)); term->client = client; term->upload_path_handler = NULL; term->file_download_handler = NULL; /* Init buffer */ term->buffer = guac_terminal_buffer_alloc(1000, &default_char); /* Init display */ term->display = guac_terminal_display_alloc(client, font_name, font_size, dpi, default_char.attributes.foreground, default_char.attributes.background); /* Fail if display init failed */ if (term->display == NULL) { guac_client_log(client, GUAC_LOG_DEBUG, "Display initialization failed"); free(term); return NULL; } /* Init terminal state */ term->current_attributes = default_char.attributes; term->default_char = default_char; term->term_width = available_width / term->display->char_width; term->term_height = height / term->display->char_height; /* Open STDOUT pipe */ if (pipe(term->stdout_pipe_fd)) { guac_error = GUAC_STATUS_SEE_ERRNO; guac_error_message = "Unable to open pipe for STDOUT"; free(term); return NULL; } /* Open STDIN pipe */ if (pipe(term->stdin_pipe_fd)) { guac_error = GUAC_STATUS_SEE_ERRNO; guac_error_message = "Unable to open pipe for STDIN"; free(term); return NULL; } /* Init terminal lock */ pthread_mutex_init(&(term->lock), NULL); /* Size display */ guac_protocol_send_size(term->display->client->socket, GUAC_DEFAULT_LAYER, width, height); guac_terminal_paint_background(term, width, height); guac_terminal_display_resize(term->display, term->term_width, term->term_height); /* Allocate scrollbar */ term->scrollbar = guac_terminal_scrollbar_alloc(term->client, GUAC_DEFAULT_LAYER, width, height, term->term_height); /* Associate scrollbar with this terminal */ term->scrollbar->data = term; term->scrollbar->scroll_handler = guac_terminal_scroll_handler; /* Init terminal */ guac_terminal_reset(term); term->mod_alt = term->mod_ctrl = term->mod_shift = 0; /* Set up mouse cursors */ term->pointer_cursor = guac_terminal_create_pointer(client); term->ibar_cursor = guac_terminal_create_ibar(client); term->blank_cursor = guac_terminal_create_blank(client); /* Initialize mouse cursor */ term->current_cursor = term->blank_cursor; guac_terminal_set_cursor(term->client, term->current_cursor); /* Allocate clipboard */ term->clipboard = guac_common_clipboard_alloc(GUAC_TERMINAL_CLIPBOARD_MAX_LENGTH); return term; } void guac_terminal_free(guac_terminal* term) { /* Close terminal output pipe */ close(term->stdout_pipe_fd[1]); close(term->stdout_pipe_fd[0]); /* Close user input pipe */ close(term->stdin_pipe_fd[1]); close(term->stdin_pipe_fd[0]); /* Free display */ guac_terminal_display_free(term->display); /* Free buffer */ guac_terminal_buffer_free(term->buffer); /* Free clipboard */ guac_common_clipboard_free(term->clipboard); /* Free scrollbar */ guac_terminal_scrollbar_free(term->scrollbar); /* Free cursors */ guac_terminal_cursor_free(term->client, term->pointer_cursor); guac_terminal_cursor_free(term->client, term->ibar_cursor); guac_terminal_cursor_free(term->client, term->blank_cursor); } /** * Waits for data to become available on the given file descriptor. * * @param fd * The file descriptor to wait on. * * @param msec_timeout * The maximum amount of time to wait, in milliseconds. * * @return * A positive if data is available, zero if the timeout has elapsed without * data becoming available, or negative if an error occurred. */ static int guac_terminal_wait_for_data(int fd, int msec_timeout) { /* Build fd_set */ fd_set fds; FD_ZERO(&fds); FD_SET(fd, &fds); /* Split millisecond timeout into seconds and microseconds */ struct timeval timeout = { .tv_sec = msec_timeout / 1000, .tv_usec = (msec_timeout % 1000) * 1000 }; /* Wait for data */ return select(fd+1, &fds, NULL, NULL, &timeout); } int guac_terminal_render_frame(guac_terminal* terminal) { guac_client* client = terminal->client; char buffer[GUAC_TERMINAL_PACKET_SIZE]; int wait_result; int fd = terminal->stdout_pipe_fd[0]; /* Wait for data to be available */ wait_result = guac_terminal_wait_for_data(fd, 1000); if (wait_result > 0) { guac_terminal_lock(terminal); guac_timestamp frame_start = guac_timestamp_current(); do { guac_timestamp frame_end; int frame_remaining; int bytes_read; /* Read data, write to terminal */ if ((bytes_read = guac_terminal_packet_read(fd, buffer, sizeof(buffer))) > 0) { if (guac_terminal_write(terminal, buffer, bytes_read)) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Error writing data"); guac_terminal_unlock(terminal); return 1; } } /* Notify on error */ if (bytes_read < 0) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Error reading data"); guac_terminal_unlock(terminal); return 1; } /* Calculate time remaining in frame */ frame_end = guac_timestamp_current(); frame_remaining = frame_start + GUAC_TERMINAL_FRAME_DURATION - frame_end; /* Wait again if frame remaining */ if (frame_remaining > 0) wait_result = guac_terminal_wait_for_data(fd, GUAC_TERMINAL_FRAME_TIMEOUT); else break; } while (wait_result > 0); /* Flush terminal */ guac_terminal_flush(terminal); guac_terminal_unlock(terminal); } /* Notify of any errors */ if (wait_result < 0) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Error waiting for data"); return 1; } return 0; } int guac_terminal_read_stdin(guac_terminal* terminal, char* c, int size) { int stdin_fd = terminal->stdin_pipe_fd[0]; return read(stdin_fd, c, size); } int guac_terminal_write_stdout(guac_terminal* terminal, const char* c, int size) { /* Write maximally-sized packets until only one packet remains */ while (size > GUAC_TERMINAL_PACKET_SIZE) { /* Write maximally-sized packet */ if (guac_terminal_packet_write(terminal->stdout_pipe_fd[1], c, GUAC_TERMINAL_PACKET_SIZE) < 0) return -1; /* Advance to next packet */ c += GUAC_TERMINAL_PACKET_SIZE; size -= GUAC_TERMINAL_PACKET_SIZE; } return guac_terminal_packet_write(terminal->stdout_pipe_fd[1], c, size); } int guac_terminal_notify(guac_terminal* terminal) { return guac_terminal_packet_write(terminal->stdout_pipe_fd[1], NULL, 0); } int guac_terminal_printf(guac_terminal* terminal, const char* format, ...) { int written; va_list ap; char buffer[1024]; /* Print to buffer */ va_start(ap, format); written = vsnprintf(buffer, sizeof(buffer)-1, format, ap); va_end(ap); if (written < 0) return written; /* Write to STDOUT */ return guac_terminal_write_stdout(terminal, buffer, written); } void guac_terminal_prompt(guac_terminal* terminal, const char* title, char* str, int size, bool echo) { int pos; char in_byte; /* Print title */ guac_terminal_printf(terminal, "%s", title); /* Make room for null terminator */ size--; /* Read bytes until newline */ pos = 0; while (pos < size && guac_terminal_read_stdin(terminal, &in_byte, 1) == 1) { /* Backspace */ if (in_byte == 0x7F) { if (pos > 0) { guac_terminal_printf(terminal, "\b \b"); pos--; } } /* CR (end of input */ else if (in_byte == 0x0D) { guac_terminal_printf(terminal, "\r\n"); break; } else { /* Store character, update buffers */ str[pos++] = in_byte; /* Print character if echoing */ if (echo) guac_terminal_printf(terminal, "%c", in_byte); else guac_terminal_printf(terminal, "*"); } } /* Terminate string */ str[pos] = 0; } int guac_terminal_set(guac_terminal* term, int row, int col, int codepoint) { int width; /* Build character with current attributes */ guac_terminal_char guac_char; guac_char.value = codepoint; guac_char.attributes = term->current_attributes; width = wcwidth(codepoint); if (width < 0) width = 1; guac_char.width = width; guac_terminal_set_columns(term, row, col, col + width - 1, &guac_char); return 0; } void guac_terminal_commit_cursor(guac_terminal* term) { guac_terminal_char* guac_char; guac_terminal_buffer_row* old_row; guac_terminal_buffer_row* new_row; /* If no change, done */ if (term->visible_cursor_row == term->cursor_row && term->visible_cursor_col == term->cursor_col) return; /* Get old and new rows with cursor */ new_row = guac_terminal_buffer_get_row(term->buffer, term->cursor_row, term->cursor_col+1); old_row = guac_terminal_buffer_get_row(term->buffer, term->visible_cursor_row, term->visible_cursor_col+1); /* Clear cursor */ guac_char = &(old_row->characters[term->visible_cursor_col]); guac_char->attributes.cursor = false; guac_terminal_display_set_columns(term->display, term->visible_cursor_row + term->scroll_offset, term->visible_cursor_col, term->visible_cursor_col, guac_char); /* Set cursor */ guac_char = &(new_row->characters[term->cursor_col]); guac_char->attributes.cursor = true; guac_terminal_display_set_columns(term->display, term->cursor_row + term->scroll_offset, term->cursor_col, term->cursor_col, guac_char); term->visible_cursor_row = term->cursor_row; term->visible_cursor_col = term->cursor_col; return; } int guac_terminal_write(guac_terminal* term, const char* c, int size) { while (size > 0) { term->char_handler(term, *(c++)); size--; } return 0; } int guac_terminal_scroll_up(guac_terminal* term, int start_row, int end_row, int amount) { /* If scrolling entire display, update scroll offset */ if (start_row == 0 && end_row == term->term_height - 1) { /* Scroll up visibly */ guac_terminal_display_copy_rows(term->display, start_row + amount, end_row, -amount); /* Advance by scroll amount */ term->buffer->top += amount; if (term->buffer->top >= term->buffer->available) term->buffer->top -= term->buffer->available; term->buffer->length += amount; if (term->buffer->length > term->buffer->available) term->buffer->length = term->buffer->available; /* Reset scrollbar bounds */ guac_terminal_scrollbar_set_bounds(term->scrollbar, term->term_height - term->buffer->length, 0); /* Update cursor location if within region */ if (term->visible_cursor_row >= start_row && term->visible_cursor_row <= end_row) term->visible_cursor_row -= amount; } /* Otherwise, just copy row data upwards */ else guac_terminal_copy_rows(term, start_row + amount, end_row, -amount); /* Clear new area */ guac_terminal_clear_range(term, end_row - amount + 1, 0, end_row, term->term_width - 1); return 0; } int guac_terminal_scroll_down(guac_terminal* term, int start_row, int end_row, int amount) { guac_terminal_copy_rows(term, start_row, end_row - amount, amount); /* Clear new area */ guac_terminal_clear_range(term, start_row, 0, start_row + amount - 1, term->term_width - 1); return 0; } int guac_terminal_clear_columns(guac_terminal* term, int row, int start_col, int end_col) { /* Build space */ guac_terminal_char blank; blank.value = 0; blank.attributes = term->current_attributes; blank.width = 1; /* Clear */ guac_terminal_set_columns(term, row, start_col, end_col, &blank); return 0; } int guac_terminal_clear_range(guac_terminal* term, int start_row, int start_col, int end_row, int end_col) { /* If not at far left, must clear sub-region to far right */ if (start_col > 0) { /* Clear from start_col to far right */ guac_terminal_clear_columns(term, start_row, start_col, term->term_width - 1); /* One less row to clear */ start_row++; } /* If not at far right, must clear sub-region to far left */ if (end_col < term->term_width - 1) { /* Clear from far left to end_col */ guac_terminal_clear_columns(term, end_row, 0, end_col); /* One less row to clear */ end_row--; } /* Remaining region now guaranteed rectangular. Clear, if possible */ if (start_row <= end_row) { int row; for (row=start_row; row<=end_row; row++) { /* Clear entire row */ guac_terminal_clear_columns(term, row, 0, term->term_width - 1); } } return 0; } void guac_terminal_scroll_display_down(guac_terminal* terminal, int scroll_amount) { int start_row, end_row; int dest_row; int row, column; /* Limit scroll amount by size of scrollback buffer */ if (scroll_amount > terminal->scroll_offset) scroll_amount = terminal->scroll_offset; /* If not scrolling at all, don't bother trying */ if (scroll_amount <= 0) return; /* Shift screen up */ if (terminal->term_height > scroll_amount) guac_terminal_display_copy_rows(terminal->display, scroll_amount, terminal->term_height - 1, -scroll_amount); /* Advance by scroll amount */ terminal->scroll_offset -= scroll_amount; guac_terminal_scrollbar_set_value(terminal->scrollbar, -terminal->scroll_offset); /* Get row range */ end_row = terminal->term_height - terminal->scroll_offset - 1; start_row = end_row - scroll_amount + 1; dest_row = terminal->term_height - scroll_amount; /* Draw new rows from scrollback */ for (row=start_row; row<=end_row; row++) { /* Get row from scrollback */ guac_terminal_buffer_row* buffer_row = guac_terminal_buffer_get_row(terminal->buffer, row, 0); /* Clear row */ guac_terminal_display_set_columns(terminal->display, dest_row, 0, terminal->display->width, &(terminal->default_char)); /* Draw row */ guac_terminal_char* current = buffer_row->characters; for (column=0; columnlength; column++) { /* Only draw if not blank */ if (guac_terminal_has_glyph(current->value)) guac_terminal_display_set_columns(terminal->display, dest_row, column, column, current); current++; } /* Next row */ dest_row++; } guac_terminal_notify(terminal); } void guac_terminal_scroll_display_up(guac_terminal* terminal, int scroll_amount) { int start_row, end_row; int dest_row; int row, column; /* Limit scroll amount by size of scrollback buffer */ if (terminal->scroll_offset + scroll_amount > terminal->buffer->length - terminal->term_height) scroll_amount = terminal->buffer->length - terminal->scroll_offset - terminal->term_height; /* If not scrolling at all, don't bother trying */ if (scroll_amount <= 0) return; /* Shift screen down */ if (terminal->term_height > scroll_amount) guac_terminal_display_copy_rows(terminal->display, 0, terminal->term_height - scroll_amount - 1, scroll_amount); /* Advance by scroll amount */ terminal->scroll_offset += scroll_amount; guac_terminal_scrollbar_set_value(terminal->scrollbar, -terminal->scroll_offset); /* Get row range */ start_row = -terminal->scroll_offset; end_row = start_row + scroll_amount - 1; dest_row = 0; /* Draw new rows from scrollback */ for (row=start_row; row<=end_row; row++) { /* Get row from scrollback */ guac_terminal_buffer_row* buffer_row = guac_terminal_buffer_get_row(terminal->buffer, row, 0); /* Clear row */ guac_terminal_display_set_columns(terminal->display, dest_row, 0, terminal->display->width, &(terminal->default_char)); /* Draw row */ guac_terminal_char* current = buffer_row->characters; for (column=0; columnlength; column++) { /* Only draw if not blank */ if (guac_terminal_has_glyph(current->value)) guac_terminal_display_set_columns(terminal->display, dest_row, column, column, current); current++; } /* Next row */ dest_row++; } guac_terminal_notify(terminal); } void guac_terminal_select_redraw(guac_terminal* terminal) { int start_row = terminal->selection_start_row + terminal->scroll_offset; int start_column = terminal->selection_start_column; int end_row = terminal->selection_end_row + terminal->scroll_offset; int end_column = terminal->selection_end_column; /* Update start/end columns to include character width */ if (start_row > end_row || (start_row == end_row && start_column > end_column)) start_column += terminal->selection_start_width - 1; else end_column += terminal->selection_end_width - 1; guac_terminal_display_select(terminal->display, start_row, start_column, end_row, end_column); } /** * Locates the beginning of the character at the given row and column, updating * the column to the starting column of that character. The width, if available, * is returned. If the character has no defined width, 1 is returned. */ static int __guac_terminal_find_char(guac_terminal* terminal, int row, int* column) { int start_column = *column; guac_terminal_buffer_row* buffer_row = guac_terminal_buffer_get_row(terminal->buffer, row, 0); if (start_column < buffer_row->length) { /* Find beginning of character */ guac_terminal_char* start_char = &(buffer_row->characters[start_column]); while (start_column > 0 && start_char->value == GUAC_CHAR_CONTINUATION) { start_char--; start_column--; } /* Use width, if available */ if (start_char->value != GUAC_CHAR_CONTINUATION) { *column = start_column; return start_char->width; } } /* Default to one column wide */ return 1; } void guac_terminal_select_start(guac_terminal* terminal, int row, int column) { int width = __guac_terminal_find_char(terminal, row, &column); terminal->selection_start_row = terminal->selection_end_row = row; terminal->selection_start_column = terminal->selection_end_column = column; terminal->selection_start_width = terminal->selection_end_width = width; terminal->text_selected = true; guac_terminal_select_redraw(terminal); } void guac_terminal_select_update(guac_terminal* terminal, int row, int column) { /* Only update if selection has changed */ if (row != terminal->selection_end_row || column < terminal->selection_end_column || column >= terminal->selection_end_column + terminal->selection_end_width) { int width = __guac_terminal_find_char(terminal, row, &column); terminal->selection_end_row = row; terminal->selection_end_column = column; terminal->selection_end_width = width; guac_terminal_select_redraw(terminal); } } int __guac_terminal_buffer_string(guac_terminal_buffer_row* row, int start, int end, char* string) { int length = 0; int i; for (i=start; i<=end; i++) { int codepoint = row->characters[i].value; /* If not null (blank), add to string */ if (codepoint != 0 && codepoint != GUAC_CHAR_CONTINUATION) { int bytes = guac_terminal_encode_utf8(codepoint, string); string += bytes; length += bytes; } } return length; } void guac_terminal_select_end(guac_terminal* terminal, char* string) { /* Deselect */ terminal->text_selected = false; guac_terminal_display_commit_select(terminal->display); guac_terminal_buffer_row* buffer_row; int row; int start_row, start_col; int end_row, end_col; /* Ensure proper ordering of start and end coords */ if (terminal->selection_start_row < terminal->selection_end_row || (terminal->selection_start_row == terminal->selection_end_row && terminal->selection_start_column < terminal->selection_end_column)) { start_row = terminal->selection_start_row; start_col = terminal->selection_start_column; end_row = terminal->selection_end_row; end_col = terminal->selection_end_column + terminal->selection_end_width - 1; } else { end_row = terminal->selection_start_row; end_col = terminal->selection_start_column + terminal->selection_start_width - 1; start_row = terminal->selection_end_row; start_col = terminal->selection_end_column; } /* If only one row, simply copy */ buffer_row = guac_terminal_buffer_get_row(terminal->buffer, start_row, 0); if (end_row == start_row) { if (buffer_row->length - 1 < end_col) end_col = buffer_row->length - 1; string += __guac_terminal_buffer_string(buffer_row, start_col, end_col, string); } /* Otherwise, copy multiple rows */ else { /* Store first row */ string += __guac_terminal_buffer_string(buffer_row, start_col, buffer_row->length - 1, string); /* Store all middle rows */ for (row=start_row+1; rowbuffer, row, 0); *(string++) = '\n'; string += __guac_terminal_buffer_string(buffer_row, 0, buffer_row->length - 1, string); } /* Store last row */ buffer_row = guac_terminal_buffer_get_row(terminal->buffer, end_row, 0); if (buffer_row->length - 1 < end_col) end_col = buffer_row->length - 1; *(string++) = '\n'; string += __guac_terminal_buffer_string(buffer_row, 0, end_col, string); } /* Null terminator */ *string = 0; } void guac_terminal_copy_columns(guac_terminal* terminal, int row, int start_column, int end_column, int offset) { guac_terminal_display_copy_columns(terminal->display, row + terminal->scroll_offset, start_column, end_column, offset); guac_terminal_buffer_copy_columns(terminal->buffer, row, start_column, end_column, offset); /* Update cursor location if within region */ if (row == terminal->visible_cursor_row && terminal->visible_cursor_col >= start_column && terminal->visible_cursor_col <= end_column) terminal->visible_cursor_col += offset; /* Force breaks around destination region */ __guac_terminal_force_break(terminal, row, start_column + offset); __guac_terminal_force_break(terminal, row, end_column + offset + 1); } void guac_terminal_copy_rows(guac_terminal* terminal, int start_row, int end_row, int offset) { guac_terminal_display_copy_rows(terminal->display, start_row + terminal->scroll_offset, end_row + terminal->scroll_offset, offset); guac_terminal_buffer_copy_rows(terminal->buffer, start_row, end_row, offset); /* Update cursor location if within region */ if (terminal->visible_cursor_row >= start_row && terminal->visible_cursor_row <= end_row) terminal->visible_cursor_row += offset; } void guac_terminal_set_columns(guac_terminal* terminal, int row, int start_column, int end_column, guac_terminal_char* character) { __guac_terminal_set_columns(terminal, row, start_column, end_column, character); /* If visible cursor in current row, preserve state */ if (row == terminal->visible_cursor_row && terminal->visible_cursor_col >= start_column && terminal->visible_cursor_col <= end_column) { /* Create copy of character with cursor attribute set */ guac_terminal_char cursor_character = *character; cursor_character.attributes.cursor = true; __guac_terminal_set_columns(terminal, row, terminal->visible_cursor_col, terminal->visible_cursor_col, &cursor_character); } /* Force breaks around destination region */ __guac_terminal_force_break(terminal, row, start_column); __guac_terminal_force_break(terminal, row, end_column + 1); } static void __guac_terminal_redraw_rect(guac_terminal* term, int start_row, int start_col, int end_row, int end_col) { int row, col; /* Redraw region */ for (row=start_row; row<=end_row; row++) { guac_terminal_buffer_row* buffer_row = guac_terminal_buffer_get_row(term->buffer, row - term->scroll_offset, 0); /* Clear row */ guac_terminal_display_set_columns(term->display, row, start_col, end_col, &(term->default_char)); /* Copy characters */ for (col=start_col; col <= end_col && col < buffer_row->length; col++) { /* Only redraw if not blank */ guac_terminal_char* c = &(buffer_row->characters[col]); if (guac_terminal_has_glyph(c->value)) guac_terminal_display_set_columns(term->display, row, col, col, c); } } } /** * Internal terminal resize routine. Accepts width/height in CHARACTERS * (not pixels like the public function). */ static void __guac_terminal_resize(guac_terminal* term, int width, int height) { /* If height is decreasing, shift display up */ if (height < term->term_height) { int shift_amount; /* Get number of rows actually occupying terminal space */ int used_height = term->buffer->length; if (used_height > term->term_height) used_height = term->term_height; shift_amount = used_height - height; /* If the new terminal bottom covers N rows, shift up N rows */ if (shift_amount > 0) { guac_terminal_display_copy_rows(term->display, shift_amount, term->display->height - 1, -shift_amount); /* Update buffer top and cursor row based on shift */ term->buffer->top += shift_amount; term->cursor_row -= shift_amount; term->visible_cursor_row -= shift_amount; /* Redraw characters within old region */ __guac_terminal_redraw_rect(term, height - shift_amount, 0, height-1, width-1); } } /* Resize display */ guac_terminal_display_flush(term->display); guac_terminal_display_resize(term->display, width, height); /* Reraw any characters on right if widening */ if (width > term->term_width) __guac_terminal_redraw_rect(term, 0, term->term_width-1, height-1, width-1); /* If height is increasing, shift display down */ if (height > term->term_height) { /* If undisplayed rows exist in the buffer, shift them into view */ if (term->term_height < term->buffer->length) { /* If the new terminal bottom reveals N rows, shift down N rows */ int shift_amount = height - term->term_height; /* The maximum amount we can shift is the number of undisplayed rows */ int max_shift = term->buffer->length - term->term_height; if (shift_amount > max_shift) shift_amount = max_shift; /* Update buffer top and cursor row based on shift */ term->buffer->top -= shift_amount; term->cursor_row += shift_amount; term->visible_cursor_row += shift_amount; /* If scrolled enough, use scroll to fulfill entire resize */ if (term->scroll_offset >= shift_amount) { term->scroll_offset -= shift_amount; guac_terminal_scrollbar_set_value(term->scrollbar, -term->scroll_offset); /* Draw characters from scroll at bottom */ __guac_terminal_redraw_rect(term, term->term_height, 0, term->term_height + shift_amount - 1, width-1); } /* Otherwise, fulfill with as much scroll as possible */ else { /* Draw characters from scroll at bottom */ __guac_terminal_redraw_rect(term, term->term_height, 0, term->term_height + term->scroll_offset - 1, width-1); /* Update shift_amount and scroll based on new rows */ shift_amount -= term->scroll_offset; term->scroll_offset = 0; guac_terminal_scrollbar_set_value(term->scrollbar, -term->scroll_offset); /* If anything remains, move screen as necessary */ if (shift_amount > 0) { guac_terminal_display_copy_rows(term->display, 0, term->display->height - shift_amount - 1, shift_amount); /* Draw characters at top from scroll */ __guac_terminal_redraw_rect(term, 0, 0, shift_amount - 1, width-1); } } } /* end if undisplayed rows exist */ } /* Keep cursor on screen */ if (term->cursor_row < 0) term->cursor_row = 0; if (term->cursor_row >= height) term->cursor_row = height-1; if (term->cursor_col < 0) term->cursor_col = 0; if (term->cursor_col >= width) term->cursor_col = width-1; /* Commit new dimensions */ term->term_width = width; term->term_height = height; } int guac_terminal_resize(guac_terminal* terminal, int width, int height) { guac_terminal_display* display = terminal->display; guac_client* client = display->client; guac_socket* socket = client->socket; /* Acquire exclusive access to terminal */ guac_terminal_lock(terminal); /* Calculate available display area */ int available_width = width - GUAC_TERMINAL_SCROLLBAR_WIDTH; if (available_width < 0) available_width = 0; /* Calculate dimensions */ int rows = height / display->char_height; int columns = available_width / display->char_width; /* Resize default layer to given pixel dimensions */ guac_protocol_send_size(socket, GUAC_DEFAULT_LAYER, width, height); guac_terminal_paint_background(terminal, width, height); /* Notify scrollbar of resize */ guac_terminal_scrollbar_parent_resized(terminal->scrollbar, width, height, rows); guac_terminal_scrollbar_set_bounds(terminal->scrollbar, rows - terminal->buffer->length, 0); /* Resize terminal if row/column dimensions have changed */ if (columns != terminal->term_width || rows != terminal->term_height) { guac_client_log(client, GUAC_LOG_DEBUG, "Resizing terminal to %ix%i", rows, columns); /* Resize terminal */ __guac_terminal_resize(terminal, columns, rows); /* Reset scroll region */ terminal->scroll_end = rows - 1; } /* Release terminal */ guac_terminal_unlock(terminal); guac_terminal_notify(terminal); return 0; } void guac_terminal_flush(guac_terminal* terminal) { guac_terminal_commit_cursor(terminal); guac_terminal_display_flush(terminal->display); guac_terminal_scrollbar_flush(terminal->scrollbar); } void guac_terminal_lock(guac_terminal* terminal) { pthread_mutex_lock(&(terminal->lock)); } void guac_terminal_unlock(guac_terminal* terminal) { pthread_mutex_unlock(&(terminal->lock)); } int guac_terminal_send_data(guac_terminal* term, const char* data, int length) { return guac_terminal_write_all(term->stdin_pipe_fd[1], data, length); } int guac_terminal_send_string(guac_terminal* term, const char* data) { return guac_terminal_write_all(term->stdin_pipe_fd[1], data, strlen(data)); } static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed) { /* Hide mouse cursor if not already hidden */ if (term->current_cursor != term->blank_cursor) { term->current_cursor = term->blank_cursor; guac_terminal_set_cursor(term->client, term->blank_cursor); guac_terminal_notify(term); } /* Track modifiers */ if (keysym == 0xFFE3) term->mod_ctrl = pressed; else if (keysym == 0xFFE9) term->mod_alt = pressed; else if (keysym == 0xFFE1) term->mod_shift = pressed; /* If key pressed */ else if (pressed) { /* Ctrl+Shift+V shortcut for paste */ if (keysym == 'V' && term->mod_ctrl) return guac_terminal_send_data(term, term->clipboard->buffer, term->clipboard->length); /* Shift+PgUp / Shift+PgDown shortcuts for scrolling */ if (term->mod_shift) { /* Page up */ if (keysym == 0xFF55) { guac_terminal_scroll_display_up(term, term->term_height); return 0; } /* Page down */ if (keysym == 0xFF56) { guac_terminal_scroll_display_down(term, term->term_height); return 0; } } /* Reset scroll */ if (term->scroll_offset != 0) guac_terminal_scroll_display_down(term, term->scroll_offset); /* If alt being held, also send escape character */ if (term->mod_alt) return guac_terminal_send_string(term, "\x1B"); /* Translate Ctrl+letter to control code */ if (term->mod_ctrl) { char data; /* Keysyms for '@' through '_' are all conveniently in C0 order */ if (keysym >= '@' && keysym <= '_') data = (char) (keysym - '@'); /* Handle lowercase as well */ else if (keysym >= 'a' && keysym <= 'z') data = (char) (keysym - 'a' + 1); /* Ctrl+? is DEL (0x7f) */ else if (keysym == '?') data = 0x7F; /* Map Ctrl+2 to same result as Ctrl+@ */ else if (keysym == '2') data = 0x00; /* Map Ctrl+3 through Ctrl-7 to the remaining C0 characters such that Ctrl+6 is the same as Ctrl+^ */ else if (keysym >= '3' && keysym <= '7') data = (char) (keysym - '3' + 0x1B); /* Otherwise ignore */ else return 0; return guac_terminal_send_data(term, &data, 1); } /* Translate Unicode to UTF-8 */ else if ((keysym >= 0x00 && keysym <= 0xFF) || ((keysym & 0xFFFF0000) == 0x01000000)) { int length; char data[5]; length = guac_terminal_encode_utf8(keysym & 0xFFFF, data); return guac_terminal_send_data(term, data, length); } /* Non-printable keys */ else { if (keysym == 0xFF08) return guac_terminal_send_string(term, "\x7F"); /* Backspace */ if (keysym == 0xFF09) return guac_terminal_send_string(term, "\x09"); /* Tab */ if (keysym == 0xFF0D) return guac_terminal_send_string(term, "\x0D"); /* Enter */ if (keysym == 0xFF1B) return guac_terminal_send_string(term, "\x1B"); /* Esc */ if (keysym == 0xFF50) return guac_terminal_send_string(term, "\x1B[1~"); /* Home */ /* Arrow keys w/ application cursor */ if (term->application_cursor_keys) { if (keysym == 0xFF51) return guac_terminal_send_string(term, "\x1BOD"); /* Left */ if (keysym == 0xFF52) return guac_terminal_send_string(term, "\x1BOA"); /* Up */ if (keysym == 0xFF53) return guac_terminal_send_string(term, "\x1BOC"); /* Right */ if (keysym == 0xFF54) return guac_terminal_send_string(term, "\x1BOB"); /* Down */ } else { if (keysym == 0xFF51) return guac_terminal_send_string(term, "\x1B[D"); /* Left */ if (keysym == 0xFF52) return guac_terminal_send_string(term, "\x1B[A"); /* Up */ if (keysym == 0xFF53) return guac_terminal_send_string(term, "\x1B[C"); /* Right */ if (keysym == 0xFF54) return guac_terminal_send_string(term, "\x1B[B"); /* Down */ } if (keysym == 0xFF55) return guac_terminal_send_string(term, "\x1B[5~"); /* Page up */ if (keysym == 0xFF56) return guac_terminal_send_string(term, "\x1B[6~"); /* Page down */ if (keysym == 0xFF57) return guac_terminal_send_string(term, "\x1B[4~"); /* End */ if (keysym == 0xFF63) return guac_terminal_send_string(term, "\x1B[2~"); /* Insert */ if (keysym == 0xFFBE) return guac_terminal_send_string(term, "\x1B[[A"); /* F1 */ if (keysym == 0xFFBF) return guac_terminal_send_string(term, "\x1B[[B"); /* F2 */ if (keysym == 0xFFC0) return guac_terminal_send_string(term, "\x1B[[C"); /* F3 */ if (keysym == 0xFFC1) return guac_terminal_send_string(term, "\x1B[[D"); /* F4 */ if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[[E"); /* F5 */ if (keysym == 0xFFC3) return guac_terminal_send_string(term, "\x1B[17~"); /* F6 */ if (keysym == 0xFFC4) return guac_terminal_send_string(term, "\x1B[18~"); /* F7 */ if (keysym == 0xFFC5) return guac_terminal_send_string(term, "\x1B[19~"); /* F8 */ if (keysym == 0xFFC6) return guac_terminal_send_string(term, "\x1B[20~"); /* F9 */ if (keysym == 0xFFC7) return guac_terminal_send_string(term, "\x1B[21~"); /* F10 */ if (keysym == 0xFFC8) return guac_terminal_send_string(term, "\x1B[22~"); /* F11 */ if (keysym == 0xFFC9) return guac_terminal_send_string(term, "\x1B[23~"); /* F12 */ if (keysym == 0xFFFF) return guac_terminal_send_string(term, "\x1B[3~"); /* Delete */ /* Ignore unknown keys */ guac_client_log(term->client, GUAC_LOG_DEBUG, "Ignoring unknown keysym: 0x%X", keysym); } } return 0; } int guac_terminal_send_key(guac_terminal* term, int keysym, int pressed) { int result; guac_terminal_lock(term); result = __guac_terminal_send_key(term, keysym, pressed); guac_terminal_unlock(term); return result; } static int __guac_terminal_send_mouse(guac_terminal* term, int x, int y, int mask) { guac_client* client = term->client; guac_socket* socket = client->socket; /* Determine which buttons were just released and pressed */ int released_mask = term->mouse_mask & ~mask; int pressed_mask = ~term->mouse_mask & mask; /* Notify scrollbar, do not handle anything handled by scrollbar */ if (guac_terminal_scrollbar_handle_mouse(term->scrollbar, x, y, mask)) { /* Set pointer cursor if mouse is over scrollbar */ if (term->current_cursor != term->pointer_cursor) { term->current_cursor = term->pointer_cursor; guac_terminal_set_cursor(client, term->pointer_cursor); } guac_terminal_notify(term); return 0; } term->mouse_mask = mask; /* Show mouse cursor if not already shown */ if (term->current_cursor != term->ibar_cursor) { term->current_cursor = term->ibar_cursor; guac_terminal_set_cursor(client, term->ibar_cursor); guac_terminal_notify(term); } /* Paste contents of clipboard on right or middle mouse button up */ if ((released_mask & GUAC_CLIENT_MOUSE_RIGHT) || (released_mask & GUAC_CLIENT_MOUSE_MIDDLE)) return guac_terminal_send_data(term, term->clipboard->buffer, term->clipboard->length); /* If text selected, change state based on left mouse mouse button */ if (term->text_selected) { /* If mouse button released, stop selection */ if (released_mask & GUAC_CLIENT_MOUSE_LEFT) { int selected_length; /* End selection and get selected text */ int selectable_size = term->term_width * term->term_height * sizeof(char); char* string = malloc(selectable_size); guac_terminal_select_end(term, string); selected_length = strnlen(string, selectable_size); /* Store new data */ guac_common_clipboard_reset(term->clipboard, "text/plain"); guac_common_clipboard_append(term->clipboard, string, selected_length); free(string); /* Send data */ guac_common_clipboard_send(term->clipboard, client); guac_socket_flush(socket); } /* Otherwise, just update */ else guac_terminal_select_update(term, y / term->display->char_height - term->scroll_offset, x / term->display->char_width); } /* Otherwise, if mouse button pressed AND moved, start selection */ else if (!(pressed_mask & GUAC_CLIENT_MOUSE_LEFT) && mask & GUAC_CLIENT_MOUSE_LEFT) guac_terminal_select_start(term, y / term->display->char_height - term->scroll_offset, x / term->display->char_width); /* Scroll up if wheel moved up */ if (released_mask & GUAC_CLIENT_MOUSE_SCROLL_UP) guac_terminal_scroll_display_up(term, GUAC_TERMINAL_WHEEL_SCROLL_AMOUNT); /* Scroll down if wheel moved down */ if (released_mask & GUAC_CLIENT_MOUSE_SCROLL_DOWN) guac_terminal_scroll_display_down(term, GUAC_TERMINAL_WHEEL_SCROLL_AMOUNT); return 0; } int guac_terminal_send_mouse(guac_terminal* term, int x, int y, int mask) { int result; guac_terminal_lock(term); result = __guac_terminal_send_mouse(term, x, y, mask); guac_terminal_unlock(term); return result; } void guac_terminal_scroll_handler(guac_terminal_scrollbar* scrollbar, int value) { guac_terminal* terminal = (guac_terminal*) scrollbar->data; /* Calculate change in scroll offset */ int delta = -value - terminal->scroll_offset; /* Update terminal based on change in scroll offset */ if (delta < 0) guac_terminal_scroll_display_down(terminal, -delta); else if (delta > 0) guac_terminal_scroll_display_up(terminal, delta); /* Update scrollbar value */ guac_terminal_scrollbar_set_value(scrollbar, value); } void guac_terminal_clipboard_reset(guac_terminal* term, const char* mimetype) { guac_common_clipboard_reset(term->clipboard, mimetype); } void guac_terminal_clipboard_append(guac_terminal* term, const void* data, int length) { guac_common_clipboard_append(term->clipboard, data, length); } int guac_terminal_sendf(guac_terminal* term, const char* format, ...) { int written; va_list ap; char buffer[1024]; /* Print to buffer */ va_start(ap, format); written = vsnprintf(buffer, sizeof(buffer)-1, format, ap); va_end(ap); if (written < 0) return written; /* Write to STDIN */ return guac_terminal_write_all(term->stdin_pipe_fd[1], buffer, written); } void guac_terminal_set_tab(guac_terminal* term, int column) { int i; /* Search for available space, set if available */ for (i=0; icustom_tabs[i] == 0) { term->custom_tabs[i] = column+1; break; } } } void guac_terminal_unset_tab(guac_terminal* term, int column) { int i; /* Search for given tab, unset if found */ for (i=0; icustom_tabs[i] == column+1) { term->custom_tabs[i] = 0; break; } } } void guac_terminal_clear_tabs(guac_terminal* term) { term->tab_interval = 0; memset(term->custom_tabs, 0, sizeof(term->custom_tabs)); } int guac_terminal_next_tab(guac_terminal* term, int column) { int i; /* Determine tab stop from interval */ int tabstop; if (term->tab_interval != 0) tabstop = (column / term->tab_interval + 1) * term->tab_interval; else tabstop = term->term_width - 1; /* Walk custom tabs, trying to find an earlier occurrence */ for (i=0; icustom_tabs[i] - 1; if (custom_tabstop != -1 && custom_tabstop > column && custom_tabstop < tabstop) tabstop = custom_tabstop; } return tabstop; } guacamole-server-0.9.9/src/terminal/Makefile.in0000664000175100017510000010644312645400276016404 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Copyright (C) 2015 Glyptodon LLC # # 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. # VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/terminal DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libguac_terminal_la_DEPENDENCIES = am_libguac_terminal_la_OBJECTS = libguac_terminal_la-blank.lo \ libguac_terminal_la-buffer.lo \ libguac_terminal_la-char_mappings.lo \ libguac_terminal_la-common.lo libguac_terminal_la-cursor.lo \ libguac_terminal_la-display.lo libguac_terminal_la-ibar.lo \ libguac_terminal_la-packet.lo libguac_terminal_la-pointer.lo \ libguac_terminal_la-scrollbar.lo \ libguac_terminal_la-terminal.lo \ libguac_terminal_la-terminal_handlers.lo libguac_terminal_la_OBJECTS = $(am_libguac_terminal_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libguac_terminal_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libguac_terminal_la_CFLAGS) $(CFLAGS) \ $(libguac_terminal_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libguac_terminal_la_SOURCES) DIST_SOURCES = $(libguac_terminal_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COMMON_INCLUDE = @COMMON_INCLUDE@ COMMON_LTLIB = @COMMON_LTLIB@ COMMON_SSH_INCLUDE = @COMMON_SSH_INCLUDE@ COMMON_SSH_LTLIB = @COMMON_SSH_LTLIB@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CUNIT_LIBS = @CUNIT_LIBS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBADD_DLOPEN = @LIBADD_DLOPEN@ LIBGUAC_INCLUDE = @LIBGUAC_INCLUDE@ LIBGUAC_LTLIB = @LIBGUAC_LTLIB@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MATH_LIBS = @MATH_LIBS@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@ PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@ PANGO_CFLAGS = @PANGO_CFLAGS@ PANGO_LIBS = @PANGO_LIBS@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_LIBS = @PNG_LIBS@ PTHREAD_LIBS = @PTHREAD_LIBS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ RDP_LIBS = @RDP_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSH_LIBS = @SSH_LIBS@ SSL_LIBS = @SSL_LIBS@ STRIP = @STRIP@ TELNET_LIBS = @TELNET_LIBS@ TERMINAL_INCLUDE = @TERMINAL_INCLUDE@ TERMINAL_LTLIB = @TERMINAL_LTLIB@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VNC_LIBS = @VNC_LIBS@ VORBIS_LIBS = @VORBIS_LIBS@ WEBP_LIBS = @WEBP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ init_dir = @init_dir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 noinst_LTLIBRARIES = libguac_terminal.la noinst_HEADERS = \ blank.h \ buffer.h \ char_mappings.h \ common.h \ cursor.h \ display.h \ ibar.h \ packet.h \ pointer.h \ scrollbar.h \ terminal.h \ terminal_handlers.h \ types.h libguac_terminal_la_SOURCES = \ blank.c \ buffer.c \ char_mappings.c \ common.c \ cursor.c \ display.c \ ibar.c \ packet.c \ pointer.c \ scrollbar.c \ terminal.c \ terminal_handlers.c libguac_terminal_la_CFLAGS = \ -Werror -Wall -pedantic \ @COMMON_INCLUDE@ \ @LIBGUAC_INCLUDE@ \ @PANGO_CFLAGS@ \ @PANGOCAIRO_CFLAGS@ libguac_terminal_la_LIBADD = \ @LIBGUAC_LTLIB@ libguac_terminal_la_LDFLAGS = \ @CAIRO_LIBS@ \ @MATH_LIBS@ \ @PANGO_LIBS@ \ @PANGOCAIRO_LIBS@ \ @PTHREAD_LIBS@ all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/terminal/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/terminal/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libguac_terminal.la: $(libguac_terminal_la_OBJECTS) $(libguac_terminal_la_DEPENDENCIES) $(EXTRA_libguac_terminal_la_DEPENDENCIES) $(AM_V_CCLD)$(libguac_terminal_la_LINK) $(libguac_terminal_la_OBJECTS) $(libguac_terminal_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_terminal_la-blank.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_terminal_la-buffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_terminal_la-char_mappings.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_terminal_la-common.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_terminal_la-cursor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_terminal_la-display.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_terminal_la-ibar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_terminal_la-packet.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_terminal_la-pointer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_terminal_la-scrollbar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_terminal_la-terminal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_terminal_la-terminal_handlers.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libguac_terminal_la-blank.lo: blank.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -MT libguac_terminal_la-blank.lo -MD -MP -MF $(DEPDIR)/libguac_terminal_la-blank.Tpo -c -o libguac_terminal_la-blank.lo `test -f 'blank.c' || echo '$(srcdir)/'`blank.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_terminal_la-blank.Tpo $(DEPDIR)/libguac_terminal_la-blank.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='blank.c' object='libguac_terminal_la-blank.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -c -o libguac_terminal_la-blank.lo `test -f 'blank.c' || echo '$(srcdir)/'`blank.c libguac_terminal_la-buffer.lo: buffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -MT libguac_terminal_la-buffer.lo -MD -MP -MF $(DEPDIR)/libguac_terminal_la-buffer.Tpo -c -o libguac_terminal_la-buffer.lo `test -f 'buffer.c' || echo '$(srcdir)/'`buffer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_terminal_la-buffer.Tpo $(DEPDIR)/libguac_terminal_la-buffer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='buffer.c' object='libguac_terminal_la-buffer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -c -o libguac_terminal_la-buffer.lo `test -f 'buffer.c' || echo '$(srcdir)/'`buffer.c libguac_terminal_la-char_mappings.lo: char_mappings.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -MT libguac_terminal_la-char_mappings.lo -MD -MP -MF $(DEPDIR)/libguac_terminal_la-char_mappings.Tpo -c -o libguac_terminal_la-char_mappings.lo `test -f 'char_mappings.c' || echo '$(srcdir)/'`char_mappings.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_terminal_la-char_mappings.Tpo $(DEPDIR)/libguac_terminal_la-char_mappings.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='char_mappings.c' object='libguac_terminal_la-char_mappings.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -c -o libguac_terminal_la-char_mappings.lo `test -f 'char_mappings.c' || echo '$(srcdir)/'`char_mappings.c libguac_terminal_la-common.lo: common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -MT libguac_terminal_la-common.lo -MD -MP -MF $(DEPDIR)/libguac_terminal_la-common.Tpo -c -o libguac_terminal_la-common.lo `test -f 'common.c' || echo '$(srcdir)/'`common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_terminal_la-common.Tpo $(DEPDIR)/libguac_terminal_la-common.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common.c' object='libguac_terminal_la-common.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -c -o libguac_terminal_la-common.lo `test -f 'common.c' || echo '$(srcdir)/'`common.c libguac_terminal_la-cursor.lo: cursor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -MT libguac_terminal_la-cursor.lo -MD -MP -MF $(DEPDIR)/libguac_terminal_la-cursor.Tpo -c -o libguac_terminal_la-cursor.lo `test -f 'cursor.c' || echo '$(srcdir)/'`cursor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_terminal_la-cursor.Tpo $(DEPDIR)/libguac_terminal_la-cursor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cursor.c' object='libguac_terminal_la-cursor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -c -o libguac_terminal_la-cursor.lo `test -f 'cursor.c' || echo '$(srcdir)/'`cursor.c libguac_terminal_la-display.lo: display.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -MT libguac_terminal_la-display.lo -MD -MP -MF $(DEPDIR)/libguac_terminal_la-display.Tpo -c -o libguac_terminal_la-display.lo `test -f 'display.c' || echo '$(srcdir)/'`display.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_terminal_la-display.Tpo $(DEPDIR)/libguac_terminal_la-display.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='display.c' object='libguac_terminal_la-display.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -c -o libguac_terminal_la-display.lo `test -f 'display.c' || echo '$(srcdir)/'`display.c libguac_terminal_la-ibar.lo: ibar.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -MT libguac_terminal_la-ibar.lo -MD -MP -MF $(DEPDIR)/libguac_terminal_la-ibar.Tpo -c -o libguac_terminal_la-ibar.lo `test -f 'ibar.c' || echo '$(srcdir)/'`ibar.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_terminal_la-ibar.Tpo $(DEPDIR)/libguac_terminal_la-ibar.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ibar.c' object='libguac_terminal_la-ibar.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -c -o libguac_terminal_la-ibar.lo `test -f 'ibar.c' || echo '$(srcdir)/'`ibar.c libguac_terminal_la-packet.lo: packet.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -MT libguac_terminal_la-packet.lo -MD -MP -MF $(DEPDIR)/libguac_terminal_la-packet.Tpo -c -o libguac_terminal_la-packet.lo `test -f 'packet.c' || echo '$(srcdir)/'`packet.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_terminal_la-packet.Tpo $(DEPDIR)/libguac_terminal_la-packet.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='packet.c' object='libguac_terminal_la-packet.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -c -o libguac_terminal_la-packet.lo `test -f 'packet.c' || echo '$(srcdir)/'`packet.c libguac_terminal_la-pointer.lo: pointer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -MT libguac_terminal_la-pointer.lo -MD -MP -MF $(DEPDIR)/libguac_terminal_la-pointer.Tpo -c -o libguac_terminal_la-pointer.lo `test -f 'pointer.c' || echo '$(srcdir)/'`pointer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_terminal_la-pointer.Tpo $(DEPDIR)/libguac_terminal_la-pointer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pointer.c' object='libguac_terminal_la-pointer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -c -o libguac_terminal_la-pointer.lo `test -f 'pointer.c' || echo '$(srcdir)/'`pointer.c libguac_terminal_la-scrollbar.lo: scrollbar.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -MT libguac_terminal_la-scrollbar.lo -MD -MP -MF $(DEPDIR)/libguac_terminal_la-scrollbar.Tpo -c -o libguac_terminal_la-scrollbar.lo `test -f 'scrollbar.c' || echo '$(srcdir)/'`scrollbar.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_terminal_la-scrollbar.Tpo $(DEPDIR)/libguac_terminal_la-scrollbar.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scrollbar.c' object='libguac_terminal_la-scrollbar.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -c -o libguac_terminal_la-scrollbar.lo `test -f 'scrollbar.c' || echo '$(srcdir)/'`scrollbar.c libguac_terminal_la-terminal.lo: terminal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -MT libguac_terminal_la-terminal.lo -MD -MP -MF $(DEPDIR)/libguac_terminal_la-terminal.Tpo -c -o libguac_terminal_la-terminal.lo `test -f 'terminal.c' || echo '$(srcdir)/'`terminal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_terminal_la-terminal.Tpo $(DEPDIR)/libguac_terminal_la-terminal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='terminal.c' object='libguac_terminal_la-terminal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -c -o libguac_terminal_la-terminal.lo `test -f 'terminal.c' || echo '$(srcdir)/'`terminal.c libguac_terminal_la-terminal_handlers.lo: terminal_handlers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -MT libguac_terminal_la-terminal_handlers.lo -MD -MP -MF $(DEPDIR)/libguac_terminal_la-terminal_handlers.Tpo -c -o libguac_terminal_la-terminal_handlers.lo `test -f 'terminal_handlers.c' || echo '$(srcdir)/'`terminal_handlers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_terminal_la-terminal_handlers.Tpo $(DEPDIR)/libguac_terminal_la-terminal_handlers.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='terminal_handlers.c' object='libguac_terminal_la-terminal_handlers.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_terminal_la_CFLAGS) $(CFLAGS) -c -o libguac_terminal_la-terminal_handlers.lo `test -f 'terminal_handlers.c' || echo '$(srcdir)/'`terminal_handlers.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: guacamole-server-0.9.9/src/terminal/char_mappings.h0000664000175100017510000000373212536405625017322 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_TERMINAL_CHAR_MAPPINGS_H #define _GUAC_TERMINAL_CHAR_MAPPINGS_H #include "config.h" /** * VT100 graphics mapping. Each entry is the corresponding Unicode codepoint * for the character N+32, where N is the index of the element in the array. * All characters less than 32 are universally mapped to themselves. */ extern const int vt100_map[]; /** * Null graphics mapping. Each entry is the corresponding Unicode codepoint * for the character N+32, where N is the index of the element in the array. * All characters less than 32 are universally mapped to themselves. */ extern const int null_map[]; /** * User graphics mapping. Each entry is the corresponding Unicode codepoint * for the character N+32, where N is the index of the element in the array. * All characters less than 32 are universally mapped to themselves. */ extern const int user_map[]; #endif guacamole-server-0.9.9/src/terminal/terminal_handlers.c0000664000175100017510000007022512645364210020171 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "char_mappings.h" #include "terminal.h" #include "terminal_handlers.h" #include "types.h" #include #include #include #include /** * Response string sent when identification is requested. */ #define GUAC_TERMINAL_VT102_ID "\x1B[?6c" /** * Arbitrary response to ENQ control character. */ #define GUAC_TERMINAL_ANSWERBACK "GUACAMOLE" /** * Response which indicates the terminal is alive. */ #define GUAC_TERMINAL_OK "\x1B[0n" int guac_terminal_echo(guac_terminal* term, unsigned char c) { int width; static int bytes_remaining = 0; static int codepoint = 0; const int* char_mapping = term->char_mapping[term->active_char_set]; /* If using non-Unicode mapping, just map straight bytes */ if (char_mapping != NULL) { codepoint = c; bytes_remaining = 0; } /* 1-byte UTF-8 codepoint */ else if ((c & 0x80) == 0x00) { /* 0xxxxxxx */ codepoint = c & 0x7F; bytes_remaining = 0; } /* 2-byte UTF-8 codepoint */ else if ((c & 0xE0) == 0xC0) { /* 110xxxxx */ codepoint = c & 0x1F; bytes_remaining = 1; } /* 3-byte UTF-8 codepoint */ else if ((c & 0xF0) == 0xE0) { /* 1110xxxx */ codepoint = c & 0x0F; bytes_remaining = 2; } /* 4-byte UTF-8 codepoint */ else if ((c & 0xF8) == 0xF0) { /* 11110xxx */ codepoint = c & 0x07; bytes_remaining = 3; } /* Continuation of UTF-8 codepoint */ else if ((c & 0xC0) == 0x80) { /* 10xxxxxx */ codepoint = (codepoint << 6) | (c & 0x3F); bytes_remaining--; } /* Unrecognized prefix */ else { codepoint = '?'; bytes_remaining = 0; } /* If we need more bytes, wait for more bytes */ if (bytes_remaining != 0) return 0; switch (codepoint) { /* Enquiry */ case 0x05: guac_terminal_send_string(term, GUAC_TERMINAL_ANSWERBACK); break; /* Bell */ case 0x07: break; /* Backspace */ case 0x08: if (term->cursor_col >= 1) term->cursor_col--; break; /* Tab */ case 0x09: term->cursor_col = guac_terminal_next_tab(term, term->cursor_col); break; /* Line feed / VT / FF */ case '\n': case 0x0B: /* VT */ case 0x0C: /* FF */ term->cursor_row++; /* Scroll up if necessary */ if (term->cursor_row > term->scroll_end) { term->cursor_row = term->scroll_end; /* Scroll up by one row */ guac_terminal_scroll_up(term, term->scroll_start, term->scroll_end, 1); } /* If automatic carriage return, fall through to CR handler */ if (!term->automatic_carriage_return) break; /* Carriage return */ case '\r': term->cursor_col = 0; break; /* SO (activates character set G1) */ case 0x0E: term->active_char_set = 1; break; /* SI (activates character set G0) */ case 0x0F: term->active_char_set = 0; break; /* ESC */ case 0x1B: term->char_handler = guac_terminal_escape; break; /* CSI */ case 0x9B: term->char_handler = guac_terminal_csi; break; /* DEL (ignored) */ case 0x7F: break; /* Displayable chars */ default: /* Don't bother handling control chars if unknown */ if (codepoint < 0x20) break; /* Translate mappable codepoints to whatever codepoint is mapped */ if (codepoint >= 0x20 && codepoint <= 0xFF && char_mapping != NULL) codepoint = char_mapping[codepoint - 0x20]; /* Wrap if necessary */ if (term->cursor_col >= term->term_width) { term->cursor_col = 0; term->cursor_row++; } /* Scroll up if necessary */ if (term->cursor_row > term->scroll_end) { term->cursor_row = term->scroll_end; /* Scroll up by one row */ guac_terminal_scroll_up(term, term->scroll_start, term->scroll_end, 1); } /* If insert mode, shift other characters right by 1 */ if (term->insert_mode) guac_terminal_copy_columns(term, term->cursor_row, term->cursor_col, term->term_width-2, 1); /* Write character */ guac_terminal_set(term, term->cursor_row, term->cursor_col, codepoint); width = wcwidth(codepoint); if (width < 0) width = 1; /* Advance cursor */ term->cursor_col += width; } return 0; } int guac_terminal_escape(guac_terminal* term, unsigned char c) { switch (c) { case '(': term->char_handler = guac_terminal_g0_charset; break; case ')': term->char_handler = guac_terminal_g1_charset; break; case ']': term->char_handler = guac_terminal_osc; break; case '[': term->char_handler = guac_terminal_csi; break; case '#': term->char_handler = guac_terminal_ctrl_func; break; /* Save Cursor (DECSC) */ case '7': term->saved_cursor_row = term->cursor_row; term->saved_cursor_col = term->cursor_col; term->char_handler = guac_terminal_echo; break; /* Restore Cursor (DECRC) */ case '8': term->cursor_row = term->saved_cursor_row; if (term->cursor_row >= term->term_height) term->cursor_row = term->term_height - 1; term->cursor_col = term->saved_cursor_col; if (term->cursor_col >= term->term_width) term->cursor_col = term->term_width - 1; term->char_handler = guac_terminal_echo; break; /* Index (IND) */ case 'D': term->cursor_row++; /* Scroll up if necessary */ if (term->cursor_row > term->scroll_end) { term->cursor_row = term->scroll_end; /* Scroll up by one row */ guac_terminal_scroll_up(term, term->scroll_start, term->scroll_end, 1); } term->char_handler = guac_terminal_echo; break; /* Next Line (NEL) */ case 'E': term->cursor_col = 0; term->cursor_row++; /* Scroll up if necessary */ if (term->cursor_row > term->scroll_end) { term->cursor_row = term->scroll_end; /* Scroll up by one row */ guac_terminal_scroll_up(term, term->scroll_start, term->scroll_end, 1); } term->char_handler = guac_terminal_echo; break; /* Set Tab (HTS) */ case 'H': guac_terminal_set_tab(term, term->cursor_col); term->char_handler = guac_terminal_echo; break; /* Reverse Linefeed */ case 'M': term->cursor_row--; /* Scroll down if necessary */ if (term->cursor_row < term->scroll_start) { term->cursor_row = term->scroll_start; /* Scroll down by one row */ guac_terminal_scroll_down(term, term->scroll_start, term->scroll_end, 1); } term->char_handler = guac_terminal_echo; break; /* DEC Identify */ case 'Z': guac_terminal_send_string(term, GUAC_TERMINAL_VT102_ID); term->char_handler = guac_terminal_echo; break; /* Reset */ case 'c': guac_terminal_reset(term); break; default: guac_client_log(term->client, GUAC_LOG_INFO, "Unhandled ESC sequence: %c", c); term->char_handler = guac_terminal_echo; } return 0; } /** * Given a character mapping specifier (such as B, 0, U, or K), * returns the corresponding character mapping. */ static const int* __guac_terminal_get_char_mapping(char c) { /* Translate character specifier to actual mapping */ switch (c) { case 'B': return NULL; case '0': return vt100_map; case 'U': return null_map; case 'K': return user_map; } /* Default to Unicode */ return NULL; } int guac_terminal_g0_charset(guac_terminal* term, unsigned char c) { term->char_mapping[0] = __guac_terminal_get_char_mapping(c); term->char_handler = guac_terminal_echo; return 0; } int guac_terminal_g1_charset(guac_terminal* term, unsigned char c) { term->char_mapping[1] = __guac_terminal_get_char_mapping(c); term->char_handler = guac_terminal_echo; return 0; } /** * Looks up the flag specified by the given number and mode. Used by the Set/Reset Mode * functions of the terminal. */ static bool* __guac_terminal_get_flag(guac_terminal* term, int num, char private_mode) { if (private_mode == '?') { switch (num) { case 1: return &(term->application_cursor_keys); /* DECCKM */ } } else if (private_mode == 0) { switch (num) { case 4: return &(term->insert_mode); /* DECIM */ case 20: return &(term->automatic_carriage_return); /* LF/NL */ } } /* Unknown flag */ return NULL; } int guac_terminal_csi(guac_terminal* term, unsigned char c) { /* CSI function arguments */ static int argc = 0; static int argv[16] = {0}; /* Sequence prefix, if any */ static char private_mode_character = 0; /* Argument building counter and buffer */ static int argv_length = 0; static char argv_buffer[256]; /* Digits get concatenated into argv */ if (c >= '0' && c <= '9') { /* Concatenate digit if there is space in buffer */ if (argv_length < sizeof(argv_buffer)-1) argv_buffer[argv_length++] = c; } /* Specific non-digits stop the parameter, and possibly the sequence */ else if ((c >= 0x40 && c <= 0x7E) || c == ';') { int i, row, col, amount; bool* flag; /* At most 16 parameters */ if (argc < 16) { /* Finish parameter */ argv_buffer[argv_length] = 0; argv[argc++] = atoi(argv_buffer); /* Prepare for next parameter */ argv_length = 0; } /* Handle CSI functions */ switch (c) { /* @: Insert characters (scroll right) */ case '@': amount = argv[0]; if (amount == 0) amount = 1; /* Scroll right by amount */ if (term->cursor_col + amount < term->term_width) guac_terminal_copy_columns(term, term->cursor_row, term->cursor_col, term->term_width - amount - 1, amount); /* Clear left */ guac_terminal_clear_columns(term, term->cursor_row, term->cursor_col, term->cursor_col + amount - 1); break; /* A: Move up */ case 'A': /* Get move amount */ amount = argv[0]; if (amount == 0) amount = 1; /* Move cursor */ term->cursor_row -= amount; if (term->cursor_row < 0) term->cursor_row = 0; break; /* B: Move down */ case 'e': case 'B': /* Get move amount */ amount = argv[0]; if (amount == 0) amount = 1; /* Move cursor */ term->cursor_row += amount; if (term->cursor_row >= term->term_height) term->cursor_row = term->term_height - 1; break; /* C: Move right */ case 'a': case 'C': /* Get move amount */ amount = argv[0]; if (amount == 0) amount = 1; /* Move cursor */ term->cursor_col += amount; if (term->cursor_col >= term->term_width) term->cursor_col = term->term_width - 1; break; /* D: Move left */ case 'D': /* Get move amount */ amount = argv[0]; if (amount == 0) amount = 1; /* Move cursor */ term->cursor_col -= amount; if (term->cursor_col < 0) term->cursor_col = 0; break; /* E: Move cursor down given number rows, column 1 */ case 'E': /* Get move amount */ amount = argv[0]; if (amount == 0) amount = 1; /* Move cursor */ term->cursor_row += amount; if (term->cursor_row >= term->term_height) term->cursor_row = term->term_height - 1; /* Reset to column 1 */ term->cursor_col = 0; break; /* F: Move cursor up given number rows, column 1 */ case 'F': /* Get move amount */ amount = argv[0]; if (amount == 0) amount = 1; /* Move cursor */ term->cursor_row -= amount; if (term->cursor_row < 0) term->cursor_row = 0; /* Reset to column 1 */ term->cursor_col = 0; break; /* G: Move cursor, current row */ case '`': case 'G': col = argv[0]; if (col != 0) col--; term->cursor_col = col; break; /* H: Move cursor */ case 'f': case 'H': row = argv[0]; if (row != 0) row--; col = argv[1]; if (col != 0) col--; term->cursor_row = row; term->cursor_col = col; break; /* J: Erase display */ case 'J': /* Erase from cursor to end of display */ if (argv[0] == 0) guac_terminal_clear_range(term, term->cursor_row, term->cursor_col, term->term_height-1, term->term_width-1); /* Erase from start to cursor */ else if (argv[0] == 1) guac_terminal_clear_range(term, 0, 0, term->cursor_row, term->cursor_col); /* Entire screen */ else if (argv[0] == 2 || argv[0] == 3) guac_terminal_clear_range(term, 0, 0, term->term_height - 1, term->term_width - 1); break; /* K: Erase line */ case 'K': /* Erase from cursor to end of line */ if (argv[0] == 0) guac_terminal_clear_columns(term, term->cursor_row, term->cursor_col, term->term_width - 1); /* Erase from start to cursor */ else if (argv[0] == 1) guac_terminal_clear_columns(term, term->cursor_row, 0, term->cursor_col); /* Erase line */ else if (argv[0] == 2) guac_terminal_clear_columns(term, term->cursor_row, 0, term->term_width - 1); break; /* L: Insert blank lines (scroll down) */ case 'L': amount = argv[0]; if (amount == 0) amount = 1; guac_terminal_scroll_down(term, term->cursor_row, term->scroll_end, amount); break; /* M: Delete lines (scroll up) */ case 'M': amount = argv[0]; if (amount == 0) amount = 1; guac_terminal_scroll_up(term, term->cursor_row, term->scroll_end, amount); break; /* P: Delete characters (scroll left) */ case 'P': amount = argv[0]; if (amount == 0) amount = 1; /* Scroll left by amount */ if (term->cursor_col + amount < term->term_width) guac_terminal_copy_columns(term, term->cursor_row, term->cursor_col + amount, term->term_width - 1, -amount); /* Clear right */ guac_terminal_clear_columns(term, term->cursor_row, term->term_width - amount, term->term_width - 1); break; /* X: Erase characters (no scroll) */ case 'X': amount = argv[0]; if (amount == 0) amount = 1; /* Clear characters */ guac_terminal_clear_columns(term, term->cursor_row, term->cursor_col, term->cursor_col + amount - 1); break; /* ]: Linux Private CSI */ case ']': /* Explicitly ignored */ break; /* c: Identify */ case 'c': if (argv[0] == 0 && private_mode_character == 0) guac_terminal_send_string(term, GUAC_TERMINAL_VT102_ID); break; /* d: Move cursor, current col */ case 'd': row = argv[0]; if (row != 0) row--; term->cursor_row = row; break; /* g: Clear tab */ case 'g': /* Clear tab at current location */ if (argv[0] == 0) guac_terminal_unset_tab(term, term->cursor_col); /* Clear all tabs */ else if (argv[0] == 3) guac_terminal_clear_tabs(term); break; /* h: Set Mode */ case 'h': /* Look up flag and set */ flag = __guac_terminal_get_flag(term, argv[0], private_mode_character); if (flag != NULL) *flag = true; break; /* l: Reset Mode */ case 'l': /* Look up flag and clear */ flag = __guac_terminal_get_flag(term, argv[0], private_mode_character); if (flag != NULL) *flag = false; break; /* m: Set graphics rendition */ case 'm': for (i=0; icurrent_attributes = term->default_char.attributes; /* Bold */ else if (value == 1) term->current_attributes.bold = true; /* Underscore on */ else if (value == 4) term->current_attributes.underscore = true; /* Reverse video */ else if (value == 7) term->current_attributes.reverse = true; /* Normal intensity (not bold) */ else if (value == 21 || value == 22) term->current_attributes.bold = false; /* Reset underscore */ else if (value == 24) term->current_attributes.underscore = false; /* Reset reverse video */ else if (value == 27) term->current_attributes.reverse = false; /* Foreground */ else if (value >= 30 && value <= 37) term->current_attributes.foreground = value - 30; /* Underscore on, default foreground */ else if (value == 38) { term->current_attributes.underscore = true; term->current_attributes.foreground = term->default_char.attributes.foreground; } /* Underscore off, default foreground */ else if (value == 39) { term->current_attributes.underscore = false; term->current_attributes.foreground = term->default_char.attributes.foreground; } /* Background */ else if (value >= 40 && value <= 47) term->current_attributes.background = value - 40; /* Reset background */ else if (value == 49) term->current_attributes.background = term->default_char.attributes.background; } break; /* n: Status report */ case 'n': /* Device status report */ if (argv[0] == 5 && private_mode_character == 0) guac_terminal_send_string(term, GUAC_TERMINAL_OK); /* Cursor position report */ else if (argv[0] == 6 && private_mode_character == 0) guac_terminal_sendf(term, "\x1B[%i;%iR", term->cursor_row+1, term->cursor_col+1); break; /* q: Set keyboard LEDs */ case 'q': /* Explicitly ignored */ break; /* r: Set scrolling region */ case 'r': /* If parameters given, set region */ if (argc == 2) { term->scroll_start = argv[0]-1; term->scroll_end = argv[1]-1; } /* Otherwise, reset scrolling region */ else { term->scroll_start = 0; term->scroll_end = term->term_height - 1; } break; /* Save Cursor */ case 's': term->saved_cursor_row = term->cursor_row; term->saved_cursor_col = term->cursor_col; break; /* Restore Cursor */ case 'u': term->cursor_row = term->saved_cursor_row; if (term->cursor_row >= term->term_height) term->cursor_row = term->term_height - 1; term->cursor_col = term->saved_cursor_col; if (term->cursor_col >= term->term_width) term->cursor_col = term->term_width - 1; break; /* Warn of unhandled codes */ default: if (c != ';') { guac_client_log(term->client, GUAC_LOG_INFO, "Unhandled CSI sequence: %c", c); for (i=0; iclient, GUAC_LOG_INFO, " -> argv[%i] = %i", i, argv[i]); } } /* If not a semicolon, end of CSI sequence */ if (c != ';') { term->char_handler = guac_terminal_echo; /* Reset parameters */ for (i=0; i= 0x3A && c <= 0x3F && private_mode_character == 0) private_mode_character = c; return 0; } int guac_terminal_set_directory(guac_terminal* term, unsigned char c) { static char filename[2048]; static int length = 0; /* Stop on ECMA-48 ST (String Terminator */ if (c == 0x9C || c == 0x5C || c == 0x07) { filename[length++] = '\0'; term->char_handler = guac_terminal_echo; if (term->upload_path_handler) term->upload_path_handler(term->client, filename); else guac_client_log(term->client, GUAC_LOG_DEBUG, "Cannot set upload path. File is transfer not enabled."); length = 0; } /* Otherwise, store character */ else if (length < sizeof(filename)-1) filename[length++] = c; return 0; } int guac_terminal_download(guac_terminal* term, unsigned char c) { static char filename[2048]; static int length = 0; /* Stop on ECMA-48 ST (String Terminator */ if (c == 0x9C || c == 0x5C || c == 0x07) { filename[length++] = '\0'; term->char_handler = guac_terminal_echo; if (term->file_download_handler) term->file_download_handler(term->client, filename); else guac_client_log(term->client, GUAC_LOG_DEBUG, "Cannot send file. File is transfer not enabled."); length = 0; } /* Otherwise, store character */ else if (length < sizeof(filename)-1) filename[length++] = c; return 0; } int guac_terminal_osc(guac_terminal* term, unsigned char c) { static int operation = 0; /* If digit, append to operation */ if (c >= '0' && c <= '9') operation = operation * 10 + c - '0'; /* If end of parameter, check value */ else if (c == ';') { /* Download OSC */ if (operation == 482200) term->char_handler = guac_terminal_download; /* Set upload directory OSC */ else if (operation == 482201) term->char_handler = guac_terminal_set_directory; /* Reset parameter for next OSC */ operation = 0; } /* Stop on ECMA-48 ST (String Terminator */ else if (c == 0x9C || c == 0x5C || c == 0x07) term->char_handler = guac_terminal_echo; /* Stop on unrecognized character */ else { guac_client_log(term->client, GUAC_LOG_INFO, "Unexpected character in OSC: 0x%X", c); term->char_handler = guac_terminal_echo; } return 0; } int guac_terminal_ctrl_func(guac_terminal* term, unsigned char c) { int row; /* Build character with current attributes */ guac_terminal_char guac_char; guac_char.value = 'E'; guac_char.attributes = term->current_attributes; switch (c) { /* Alignment test (fill screen with E's) */ case '8': for (row=0; rowterm_height; row++) guac_terminal_set_columns(term, row, 0, term->term_width-1, &guac_char); break; } term->char_handler = guac_terminal_echo; return 0; } guacamole-server-0.9.9/src/terminal/blank.h0000664000175100017510000000305312643542623015571 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_TERMINAL_BLANK_H #define _GUAC_TERMINAL_BLANK_H #include "config.h" #include "cursor.h" #include #include /** * Creates a new blank cursor, returning the corresponding cursor object. * * @param client The guac_client to send the cursor to. * @return A new cursor which must be free'd via guac_terminal_cursor_free()/ */ guac_terminal_cursor* guac_terminal_create_blank(guac_client* client); #endif guacamole-server-0.9.9/src/terminal/scrollbar.h0000664000175100017510000002332412626133327016466 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 GUAC_TERMINAL_SCROLLBAR_H #define GUAC_TERMINAL_SCROLLBAR_H #include "config.h" #include #include /** * The width of the scrollbar, in pixels. */ #define GUAC_TERMINAL_SCROLLBAR_WIDTH 16 /** * The number of pixels between the draggable handle of the scrollbar and the * boundary of the containing layer. */ #define GUAC_TERMINAL_SCROLLBAR_PADDING 2 /** * The minimum height of the draggable handle of the scrollbar, in pixels. */ #define GUAC_TERMINAL_SCROLLBAR_MIN_HEIGHT 64 /** * The state of all scrollbar components, describing all variable aspects of * the scrollbar's appearance. */ typedef struct guac_terminal_scrollbar_render_state { /** * The current X-coordinate of the upper-left corner of the scrollbar's * handle. This value will be relative to the scrollbar's containing layer. */ int handle_x; /** * The current Y-coordinate of the upper-left corner of the scrollbar's * handle. This value will be relative to the scrollbar's containing layer. */ int handle_y; /** * The width of the scrollbar's handle. */ int handle_width; /** * The height of the scrollbar's handle. */ int handle_height; /** * The current X-coordinate of the upper-left corner of the scrollbar's * containing layer. */ int container_x; /** * The current Y-coordinate of the upper-left corner of the scrollbar's * containing layer. */ int container_y; /** * The width of the scrollbar's containing layer. */ int container_width; /** * The height of the scrollbar's containing layer. */ int container_height; } guac_terminal_scrollbar_render_state; typedef struct guac_terminal_scrollbar guac_terminal_scrollbar; /** * Handler which is called whenever the scrollbar value changes outside a call * to guac_terminal_scrollbar_set_value(). */ typedef void guac_terminal_scrollbar_scroll_handler( guac_terminal_scrollbar* scrollbar, int value); /** * A scrollbar, made up of a containing layer and inner draggable handle. The * position of the handle within the layer represents the value of the * scrollbar. */ struct guac_terminal_scrollbar { /** * The client associated with this scrollbar. */ guac_client* client; /** * The layer containing the scrollbar. */ const guac_layer* parent; /** * The width of the parent layer, in pixels. */ int parent_width; /** * The height of the parent layer, in pixels. */ int parent_height; /** * The scrollbar itself. */ guac_layer* container; /** * The draggable handle within the scrollbar, representing the current * scroll value. */ guac_layer* handle; /** * The minimum scroll value. */ int min; /** * The maximum scroll value. */ int max; /** * The size of the visible area, in the same units as min and max. */ int visible_area; /** * The current scroll value. */ int value; /** * The current state of all variable, visible parts of the scrollbar. */ guac_terminal_scrollbar_render_state render_state; /** * Whether the scrollbar handle is currently being dragged. */ int dragging_handle; /** * The offset of the Y location of the mouse pointer when the dragging * began, relative to the top of the scrollbar handle. If dragging is not * in progress, this value is undefined. */ int drag_offset_y; /** * The current Y location of the mouse pointer if dragging is in progress. * If dragging is not in progress, this value is undefined. */ int drag_current_y; /** * The function to call when the scrollbar handle is being dragged, and * the new scrollbar value needs to be handled and assigned. */ guac_terminal_scrollbar_scroll_handler* scroll_handler; /** * Arbitrary reference to data related to this scrollbar. */ void* data; }; /** * Allocates a new scrollbar, associating that scrollbar with the given client * and parent layer. The dimensions of the parent layer dictate the initial * position of the scrollbar. Currently, the scrollbar is always anchored to * the right edge of the parent layer. * * This will cause instructions to be written to the client's socket, but the * client's socket will not be automatically flushed. * * @param client * The client to associate with the new scrollbar. * * @param parent * The layer which will contain the newly-allocated scrollbar. * * @param parent_width * The width of the parent layer, in pixels. * * @param parent_height * The height of the parent layer, in pixels. * * @param visible_area * The amount of scrollable data that can be shown within the parent layer * at any given time. This value uses the same units as min, max, and the * current scroll value. * * @return * A newly allocated scrollbar. */ guac_terminal_scrollbar* guac_terminal_scrollbar_alloc(guac_client* client, const guac_layer* parent, int parent_width, int parent_height, int visible_area); /** * Frees the given scrollbar. * * @param scrollbar * The scrollbar to free. */ void guac_terminal_scrollbar_free(guac_terminal_scrollbar* scrollbar); /** * Flushes the render state of the given scrollbar, updating the remote display * accordingly. * * This may cause instructions to be written to the client's socket, but the * client's socket will not be automatically flushed. * * @param scrollbar * The scrollbar whose render state is to be flushed. */ void guac_terminal_scrollbar_flush(guac_terminal_scrollbar* scrollbar); /** * Sets the minimum and maximum allowed scroll values of the given scrollbar * to the given values. If necessary, the current value of the scrollbar will * be adjusted to fit within the new bounds. * * This may cause instructions to be written to the client's socket, but the * client's socket will not be automatically flushed. * * @param scrollbar * The scrollbar whose bounds are changing. * * @param min * The new minimum value of the scrollbar. * * @param max * The new maximum value of the scrollbar. */ void guac_terminal_scrollbar_set_bounds(guac_terminal_scrollbar* scrollbar, int min, int max); /** * Sets the current value of the given scrollbar. If the value specified does * not fall within the scrollbar's defined minimum and maximum values, the * value will be adjusted to fit. * * This may cause instructions to be written to the client's socket, but the * client's socket will not be automatically flushed. * * @param scrollbar * The scrollbar whose value is changing. * * @param value * The value to assign to the scrollbar. If the value if out of bounds, it * will be automatically adjusted to fit. */ void guac_terminal_scrollbar_set_value(guac_terminal_scrollbar* scrollbar, int value); /** * Notifies the scrollbar that the parent layer has been resized, and that the * scrollbar may need to be repositioned or resized accordingly. * * This may cause instructions to be written to the client's socket, but the * client's socket will not be automatically flushed. * * @param scrollbar * The scrollbar whose parent layer has been resized. * * @param parent_width * The new width of the parent layer, in pixels. * * @param parent_height * The new height of the parent layer, in pixels. * * @param visible_area * The amount of scrollable data that can be shown within the parent layer * at any given time. This value uses the same units as min, max, and the * current scroll value. */ void guac_terminal_scrollbar_parent_resized(guac_terminal_scrollbar* scrollbar, int parent_width, int parent_height, int visible_area); /** * Notifies the scrollbar of the current mouse state, allowing it to update * itself with respect to button state and dragging. * * @param scrollbar * The scrollbar to notify of the current mouse state. * * @param x * The X coordinate of the mouse pointer. * * @param y * The Y coordinate of the mouse pointer. * * @param mask * The button mask, where the Nth bit of the button mask represents the * pressed state of the Nth mouse button, where button 0 is the left * mouse button, button 1 is the middle button, etc. * * @return * Zero if the mouse event was not handled by the scrollbar, non-zero * otherwise. */ int guac_terminal_scrollbar_handle_mouse(guac_terminal_scrollbar* scrollbar, int x, int y, int mask); #endif guacamole-server-0.9.9/src/terminal/types.h0000664000175100017510000000653012536405625015652 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_TERMINAL_TYPES_H #define _GUAC_TERMINAL_TYPES_H #include "config.h" #include /** * A character which is not truly a character, but rather part of an * existing character which spans multiple columns. The original * character will be somewhere earlier in the row, separated from * this character by a contiguous string of zero of more * GUAC_CHAR_CONTINUATION characters. */ #define GUAC_CHAR_CONTINUATION -1 /** * An RGB color, where each component ranges from 0 to 255. */ typedef struct guac_terminal_color { /** * The red component of this color. */ int red; /** * The green component of this color. */ int green; /** * The blue component of this color. */ int blue; } guac_terminal_color; /** * Terminal attributes, as can be applied to a single character. */ typedef struct guac_terminal_attributes { /** * Whether the character should be rendered bold. */ bool bold; /** * Whether the character should be rendered with reversed colors * (background becomes foreground and vice-versa). */ bool reverse; /** * Whether the associated character is highlighted by the cursor. */ bool cursor; /** * Whether to render the character with underscore. */ bool underscore; /** * The foreground color of this character, as a palette index. */ int foreground; /** * The background color of this character, as a palette index. */ int background; } guac_terminal_attributes; /** * Represents a single character for display in a terminal, including actual * character value, foreground color, and background color. */ typedef struct guac_terminal_char { /** * The Unicode codepoint of the character to display, or * GUAC_CHAR_CONTINUATION if this character is part of * another character which spans multiple columns. */ int value; /** * The attributes of the character to display. */ guac_terminal_attributes attributes; /** * The number of columns this character occupies. If the character is * GUAC_CHAR_CONTINUATION, this value is undefined and not applicable. */ int width; } guac_terminal_char; #endif guacamole-server-0.9.9/src/terminal/common.c0000664000175100017510000000621312626133327015764 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "types.h" #include #include int guac_terminal_fit_to_range(int value, int min, int max) { if (value < min) return min; if (value > max) return max; return value; } int guac_terminal_encode_utf8(int codepoint, char* utf8) { int i; int mask, bytes; /* Determine size and initial byte mask */ if (codepoint <= 0x007F) { mask = 0x00; bytes = 1; } else if (codepoint <= 0x7FF) { mask = 0xC0; bytes = 2; } else if (codepoint <= 0xFFFF) { mask = 0xE0; bytes = 3; } else if (codepoint <= 0x1FFFFF) { mask = 0xF0; bytes = 4; } /* Otherwise, invalid codepoint */ else { *(utf8++) = '?'; return 1; } /* Offset buffer by size */ utf8 += bytes - 1; /* Add trailing bytes, if any */ for (i=1; i>= 6; } /* Set initial byte */ *utf8 = mask | codepoint; /* Done */ return bytes; } bool guac_terminal_has_glyph(int codepoint) { return codepoint != 0 && codepoint != ' ' && codepoint != GUAC_CHAR_CONTINUATION; } int guac_terminal_write_all(int fd, const char* buffer, int size) { int remaining = size; while (remaining > 0) { /* Attempt to write data */ int ret_val = write(fd, buffer, remaining); if (ret_val <= 0) return -1; /* If successful, contine with what data remains (if any) */ remaining -= ret_val; buffer += ret_val; } return size; } int guac_terminal_fill_buffer(int fd, char* buffer, int size) { int remaining = size; while (remaining > 0) { /* Attempt to read data */ int ret_val = read(fd, buffer, remaining); if (ret_val <= 0) return -1; /* If successful, continue with what space remains (if any) */ remaining -= ret_val; buffer += ret_val; } return size; } guacamole-server-0.9.9/src/terminal/display.c0000664000175100017510000007376612643542623016164 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "common.h" #include "display.h" #include "guac_surface.h" #include "types.h" #include #include #include #include #include #include #include #include #include #include const guac_terminal_color guac_terminal_palette[16] = { /* Normal colors */ {0x00, 0x00, 0x00}, /* Black */ {0x99, 0x3E, 0x3E}, /* Red */ {0x3E, 0x99, 0x3E}, /* Green */ {0x99, 0x99, 0x3E}, /* Brown */ {0x3E, 0x3E, 0x99}, /* Blue */ {0x99, 0x3E, 0x99}, /* Magenta */ {0x3E, 0x99, 0x99}, /* Cyan */ {0x99, 0x99, 0x99}, /* White */ /* Intense colors */ {0x3E, 0x3E, 0x3E}, /* Black */ {0xFF, 0x67, 0x67}, /* Red */ {0x67, 0xFF, 0x67}, /* Green */ {0xFF, 0xFF, 0x67}, /* Brown */ {0x67, 0x67, 0xFF}, /* Blue */ {0xFF, 0x67, 0xFF}, /* Magenta */ {0x67, 0xFF, 0xFF}, /* Cyan */ {0xFF, 0xFF, 0xFF}, /* White */ }; /** * Clears the currently-selected region, removing the highlight. */ static void __guac_terminal_display_clear_select(guac_terminal_display* display) { guac_socket* socket = display->client->socket; guac_layer* select_layer = display->select_layer; guac_protocol_send_rect(socket, select_layer, 0, 0, 1, 1); guac_protocol_send_cfill(socket, GUAC_COMP_SRC, select_layer, 0x00, 0x00, 0x00, 0x00); guac_protocol_send_sync(socket, display->client->last_sent_timestamp); guac_socket_flush(socket); /* Text is no longer selected */ display->text_selected = display->selection_committed = false; } /** * Returns whether at least one character within the given range is selected. */ static bool __guac_terminal_display_selected_contains(guac_terminal_display* display, int start_row, int start_column, int end_row, int end_column) { /* If test range starts after highlight ends, does not intersect */ if (start_row > display->selection_end_row) return false; if (start_row == display->selection_end_row && start_column > display->selection_end_column) return false; /* If test range ends before highlight starts, does not intersect */ if (end_row < display->selection_start_row) return false; if (end_row == display->selection_start_row && end_column < display->selection_start_column) return false; /* Otherwise, does intersect */ return true; } /* Maps any codepoint onto a number between 0 and 511 inclusive */ int __guac_terminal_hash_codepoint(int codepoint) { /* If within one byte, just return codepoint */ if (codepoint <= 0xFF) return codepoint; /* Otherwise, map to next 256 values */ return (codepoint & 0xFF) + 0x100; } /** * Sets the attributes of the display such that future glyphs will render as * expected. */ int __guac_terminal_set_colors(guac_terminal_display* display, guac_terminal_attributes* attributes) { int background, foreground; /* Handle reverse video */ if (attributes->reverse != attributes->cursor) { background = attributes->foreground; foreground = attributes->background; } else { foreground = attributes->foreground; background = attributes->background; } /* Handle bold */ if (attributes->bold && foreground <= 7) foreground += 8; display->glyph_foreground = foreground; display->glyph_background = background; return 0; } /** * Sends the given character to the terminal at the given row and column, * rendering the character immediately. This bypasses the guac_terminal_display * mechanism and is intended for flushing of updates only. */ int __guac_terminal_set(guac_terminal_display* display, int row, int col, int codepoint) { int width; int bytes; char utf8[4]; /* Use foreground color */ const guac_terminal_color* color = &guac_terminal_palette[display->glyph_foreground]; /* Use background color */ const guac_terminal_color* background = &guac_terminal_palette[display->glyph_background]; cairo_surface_t* surface; cairo_t* cairo; int surface_width, surface_height; PangoLayout* layout; int layout_width, layout_height; int ideal_layout_width, ideal_layout_height; /* Calculate width in columns */ width = wcwidth(codepoint); if (width < 0) width = 1; /* Do nothing if glyph is empty */ if (width == 0) return 0; /* Convert to UTF-8 */ bytes = guac_terminal_encode_utf8(codepoint, utf8); surface_width = width * display->char_width; surface_height = display->char_height; ideal_layout_width = surface_width * PANGO_SCALE; ideal_layout_height = surface_height * PANGO_SCALE; /* Prepare surface */ surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, surface_width, surface_height); cairo = cairo_create(surface); /* Fill background */ cairo_set_source_rgb(cairo, background->red / 255.0, background->green / 255.0, background->blue / 255.0); cairo_rectangle(cairo, 0, 0, surface_width, surface_height); cairo_fill(cairo); /* Get layout */ layout = pango_cairo_create_layout(cairo); pango_layout_set_font_description(layout, display->font_desc); pango_layout_set_text(layout, utf8, bytes); pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER); pango_layout_get_size(layout, &layout_width, &layout_height); /* If layout bigger than available space, scale it back */ if (layout_width > ideal_layout_width || layout_height > ideal_layout_height) { double scale = fmin(ideal_layout_width / (double) layout_width, ideal_layout_height / (double) layout_height); cairo_scale(cairo, scale, scale); /* Update layout to reflect scaled surface */ pango_layout_set_width(layout, ideal_layout_width / scale); pango_layout_set_height(layout, ideal_layout_height / scale); pango_cairo_update_layout(cairo, layout); } /* Draw */ cairo_set_source_rgb(cairo, color->red / 255.0, color->green / 255.0, color->blue / 255.0); cairo_move_to(cairo, 0.0, 0.0); pango_cairo_show_layout(cairo, layout); /* Draw */ guac_common_surface_draw(display->display_surface, display->char_width * col, display->char_height * row, surface); /* Free all */ g_object_unref(layout); cairo_destroy(cairo); cairo_surface_destroy(surface); return 0; } guac_terminal_display* guac_terminal_display_alloc(guac_client* client, const char* font_name, int font_size, int dpi, int foreground, int background) { PangoFontMap* font_map; PangoFont* font; PangoFontMetrics* metrics; PangoContext* context; /* Allocate display */ guac_terminal_display* display = malloc(sizeof(guac_terminal_display)); display->client = client; /* Create default surface */ display->display_layer = guac_client_alloc_layer(client); display->select_layer = guac_client_alloc_layer(client); display->display_surface = guac_common_surface_alloc(client, client->socket, display->display_layer, 0, 0); /* Select layer is a child of the display layer */ guac_protocol_send_move(client->socket, display->select_layer, display->display_layer, 0, 0, 0); /* Get font */ display->font_desc = pango_font_description_new(); pango_font_description_set_family(display->font_desc, font_name); pango_font_description_set_weight(display->font_desc, PANGO_WEIGHT_NORMAL); pango_font_description_set_size(display->font_desc, font_size * PANGO_SCALE * dpi / 96); font_map = pango_cairo_font_map_get_default(); context = pango_font_map_create_context(font_map); font = pango_font_map_load_font(font_map, context, display->font_desc); if (font == NULL) { guac_client_abort(display->client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Unable to get font \"%s\"", font_name); return NULL; } metrics = pango_font_get_metrics(font, NULL); if (metrics == NULL) { guac_client_abort(display->client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Unable to get font metrics for font \"%s\"", font_name); return NULL; } display->default_foreground = display->glyph_foreground = foreground; display->default_background = display->glyph_background = background; /* Calculate character dimensions */ display->char_width = pango_font_metrics_get_approximate_digit_width(metrics) / PANGO_SCALE; display->char_height = (pango_font_metrics_get_descent(metrics) + pango_font_metrics_get_ascent(metrics)) / PANGO_SCALE; /* Initially empty */ display->width = 0; display->height = 0; display->operations = NULL; /* Initially nothing selected */ display->text_selected = display->selection_committed = false; return display; } void guac_terminal_display_free(guac_terminal_display* display) { /* Free operations buffers */ free(display->operations); /* Free display */ free(display); } void guac_terminal_display_copy_columns(guac_terminal_display* display, int row, int start_column, int end_column, int offset) { int i; guac_terminal_operation* src_current; guac_terminal_operation* current; /* Ignore operations outside display bounds */ if (row < 0 || row >= display->height) return; /* Fit range within bounds */ start_column = guac_terminal_fit_to_range(start_column, 0, display->width - 1); end_column = guac_terminal_fit_to_range(end_column, 0, display->width - 1); start_column = guac_terminal_fit_to_range(start_column + offset, 0, display->width - 1) - offset; end_column = guac_terminal_fit_to_range(end_column + offset, 0, display->width - 1) - offset; src_current = &(display->operations[row * display->width + start_column]); current = &(display->operations[row * display->width + start_column + offset]); /* Move data */ memmove(current, src_current, (end_column - start_column + 1) * sizeof(guac_terminal_operation)); /* Update operations */ for (i=start_column; i<=end_column; i++) { /* If no operation here, set as copy */ if (current->type == GUAC_CHAR_NOP) { current->type = GUAC_CHAR_COPY; current->row = row; current->column = i; } /* Next column */ current++; } /* If selection visible and committed, clear if update touches selection */ if (display->text_selected && display->selection_committed && __guac_terminal_display_selected_contains(display, row, start_column, row, end_column)) __guac_terminal_display_clear_select(display); } void guac_terminal_display_copy_rows(guac_terminal_display* display, int start_row, int end_row, int offset) { int row, col; guac_terminal_operation* src_current_row; guac_terminal_operation* current_row; /* Fit range within bounds */ start_row = guac_terminal_fit_to_range(start_row, 0, display->height - 1); end_row = guac_terminal_fit_to_range(end_row, 0, display->height - 1); start_row = guac_terminal_fit_to_range(start_row + offset, 0, display->height - 1) - offset; end_row = guac_terminal_fit_to_range(end_row + offset, 0, display->height - 1) - offset; src_current_row = &(display->operations[start_row * display->width]); current_row = &(display->operations[(start_row + offset) * display->width]); /* Move data */ memmove(current_row, src_current_row, (end_row - start_row + 1) * sizeof(guac_terminal_operation) * display->width); /* Update operations */ for (row=start_row; row<=end_row; row++) { guac_terminal_operation* current = current_row; for (col=0; colwidth; col++) { /* If no operation here, set as copy */ if (current->type == GUAC_CHAR_NOP) { current->type = GUAC_CHAR_COPY; current->row = row; current->column = col; } /* Next column */ current++; } /* Next row */ current_row += display->width; } /* If selection visible and committed, clear if update touches selection */ if (display->text_selected && display->selection_committed && __guac_terminal_display_selected_contains(display, start_row, 0, end_row, display->width - 1)) __guac_terminal_display_clear_select(display); } void guac_terminal_display_set_columns(guac_terminal_display* display, int row, int start_column, int end_column, guac_terminal_char* character) { int i; guac_terminal_operation* current; /* Ignore operations outside display bounds */ if (row < 0 || row >= display->height) return; /* Fit range within bounds */ start_column = guac_terminal_fit_to_range(start_column, 0, display->width - 1); end_column = guac_terminal_fit_to_range(end_column, 0, display->width - 1); current = &(display->operations[row * display->width + start_column]); /* For each column in range */ for (i = start_column; i <= end_column; i += character->width) { /* Set operation */ current->type = GUAC_CHAR_SET; current->character = *character; /* Next character */ current += character->width; } /* If selection visible and committed, clear if update touches selection */ if (display->text_selected && display->selection_committed && __guac_terminal_display_selected_contains(display, row, start_column, row, end_column)) __guac_terminal_display_clear_select(display); } void guac_terminal_display_resize(guac_terminal_display* display, int width, int height) { guac_terminal_operation* current; int x, y; /* Fill with background color */ guac_terminal_char fill = { .value = 0, .attributes = { .foreground = display->default_background, .background = display->default_background }, .width = 1 }; /* Free old operations buffer */ if (display->operations != NULL) free(display->operations); /* Alloc operations */ display->operations = malloc(width * height * sizeof(guac_terminal_operation)); /* Init each operation buffer row */ current = display->operations; for (y=0; ywidth && y < display->height) current->type = GUAC_CHAR_NOP; /* Otherwise, clear contents first */ else { current->type = GUAC_CHAR_SET; current->character = fill; } current++; } } /* Set width and height */ display->width = width; display->height = height; /* Send display size */ guac_common_surface_resize( display->display_surface, display->char_width * width, display->char_height * height); guac_protocol_send_size(display->client->socket, display->select_layer, display->char_width * width, display->char_height * height); /* If selection visible and committed, clear */ if (display->text_selected && display->selection_committed) __guac_terminal_display_clear_select(display); } void __guac_terminal_display_flush_copy(guac_terminal_display* display) { guac_terminal_operation* current = display->operations; int row, col; /* For each operation */ for (row=0; rowheight; row++) { for (col=0; colwidth; col++) { /* If operation is a copy operation */ if (current->type == GUAC_CHAR_COPY) { /* The determined bounds of the rectangle of contiguous * operations */ int detected_right = -1; int detected_bottom = row; /* The current row or column within a rectangle */ int rect_row, rect_col; /* The dimensions of the rectangle as determined */ int rect_width, rect_height; /* The expected row and column source for the next copy * operation (if adjacent to current) */ int expected_row, expected_col; /* Current row within a subrect */ guac_terminal_operation* rect_current_row; /* Determine bounds of rectangle */ rect_current_row = current; expected_row = current->row; for (rect_row=row; rect_rowheight; rect_row++) { guac_terminal_operation* rect_current = rect_current_row; expected_col = current->column; /* Find width */ for (rect_col=col; rect_colwidth; rect_col++) { /* If not identical operation, stop */ if (rect_current->type != GUAC_CHAR_COPY || rect_current->row != expected_row || rect_current->column != expected_col) break; /* Next column */ rect_current++; expected_col++; } /* If too small, cannot append row */ if (rect_col-1 < detected_right) break; /* As row has been accepted, update rect_row of rect */ detected_bottom = rect_row; /* For now, only set rect_col bound if uninitialized */ if (detected_right == -1) detected_right = rect_col - 1; /* Next row */ rect_current_row += display->width; expected_row++; } /* Calculate dimensions */ rect_width = detected_right - col + 1; rect_height = detected_bottom - row + 1; /* Mark rect as NOP (as it has been handled) */ rect_current_row = current; expected_row = current->row; for (rect_row=0; rect_rowcolumn; for (rect_col=0; rect_coltype == GUAC_CHAR_COPY && rect_current->row == expected_row && rect_current->column == expected_col) rect_current->type = GUAC_CHAR_NOP; /* Next column */ rect_current++; expected_col++; } /* Next row */ rect_current_row += display->width; expected_row++; } /* Send copy */ guac_common_surface_copy( display->display_surface, current->column * display->char_width, current->row * display->char_height, rect_width * display->char_width, rect_height * display->char_height, display->display_surface, col * display->char_width, row * display->char_height); } /* end if copy operation */ /* Next operation */ current++; } } } void __guac_terminal_display_flush_clear(guac_terminal_display* display) { guac_terminal_operation* current = display->operations; int row, col; /* For each operation */ for (row=0; rowheight; row++) { for (col=0; colwidth; col++) { /* If operation is a cler operation (set to space) */ if (current->type == GUAC_CHAR_SET && !guac_terminal_has_glyph(current->character.value)) { /* The determined bounds of the rectangle of contiguous * operations */ int detected_right = -1; int detected_bottom = row; /* The current row or column within a rectangle */ int rect_row, rect_col; /* The dimensions of the rectangle as determined */ int rect_width, rect_height; /* Color of the rectangle to draw */ int color; if (current->character.attributes.reverse != current->character.attributes.cursor) color = current->character.attributes.foreground; else color = current->character.attributes.background; const guac_terminal_color* guac_color = &guac_terminal_palette[color]; /* Current row within a subrect */ guac_terminal_operation* rect_current_row; /* Determine bounds of rectangle */ rect_current_row = current; for (rect_row=row; rect_rowheight; rect_row++) { guac_terminal_operation* rect_current = rect_current_row; /* Find width */ for (rect_col=col; rect_colwidth; rect_col++) { int joining_color; if (rect_current->character.attributes.reverse != rect_current->character.attributes.cursor) joining_color = rect_current->character.attributes.foreground; else joining_color = rect_current->character.attributes.background; /* If not identical operation, stop */ if (rect_current->type != GUAC_CHAR_SET || guac_terminal_has_glyph(rect_current->character.value) || joining_color != color) break; /* Next column */ rect_current++; } /* If too small, cannot append row */ if (rect_col-1 < detected_right) break; /* As row has been accepted, update rect_row of rect */ detected_bottom = rect_row; /* For now, only set rect_col bound if uninitialized */ if (detected_right == -1) detected_right = rect_col - 1; /* Next row */ rect_current_row += display->width; } /* Calculate dimensions */ rect_width = detected_right - col + 1; rect_height = detected_bottom - row + 1; /* Mark rect as NOP (as it has been handled) */ rect_current_row = current; for (rect_row=0; rect_rowcharacter.attributes.reverse != rect_current->character.attributes.cursor) joining_color = rect_current->character.attributes.foreground; else joining_color = rect_current->character.attributes.background; /* Mark clear operations as NOP */ if (rect_current->type == GUAC_CHAR_SET && !guac_terminal_has_glyph(rect_current->character.value) && joining_color == color) rect_current->type = GUAC_CHAR_NOP; /* Next column */ rect_current++; } /* Next row */ rect_current_row += display->width; } /* Send rect */ guac_common_surface_rect( display->display_surface, col * display->char_width, row * display->char_height, rect_width * display->char_width, rect_height * display->char_height, guac_color->red, guac_color->green, guac_color->blue); } /* end if clear operation */ /* Next operation */ current++; } } } void __guac_terminal_display_flush_set(guac_terminal_display* display) { guac_terminal_operation* current = display->operations; int row, col; /* For each operation */ for (row=0; rowheight; row++) { for (col=0; colwidth; col++) { /* Perform given operation */ if (current->type == GUAC_CHAR_SET) { int codepoint = current->character.value; /* Use space if no glyph */ if (!guac_terminal_has_glyph(codepoint)) codepoint = ' '; /* Set attributes */ __guac_terminal_set_colors(display, &(current->character.attributes)); /* Send character */ __guac_terminal_set(display, row, col, codepoint); /* Mark operation as handled */ current->type = GUAC_CHAR_NOP; } /* Next operation */ current++; } } } void guac_terminal_display_flush(guac_terminal_display* display) { /* Flush operations, copies first, then clears, then sets. */ __guac_terminal_display_flush_copy(display); __guac_terminal_display_flush_clear(display); __guac_terminal_display_flush_set(display); /* Flush surface */ guac_common_surface_flush(display->display_surface); } void guac_terminal_display_commit_select(guac_terminal_display* display) { display->selection_committed = true; } void guac_terminal_display_select(guac_terminal_display* display, int start_row, int start_col, int end_row, int end_col) { guac_socket* socket = display->client->socket; guac_layer* select_layer = display->select_layer; /* Text is now selected */ display->text_selected = true; display->selection_start_row = start_row; display->selection_start_column = start_col; display->selection_end_row = end_row; display->selection_end_column = end_col; /* If single row, just need one rectangle */ if (start_row == end_row) { /* Ensure proper ordering of columns */ if (start_col > end_col) { int temp = start_col; start_col = end_col; end_col = temp; } /* Select characters between columns */ guac_protocol_send_rect(socket, select_layer, start_col * display->char_width, start_row * display->char_height, (end_col - start_col + 1) * display->char_width, display->char_height); } /* Otherwise, need three */ else { /* Ensure proper ordering of start and end coords */ if (start_row > end_row) { int temp; temp = start_row; start_row = end_row; end_row = temp; temp = start_col; start_col = end_col; end_col = temp; } /* First row */ guac_protocol_send_rect(socket, select_layer, start_col * display->char_width, start_row * display->char_height, display->width * display->char_width, display->char_height); /* Middle */ guac_protocol_send_rect(socket, select_layer, 0, (start_row + 1) * display->char_height, display->width * display->char_width, (end_row - start_row - 1) * display->char_height); /* Last row */ guac_protocol_send_rect(socket, select_layer, 0, end_row * display->char_height, (end_col + 1) * display->char_width, display->char_height); } /* Draw new selection, erasing old */ guac_protocol_send_cfill(socket, GUAC_COMP_SRC, select_layer, 0x00, 0x80, 0xFF, 0x60); guac_protocol_send_sync(socket, display->client->last_sent_timestamp); guac_socket_flush(socket); } guacamole-server-0.9.9/src/terminal/pointer.h0000664000175100017510000000411412643542623016161 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 GUAC_TERMINAL_POINTER_H #define GUAC_TERMINAL_POINTER_H #include "config.h" #include #include /** * Width of the embedded mouse cursor graphic. */ extern const int guac_terminal_pointer_width; /** * Height of the embedded mouse cursor graphic. */ extern const int guac_terminal_pointer_height; /** * Number of bytes in each row of the embedded mouse cursor graphic. */ extern const int guac_terminal_pointer_stride; /** * The Cairo grapic format of the mouse cursor graphic. */ extern const cairo_format_t guac_terminal_pointer_format; /** * Embedded mouse cursor graphic. */ extern unsigned char guac_terminal_pointer[]; /** * Creates a new pointer cursor, returning the corresponding cursor object. * * @param client * The guac_client to send the cursor to. * * @return * A new cursor which must be free'd via guac_terminal_cursor_free(). */ guac_terminal_cursor* guac_terminal_create_pointer(guac_client* client); #endif guacamole-server-0.9.9/src/terminal/buffer.c0000664000175100017510000001470612536405625015756 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "buffer.h" #include "common.h" #include #include guac_terminal_buffer* guac_terminal_buffer_alloc(int rows, guac_terminal_char* default_character) { /* Allocate scrollback */ guac_terminal_buffer* buffer = malloc(sizeof(guac_terminal_buffer)); int i; guac_terminal_buffer_row* row; /* Init scrollback data */ buffer->default_character = *default_character; buffer->available = rows; buffer->top = 0; buffer->length = 0; buffer->rows = malloc(sizeof(guac_terminal_buffer_row) * buffer->available); /* Init scrollback rows */ row = buffer->rows; for (i=0; iavailable = 256; row->length = 0; row->characters = malloc(sizeof(guac_terminal_char) * row->available); /* Next row */ row++; } return buffer; } void guac_terminal_buffer_free(guac_terminal_buffer* buffer) { int i; guac_terminal_buffer_row* row = buffer->rows; /* Free all rows */ for (i=0; iavailable; i++) { free(row->characters); row++; } /* Free actual buffer */ free(buffer->rows); free(buffer); } guac_terminal_buffer_row* guac_terminal_buffer_get_row(guac_terminal_buffer* buffer, int row, int width) { int i; guac_terminal_char* first; guac_terminal_buffer_row* buffer_row; /* Calculate scrollback row index */ int index = buffer->top + row; if (index < 0) index += buffer->available; else if (index >= buffer->available) index -= buffer->available; /* Get row */ buffer_row = &(buffer->rows[index]); /* If resizing is needed */ if (width >= buffer_row->length) { /* Expand if necessary */ if (width > buffer_row->available) { buffer_row->available = width*2; buffer_row->characters = realloc(buffer_row->characters, sizeof(guac_terminal_char) * buffer_row->available); } /* Initialize new part of row */ first = &(buffer_row->characters[buffer_row->length]); for (i=buffer_row->length; idefault_character; buffer_row->length = width; } /* Return found row */ return buffer_row; } void guac_terminal_buffer_copy_columns(guac_terminal_buffer* buffer, int row, int start_column, int end_column, int offset) { guac_terminal_char* src; guac_terminal_char* dst; /* Get row */ guac_terminal_buffer_row* buffer_row = guac_terminal_buffer_get_row(buffer, row, end_column + offset + 1); /* Fit range within bounds */ start_column = guac_terminal_fit_to_range(start_column, 0, buffer_row->length - 1); end_column = guac_terminal_fit_to_range(end_column, 0, buffer_row->length - 1); start_column = guac_terminal_fit_to_range(start_column + offset, 0, buffer_row->length - 1) - offset; end_column = guac_terminal_fit_to_range(end_column + offset, 0, buffer_row->length - 1) - offset; /* Determine source and destination locations */ src = &(buffer_row->characters[start_column]); dst = &(buffer_row->characters[start_column + offset]); /* Copy data */ memmove(dst, src, sizeof(guac_terminal_char) * (end_column - start_column + 1)); } void guac_terminal_buffer_copy_rows(guac_terminal_buffer* buffer, int start_row, int end_row, int offset) { int i, current_row; int step; /* If shifting down, copy in reverse */ if (offset > 0) { current_row = end_row; step = -1; } /* Otherwise, copy forwards */ else { current_row = start_row; step = 1; } /* Copy each current_row individually */ for (i = start_row; i <= end_row; i++) { /* Get source and destination rows */ guac_terminal_buffer_row* src_row = guac_terminal_buffer_get_row(buffer, current_row, 0); guac_terminal_buffer_row* dst_row = guac_terminal_buffer_get_row(buffer, current_row + offset, src_row->length); /* Copy data */ memcpy(dst_row->characters, src_row->characters, sizeof(guac_terminal_char) * src_row->length); dst_row->length = src_row->length; /* Next current_row */ current_row += step; } } void guac_terminal_buffer_set_columns(guac_terminal_buffer* buffer, int row, int start_column, int end_column, guac_terminal_char* character) { int i, j; guac_terminal_char* current; /* Build continuation char (for multicolumn characters) */ guac_terminal_char continuation_char; continuation_char.value = GUAC_CHAR_CONTINUATION; continuation_char.attributes = character->attributes; continuation_char.width = 0; /* Not applicable for GUAC_CHAR_CONTINUATION */ /* Get and expand row */ guac_terminal_buffer_row* buffer_row = guac_terminal_buffer_get_row(buffer, row, end_column+1); /* Set values */ current = &(buffer_row->characters[start_column]); for (i = start_column; i <= end_column; i += character->width) { *(current++) = *character; /* Store any required continuation characters */ for (j=1; j < character->width; j++) *(current++) = continuation_char; } /* Update length depending on row written */ if (character->value != 0 && row >= buffer->length) buffer->length = row+1; } guacamole-server-0.9.9/src/terminal/pointer.c0000664000175100017510000000604212643542623016156 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "config.h" #include "cursor.h" #include #include #include #include /* Macros for prettying up the embedded image. */ #define X 0x00,0x00,0x00,0xFF #define U 0x80,0x80,0x80,0xFF #define O 0xFF,0xFF,0xFF,0xFF #define _ 0x00,0x00,0x00,0x00 /* Dimensions */ const int guac_terminal_pointer_width = 11; const int guac_terminal_pointer_height = 16; /* Format */ const cairo_format_t guac_terminal_pointer_format = CAIRO_FORMAT_ARGB32; const int guac_terminal_pointer_stride = 44; /* Embedded pointer graphic */ unsigned char guac_terminal_pointer[] = { O,_,_,_,_,_,_,_,_,_,_, O,O,_,_,_,_,_,_,_,_,_, O,X,O,_,_,_,_,_,_,_,_, O,X,X,O,_,_,_,_,_,_,_, O,X,X,X,O,_,_,_,_,_,_, O,X,X,X,X,O,_,_,_,_,_, O,X,X,X,X,X,O,_,_,_,_, O,X,X,X,X,X,X,O,_,_,_, O,X,X,X,X,X,X,X,O,_,_, O,X,X,X,X,X,X,X,X,O,_, O,X,X,X,X,X,O,O,O,O,O, O,X,X,O,X,X,O,_,_,_,_, O,X,O,_,O,X,X,O,_,_,_, O,O,_,_,O,X,X,O,_,_,_, O,_,_,_,_,O,X,X,O,_,_, _,_,_,_,_,O,O,O,O,_,_ }; guac_terminal_cursor* guac_terminal_create_pointer(guac_client* client) { guac_socket* socket = client->socket; guac_terminal_cursor* cursor = guac_terminal_cursor_alloc(client); /* Draw to buffer */ cairo_surface_t* graphic = cairo_image_surface_create_for_data( guac_terminal_pointer, guac_terminal_pointer_format, guac_terminal_pointer_width, guac_terminal_pointer_height, guac_terminal_pointer_stride); guac_client_stream_png(client, socket, GUAC_COMP_SRC, cursor->buffer, 0, 0, graphic); cairo_surface_destroy(graphic); /* Initialize cursor properties */ cursor->width = guac_terminal_pointer_width; cursor->height = guac_terminal_pointer_height; cursor->hotspot_x = 0; cursor->hotspot_y = 0; return cursor; } guacamole-server-0.9.9/src/terminal/display.h0000664000175100017510000002067512626133327016156 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_TERMINAL_DISPLAY_H #define _GUAC_TERMINAL_DISPLAY_H #include "config.h" #include "guac_surface.h" #include "types.h" #include #include #include #include /** * The maximum width of any character, in columns. */ #define GUAC_TERMINAL_MAX_CHAR_WIDTH 2 /** * The index of black within the terminal color palette. */ #define GUAC_TERMINAL_COLOR_BLACK 0 /** * The index of low-intensity red within the terminal color palette. */ #define GUAC_TERMINAL_COLOR_DARK_RED 1 /** * The index of low-intensity green within the terminal color palette. */ #define GUAC_TERMINAL_COLOR_DARK_GREEN 2 /** * The index of brown within the terminal color palette. */ #define GUAC_TERMINAL_COLOR_BROWN 3 /** * The index of low-intensity blue within the terminal color palette. */ #define GUAC_TERMINAL_COLOR_DARK_BLUE 4 /** * The index of low-intensity magenta (purple) within the terminal color * palette. */ #define GUAC_TERMINAL_COLOR_PURPLE 5 /** * The index of low-intensity cyan (teal) within the terminal color palette. */ #define GUAC_TERMINAL_COLOR_TEAL 6 /** * The index of low-intensity white (gray) within the terminal color palette. */ #define GUAC_TERMINAL_COLOR_GRAY 7 /** * The index of bright black (dark gray) within the terminal color palette. */ #define GUAC_TERMINAL_COLOR_DARK_GRAY 8 /** * The index of bright red within the terminal color palette. */ #define GUAC_TERMINAL_COLOR_RED 9 /** * The index of bright green within the terminal color palette. */ #define GUAC_TERMINAL_COLOR_GREEN 10 /** * The index of bright brown (yellow) within the terminal color palette. */ #define GUAC_TERMINAL_COLOR_YELLOW 11 /** * The index of bright blue within the terminal color palette. */ #define GUAC_TERMINAL_COLOR_BLUE 12 /** * The index of bright magenta within the terminal color palette. */ #define GUAC_TERMINAL_COLOR_MAGENTA 13 /** * The index of bright cyan within the terminal color palette. */ #define GUAC_TERMINAL_COLOR_CYAN 14 /** * The index of bright white within the terminal color palette. */ #define GUAC_TERMINAL_COLOR_WHITE 15 /** * The available color palette. All integer colors within structures * here are indices into this palette. */ extern const guac_terminal_color guac_terminal_palette[16]; /** * All available terminal operations which affect character cells. */ typedef enum guac_terminal_operation_type { /** * Operation which does nothing. */ GUAC_CHAR_NOP, /** * Operation which copies a character from a given row/column coordinate. */ GUAC_CHAR_COPY, /** * Operation which sets the character and attributes. */ GUAC_CHAR_SET } guac_terminal_operation_type; /** * A pairing of a guac_terminal_operation_type and all parameters required by * that operation type. */ typedef struct guac_terminal_operation { /** * The type of operation to perform. */ guac_terminal_operation_type type; /** * The character (and attributes) to set the current location to. This is * only applicable to GUAC_CHAR_SET. */ guac_terminal_char character; /** * The row to copy a character from. This is only applicable to * GUAC_CHAR_COPY. */ int row; /** * The column to copy a character from. This is only applicable to * GUAC_CHAR_COPY. */ int column; } guac_terminal_operation; /** * Set of all pending operations for the currently-visible screen area. */ typedef struct guac_terminal_display { /** * The Guacamole client this display will use for rendering. */ guac_client* client; /** * Array of all operations pending for the visible screen area. */ guac_terminal_operation* operations; /** * The width of the screen, in characters. */ int width; /** * The height of the screen, in characters. */ int height; /** * The description of the font to use for rendering. */ PangoFontDescription* font_desc; /** * The width of each character, in pixels. */ int char_width; /** * The height of each character, in pixels. */ int char_height; /** * Default foreground color for all glyphs. */ int default_foreground; /** * Default background color for all glyphs and the terminal itself. */ int default_background; /** * Color of glyphs in copy buffer */ int glyph_foreground; /** * Color of glyphs in copy buffer */ int glyph_background; /** * The surface containing the actual terminal. */ guac_common_surface* display_surface; /** * Layer which contains the actual terminal. */ guac_layer* display_layer; /** * Sub-layer of display layer which highlights selected text. */ guac_layer* select_layer; /** * Whether text is being selected. */ bool text_selected; /** * Whether the selection is finished, and will no longer be modified. A * committed selection remains highlighted for reference, but the * highlight will be removed when the display changes. */ bool selection_committed; /** * The row that the selection starts at. */ int selection_start_row; /** * The column that the selection starts at. */ int selection_start_column; /** * The row that the selection ends at. */ int selection_end_row; /** * The column that the selection ends at. */ int selection_end_column; } guac_terminal_display; /** * Allocates a new display having the given default foreground and background * colors. */ guac_terminal_display* guac_terminal_display_alloc(guac_client* client, const char* font_name, int font_size, int dpi, int foreground, int background); /** * Frees the given display. */ void guac_terminal_display_free(guac_terminal_display* display); /** * Copies the given range of columns to a new location, offset from * the original by the given number of columns. */ void guac_terminal_display_copy_columns(guac_terminal_display* display, int row, int start_column, int end_column, int offset); /** * Copies the given range of rows to a new location, offset from the * original by the given number of rows. */ void guac_terminal_display_copy_rows(guac_terminal_display* display, int start_row, int end_row, int offset); /** * Sets the given range of columns within the given row to the given * character. */ void guac_terminal_display_set_columns(guac_terminal_display* display, int row, int start_column, int end_column, guac_terminal_char* character); /** * Resize the terminal to the given dimensions. */ void guac_terminal_display_resize(guac_terminal_display* display, int width, int height); /** * Flushes all pending operations within the given guac_terminal_display. */ void guac_terminal_display_flush(guac_terminal_display* display); /** * Draws the text selection rectangle from the given coordinates to the given end coordinates. */ void guac_terminal_display_select(guac_terminal_display* display, int start_row, int start_col, int end_row, int end_col); /** * Commits the select rectangle, allowing the display to clear it when * necessary. */ void guac_terminal_display_commit_select(guac_terminal_display* display); #endif guacamole-server-0.9.9/src/terminal/terminal_handlers.h0000664000175100017510000000344212645364210020173 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_TERMINAL_HANDLERS #define _GUAC_TERMINAL_HANDLERS #include "config.h" #include "terminal.h" int guac_terminal_echo(guac_terminal* term, unsigned char c); int guac_terminal_escape(guac_terminal* term, unsigned char c); int guac_terminal_g0_charset(guac_terminal* term, unsigned char c); int guac_terminal_g1_charset(guac_terminal* term, unsigned char c); int guac_terminal_csi(guac_terminal* term, unsigned char c); int guac_terminal_download(guac_terminal* term, unsigned char c); int guac_terminal_set_directory(guac_terminal* term, unsigned char c); int guac_terminal_osc(guac_terminal* term, unsigned char c); int guac_terminal_ctrl_func(guac_terminal* term, unsigned char c); #endif guacamole-server-0.9.9/src/terminal/buffer.h0000664000175100017510000000777412536405625015772 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_TERMINAL_BUFFER_H #define _GUAC_TERMINAL_BUFFER_H #include "config.h" #include "types.h" /** * A single variable-length row of terminal data. */ typedef struct guac_terminal_buffer_row { /** * Array of guac_terminal_char representing the contents of the row. */ guac_terminal_char* characters; /** * The length of this row in characters. This is the number of initialized * characters in the buffer, usually equal to the number of characters * in the screen width at the time this row was created. */ int length; /** * The number of elements in the characters array. After the length * equals this value, the array must be resized. */ int available; } guac_terminal_buffer_row; /** * A buffer containing a constant number of arbitrary-length rows. * New rows can be appended to the buffer, with the oldest row replaced with * the new row. */ typedef struct guac_terminal_buffer { /** * The character to assign to newly-allocated cells. */ guac_terminal_char default_character; /** * Array of buffer rows. This array functions as a ring buffer. * When a new row needs to be appended, the top reference is moved down * and the old top row is replaced. */ guac_terminal_buffer_row* rows; /** * The row to replace when adding a new row to the buffer. */ int top; /** * The number of rows currently stored in the buffer. */ int length; /** * The number of rows in the buffer. This is the total capacity * of the buffer. */ int available; } guac_terminal_buffer; /** * Allocates a new buffer having the given maximum number of rows. New character cells will * be initialized to the given character. */ guac_terminal_buffer* guac_terminal_buffer_alloc(int rows, guac_terminal_char* default_character); /** * Frees the given buffer. */ void guac_terminal_buffer_free(guac_terminal_buffer* buffer); /** * Returns the row at the given location. The row returned is guaranteed to be at least the given * width. */ guac_terminal_buffer_row* guac_terminal_buffer_get_row(guac_terminal_buffer* buffer, int row, int width); /** * Copies the given range of columns to a new location, offset from * the original by the given number of columns. */ void guac_terminal_buffer_copy_columns(guac_terminal_buffer* buffer, int row, int start_column, int end_column, int offset); /** * Copies the given range of rows to a new location, offset from the * original by the given number of rows. */ void guac_terminal_buffer_copy_rows(guac_terminal_buffer* buffer, int start_row, int end_row, int offset); /** * Sets the given range of columns within the given row to the given * character. */ void guac_terminal_buffer_set_columns(guac_terminal_buffer* buffer, int row, int start_column, int end_column, guac_terminal_char* character); #endif guacamole-server-0.9.9/src/terminal/Makefile.am0000664000175100017510000000467412643542623016377 00000000000000# # Copyright (C) 2015 Glyptodon LLC # # 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. # AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 noinst_LTLIBRARIES = libguac_terminal.la noinst_HEADERS = \ blank.h \ buffer.h \ char_mappings.h \ common.h \ cursor.h \ display.h \ ibar.h \ packet.h \ pointer.h \ scrollbar.h \ terminal.h \ terminal_handlers.h \ types.h libguac_terminal_la_SOURCES = \ blank.c \ buffer.c \ char_mappings.c \ common.c \ cursor.c \ display.c \ ibar.c \ packet.c \ pointer.c \ scrollbar.c \ terminal.c \ terminal_handlers.c libguac_terminal_la_CFLAGS = \ -Werror -Wall -pedantic \ @COMMON_INCLUDE@ \ @LIBGUAC_INCLUDE@ \ @PANGO_CFLAGS@ \ @PANGOCAIRO_CFLAGS@ libguac_terminal_la_LIBADD = \ @LIBGUAC_LTLIB@ libguac_terminal_la_LDFLAGS = \ @CAIRO_LIBS@ \ @MATH_LIBS@ \ @PANGO_LIBS@ \ @PANGOCAIRO_LIBS@ \ @PTHREAD_LIBS@ guacamole-server-0.9.9/src/terminal/scrollbar.c0000664000175100017510000003057712626133327016471 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "config.h" #include "scrollbar.h" #include #include #include #include #include guac_terminal_scrollbar* guac_terminal_scrollbar_alloc(guac_client* client, const guac_layer* parent, int parent_width, int parent_height, int visible_area) { /* Allocate scrollbar */ guac_terminal_scrollbar* scrollbar = malloc(sizeof(guac_terminal_scrollbar)); /* Associate client */ scrollbar->client = client; /* Init default min/max and value */ scrollbar->min = 0; scrollbar->max = 0; scrollbar->value = 0; /* Init parent data */ scrollbar->parent = parent; scrollbar->parent_width = 0; scrollbar->parent_height = 0; scrollbar->visible_area = 0; /* Init handle render state */ scrollbar->render_state.handle_x = 0; scrollbar->render_state.handle_y = 0; scrollbar->render_state.handle_width = 0; scrollbar->render_state.handle_height = 0; /* Init container render state */ scrollbar->render_state.container_x = 0; scrollbar->render_state.container_y = 0; scrollbar->render_state.container_width = 0; scrollbar->render_state.container_height = 0; /* Allocate and init layers */ scrollbar->container = guac_client_alloc_layer(client); scrollbar->handle = guac_client_alloc_layer(client); /* Init mouse event state tracking */ scrollbar->dragging_handle = 0; /* Reposition and resize to fit parent */ guac_terminal_scrollbar_parent_resized(scrollbar, parent_width, parent_height, visible_area); return scrollbar; } void guac_terminal_scrollbar_free(guac_terminal_scrollbar* scrollbar) { /* Free layers */ guac_client_free_layer(scrollbar->client, scrollbar->handle); guac_client_free_layer(scrollbar->client, scrollbar->container); /* Free scrollbar */ free(scrollbar); } /** * Calculates the state of the scroll bar, given its minimum, maximum, current * values, and the state of any dragging operation. The resulting render state * will not be reflected graphically unless the scrollbar is flushed, and any * resulting value will not be assigned to the scrollbar unless explicitly set * with guac_terminal_scrollbar_set_value(). * * @param scrollbar * The scrollbar whose state should be calculated. * * @param render_state * A pointer to an existing guac_terminal_scrollbar_render_state that will * be populated with the calculated result. * * @param value * A pointer to an existing int that will be populated with the updated * scrollbar value. */ static void calculate_state(guac_terminal_scrollbar* scrollbar, guac_terminal_scrollbar_render_state* render_state, int* value) { /* Use unchanged current value by default */ *value = scrollbar->value; /* Calculate container dimensions */ render_state->container_width = GUAC_TERMINAL_SCROLLBAR_WIDTH; render_state->container_height = scrollbar->parent_height; /* Calculate container position */ render_state->container_x = scrollbar->parent_width - render_state->container_width; render_state->container_y = 0; /* Calculate handle dimensions */ render_state->handle_width = render_state->container_width - GUAC_TERMINAL_SCROLLBAR_PADDING*2; /* Handle can be no bigger than the scrollbar itself */ int max_handle_height = render_state->container_height - GUAC_TERMINAL_SCROLLBAR_PADDING*2; /* Calculate legal delta between scroll values */ int scroll_delta; if (scrollbar->max > scrollbar->min) scroll_delta = scrollbar->max - scrollbar->min; else scroll_delta = 0; /* Scale handle relative to visible area vs. scrolling region size */ int proportional_height = max_handle_height * scrollbar->visible_area / (scroll_delta + scrollbar->visible_area); /* Ensure handle is no smaller than minimum height */ if (proportional_height > GUAC_TERMINAL_SCROLLBAR_MIN_HEIGHT) render_state->handle_height = proportional_height; else render_state->handle_height = GUAC_TERMINAL_SCROLLBAR_MIN_HEIGHT; /* Ensure handle is no larger than maximum height */ if (render_state->handle_height > max_handle_height) render_state->handle_height = max_handle_height; /* Calculate handle X position */ render_state->handle_x = GUAC_TERMINAL_SCROLLBAR_PADDING; /* Calculate handle Y range */ int min_handle_y = GUAC_TERMINAL_SCROLLBAR_PADDING; int max_handle_y = min_handle_y + max_handle_height - render_state->handle_height; /* Position handle relative to mouse if being dragged */ if (scrollbar->dragging_handle) { int dragged_handle_y = scrollbar->drag_current_y - scrollbar->drag_offset_y; /* Keep handle within bounds */ if (dragged_handle_y < min_handle_y) dragged_handle_y = min_handle_y; else if (dragged_handle_y > max_handle_y) dragged_handle_y = max_handle_y; render_state->handle_y = dragged_handle_y; /* Calculate scrollbar value */ if (max_handle_y > min_handle_y) { *value = scrollbar->min + (dragged_handle_y - min_handle_y) * scroll_delta / (max_handle_y - min_handle_y); } } /* Handle Y position is relative to current scroll value */ else if (scroll_delta > 0) render_state->handle_y = min_handle_y + (max_handle_y - min_handle_y) * (scrollbar->value - scrollbar->min) / scroll_delta; /* ... unless there is only one possible scroll value */ else render_state->handle_y = GUAC_TERMINAL_SCROLLBAR_PADDING; } void guac_terminal_scrollbar_flush(guac_terminal_scrollbar* scrollbar) { guac_socket* socket = scrollbar->client->socket; /* Get old state */ int old_value = scrollbar->value; guac_terminal_scrollbar_render_state* old_state = &scrollbar->render_state; /* Calculate new state */ int new_value; guac_terminal_scrollbar_render_state new_state; calculate_state(scrollbar, &new_state, &new_value); /* Notify of scroll if value is changing */ if (new_value != old_value && scrollbar->scroll_handler) scrollbar->scroll_handler(scrollbar, new_value); /* Reposition container if moved */ if (old_state->container_x != new_state.container_x || old_state->container_y != new_state.container_y) { guac_protocol_send_move(socket, scrollbar->container, scrollbar->parent, new_state.container_x, new_state.container_y, 0); } /* Resize and redraw container if size changed */ if (old_state->container_width != new_state.container_width || old_state->container_height != new_state.container_height) { /* Set new size */ guac_protocol_send_size(socket, scrollbar->container, new_state.container_width, new_state.container_height); /* Fill container with solid color */ guac_protocol_send_rect(socket, scrollbar->container, 0, 0, new_state.container_width, new_state.container_height); guac_protocol_send_cfill(socket, GUAC_COMP_SRC, scrollbar->container, 0x80, 0x80, 0x80, 0x40); } /* Reposition handle if moved */ if (old_state->handle_x != new_state.handle_x || old_state->handle_y != new_state.handle_y) { guac_protocol_send_move(socket, scrollbar->handle, scrollbar->container, new_state.handle_x, new_state.handle_y, 0); } /* Resize and redraw handle if size changed */ if (old_state->handle_width != new_state.handle_width || old_state->handle_height != new_state.handle_height) { /* Send new size */ guac_protocol_send_size(socket, scrollbar->handle, new_state.handle_width, new_state.handle_height); /* Fill and stroke handle with solid color */ guac_protocol_send_rect(socket, scrollbar->handle, 0, 0, new_state.handle_width, new_state.handle_height); guac_protocol_send_cfill(socket, GUAC_COMP_SRC, scrollbar->handle, 0xA0, 0xA0, 0xA0, 0x8F); } /* Store current render state */ scrollbar->render_state = new_state; } void guac_terminal_scrollbar_set_bounds(guac_terminal_scrollbar* scrollbar, int min, int max) { /* Fit value within bounds */ if (scrollbar->value > max) scrollbar->value = max; else if (scrollbar->value < min) scrollbar->value = min; /* Update bounds */ scrollbar->min = min; scrollbar->max = max; } void guac_terminal_scrollbar_set_value(guac_terminal_scrollbar* scrollbar, int value) { /* Fit value within bounds */ if (value > scrollbar->max) value = scrollbar->max; else if (value < scrollbar->min) value = scrollbar->min; /* Update value */ scrollbar->value = value; } void guac_terminal_scrollbar_parent_resized(guac_terminal_scrollbar* scrollbar, int parent_width, int parent_height, int visible_area) { /* Assign new dimensions */ scrollbar->parent_width = parent_width; scrollbar->parent_height = parent_height; scrollbar->visible_area = visible_area; } int guac_terminal_scrollbar_handle_mouse(guac_terminal_scrollbar* scrollbar, int x, int y, int mask) { /* Get container rectangle bounds */ int parent_left = scrollbar->render_state.container_x; int parent_top = scrollbar->render_state.container_y; int parent_right = parent_left + scrollbar->render_state.container_width; int parent_bottom = parent_top + scrollbar->render_state.container_height; /* Calculate handle rectangle bounds */ int handle_left = parent_left + scrollbar->render_state.handle_x; int handle_top = parent_top + scrollbar->render_state.handle_y; int handle_right = handle_left + scrollbar->render_state.handle_width; int handle_bottom = handle_top + scrollbar->render_state.handle_height; /* Handle click on handle */ if (scrollbar->dragging_handle) { /* Update drag while mouse button is held */ if (mask & GUAC_CLIENT_MOUSE_LEFT) scrollbar->drag_current_y = y; /* Stop drag if mouse button is released */ else scrollbar->dragging_handle = 0; /* Mouse event was handled by scrollbar */ return 1; } else if (mask == GUAC_CLIENT_MOUSE_LEFT && x >= handle_left && x < handle_right && y >= handle_top && y < handle_bottom) { /* Start drag */ scrollbar->dragging_handle = 1; scrollbar->drag_offset_y = y - handle_top; scrollbar->drag_current_y = y; /* Mouse event was handled by scrollbar */ return 1; } /* Eat any events that occur within the scrollbar */ return x >= parent_left && x < parent_right && y >= parent_top && y < parent_bottom; } guacamole-server-0.9.9/src/terminal/cursor.h0000664000175100017510000000430512643542623016020 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_TERMINAL_CURSOR_H #define _GUAC_TERMINAL_CURSOR_H #include "config.h" #include #include typedef struct guac_terminal_cursor { /** * A buffer allocated with guac_client_alloc_buffer() that contains the * cursor image. */ guac_layer* buffer; /** * The width of the cursor in pixels. */ int width; /** * The height of the cursor in pixels. */ int height; /** * The X coordinate of the cursor hotspot. */ int hotspot_x; /** * The Y coordinate of the cursor hotspot. */ int hotspot_y; } guac_terminal_cursor; /** * Allocates a new cursor, pre-populating the cursor with a newly-allocated * buffer. */ guac_terminal_cursor* guac_terminal_cursor_alloc(guac_client* client); /** * Frees the buffer associated with this cursor as well as the cursor itself. */ void guac_terminal_cursor_free(guac_client* client, guac_terminal_cursor* cursor); /** * Set the remote cursor. */ void guac_terminal_set_cursor(guac_client* client, guac_terminal_cursor* cursor); #endif guacamole-server-0.9.9/src/protocols/0000775000175100017510000000000012645400336014615 500000000000000guacamole-server-0.9.9/src/protocols/telnet/0000775000175100017510000000000012645400336016110 500000000000000guacamole-server-0.9.9/src/protocols/telnet/clipboard.c0000664000175100017510000000427212536405625020145 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "clipboard.h" #include "terminal.h" #include #include int guac_telnet_clipboard_handler(guac_client* client, guac_stream* stream, char* mimetype) { /* Clear clipboard and prepare for new data */ guac_telnet_client_data* client_data = (guac_telnet_client_data*) client->data; guac_terminal_clipboard_reset(client_data->term, mimetype); /* Set handlers for clipboard stream */ stream->blob_handler = guac_telnet_clipboard_blob_handler; stream->end_handler = guac_telnet_clipboard_end_handler; return 0; } int guac_telnet_clipboard_blob_handler(guac_client* client, guac_stream* stream, void* data, int length) { /* Append new data */ guac_telnet_client_data* client_data = (guac_telnet_client_data*) client->data; guac_terminal_clipboard_append(client_data->term, data, length); return 0; } int guac_telnet_clipboard_end_handler(guac_client* client, guac_stream* stream) { /* Nothing to do - clipboard is implemented within client */ return 0; } guacamole-server-0.9.9/src/protocols/telnet/Makefile.in0000664000175100017510000006736212645400276020116 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Copyright (C) 2015 Glyptodon LLC # # 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. # VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/protocols/telnet DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) libguac_client_telnet_la_DEPENDENCIES = am_libguac_client_telnet_la_OBJECTS = \ libguac_client_telnet_la-client.lo \ libguac_client_telnet_la-clipboard.lo \ libguac_client_telnet_la-guac_handlers.lo \ libguac_client_telnet_la-telnet_client.lo libguac_client_telnet_la_OBJECTS = \ $(am_libguac_client_telnet_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libguac_client_telnet_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libguac_client_telnet_la_CFLAGS) $(CFLAGS) \ $(libguac_client_telnet_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libguac_client_telnet_la_SOURCES) DIST_SOURCES = $(libguac_client_telnet_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COMMON_INCLUDE = @COMMON_INCLUDE@ COMMON_LTLIB = @COMMON_LTLIB@ COMMON_SSH_INCLUDE = @COMMON_SSH_INCLUDE@ COMMON_SSH_LTLIB = @COMMON_SSH_LTLIB@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CUNIT_LIBS = @CUNIT_LIBS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBADD_DLOPEN = @LIBADD_DLOPEN@ LIBGUAC_INCLUDE = @LIBGUAC_INCLUDE@ LIBGUAC_LTLIB = @LIBGUAC_LTLIB@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MATH_LIBS = @MATH_LIBS@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@ PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@ PANGO_CFLAGS = @PANGO_CFLAGS@ PANGO_LIBS = @PANGO_LIBS@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_LIBS = @PNG_LIBS@ PTHREAD_LIBS = @PTHREAD_LIBS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ RDP_LIBS = @RDP_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSH_LIBS = @SSH_LIBS@ SSL_LIBS = @SSL_LIBS@ STRIP = @STRIP@ TELNET_LIBS = @TELNET_LIBS@ TERMINAL_INCLUDE = @TERMINAL_INCLUDE@ TERMINAL_LTLIB = @TERMINAL_LTLIB@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VNC_LIBS = @VNC_LIBS@ VORBIS_LIBS = @VORBIS_LIBS@ WEBP_LIBS = @WEBP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ init_dir = @init_dir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 lib_LTLIBRARIES = libguac-client-telnet.la libguac_client_telnet_la_SOURCES = \ client.c \ clipboard.c \ guac_handlers.c \ telnet_client.c noinst_HEADERS = \ client.h \ clipboard.h \ guac_handlers.h \ telnet_client.h libguac_client_telnet_la_CFLAGS = \ -Werror -Wall -Iinclude \ @LIBGUAC_INCLUDE@ \ @TERMINAL_INCLUDE@ libguac_client_telnet_la_LIBADD = \ @COMMON_LTLIB@ \ @LIBGUAC_LTLIB@ \ @TERMINAL_LTLIB@ libguac_client_telnet_la_LDFLAGS = \ -version-info 0:0:0 \ @PTHREAD_LIBS@ \ @TELNET_LIBS@ all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/protocols/telnet/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/protocols/telnet/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libguac-client-telnet.la: $(libguac_client_telnet_la_OBJECTS) $(libguac_client_telnet_la_DEPENDENCIES) $(EXTRA_libguac_client_telnet_la_DEPENDENCIES) $(AM_V_CCLD)$(libguac_client_telnet_la_LINK) -rpath $(libdir) $(libguac_client_telnet_la_OBJECTS) $(libguac_client_telnet_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_telnet_la-client.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_telnet_la-clipboard.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_telnet_la-guac_handlers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_telnet_la-telnet_client.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libguac_client_telnet_la-client.lo: client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_telnet_la_CFLAGS) $(CFLAGS) -MT libguac_client_telnet_la-client.lo -MD -MP -MF $(DEPDIR)/libguac_client_telnet_la-client.Tpo -c -o libguac_client_telnet_la-client.lo `test -f 'client.c' || echo '$(srcdir)/'`client.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_telnet_la-client.Tpo $(DEPDIR)/libguac_client_telnet_la-client.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client.c' object='libguac_client_telnet_la-client.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_telnet_la_CFLAGS) $(CFLAGS) -c -o libguac_client_telnet_la-client.lo `test -f 'client.c' || echo '$(srcdir)/'`client.c libguac_client_telnet_la-clipboard.lo: clipboard.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_telnet_la_CFLAGS) $(CFLAGS) -MT libguac_client_telnet_la-clipboard.lo -MD -MP -MF $(DEPDIR)/libguac_client_telnet_la-clipboard.Tpo -c -o libguac_client_telnet_la-clipboard.lo `test -f 'clipboard.c' || echo '$(srcdir)/'`clipboard.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_telnet_la-clipboard.Tpo $(DEPDIR)/libguac_client_telnet_la-clipboard.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clipboard.c' object='libguac_client_telnet_la-clipboard.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_telnet_la_CFLAGS) $(CFLAGS) -c -o libguac_client_telnet_la-clipboard.lo `test -f 'clipboard.c' || echo '$(srcdir)/'`clipboard.c libguac_client_telnet_la-guac_handlers.lo: guac_handlers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_telnet_la_CFLAGS) $(CFLAGS) -MT libguac_client_telnet_la-guac_handlers.lo -MD -MP -MF $(DEPDIR)/libguac_client_telnet_la-guac_handlers.Tpo -c -o libguac_client_telnet_la-guac_handlers.lo `test -f 'guac_handlers.c' || echo '$(srcdir)/'`guac_handlers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_telnet_la-guac_handlers.Tpo $(DEPDIR)/libguac_client_telnet_la-guac_handlers.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_handlers.c' object='libguac_client_telnet_la-guac_handlers.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_telnet_la_CFLAGS) $(CFLAGS) -c -o libguac_client_telnet_la-guac_handlers.lo `test -f 'guac_handlers.c' || echo '$(srcdir)/'`guac_handlers.c libguac_client_telnet_la-telnet_client.lo: telnet_client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_telnet_la_CFLAGS) $(CFLAGS) -MT libguac_client_telnet_la-telnet_client.lo -MD -MP -MF $(DEPDIR)/libguac_client_telnet_la-telnet_client.Tpo -c -o libguac_client_telnet_la-telnet_client.lo `test -f 'telnet_client.c' || echo '$(srcdir)/'`telnet_client.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_telnet_la-telnet_client.Tpo $(DEPDIR)/libguac_client_telnet_la-telnet_client.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='telnet_client.c' object='libguac_client_telnet_la-telnet_client.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_telnet_la_CFLAGS) $(CFLAGS) -c -o libguac_client_telnet_la-telnet_client.lo `test -f 'telnet_client.c' || echo '$(srcdir)/'`telnet_client.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libLTLIBRARIES install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: guacamole-server-0.9.9/src/protocols/telnet/telnet_client.c0000664000175100017510000003741312612226234021032 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "telnet_client.h" #include "terminal.h" #include #include #include #include #include #include #include #include #include #include #include #include #include /** * Support levels for various telnet options, required for connection * negotiation by telnet_init(), part of libtelnet. */ static const telnet_telopt_t __telnet_options[] = { { TELNET_TELOPT_ECHO, TELNET_WONT, TELNET_DO }, { TELNET_TELOPT_TTYPE, TELNET_WILL, TELNET_DONT }, { TELNET_TELOPT_COMPRESS2, TELNET_WONT, TELNET_DO }, { TELNET_TELOPT_MSSP, TELNET_WONT, TELNET_DO }, { TELNET_TELOPT_NAWS, TELNET_WILL, TELNET_DONT }, { TELNET_TELOPT_NEW_ENVIRON, TELNET_WILL, TELNET_DONT }, { -1, 0, 0 } }; /** * Write the entire buffer given to the specified file descriptor, retrying * the write automatically if necessary. This function will return a value * not equal to the buffer's size iff an error occurs which prevents all * future writes. * * @param fd The file descriptor to write to. * @param buffer The buffer to write. * @param size The number of bytes from the buffer to write. */ static int __guac_telnet_write_all(int fd, const char* buffer, int size) { int remaining = size; while (remaining > 0) { /* Attempt to write data */ int ret_val = write(fd, buffer, remaining); if (ret_val <= 0) return -1; /* If successful, contine with what data remains (if any) */ remaining -= ret_val; buffer += ret_val; } return size; } /** * Searches for a line matching the stored password regex, appending the given * buffer to the internal pattern matching buffer. The internal pattern match * buffer is cleared whenever a newline is read. Returns TRUE if a match is found and the * value is sent. */ static bool __guac_telnet_regex_search(guac_client* client, regex_t* regex, char* value, const char* buffer, int size) { static char line_buffer[1024] = {0}; static int length = 0; guac_telnet_client_data* client_data = (guac_telnet_client_data*) client->data; int i; const char* current; /* Ensure line buffer contains only the most recent line */ current = buffer; for (i = 0; i < size; i++) { /* Reset line buffer and shift input buffer for each newline */ if (*(current++) == '\n') { length = 0; buffer += i; size -= i; i = 0; } } /* Truncate if necessary */ if (size + length + 1 > sizeof(line_buffer)) size = sizeof(line_buffer) - length - 1; /* Append to line */ memcpy(&(line_buffer[length]), buffer, size); length += size; line_buffer[length] = '\0'; /* Send value upon match */ if (regexec(regex, line_buffer, 0, NULL, 0) == 0) { /* Send value */ guac_terminal_send_string(client_data->term, value); guac_terminal_send_key(client_data->term, 0xFF0D, 1); guac_terminal_send_key(client_data->term, 0xFF0D, 0); /* Stop searching for prompt */ return TRUE; } return FALSE; } /** * Event handler, as defined by libtelnet. This function is passed to * telnet_init() and will be called for every event fired by libtelnet, * including feature enable/disable and receipt/transmission of data. */ static void __guac_telnet_event_handler(telnet_t* telnet, telnet_event_t* event, void* data) { guac_client* client = (guac_client*) data; guac_telnet_client_data* client_data = (guac_telnet_client_data*) client->data; switch (event->type) { /* Terminal output received */ case TELNET_EV_DATA: guac_terminal_write_stdout(client_data->term, event->data.buffer, event->data.size); /* Continue search for username prompt */ if (client_data->username_regex != NULL) { if (__guac_telnet_regex_search(client, client_data->username_regex, client_data->username, event->data.buffer, event->data.size)) { guac_client_log(client, GUAC_LOG_DEBUG, "Username sent"); regfree(client_data->username_regex); free(client_data->username_regex); client_data->username_regex = NULL; } } /* Continue search for password prompt */ if (client_data->password_regex != NULL) { if (__guac_telnet_regex_search(client, client_data->password_regex, client_data->password, event->data.buffer, event->data.size)) { guac_client_log(client, GUAC_LOG_DEBUG, "Password sent"); /* Do not continue searching for username once password is sent */ if (client_data->username_regex != NULL) { regfree(client_data->username_regex); free(client_data->username_regex); client_data->username_regex = NULL; } regfree(client_data->password_regex); free(client_data->password_regex); client_data->password_regex = NULL; } } break; /* Data destined for remote end */ case TELNET_EV_SEND: if (__guac_telnet_write_all(client_data->socket_fd, event->data.buffer, event->data.size) != event->data.size) guac_client_stop(client); break; /* Remote feature enabled */ case TELNET_EV_WILL: if (event->neg.telopt == TELNET_TELOPT_ECHO) client_data->echo_enabled = 0; /* Disable local echo, as remote will echo */ break; /* Remote feature disabled */ case TELNET_EV_WONT: if (event->neg.telopt == TELNET_TELOPT_ECHO) client_data->echo_enabled = 1; /* Enable local echo, as remote won't echo */ break; /* Local feature enable */ case TELNET_EV_DO: if (event->neg.telopt == TELNET_TELOPT_NAWS) { client_data->naws_enabled = 1; guac_telnet_send_naws(telnet, client_data->term->term_width, client_data->term->term_height); } break; /* Terminal type request */ case TELNET_EV_TTYPE: if (event->ttype.cmd == TELNET_TTYPE_SEND) telnet_ttype_is(client_data->telnet, "linux"); break; /* Environment request */ case TELNET_EV_ENVIRON: /* Only send USER if entire environment was requested */ if (event->environ.size == 0) guac_telnet_send_user(telnet, client_data->username); break; /* Connection warnings */ case TELNET_EV_WARNING: guac_client_log(client, GUAC_LOG_WARNING, "%s", event->error.msg); break; /* Connection errors */ case TELNET_EV_ERROR: guac_client_abort(client, GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR, "Telnet connection closing with error: %s", event->error.msg); break; /* Ignore other events */ default: break; } } /** * Input thread, started by the main telnet client thread. This thread * continuously reads from the terminal's STDIN and transfers all read * data to the telnet connection. * * @param data The current guac_client instance. * @return Always NULL. */ static void* __guac_telnet_input_thread(void* data) { guac_client* client = (guac_client*) data; guac_telnet_client_data* client_data = (guac_telnet_client_data*) client->data; char buffer[8192]; int bytes_read; /* Write all data read */ while ((bytes_read = guac_terminal_read_stdin(client_data->term, buffer, sizeof(buffer))) > 0) { telnet_send(client_data->telnet, buffer, bytes_read); if (client_data->echo_enabled) guac_terminal_write_stdout(client_data->term, buffer, bytes_read); } return NULL; } /** * Connects to the telnet server specified within the data associated * with the given guac_client, which will have been populated by * guac_client_init. * * @return The connected telnet instance, if successful, or NULL if the * connection fails for any reason. */ static telnet_t* __guac_telnet_create_session(guac_client* client) { int retval; int fd; struct addrinfo* addresses; struct addrinfo* current_address; char connected_address[1024]; char connected_port[64]; guac_telnet_client_data* client_data = (guac_telnet_client_data*) client->data; struct addrinfo hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM, .ai_protocol = IPPROTO_TCP }; /* Get socket */ fd = socket(AF_INET, SOCK_STREAM, 0); /* Get addresses connection */ if ((retval = getaddrinfo(client_data->hostname, client_data->port, &hints, &addresses))) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Error parsing given address or port: %s", gai_strerror(retval)); return NULL; } /* Attempt connection to each address until success */ current_address = addresses; while (current_address != NULL) { int retval; /* Resolve hostname */ if ((retval = getnameinfo(current_address->ai_addr, current_address->ai_addrlen, connected_address, sizeof(connected_address), connected_port, sizeof(connected_port), NI_NUMERICHOST | NI_NUMERICSERV))) guac_client_log(client, GUAC_LOG_DEBUG, "Unable to resolve host: %s", gai_strerror(retval)); /* Connect */ if (connect(fd, current_address->ai_addr, current_address->ai_addrlen) == 0) { guac_client_log(client, GUAC_LOG_DEBUG, "Successfully connected to " "host %s, port %s", connected_address, connected_port); /* Done if successful connect */ break; } /* Otherwise log information regarding bind failure */ else guac_client_log(client, GUAC_LOG_DEBUG, "Unable to connect to " "host %s, port %s: %s", connected_address, connected_port, strerror(errno)); current_address = current_address->ai_next; } /* If unable to connect to anything, fail */ if (current_address == NULL) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR, "Unable to connect to any addresses."); return NULL; } /* Free addrinfo */ freeaddrinfo(addresses); /* Open telnet session */ telnet_t* telnet = telnet_init(__telnet_options, __guac_telnet_event_handler, 0, client); if (telnet == NULL) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Telnet client allocation failed."); return NULL; } /* Save file descriptor */ client_data->socket_fd = fd; return telnet; } /** * Sends a 16-bit value over the given telnet connection with the byte order * required by the telnet protocol. * * @param telnet The telnet connection to use. * @param value The value to send. */ static void __guac_telnet_send_uint16(telnet_t* telnet, uint16_t value) { unsigned char buffer[2]; buffer[0] = (value >> 8) & 0xFF; buffer[1] = value & 0xFF; telnet_send(telnet, (char*) buffer, 2); } /** * Sends an 8-bit value over the given telnet connection. * * @param telnet The telnet connection to use. * @param value The value to send. */ static void __guac_telnet_send_uint8(telnet_t* telnet, uint8_t value) { telnet_send(telnet, (char*) (&value), 1); } void guac_telnet_send_naws(telnet_t* telnet, uint16_t width, uint16_t height) { telnet_begin_sb(telnet, TELNET_TELOPT_NAWS); __guac_telnet_send_uint16(telnet, width); __guac_telnet_send_uint16(telnet, height); telnet_finish_sb(telnet); } void guac_telnet_send_user(telnet_t* telnet, const char* username) { /* IAC SB NEW-ENVIRON IS */ telnet_begin_sb(telnet, TELNET_TELOPT_NEW_ENVIRON); __guac_telnet_send_uint8(telnet, TELNET_ENVIRON_IS); /* VAR "USER" */ __guac_telnet_send_uint8(telnet, TELNET_ENVIRON_VAR); telnet_send(telnet, "USER", 4); /* VALUE username */ __guac_telnet_send_uint8(telnet, TELNET_ENVIRON_VALUE); telnet_send(telnet, username, strlen(username)); /* IAC SE */ telnet_finish_sb(telnet); } /** * Waits for data on the given file descriptor for up to one second. The * return value is identical to that of select(): 0 on timeout, < 0 on * error, and > 0 on success. * * @param socket_fd The file descriptor to wait for. * @return A value greater than zero on success, zero on timeout, and * less than zero on error. */ static int __guac_telnet_wait(int socket_fd) { fd_set fds; struct timeval timeout; FD_ZERO(&fds); FD_SET(socket_fd, &fds); /* Wait for one second */ timeout.tv_sec = 1; timeout.tv_usec = 0; return select(socket_fd+1, &fds, NULL, NULL, &timeout); } void* guac_telnet_client_thread(void* data) { guac_client* client = (guac_client*) data; guac_telnet_client_data* client_data = (guac_telnet_client_data*) client->data; pthread_t input_thread; char buffer[8192]; int wait_result; /* Open telnet session */ client_data->telnet = __guac_telnet_create_session(client); if (client_data->telnet == NULL) { /* Already aborted within __guac_telnet_create_session() */ return NULL; } /* Logged in */ guac_client_log(client, GUAC_LOG_INFO, "Telnet connection successful."); /* Start input thread */ if (pthread_create(&(input_thread), NULL, __guac_telnet_input_thread, (void*) client)) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Unable to start input thread"); return NULL; } /* While data available, write to terminal */ while ((wait_result = __guac_telnet_wait(client_data->socket_fd)) >= 0) { /* Resume waiting of no data available */ if (wait_result == 0) continue; int bytes_read = read(client_data->socket_fd, buffer, sizeof(buffer)); if (bytes_read <= 0) break; telnet_recv(client_data->telnet, buffer, bytes_read); } /* Kill client and Wait for input thread to die */ guac_client_stop(client); pthread_join(input_thread, NULL); guac_client_log(client, GUAC_LOG_INFO, "Telnet connection ended."); return NULL; } guacamole-server-0.9.9/src/protocols/telnet/clipboard.h0000664000175100017510000000331212536405625020144 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 GUAC_TELNET__CLIPBOARD_H #define GUAC_TELNET__CLIPBOARD_H #include "config.h" #include #include /** * Handler for inbound clipboard data. */ int guac_telnet_clipboard_handler(guac_client* client, guac_stream* stream, char* mimetype); /** * Handler for stream data related to clipboard. */ int guac_telnet_clipboard_blob_handler(guac_client* client, guac_stream* stream, void* data, int length); /** * Handler for end-of-stream related to clipboard. */ int guac_telnet_clipboard_end_handler(guac_client* client, guac_stream* stream); #endif guacamole-server-0.9.9/src/protocols/telnet/guac_handlers.h0000664000175100017510000000430312536405625021005 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 GUAC_TELNET__GUAC_HANDLERS_H #define GUAC_TELNET__GUAC_HANDLERS_H #include "config.h" #include /** * Generic handler for sending outbound messages. Required by libguac and * called periodically by guacd when the client is ready for more graphical * updates. */ int guac_telnet_client_handle_messages(guac_client* client); /** * Handler for key events. Required by libguac and called whenever key events * are received. */ int guac_telnet_client_key_handler(guac_client* client, int keysym, int pressed); /** * Handler for mouse events. Required by libguac and called whenever mouse * events are received. */ int guac_telnet_client_mouse_handler(guac_client* client, int x, int y, int mask); /** * Handler for size events. Required by libguac and called whenever the remote * display (window) is resized. */ int guac_telnet_client_size_handler(guac_client* client, int width, int height); /** * Free handler. Required by libguac and called when the guac_client is * disconnected and must be cleaned up. */ int guac_telnet_client_free_handler(guac_client* client); #endif guacamole-server-0.9.9/src/protocols/telnet/telnet_client.h0000664000175100017510000000335712536405625021047 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 GUAC_TELNET__TELNET_CLIENT_H #define GUAC_TELNET__TELNET_CLIENT_H #include "config.h" #include #include /** * Main telnet client thread, handling transfer of telnet output to STDOUT. */ void* guac_telnet_client_thread(void* data); /** * Send a telnet NAWS message indicating the given terminal window dimensions * in characters. */ void guac_telnet_send_naws(telnet_t* telnet, uint16_t width, uint16_t height); /** * Sends the given username by setting the remote USER environment variable * using the telnet NEW-ENVIRON option. */ void guac_telnet_send_user(telnet_t* telnet, const char* username); #endif guacamole-server-0.9.9/src/protocols/telnet/client.h0000664000175100017510000000624112536405625017467 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 GUAC_TELNET__CLIENT_H #define GUAC_TELNET__CLIENT_H #include "config.h" #include "terminal.h" #include #include #include #include #define GUAC_TELNET_DEFAULT_USERNAME_REGEX "[Ll]ogin:" #define GUAC_TELNET_DEFAULT_PASSWORD_REGEX "[Pp]assword:" /** * Telnet-specific client data. */ typedef struct guac_telnet_client_data { /** * The hostname of the telnet server to connect to. */ char hostname[1024]; /** * The port of the telnet server to connect to. */ char port[64]; /** * The name of the user to login as. */ char username[1024]; /** * The regular expression to use when searching for the username * prompt. This will be NULL unless the telnet client is currently * searching for the username prompt. */ regex_t* username_regex; /** * The password to give when authenticating. */ char password[1024]; /** * The regular expression to use when searching for the password * prompt. This will be NULL unless the telnet client is currently * searching for the password prompt. */ regex_t* password_regex; /** * The name of the font to use for display rendering. */ char font_name[1024]; /** * The size of the font to use, in points. */ int font_size; /** * The telnet client thread. */ pthread_t client_thread; /** * The file descriptor of the socket connected to the telnet server, * or -1 if no connection has been established. */ int socket_fd; /** * Telnet connection, used by the telnet client thread. */ telnet_t* telnet; /** * Whether window size should be sent when the window is resized. */ int naws_enabled; /** * Whether all user input should be automatically echoed to the * terminal. */ int echo_enabled; /** * The terminal which will render all output from the telnet client. */ guac_terminal* term; } guac_telnet_client_data; #endif guacamole-server-0.9.9/src/protocols/telnet/client.c0000664000175100017510000001650412626133327017462 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "clipboard.h" #include "guac_handlers.h" #include "telnet_client.h" #include "terminal.h" #include #include #include #include #include #include #include #include #include #include #define GUAC_TELNET_DEFAULT_FONT_NAME "monospace" #define GUAC_TELNET_DEFAULT_FONT_SIZE 12 #define GUAC_TELNET_DEFAULT_PORT "23" /* Client plugin arguments */ const char* GUAC_CLIENT_ARGS[] = { "hostname", "port", "username", "username-regex", "password", "password-regex", "font-name", "font-size", "color-scheme", NULL }; enum __TELNET_ARGS_IDX { /** * The hostname to connect to. Required. */ IDX_HOSTNAME, /** * The port to connect to. Optional. */ IDX_PORT, /** * The name of the user to login as. Optional. */ IDX_USERNAME, /** * The regular expression to use when searching for the username/login prompt. * Optional. */ IDX_USERNAME_REGEX, /** * The password to use when logging in. Optional. */ IDX_PASSWORD, /** * The regular expression to use when searching for the password prompt. * Optional. */ IDX_PASSWORD_REGEX, /** * The name of the font to use within the terminal. */ IDX_FONT_NAME, /** * The size of the font to use within the terminal, in points. */ IDX_FONT_SIZE, /** * The name of the color scheme to use. Currently valid color schemes are: * "black-white", "white-black", "gray-black", and "green-black", each * following the "foreground-background" pattern. By default, this will be * "gray-black". */ IDX_COLOR_SCHEME, TELNET_ARGS_COUNT }; /** * Compiles the given regular expression, returning NULL if compilation fails. */ static regex_t* __guac_telnet_compile_regex(guac_client* client, char* pattern) { int compile_result; regex_t* regex = malloc(sizeof(regex_t)); /* Compile regular expression */ compile_result = regcomp(regex, pattern,REG_EXTENDED | REG_NOSUB | REG_ICASE | REG_NEWLINE); /* Notify of failure to parse/compile */ if (compile_result != 0) { guac_client_log(client, GUAC_LOG_ERROR, "Regular expression '%s' could not be compiled.", pattern); free(regex); return NULL; } return regex; } int guac_client_init(guac_client* client, int argc, char** argv) { guac_socket* socket = client->socket; guac_telnet_client_data* client_data = malloc(sizeof(guac_telnet_client_data)); /* Init client data */ client->data = client_data; client_data->telnet = NULL; client_data->socket_fd = -1; client_data->naws_enabled = 0; client_data->echo_enabled = 1; if (argc != TELNET_ARGS_COUNT) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Wrong number of arguments"); return -1; } /* Set locale and warn if not UTF-8 */ setlocale(LC_CTYPE, ""); if (strcmp(nl_langinfo(CODESET), "UTF-8") != 0) guac_client_log(client, GUAC_LOG_INFO, "Current locale does not use UTF-8. Some characters may not render correctly."); /* Read parameters */ strcpy(client_data->hostname, argv[IDX_HOSTNAME]); strcpy(client_data->username, argv[IDX_USERNAME]); strcpy(client_data->password, argv[IDX_PASSWORD]); /* Set username regex, if needed */ if (client_data->username[0] != 0) { /* Compile regular expression */ if (argv[IDX_USERNAME_REGEX][0] != 0) client_data->username_regex = __guac_telnet_compile_regex(client, argv[IDX_USERNAME_REGEX]); else client_data->username_regex = __guac_telnet_compile_regex(client, GUAC_TELNET_DEFAULT_USERNAME_REGEX); } else client_data->username_regex = NULL; /* Set password regex, if needed */ if (client_data->password[0] != 0) { /* Compile regular expression */ if (argv[IDX_PASSWORD_REGEX][0] != 0) client_data->password_regex = __guac_telnet_compile_regex(client, argv[IDX_PASSWORD_REGEX]); else client_data->password_regex = __guac_telnet_compile_regex(client, GUAC_TELNET_DEFAULT_PASSWORD_REGEX); } else client_data->password_regex = NULL; /* Read port */ if (argv[IDX_PORT][0] != 0) strcpy(client_data->port, argv[IDX_PORT]); else strcpy(client_data->port, GUAC_TELNET_DEFAULT_PORT); /* Read font name */ if (argv[IDX_FONT_NAME][0] != 0) strcpy(client_data->font_name, argv[IDX_FONT_NAME]); else strcpy(client_data->font_name, GUAC_TELNET_DEFAULT_FONT_NAME ); /* Read font size */ if (argv[IDX_FONT_SIZE][0] != 0) client_data->font_size = atoi(argv[IDX_FONT_SIZE]); else client_data->font_size = GUAC_TELNET_DEFAULT_FONT_SIZE; /* Create terminal */ client_data->term = guac_terminal_create(client, client_data->font_name, client_data->font_size, client->info.optimal_resolution, client->info.optimal_width, client->info.optimal_height, argv[IDX_COLOR_SCHEME]); /* Fail if terminal init failed */ if (client_data->term == NULL) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Terminal initialization failed"); return -1; } /* Send initial name */ guac_protocol_send_name(socket, client_data->hostname); guac_socket_flush(socket); /* Set basic handlers */ client->handle_messages = guac_telnet_client_handle_messages; client->key_handler = guac_telnet_client_key_handler; client->mouse_handler = guac_telnet_client_mouse_handler; client->size_handler = guac_telnet_client_size_handler; client->free_handler = guac_telnet_client_free_handler; client->clipboard_handler = guac_telnet_clipboard_handler; /* Start client thread */ if (pthread_create(&(client_data->client_thread), NULL, guac_telnet_client_thread, (void*) client)) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Unable to start telnet client thread"); return -1; } /* Success */ return 0; } guacamole-server-0.9.9/src/protocols/telnet/guac_handlers.c0000664000175100017510000001127512626133327021003 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "guac_handlers.h" #include "terminal.h" #include "telnet_client.h" #include #include #include #include #include #include #include int guac_telnet_client_handle_messages(guac_client* client) { guac_telnet_client_data* client_data = (guac_telnet_client_data*) client->data; return guac_terminal_render_frame(client_data->term); } int guac_telnet_client_mouse_handler(guac_client* client, int x, int y, int mask) { guac_telnet_client_data* client_data = (guac_telnet_client_data*) client->data; guac_terminal* term = client_data->term; /* Send mouse if not searching for password or username */ if (client_data->password_regex == NULL && client_data->username_regex == NULL) guac_terminal_send_mouse(term, x, y, mask); return 0; } int guac_telnet_client_key_handler(guac_client* client, int keysym, int pressed) { guac_telnet_client_data* client_data = (guac_telnet_client_data*) client->data; guac_terminal* term = client_data->term; /* Stop searching for password */ if (client_data->password_regex != NULL) { guac_client_log(client, GUAC_LOG_DEBUG, "Stopping password prompt search due to user input."); regfree(client_data->password_regex); free(client_data->password_regex); client_data->password_regex = NULL; } /* Stop searching for username */ if (client_data->username_regex != NULL) { guac_client_log(client, GUAC_LOG_DEBUG, "Stopping username prompt search due to user input."); regfree(client_data->username_regex); free(client_data->username_regex); client_data->username_regex = NULL; } /* Intercept and handle Pause / Break / Ctrl+0 as "IAC BRK" */ if (pressed && ( keysym == 0xFF13 /* Pause */ || keysym == 0xFF6B /* Break */ || (term->mod_ctrl && keysym == '0') /* Ctrl + 0 */ )) { /* Send IAC BRK */ telnet_iac(client_data->telnet, TELNET_BREAK); return 0; } /* Send key */ guac_terminal_send_key(term, keysym, pressed); return 0; } int guac_telnet_client_size_handler(guac_client* client, int width, int height) { /* Get terminal */ guac_telnet_client_data* guac_client_data = (guac_telnet_client_data*) client->data; guac_terminal* terminal = guac_client_data->term; /* Resize terminal */ guac_terminal_resize(terminal, width, height); /* Update terminal window size if connected */ if (guac_client_data->telnet != NULL && guac_client_data->naws_enabled) guac_telnet_send_naws(guac_client_data->telnet, terminal->term_width, terminal->term_height); return 0; } int guac_telnet_client_free_handler(guac_client* client) { guac_telnet_client_data* guac_client_data = (guac_telnet_client_data*) client->data; /* Close telnet connection */ if (guac_client_data->socket_fd != -1) close(guac_client_data->socket_fd); /* Kill terminal */ guac_terminal_free(guac_client_data->term); /* Wait for and free telnet session, if connected */ if (guac_client_data->telnet != NULL) { pthread_join(guac_client_data->client_thread, NULL); telnet_free(guac_client_data->telnet); } /* Free password regex */ if (guac_client_data->password_regex != NULL) { regfree(guac_client_data->password_regex); free(guac_client_data->password_regex); } free(client->data); return 0; } guacamole-server-0.9.9/src/protocols/telnet/Makefile.am0000664000175100017510000000356712626133327020101 00000000000000# # Copyright (C) 2015 Glyptodon LLC # # 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. # AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 lib_LTLIBRARIES = libguac-client-telnet.la libguac_client_telnet_la_SOURCES = \ client.c \ clipboard.c \ guac_handlers.c \ telnet_client.c noinst_HEADERS = \ client.h \ clipboard.h \ guac_handlers.h \ telnet_client.h libguac_client_telnet_la_CFLAGS = \ -Werror -Wall -Iinclude \ @LIBGUAC_INCLUDE@ \ @TERMINAL_INCLUDE@ libguac_client_telnet_la_LIBADD = \ @COMMON_LTLIB@ \ @LIBGUAC_LTLIB@ \ @TERMINAL_LTLIB@ libguac_client_telnet_la_LDFLAGS = \ -version-info 0:0:0 \ @PTHREAD_LIBS@ \ @TELNET_LIBS@ guacamole-server-0.9.9/src/protocols/vnc/0000775000175100017510000000000012645400336015403 500000000000000guacamole-server-0.9.9/src/protocols/vnc/clipboard.c0000664000175100017510000000536612643542623017444 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "clipboard.h" #include "guac_clipboard.h" #include "guac_iconv.h" #include #include #include int guac_vnc_clipboard_handler(guac_client* client, guac_stream* stream, char* mimetype) { /* Clear clipboard and prepare for new data */ vnc_guac_client_data* client_data = (vnc_guac_client_data*) client->data; guac_common_clipboard_reset(client_data->clipboard, mimetype); /* Set handlers for clipboard stream */ stream->blob_handler = guac_vnc_clipboard_blob_handler; stream->end_handler = guac_vnc_clipboard_end_handler; return 0; } int guac_vnc_clipboard_blob_handler(guac_client* client, guac_stream* stream, void* data, int length) { /* Append new data */ vnc_guac_client_data* client_data = (vnc_guac_client_data*) client->data; guac_common_clipboard_append(client_data->clipboard, (char*) data, length); return 0; } int guac_vnc_clipboard_end_handler(guac_client* client, guac_stream* stream) { vnc_guac_client_data* client_data = (vnc_guac_client_data*) client->data; rfbClient* rfb_client = client_data->rfb_client; char output_data[GUAC_VNC_CLIPBOARD_MAX_LENGTH]; const char* input = client_data->clipboard->buffer; char* output = output_data; guac_iconv_write* writer = client_data->clipboard_writer; /* Convert clipboard contents */ guac_iconv(GUAC_READ_UTF8, &input, client_data->clipboard->length, writer, &output, sizeof(output_data)); /* Send via VNC */ SendClientCutText(rfb_client, output_data, output - output_data); return 0; } guacamole-server-0.9.9/src/protocols/vnc/Makefile.in0000664000175100017510000007477612645400276017420 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Copyright (C) 2015 Glyptodon LLC # # 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. # VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ # Optional PulseAudio support @ENABLE_PULSE_TRUE@am__append_1 = pulse.c @ENABLE_PULSE_TRUE@am__append_2 = pulse.h # Optional SFTP support @ENABLE_COMMON_SSH_TRUE@am__append_3 = sftp.c @ENABLE_COMMON_SSH_TRUE@am__append_4 = sftp.h @ENABLE_COMMON_SSH_TRUE@am__append_5 = @COMMON_SSH_LTLIB@ subdir = src/protocols/vnc DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(am__noinst_HEADERS_DIST) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libguac_client_vnc_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am__libguac_client_vnc_la_SOURCES_DIST = client.c clipboard.c \ guac_handlers.c vnc_handlers.c pulse.c sftp.c @ENABLE_PULSE_TRUE@am__objects_1 = libguac_client_vnc_la-pulse.lo @ENABLE_COMMON_SSH_TRUE@am__objects_2 = libguac_client_vnc_la-sftp.lo am_libguac_client_vnc_la_OBJECTS = libguac_client_vnc_la-client.lo \ libguac_client_vnc_la-clipboard.lo \ libguac_client_vnc_la-guac_handlers.lo \ libguac_client_vnc_la-vnc_handlers.lo $(am__objects_1) \ $(am__objects_2) libguac_client_vnc_la_OBJECTS = $(am_libguac_client_vnc_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libguac_client_vnc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libguac_client_vnc_la_CFLAGS) $(CFLAGS) \ $(libguac_client_vnc_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libguac_client_vnc_la_SOURCES) DIST_SOURCES = $(am__libguac_client_vnc_la_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__noinst_HEADERS_DIST = client.h clipboard.h guac_handlers.h \ vnc_handlers.h pulse.h sftp.h HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COMMON_INCLUDE = @COMMON_INCLUDE@ COMMON_LTLIB = @COMMON_LTLIB@ COMMON_SSH_INCLUDE = @COMMON_SSH_INCLUDE@ COMMON_SSH_LTLIB = @COMMON_SSH_LTLIB@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CUNIT_LIBS = @CUNIT_LIBS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBADD_DLOPEN = @LIBADD_DLOPEN@ LIBGUAC_INCLUDE = @LIBGUAC_INCLUDE@ LIBGUAC_LTLIB = @LIBGUAC_LTLIB@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MATH_LIBS = @MATH_LIBS@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@ PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@ PANGO_CFLAGS = @PANGO_CFLAGS@ PANGO_LIBS = @PANGO_LIBS@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_LIBS = @PNG_LIBS@ PTHREAD_LIBS = @PTHREAD_LIBS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ RDP_LIBS = @RDP_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSH_LIBS = @SSH_LIBS@ SSL_LIBS = @SSL_LIBS@ STRIP = @STRIP@ TELNET_LIBS = @TELNET_LIBS@ TERMINAL_INCLUDE = @TERMINAL_INCLUDE@ TERMINAL_LTLIB = @TERMINAL_LTLIB@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VNC_LIBS = @VNC_LIBS@ VORBIS_LIBS = @VORBIS_LIBS@ WEBP_LIBS = @WEBP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ init_dir = @init_dir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 lib_LTLIBRARIES = libguac-client-vnc.la libguac_client_vnc_la_SOURCES = client.c clipboard.c guac_handlers.c \ vnc_handlers.c $(am__append_1) $(am__append_3) noinst_HEADERS = client.h clipboard.h guac_handlers.h vnc_handlers.h \ $(am__append_2) $(am__append_4) libguac_client_vnc_la_CFLAGS = \ -Werror -Wall -pedantic -Iinclude \ @COMMON_INCLUDE@ \ @COMMON_SSH_INCLUDE@ \ @LIBGUAC_INCLUDE@ libguac_client_vnc_la_LDFLAGS = \ -version-info 0:0:0 \ @CAIRO_LIBS@ \ @PULSE_LIBS@ \ @VNC_LIBS@ libguac_client_vnc_la_LIBADD = @COMMON_LTLIB@ @LIBGUAC_LTLIB@ \ $(am__append_5) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/protocols/vnc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/protocols/vnc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libguac-client-vnc.la: $(libguac_client_vnc_la_OBJECTS) $(libguac_client_vnc_la_DEPENDENCIES) $(EXTRA_libguac_client_vnc_la_DEPENDENCIES) $(AM_V_CCLD)$(libguac_client_vnc_la_LINK) -rpath $(libdir) $(libguac_client_vnc_la_OBJECTS) $(libguac_client_vnc_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_vnc_la-client.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_vnc_la-clipboard.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_vnc_la-guac_handlers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_vnc_la-pulse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_vnc_la-sftp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_vnc_la-vnc_handlers.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libguac_client_vnc_la-client.lo: client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_vnc_la_CFLAGS) $(CFLAGS) -MT libguac_client_vnc_la-client.lo -MD -MP -MF $(DEPDIR)/libguac_client_vnc_la-client.Tpo -c -o libguac_client_vnc_la-client.lo `test -f 'client.c' || echo '$(srcdir)/'`client.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_vnc_la-client.Tpo $(DEPDIR)/libguac_client_vnc_la-client.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client.c' object='libguac_client_vnc_la-client.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_vnc_la_CFLAGS) $(CFLAGS) -c -o libguac_client_vnc_la-client.lo `test -f 'client.c' || echo '$(srcdir)/'`client.c libguac_client_vnc_la-clipboard.lo: clipboard.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_vnc_la_CFLAGS) $(CFLAGS) -MT libguac_client_vnc_la-clipboard.lo -MD -MP -MF $(DEPDIR)/libguac_client_vnc_la-clipboard.Tpo -c -o libguac_client_vnc_la-clipboard.lo `test -f 'clipboard.c' || echo '$(srcdir)/'`clipboard.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_vnc_la-clipboard.Tpo $(DEPDIR)/libguac_client_vnc_la-clipboard.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clipboard.c' object='libguac_client_vnc_la-clipboard.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_vnc_la_CFLAGS) $(CFLAGS) -c -o libguac_client_vnc_la-clipboard.lo `test -f 'clipboard.c' || echo '$(srcdir)/'`clipboard.c libguac_client_vnc_la-guac_handlers.lo: guac_handlers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_vnc_la_CFLAGS) $(CFLAGS) -MT libguac_client_vnc_la-guac_handlers.lo -MD -MP -MF $(DEPDIR)/libguac_client_vnc_la-guac_handlers.Tpo -c -o libguac_client_vnc_la-guac_handlers.lo `test -f 'guac_handlers.c' || echo '$(srcdir)/'`guac_handlers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_vnc_la-guac_handlers.Tpo $(DEPDIR)/libguac_client_vnc_la-guac_handlers.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_handlers.c' object='libguac_client_vnc_la-guac_handlers.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_vnc_la_CFLAGS) $(CFLAGS) -c -o libguac_client_vnc_la-guac_handlers.lo `test -f 'guac_handlers.c' || echo '$(srcdir)/'`guac_handlers.c libguac_client_vnc_la-vnc_handlers.lo: vnc_handlers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_vnc_la_CFLAGS) $(CFLAGS) -MT libguac_client_vnc_la-vnc_handlers.lo -MD -MP -MF $(DEPDIR)/libguac_client_vnc_la-vnc_handlers.Tpo -c -o libguac_client_vnc_la-vnc_handlers.lo `test -f 'vnc_handlers.c' || echo '$(srcdir)/'`vnc_handlers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_vnc_la-vnc_handlers.Tpo $(DEPDIR)/libguac_client_vnc_la-vnc_handlers.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vnc_handlers.c' object='libguac_client_vnc_la-vnc_handlers.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_vnc_la_CFLAGS) $(CFLAGS) -c -o libguac_client_vnc_la-vnc_handlers.lo `test -f 'vnc_handlers.c' || echo '$(srcdir)/'`vnc_handlers.c libguac_client_vnc_la-pulse.lo: pulse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_vnc_la_CFLAGS) $(CFLAGS) -MT libguac_client_vnc_la-pulse.lo -MD -MP -MF $(DEPDIR)/libguac_client_vnc_la-pulse.Tpo -c -o libguac_client_vnc_la-pulse.lo `test -f 'pulse.c' || echo '$(srcdir)/'`pulse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_vnc_la-pulse.Tpo $(DEPDIR)/libguac_client_vnc_la-pulse.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse.c' object='libguac_client_vnc_la-pulse.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_vnc_la_CFLAGS) $(CFLAGS) -c -o libguac_client_vnc_la-pulse.lo `test -f 'pulse.c' || echo '$(srcdir)/'`pulse.c libguac_client_vnc_la-sftp.lo: sftp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_vnc_la_CFLAGS) $(CFLAGS) -MT libguac_client_vnc_la-sftp.lo -MD -MP -MF $(DEPDIR)/libguac_client_vnc_la-sftp.Tpo -c -o libguac_client_vnc_la-sftp.lo `test -f 'sftp.c' || echo '$(srcdir)/'`sftp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_vnc_la-sftp.Tpo $(DEPDIR)/libguac_client_vnc_la-sftp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sftp.c' object='libguac_client_vnc_la-sftp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_vnc_la_CFLAGS) $(CFLAGS) -c -o libguac_client_vnc_la-sftp.lo `test -f 'sftp.c' || echo '$(srcdir)/'`sftp.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libLTLIBRARIES install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: guacamole-server-0.9.9/src/protocols/vnc/sftp.c0000664000175100017510000000316712626133327016454 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "guac_sftp.h" #include "sftp.h" #include #include int guac_vnc_sftp_file_handler(guac_client* client, guac_stream* stream, char* mimetype, char* filename) { vnc_guac_client_data* client_data = (vnc_guac_client_data*) client->data; guac_object* filesystem = client_data->sftp_filesystem; /* Handle file upload */ return guac_common_ssh_sftp_handle_file_stream(filesystem, stream, mimetype, filename); } guacamole-server-0.9.9/src/protocols/vnc/sftp.h0000664000175100017510000000360612626133327016457 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 GUAC_VNC_SFTP_H #define GUAC_VNC_SFTP_H #include "config.h" #include #include /** * Handles an incoming stream from a Guacamole "file" instruction, saving the * contents of that stream to the file having the given name. * * @param client * The client receiving the uploaded file. * * @param stream * The stream through which the uploaded file data will be received. * * @param mimetype * The mimetype of the data being received. * * @param filename * The filename of the file to write to. * * @return * Zero if the incoming stream has been handled successfully, non-zero on * failure. */ int guac_vnc_sftp_file_handler(guac_client* client, guac_stream* stream, char* mimetype, char* filename); #endif guacamole-server-0.9.9/src/protocols/vnc/pulse.h0000664000175100017510000000412412602547672016635 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_VNC_PULSE_H #define __GUAC_VNC_PULSE_H #include "config.h" /** * The number of bytes to request for the audio fragments received from * PulseAudio. */ #define GUAC_VNC_AUDIO_FRAGMENT_SIZE 8192 /** * The minimum number of PCM bytes to wait for before flushing an audio * packet. The current value is 48K, which works out to be around 280ms. */ #define GUAC_VNC_PCM_WRITE_RATE 49152 /** * Rate of audio to stream, in Hz. */ #define GUAC_VNC_AUDIO_RATE 44100 /** * The number of channels to stream. */ #define GUAC_VNC_AUDIO_CHANNELS 2 /** * The number of bits per sample. */ #define GUAC_VNC_AUDIO_BPS 16 /** * Starts streaming audio from PulseAudio to the given Guacamole client. * * @param client The client to stream data to. */ void guac_pa_start_stream(guac_client* client); /** * Stops streaming audio from PulseAudio to the given Guacamole client. * * @param client The client to stream data to. */ void guac_pa_stop_stream(guac_client* client); #endif guacamole-server-0.9.9/src/protocols/vnc/clipboard.h0000664000175100017510000000327312643542623017444 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUAC_VNC_CLIPBOARD_H #define _GUAC_VNC_CLIPBOARD_H #include "config.h" #include #include /** * Handler for inbound clipboard data. */ int guac_vnc_clipboard_handler(guac_client* client, guac_stream* stream, char* mimetype); /** * Handler for stream data related to clipboard. */ int guac_vnc_clipboard_blob_handler(guac_client* client, guac_stream* stream, void* data, int length); /** * Handler for end-of-stream related to clipboard. */ int guac_vnc_clipboard_end_handler(guac_client* client, guac_stream* stream); #endif guacamole-server-0.9.9/src/protocols/vnc/guac_handlers.h0000664000175100017510000000276412643542623020310 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_VNC_GUAC_HANDLERS_H #define __GUAC_VNC_GUAC_HANDLERS_H #include "config.h" #include int vnc_guac_client_handle_messages(guac_client* client); int vnc_guac_client_mouse_handler(guac_client* client, int x, int y, int mask); int vnc_guac_client_key_handler(guac_client* client, int keysym, int pressed); int vnc_guac_client_free_handler(guac_client* client); #endif guacamole-server-0.9.9/src/protocols/vnc/pulse.c0000664000175100017510000001764412626724073016641 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "pulse.h" #include #include #include #include /** * Returns whether the given buffer contains only silence (only null bytes). * * @param buffer * The audio buffer to check. * * @param length * The length of the buffer to check. * * @return * Non-zero if the audio buffer contains silence, zero otherwise. */ static int guac_pa_is_silence(const void* buffer, size_t length) { int i; const unsigned char* current = (const unsigned char*) buffer; /* For each byte in buffer */ for (i = 0; i < length; i++) { /* If current value non-zero, then not silence */ if (*(current++)) return 0; } /* Otherwise, the buffer contains 100% silence */ return 1; } static void __stream_read_callback(pa_stream* stream, size_t length, void* data) { guac_client* client = (guac_client*) data; vnc_guac_client_data* client_data = (vnc_guac_client_data*) client->data; guac_audio_stream* audio = client_data->audio; const void* buffer; /* Read data */ pa_stream_peek(stream, &buffer, &length); /* Continuously write received PCM data */ if (!guac_pa_is_silence(buffer, length)) guac_audio_stream_write_pcm(audio, buffer, length); /* Flush upon silence */ else guac_audio_stream_flush(audio); /* Advance buffer */ pa_stream_drop(stream); } static void __stream_state_callback(pa_stream* stream, void* data) { guac_client* client = (guac_client*) data; switch (pa_stream_get_state(stream)) { case PA_STREAM_UNCONNECTED: guac_client_log(client, GUAC_LOG_INFO, "PulseAudio stream currently unconnected"); break; case PA_STREAM_CREATING: guac_client_log(client, GUAC_LOG_INFO, "PulseAudio stream being created..."); break; case PA_STREAM_READY: guac_client_log(client, GUAC_LOG_INFO, "PulseAudio stream now ready"); break; case PA_STREAM_FAILED: guac_client_log(client, GUAC_LOG_INFO, "PulseAudio stream connection failed"); break; case PA_STREAM_TERMINATED: guac_client_log(client, GUAC_LOG_INFO, "PulseAudio stream terminated"); break; default: guac_client_log(client, GUAC_LOG_INFO, "Unknown PulseAudio stream state: 0x%x", pa_stream_get_state(stream)); } } static void __context_get_sink_info_callback(pa_context* context, const pa_sink_info* info, int is_last, void* data) { guac_client* client = (guac_client*) data; pa_stream* stream; pa_sample_spec spec; pa_buffer_attr attr; /* Stop if end of list reached */ if (is_last) return; guac_client_log(client, GUAC_LOG_INFO, "Starting streaming from \"%s\"", info->description); /* Set format */ spec.format = PA_SAMPLE_S16LE; spec.rate = GUAC_VNC_AUDIO_RATE; spec.channels = GUAC_VNC_AUDIO_CHANNELS; attr.maxlength = -1; attr.fragsize = GUAC_VNC_AUDIO_FRAGMENT_SIZE; /* Create stream */ stream = pa_stream_new(context, "Guacamole Audio", &spec, NULL); /* Set stream callbacks */ pa_stream_set_state_callback(stream, __stream_state_callback, client); pa_stream_set_read_callback(stream, __stream_read_callback, client); /* Start stream */ pa_stream_connect_record(stream, info->monitor_source_name, &attr, PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND | PA_STREAM_ADJUST_LATENCY); } static void __context_get_server_info_callback(pa_context* context, const pa_server_info* info, void* data) { guac_client* client = (guac_client*) data; /* If no default sink, cannot continue */ if (info->default_sink_name == NULL) { guac_client_log(client, GUAC_LOG_ERROR, "No default sink. Cannot stream audio."); return; } guac_client_log(client, GUAC_LOG_INFO, "Will use default sink: \"%s\"", info->default_sink_name); /* Wait for default sink information */ pa_operation_unref( pa_context_get_sink_info_by_name(context, info->default_sink_name, __context_get_sink_info_callback, client)); } static void __context_state_callback(pa_context* context, void* data) { guac_client* client = (guac_client*) data; switch (pa_context_get_state(context)) { case PA_CONTEXT_UNCONNECTED: guac_client_log(client, GUAC_LOG_INFO, "PulseAudio reports it is unconnected"); break; case PA_CONTEXT_CONNECTING: guac_client_log(client, GUAC_LOG_INFO, "Connecting to PulseAudio..."); break; case PA_CONTEXT_AUTHORIZING: guac_client_log(client, GUAC_LOG_INFO, "Authorizing PulseAudio connection..."); break; case PA_CONTEXT_SETTING_NAME: guac_client_log(client, GUAC_LOG_INFO, "Sending client name..."); break; case PA_CONTEXT_READY: guac_client_log(client, GUAC_LOG_INFO, "PulseAudio now ready"); pa_operation_unref(pa_context_get_server_info(context, __context_get_server_info_callback, client)); break; case PA_CONTEXT_FAILED: guac_client_log(client, GUAC_LOG_INFO, "PulseAudio connection failed"); break; case PA_CONTEXT_TERMINATED: guac_client_log(client, GUAC_LOG_INFO, "PulseAudio connection terminated"); break; default: guac_client_log(client, GUAC_LOG_INFO, "Unknown PulseAudio context state: 0x%x", pa_context_get_state(context)); } } void guac_pa_start_stream(guac_client* client) { vnc_guac_client_data* client_data = (vnc_guac_client_data*) client->data; pa_context* context; guac_client_log(client, GUAC_LOG_INFO, "Starting audio stream"); /* Init main loop */ client_data->pa_mainloop = pa_threaded_mainloop_new(); /* Create context */ context = pa_context_new( pa_threaded_mainloop_get_api(client_data->pa_mainloop), "Guacamole Audio"); /* Set up context */ pa_context_set_state_callback(context, __context_state_callback, client); pa_context_connect(context, client_data->pa_servername, PA_CONTEXT_NOAUTOSPAWN, NULL); /* Start loop */ pa_threaded_mainloop_start(client_data->pa_mainloop); } void guac_pa_stop_stream(guac_client* client) { vnc_guac_client_data* client_data = (vnc_guac_client_data*) client->data; /* Stop loop */ pa_threaded_mainloop_stop(client_data->pa_mainloop); guac_client_log(client, GUAC_LOG_INFO, "Audio stream finished"); } guacamole-server-0.9.9/src/protocols/vnc/vnc_handlers.c0000664000175100017510000002626512643542623020154 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "guac_iconv.h" #include "guac_surface.h" #include #include #include #include #include #include #include /* Define cairo_format_stride_for_width() if missing */ #ifndef HAVE_CAIRO_FORMAT_STRIDE_FOR_WIDTH #define cairo_format_stride_for_width(format, width) (width*4) #endif #include #include #include #include void guac_vnc_cursor(rfbClient* client, int x, int y, int w, int h, int bpp) { guac_client* gc = rfbClientGetClientData(client, __GUAC_CLIENT); guac_socket* socket = gc->socket; vnc_guac_client_data* guac_client_data = (vnc_guac_client_data*) gc->data; const guac_layer* cursor_layer = guac_client_data->cursor; /* Cairo image buffer */ int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, w); unsigned char* buffer = malloc(h*stride); unsigned char* buffer_row_current = buffer; cairo_surface_t* surface; /* VNC image buffer */ unsigned int fb_stride = bpp * w; unsigned char* fb_row_current = client->rcSource; unsigned char* fb_mask = client->rcMask; int dx, dy; /* Copy image data from VNC client to RGBA buffer */ for (dy = 0; dy> client->format.redShift) * 0x100 / (client->format.redMax + 1); green = (v >> client->format.greenShift) * 0x100 / (client->format.greenMax+ 1); blue = (v >> client->format.blueShift) * 0x100 / (client->format.blueMax + 1); /* Output ARGB */ if (guac_client_data->swap_red_blue) *(buffer_current++) = (alpha << 24) | (blue << 16) | (green << 8) | red; else *(buffer_current++) = (alpha << 24) | (red << 16) | (green << 8) | blue; /* Next VNC pixel */ fb_current += bpp; } } /* Send cursor data*/ surface = cairo_image_surface_create_for_data(buffer, CAIRO_FORMAT_ARGB32, w, h, stride); guac_client_stream_png(gc, socket, GUAC_COMP_SRC, cursor_layer, 0, 0, surface); /* Update cursor */ guac_protocol_send_cursor(socket, x, y, cursor_layer, 0, 0, w, h); /* Free surface */ cairo_surface_destroy(surface); free(buffer); /* libvncclient does not free rcMask as it does rcSource */ free(client->rcMask); } void guac_vnc_update(rfbClient* client, int x, int y, int w, int h) { guac_client* gc = rfbClientGetClientData(client, __GUAC_CLIENT); vnc_guac_client_data* guac_client_data = (vnc_guac_client_data*) gc->data; int dx, dy; /* Cairo image buffer */ int stride; unsigned char* buffer; unsigned char* buffer_row_current; cairo_surface_t* surface; /* VNC framebuffer */ unsigned int bpp; unsigned int fb_stride; unsigned char* fb_row_current; /* Ignore extra update if already handled by copyrect */ if (guac_client_data->copy_rect_used) { guac_client_data->copy_rect_used = 0; return; } /* Init Cairo buffer */ stride = cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, w); buffer = malloc(h*stride); buffer_row_current = buffer; bpp = client->format.bitsPerPixel/8; fb_stride = bpp * client->width; fb_row_current = client->frameBuffer + (y * fb_stride) + (x * bpp); /* Copy image data from VNC client to PNG */ for (dy = y; dy> client->format.redShift) * 0x100 / (client->format.redMax + 1); green = (v >> client->format.greenShift) * 0x100 / (client->format.greenMax+ 1); blue = (v >> client->format.blueShift) * 0x100 / (client->format.blueMax + 1); /* Output RGB */ if (guac_client_data->swap_red_blue) *(buffer_current++) = (blue << 16) | (green << 8) | red; else *(buffer_current++) = (red << 16) | (green << 8) | blue; fb_current += bpp; } } /* For now, only use default layer */ surface = cairo_image_surface_create_for_data(buffer, CAIRO_FORMAT_RGB24, w, h, stride); guac_common_surface_draw(guac_client_data->default_surface, x, y, surface); /* Free surface */ cairo_surface_destroy(surface); free(buffer); } void guac_vnc_copyrect(rfbClient* client, int src_x, int src_y, int w, int h, int dest_x, int dest_y) { guac_client* gc = rfbClientGetClientData(client, __GUAC_CLIENT); vnc_guac_client_data* guac_client_data = (vnc_guac_client_data*) gc->data; /* For now, only use default layer */ guac_common_surface_copy(guac_client_data->default_surface, src_x, src_y, w, h, guac_client_data->default_surface, dest_x, dest_y); ((vnc_guac_client_data*) gc->data)->copy_rect_used = 1; } char* guac_vnc_get_password(rfbClient* client) { guac_client* gc = rfbClientGetClientData(client, __GUAC_CLIENT); return ((vnc_guac_client_data*) gc->data)->password; } void guac_vnc_set_pixel_format(rfbClient* client, int color_depth) { switch(color_depth) { case 8: client->format.depth = 8; client->format.bitsPerPixel = 8; client->format.blueShift = 6; client->format.redShift = 0; client->format.greenShift = 3; client->format.blueMax = 3; client->format.redMax = 7; client->format.greenMax = 7; break; case 16: client->format.depth = 16; client->format.bitsPerPixel = 16; client->format.blueShift = 0; client->format.redShift = 11; client->format.greenShift = 5; client->format.blueMax = 0x1f; client->format.redMax = 0x1f; client->format.greenMax = 0x3f; break; case 24: case 32: default: client->format.depth = 24; client->format.bitsPerPixel = 32; client->format.blueShift = 0; client->format.redShift = 16; client->format.greenShift = 8; client->format.blueMax = 0xff; client->format.redMax = 0xff; client->format.greenMax = 0xff; } } rfbBool guac_vnc_malloc_framebuffer(rfbClient* rfb_client) { guac_client* gc = rfbClientGetClientData(rfb_client, __GUAC_CLIENT); vnc_guac_client_data* guac_client_data = (vnc_guac_client_data*) gc->data; /* Resize surface */ if (guac_client_data->default_surface != NULL) guac_common_surface_resize(guac_client_data->default_surface, rfb_client->width, rfb_client->height); /* Use original, wrapped proc */ return guac_client_data->rfb_MallocFrameBuffer(rfb_client); } void guac_vnc_cut_text(rfbClient* client, const char* text, int textlen) { guac_client* gc = rfbClientGetClientData(client, __GUAC_CLIENT); vnc_guac_client_data* client_data = (vnc_guac_client_data*) gc->data; char received_data[GUAC_VNC_CLIPBOARD_MAX_LENGTH]; const char* input = text; char* output = received_data; guac_iconv_read* reader = client_data->clipboard_reader; /* Convert clipboard contents */ guac_iconv(reader, &input, textlen, GUAC_WRITE_UTF8, &output, sizeof(received_data)); /* Send converted data */ guac_common_clipboard_reset(client_data->clipboard, "text/plain"); guac_common_clipboard_append(client_data->clipboard, received_data, output - received_data); guac_common_clipboard_send(client_data->clipboard, gc); } void guac_vnc_client_log_info(const char* format, ...) { char message[2048]; /* Copy log message into buffer */ va_list args; va_start(args, format); vsnprintf(message, sizeof(message), format, args); va_end(args); /* Log to syslog */ syslog(LOG_INFO, "%s", message); } void guac_vnc_client_log_error(const char* format, ...) { char message[2048]; /* Copy log message into buffer */ va_list args; va_start(args, format); vsnprintf(message, sizeof(message), format, args); va_end(args); /* Log to syslog */ syslog(LOG_ERR, "%s", message); } guacamole-server-0.9.9/src/protocols/vnc/vnc_handlers.h0000664000175100017510000000350412643542623020150 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_VNC_VNC_HANDLERS_H #define __GUAC_VNC_VNC_HANDLERS_H #include "config.h" #include void guac_vnc_cursor(rfbClient* client, int x, int y, int w, int h, int bpp); void guac_vnc_update(rfbClient* client, int x, int y, int w, int h); void guac_vnc_copyrect(rfbClient* client, int src_x, int src_y, int w, int h, int dest_x, int dest_y); char* guac_vnc_get_password(rfbClient* client); rfbBool guac_vnc_malloc_framebuffer(rfbClient* rfb_client); void guac_vnc_cut_text(rfbClient* client, const char* text, int textlen); void guac_vnc_client_log_info(const char* format, ...); void guac_vnc_client_log_error(const char* format, ...); void guac_vnc_set_pixel_format(rfbClient* client, int color_depth); #endif guacamole-server-0.9.9/src/protocols/vnc/client.h0000664000175100017510000001217112643542623016760 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_VNC_CLIENT_H #define __GUAC_VNC_CLIENT_H #include "config.h" #include "guac_clipboard.h" #include "guac_surface.h" #include "guac_iconv.h" #include #include #include #ifdef ENABLE_PULSE #include #endif #ifdef ENABLE_COMMON_SSH #include "guac_sftp.h" #include "guac_ssh.h" #include "guac_ssh_user.h" #endif /** * The maximum duration of a frame in milliseconds. */ #define GUAC_VNC_FRAME_DURATION 40 /** * The amount of time to allow per message read within a frame, in * milliseconds. If the server is silent for at least this amount of time, the * frame will be considered finished. */ #define GUAC_VNC_FRAME_TIMEOUT 10 /** * The number of milliseconds to wait between connection attempts. */ #define GUAC_VNC_CONNECT_INTERVAL 1000 /** * The maximum number of bytes to allow within the clipboard. */ #define GUAC_VNC_CLIPBOARD_MAX_LENGTH 262144 extern char* __GUAC_CLIENT; /** * VNC-specific client data. */ typedef struct vnc_guac_client_data { /** * The underlying VNC client. */ rfbClient* rfb_client; /** * The original framebuffer malloc procedure provided by the initialized * rfbClient. */ MallocFrameBufferProc rfb_MallocFrameBuffer; /** * Whether copyrect was used to produce the latest update received * by the VNC server. */ int copy_rect_used; /** * The hostname of the VNC server (or repeater) to connect to. */ char* hostname; /** * The port of the VNC server (or repeater) to connect to. */ int port; /** * The password given in the arguments. */ char* password; /** * Space-separated list of encodings to use within the VNC session. */ char* encodings; /** * Whether the red and blue components of each color should be swapped. * This is mainly used for VNC servers that do not properly handle * colors. */ int swap_red_blue; /** * The color depth to request, in bits. */ int color_depth; /** * Whether this connection is read-only, and user input should be dropped. */ int read_only; /** * The VNC host to connect to, if using a repeater. */ char* dest_host; /** * The VNC port to connect to, if using a repeater. */ int dest_port; #ifdef ENABLE_VNC_LISTEN /** * Whether not actually connecting to a VNC server, but rather listening * for a connection from the VNC server (reverse connection). */ int reverse_connect; /** * The maximum amount of time to wait when listening for connections, in * milliseconds. */ int listen_timeout; #endif /** * Whether the cursor should be rendered on the server (remote) or on the * client (local). */ int remote_cursor; /** * The layer holding the cursor image. */ guac_layer* cursor; /** * Whether audio is enabled. */ int audio_enabled; /** * Audio output, if any. */ guac_audio_stream* audio; #ifdef ENABLE_PULSE /** * The name of the PulseAudio server to connect to. */ char* pa_servername; /** * PulseAudio event loop. */ pa_threaded_mainloop* pa_mainloop; #endif /** * Internal clipboard. */ guac_common_clipboard* clipboard; /** * Default surface. */ guac_common_surface* default_surface; #ifdef ENABLE_COMMON_SSH /** * The user and credentials used to authenticate for SFTP. */ guac_common_ssh_user* sftp_user; /** * The SSH session used for SFTP. */ guac_common_ssh_session* sftp_session; /** * The exposed filesystem object, implemented with SFTP. */ guac_object* sftp_filesystem; #endif /** * Clipboard encoding-specific reader. */ guac_iconv_read* clipboard_reader; /** * Clipboard encoding-specific writer. */ guac_iconv_write* clipboard_writer; } vnc_guac_client_data; #endif guacamole-server-0.9.9/src/protocols/vnc/client.c0000664000175100017510000004201312643542623016751 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "clipboard.h" #include "guac_clipboard.h" #include "guac_dot_cursor.h" #include "guac_handlers.h" #include "guac_pointer_cursor.h" #include "vnc_handlers.h" #ifdef ENABLE_PULSE #include "pulse.h" #endif #ifdef ENABLE_COMMON_SSH #include "guac_sftp.h" #include "guac_ssh.h" #include "sftp.h" #endif #include #include #include #include #include #include #include #include /* Client plugin arguments */ const char* GUAC_CLIENT_ARGS[] = { "hostname", "port", "read-only", "encodings", "password", "swap-red-blue", "color-depth", "cursor", "autoretry", "clipboard-encoding", #ifdef ENABLE_VNC_REPEATER "dest-host", "dest-port", #endif #ifdef ENABLE_PULSE "enable-audio", "audio-servername", #endif #ifdef ENABLE_VNC_LISTEN "reverse-connect", "listen-timeout", #endif #ifdef ENABLE_COMMON_SSH "enable-sftp", "sftp-hostname", "sftp-port", "sftp-username", "sftp-password", "sftp-private-key", "sftp-passphrase", "sftp-directory", #endif NULL }; enum VNC_ARGS_IDX { IDX_HOSTNAME, IDX_PORT, IDX_READ_ONLY, IDX_ENCODINGS, IDX_PASSWORD, IDX_SWAP_RED_BLUE, IDX_COLOR_DEPTH, IDX_CURSOR, IDX_AUTORETRY, IDX_CLIPBOARD_ENCODING, #ifdef ENABLE_VNC_REPEATER IDX_DEST_HOST, IDX_DEST_PORT, #endif #ifdef ENABLE_PULSE IDX_ENABLE_AUDIO, IDX_AUDIO_SERVERNAME, #endif #ifdef ENABLE_VNC_LISTEN IDX_REVERSE_CONNECT, IDX_LISTEN_TIMEOUT, #endif #ifdef ENABLE_COMMON_SSH IDX_ENABLE_SFTP, IDX_SFTP_HOSTNAME, IDX_SFTP_PORT, IDX_SFTP_USERNAME, IDX_SFTP_PASSWORD, IDX_SFTP_PRIVATE_KEY, IDX_SFTP_PASSPHRASE, IDX_SFTP_DIRECTORY, #endif VNC_ARGS_COUNT }; char* __GUAC_CLIENT = "GUAC_CLIENT"; /** * Allocates a new rfbClient instance given the parameters stored within the * client, returning NULL on failure. */ static rfbClient* __guac_vnc_get_client(guac_client* client) { rfbClient* rfb_client = rfbGetClient(8, 3, 4); /* 32-bpp client */ vnc_guac_client_data* guac_client_data = (vnc_guac_client_data*) client->data; /* Store Guac client in rfb client */ rfbClientSetClientData(rfb_client, __GUAC_CLIENT, client); /* Framebuffer update handler */ rfb_client->GotFrameBufferUpdate = guac_vnc_update; rfb_client->GotCopyRect = guac_vnc_copyrect; /* Do not handle clipboard and local cursor if read-only */ if (guac_client_data->read_only == 0) { /* Clipboard */ rfb_client->GotXCutText = guac_vnc_cut_text; /* Set remote cursor */ if (guac_client_data->remote_cursor) rfb_client->appData.useRemoteCursor = FALSE; else { /* Enable client-side cursor */ rfb_client->appData.useRemoteCursor = TRUE; rfb_client->GotCursorShape = guac_vnc_cursor; } } /* Password */ rfb_client->GetPassword = guac_vnc_get_password; /* Depth */ guac_vnc_set_pixel_format(rfb_client, guac_client_data->color_depth); /* Hook into allocation so we can handle resize. */ guac_client_data->rfb_MallocFrameBuffer = rfb_client->MallocFrameBuffer; rfb_client->MallocFrameBuffer = guac_vnc_malloc_framebuffer; rfb_client->canHandleNewFBSize = 1; /* Set hostname and port */ rfb_client->serverHost = strdup(guac_client_data->hostname); rfb_client->serverPort = guac_client_data->port; #ifdef ENABLE_VNC_REPEATER /* Set repeater parameters if specified */ if (guac_client_data->dest_host) { rfb_client->destHost = strdup(guac_client_data->dest_host); rfb_client->destPort = guac_client_data->dest_port; } #endif #ifdef ENABLE_VNC_LISTEN /* If reverse connection enabled, start listening */ if (guac_client_data->reverse_connect) { guac_client_log(client, GUAC_LOG_INFO, "Listening for connections on port %i", guac_client_data->port); /* Listen for connection from server */ rfb_client->listenPort = guac_client_data->port; if (listenForIncomingConnectionsNoFork(rfb_client, guac_client_data->listen_timeout*1000) <= 0) return NULL; } #endif /* Set encodings if provided */ if (guac_client_data->encodings) rfb_client->appData.encodingsString = strdup(guac_client_data->encodings); /* Connect */ if (rfbInitClient(rfb_client, NULL, NULL)) return rfb_client; /* If connection fails, return NULL */ return NULL; } /** * Sets the encoding of clipboard data exchanged with the VNC server to the * encoding having the given name. If the name is left blank, or is invalid, * the standard ISO8859-1 encoding will be used. * * @param client * The client to set the clipboard encoding of. * * @param name * The name of the encoding to use for all clipboard data. Valid values * are: "ISO8859-1", "UTF-8", "UTF-16", "CP1252", or "". * * @return * Zero if the chosen encoding is standard for VNC, or non-zero if the VNC * standard is being violated. */ static int guac_vnc_set_clipboard_encoding(guac_client* client, const char* name) { vnc_guac_client_data* guac_client_data = (vnc_guac_client_data*) client->data; /* Use ISO8859-1 if explicitly selected or blank */ if (name[0] == '\0' || strcmp(name, "ISO8859-1") == 0) { guac_client_data->clipboard_reader = GUAC_READ_ISO8859_1; guac_client_data->clipboard_writer = GUAC_WRITE_ISO8859_1; return 0; } /* UTF-8 */ if (strcmp(name, "UTF-8") == 0) { guac_client_data->clipboard_reader = GUAC_READ_UTF8; guac_client_data->clipboard_writer = GUAC_WRITE_UTF8; return 1; } /* UTF-16 */ if (strcmp(name, "UTF-16") == 0) { guac_client_data->clipboard_reader = GUAC_READ_UTF16; guac_client_data->clipboard_writer = GUAC_WRITE_UTF16; return 1; } /* CP1252 */ if (strcmp(name, "CP1252") == 0) { guac_client_data->clipboard_reader = GUAC_READ_CP1252; guac_client_data->clipboard_writer = GUAC_WRITE_CP1252; return 1; } /* If encoding unrecognized, warn and default to ISO8859-1 */ guac_client_log(client, GUAC_LOG_WARNING, "Encoding '%s' is invalid. Defaulting to ISO8859-1.", name); guac_client_data->clipboard_reader = GUAC_READ_ISO8859_1; guac_client_data->clipboard_writer = GUAC_WRITE_ISO8859_1; return 0; } int guac_client_init(guac_client* client, int argc, char** argv) { rfbClient* rfb_client; vnc_guac_client_data* guac_client_data; int retries_remaining; /* Set up libvncclient logging */ rfbClientLog = guac_vnc_client_log_info; rfbClientErr = guac_vnc_client_log_error; /*** PARSE ARGUMENTS ***/ if (argc != VNC_ARGS_COUNT) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Wrong argument count received."); return 1; } /* Alloc client data */ guac_client_data = malloc(sizeof(vnc_guac_client_data)); client->data = guac_client_data; guac_client_data->hostname = strdup(argv[IDX_HOSTNAME]); guac_client_data->port = atoi(argv[IDX_PORT]); guac_client_data->password = strdup(argv[IDX_PASSWORD]); /* NOTE: freed by libvncclient */ guac_client_data->default_surface = NULL; /* Set flags */ guac_client_data->remote_cursor = (strcmp(argv[IDX_CURSOR], "remote") == 0); guac_client_data->swap_red_blue = (strcmp(argv[IDX_SWAP_RED_BLUE], "true") == 0); guac_client_data->read_only = (strcmp(argv[IDX_READ_ONLY], "true") == 0); /* Parse color depth */ guac_client_data->color_depth = atoi(argv[IDX_COLOR_DEPTH]); #ifdef ENABLE_VNC_REPEATER /* Set repeater parameters if specified */ if (argv[IDX_DEST_HOST][0] != '\0') guac_client_data->dest_host = strdup(argv[IDX_DEST_HOST]); else guac_client_data->dest_host = NULL; if (argv[IDX_DEST_PORT][0] != '\0') guac_client_data->dest_port = atoi(argv[IDX_DEST_PORT]); #endif /* Set encodings if specified */ if (argv[IDX_ENCODINGS][0] != '\0') guac_client_data->encodings = strdup(argv[IDX_ENCODINGS]); else guac_client_data->encodings = NULL; /* Parse autoretry */ if (argv[IDX_AUTORETRY][0] != '\0') retries_remaining = atoi(argv[IDX_AUTORETRY]); else retries_remaining = 0; #ifdef ENABLE_VNC_LISTEN /* Set reverse-connection flag */ guac_client_data->reverse_connect = (strcmp(argv[IDX_REVERSE_CONNECT], "true") == 0); /* Parse listen timeout */ if (argv[IDX_LISTEN_TIMEOUT][0] != '\0') guac_client_data->listen_timeout = atoi(argv[IDX_LISTEN_TIMEOUT]); else guac_client_data->listen_timeout = 5000; #endif /* Init clipboard */ guac_client_data->clipboard = guac_common_clipboard_alloc(GUAC_VNC_CLIPBOARD_MAX_LENGTH); /* Configure clipboard encoding */ if (guac_vnc_set_clipboard_encoding(client, argv[IDX_CLIPBOARD_ENCODING])) guac_client_log(client, GUAC_LOG_INFO, "Using non-standard VNC clipboard encoding: '%s'.", argv[IDX_CLIPBOARD_ENCODING]); /* Ensure connection is kept alive during lengthy connects */ guac_socket_require_keep_alive(client->socket); /* Attempt connection */ rfb_client = __guac_vnc_get_client(client); /* If unsuccessful, retry as many times as specified */ while (!rfb_client && retries_remaining > 0) { struct timespec guac_vnc_connect_interval = { .tv_sec = GUAC_VNC_CONNECT_INTERVAL/1000, .tv_nsec = (GUAC_VNC_CONNECT_INTERVAL%1000)*1000000 }; guac_client_log(client, GUAC_LOG_INFO, "Connect failed. Waiting %ims before retrying...", GUAC_VNC_CONNECT_INTERVAL); /* Wait for given interval then retry */ nanosleep(&guac_vnc_connect_interval, NULL); rfb_client = __guac_vnc_get_client(client); retries_remaining--; } /* If the final connect attempt fails, return error */ if (!rfb_client) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR, "Unable to connect to VNC server."); return 1; } #ifdef ENABLE_PULSE guac_client_data->audio_enabled = (strcmp(argv[IDX_ENABLE_AUDIO], "true") == 0); /* If an encoding is available, load an audio stream */ if (guac_client_data->audio_enabled) { guac_client_data->audio = guac_audio_stream_alloc(client, NULL, GUAC_VNC_AUDIO_RATE, GUAC_VNC_AUDIO_CHANNELS, GUAC_VNC_AUDIO_BPS); /* Load servername if specified */ if (argv[IDX_AUDIO_SERVERNAME][0] != '\0') guac_client_data->pa_servername = strdup(argv[IDX_AUDIO_SERVERNAME]); else guac_client_data->pa_servername = NULL; /* If successful, init audio system */ if (guac_client_data->audio != NULL) { guac_client_log(client, GUAC_LOG_INFO, "Audio will be encoded as %s", guac_client_data->audio->encoder->mimetype); /* Require threadsafe sockets if audio enabled */ guac_socket_require_threadsafe(client->socket); /* Start audio stream */ guac_pa_start_stream(client); } /* Otherwise, audio loading failed */ else guac_client_log(client, GUAC_LOG_INFO, "No available audio encoding. Sound disabled."); } /* end if audio enabled */ #endif #ifdef ENABLE_COMMON_SSH guac_common_ssh_init(client); /* Connect via SSH if SFTP is enabled */ if (strcmp(argv[IDX_ENABLE_SFTP], "true") == 0) { guac_client_log(client, GUAC_LOG_DEBUG, "Connecting via SSH for SFTP filesystem access."); guac_client_data->sftp_user = guac_common_ssh_create_user(argv[IDX_SFTP_USERNAME]); /* Import private key, if given */ if (argv[IDX_SFTP_PRIVATE_KEY][0] != '\0') { guac_client_log(client, GUAC_LOG_DEBUG, "Authenticating with private key."); /* Abort if private key cannot be read */ if (guac_common_ssh_user_import_key(guac_client_data->sftp_user, argv[IDX_SFTP_PRIVATE_KEY], argv[IDX_SFTP_PASSPHRASE])) { guac_common_ssh_destroy_user(guac_client_data->sftp_user); return 1; } } /* Otherwise, use specified password */ else { guac_client_log(client, GUAC_LOG_DEBUG, "Authenticating with password."); guac_common_ssh_user_set_password(guac_client_data->sftp_user, argv[IDX_SFTP_PASSWORD]); } /* Parse hostname - use VNC hostname by default */ const char* sftp_hostname = argv[IDX_SFTP_HOSTNAME]; if (sftp_hostname[0] == '\0') sftp_hostname = guac_client_data->hostname; /* Parse port, defaulting to standard SSH port */ const char* sftp_port = argv[IDX_SFTP_PORT]; if (sftp_port[0] == '\0') sftp_port = "22"; /* Attempt SSH connection */ guac_client_data->sftp_session = guac_common_ssh_create_session(client, sftp_hostname, sftp_port, guac_client_data->sftp_user); /* Fail if SSH connection does not succeed */ if (guac_client_data->sftp_session == NULL) { /* Already aborted within guac_common_ssh_create_session() */ guac_common_ssh_destroy_user(guac_client_data->sftp_user); return 1; } /* Load and expose filesystem */ guac_client_data->sftp_filesystem = guac_common_ssh_create_sftp_filesystem( guac_client_data->sftp_session, "/"); /* Abort if SFTP connection fails */ if (guac_client_data->sftp_filesystem == NULL) { guac_common_ssh_destroy_session(guac_client_data->sftp_session); guac_common_ssh_destroy_user(guac_client_data->sftp_user); return 1; } /* Configure destination for basic uploads, if specified */ if (argv[IDX_SFTP_DIRECTORY][0] != '\0') guac_common_ssh_sftp_set_upload_path( guac_client_data->sftp_filesystem, argv[IDX_SFTP_DIRECTORY]); /* Set file handler for basic uploads */ client->file_handler = guac_vnc_sftp_file_handler; guac_client_log(client, GUAC_LOG_DEBUG, "SFTP connection succeeded."); } #endif /* Set remaining client data */ guac_client_data->rfb_client = rfb_client; guac_client_data->copy_rect_used = 0; guac_client_data->cursor = guac_client_alloc_buffer(client); /* Set handlers */ client->handle_messages = vnc_guac_client_handle_messages; client->free_handler = vnc_guac_client_free_handler; /* If not read-only, set input handlers and pointer */ if (guac_client_data->read_only == 0) { /* Only handle mouse/keyboard/clipboard if not read-only */ client->mouse_handler = vnc_guac_client_mouse_handler; client->key_handler = vnc_guac_client_key_handler; client->clipboard_handler = guac_vnc_clipboard_handler; /* If not read-only but cursor is remote, set a dot cursor */ if (guac_client_data->remote_cursor) guac_common_set_dot_cursor(client); /* Otherwise, set pointer until explicitly requested otherwise */ else guac_common_set_pointer_cursor(client); } /* Send name */ guac_protocol_send_name(client->socket, rfb_client->desktopName); /* Create default surface */ guac_client_data->default_surface = guac_common_surface_alloc(client, client->socket, GUAC_DEFAULT_LAYER, rfb_client->width, rfb_client->height); return 0; } guacamole-server-0.9.9/src/protocols/vnc/guac_handlers.c0000664000175100017510000001357012643542623020300 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "guac_clipboard.h" #include "guac_surface.h" #include #include #include #include #ifdef ENABLE_COMMON_SSH #include #include #include #endif #ifdef ENABLE_PULSE #include "pulse.h" #endif #include /** * Waits until data is available to be read from the given rfbClient, and thus * a call to HandleRFBServerMessages() should not block. If the timeout elapses * before data is available, zero is returned. * * @param rfb_client * The rfbClient to wait for. * * @param timeout * The maximum amount of time to wait, in microseconds. * * @returns * A positive value if data is available, zero if the timeout elapses * before data becomes available, or a negative value on error. */ static int guac_vnc_wait_for_messages(rfbClient* rfb_client, int timeout) { /* Do not explicitly wait while data is on the buffer */ if (rfb_client->buffered) return 1; /* If no data on buffer, wait for data on socket */ return WaitForMessage(rfb_client, timeout); } int vnc_guac_client_handle_messages(guac_client* client) { vnc_guac_client_data* guac_client_data = (vnc_guac_client_data*) client->data; rfbClient* rfb_client = guac_client_data->rfb_client; /* Initially wait for messages */ int wait_result = guac_vnc_wait_for_messages(rfb_client, 1000000); guac_timestamp frame_start = guac_timestamp_current(); while (wait_result > 0) { guac_timestamp frame_end; int frame_remaining; /* Handle any message received */ if (!HandleRFBServerMessage(rfb_client)) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR, "Error handling message from VNC server."); return 1; } /* Calculate time remaining in frame */ frame_end = guac_timestamp_current(); frame_remaining = frame_start + GUAC_VNC_FRAME_DURATION - frame_end; /* Wait again if frame remaining */ if (frame_remaining > 0) wait_result = guac_vnc_wait_for_messages(rfb_client, GUAC_VNC_FRAME_TIMEOUT*1000); else break; } /* If an error occurs, log it and fail */ if (wait_result < 0) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR, "Connection closed."); return 1; } guac_common_surface_flush(guac_client_data->default_surface); return 0; } int vnc_guac_client_mouse_handler(guac_client* client, int x, int y, int mask) { rfbClient* rfb_client = ((vnc_guac_client_data*) client->data)->rfb_client; SendPointerEvent(rfb_client, x, y, mask); return 0; } int vnc_guac_client_key_handler(guac_client* client, int keysym, int pressed) { rfbClient* rfb_client = ((vnc_guac_client_data*) client->data)->rfb_client; SendKeyEvent(rfb_client, keysym, pressed); return 0; } int vnc_guac_client_free_handler(guac_client* client) { vnc_guac_client_data* guac_client_data = (vnc_guac_client_data*) client->data; rfbClient* rfb_client = guac_client_data->rfb_client; #ifdef ENABLE_PULSE /* If audio enabled, stop streaming */ if (guac_client_data->audio_enabled) guac_pa_stop_stream(client); #endif #ifdef ENABLE_COMMON_SSH /* Free SFTP filesystem, if loaded */ if (guac_client_data->sftp_filesystem) guac_common_ssh_destroy_sftp_filesystem(guac_client_data->sftp_filesystem); /* Free SFTP session */ if (guac_client_data->sftp_session) guac_common_ssh_destroy_session(guac_client_data->sftp_session); /* Free SFTP user */ if (guac_client_data->sftp_user) guac_common_ssh_destroy_user(guac_client_data->sftp_user); guac_common_ssh_uninit(); #endif /* Free encodings string, if used */ if (guac_client_data->encodings != NULL) free(guac_client_data->encodings); /* Free clipboard */ guac_common_clipboard_free(guac_client_data->clipboard); /* Free surface */ guac_common_surface_free(guac_client_data->default_surface); /* Free generic data struct */ free(client->data); /* Free memory not free'd by libvncclient's rfbClientCleanup() */ if (rfb_client->frameBuffer != NULL) free(rfb_client->frameBuffer); if (rfb_client->raw_buffer != NULL) free(rfb_client->raw_buffer); if (rfb_client->rcSource != NULL) free(rfb_client->rcSource); /* Free VNC rfbClientData linked list (not free'd by rfbClientCleanup()) */ while (rfb_client->clientData != NULL) { rfbClientData* next = rfb_client->clientData->next; free(rfb_client->clientData); rfb_client->clientData = next; } /* Clean up VNC client*/ rfbClientCleanup(rfb_client); return 0; } guacamole-server-0.9.9/src/protocols/vnc/Makefile.am0000664000175100017510000000424312643542623017366 00000000000000# # Copyright (C) 2015 Glyptodon LLC # # 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. # AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 lib_LTLIBRARIES = libguac-client-vnc.la libguac_client_vnc_la_SOURCES = \ client.c \ clipboard.c \ guac_handlers.c \ vnc_handlers.c noinst_HEADERS = \ client.h \ clipboard.h \ guac_handlers.h \ vnc_handlers.h # Optional PulseAudio support if ENABLE_PULSE libguac_client_vnc_la_SOURCES += pulse.c noinst_HEADERS += pulse.h endif libguac_client_vnc_la_CFLAGS = \ -Werror -Wall -pedantic -Iinclude \ @COMMON_INCLUDE@ \ @COMMON_SSH_INCLUDE@ \ @LIBGUAC_INCLUDE@ libguac_client_vnc_la_LDFLAGS = \ -version-info 0:0:0 \ @CAIRO_LIBS@ \ @PULSE_LIBS@ \ @VNC_LIBS@ libguac_client_vnc_la_LIBADD = \ @COMMON_LTLIB@ \ @LIBGUAC_LTLIB@ # Optional SFTP support if ENABLE_COMMON_SSH libguac_client_vnc_la_SOURCES += sftp.c noinst_HEADERS += sftp.h libguac_client_vnc_la_LIBADD += @COMMON_SSH_LTLIB@ endif guacamole-server-0.9.9/src/protocols/ssh/0000775000175100017510000000000012645400336015412 500000000000000guacamole-server-0.9.9/src/protocols/ssh/clipboard.c0000664000175100017510000000423712536405625017450 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "clipboard.h" #include "terminal.h" #include #include int guac_ssh_clipboard_handler(guac_client* client, guac_stream* stream, char* mimetype) { /* Clear clipboard and prepare for new data */ ssh_guac_client_data* client_data = (ssh_guac_client_data*) client->data; guac_terminal_clipboard_reset(client_data->term, mimetype); /* Set handlers for clipboard stream */ stream->blob_handler = guac_ssh_clipboard_blob_handler; stream->end_handler = guac_ssh_clipboard_end_handler; return 0; } int guac_ssh_clipboard_blob_handler(guac_client* client, guac_stream* stream, void* data, int length) { /* Append new data */ ssh_guac_client_data* client_data = (ssh_guac_client_data*) client->data; guac_terminal_clipboard_append(client_data->term, data, length); return 0; } int guac_ssh_clipboard_end_handler(guac_client* client, guac_stream* stream) { /* Nothing to do - clipboard is implemented within client */ return 0; } guacamole-server-0.9.9/src/protocols/ssh/ssh_client.h0000664000175100017510000000247712536405625017655 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __SSH_CLIENT_H #define __SSH_CLIENT_H #include "config.h" #include /** * Main SSH client thread, handling transfer of SSH output to STDOUT. */ void* ssh_client_thread(void* data); #endif guacamole-server-0.9.9/src/protocols/ssh/Makefile.in0000664000175100017510000007453512645400275017417 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Copyright (C) 2015 Glyptodon LLC # # 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. # VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ # Add agent sources if enabled @ENABLE_SSH_AGENT_TRUE@am__append_1 = ssh_agent.c @ENABLE_SSH_AGENT_TRUE@am__append_2 = ssh_agent.h subdir = src/protocols/ssh DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(am__noinst_HEADERS_DIST) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) libguac_client_ssh_la_DEPENDENCIES = am__libguac_client_ssh_la_SOURCES_DIST = client.c clipboard.c \ guac_handlers.c sftp.c ssh_client.c ssh_agent.c @ENABLE_SSH_AGENT_TRUE@am__objects_1 = \ @ENABLE_SSH_AGENT_TRUE@ libguac_client_ssh_la-ssh_agent.lo am_libguac_client_ssh_la_OBJECTS = libguac_client_ssh_la-client.lo \ libguac_client_ssh_la-clipboard.lo \ libguac_client_ssh_la-guac_handlers.lo \ libguac_client_ssh_la-sftp.lo \ libguac_client_ssh_la-ssh_client.lo $(am__objects_1) libguac_client_ssh_la_OBJECTS = $(am_libguac_client_ssh_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libguac_client_ssh_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libguac_client_ssh_la_CFLAGS) $(CFLAGS) \ $(libguac_client_ssh_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libguac_client_ssh_la_SOURCES) DIST_SOURCES = $(am__libguac_client_ssh_la_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__noinst_HEADERS_DIST = client.h clipboard.h guac_handlers.h sftp.h \ ssh_client.h ssh_agent.h HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COMMON_INCLUDE = @COMMON_INCLUDE@ COMMON_LTLIB = @COMMON_LTLIB@ COMMON_SSH_INCLUDE = @COMMON_SSH_INCLUDE@ COMMON_SSH_LTLIB = @COMMON_SSH_LTLIB@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CUNIT_LIBS = @CUNIT_LIBS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBADD_DLOPEN = @LIBADD_DLOPEN@ LIBGUAC_INCLUDE = @LIBGUAC_INCLUDE@ LIBGUAC_LTLIB = @LIBGUAC_LTLIB@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MATH_LIBS = @MATH_LIBS@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@ PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@ PANGO_CFLAGS = @PANGO_CFLAGS@ PANGO_LIBS = @PANGO_LIBS@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_LIBS = @PNG_LIBS@ PTHREAD_LIBS = @PTHREAD_LIBS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ RDP_LIBS = @RDP_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSH_LIBS = @SSH_LIBS@ SSL_LIBS = @SSL_LIBS@ STRIP = @STRIP@ TELNET_LIBS = @TELNET_LIBS@ TERMINAL_INCLUDE = @TERMINAL_INCLUDE@ TERMINAL_LTLIB = @TERMINAL_LTLIB@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VNC_LIBS = @VNC_LIBS@ VORBIS_LIBS = @VORBIS_LIBS@ WEBP_LIBS = @WEBP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ init_dir = @init_dir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 lib_LTLIBRARIES = libguac-client-ssh.la libguac_client_ssh_la_SOURCES = client.c clipboard.c guac_handlers.c \ sftp.c ssh_client.c $(am__append_1) noinst_HEADERS = client.h clipboard.h guac_handlers.h sftp.h \ ssh_client.h $(am__append_2) libguac_client_ssh_la_CFLAGS = \ -Werror -Wall -Iinclude \ @COMMON_SSH_INCLUDE@ \ @LIBGUAC_INCLUDE@ \ @TERMINAL_INCLUDE@ libguac_client_ssh_la_LIBADD = \ @COMMON_LTLIB@ \ @COMMON_SSH_LTLIB@ \ @LIBGUAC_LTLIB@ \ @TERMINAL_LTLIB@ libguac_client_ssh_la_LDFLAGS = \ -version-info 0:0:0 \ @PTHREAD_LIBS@ \ @SSH_LIBS@ \ @SSL_LIBS@ all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/protocols/ssh/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/protocols/ssh/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libguac-client-ssh.la: $(libguac_client_ssh_la_OBJECTS) $(libguac_client_ssh_la_DEPENDENCIES) $(EXTRA_libguac_client_ssh_la_DEPENDENCIES) $(AM_V_CCLD)$(libguac_client_ssh_la_LINK) -rpath $(libdir) $(libguac_client_ssh_la_OBJECTS) $(libguac_client_ssh_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_ssh_la-client.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_ssh_la-clipboard.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_ssh_la-guac_handlers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_ssh_la-sftp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_ssh_la-ssh_agent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_ssh_la-ssh_client.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libguac_client_ssh_la-client.lo: client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_ssh_la_CFLAGS) $(CFLAGS) -MT libguac_client_ssh_la-client.lo -MD -MP -MF $(DEPDIR)/libguac_client_ssh_la-client.Tpo -c -o libguac_client_ssh_la-client.lo `test -f 'client.c' || echo '$(srcdir)/'`client.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_ssh_la-client.Tpo $(DEPDIR)/libguac_client_ssh_la-client.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client.c' object='libguac_client_ssh_la-client.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_ssh_la_CFLAGS) $(CFLAGS) -c -o libguac_client_ssh_la-client.lo `test -f 'client.c' || echo '$(srcdir)/'`client.c libguac_client_ssh_la-clipboard.lo: clipboard.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_ssh_la_CFLAGS) $(CFLAGS) -MT libguac_client_ssh_la-clipboard.lo -MD -MP -MF $(DEPDIR)/libguac_client_ssh_la-clipboard.Tpo -c -o libguac_client_ssh_la-clipboard.lo `test -f 'clipboard.c' || echo '$(srcdir)/'`clipboard.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_ssh_la-clipboard.Tpo $(DEPDIR)/libguac_client_ssh_la-clipboard.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clipboard.c' object='libguac_client_ssh_la-clipboard.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_ssh_la_CFLAGS) $(CFLAGS) -c -o libguac_client_ssh_la-clipboard.lo `test -f 'clipboard.c' || echo '$(srcdir)/'`clipboard.c libguac_client_ssh_la-guac_handlers.lo: guac_handlers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_ssh_la_CFLAGS) $(CFLAGS) -MT libguac_client_ssh_la-guac_handlers.lo -MD -MP -MF $(DEPDIR)/libguac_client_ssh_la-guac_handlers.Tpo -c -o libguac_client_ssh_la-guac_handlers.lo `test -f 'guac_handlers.c' || echo '$(srcdir)/'`guac_handlers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_ssh_la-guac_handlers.Tpo $(DEPDIR)/libguac_client_ssh_la-guac_handlers.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_handlers.c' object='libguac_client_ssh_la-guac_handlers.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_ssh_la_CFLAGS) $(CFLAGS) -c -o libguac_client_ssh_la-guac_handlers.lo `test -f 'guac_handlers.c' || echo '$(srcdir)/'`guac_handlers.c libguac_client_ssh_la-sftp.lo: sftp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_ssh_la_CFLAGS) $(CFLAGS) -MT libguac_client_ssh_la-sftp.lo -MD -MP -MF $(DEPDIR)/libguac_client_ssh_la-sftp.Tpo -c -o libguac_client_ssh_la-sftp.lo `test -f 'sftp.c' || echo '$(srcdir)/'`sftp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_ssh_la-sftp.Tpo $(DEPDIR)/libguac_client_ssh_la-sftp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sftp.c' object='libguac_client_ssh_la-sftp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_ssh_la_CFLAGS) $(CFLAGS) -c -o libguac_client_ssh_la-sftp.lo `test -f 'sftp.c' || echo '$(srcdir)/'`sftp.c libguac_client_ssh_la-ssh_client.lo: ssh_client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_ssh_la_CFLAGS) $(CFLAGS) -MT libguac_client_ssh_la-ssh_client.lo -MD -MP -MF $(DEPDIR)/libguac_client_ssh_la-ssh_client.Tpo -c -o libguac_client_ssh_la-ssh_client.lo `test -f 'ssh_client.c' || echo '$(srcdir)/'`ssh_client.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_ssh_la-ssh_client.Tpo $(DEPDIR)/libguac_client_ssh_la-ssh_client.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ssh_client.c' object='libguac_client_ssh_la-ssh_client.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_ssh_la_CFLAGS) $(CFLAGS) -c -o libguac_client_ssh_la-ssh_client.lo `test -f 'ssh_client.c' || echo '$(srcdir)/'`ssh_client.c libguac_client_ssh_la-ssh_agent.lo: ssh_agent.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_ssh_la_CFLAGS) $(CFLAGS) -MT libguac_client_ssh_la-ssh_agent.lo -MD -MP -MF $(DEPDIR)/libguac_client_ssh_la-ssh_agent.Tpo -c -o libguac_client_ssh_la-ssh_agent.lo `test -f 'ssh_agent.c' || echo '$(srcdir)/'`ssh_agent.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_ssh_la-ssh_agent.Tpo $(DEPDIR)/libguac_client_ssh_la-ssh_agent.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ssh_agent.c' object='libguac_client_ssh_la-ssh_agent.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_ssh_la_CFLAGS) $(CFLAGS) -c -o libguac_client_ssh_la-ssh_agent.lo `test -f 'ssh_agent.c' || echo '$(srcdir)/'`ssh_agent.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libLTLIBRARIES install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: guacamole-server-0.9.9/src/protocols/ssh/sftp.c0000664000175100017510000000437712626133327016467 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "guac_sftp.h" #include "sftp.h" #include #include int guac_sftp_file_handler(guac_client* client, guac_stream* stream, char* mimetype, char* filename) { ssh_guac_client_data* client_data = (ssh_guac_client_data*) client->data; guac_object* filesystem = client_data->sftp_filesystem; /* Handle file upload */ return guac_common_ssh_sftp_handle_file_stream(filesystem, stream, mimetype, filename); } guac_stream* guac_sftp_download_file(guac_client* client, char* filename) { ssh_guac_client_data* client_data = (ssh_guac_client_data*) client->data; guac_object* filesystem = client_data->sftp_filesystem; /* Initiate download of requested file */ return guac_common_ssh_sftp_download_file(filesystem, filename); } void guac_sftp_set_upload_path(guac_client* client, char* path) { ssh_guac_client_data* client_data = (ssh_guac_client_data*) client->data; guac_object* filesystem = client_data->sftp_filesystem; /* Set upload path as specified */ guac_common_ssh_sftp_set_upload_path(filesystem, path); } guacamole-server-0.9.9/src/protocols/ssh/sftp.h0000664000175100017510000000616512626133327016471 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _SSH_GUAC_SFTP_H #define _SSH_GUAC_SFTP_H #include "config.h" #include #include /** * Handles an incoming stream from a Guacamole "file" instruction, saving the * contents of that stream to the file having the given name within the * upload directory set by guac_sftp_set_upload_path(). * * @param client * The client receiving the uploaded file. * * @param stream * The stream through which the uploaded file data will be received. * * @param mimetype * The mimetype of the data being received. * * @param filename * The filename of the file to write to. This filename will always be taken * relative to the upload path set by * guac_common_ssh_sftp_set_upload_path(). * * @return * Zero if the incoming stream has been handled successfully, non-zero on * failure. */ int guac_sftp_file_handler(guac_client* client, guac_stream* stream, char* mimetype, char* filename); /** * Initiates an SFTP file download to the user via the Guacamole "file" * instruction. The download will be automatically monitored and continued * after this function terminates in response to "ack" instructions received by * the client. * * @param client * The client receiving the file. * * @param filename * The filename of the file to download, relative to the given filesystem. * * @return * The file stream created for the file download, already configured to * properly handle "ack" responses, etc. from the client. */ guac_stream* guac_sftp_download_file(guac_client* client, char* filename); /** * Sets the destination directory for future uploads submitted via Guacamole * "file" instruction. This function has no bearing on the destination * directories of files uploaded with "put" instructions. * * @param client * The client setting the upload path. * * @param path * The path to use for future uploads submitted via "file" instruction. */ void guac_sftp_set_upload_path(guac_client* client, char* path); #endif guacamole-server-0.9.9/src/protocols/ssh/ssh_agent.h0000664000175100017510000000626612536405625017475 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_SSH_AGENT_H #define _GUAC_SSH_AGENT_H #include "config.h" #include "ssh_key.h" /** * Packet type of an agent identity request. */ #define SSH2_AGENT_REQUEST_IDENTITIES 0x0B /** * Packet type of an agent identity response. */ #define SSH2_AGENT_IDENTITIES_ANSWER 0x0C /** * Packet type of an agent sign request. */ #define SSH2_AGENT_SIGN_REQUEST 0x0D /** * Packet type of an agent sign response. */ #define SSH2_AGENT_SIGN_RESPONSE 0x0E /** * The comment to associate with public keys when listed. */ #define SSH_AGENT_COMMENT "Guacamole SSH Agent" /** * The packet sent by the SSH agent when an operation is not supported. */ #define UNSUPPORTED "\x00\x00\x00\x0C\x05Unsupported" /** * Data representing an SSH auth agent. */ typedef struct ssh_auth_agent { /** * The SSH channel being used for SSH agent protocol. */ LIBSSH2_CHANNEL* channel; /** * The single private key to use for authentication. */ ssh_key* identity; /** * Data read from the agent channel. */ char buffer[4096]; /** * The number of bytes of data currently stored in the buffer. */ int buffer_length; } ssh_auth_agent; /** * Handler for an agent sign request. */ void ssh_auth_agent_sign(ssh_auth_agent* auth_agent, char* data, int data_length); /** * Handler for an agent identity request. */ void ssh_auth_agent_list_identities(ssh_auth_agent* auth_agent); /** * Generic handler for all packets received over the auth agent channel. */ void ssh_auth_agent_handle_packet(ssh_auth_agent* auth_agent, uint8_t type, char* data, int data_length); /** * Reads and handles a single packet from the SSH agent channel associated * with the given ssh_auth_agent, returning the size of that packet, the size * of the partial packet read, or a negative value if an error occurs. */ int ssh_auth_agent_read(ssh_auth_agent* auth_agent); /** * Libssh2 callback, invoked when the auth agent channel is opened. */ void ssh_auth_agent_callback(LIBSSH2_SESSION *session, LIBSSH2_CHANNEL *channel, void **abstract); #endif guacamole-server-0.9.9/src/protocols/ssh/clipboard.h0000664000175100017510000000327312536405625017454 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUAC_SSH_CLIPBOARD_H #define _GUAC_SSH_CLIPBOARD_H #include "config.h" #include #include /** * Handler for inbound clipboard data. */ int guac_ssh_clipboard_handler(guac_client* client, guac_stream* stream, char* mimetype); /** * Handler for stream data related to clipboard. */ int guac_ssh_clipboard_blob_handler(guac_client* client, guac_stream* stream, void* data, int length); /** * Handler for end-of-stream related to clipboard. */ int guac_ssh_clipboard_end_handler(guac_client* client, guac_stream* stream); #endif guacamole-server-0.9.9/src/protocols/ssh/guac_handlers.h0000664000175100017510000000306612536405625020314 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _SSH_GUAC_HANDLERS_H #define _SSH_GUAC_HANDLERS_H #include "config.h" #include int ssh_guac_client_handle_messages(guac_client* client); int ssh_guac_client_key_handler(guac_client* client, int keysym, int pressed); int ssh_guac_client_mouse_handler(guac_client* client, int x, int y, int mask); int ssh_guac_client_size_handler(guac_client* client, int width, int height); int ssh_guac_client_free_handler(guac_client* client); #endif guacamole-server-0.9.9/src/protocols/ssh/client.h0000664000175100017510000000700412626724073016770 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _SSH_GUAC_CLIENT_H #define _SSH_GUAC_CLIENT_H #include "config.h" #include "guac_ssh.h" #include "guac_ssh_user.h" #include "sftp.h" #include "terminal.h" #include #include #include #ifdef ENABLE_SSH_AGENT #include "ssh_agent.h" #endif #include #include /** * SSH-specific client data. */ typedef struct ssh_guac_client_data { /** * The hostname of the SSH server to connect to. */ char hostname[1024]; /** * The port of the SSH server to connect to. */ char port[64]; /** * The name of the user to login as. */ char username[1024]; /** * The password to give when authenticating. */ char password[1024]; /** * The private key, encoded as base64. */ char key_base64[4096]; /** * The password to use to decrypt the given private key. */ char key_passphrase[1024]; /** * The command to run instead of the default shell. If a normal shell * session is desired, this will be NULL. */ char* command; /** * The name of the font to use for display rendering. */ char font_name[1024]; /** * The size of the font to use, in points. */ int font_size; /** * Whether SFTP is enabled. */ bool enable_sftp; #ifdef ENABLE_SSH_AGENT /** * Whether the SSH agent is enabled. */ bool enable_agent; /** * The current agent, if any. */ ssh_auth_agent* auth_agent; #endif /** * The SSH client thread. */ pthread_t client_thread; /** * The user and credentials to use for all SSH sessions. */ guac_common_ssh_user* user; /** * SSH session, used by the SSH client thread. */ guac_common_ssh_session* session; /** * SFTP session, used by the SFTP client/filesystem. */ guac_common_ssh_session* sftp_session; /** * The filesystem object exposed for the SFTP session. */ guac_object* sftp_filesystem; /** * SSH terminal channel, used by the SSH client thread. */ LIBSSH2_CHANNEL* term_channel; /** * Lock dictating access to the SSH terminal channel. */ pthread_mutex_t term_channel_lock; /** * The terminal which will render all output from the SSH client. */ guac_terminal* term; } ssh_guac_client_data; #endif guacamole-server-0.9.9/src/protocols/ssh/client.c0000664000175100017510000001500012626724073016756 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "clipboard.h" #include "guac_handlers.h" #include "ssh_client.h" #include "terminal.h" #include #include #include #include #include #include #include #include #define GUAC_SSH_DEFAULT_FONT_NAME "monospace" #define GUAC_SSH_DEFAULT_FONT_SIZE 12 #define GUAC_SSH_DEFAULT_PORT "22" /* Client plugin arguments */ const char* GUAC_CLIENT_ARGS[] = { "hostname", "port", "username", "password", "font-name", "font-size", "enable-sftp", "private-key", "passphrase", #ifdef ENABLE_SSH_AGENT "enable-agent", #endif "color-scheme", "command", NULL }; enum __SSH_ARGS_IDX { /** * The hostname to connect to. Required. */ IDX_HOSTNAME, /** * The port to connect to. Optional. */ IDX_PORT, /** * The name of the user to login as. Optional. */ IDX_USERNAME, /** * The password to use when logging in. Optional. */ IDX_PASSWORD, /** * The name of the font to use within the terminal. */ IDX_FONT_NAME, /** * The size of the font to use within the terminal, in points. */ IDX_FONT_SIZE, /** * Whether SFTP should be enabled. */ IDX_ENABLE_SFTP, /** * The private key to use for authentication, if any. */ IDX_PRIVATE_KEY, /** * The passphrase required to decrypt the private key, if any. */ IDX_PASSPHRASE, #ifdef ENABLE_SSH_AGENT /** * Whether SSH agent forwarding support should be enabled. */ IDX_ENABLE_AGENT, #endif /** * The name of the color scheme to use. Currently valid color schemes are: * "black-white", "white-black", "gray-black", and "green-black", each * following the "foreground-background" pattern. By default, this will be * "gray-black". */ IDX_COLOR_SCHEME, /** * The command to run instead if the default shell. If omitted, a normal * shell session will be created. */ IDX_COMMAND, SSH_ARGS_COUNT }; int guac_client_init(guac_client* client, int argc, char** argv) { guac_socket* socket = client->socket; ssh_guac_client_data* client_data = calloc(1, sizeof(ssh_guac_client_data)); /* Init client data */ client->data = client_data; if (argc != SSH_ARGS_COUNT) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Wrong number of arguments"); return -1; } /* Set locale and warn if not UTF-8 */ setlocale(LC_CTYPE, ""); if (strcmp(nl_langinfo(CODESET), "UTF-8") != 0) guac_client_log(client, GUAC_LOG_INFO, "Current locale does not use UTF-8. Some characters may not render correctly."); /* Read parameters */ strcpy(client_data->hostname, argv[IDX_HOSTNAME]); strcpy(client_data->username, argv[IDX_USERNAME]); strcpy(client_data->password, argv[IDX_PASSWORD]); /* Init public key auth information */ strcpy(client_data->key_base64, argv[IDX_PRIVATE_KEY]); strcpy(client_data->key_passphrase, argv[IDX_PASSPHRASE]); /* Read font name */ if (argv[IDX_FONT_NAME][0] != 0) strcpy(client_data->font_name, argv[IDX_FONT_NAME]); else strcpy(client_data->font_name, GUAC_SSH_DEFAULT_FONT_NAME ); /* Read font size */ if (argv[IDX_FONT_SIZE][0] != 0) client_data->font_size = atoi(argv[IDX_FONT_SIZE]); else client_data->font_size = GUAC_SSH_DEFAULT_FONT_SIZE; /* Parse SFTP enable */ client_data->enable_sftp = strcmp(argv[IDX_ENABLE_SFTP], "true") == 0; #ifdef ENABLE_SSH_AGENT client_data->enable_agent = strcmp(argv[IDX_ENABLE_AGENT], "true") == 0; #endif /* Read port */ if (argv[IDX_PORT][0] != 0) strcpy(client_data->port, argv[IDX_PORT]); else strcpy(client_data->port, GUAC_SSH_DEFAULT_PORT); /* Read command, if any */ if (argv[IDX_COMMAND][0] != 0) client_data->command = strdup(argv[IDX_COMMAND]); /* Create terminal */ client_data->term = guac_terminal_create(client, client_data->font_name, client_data->font_size, client->info.optimal_resolution, client->info.optimal_width, client->info.optimal_height, argv[IDX_COLOR_SCHEME]); /* Fail if terminal init failed */ if (client_data->term == NULL) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Terminal initialization failed"); return -1; } /* Ensure main socket is threadsafe */ guac_socket_require_threadsafe(socket); /* Send initial name */ guac_protocol_send_name(socket, client_data->hostname); guac_socket_flush(socket); /* Set basic handlers */ client->handle_messages = ssh_guac_client_handle_messages; client->key_handler = ssh_guac_client_key_handler; client->mouse_handler = ssh_guac_client_mouse_handler; client->size_handler = ssh_guac_client_size_handler; client->free_handler = ssh_guac_client_free_handler; client->clipboard_handler = guac_ssh_clipboard_handler; /* Start client thread */ if (pthread_create(&(client_data->client_thread), NULL, ssh_client_thread, (void*) client)) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Unable to start SSH client thread"); return -1; } /* Success */ return 0; } guacamole-server-0.9.9/src/protocols/ssh/guac_handlers.c0000664000175100017510000001011212626724073020276 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "guac_handlers.h" #include "guac_sftp.h" #include "guac_ssh.h" #include "terminal.h" #include #include #include #include #include #include int ssh_guac_client_handle_messages(guac_client* client) { ssh_guac_client_data* client_data = (ssh_guac_client_data*) client->data; return guac_terminal_render_frame(client_data->term); } int ssh_guac_client_mouse_handler(guac_client* client, int x, int y, int mask) { ssh_guac_client_data* client_data = (ssh_guac_client_data*) client->data; guac_terminal* term = client_data->term; /* Send mouse event */ guac_terminal_send_mouse(term, x, y, mask); return 0; } int ssh_guac_client_key_handler(guac_client* client, int keysym, int pressed) { ssh_guac_client_data* client_data = (ssh_guac_client_data*) client->data; guac_terminal* term = client_data->term; /* Send key */ guac_terminal_send_key(term, keysym, pressed); return 0; } int ssh_guac_client_size_handler(guac_client* client, int width, int height) { /* Get terminal */ ssh_guac_client_data* guac_client_data = (ssh_guac_client_data*) client->data; guac_terminal* terminal = guac_client_data->term; /* Resize terminal */ guac_terminal_resize(terminal, width, height); /* Update SSH pty size if connected */ if (guac_client_data->term_channel != NULL) { pthread_mutex_lock(&(guac_client_data->term_channel_lock)); libssh2_channel_request_pty_size(guac_client_data->term_channel, terminal->term_width, terminal->term_height); pthread_mutex_unlock(&(guac_client_data->term_channel_lock)); } return 0; } int ssh_guac_client_free_handler(guac_client* client) { ssh_guac_client_data* guac_client_data = (ssh_guac_client_data*) client->data; /* Close SSH channel */ if (guac_client_data->term_channel != NULL) { libssh2_channel_send_eof(guac_client_data->term_channel); libssh2_channel_close(guac_client_data->term_channel); } /* Free terminal */ guac_terminal_free(guac_client_data->term); pthread_join(guac_client_data->client_thread, NULL); /* Free channels */ libssh2_channel_free(guac_client_data->term_channel); /* Clean up the SFTP filesystem object and session */ if (guac_client_data->sftp_filesystem) { guac_common_ssh_destroy_sftp_filesystem(guac_client_data->sftp_filesystem); guac_common_ssh_destroy_session(guac_client_data->sftp_session); } /* Free session */ if (guac_client_data->session != NULL) guac_common_ssh_destroy_session(guac_client_data->session); /* Free user */ if (guac_client_data->user != NULL) guac_common_ssh_destroy_user(guac_client_data->user); /* Free copied settings */ free(guac_client_data->command); /* Free generic data struct */ free(client->data); guac_common_ssh_uninit(); return 0; } guacamole-server-0.9.9/src/protocols/ssh/Makefile.am0000664000175100017510000000416112626133327017372 00000000000000# # Copyright (C) 2015 Glyptodon LLC # # 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. # AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 lib_LTLIBRARIES = libguac-client-ssh.la libguac_client_ssh_la_SOURCES = \ client.c \ clipboard.c \ guac_handlers.c \ sftp.c \ ssh_client.c noinst_HEADERS = \ client.h \ clipboard.h \ guac_handlers.h \ sftp.h \ ssh_client.h # Add agent sources if enabled if ENABLE_SSH_AGENT libguac_client_ssh_la_SOURCES += ssh_agent.c noinst_HEADERS += ssh_agent.h endif libguac_client_ssh_la_CFLAGS = \ -Werror -Wall -Iinclude \ @COMMON_SSH_INCLUDE@ \ @LIBGUAC_INCLUDE@ \ @TERMINAL_INCLUDE@ libguac_client_ssh_la_LIBADD = \ @COMMON_LTLIB@ \ @COMMON_SSH_LTLIB@ \ @LIBGUAC_LTLIB@ \ @TERMINAL_LTLIB@ libguac_client_ssh_la_LDFLAGS = \ -version-info 0:0:0 \ @PTHREAD_LIBS@ \ @SSH_LIBS@ \ @SSL_LIBS@ guacamole-server-0.9.9/src/protocols/ssh/ssh_agent.c0000664000175100017510000001364112536405625017463 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "ssh_agent.h" #include "ssh_buffer.h" #include #include #include #include #include #include #include #include #include #include void ssh_auth_agent_sign(ssh_auth_agent* agent, char* data, int data_length) { LIBSSH2_CHANNEL* channel = agent->channel; ssh_key* key = agent->identity; char sig[4096]; int sig_len; char buffer[4096]; char* pos = buffer; /* Sign with key */ sig_len = ssh_key_sign(key, data, data_length, (u_char*) sig); if (sig_len < 0) return; buffer_write_uint32(&pos, 1+4 + 4+7 + 4+sig_len); buffer_write_byte(&pos, SSH2_AGENT_SIGN_RESPONSE); buffer_write_uint32(&pos, 4+7 + 4+sig_len); /* Write key type */ if (key->type == SSH_KEY_RSA) buffer_write_string(&pos, "ssh-rsa", 7); else if (key->type == SSH_KEY_DSA) buffer_write_string(&pos, "ssh-dss", 7); else return; /* Write signature */ buffer_write_string(&pos, sig, sig_len); libssh2_channel_write(channel, buffer, pos-buffer); libssh2_channel_flush(channel); } void ssh_auth_agent_list_identities(ssh_auth_agent* auth_agent) { LIBSSH2_CHANNEL* channel = auth_agent->channel; ssh_key* key = auth_agent->identity; char buffer[4096]; char* pos = buffer; buffer_write_uint32(&pos, 1+4 + key->public_key_length+4 + sizeof(SSH_AGENT_COMMENT)+3); buffer_write_byte(&pos, SSH2_AGENT_IDENTITIES_ANSWER); buffer_write_uint32(&pos, 1); buffer_write_string(&pos, key->public_key, key->public_key_length); buffer_write_string(&pos, SSH_AGENT_COMMENT, sizeof(SSH_AGENT_COMMENT)-1); libssh2_channel_write(channel, buffer, pos-buffer); libssh2_channel_flush(channel); } void ssh_auth_agent_handle_packet(ssh_auth_agent* auth_agent, uint8_t type, char* data, int data_length) { switch (type) { /* List identities */ case SSH2_AGENT_REQUEST_IDENTITIES: ssh_auth_agent_list_identities(auth_agent); break; /* Sign request */ case SSH2_AGENT_SIGN_REQUEST: { char* pos = data; int key_blob_length; int sign_data_length; char* sign_data; /* Skip past key, read data, ignore flags */ buffer_read_string(&pos, &key_blob_length); sign_data = buffer_read_string(&pos, &sign_data_length); /* Sign given data */ ssh_auth_agent_sign(auth_agent, sign_data, sign_data_length); break; } /* Otherwise, return failure */ default: libssh2_channel_write(auth_agent->channel, UNSUPPORTED, sizeof(UNSUPPORTED)-1); } } int ssh_auth_agent_read(ssh_auth_agent* auth_agent) { LIBSSH2_CHANNEL* channel = auth_agent->channel; int bytes_read; if (libssh2_channel_eof(channel)) return -1; /* Read header if available */ if (auth_agent->buffer_length >= 5) { uint32_t length = (((unsigned char*) auth_agent->buffer)[0] << 24) | (((unsigned char*) auth_agent->buffer)[1] << 16) | (((unsigned char*) auth_agent->buffer)[2] << 8) | ((unsigned char*) auth_agent->buffer)[3]; uint8_t type = ((unsigned char*) auth_agent->buffer)[4]; /* If enough data read, call handler, shift data */ if (auth_agent->buffer_length >= length+4) { ssh_auth_agent_handle_packet(auth_agent, type, auth_agent->buffer+5, length-1); auth_agent->buffer_length -= length+4; memmove(auth_agent->buffer, auth_agent->buffer+length+4, auth_agent->buffer_length); return length+4; } } /* Read data into buffer */ bytes_read = libssh2_channel_read(channel, auth_agent->buffer+auth_agent->buffer_length, sizeof(auth_agent->buffer)-auth_agent->buffer_length); /* If unsuccessful, return error */ if (bytes_read < 0) return bytes_read; /* Update buffer length */ auth_agent->buffer_length += bytes_read; return bytes_read; } void ssh_auth_agent_callback(LIBSSH2_SESSION *session, LIBSSH2_CHANNEL *channel, void **abstract) { /* Get client data */ guac_client* client = (guac_client*) *abstract; ssh_guac_client_data* client_data = (ssh_guac_client_data*) client->data; /* Init auth agent */ ssh_auth_agent* auth_agent = malloc(sizeof(ssh_auth_agent)); auth_agent->channel = channel; auth_agent->identity = client_data->key; auth_agent->buffer_length = 0; /* Store auth agent */ client_data->auth_agent = auth_agent; } guacamole-server-0.9.9/src/protocols/ssh/ssh_client.c0000664000175100017510000002764112626724073017651 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "guac_sftp.h" #include "guac_ssh.h" #include "sftp.h" #include "terminal.h" #ifdef ENABLE_SSH_AGENT #include "ssh_agent.h" #endif #include #include #include #include #include #include #include #ifdef LIBSSH2_USES_GCRYPT #include #endif #include #include #include #include #include #include #include #include #include #include #include #include /** * Produces a new user object containing a username and password or private * key, prompting the user as necessary to obtain that information. * * @param client * The Guacamole client containing any existing user data, as well as the * terminal to use when prompting the user. * * @return * A new user object containing the user's username and other credentials. */ static guac_common_ssh_user* guac_ssh_get_user(guac_client* client) { ssh_guac_client_data* client_data = (ssh_guac_client_data*) client->data; guac_common_ssh_user* user; /* Get username */ if (client_data->username[0] == 0) guac_terminal_prompt(client_data->term, "Login as: ", client_data->username, sizeof(client_data->username), true); /* Create user object from username */ user = guac_common_ssh_create_user(client_data->username); /* If key specified, import */ if (client_data->key_base64[0] != 0) { guac_client_log(client, GUAC_LOG_DEBUG, "Attempting private key import (WITHOUT passphrase)"); /* Attempt to read key without passphrase */ if (guac_common_ssh_user_import_key(user, client_data->key_base64, NULL)) { /* Log failure of initial attempt */ guac_client_log(client, GUAC_LOG_DEBUG, "Initial import failed: %s", guac_common_ssh_key_error()); guac_client_log(client, GUAC_LOG_DEBUG, "Re-attempting private key import (WITH passphrase)"); /* Prompt for passphrase if missing */ if (client_data->key_passphrase[0] == 0) guac_terminal_prompt(client_data->term, "Key passphrase: ", client_data->key_passphrase, sizeof(client_data->key_passphrase), false); /* Reattempt import with passphrase */ if (guac_common_ssh_user_import_key(user, client_data->key_base64, client_data->key_passphrase)) { /* If still failing, give up */ guac_client_abort(client, GUAC_PROTOCOL_STATUS_CLIENT_UNAUTHORIZED, "Auth key import failed: %s", guac_common_ssh_key_error()); guac_common_ssh_destroy_user(user); return NULL; } } /* end decrypt key with passphrase */ /* Success */ guac_client_log(client, GUAC_LOG_INFO, "Auth key successfully imported."); } /* end if key given */ /* Otherwise, use password */ else { /* Get password if not provided */ if (client_data->password[0] == 0) guac_terminal_prompt(client_data->term, "Password: ", client_data->password, sizeof(client_data->password), false); /* Set provided password */ guac_common_ssh_user_set_password(user, client_data->password); } /* Clear screen of any prompts */ guac_terminal_printf(client_data->term, "\x1B[H\x1B[J"); return user; } void* ssh_input_thread(void* data) { guac_client* client = (guac_client*) data; ssh_guac_client_data* client_data = (ssh_guac_client_data*) client->data; char buffer[8192]; int bytes_read; /* Write all data read */ while ((bytes_read = guac_terminal_read_stdin(client_data->term, buffer, sizeof(buffer))) > 0) { pthread_mutex_lock(&(client_data->term_channel_lock)); libssh2_channel_write(client_data->term_channel, buffer, bytes_read); pthread_mutex_unlock(&(client_data->term_channel_lock)); } return NULL; } void* ssh_client_thread(void* data) { guac_client* client = (guac_client*) data; ssh_guac_client_data* client_data = (ssh_guac_client_data*) client->data; guac_socket* socket = client->socket; char buffer[8192]; pthread_t input_thread; /* Init SSH base libraries */ if (guac_common_ssh_init(client)) return NULL; /* Get user and credentials */ client_data->user = guac_ssh_get_user(client); /* Send new name */ char name[1024]; snprintf(name, sizeof(name)-1, "%s@%s", client_data->username, client_data->hostname); guac_protocol_send_name(socket, name); /* Open SSH session */ client_data->session = guac_common_ssh_create_session(client, client_data->hostname, client_data->port, client_data->user); if (client_data->session == NULL) { /* Already aborted within guac_common_ssh_create_session() */ return NULL; } pthread_mutex_init(&client_data->term_channel_lock, NULL); /* Open channel for terminal */ client_data->term_channel = libssh2_channel_open_session(client_data->session->session); if (client_data->term_channel == NULL) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR, "Unable to open terminal channel."); return NULL; } #ifdef ENABLE_SSH_AGENT /* Start SSH agent forwarding, if enabled */ if (client_data->enable_agent) { libssh2_session_callback_set(client_data->session, LIBSSH2_CALLBACK_AUTH_AGENT, (void*) ssh_auth_agent_callback); /* Request agent forwarding */ if (libssh2_channel_request_auth_agent(client_data->term_channel)) guac_client_log(client, GUAC_LOG_ERROR, "Agent forwarding request failed"); else guac_client_log(client, GUAC_LOG_INFO, "Agent forwarding enabled."); } client_data->auth_agent = NULL; #endif /* Start SFTP session as well, if enabled */ if (client_data->enable_sftp) { /* Create SSH session specific for SFTP */ guac_client_log(client, GUAC_LOG_DEBUG, "Reconnecting for SFTP..."); client_data->sftp_session = guac_common_ssh_create_session(client, client_data->hostname, client_data->port, client_data->user); if (client_data->sftp_session == NULL) { /* Already aborted within guac_common_ssh_create_session() */ return NULL; } /* Request SFTP */ client_data->sftp_filesystem = guac_common_ssh_create_sftp_filesystem( client_data->sftp_session, "/"); /* Set generic (non-filesystem) file upload handler */ client->file_handler = guac_sftp_file_handler; /* Init handlers for Guacamole-specific console codes */ client_data->term->upload_path_handler = guac_sftp_set_upload_path; client_data->term->file_download_handler = guac_sftp_download_file; guac_client_log(client, GUAC_LOG_DEBUG, "SFTP session initialized"); } /* Request PTY */ if (libssh2_channel_request_pty_ex(client_data->term_channel, "linux", sizeof("linux")-1, NULL, 0, client_data->term->term_width, client_data->term->term_height, 0, 0)) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR, "Unable to allocate PTY."); return NULL; } /* If a command is specified, run that instead of a shell */ if (client_data->command != NULL) { if (libssh2_channel_exec(client_data->term_channel, client_data->command)) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR, "Unable to execute command."); return NULL; } } /* Otherwise, request a shell */ else if (libssh2_channel_shell(client_data->term_channel)) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR, "Unable to associate shell with PTY."); return NULL; } /* Logged in */ guac_client_log(client, GUAC_LOG_INFO, "SSH connection successful."); /* Start input thread */ if (pthread_create(&(input_thread), NULL, ssh_input_thread, (void*) client)) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Unable to start input thread"); return NULL; } /* Set non-blocking */ libssh2_session_set_blocking(client_data->session->session, 0); /* While data available, write to terminal */ int bytes_read = 0; for (;;) { /* Track total amount of data read */ int total_read = 0; pthread_mutex_lock(&(client_data->term_channel_lock)); /* Stop reading at EOF */ if (libssh2_channel_eof(client_data->term_channel)) { pthread_mutex_unlock(&(client_data->term_channel_lock)); break; } /* Read terminal data */ bytes_read = libssh2_channel_read(client_data->term_channel, buffer, sizeof(buffer)); pthread_mutex_unlock(&(client_data->term_channel_lock)); /* Attempt to write data received. Exit on failure. */ if (bytes_read > 0) { int written = guac_terminal_write_stdout(client_data->term, buffer, bytes_read); if (written < 0) break; total_read += bytes_read; } else if (bytes_read < 0 && bytes_read != LIBSSH2_ERROR_EAGAIN) break; #ifdef ENABLE_SSH_AGENT /* If agent open, handle any agent packets */ if (client_data->auth_agent != NULL) { bytes_read = ssh_auth_agent_read(client_data->auth_agent); if (bytes_read > 0) total_read += bytes_read; else if (bytes_read < 0 && bytes_read != LIBSSH2_ERROR_EAGAIN) client_data->auth_agent = NULL; } #endif /* Wait for more data if reads turn up empty */ if (total_read == 0) { fd_set fds; struct timeval timeout; FD_ZERO(&fds); FD_SET(client_data->session->fd, &fds); /* Wait for one second */ timeout.tv_sec = 1; timeout.tv_usec = 0; if (select(client_data->session->fd + 1, &fds, NULL, NULL, &timeout) < 0) break; } } /* Kill client and Wait for input thread to die */ guac_client_stop(client); pthread_join(input_thread, NULL); pthread_mutex_destroy(&client_data->term_channel_lock); guac_client_log(client, GUAC_LOG_INFO, "SSH connection ended."); return NULL; } guacamole-server-0.9.9/src/protocols/rdp/0000775000175100017510000000000012645400336015402 500000000000000guacamole-server-0.9.9/src/protocols/rdp/rdp_status.h0000664000175100017510000000476612626133327017702 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_RDP_STATUS_H #define __GUAC_RDP_STATUS_H /** * RDP-specific status constants. * * @file rdp_status.h */ #include "config.h" /* Include any constants from winpr/file.h, if available */ #ifdef ENABLE_WINPR #include #endif /* Constants which MAY be defined within FreeRDP */ #ifndef STATUS_SUCCESS #define STATUS_SUCCESS 0x00000000 #define STATUS_NO_MORE_FILES 0x80000006 #define STATUS_DEVICE_OFF_LINE 0x80000010 #define STATUS_NOT_IMPLEMENTED 0xC0000002 #define STATUS_INVALID_PARAMETER 0xC000000D #define STATUS_NO_SUCH_FILE 0xC000000F #define STATUS_END_OF_FILE 0xC0000011 #define STATUS_ACCESS_DENIED 0xC0000022 #define STATUS_OBJECT_NAME_COLLISION 0xC0000035 #define STATUS_DISK_FULL 0xC000007F #define STATUS_FILE_INVALID 0xC0000098 #define STATUS_FILE_IS_A_DIRECTORY 0xC00000BA #define STATUS_NOT_SUPPORTED 0xC00000BB #define STATUS_NOT_A_DIRECTORY 0xC0000103 #define STATUS_TOO_MANY_OPENED_FILES 0xC000011F #define STATUS_CANNOT_DELETE 0xC0000121 #define STATUS_FILE_DELETED 0xC0000123 #define STATUS_FILE_CLOSED 0xC0000128 #endif /* Constants which are NEVER defined within FreeRDP */ #define STATUS_FILE_SYSTEM_LIMITATION 0xC0000427 #define STATUS_FILE_TOO_LARGE 0xC0000904 #endif guacamole-server-0.9.9/src/protocols/rdp/rdp_gdi.c0000664000175100017510000003223612643542623017110 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "guac_surface.h" #include "rdp_bitmap.h" #include "rdp_color.h" #include "rdp_settings.h" #include #include #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-wtypes.h" #endif #include guac_transfer_function guac_rdp_rop3_transfer_function(guac_client* client, int rop3) { /* Translate supported ROP3 opcodes into composite modes */ switch (rop3) { /* "DSon" !(src | dest) */ case 0x11: return GUAC_TRANSFER_BINARY_NOR; /* "DSna" !src & dest */ case 0x22: return GUAC_TRANSFER_BINARY_NSRC_AND; /* "Sn" !src */ case 0x33: return GUAC_TRANSFER_BINARY_NSRC; /* "SDna" (src & !dest) */ case 0x44: return GUAC_TRANSFER_BINARY_NDEST_AND; /* "Dn" !dest */ case 0x55: return GUAC_TRANSFER_BINARY_NDEST; /* "SRCINVERT" (src ^ dest) */ case 0x66: return GUAC_TRANSFER_BINARY_XOR; /* "DSan" !(src & dest) */ case 0x77: return GUAC_TRANSFER_BINARY_NAND; /* "SRCAND" (src & dest) */ case 0x88: return GUAC_TRANSFER_BINARY_AND; /* "DSxn" !(src ^ dest) */ case 0x99: return GUAC_TRANSFER_BINARY_XNOR; /* "MERGEPAINT" (!src | dest)*/ case 0xBB: return GUAC_TRANSFER_BINARY_NSRC_OR; /* "SDno" (src | !dest) */ case 0xDD: return GUAC_TRANSFER_BINARY_NDEST_OR; /* "SRCPAINT" (src | dest) */ case 0xEE: return GUAC_TRANSFER_BINARY_OR; /* 0x00 = "BLACKNESS" (0) */ /* 0xAA = "NOP" (dest) */ /* 0xCC = "SRCCOPY" (src) */ /* 0xFF = "WHITENESS" (1) */ } /* Log warning if ROP3 opcode not supported */ guac_client_log(client, GUAC_LOG_INFO, "guac_rdp_rop3_transfer_function: " "UNSUPPORTED opcode = 0x%02X", rop3); /* Default to BINARY_SRC */ return GUAC_TRANSFER_BINARY_SRC; } void guac_rdp_gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt) { guac_client* client = ((rdp_freerdp_context*) context)->client; guac_common_surface* current_surface = ((rdp_guac_client_data*) client->data)->current_surface; int x = dstblt->nLeftRect; int y = dstblt->nTopRect; int w = dstblt->nWidth; int h = dstblt->nHeight; switch (dstblt->bRop) { /* Blackness */ case 0: /* Send black rectangle */ guac_common_surface_rect(current_surface, x, y, w, h, 0, 0, 0); break; /* DSTINVERT */ case 0x55: guac_common_surface_transfer(current_surface, x, y, w, h, GUAC_TRANSFER_BINARY_NDEST, current_surface, x, y); break; /* NOP */ case 0xAA: break; /* Whiteness */ case 0xFF: guac_common_surface_rect(current_surface, x, y, w, h, 0xFF, 0xFF, 0xFF); break; /* Unsupported ROP3 */ default: guac_client_log(client, GUAC_LOG_INFO, "guac_rdp_gdi_dstblt(rop3=0x%x)", dstblt->bRop); } } void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) { /* * Note that this is not a full implementation of PATBLT. This is a * fallback implementation which only renders a solid block of background * color using the specified ROP3 operation, ignoring whatever brush * was actually specified. * * As libguac-client-rdp explicitly tells the server not to send PATBLT, * well-behaved RDP servers will not use this operation at all, while * others will at least have a fallback. */ /* Get client and current layer */ guac_client* client = ((rdp_freerdp_context*) context)->client; guac_common_surface* current_surface = ((rdp_guac_client_data*) client->data)->current_surface; int x = patblt->nLeftRect; int y = patblt->nTopRect; int w = patblt->nWidth; int h = patblt->nHeight; /* * Warn that rendering is a fallback, as the server should not be sending * this order. */ guac_client_log(client, GUAC_LOG_INFO, "Using fallback PATBLT (server is ignoring " "negotiated client capabilities)"); /* Render rectangle based on ROP */ switch (patblt->bRop) { /* If blackness, send black rectangle */ case 0x00: guac_common_surface_rect(current_surface, x, y, w, h, 0, 0, 0); break; /* If NOP, do nothing */ case 0xAA: break; /* If operation is just a copy, send foreground only */ case 0xCC: case 0xF0: guac_common_surface_rect(current_surface, x, y, w, h, (patblt->foreColor >> 16) & 0xFF, (patblt->foreColor >> 8 ) & 0xFF, (patblt->foreColor ) & 0xFF); break; /* If whiteness, send white rectangle */ case 0xFF: guac_common_surface_rect(current_surface, x, y, w, h, 0xFF, 0xFF, 0xFF); break; /* Otherwise, invert entire rect */ default: guac_common_surface_transfer(current_surface, x, y, w, h, GUAC_TRANSFER_BINARY_NDEST, current_surface, x, y); } } void guac_rdp_gdi_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt) { guac_client* client = ((rdp_freerdp_context*) context)->client; guac_common_surface* current_surface = ((rdp_guac_client_data*) client->data)->current_surface; int x = scrblt->nLeftRect; int y = scrblt->nTopRect; int w = scrblt->nWidth; int h = scrblt->nHeight; int x_src = scrblt->nXSrc; int y_src = scrblt->nYSrc; rdp_guac_client_data* data = (rdp_guac_client_data*) client->data; /* Copy screen rect to current surface */ guac_common_surface_copy(data->default_surface, x_src, y_src, w, h, current_surface, x, y); } void guac_rdp_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) { guac_client* client = ((rdp_freerdp_context*) context)->client; guac_common_surface* current_surface = ((rdp_guac_client_data*) client->data)->current_surface; guac_rdp_bitmap* bitmap = (guac_rdp_bitmap*) memblt->bitmap; int x = memblt->nLeftRect; int y = memblt->nTopRect; int w = memblt->nWidth; int h = memblt->nHeight; int x_src = memblt->nXSrc; int y_src = memblt->nYSrc; /* Make sure that the recieved bitmap is not NULL before processing */ if (bitmap == NULL) { guac_client_log(client, GUAC_LOG_INFO, "NULL bitmap found in memblt instruction."); return; } switch (memblt->bRop) { /* If blackness, send black rectangle */ case 0x00: guac_common_surface_rect(current_surface, x, y, w, h, 0, 0, 0); break; /* If NOP, do nothing */ case 0xAA: break; /* If operation is just SRC, simply copy */ case 0xCC: /* If not cached, cache if necessary */ if (bitmap->surface == NULL && bitmap->used >= 1) guac_rdp_cache_bitmap(context, memblt->bitmap); /* If not cached, send as PNG */ if (bitmap->surface == NULL) { if (memblt->bitmap->data != NULL) { /* Create surface from image data */ cairo_surface_t* surface = cairo_image_surface_create_for_data( memblt->bitmap->data + 4*(x_src + y_src*memblt->bitmap->width), CAIRO_FORMAT_RGB24, w, h, 4*memblt->bitmap->width); /* Send surface to buffer */ guac_common_surface_draw(current_surface, x, y, surface); /* Free surface */ cairo_surface_destroy(surface); } } /* Otherwise, copy */ else guac_common_surface_copy(bitmap->surface, x_src, y_src, w, h, current_surface, x, y); /* Increment usage counter */ ((guac_rdp_bitmap*) bitmap)->used++; break; /* If whiteness, send white rectangle */ case 0xFF: guac_common_surface_rect(current_surface, x, y, w, h, 0xFF, 0xFF, 0xFF); break; /* Otherwise, use transfer */ default: /* If not available as a surface, make available. */ if (bitmap->surface == NULL) guac_rdp_cache_bitmap(context, memblt->bitmap); guac_common_surface_transfer(bitmap->surface, x_src, y_src, w, h, guac_rdp_rop3_transfer_function(client, memblt->bRop), current_surface, x, y); /* Increment usage counter */ ((guac_rdp_bitmap*) bitmap)->used++; } } void guac_rdp_gdi_opaquerect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect) { /* Get client data */ guac_client* client = ((rdp_freerdp_context*) context)->client; UINT32 color = guac_rdp_convert_color(context, opaque_rect->color); guac_common_surface* current_surface = ((rdp_guac_client_data*) client->data)->current_surface; int x = opaque_rect->nLeftRect; int y = opaque_rect->nTopRect; int w = opaque_rect->nWidth; int h = opaque_rect->nHeight; guac_common_surface_rect(current_surface, x, y, w, h, (color >> 16) & 0xFF, (color >> 8 ) & 0xFF, (color ) & 0xFF); } /** * Updates the palette within a FreeRDP CLRCONV object using the new palette * entries provided by an RDP palette update. */ static void guac_rdp_update_clrconv(CLRCONV* clrconv, PALETTE_UPDATE* palette) { clrconv->palette->count = palette->number; #ifdef LEGACY_RDPPALETTE clrconv->palette->entries = palette->entries; #else memcpy(clrconv->palette->entries, palette->entries, sizeof(palette->entries)); #endif } /** * Updates a raw ARGB32 palette using the new palette entries provided by an * RDP palette update. */ static void guac_rdp_update_palette(UINT32* guac_palette, PALETTE_UPDATE* palette) { PALETTE_ENTRY* entry = palette->entries; int i; /* Copy each palette entry as ARGB32 */ for (i=0; i < palette->number; i++) { *guac_palette = 0xFF000000 | (entry->red << 16) | (entry->green << 8) | entry->blue; guac_palette++; entry++; } } void guac_rdp_gdi_palette_update(rdpContext* context, PALETTE_UPDATE* palette) { CLRCONV* clrconv = ((rdp_freerdp_context*) context)->clrconv; UINT32* guac_palette = ((rdp_freerdp_context*) context)->palette; /* Update internal palette representations */ guac_rdp_update_clrconv(clrconv, palette); guac_rdp_update_palette(guac_palette, palette); } void guac_rdp_gdi_set_bounds(rdpContext* context, rdpBounds* bounds) { guac_client* client = ((rdp_freerdp_context*) context)->client; rdp_guac_client_data* data = (rdp_guac_client_data*) client->data; /* If no bounds given, clear bounding rect */ if (bounds == NULL) guac_common_surface_reset_clip(data->default_surface); /* Otherwise, set bounding rectangle */ else guac_common_surface_clip(data->default_surface, bounds->left, bounds->top, bounds->right - bounds->left + 1, bounds->bottom - bounds->top + 1); } void guac_rdp_gdi_end_paint(rdpContext* context) { /* IGNORE */ } void guac_rdp_gdi_desktop_resize(rdpContext* context) { guac_client* client = ((rdp_freerdp_context*) context)->client; rdp_guac_client_data* data = (rdp_guac_client_data*) client->data; guac_common_surface_resize(data->default_surface, guac_rdp_get_width(context->instance), guac_rdp_get_height(context->instance)); guac_common_surface_reset_clip(data->default_surface); guac_client_log(client, GUAC_LOG_DEBUG, "Server resized display to %ix%i", guac_rdp_get_width(context->instance), guac_rdp_get_height(context->instance)); } guacamole-server-0.9.9/src/protocols/rdp/rdp_keymap.c0000664000175100017510000000436112536405625017632 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "rdp_keymap.h" #include const int GUAC_KEYSYMS_SHIFT[] = {0xFFE1, 0}; const int GUAC_KEYSYMS_ALL_SHIFT[] = {0xFFE1, 0xFFE2, 0}; const int GUAC_KEYSYMS_ALTGR[] = {0xFFEA, 0}; const int GUAC_KEYSYMS_SHIFT_ALTGR[] = {0xFFE1, 0xFFEA, 0}; const int GUAC_KEYSYMS_ALL_SHIFT_ALTGR[] = {0xFFE1, 0xFFE2, 0xFFEA, 0}; const int GUAC_KEYSYMS_CTRL[] = {0xFFE3, 0}; const int GUAC_KEYSYMS_ALL_CTRL[] = {0xFFE3, 0xFFE4, 0}; const int GUAC_KEYSYMS_ALT[] = {0xFFE9, 0}; const int GUAC_KEYSYMS_ALL_ALT[] = {0xFFE9, 0xFFEA, 0}; const int GUAC_KEYSYMS_CTRL_ALT[] = {0xFFE3, 0xFFE9, 0}; const int GUAC_KEYSYMS_ALL_MODIFIERS[] = { 0xFFE1, 0xFFE2, /* Left and right shift */ 0xFFE3, 0xFFE4, /* Left and right control */ 0xFFE9, 0xFFEA, /* Left and right alt (AltGr) */ 0 }; const guac_rdp_keymap* guac_rdp_keymap_find(const char* name) { /* For each keymap */ const guac_rdp_keymap** current = GUAC_KEYMAPS; while (*current != NULL) { /* If name matches, done */ if (strcmp((*current)->name, name) == 0) return *current; current++; } /* Failure */ return NULL; } guacamole-server-0.9.9/src/protocols/rdp/resolution.h0000664000175100017510000000373312643542623017710 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 GUAC_RDP_RESOLUTION_H #define GUAC_RDP_RESOLUTION_H #include /** * Returns whether the given resolution is reasonable for the given client, * based on arbitrary criteria for reasonability. * * @param client The guac_client to test the given resolution against. * @param resolution The resolution to test, in DPI. * @return Non-zero if the resolution is reasonable, zero otherwise. */ int guac_rdp_resolution_reasonable(guac_client* client, int resolution); /** * Returns a reasonable resolution for the remote display, given the size and * resolution of a guac_client. * * @param client The guac_client whose size and resolution shall be used to * determine an appropriate remote display resolution. * @return A reasonable resolution for the remote display, in DPI. */ int guac_rdp_suggest_resolution(guac_client* client); #endif guacamole-server-0.9.9/src/protocols/rdp/rdp_pointer.c0000664000175100017510000000641312643542623020023 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "rdp_pointer.h" #include #include #include #include #include #include void guac_rdp_pointer_new(rdpContext* context, rdpPointer* pointer) { guac_client* client = ((rdp_freerdp_context*) context)->client; guac_socket* socket = client->socket; /* Allocate data for image */ unsigned char* data = (unsigned char*) malloc(pointer->width * pointer->height * 4); /* Allocate layer */ guac_layer* buffer = guac_client_alloc_buffer(client); cairo_surface_t* surface; /* Convert to alpha cursor if mask data present */ if (pointer->andMaskData && pointer->xorMaskData) freerdp_alpha_cursor_convert(data, pointer->xorMaskData, pointer->andMaskData, pointer->width, pointer->height, pointer->xorBpp, ((rdp_freerdp_context*) context)->clrconv); /* Create surface from image data */ surface = cairo_image_surface_create_for_data( data, CAIRO_FORMAT_ARGB32, pointer->width, pointer->height, 4*pointer->width); /* Send surface to buffer */ guac_client_stream_png(client, socket, GUAC_COMP_SRC, buffer, 0, 0, surface); /* Free surface */ cairo_surface_destroy(surface); free(data); /* Remember buffer */ ((guac_rdp_pointer*) pointer)->layer = buffer; } void guac_rdp_pointer_set(rdpContext* context, rdpPointer* pointer) { guac_client* client = ((rdp_freerdp_context*) context)->client; guac_socket* socket = client->socket; /* Set cursor */ guac_protocol_send_cursor(socket, pointer->xPos, pointer->yPos, ((guac_rdp_pointer*) pointer)->layer, 0, 0, pointer->width, pointer->height); } void guac_rdp_pointer_free(rdpContext* context, rdpPointer* pointer) { guac_client* client = ((rdp_freerdp_context*) context)->client; guac_client_free_buffer(client, ((guac_rdp_pointer*) pointer)->layer); } void guac_rdp_pointer_set_null(rdpContext* context) { /* STUB */ } void guac_rdp_pointer_set_default(rdpContext* context) { /* STUB */ } guacamole-server-0.9.9/src/protocols/rdp/rdp_cliprdr.h0000664000175100017510000000412412643542623020004 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_RDP_RDP_CLIPRDR_H #define __GUAC_RDP_RDP_CLIPRDR_H #include "config.h" #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif #ifdef HAVE_FREERDP_CLIENT_CLIPRDR_H #include #else #include "compat/client-cliprdr.h" #endif /** * Clipboard format for text encoded in Windows CP1252. */ #define GUAC_RDP_CLIPBOARD_FORMAT_CP1252 1 /** * Clipboard format for text encoded in UTF-16. */ #define GUAC_RDP_CLIPBOARD_FORMAT_UTF16 2 void guac_rdp_process_cliprdr_event(guac_client* client, wMessage* event); void guac_rdp_process_cb_monitor_ready(guac_client* client, wMessage* event); void guac_rdp_process_cb_format_list(guac_client* client, RDP_CB_FORMAT_LIST_EVENT* event); void guac_rdp_process_cb_data_request(guac_client* client, RDP_CB_DATA_REQUEST_EVENT* event); void guac_rdp_process_cb_data_response(guac_client* client, RDP_CB_DATA_RESPONSE_EVENT* event); #endif guacamole-server-0.9.9/src/protocols/rdp/rdp_svc.c0000664000175100017510000001105212643542623017131 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "guac_list.h" #include "rdp_svc.h" #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif #include #include guac_rdp_svc* guac_rdp_alloc_svc(guac_client* client, char* name) { guac_rdp_svc* svc = malloc(sizeof(guac_rdp_svc)); /* Init SVC */ svc->client = client; svc->plugin = NULL; svc->input_pipe = NULL; svc->output_pipe = NULL; /* Warn about name length */ if (strnlen(name, GUAC_RDP_SVC_MAX_LENGTH+1) > GUAC_RDP_SVC_MAX_LENGTH) guac_client_log(client, GUAC_LOG_INFO, "Static channel name \"%s\" exceeds maximum of %i characters " "and will be truncated", name, GUAC_RDP_SVC_MAX_LENGTH); /* Init name */ strncpy(svc->name, name, GUAC_RDP_SVC_MAX_LENGTH); svc->name[GUAC_RDP_SVC_MAX_LENGTH] = '\0'; return svc; } void guac_rdp_free_svc(guac_rdp_svc* svc) { free(svc); } void guac_rdp_add_svc(guac_client* client, guac_rdp_svc* svc) { rdp_guac_client_data* client_data = (rdp_guac_client_data*) client->data; /* Add to list of available SVC */ guac_common_list_lock(client_data->available_svc); guac_common_list_add(client_data->available_svc, svc); guac_common_list_unlock(client_data->available_svc); } guac_rdp_svc* guac_rdp_get_svc(guac_client* client, const char* name) { rdp_guac_client_data* client_data = (rdp_guac_client_data*) client->data; guac_common_list_element* current; guac_rdp_svc* found = NULL; /* For each available SVC */ guac_common_list_lock(client_data->available_svc); current = client_data->available_svc->head; while (current != NULL) { /* If name matches, found */ guac_rdp_svc* current_svc = (guac_rdp_svc*) current->data; if (strcmp(current_svc->name, name) == 0) { found = current_svc; break; } current = current->next; } guac_common_list_unlock(client_data->available_svc); return found; } guac_rdp_svc* guac_rdp_remove_svc(guac_client* client, const char* name) { rdp_guac_client_data* client_data = (rdp_guac_client_data*) client->data; guac_common_list_element* current; guac_rdp_svc* found = NULL; /* For each available SVC */ guac_common_list_lock(client_data->available_svc); current = client_data->available_svc->head; while (current != NULL) { /* If name matches, remove entry */ guac_rdp_svc* current_svc = (guac_rdp_svc*) current->data; if (strcmp(current_svc->name, name) == 0) { guac_common_list_remove(client_data->available_svc, current); found = current_svc; break; } current = current->next; } guac_common_list_unlock(client_data->available_svc); /* Return removed entry, if any */ return found; } void guac_rdp_svc_write(guac_rdp_svc* svc, void* data, int length) { wStream* output_stream; /* Do not write of plugin not associated */ if (svc->plugin == NULL) { guac_client_log(svc->client, GUAC_LOG_ERROR, "Channel \"%s\" output dropped.", svc->name); return; } /* Build packet */ output_stream = Stream_New(NULL, length); Stream_Write(output_stream, data, length); /* Send packet */ svc_plugin_send(svc->plugin, output_stream); } guacamole-server-0.9.9/src/protocols/rdp/guac_rdpdr/0000775000175100017510000000000012645400336017514 500000000000000guacamole-server-0.9.9/src/protocols/rdp/guac_rdpdr/rdpdr_messages.c0000664000175100017510000002356312612226234022610 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "rdpdr_messages.h" #include "rdpdr_service.h" #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif #include #include static void guac_rdpdr_send_client_announce_reply(guac_rdpdrPlugin* rdpdr, unsigned int major, unsigned int minor, unsigned int client_id) { wStream* output_stream = Stream_New(NULL, 12); /* Write header */ Stream_Write_UINT16(output_stream, RDPDR_CTYP_CORE); Stream_Write_UINT16(output_stream, PAKID_CORE_CLIENTID_CONFIRM); /* Write content */ Stream_Write_UINT16(output_stream, major); Stream_Write_UINT16(output_stream, minor); Stream_Write_UINT32(output_stream, client_id); svc_plugin_send((rdpSvcPlugin*) rdpdr, output_stream); } static void guac_rdpdr_send_client_name_request(guac_rdpdrPlugin* rdpdr, const char* name) { int name_bytes = strlen(name) + 1; wStream* output_stream = Stream_New(NULL, 16 + name_bytes); /* Write header */ Stream_Write_UINT16(output_stream, RDPDR_CTYP_CORE); Stream_Write_UINT16(output_stream, PAKID_CORE_CLIENT_NAME); /* Write content */ Stream_Write_UINT32(output_stream, 0); /* ASCII */ Stream_Write_UINT32(output_stream, 0); /* 0 required by RDPDR spec */ Stream_Write_UINT32(output_stream, name_bytes); Stream_Write(output_stream, name, name_bytes); svc_plugin_send((rdpSvcPlugin*) rdpdr, output_stream); } static void guac_rdpdr_send_client_capability(guac_rdpdrPlugin* rdpdr) { wStream* output_stream = Stream_New(NULL, 256); guac_client_log(rdpdr->client, GUAC_LOG_INFO, "Sending capabilities..."); /* Write header */ Stream_Write_UINT16(output_stream, RDPDR_CTYP_CORE); Stream_Write_UINT16(output_stream, PAKID_CORE_CLIENT_CAPABILITY); /* Capability count + padding */ Stream_Write_UINT16(output_stream, 3); Stream_Write_UINT16(output_stream, 0); /* Padding */ /* General capability header */ Stream_Write_UINT16(output_stream, CAP_GENERAL_TYPE); Stream_Write_UINT16(output_stream, 44); Stream_Write_UINT32(output_stream, GENERAL_CAPABILITY_VERSION_02); /* General capability data */ Stream_Write_UINT32(output_stream, GUAC_OS_TYPE); /* osType - required to be ignored */ Stream_Write_UINT32(output_stream, 0); /* osVersion */ Stream_Write_UINT16(output_stream, RDP_CLIENT_MAJOR_ALL); /* protocolMajor */ Stream_Write_UINT16(output_stream, RDP_CLIENT_MINOR_5_2); /* protocolMinor */ Stream_Write_UINT32(output_stream, 0xFFFF); /* ioCode1 */ Stream_Write_UINT32(output_stream, 0); /* ioCode2 */ Stream_Write_UINT32(output_stream, RDPDR_DEVICE_REMOVE_PDUS | RDPDR_CLIENT_DISPLAY_NAME | RDPDR_USER_LOGGEDON_PDU); /* extendedPDU */ Stream_Write_UINT32(output_stream, 0); /* extraFlags1 */ Stream_Write_UINT32(output_stream, 0); /* extraFlags2 */ Stream_Write_UINT32(output_stream, 0); /* SpecialTypeDeviceCap */ /* Printer support header */ Stream_Write_UINT16(output_stream, CAP_PRINTER_TYPE); Stream_Write_UINT16(output_stream, 8); Stream_Write_UINT32(output_stream, PRINT_CAPABILITY_VERSION_01); /* Drive support header */ Stream_Write_UINT16(output_stream, CAP_DRIVE_TYPE); Stream_Write_UINT16(output_stream, 8); Stream_Write_UINT32(output_stream, DRIVE_CAPABILITY_VERSION_02); svc_plugin_send((rdpSvcPlugin*) rdpdr, output_stream); guac_client_log(rdpdr->client, GUAC_LOG_INFO, "Capabilities sent."); } static void guac_rdpdr_send_client_device_list_announce_request(guac_rdpdrPlugin* rdpdr) { int i; wStream* output_stream = Stream_New(NULL, 256); /* Write header */ Stream_Write_UINT16(output_stream, RDPDR_CTYP_CORE); Stream_Write_UINT16(output_stream, PAKID_CORE_DEVICELIST_ANNOUNCE); /* List devices */ Stream_Write_UINT32(output_stream, rdpdr->devices_registered); for (i=0; idevices_registered; i++) { guac_rdpdr_device* device = &(rdpdr->devices[i]); device->announce_handler(device, output_stream, i); guac_client_log(rdpdr->client, GUAC_LOG_INFO, "Registered device %i (%s)", device->device_id, device->device_name); } svc_plugin_send((rdpSvcPlugin*) rdpdr, output_stream); guac_client_log(rdpdr->client, GUAC_LOG_INFO, "All supported devices sent."); } void guac_rdpdr_process_server_announce(guac_rdpdrPlugin* rdpdr, wStream* input_stream) { unsigned int major, minor, client_id; Stream_Read_UINT16(input_stream, major); Stream_Read_UINT16(input_stream, minor); Stream_Read_UINT32(input_stream, client_id); /* Must choose own client ID if minor not >= 12 */ if (minor < 12) client_id = random() & 0xFFFF; guac_client_log(rdpdr->client, GUAC_LOG_INFO, "Connected to RDPDR %u.%u as client 0x%04x", major, minor, client_id); /* Respond to announce */ guac_rdpdr_send_client_announce_reply(rdpdr, major, minor, client_id); /* Name request */ guac_rdpdr_send_client_name_request(rdpdr, "Guacamole RDP"); } void guac_rdpdr_process_clientid_confirm(guac_rdpdrPlugin* rdpdr, wStream* input_stream) { guac_client_log(rdpdr->client, GUAC_LOG_INFO, "Client ID confirmed"); } void guac_rdpdr_process_device_reply(guac_rdpdrPlugin* rdpdr, wStream* input_stream) { unsigned int device_id, ntstatus; int severity, c, n, facility, code; Stream_Read_UINT32(input_stream, device_id); Stream_Read_UINT32(input_stream, ntstatus); severity = (ntstatus & 0xC0000000) >> 30; c = (ntstatus & 0x20000000) >> 29; n = (ntstatus & 0x10000000) >> 28; facility = (ntstatus & 0x0FFF0000) >> 16; code = ntstatus & 0x0000FFFF; /* Log error / information */ if (device_id < rdpdr->devices_registered) { if (severity == 0x0) guac_client_log(rdpdr->client, GUAC_LOG_INFO, "Device %i (%s) connected successfully", device_id, rdpdr->devices[device_id].device_name); else guac_client_log(rdpdr->client, GUAC_LOG_ERROR, "Problem connecting device %i (%s): " "severity=0x%x, c=0x%x, n=0x%x, facility=0x%x, code=0x%x", device_id, rdpdr->devices[device_id].device_name, severity, c, n, facility, code); } else guac_client_log(rdpdr->client, GUAC_LOG_ERROR, "Unknown device ID: 0x%08x", device_id); } void guac_rdpdr_process_device_iorequest(guac_rdpdrPlugin* rdpdr, wStream* input_stream) { int device_id, file_id, completion_id, major_func, minor_func; /* Read header */ Stream_Read_UINT32(input_stream, device_id); Stream_Read_UINT32(input_stream, file_id); Stream_Read_UINT32(input_stream, completion_id); Stream_Read_UINT32(input_stream, major_func); Stream_Read_UINT32(input_stream, minor_func); /* If printer, run printer handlers */ if (device_id >= 0 && device_id < rdpdr->devices_registered) { /* Call handler on device */ guac_rdpdr_device* device = &(rdpdr->devices[device_id]); device->iorequest_handler(device, input_stream, file_id, completion_id, major_func, minor_func); } else guac_client_log(rdpdr->client, GUAC_LOG_ERROR, "Unknown device ID: 0x%08x", device_id); } void guac_rdpdr_process_server_capability(guac_rdpdrPlugin* rdpdr, wStream* input_stream) { int count; int i; /* Read header */ Stream_Read_UINT16(input_stream, count); Stream_Seek(input_stream, 2); /* Parse capabilities */ for (i=0; iclient, GUAC_LOG_INFO, "Ignoring server capability set type=0x%04x, length=%i", type, length); Stream_Seek(input_stream, length - 4); } /* Send own capabilities */ guac_rdpdr_send_client_capability(rdpdr); } void guac_rdpdr_process_user_loggedon(guac_rdpdrPlugin* rdpdr, wStream* input_stream) { guac_client_log(rdpdr->client, GUAC_LOG_INFO, "User logged on"); guac_rdpdr_send_client_device_list_announce_request(rdpdr); } void guac_rdpdr_process_prn_cache_data(guac_rdpdrPlugin* rdpdr, wStream* input_stream) { guac_client_log(rdpdr->client, GUAC_LOG_INFO, "Ignoring printer cached configuration data"); } void guac_rdpdr_process_prn_using_xps(guac_rdpdrPlugin* rdpdr, wStream* input_stream) { guac_client_log(rdpdr->client, GUAC_LOG_INFO, "Printer unexpectedly switched to XPS mode"); } guacamole-server-0.9.9/src/protocols/rdp/guac_rdpdr/rdpdr_printer.h0000664000175100017510000000474212536405625022477 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_RDPDR_PRINTER_H #define __GUAC_RDPDR_PRINTER_H #include "config.h" #include "rdpdr_service.h" #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif #include /** * Data specific to an instance of the printer device. */ typedef struct guac_rdpdr_printer_data { /** * Stream for receiving printed files. */ guac_stream* stream; /** * File descriptor that should be written to when sending documents to the * printer. */ int printer_input; /** * File descriptor that should be read from when receiving output from the * printer. */ int printer_output; /** * Thread which transfers data from the printer to the Guacamole client. */ pthread_t printer_output_thread; /** * The number of bytes received in the current print job. */ int bytes_received; } guac_rdpdr_printer_data; /** * Registers a new printer device within the RDPDR plugin. This must be done * before RDPDR connection finishes. */ void guac_rdpdr_register_printer(guac_rdpdrPlugin* rdpdr); /** * The command to run when filtering postscript to produce PDF. This must be * a NULL-terminated array of arguments, where the first argument is the name * of the file to run. */ extern char* const guac_rdpdr_pdf_filter_command[]; #endif guacamole-server-0.9.9/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages_vol_info.c0000664000175100017510000001361612612226234025171 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "rdpdr_messages.h" #include "rdpdr_service.h" #include "rdp_fs.h" #include "rdp_status.h" #include #ifdef ENABLE_WINPR #include #include #else #include "compat/winpr-stream.h" #include "compat/winpr-wtypes.h" #endif void guac_rdpdr_fs_process_query_volume_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { wStream* output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 21 + GUAC_FILESYSTEM_LABEL_LENGTH); guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i]", __func__, file_id); Stream_Write_UINT32(output_stream, 17 + GUAC_FILESYSTEM_LABEL_LENGTH); Stream_Write_UINT64(output_stream, 0); /* VolumeCreationTime */ Stream_Write_UINT32(output_stream, 0); /* VolumeSerialNumber */ Stream_Write_UINT32(output_stream, GUAC_FILESYSTEM_LABEL_LENGTH); Stream_Write_UINT8(output_stream, FALSE); /* SupportsObjects */ /* Reserved field must not be sent */ Stream_Write(output_stream, GUAC_FILESYSTEM_LABEL, GUAC_FILESYSTEM_LABEL_LENGTH); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_query_size_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { guac_rdp_fs_info info = {0}; guac_rdp_fs_get_info((guac_rdp_fs*) device->data, &info); wStream* output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 28); guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i]", __func__, file_id); Stream_Write_UINT32(output_stream, 24); Stream_Write_UINT64(output_stream, info.blocks_total); /* TotalAllocationUnits */ Stream_Write_UINT64(output_stream, info.blocks_available); /* AvailableAllocationUnits */ Stream_Write_UINT32(output_stream, 1); /* SectorsPerAllocationUnit */ Stream_Write_UINT32(output_stream, info.block_size); /* BytesPerSector */ svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_query_device_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { wStream* output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 12); guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i]", __func__, file_id); Stream_Write_UINT32(output_stream, 8); Stream_Write_UINT32(output_stream, FILE_DEVICE_DISK); /* DeviceType */ Stream_Write_UINT32(output_stream, 0); /* Characteristics */ svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_query_attribute_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { wStream* output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 16 + GUAC_FILESYSTEM_NAME_LENGTH); guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i]", __func__, file_id); Stream_Write_UINT32(output_stream, 12 + GUAC_FILESYSTEM_NAME_LENGTH); Stream_Write_UINT32(output_stream, FILE_UNICODE_ON_DISK | FILE_CASE_SENSITIVE_SEARCH | FILE_CASE_PRESERVED_NAMES); /* FileSystemAttributes */ Stream_Write_UINT32(output_stream, GUAC_RDP_FS_MAX_PATH ); /* MaximumComponentNameLength */ Stream_Write_UINT32(output_stream, GUAC_FILESYSTEM_NAME_LENGTH); Stream_Write(output_stream, GUAC_FILESYSTEM_NAME, GUAC_FILESYSTEM_NAME_LENGTH); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_query_full_size_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { guac_rdp_fs_info info = {0}; guac_rdp_fs_get_info((guac_rdp_fs*) device->data, &info); wStream* output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 36); guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i]", __func__, file_id); Stream_Write_UINT32(output_stream, 32); Stream_Write_UINT64(output_stream, info.blocks_total); /* TotalAllocationUnits */ Stream_Write_UINT64(output_stream, info.blocks_available); /* CallerAvailableAllocationUnits */ Stream_Write_UINT64(output_stream, info.blocks_available); /* ActualAvailableAllocationUnits */ Stream_Write_UINT32(output_stream, 1); /* SectorsPerAllocationUnit */ Stream_Write_UINT32(output_stream, info.block_size); /* BytesPerSector */ svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } guacamole-server-0.9.9/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages_file_info.c0000664000175100017510000002322512612226234025305 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "rdpdr_service.h" #include "rdp_fs.h" #include "rdp_status.h" #include "unicode.h" #include #ifdef ENABLE_WINPR #include #include #else #include "compat/winpr-stream.h" #include "compat/winpr-wtypes.h" #endif #include #include #include void guac_rdpdr_fs_process_query_basic_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { wStream* output_stream; guac_rdp_fs_file* file; /* Get file */ file = guac_rdp_fs_get_file((guac_rdp_fs*) device->data, file_id); if (file == NULL) return; guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i]", __func__, file_id); output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 40); Stream_Write_UINT32(output_stream, 36); Stream_Write_UINT64(output_stream, file->ctime); /* CreationTime */ Stream_Write_UINT64(output_stream, file->atime); /* LastAccessTime */ Stream_Write_UINT64(output_stream, file->mtime); /* LastWriteTime */ Stream_Write_UINT64(output_stream, file->mtime); /* ChangeTime */ Stream_Write_UINT32(output_stream, file->attributes); /* FileAttributes */ /* Reserved field must not be sent */ svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_query_standard_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { wStream* output_stream; guac_rdp_fs_file* file; BOOL is_directory = FALSE; /* Get file */ file = guac_rdp_fs_get_file((guac_rdp_fs*) device->data, file_id); if (file == NULL) return; guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i]", __func__, file_id); if (file->attributes & FILE_ATTRIBUTE_DIRECTORY) is_directory = TRUE; output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 26); Stream_Write_UINT32(output_stream, 22); Stream_Write_UINT64(output_stream, file->size); /* AllocationSize */ Stream_Write_UINT64(output_stream, file->size); /* EndOfFile */ Stream_Write_UINT32(output_stream, 1); /* NumberOfLinks */ Stream_Write_UINT8(output_stream, 0); /* DeletePending */ Stream_Write_UINT8(output_stream, is_directory); /* Directory */ /* Reserved field must not be sent */ svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_query_attribute_tag_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { wStream* output_stream; guac_rdp_fs_file* file; /* Get file */ file = guac_rdp_fs_get_file((guac_rdp_fs*) device->data, file_id); if (file == NULL) return; guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i]", __func__, file_id); output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 12); Stream_Write_UINT32(output_stream, 8); Stream_Write_UINT32(output_stream, file->attributes); /* FileAttributes */ Stream_Write_UINT32(output_stream, 0); /* ReparseTag */ /* Reserved field must not be sent */ svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_set_rename_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id, int length) { int result; int filename_length; wStream* output_stream; char destination_path[GUAC_RDP_FS_MAX_PATH]; /* Read structure */ Stream_Seek_UINT8(input_stream); /* ReplaceIfExists */ Stream_Seek_UINT8(input_stream); /* RootDirectory */ Stream_Read_UINT32(input_stream, filename_length); /* FileNameLength */ /* Convert name to UTF-8 */ guac_rdp_utf16_to_utf8(Stream_Pointer(input_stream), filename_length/2, destination_path, sizeof(destination_path)); guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i] destination_path=\"%s\"", __func__, file_id, destination_path); /* If file moving to \Download folder, start stream, do not move */ if (strncmp(destination_path, "\\Download\\", 10) == 0) { guac_rdp_fs_file* file; /* Get file */ file = guac_rdp_fs_get_file((guac_rdp_fs*) device->data, file_id); if (file == NULL) return; /* Initiate download, pretend move succeeded */ guac_rdpdr_start_download(device, file->absolute_path); output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 4); } /* Otherwise, rename as requested */ else { result = guac_rdp_fs_rename((guac_rdp_fs*) device->data, file_id, destination_path); if (result < 0) output_stream = guac_rdpdr_new_io_completion(device, completion_id, guac_rdp_fs_get_status(result), 4); else output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 4); } Stream_Write_UINT32(output_stream, length); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_set_allocation_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id, int length) { int result; UINT64 size; wStream* output_stream; /* Read new size */ Stream_Read_UINT64(input_stream, size); /* AllocationSize */ guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i] size=%" PRIu64, __func__, file_id, (uint64_t) size); /* Truncate file */ result = guac_rdp_fs_truncate((guac_rdp_fs*) device->data, file_id, size); if (result < 0) output_stream = guac_rdpdr_new_io_completion(device, completion_id, guac_rdp_fs_get_status(result), 4); else output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 4); Stream_Write_UINT32(output_stream, length); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_set_disposition_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id, int length) { wStream* output_stream; /* Delete file */ int result = guac_rdp_fs_delete((guac_rdp_fs*) device->data, file_id); if (result < 0) output_stream = guac_rdpdr_new_io_completion(device, completion_id, guac_rdp_fs_get_status(result), 4); else output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 4); guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i]", __func__, file_id); Stream_Write_UINT32(output_stream, length); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_set_end_of_file_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id, int length) { int result; UINT64 size; wStream* output_stream; /* Read new size */ Stream_Read_UINT64(input_stream, size); /* AllocationSize */ guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i] size=%" PRIu64, __func__, file_id, (uint64_t) size); /* Truncate file */ result = guac_rdp_fs_truncate((guac_rdp_fs*) device->data, file_id, size); if (result < 0) output_stream = guac_rdpdr_new_io_completion(device, completion_id, guac_rdp_fs_get_status(result), 4); else output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 4); Stream_Write_UINT32(output_stream, length); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_set_basic_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id, int length) { wStream* output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 4); /* Currently do nothing, just respond */ Stream_Write_UINT32(output_stream, length); guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i] IGNORED", __func__, file_id); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } guacamole-server-0.9.9/src/protocols/rdp/guac_rdpdr/rdpdr_service.c0000664000175100017510000002036712612226234022440 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "rdp_fs.h" #include "rdp_settings.h" #include "rdp_stream.h" #include "rdpdr_fs_service.h" #include "rdpdr_messages.h" #include "rdpdr_printer.h" #include "rdpdr_service.h" #include #include #include #include #include #include #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif /** * Entry point for RDPDR virtual channel. */ int VirtualChannelEntry(PCHANNEL_ENTRY_POINTS pEntryPoints) { /* Allocate plugin */ guac_rdpdrPlugin* rdpdr = (guac_rdpdrPlugin*) calloc(1, sizeof(guac_rdpdrPlugin)); /* Init channel def */ strcpy(rdpdr->plugin.channel_def.name, "rdpdr"); rdpdr->plugin.channel_def.options = CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP | CHANNEL_OPTION_COMPRESS_RDP; /* Set callbacks */ rdpdr->plugin.connect_callback = guac_rdpdr_process_connect; rdpdr->plugin.receive_callback = guac_rdpdr_process_receive; rdpdr->plugin.event_callback = guac_rdpdr_process_event; rdpdr->plugin.terminate_callback = guac_rdpdr_process_terminate; /* Finish init */ svc_plugin_init((rdpSvcPlugin*) rdpdr, pEntryPoints); return 1; } /* * Service Handlers */ void guac_rdpdr_process_connect(rdpSvcPlugin* plugin) { /* Get RDPDR plugin */ guac_rdpdrPlugin* rdpdr = (guac_rdpdrPlugin*) plugin; /* Get client from plugin parameters */ guac_client* client = (guac_client*) plugin->channel_entry_points.pExtendedData; /* NULL out pExtendedData so we don't lose our guac_client due to an * automatic free() within libfreerdp */ plugin->channel_entry_points.pExtendedData = NULL; /* Get data from client */ rdp_guac_client_data* client_data = (rdp_guac_client_data*) client->data; /* Init plugin */ rdpdr->client = client; rdpdr->devices_registered = 0; /* Register printer if enabled */ if (client_data->settings.printing_enabled) guac_rdpdr_register_printer(rdpdr); /* Register drive if enabled */ if (client_data->settings.drive_enabled) guac_rdpdr_register_fs(rdpdr); /* Log that printing, etc. has been loaded */ guac_client_log(client, GUAC_LOG_INFO, "guacdr connected."); } void guac_rdpdr_process_terminate(rdpSvcPlugin* plugin) { guac_rdpdrPlugin* rdpdr = (guac_rdpdrPlugin*) plugin; int i; for (i=0; idevices_registered; i++) { guac_rdpdr_device* device = &(rdpdr->devices[i]); guac_client_log(rdpdr->client, GUAC_LOG_INFO, "Unloading device %i (%s)", device->device_id, device->device_name); device->free_handler(device); } free(plugin); } void guac_rdpdr_process_event(rdpSvcPlugin* plugin, wMessage* event) { freerdp_event_free(event); } void guac_rdpdr_process_receive(rdpSvcPlugin* plugin, wStream* input_stream) { guac_rdpdrPlugin* rdpdr = (guac_rdpdrPlugin*) plugin; int component; int packet_id; /* Read header */ Stream_Read_UINT16(input_stream, component); Stream_Read_UINT16(input_stream, packet_id); /* Core component */ if (component == RDPDR_CTYP_CORE) { /* Dispatch handlers based on packet ID */ switch (packet_id) { case PAKID_CORE_SERVER_ANNOUNCE: guac_rdpdr_process_server_announce(rdpdr, input_stream); break; case PAKID_CORE_CLIENTID_CONFIRM: guac_rdpdr_process_clientid_confirm(rdpdr, input_stream); break; case PAKID_CORE_DEVICE_REPLY: guac_rdpdr_process_device_reply(rdpdr, input_stream); break; case PAKID_CORE_DEVICE_IOREQUEST: guac_rdpdr_process_device_iorequest(rdpdr, input_stream); break; case PAKID_CORE_SERVER_CAPABILITY: guac_rdpdr_process_server_capability(rdpdr, input_stream); break; case PAKID_CORE_USER_LOGGEDON: guac_rdpdr_process_user_loggedon(rdpdr, input_stream); break; default: guac_client_log(rdpdr->client, GUAC_LOG_INFO, "Ignoring RDPDR core packet with unexpected ID: 0x%04x", packet_id); } } /* end if core */ /* Printer component */ else if (component == RDPDR_CTYP_PRN) { /* Dispatch handlers based on packet ID */ switch (packet_id) { case PAKID_PRN_CACHE_DATA: guac_rdpdr_process_prn_cache_data(rdpdr, input_stream); break; case PAKID_PRN_USING_XPS: guac_rdpdr_process_prn_using_xps(rdpdr, input_stream); break; default: guac_client_log(rdpdr->client, GUAC_LOG_INFO, "Ignoring RDPDR printer packet with unexpected ID: 0x%04x", packet_id); } } /* end if printer */ else guac_client_log(rdpdr->client, GUAC_LOG_INFO, "Ignoring packet for unknown RDPDR component: 0x%04x", component); } wStream* guac_rdpdr_new_io_completion(guac_rdpdr_device* device, int completion_id, int status, int size) { wStream* output_stream = Stream_New(NULL, 16+size); /* Write header */ Stream_Write_UINT16(output_stream, RDPDR_CTYP_CORE); Stream_Write_UINT16(output_stream, PAKID_CORE_DEVICE_IOCOMPLETION); /* Write content */ Stream_Write_UINT32(output_stream, device->device_id); Stream_Write_UINT32(output_stream, completion_id); Stream_Write_UINT32(output_stream, status); return output_stream; } void guac_rdpdr_start_download(guac_rdpdr_device* device, const char* path) { /* Get client and stream */ guac_client* client = device->rdpdr->client; int file_id = guac_rdp_fs_open((guac_rdp_fs*) device->data, path, ACCESS_FILE_READ_DATA, 0, DISP_FILE_OPEN, 0); /* If file opened successfully, start stream */ if (file_id >= 0) { guac_rdp_stream* rdp_stream; const char* basename; int i; char c; /* Associate stream with transfer status */ guac_stream* stream = guac_client_alloc_stream(client); stream->data = rdp_stream = malloc(sizeof(guac_rdp_stream)); stream->ack_handler = guac_rdp_download_ack_handler; rdp_stream->type = GUAC_RDP_DOWNLOAD_STREAM; rdp_stream->download_status.file_id = file_id; rdp_stream->download_status.offset = 0; /* Get basename from absolute path */ i=0; basename = path; do { c = path[i]; if (c == '/' || c == '\\') basename = &(path[i+1]); i++; } while (c != '\0'); guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: Initiating download of \"%s\"", __func__, path); /* Begin stream */ guac_protocol_send_file(client->socket, stream, "application/octet-stream", basename); guac_socket_flush(client->socket); } else guac_client_log(client, GUAC_LOG_ERROR, "Unable to download \"%s\"", path); } guacamole-server-0.9.9/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages.h0000664000175100017510000001135512536405625023311 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_RDPDR_FS_MESSAGES_H #define __GUAC_RDPDR_FS_MESSAGES_H /** * Handlers for core drive I/O requests. Requests handled here may be simple * messages handled directly, or more complex multi-type messages handled * elsewhere. * * @file rdpdr_fs_messages.h */ #include "config.h" #include "rdpdr_service.h" #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif /** * Handles a Server Create Drive Request. Despite its name, this request opens * a file. */ void guac_rdpdr_fs_process_create(guac_rdpdr_device* device, wStream* input_stream, int completion_id); /** * Handles a Server Close Drive Reqiest. This request closes an open file. */ void guac_rdpdr_fs_process_close(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); /** * Handles a Server Drive Read Request. This request reads from a file. */ void guac_rdpdr_fs_process_read(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); /** * Handles a Server Drive Write Request. This request writes to a file. */ void guac_rdpdr_fs_process_write(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); /** * Handles a Server Drive Control Request. This request handles one of any * number of Windows FSCTL_* control functions. */ void guac_rdpdr_fs_process_device_control(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); /** * Handles a Server Drive Query Volume Information Request. This request * queries information about the redirected volume (drive). This request * has several query types which have their own handlers defined in a * separate file. */ void guac_rdpdr_fs_process_volume_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); /** * Handles a Server Drive Set Volume Information Request. Currently, this * RDPDR implementation does not support setting of volume information. */ void guac_rdpdr_fs_process_set_volume_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); /** * Handles a Server Drive Query Information Request. This request queries * information about a specific file. This request has several query types * which have their own handlers defined in a separate file. */ void guac_rdpdr_fs_process_file_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); /** * Handles a Server Drive Set Information Request. This request sets * information about a specific file. Currently, this RDPDR implementation does * not support setting of file information. */ void guac_rdpdr_fs_process_set_file_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); /** * Handles a Server Drive Query Directory Request. This request queries * information about a specific directory. This request has several query types * which have their own handlers defined in a separate file. */ void guac_rdpdr_fs_process_query_directory(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); /** * Handles a Server Drive NotifyChange Directory Request. This request requests * directory change notification. */ void guac_rdpdr_fs_process_notify_change_directory(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); /** * Handles a Server Drive Lock Control Request. This request locks or unlocks * portions of a file. */ void guac_rdpdr_fs_process_lock_control(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); #endif guacamole-server-0.9.9/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages_dir_info.c0000664000175100017510000002076512612226234025152 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "rdpdr_service.h" #include "rdp_fs.h" #include "rdp_status.h" #include "unicode.h" #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif #include void guac_rdpdr_fs_process_query_directory_info(guac_rdpdr_device* device, const char* entry_name, int file_id, int completion_id) { guac_rdp_fs_file* file; wStream* output_stream; int length = guac_utf8_strlen(entry_name); int utf16_length = length*2; unsigned char utf16_entry_name[256]; guac_rdp_utf8_to_utf16((const unsigned char*) entry_name, length, (char*) utf16_entry_name, sizeof(utf16_entry_name)); /* Get file */ file = guac_rdp_fs_get_file((guac_rdp_fs*) device->data, file_id); if (file == NULL) return; guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i (entry_name=\"%s\")]", __func__, file_id, entry_name); output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 4 + 64 + utf16_length + 2); Stream_Write_UINT32(output_stream, 64 + utf16_length + 2); /* Length */ Stream_Write_UINT32(output_stream, 0); /* NextEntryOffset */ Stream_Write_UINT32(output_stream, 0); /* FileIndex */ Stream_Write_UINT64(output_stream, file->ctime); /* CreationTime */ Stream_Write_UINT64(output_stream, file->atime); /* LastAccessTime */ Stream_Write_UINT64(output_stream, file->mtime); /* LastWriteTime */ Stream_Write_UINT64(output_stream, file->mtime); /* ChangeTime */ Stream_Write_UINT64(output_stream, file->size); /* EndOfFile */ Stream_Write_UINT64(output_stream, file->size); /* AllocationSize */ Stream_Write_UINT32(output_stream, file->attributes); /* FileAttributes */ Stream_Write_UINT32(output_stream, utf16_length+2); /* FileNameLength*/ Stream_Write(output_stream, utf16_entry_name, utf16_length); /* FileName */ Stream_Write(output_stream, "\0\0", 2); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_query_full_directory_info(guac_rdpdr_device* device, const char* entry_name, int file_id, int completion_id) { guac_rdp_fs_file* file; wStream* output_stream; int length = guac_utf8_strlen(entry_name); int utf16_length = length*2; unsigned char utf16_entry_name[256]; guac_rdp_utf8_to_utf16((const unsigned char*) entry_name, length, (char*) utf16_entry_name, sizeof(utf16_entry_name)); /* Get file */ file = guac_rdp_fs_get_file((guac_rdp_fs*) device->data, file_id); if (file == NULL) return; guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i (entry_name=\"%s\")]", __func__, file_id, entry_name); output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 4 + 68 + utf16_length + 2); Stream_Write_UINT32(output_stream, 68 + utf16_length + 2); /* Length */ Stream_Write_UINT32(output_stream, 0); /* NextEntryOffset */ Stream_Write_UINT32(output_stream, 0); /* FileIndex */ Stream_Write_UINT64(output_stream, file->ctime); /* CreationTime */ Stream_Write_UINT64(output_stream, file->atime); /* LastAccessTime */ Stream_Write_UINT64(output_stream, file->mtime); /* LastWriteTime */ Stream_Write_UINT64(output_stream, file->mtime); /* ChangeTime */ Stream_Write_UINT64(output_stream, file->size); /* EndOfFile */ Stream_Write_UINT64(output_stream, file->size); /* AllocationSize */ Stream_Write_UINT32(output_stream, file->attributes); /* FileAttributes */ Stream_Write_UINT32(output_stream, utf16_length+2); /* FileNameLength*/ Stream_Write_UINT32(output_stream, 0); /* EaSize */ Stream_Write(output_stream, utf16_entry_name, utf16_length); /* FileName */ Stream_Write(output_stream, "\0\0", 2); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_query_both_directory_info(guac_rdpdr_device* device, const char* entry_name, int file_id, int completion_id) { guac_rdp_fs_file* file; wStream* output_stream; int length = guac_utf8_strlen(entry_name); int utf16_length = length*2; unsigned char utf16_entry_name[256]; guac_rdp_utf8_to_utf16((const unsigned char*) entry_name, length, (char*) utf16_entry_name, sizeof(utf16_entry_name)); /* Get file */ file = guac_rdp_fs_get_file((guac_rdp_fs*) device->data, file_id); if (file == NULL) return; guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i (entry_name=\"%s\")]", __func__, file_id, entry_name); output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 4 + 69 + 24 + utf16_length + 2); Stream_Write_UINT32(output_stream, 69 + 24 + utf16_length + 2); /* Length */ Stream_Write_UINT32(output_stream, 0); /* NextEntryOffset */ Stream_Write_UINT32(output_stream, 0); /* FileIndex */ Stream_Write_UINT64(output_stream, file->ctime); /* CreationTime */ Stream_Write_UINT64(output_stream, file->atime); /* LastAccessTime */ Stream_Write_UINT64(output_stream, file->mtime); /* LastWriteTime */ Stream_Write_UINT64(output_stream, file->mtime); /* ChangeTime */ Stream_Write_UINT64(output_stream, file->size); /* EndOfFile */ Stream_Write_UINT64(output_stream, file->size); /* AllocationSize */ Stream_Write_UINT32(output_stream, file->attributes); /* FileAttributes */ Stream_Write_UINT32(output_stream, utf16_length+2); /* FileNameLength*/ Stream_Write_UINT32(output_stream, 0); /* EaSize */ Stream_Write_UINT8(output_stream, 0); /* ShortNameLength */ /* Apparently, the reserved byte here must be skipped ... */ Stream_Zero(output_stream, 24); /* FileName */ Stream_Write(output_stream, utf16_entry_name, utf16_length); /* FileName */ Stream_Write(output_stream, "\0\0", 2); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_query_names_info(guac_rdpdr_device* device, const char* entry_name, int file_id, int completion_id) { guac_rdp_fs_file* file; wStream* output_stream; int length = guac_utf8_strlen(entry_name); int utf16_length = length*2; unsigned char utf16_entry_name[256]; guac_rdp_utf8_to_utf16((const unsigned char*) entry_name, length, (char*) utf16_entry_name, sizeof(utf16_entry_name)); /* Get file */ file = guac_rdp_fs_get_file((guac_rdp_fs*) device->data, file_id); if (file == NULL) return; guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i (entry_name=\"%s\")]", __func__, file_id, entry_name); output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 4 + 12 + utf16_length + 2); Stream_Write_UINT32(output_stream, 12 + utf16_length + 2); /* Length */ Stream_Write_UINT32(output_stream, 0); /* NextEntryOffset */ Stream_Write_UINT32(output_stream, 0); /* FileIndex */ Stream_Write_UINT32(output_stream, utf16_length+2); /* FileNameLength*/ Stream_Write(output_stream, utf16_entry_name, utf16_length); /* FileName */ Stream_Write(output_stream, "\0\0", 2); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } guacamole-server-0.9.9/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages_vol_info.h0000664000175100017510000000524012536405625025200 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_RDPDR_FS_MESSAGES_VOL_INFO_H #define __GUAC_RDPDR_FS_MESSAGES_VOL_INFO_H /** * Handlers for directory queries received over the RDPDR channel via the * IRP_MJ_DIRECTORY_CONTROL major function and the IRP_MN_QUERY_DIRECTORY minor * function. * * @file rdpdr_fs_messages_vol_info.h */ #include "config.h" #include "rdpdr_service.h" #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif /** * Processes a query request for FileFsVolumeInformation. According to the * documentation, this is "used to query information for a volume on which a * file system is mounted." */ void guac_rdpdr_fs_process_query_volume_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); /** * Processes a query request for FileFsSizeInformation. */ void guac_rdpdr_fs_process_query_size_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); /** * Processes a query request for FileFsAttributeInformation. */ void guac_rdpdr_fs_process_query_attribute_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); /** * Processes a query request for FileFsFullSizeInformation. */ void guac_rdpdr_fs_process_query_full_size_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); /** * Processes a query request for FileFsDeviceInformation. */ void guac_rdpdr_fs_process_query_device_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); #endif guacamole-server-0.9.9/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages_file_info.h0000664000175100017510000000777512536405625025336 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_RDPDR_FS_MESSAGES_FILE_INFO_H #define __GUAC_RDPDR_FS_MESSAGES_FILE_INFO_H /** * Handlers for file queries received over the RDPDR channel via the * IRP_MJ_QUERY_INFORMATION major function. * * @file rdpdr_fs_messages_file_info.h */ #include "config.h" #include "rdpdr_service.h" #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif /** * Processes a query for FileBasicInformation. From the documentation, this is * "used to query a file for the times of creation, last access, last write, * and change, in addition to file attribute information." */ void guac_rdpdr_fs_process_query_basic_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); /** * Processes a query for FileStandardInformation. From the documentation, this * is "used to query for file information such as allocation size, end-of-file * position, and number of links." */ void guac_rdpdr_fs_process_query_standard_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); /** * Processes a query for FileAttributeTagInformation. From the documentation * this is "used to query for file attribute and reparse tag information." */ void guac_rdpdr_fs_process_query_attribute_tag_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id); /** * Process a set operation for FileRenameInformation. From the documentation, * this operation is used to rename a file. */ void guac_rdpdr_fs_process_set_rename_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id, int length); /** * Process a set operation for FileAllocationInformation. From the * documentation, this operation is used to set a file's allocation size. */ void guac_rdpdr_fs_process_set_allocation_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id, int length); /** * Process a set operation for FileDispositionInformation. From the * documentation, this operation is used to mark a file for deletion. */ void guac_rdpdr_fs_process_set_disposition_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id, int length); /** * Process a set operation for FileEndOfFileInformation. From the * documentation, this operation is used "to set end-of-file information for * a file." */ void guac_rdpdr_fs_process_set_end_of_file_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id, int length); /** * Process a set operation for FileBasicInformation. From the documentation, * this is "used to set file information such as the times of creation, last * access, last write, and change, in addition to file attributes." */ void guac_rdpdr_fs_process_set_basic_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id, int length); #endif guacamole-server-0.9.9/src/protocols/rdp/guac_rdpdr/rdpdr_service.h0000664000175100017510000001141612536405625022450 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_RDPDR_SERVICE_H #define __GUAC_RDPDR_SERVICE_H #include "config.h" #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif /** * The maximum number of bytes to allow for a device read. */ #define GUAC_RDP_MAX_READ_BUFFER 4194304 typedef struct guac_rdpdrPlugin guac_rdpdrPlugin; typedef struct guac_rdpdr_device guac_rdpdr_device; /** * Handler for client device list announce. Each implementing device must write * its announcement header and data to the given output stream. */ typedef void guac_rdpdr_device_announce_handler(guac_rdpdr_device* device, wStream* output_stream, int device_id); /** * Handler for device I/O requests. */ typedef void guac_rdpdr_device_iorequest_handler(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id, int major_func, int minor_func); /** * Handler for cleaning up the dynamically-allocated portions of a device. */ typedef void guac_rdpdr_device_free_handler(guac_rdpdr_device* device); /** * Arbitrary device forwarded over the RDPDR channel. */ struct guac_rdpdr_device { /** * The RDPDR plugin owning this device. */ guac_rdpdrPlugin* rdpdr; /** * The ID assigned to this device by the RDPDR plugin. */ int device_id; /** * An arbitrary device name, used for logging purposes only. */ const char* device_name; /** * Handler which will be called when the RDPDR plugin is forming the client * device announce list. */ guac_rdpdr_device_announce_handler* announce_handler; /** * Handler which should be called for every I/O request received. */ guac_rdpdr_device_iorequest_handler* iorequest_handler; /** * Handlel which should be called when the device is being free'd. */ guac_rdpdr_device_free_handler* free_handler; /** * Arbitrary data, used internally by the handlers for this device. */ void* data; }; /** * Structure representing the current state of the Guacamole RDPDR plugin for * FreeRDP. */ struct guac_rdpdrPlugin { /** * The FreeRDP parts of this plugin. This absolutely MUST be first. * FreeRDP depends on accessing this structure as if it were an instance * of rdpSvcPlugin. */ rdpSvcPlugin plugin; /** * Reference to the client owning this instance of the RDPDR plugin. */ guac_client* client; /** * The number of devices registered within the devices array. */ int devices_registered; /** * Array of registered devices. */ guac_rdpdr_device devices[8]; }; /** * Handler called when this plugin is loaded by FreeRDP. */ void guac_rdpdr_process_connect(rdpSvcPlugin* plugin); /** * Handler called when this plugin receives data along its designated channel. */ void guac_rdpdr_process_receive(rdpSvcPlugin* plugin, wStream* input_stream); /** * Handler called when this plugin is being unloaded. */ void guac_rdpdr_process_terminate(rdpSvcPlugin* plugin); /** * Handler called when this plugin receives an event. For the sake of RDPDR, * all events will be ignored and simply free'd. */ void guac_rdpdr_process_event(rdpSvcPlugin* plugin, wMessage* event); /** * Creates a new stream which contains the ommon DR_DEVICE_IOCOMPLETION header * used for virtually all responses. */ wStream* guac_rdpdr_new_io_completion(guac_rdpdr_device* device, int completion_id, int status, int size); /** * Begins streaming the given file to the user via a Guacamole file stream. */ void guac_rdpdr_start_download(guac_rdpdr_device* device, const char* path); #endif guacamole-server-0.9.9/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h0000664000175100017510000001556312536405625022626 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_RDPDR_MESSAGES_H #define __GUAC_RDPDR_MESSAGES_H #include "config.h" #include "rdpdr_service.h" #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif #include /** * Identifies the "core" component of RDPDR as the destination of the received * packet. */ #define RDPDR_CTYP_CORE 0x4472 /** * Identifies the printing component of RDPDR as the destination of the * received packet. */ #define RDPDR_CTYP_PRN 0x5052 /* * Packet IDs as required by the RDP spec (see: [MS-RDPEFS].pdf) */ #define PAKID_CORE_SERVER_ANNOUNCE 0x496E #define PAKID_CORE_CLIENTID_CONFIRM 0x4343 #define PAKID_CORE_CLIENT_NAME 0x434E #define PAKID_CORE_DEVICELIST_ANNOUNCE 0x4441 #define PAKID_CORE_DEVICE_REPLY 0x6472 #define PAKID_CORE_DEVICE_IOREQUEST 0x4952 #define PAKID_CORE_DEVICE_IOCOMPLETION 0x4943 #define PAKID_CORE_SERVER_CAPABILITY 0x5350 #define PAKID_CORE_CLIENT_CAPABILITY 0x4350 #define PAKID_CORE_DEVICELIST_REMOVE 0x444D #define PAKID_PRN_CACHE_DATA 0x5043 #define PAKID_CORE_USER_LOGGEDON 0x554C #define PAKID_PRN_USING_XPS 0x5543 /** * A 32-bit arbitrary value for the osType field of certain requests. As this * value is defined as completely arbitrary and required to be ignored by the * server, we send "GUAC" as an integer. */ #define GUAC_OS_TYPE (*((uint32_t*) "GUAC")) /** * Name of the printer driver that should be used on the server. */ #define GUAC_PRINTER_DRIVER "M\0S\0 \0P\0u\0b\0l\0i\0s\0h\0e\0r\0 \0I\0m\0a\0g\0e\0s\0e\0t\0t\0e\0r\0\0\0" #define GUAC_PRINTER_DRIVER_LENGTH 50 /** * Name of the printer itself. */ #define GUAC_PRINTER_NAME "G\0u\0a\0c\0a\0m\0o\0l\0e\0\0\0" #define GUAC_PRINTER_NAME_LENGTH 20 /** * Name of the filesystem. */ #define GUAC_FILESYSTEM_NAME "G\0u\0a\0c\0a\0m\0o\0l\0e\0\0\0" #define GUAC_FILESYSTEM_NAME_LENGTH 20 /** * Label of the filesystem. */ #define GUAC_FILESYSTEM_LABEL "G\0U\0A\0C\0F\0I\0L\0E\0" #define GUAC_FILESYSTEM_LABEL_LENGTH 16 /* * Capability types */ #define CAP_GENERAL_TYPE 1 #define CAP_PRINTER_TYPE 2 #define CAP_PORT_TYPE 3 #define CAP_DRIVE_TYPE 4 #define CAP_SMARTCARD_TYPE 5 /* * General capability header versions. */ #define GENERAL_CAPABILITY_VERSION_01 1 #define GENERAL_CAPABILITY_VERSION_02 2 /* * Print capability header versions. */ #define PRINT_CAPABILITY_VERSION_01 1 /* * Drive capability header versions. */ #define DRIVE_CAPABILITY_VERSION_01 1 #define DRIVE_CAPABILITY_VERSION_02 2 /* * Legal client major version numbers. */ #define RDP_CLIENT_MAJOR_ALL 1 /* * Legal client minor version numbers. */ #define RDP_CLIENT_MINOR_6_1 0xC #define RDP_CLIENT_MINOR_5_2 0xA #define RDP_CLIENT_MINOR_5_1 0x5 #define RDP_CLIENT_MINOR_5_0 0x2 /* * PDU flags used by the extendedPDU field. */ #define RDPDR_DEVICE_REMOVE_PDUS 0x1 #define RDPDR_CLIENT_DISPLAY_NAME 0x2 #define RDPDR_USER_LOGGEDON_PDU 0x4 /* * Device types. */ #define RDPDR_DTYP_SERIAL 0x00000001 #define RDPDR_DTYP_PARALLEL 0x00000002 #define RDPDR_DTYP_PRINT 0x00000004 #define RDPDR_DTYP_FILESYSTEM 0x00000008 #define RDPDR_DTYP_SMARTCARD 0x00000020 /* * Printer flags. */ #define RDPDR_PRINTER_ANNOUNCE_FLAG_ASCII 0x00000001 #define RDPDR_PRINTER_ANNOUNCE_FLAG_DEFAULTPRINTER 0x00000002 #define RDPDR_PRINTER_ANNOUNCE_FLAG_NETWORKPRINTER 0x00000004 #define RDPDR_PRINTER_ANNOUNCE_FLAG_TSPRINTER 0x00000008 #define RDPDR_PRINTER_ANNOUNCE_FLAG_XPSFORMAT 0x00000010 /* * I/O requests. */ #define IRP_MJ_CREATE 0x00000000 #define IRP_MJ_CLOSE 0x00000002 #define IRP_MJ_READ 0x00000003 #define IRP_MJ_WRITE 0x00000004 #define IRP_MJ_DEVICE_CONTROL 0x0000000E #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0000000A #define IRP_MJ_SET_VOLUME_INFORMATION 0x0000000B #define IRP_MJ_QUERY_INFORMATION 0x00000005 #define IRP_MJ_SET_INFORMATION 0x00000006 #define IRP_MJ_DIRECTORY_CONTROL 0x0000000C #define IRP_MJ_LOCK_CONTROL 0x00000011 #define IRP_MN_QUERY_DIRECTORY 0x00000001 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x00000002 /* * Volume information constants. */ #define FileFsVolumeInformation 0x00000001 #define FileFsSizeInformation 0x00000003 #define FileFsDeviceInformation 0x00000004 #define FileFsAttributeInformation 0x00000005 #define FileFsFullSizeInformation 0x00000007 /* * File information constants. */ #define FileBasicInformation 0x00000004 #define FileStandardInformation 0x00000005 #define FileRenameInformation 0x0000000A #define FileDispositionInformation 0x0000000D #define FileAllocationInformation 0x00000013 #define FileEndOfFileInformation 0x00000014 #define FileAttributeTagInformation 0x00000023 /* * Directory information constants. */ #define FileDirectoryInformation 0x00000001 #define FileFullDirectoryInformation 0x00000002 #define FileBothDirectoryInformation 0x00000003 #define FileNamesInformation 0x0000000C /* * Message handlers. */ void guac_rdpdr_process_server_announce(guac_rdpdrPlugin* rdpdr, wStream* input_stream); void guac_rdpdr_process_clientid_confirm(guac_rdpdrPlugin* rdpdr, wStream* input_stream); void guac_rdpdr_process_device_reply(guac_rdpdrPlugin* rdpdr, wStream* input_stream); void guac_rdpdr_process_device_iorequest(guac_rdpdrPlugin* rdpdr, wStream* input_stream); void guac_rdpdr_process_server_capability(guac_rdpdrPlugin* rdpdr, wStream* input_stream); void guac_rdpdr_process_user_loggedon(guac_rdpdrPlugin* rdpdr, wStream* input_stream); void guac_rdpdr_process_prn_cache_data(guac_rdpdrPlugin* rdpdr, wStream* input_stream); void guac_rdpdr_process_prn_using_xps(guac_rdpdrPlugin* rdpdr, wStream* input_stream); #endif guacamole-server-0.9.9/src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.h0000664000175100017510000000352312536405625023140 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_RDPDR_FS_H #define __GUAC_RDPDR_FS_H /** * Functions and macros specific to filesystem handling and initialization * independent of RDP. The functions here may deal with the RDPDR device * directly, but their semantics must not deal with RDP protocol messaging. * Functions here represent a virtual Windows-style filesystem on top of UNIX * system calls and structures, using the guac_rdpdr_device structure as a home * for common data. * * @file rdpdr_fs.h */ #include "config.h" #include "rdpdr_service.h" #include /** * Registers a new filesystem device within the RDPDR plugin. This must be done * before RDPDR connection finishes. */ void guac_rdpdr_register_fs(guac_rdpdrPlugin* rdpdr); #endif guacamole-server-0.9.9/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages.c0000664000175100017510000004346212612226234023300 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "rdpdr_fs_messages_dir_info.h" #include "rdpdr_fs_messages_file_info.h" #include "rdpdr_fs_messages.h" #include "rdpdr_fs_messages_vol_info.h" #include "rdpdr_messages.h" #include "rdpdr_service.h" #include "rdp_fs.h" #include "rdp_status.h" #include "unicode.h" #include #include #ifdef ENABLE_WINPR #include #include #else #include "compat/winpr-stream.h" #include "compat/winpr-wtypes.h" #endif #include #include #include #include void guac_rdpdr_fs_process_create(guac_rdpdr_device* device, wStream* input_stream, int completion_id) { wStream* output_stream; int file_id; int desired_access, file_attributes; int create_disposition, create_options, path_length; char path[GUAC_RDP_FS_MAX_PATH]; /* Read "create" information */ Stream_Read_UINT32(input_stream, desired_access); Stream_Seek_UINT64(input_stream); /* allocation size */ Stream_Read_UINT32(input_stream, file_attributes); Stream_Seek_UINT32(input_stream); /* shared access */ Stream_Read_UINT32(input_stream, create_disposition); Stream_Read_UINT32(input_stream, create_options); Stream_Read_UINT32(input_stream, path_length); /* Convert path to UTF-8 */ guac_rdp_utf16_to_utf8(Stream_Pointer(input_stream), path_length/2 - 1, path, sizeof(path)); /* Open file */ file_id = guac_rdp_fs_open((guac_rdp_fs*) device->data, path, desired_access, file_attributes, create_disposition, create_options); guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i] " "desired_access=0x%x, file_attributes=0x%x, " "create_disposition=0x%x, create_options=0x%x, path=\"%s\"", __func__, file_id, desired_access, file_attributes, create_disposition, create_options, path); /* If an error occurred, notify server */ if (file_id < 0) { guac_client_log(device->rdpdr->client, GUAC_LOG_ERROR, "File open refused (%i): \"%s\"", file_id, path); output_stream = guac_rdpdr_new_io_completion(device, completion_id, guac_rdp_fs_get_status(file_id), 5); Stream_Write_UINT32(output_stream, 0); /* fileId */ Stream_Write_UINT8(output_stream, 0); /* information */ } /* Otherwise, open succeeded */ else { guac_rdp_fs_file* file; output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 5); Stream_Write_UINT32(output_stream, file_id); /* fileId */ Stream_Write_UINT8(output_stream, 0); /* information */ /* Create \Download if it doesn't exist */ file = guac_rdp_fs_get_file((guac_rdp_fs*) device->data, file_id); if (file != NULL && strcmp(file->absolute_path, "\\") == 0) { int download_id = guac_rdp_fs_open((guac_rdp_fs*) device->data, "\\Download", ACCESS_GENERIC_READ, 0, DISP_FILE_OPEN_IF, FILE_DIRECTORY_FILE); if (download_id >= 0) guac_rdp_fs_close((guac_rdp_fs*) device->data, download_id); } } svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_read(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { UINT32 length; UINT64 offset; char* buffer; int bytes_read; wStream* output_stream; /* Read packet */ Stream_Read_UINT32(input_stream, length); Stream_Read_UINT64(input_stream, offset); guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i] length=%i, offset=%" PRIu64, __func__, file_id, length, (uint64_t) offset); /* Ensure buffer size does not exceed a safe maximum */ if (length > GUAC_RDP_MAX_READ_BUFFER) length = GUAC_RDP_MAX_READ_BUFFER; /* Allocate buffer */ buffer = malloc(length); /* Attempt read */ bytes_read = guac_rdp_fs_read((guac_rdp_fs*) device->data, file_id, offset, buffer, length); /* If error, return invalid parameter */ if (bytes_read < 0) { output_stream = guac_rdpdr_new_io_completion(device, completion_id, guac_rdp_fs_get_status(bytes_read), 4); Stream_Write_UINT32(output_stream, 0); /* Length */ } /* Otherwise, send bytes read */ else { output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 4+bytes_read); Stream_Write_UINT32(output_stream, bytes_read); /* Length */ Stream_Write(output_stream, buffer, bytes_read); /* ReadData */ } svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); free(buffer); } void guac_rdpdr_fs_process_write(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { UINT32 length; UINT64 offset; int bytes_written; wStream* output_stream; /* Read packet */ Stream_Read_UINT32(input_stream, length); Stream_Read_UINT64(input_stream, offset); Stream_Seek(input_stream, 20); /* Padding */ guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i] length=%i, offset=%" PRIu64, __func__, file_id, length, (uint64_t) offset); /* Attempt write */ bytes_written = guac_rdp_fs_write((guac_rdp_fs*) device->data, file_id, offset, Stream_Pointer(input_stream), length); /* If error, return invalid parameter */ if (bytes_written < 0) { output_stream = guac_rdpdr_new_io_completion(device, completion_id, guac_rdp_fs_get_status(bytes_written), 5); Stream_Write_UINT32(output_stream, 0); /* Length */ Stream_Write_UINT8(output_stream, 0); /* Padding */ } /* Otherwise, send success */ else { output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 5); Stream_Write_UINT32(output_stream, bytes_written); /* Length */ Stream_Write_UINT8(output_stream, 0); /* Padding */ } svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_close(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { wStream* output_stream; guac_rdp_fs_file* file; guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i]", __func__, file_id); /* Get file */ file = guac_rdp_fs_get_file((guac_rdp_fs*) device->data, file_id); if (file == NULL) return; /* If file was written to, and it's in the \Download folder, start stream */ if (file->bytes_written > 0 && strncmp(file->absolute_path, "\\Download\\", 10) == 0) { guac_rdpdr_start_download(device, file->absolute_path); guac_rdp_fs_delete((guac_rdp_fs*) device->data, file_id); } /* Close file */ guac_rdp_fs_close((guac_rdp_fs*) device->data, file_id); output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 4); Stream_Write(output_stream, "\0\0\0\0", 4); /* Padding */ svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_volume_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { int fs_information_class; Stream_Read_UINT32(input_stream, fs_information_class); /* Dispatch to appropriate class-specific handler */ switch (fs_information_class) { case FileFsVolumeInformation: guac_rdpdr_fs_process_query_volume_info(device, input_stream, file_id, completion_id); break; case FileFsSizeInformation: guac_rdpdr_fs_process_query_size_info(device, input_stream, file_id, completion_id); break; case FileFsDeviceInformation: guac_rdpdr_fs_process_query_device_info(device, input_stream, file_id, completion_id); break; case FileFsAttributeInformation: guac_rdpdr_fs_process_query_attribute_info(device, input_stream, file_id, completion_id); break; case FileFsFullSizeInformation: guac_rdpdr_fs_process_query_full_size_info(device, input_stream, file_id, completion_id); break; default: guac_client_log(device->rdpdr->client, GUAC_LOG_INFO, "Unknown volume information class: 0x%x", fs_information_class); } } void guac_rdpdr_fs_process_file_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { int fs_information_class; Stream_Read_UINT32(input_stream, fs_information_class); /* Dispatch to appropriate class-specific handler */ switch (fs_information_class) { case FileBasicInformation: guac_rdpdr_fs_process_query_basic_info(device, input_stream, file_id, completion_id); break; case FileStandardInformation: guac_rdpdr_fs_process_query_standard_info(device, input_stream, file_id, completion_id); break; case FileAttributeTagInformation: guac_rdpdr_fs_process_query_attribute_tag_info(device, input_stream, file_id, completion_id); break; default: guac_client_log(device->rdpdr->client, GUAC_LOG_INFO, "Unknown file information class: 0x%x", fs_information_class); } } void guac_rdpdr_fs_process_set_volume_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { wStream* output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_NOT_SUPPORTED, 0); guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i] Set volume info not supported", __func__, file_id); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_set_file_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { int fs_information_class; int length; Stream_Read_UINT32(input_stream, fs_information_class); Stream_Read_UINT32(input_stream, length); /* Length */ Stream_Seek(input_stream, 24); /* Padding */ /* Dispatch to appropriate class-specific handler */ switch (fs_information_class) { case FileBasicInformation: guac_rdpdr_fs_process_set_basic_info(device, input_stream, file_id, completion_id, length); break; case FileEndOfFileInformation: guac_rdpdr_fs_process_set_end_of_file_info(device, input_stream, file_id, completion_id, length); break; case FileDispositionInformation: guac_rdpdr_fs_process_set_disposition_info(device, input_stream, file_id, completion_id, length); break; case FileRenameInformation: guac_rdpdr_fs_process_set_rename_info(device, input_stream, file_id, completion_id, length); break; case FileAllocationInformation: guac_rdpdr_fs_process_set_allocation_info(device, input_stream, file_id, completion_id, length); break; default: guac_client_log(device->rdpdr->client, GUAC_LOG_INFO, "Unknown file information class: 0x%x", fs_information_class); } } void guac_rdpdr_fs_process_device_control(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { wStream* output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_INVALID_PARAMETER, 4); guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i] IGNORED", __func__, file_id); /* No content for now */ Stream_Write_UINT32(output_stream, 0); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_notify_change_directory(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i] Not implemented", __func__, file_id); } void guac_rdpdr_fs_process_query_directory(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { wStream* output_stream; guac_rdp_fs_file* file; int fs_information_class, initial_query; int path_length; const char* entry_name; /* Get file */ file = guac_rdp_fs_get_file((guac_rdp_fs*) device->data, file_id); if (file == NULL) return; /* Read main header */ Stream_Read_UINT32(input_stream, fs_information_class); Stream_Read_UINT8(input_stream, initial_query); Stream_Read_UINT32(input_stream, path_length); /* If this is the first query, the path is included after padding */ if (initial_query) { Stream_Seek(input_stream, 23); /* Padding */ /* Convert path to UTF-8 */ guac_rdp_utf16_to_utf8(Stream_Pointer(input_stream), path_length/2 - 1, file->dir_pattern, sizeof(file->dir_pattern)); } guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i] initial_query=%i, dir_pattern=\"%s\"", __func__, file_id, initial_query, file->dir_pattern); /* Find first matching entry in directory */ while ((entry_name = guac_rdp_fs_read_dir((guac_rdp_fs*) device->data, file_id)) != NULL) { /* Convert to absolute path */ char entry_path[GUAC_RDP_FS_MAX_PATH]; if (guac_rdp_fs_convert_path(file->absolute_path, entry_name, entry_path) == 0) { int entry_file_id; /* Pattern defined and match fails, continue with next file */ if (guac_rdp_fs_matches(entry_path, file->dir_pattern)) continue; /* Open directory entry */ entry_file_id = guac_rdp_fs_open((guac_rdp_fs*) device->data, entry_path, ACCESS_FILE_READ_DATA, 0, DISP_FILE_OPEN, 0); if (entry_file_id >= 0) { /* Dispatch to appropriate class-specific handler */ switch (fs_information_class) { case FileDirectoryInformation: guac_rdpdr_fs_process_query_directory_info(device, entry_name, entry_file_id, completion_id); break; case FileFullDirectoryInformation: guac_rdpdr_fs_process_query_full_directory_info(device, entry_name, entry_file_id, completion_id); break; case FileBothDirectoryInformation: guac_rdpdr_fs_process_query_both_directory_info(device, entry_name, entry_file_id, completion_id); break; case FileNamesInformation: guac_rdpdr_fs_process_query_names_info(device, entry_name, entry_file_id, completion_id); break; default: guac_client_log(device->rdpdr->client, GUAC_LOG_INFO, "Unknown dir information class: 0x%x", fs_information_class); } guac_rdp_fs_close((guac_rdp_fs*) device->data, entry_file_id); return; } /* end if file exists */ } /* end if path valid */ } /* end if entry exists */ /* * Handle errors as a lack of files. */ output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_NO_MORE_FILES, 5); Stream_Write_UINT32(output_stream, 0); /* Length */ Stream_Write_UINT8(output_stream, 0); /* Padding */ svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_fs_process_lock_control(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { wStream* output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_NOT_SUPPORTED, 5); guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i] Lock not supported", __func__, file_id); Stream_Zero(output_stream, 5); /* Padding */ svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } guacamole-server-0.9.9/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages_dir_info.h0000664000175100017510000000550212536405625025157 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_RDPDR_FS_MESSAGES_DIR_INFO_H #define __GUAC_RDPDR_FS_MESSAGES_DIR_INFO_H /** * Handlers for directory queries received over the RDPDR channel via the * IRP_MJ_DIRECTORY_CONTROL major function and the IRP_MN_QUERY_DIRECTORY minor * function. * * @file rdpdr_fs_messages_dir_info.h */ #include "config.h" #include "rdpdr_service.h" #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif /** * Processes a query request for FileDirectoryInformation. From the * documentation this is "defined as the file's name, time stamp, and size, or its * attributes." */ void guac_rdpdr_fs_process_query_directory_info(guac_rdpdr_device* device, const char* entry_name, int file_id, int completion_id); /** * Processes a query request for FileFullDirectoryInformation. From the * documentation, this is "defined as all the basic information, plus extended * attribute size." */ void guac_rdpdr_fs_process_query_full_directory_info(guac_rdpdr_device* device, const char* entry_name, int file_id, int completion_id); /** * Processes a query request for FileBothDirectoryInformation. From the * documentation, this absurdly-named request is "basic information plus * extended attribute size and short name about a file or directory." */ void guac_rdpdr_fs_process_query_both_directory_info(guac_rdpdr_device* device, const char* entry_name, int file_id, int completion_id); /** * Processes a query request for FileNamesInformation. From the documentation, * this is "detailed information on the names of files in a directory." */ void guac_rdpdr_fs_process_query_names_info(guac_rdpdr_device* device, const char* entry_name, int file_id, int completion_id); #endif guacamole-server-0.9.9/src/protocols/rdp/guac_rdpdr/rdpdr_printer.c0000664000175100017510000003101512626133327022460 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "rdpdr_messages.h" #include "rdpdr_printer.h" #include "rdpdr_service.h" #include "rdp_status.h" #include #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif #include #include #include #include /* Command to run GhostScript safely as a filter writing PDF */ char* const guac_rdpdr_pdf_filter_command[] = { "gs", "-q", "-dNOPAUSE", "-dBATCH", "-dSAFER", "-dPARANOIDSAFER", "-sDEVICE=pdfwrite", "-sOutputFile=-", "-c", ".setpdfwrite", "-sstdout=/dev/null", "-f", "-", NULL }; static void* guac_rdpdr_print_filter_output_thread(void* data) { guac_rdpdr_device* device = (guac_rdpdr_device*) data; guac_rdpdr_printer_data* printer_data = (guac_rdpdr_printer_data*) device->data; int length; char buffer[8192]; /* Write all output as blobs */ while ((length = read(printer_data->printer_output, buffer, sizeof(buffer))) > 0) guac_protocol_send_blob(device->rdpdr->client->socket, printer_data->stream, buffer, length); /* Log any error */ if (length < 0) guac_client_log(device->rdpdr->client, GUAC_LOG_ERROR, "Error reading from filter: %s", strerror(errno)); return NULL; } static int guac_rdpdr_create_print_process(guac_rdpdr_device* device) { guac_rdpdr_printer_data* printer_data = (guac_rdpdr_printer_data*) device->data; int child_pid; int stdin_pipe[2]; int stdout_pipe[2]; /* Create STDIN pipe */ if (pipe(stdin_pipe)) { guac_client_log(device->rdpdr->client, GUAC_LOG_ERROR, "Unable to create STDIN pipe for PDF filter process: %s", strerror(errno)); return 1; } /* Create STDOUT pipe */ if (pipe(stdout_pipe)) { guac_client_log(device->rdpdr->client, GUAC_LOG_ERROR, "Unable to create STDIN pipe for PDF filter process: %s", strerror(errno)); close(stdin_pipe[0]); close(stdin_pipe[1]); return 1; } /* Store our side of stdin/stdout */ printer_data->printer_input = stdin_pipe[1]; printer_data->printer_output = stdout_pipe[0]; /* Start output thread */ if (pthread_create(&(printer_data->printer_output_thread), NULL, guac_rdpdr_print_filter_output_thread, device)) { guac_client_log(device->rdpdr->client, GUAC_LOG_ERROR, "Unable to fork PDF filter process"); close(stdin_pipe[0]); close(stdin_pipe[1]); close(stdout_pipe[0]); close(stdout_pipe[1]); return 1; } /* Fork child process */ child_pid = fork(); /* Log fork errors */ if (child_pid == -1) { guac_client_log(device->rdpdr->client, GUAC_LOG_ERROR, "Unable to fork PDF filter process: %s", strerror(errno)); close(stdin_pipe[0]); close(stdin_pipe[1]); close(stdout_pipe[0]); close(stdout_pipe[1]); return 1; } /* Child process */ if (child_pid == 0) { /* Close unneeded ends of pipe */ close(stdin_pipe[1]); close(stdout_pipe[0]); /* Reassign file descriptors as STDIN/STDOUT */ dup2(stdin_pipe[0], STDIN_FILENO); dup2(stdout_pipe[1], STDOUT_FILENO); /* Run PDF filter */ guac_client_log(device->rdpdr->client, GUAC_LOG_INFO, "Running %s", guac_rdpdr_pdf_filter_command[0]); if (execvp(guac_rdpdr_pdf_filter_command[0], guac_rdpdr_pdf_filter_command) < 0) guac_client_log(device->rdpdr->client, GUAC_LOG_ERROR, "Unable to execute PDF filter command: %s", strerror(errno)); else guac_client_log(device->rdpdr->client, GUAC_LOG_ERROR, "Unable to execute PDF filter command, but no error given"); /* Terminate child process */ exit(1); } /* Log fork success */ guac_client_log(device->rdpdr->client, GUAC_LOG_INFO, "Created PDF filter process PID=%i", child_pid); /* Close unneeded ends of pipe */ close(stdin_pipe[0]); close(stdout_pipe[1]); return 0; } void guac_rdpdr_process_print_job_create(guac_rdpdr_device* device, wStream* input_stream, int completion_id) { guac_rdpdr_printer_data* printer_data = (guac_rdpdr_printer_data*) device->data; wStream* output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 4); /* No bytes received yet */ printer_data->bytes_received = 0; Stream_Write_UINT32(output_stream, 0); /* fileId */ svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_process_print_job_write(guac_rdpdr_device* device, wStream* input_stream, int completion_id) { guac_rdpdr_printer_data* printer_data = (guac_rdpdr_printer_data*) device->data; int status=0, length; unsigned char* buffer; wStream* output_stream; Stream_Read_UINT32(input_stream, length); Stream_Seek(input_stream, 8); /* Offset */ Stream_Seek(input_stream, 20); /* Padding */ buffer = Stream_Pointer(input_stream); /* Create print job, if not yet created */ if (printer_data->bytes_received == 0) { char filename[1024] = "guacamole-print.pdf"; unsigned char* search = buffer; int i; /* Search for filename within buffer */ for (i=0; irdpdr->client, GUAC_LOG_INFO, "Print job created"); guac_protocol_send_file(device->rdpdr->client->socket, printer_data->stream, "application/pdf", filename); /* Start print process */ if (guac_rdpdr_create_print_process(device) != 0) { status = STATUS_DEVICE_OFF_LINE; length = 0; } } printer_data->bytes_received += length; /* If not yet failed, write received data */ if (status == 0) { /* Write data to printer, translate output for RDP */ length = write(printer_data->printer_input, buffer, length); if (length == -1) { guac_client_log(device->rdpdr->client, GUAC_LOG_ERROR, "Error writing to printer: %s", strerror(errno)); status = STATUS_DEVICE_OFF_LINE; length = 0; } } output_stream = guac_rdpdr_new_io_completion(device, completion_id, status, 5); Stream_Write_UINT32(output_stream, length); Stream_Write_UINT8(output_stream, 0); /* Padding */ svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } void guac_rdpdr_process_print_job_close(guac_rdpdr_device* device, wStream* input_stream, int completion_id) { guac_rdpdr_printer_data* printer_data = (guac_rdpdr_printer_data*) device->data; wStream* output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 1); Stream_Write_UINT32(output_stream, 0); /* padding*/ /* Close input and wait for output thread to finish */ close(printer_data->printer_input); pthread_join(printer_data->printer_output_thread, NULL); /* Close file descriptors */ close(printer_data->printer_output); /* Close file */ guac_client_log(device->rdpdr->client, GUAC_LOG_INFO, "Print job closed"); guac_protocol_send_end(device->rdpdr->client->socket, printer_data->stream); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); } static void guac_rdpdr_device_printer_announce_handler(guac_rdpdr_device* device, wStream* output_stream, int device_id) { /* Printer header */ guac_client_log(device->rdpdr->client, GUAC_LOG_INFO, "Sending printer"); Stream_Write_UINT32(output_stream, RDPDR_DTYP_PRINT); Stream_Write_UINT32(output_stream, device_id); Stream_Write(output_stream, "PRN1\0\0\0\0", 8); /* DOS name */ /* Printer data */ Stream_Write_UINT32(output_stream, 24 + GUAC_PRINTER_DRIVER_LENGTH + GUAC_PRINTER_NAME_LENGTH); Stream_Write_UINT32(output_stream, RDPDR_PRINTER_ANNOUNCE_FLAG_DEFAULTPRINTER | RDPDR_PRINTER_ANNOUNCE_FLAG_NETWORKPRINTER); Stream_Write_UINT32(output_stream, 0); /* reserved - must be 0 */ Stream_Write_UINT32(output_stream, 0); /* PnPName length (PnPName is ultimately ignored) */ Stream_Write_UINT32(output_stream, GUAC_PRINTER_DRIVER_LENGTH); /* DriverName length */ Stream_Write_UINT32(output_stream, GUAC_PRINTER_NAME_LENGTH); /* PrinterName length */ Stream_Write_UINT32(output_stream, 0); /* CachedFields length */ Stream_Write(output_stream, GUAC_PRINTER_DRIVER, GUAC_PRINTER_DRIVER_LENGTH); Stream_Write(output_stream, GUAC_PRINTER_NAME, GUAC_PRINTER_NAME_LENGTH); } static void guac_rdpdr_device_printer_iorequest_handler(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id, int major_func, int minor_func) { switch (major_func) { /* Print job create */ case IRP_MJ_CREATE: guac_rdpdr_process_print_job_create(device, input_stream, completion_id); break; /* Printer job write */ case IRP_MJ_WRITE: guac_rdpdr_process_print_job_write(device, input_stream, completion_id); break; /* Printer job close */ case IRP_MJ_CLOSE: guac_rdpdr_process_print_job_close(device, input_stream, completion_id); break; /* Log unknown */ default: guac_client_log(device->rdpdr->client, GUAC_LOG_ERROR, "Unknown printer I/O request function: 0x%x/0x%x", major_func, minor_func); } } static void guac_rdpdr_device_printer_free_handler(guac_rdpdr_device* device) { guac_rdpdr_printer_data* printer_data = (guac_rdpdr_printer_data*) device->data; guac_client_free_stream(device->rdpdr->client, printer_data->stream); free(device->data); } void guac_rdpdr_register_printer(guac_rdpdrPlugin* rdpdr) { int id = rdpdr->devices_registered++; /* Get new device */ guac_rdpdr_device* device = &(rdpdr->devices[id]); guac_rdpdr_printer_data* printer_data; /* Init device */ device->rdpdr = rdpdr; device->device_id = id; device->device_name = "Guacamole Printer"; /* Set handlers */ device->announce_handler = guac_rdpdr_device_printer_announce_handler; device->iorequest_handler = guac_rdpdr_device_printer_iorequest_handler; device->free_handler = guac_rdpdr_device_printer_free_handler; /* Init data */ printer_data = malloc(sizeof(guac_rdpdr_printer_data)); printer_data->stream = guac_client_alloc_stream(rdpdr->client); device->data = printer_data; } guacamole-server-0.9.9/src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.c0000664000175100017510000001325612626133327023134 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "rdpdr_fs_messages.h" #include "rdpdr_messages.h" #include "rdpdr_service.h" #include #include #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif static void guac_rdpdr_device_fs_announce_handler(guac_rdpdr_device* device, wStream* output_stream, int device_id) { /* Filesystem header */ guac_client_log(device->rdpdr->client, GUAC_LOG_INFO, "Sending filesystem"); Stream_Write_UINT32(output_stream, RDPDR_DTYP_FILESYSTEM); Stream_Write_UINT32(output_stream, device_id); Stream_Write(output_stream, "GUAC\0\0\0\0", 8); /* DOS name */ /* Filesystem data */ Stream_Write_UINT32(output_stream, GUAC_FILESYSTEM_NAME_LENGTH); Stream_Write(output_stream, GUAC_FILESYSTEM_NAME, GUAC_FILESYSTEM_NAME_LENGTH); } static void guac_rdpdr_device_fs_iorequest_handler(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id, int major_func, int minor_func) { switch (major_func) { /* File open */ case IRP_MJ_CREATE: guac_rdpdr_fs_process_create(device, input_stream, completion_id); break; /* File close */ case IRP_MJ_CLOSE: guac_rdpdr_fs_process_close(device, input_stream, file_id, completion_id); break; /* File read */ case IRP_MJ_READ: guac_rdpdr_fs_process_read(device, input_stream, file_id, completion_id); break; /* File write */ case IRP_MJ_WRITE: guac_rdpdr_fs_process_write(device, input_stream, file_id, completion_id); break; /* Device control request (Windows FSCTL_ control codes) */ case IRP_MJ_DEVICE_CONTROL: guac_rdpdr_fs_process_device_control(device, input_stream, file_id, completion_id); break; /* Query volume (drive) information */ case IRP_MJ_QUERY_VOLUME_INFORMATION: guac_rdpdr_fs_process_volume_info(device, input_stream, file_id, completion_id); break; /* Set volume (drive) information */ case IRP_MJ_SET_VOLUME_INFORMATION: guac_rdpdr_fs_process_set_volume_info(device, input_stream, file_id, completion_id); break; /* Query file information */ case IRP_MJ_QUERY_INFORMATION: guac_rdpdr_fs_process_file_info(device, input_stream, file_id, completion_id); break; /* Set file information */ case IRP_MJ_SET_INFORMATION: guac_rdpdr_fs_process_set_file_info(device, input_stream, file_id, completion_id); break; case IRP_MJ_DIRECTORY_CONTROL: /* Enumerate directory contents */ if (minor_func == IRP_MN_QUERY_DIRECTORY) guac_rdpdr_fs_process_query_directory(device, input_stream, file_id, completion_id); /* Request notification of changes to directory */ else if (minor_func == IRP_MN_NOTIFY_CHANGE_DIRECTORY) guac_rdpdr_fs_process_notify_change_directory(device, input_stream, file_id, completion_id); break; /* Lock/unlock portions of a file */ case IRP_MJ_LOCK_CONTROL: guac_rdpdr_fs_process_lock_control(device, input_stream, file_id, completion_id); break; default: guac_client_log(device->rdpdr->client, GUAC_LOG_ERROR, "Unknown filesystem I/O request function: 0x%x/0x%x", major_func, minor_func); } } static void guac_rdpdr_device_fs_free_handler(guac_rdpdr_device* device) { } void guac_rdpdr_register_fs(guac_rdpdrPlugin* rdpdr) { rdp_guac_client_data* data = (rdp_guac_client_data*) rdpdr->client->data; int id = rdpdr->devices_registered++; /* Get new device */ guac_rdpdr_device* device = &(rdpdr->devices[id]); /* Init device */ device->rdpdr = rdpdr; device->device_id = id; device->device_name = "Guacamole Filesystem"; /* Set handlers */ device->announce_handler = guac_rdpdr_device_fs_announce_handler; device->iorequest_handler = guac_rdpdr_device_fs_iorequest_handler; device->free_handler = guac_rdpdr_device_fs_free_handler; /* Init data */ device->data = data->filesystem; /* Announce filesystem to client */ guac_protocol_send_filesystem(rdpdr->client->socket, data->filesystem->object, "Shared Drive"); guac_socket_flush(rdpdr->client->socket); } guacamole-server-0.9.9/src/protocols/rdp/resolution.c0000664000175100017510000000440112643542623017674 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 "client.h" #include "resolution.h" #include int guac_rdp_resolution_reasonable(guac_client* client, int resolution) { int width = client->info.optimal_width; int height = client->info.optimal_height; /* Convert client pixels to remote pixels */ width = width * resolution / client->info.optimal_resolution; height = height * resolution / client->info.optimal_resolution; /* * Resolution is reasonable if the same as the client optimal resolution * OR if the resulting display area is reasonable */ return client->info.optimal_resolution == resolution || width*height >= GUAC_RDP_REASONABLE_AREA; } int guac_rdp_suggest_resolution(guac_client* client) { /* Prefer RDP's native resolution */ if (guac_rdp_resolution_reasonable(client, GUAC_RDP_NATIVE_RESOLUTION)) return GUAC_RDP_NATIVE_RESOLUTION; /* If native resolution is too tiny, try higher resolution */ if (guac_rdp_resolution_reasonable(client, GUAC_RDP_HIGH_RESOLUTION)) return GUAC_RDP_HIGH_RESOLUTION; /* Fallback to client-suggested resolution */ return client->info.optimal_resolution; } guacamole-server-0.9.9/src/protocols/rdp/compat/0000775000175100017510000000000012645400336016665 500000000000000guacamole-server-0.9.9/src/protocols/rdp/compat/winpr-stream.h0000664000175100017510000000565212536405625021423 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_WINPR_STREAM_COMPAT_H #define __GUAC_WINPR_STREAM_COMPAT_H #include "config.h" #include "winpr-wtypes.h" #include #include /* FreeRDP 1.0 streams */ #define Stream_Write stream_write #define Stream_Write_UINT8 stream_write_uint8 #define Stream_Write_UINT16 stream_write_uint16 #define Stream_Write_UINT32 stream_write_uint32 #define Stream_Write_UINT64 stream_write_uint64 #define Stream_Read stream_read #define Stream_Read_UINT8 stream_read_uint8 #define Stream_Read_UINT16 stream_read_uint16 #define Stream_Read_UINT32 stream_read_uint32 #define Stream_Read_UINT64 stream_read_uint64 #define Stream_Seek stream_seek #define Stream_Seek_UINT8 stream_seek_uint8 #define Stream_Seek_UINT16 stream_seek_uint16 #define Stream_Seek_UINT32 stream_seek_uint32 #define Stream_Seek_UINT64 stream_seek_uint64 #define Stream_GetPointer stream_get_mark #define Stream_EnsureRemainingCapacity stream_check_size #define Stream_Write stream_write #define Stream_Zero stream_write_zero #define Stream_Fill stream_set_byte #define Stream_GetPosition stream_get_pos #define Stream_SetPosition stream_set_pos #define Stream_SetPointer stream_set_mark #define Stream_Buffer stream_get_head #define Stream_Pointer stream_get_tail #define Stream_Length stream_get_size #define wStream STREAM #define wMessage RDP_EVENT wStream* Stream_New(BYTE* buffer, size_t size); void Stream_Free(wStream* s, BOOL bFreeBuffer); #endif guacamole-server-0.9.9/src/protocols/rdp/compat/winpr-stream.c0000664000175100017510000000305012536405625021404 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "winpr-stream.h" #include "winpr-wtypes.h" /* * NOTE: Because the old API did not support local allocation of the buffer * for each stream, these compatibility implementations ignore * the parameters of Stream_New() and Stream_Free() that provide them. */ wStream* Stream_New(BYTE* buffer, size_t size) { return stream_new(size); } void Stream_Free(wStream* s, BOOL bFreeBuffer) { stream_free(s); } guacamole-server-0.9.9/src/protocols/rdp/compat/client-cliprdr.h0000664000175100017510000000307412536405625021702 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_CLIENT_CLIPRDR_COMPAT_H #define __GUAC_CLIENT_CLIPRDR_COMPAT_H #include "config.h" #include #define CliprdrChannel_Class RDP_EVENT_CLASS_CLIPRDR #define CliprdrChannel_FormatList RDP_EVENT_TYPE_CB_FORMAT_LIST #define CliprdrChannel_MonitorReady RDP_EVENT_TYPE_CB_MONITOR_READY #define CliprdrChannel_DataRequest RDP_EVENT_TYPE_CB_DATA_REQUEST #define CliprdrChannel_DataResponse RDP_EVENT_TYPE_CB_DATA_RESPONSE #endif guacamole-server-0.9.9/src/protocols/rdp/compat/winpr-wtypes.h0000664000175100017510000000263012536405625021454 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_WINPR_WTYPES_COMPAT_H #define __GUAC_WINPR_WTYPES_COMPAT_H #include "config.h" #include typedef uint8 BYTE; typedef uint8 UINT8; typedef uint16 UINT16; typedef uint32 UINT32; typedef uint64 UINT64; typedef boolean BOOL; #define TRUE true #define FALSE false #endif guacamole-server-0.9.9/src/protocols/rdp/compat/rail.h0000664000175100017510000000370212536405625017714 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_RAIL_COMPAT_H #define __GUAC_RAIL_COMPAT_H #include "config.h" #include #define RailChannel_Class RDP_EVENT_CLASS_RAIL #define RailChannel_ClientSystemParam RDP_EVENT_TYPE_RAIL_CLIENT_SET_SYSPARAMS #define RailChannel_GetSystemParam RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS #define RailChannel_ServerExecuteResult RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS #define RailChannel_ServerSystemParam RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_SYSPARAM #define RailChannel_ServerMinMaxInfo RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_MINMAXINFO #define RailChannel_ServerLocalMoveSize RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_LOCALMOVESIZE #define RailChannel_ServerGetAppIdResponse RDP_EVENT_TYPE_RAIL_CHANNEL_APPID_RESP #define RailChannel_ServerLanguageBarInfo RDP_EVENT_TYPE_RAIL_CHANNEL_LANGBARINFO #endif guacamole-server-0.9.9/src/protocols/rdp/Makefile.in0000664000175100017510000035414112645400275017401 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Copyright (C) 2015 Glyptodon LLC # # 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. # VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ # Add compatibility layer for WinPR if not available @ENABLE_WINPR_FALSE@am__append_1 = compat/winpr-stream.h compat/winpr-wtypes.h @ENABLE_WINPR_FALSE@am__append_2 = compat/winpr-stream.c @ENABLE_WINPR_FALSE@am__append_3 = compat/winpr-stream.c @ENABLE_WINPR_FALSE@am__append_4 = compat/winpr-stream.c @ENABLE_WINPR_FALSE@am__append_5 = compat/winpr-stream.c # Add display update channel support, if supported by FreeRDP @ENABLE_DISPLAY_UPDATE_TRUE@am__append_6 = rdp_disp.h @ENABLE_DISPLAY_UPDATE_TRUE@am__append_7 = rdp_disp.c # # Optional SFTP support # @ENABLE_COMMON_SSH_TRUE@am__append_8 = sftp.c @ENABLE_COMMON_SSH_TRUE@am__append_9 = sftp.h @ENABLE_COMMON_SSH_TRUE@am__append_10 = @COMMON_SSH_LTLIB@ subdir = src/protocols/rdp DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(am__noinst_HEADERS_DIST) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(freerdpdir)" "$(DESTDIR)$(libdir)" LTLIBRARIES = $(freerdp_LTLIBRARIES) $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = @LEGACY_FREERDP_EXTENSIONS_FALSE@guacdr_client_la_DEPENDENCIES = \ @LEGACY_FREERDP_EXTENSIONS_FALSE@ $(am__DEPENDENCIES_1) am__guacdr_client_la_SOURCES_DIST = guac_rdpdr/rdpdr_fs_messages.c \ guac_rdpdr/rdpdr_fs_messages_dir_info.c \ guac_rdpdr/rdpdr_fs_messages_file_info.c \ guac_rdpdr/rdpdr_fs_messages_vol_info.c \ guac_rdpdr/rdpdr_fs_service.c guac_rdpdr/rdpdr_messages.c \ guac_rdpdr/rdpdr_printer.c guac_rdpdr/rdpdr_service.c rdp_fs.c \ rdp_stream.c unicode.c compat/winpr-stream.c am__dirstamp = $(am__leading_dot)dirstamp @ENABLE_WINPR_FALSE@am__objects_1 = \ @ENABLE_WINPR_FALSE@ compat/guacdr_client_la-winpr-stream.lo am__objects_2 = guac_rdpdr/guacdr_client_la-rdpdr_fs_messages.lo \ guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_dir_info.lo \ guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_file_info.lo \ guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_vol_info.lo \ guac_rdpdr/guacdr_client_la-rdpdr_fs_service.lo \ guac_rdpdr/guacdr_client_la-rdpdr_messages.lo \ guac_rdpdr/guacdr_client_la-rdpdr_printer.lo \ guac_rdpdr/guacdr_client_la-rdpdr_service.lo \ guacdr_client_la-rdp_fs.lo guacdr_client_la-rdp_stream.lo \ guacdr_client_la-unicode.lo $(am__objects_1) @LEGACY_FREERDP_EXTENSIONS_FALSE@am_guacdr_client_la_OBJECTS = \ @LEGACY_FREERDP_EXTENSIONS_FALSE@ $(am__objects_2) guacdr_client_la_OBJECTS = $(am_guacdr_client_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = guacdr_client_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(guacdr_client_la_CFLAGS) $(CFLAGS) \ $(guacdr_client_la_LDFLAGS) $(LDFLAGS) -o $@ @LEGACY_FREERDP_EXTENSIONS_FALSE@am_guacdr_client_la_rpath = -rpath \ @LEGACY_FREERDP_EXTENSIONS_FALSE@ $(freerdpdir) @LEGACY_FREERDP_EXTENSIONS_TRUE@guacdr_la_DEPENDENCIES = \ @LEGACY_FREERDP_EXTENSIONS_TRUE@ $(am__DEPENDENCIES_1) am__guacdr_la_SOURCES_DIST = guac_rdpdr/rdpdr_fs_messages.c \ guac_rdpdr/rdpdr_fs_messages_dir_info.c \ guac_rdpdr/rdpdr_fs_messages_file_info.c \ guac_rdpdr/rdpdr_fs_messages_vol_info.c \ guac_rdpdr/rdpdr_fs_service.c guac_rdpdr/rdpdr_messages.c \ guac_rdpdr/rdpdr_printer.c guac_rdpdr/rdpdr_service.c rdp_fs.c \ rdp_stream.c unicode.c compat/winpr-stream.c @ENABLE_WINPR_FALSE@am__objects_3 = compat/guacdr_la-winpr-stream.lo am__objects_4 = guac_rdpdr/guacdr_la-rdpdr_fs_messages.lo \ guac_rdpdr/guacdr_la-rdpdr_fs_messages_dir_info.lo \ guac_rdpdr/guacdr_la-rdpdr_fs_messages_file_info.lo \ guac_rdpdr/guacdr_la-rdpdr_fs_messages_vol_info.lo \ guac_rdpdr/guacdr_la-rdpdr_fs_service.lo \ guac_rdpdr/guacdr_la-rdpdr_messages.lo \ guac_rdpdr/guacdr_la-rdpdr_printer.lo \ guac_rdpdr/guacdr_la-rdpdr_service.lo guacdr_la-rdp_fs.lo \ guacdr_la-rdp_stream.lo guacdr_la-unicode.lo $(am__objects_3) @LEGACY_FREERDP_EXTENSIONS_TRUE@am_guacdr_la_OBJECTS = \ @LEGACY_FREERDP_EXTENSIONS_TRUE@ $(am__objects_4) guacdr_la_OBJECTS = $(am_guacdr_la_OBJECTS) guacdr_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(guacdr_la_CFLAGS) \ $(CFLAGS) $(guacdr_la_LDFLAGS) $(LDFLAGS) -o $@ @LEGACY_FREERDP_EXTENSIONS_TRUE@am_guacdr_la_rpath = -rpath \ @LEGACY_FREERDP_EXTENSIONS_TRUE@ $(freerdpdir) @LEGACY_FREERDP_EXTENSIONS_FALSE@guacsnd_client_la_DEPENDENCIES = \ @LEGACY_FREERDP_EXTENSIONS_FALSE@ $(am__DEPENDENCIES_1) am__guacsnd_client_la_SOURCES_DIST = guac_rdpsnd/rdpsnd_messages.c \ guac_rdpsnd/rdpsnd_service.c compat/winpr-stream.c @ENABLE_WINPR_FALSE@am__objects_5 = \ @ENABLE_WINPR_FALSE@ compat/guacsnd_client_la-winpr-stream.lo am__objects_6 = guac_rdpsnd/guacsnd_client_la-rdpsnd_messages.lo \ guac_rdpsnd/guacsnd_client_la-rdpsnd_service.lo \ $(am__objects_5) @LEGACY_FREERDP_EXTENSIONS_FALSE@am_guacsnd_client_la_OBJECTS = \ @LEGACY_FREERDP_EXTENSIONS_FALSE@ $(am__objects_6) guacsnd_client_la_OBJECTS = $(am_guacsnd_client_la_OBJECTS) guacsnd_client_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(guacsnd_client_la_CFLAGS) $(CFLAGS) \ $(guacsnd_client_la_LDFLAGS) $(LDFLAGS) -o $@ @LEGACY_FREERDP_EXTENSIONS_FALSE@am_guacsnd_client_la_rpath = -rpath \ @LEGACY_FREERDP_EXTENSIONS_FALSE@ $(freerdpdir) @LEGACY_FREERDP_EXTENSIONS_TRUE@guacsnd_la_DEPENDENCIES = \ @LEGACY_FREERDP_EXTENSIONS_TRUE@ $(am__DEPENDENCIES_1) am__guacsnd_la_SOURCES_DIST = guac_rdpsnd/rdpsnd_messages.c \ guac_rdpsnd/rdpsnd_service.c compat/winpr-stream.c @ENABLE_WINPR_FALSE@am__objects_7 = compat/guacsnd_la-winpr-stream.lo am__objects_8 = guac_rdpsnd/guacsnd_la-rdpsnd_messages.lo \ guac_rdpsnd/guacsnd_la-rdpsnd_service.lo $(am__objects_7) @LEGACY_FREERDP_EXTENSIONS_TRUE@am_guacsnd_la_OBJECTS = \ @LEGACY_FREERDP_EXTENSIONS_TRUE@ $(am__objects_8) guacsnd_la_OBJECTS = $(am_guacsnd_la_OBJECTS) guacsnd_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(guacsnd_la_CFLAGS) \ $(CFLAGS) $(guacsnd_la_LDFLAGS) $(LDFLAGS) -o $@ @LEGACY_FREERDP_EXTENSIONS_TRUE@am_guacsnd_la_rpath = -rpath \ @LEGACY_FREERDP_EXTENSIONS_TRUE@ $(freerdpdir) @LEGACY_FREERDP_EXTENSIONS_FALSE@guacsvc_client_la_DEPENDENCIES = \ @LEGACY_FREERDP_EXTENSIONS_FALSE@ $(am__DEPENDENCIES_1) am__guacsvc_client_la_SOURCES_DIST = guac_svc/svc_service.c rdp_svc.c \ compat/winpr-stream.c @ENABLE_WINPR_FALSE@am__objects_9 = \ @ENABLE_WINPR_FALSE@ compat/guacsvc_client_la-winpr-stream.lo am__objects_10 = guac_svc/guacsvc_client_la-svc_service.lo \ guacsvc_client_la-rdp_svc.lo $(am__objects_9) @LEGACY_FREERDP_EXTENSIONS_FALSE@am_guacsvc_client_la_OBJECTS = \ @LEGACY_FREERDP_EXTENSIONS_FALSE@ $(am__objects_10) guacsvc_client_la_OBJECTS = $(am_guacsvc_client_la_OBJECTS) guacsvc_client_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(guacsvc_client_la_CFLAGS) $(CFLAGS) \ $(guacsvc_client_la_LDFLAGS) $(LDFLAGS) -o $@ @LEGACY_FREERDP_EXTENSIONS_FALSE@am_guacsvc_client_la_rpath = -rpath \ @LEGACY_FREERDP_EXTENSIONS_FALSE@ $(freerdpdir) @LEGACY_FREERDP_EXTENSIONS_TRUE@guacsvc_la_DEPENDENCIES = \ @LEGACY_FREERDP_EXTENSIONS_TRUE@ $(am__DEPENDENCIES_1) am__guacsvc_la_SOURCES_DIST = guac_svc/svc_service.c rdp_svc.c \ compat/winpr-stream.c @ENABLE_WINPR_FALSE@am__objects_11 = \ @ENABLE_WINPR_FALSE@ compat/guacsvc_la-winpr-stream.lo am__objects_12 = guac_svc/guacsvc_la-svc_service.lo \ guacsvc_la-rdp_svc.lo $(am__objects_11) @LEGACY_FREERDP_EXTENSIONS_TRUE@am_guacsvc_la_OBJECTS = \ @LEGACY_FREERDP_EXTENSIONS_TRUE@ $(am__objects_12) guacsvc_la_OBJECTS = $(am_guacsvc_la_OBJECTS) guacsvc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(guacsvc_la_CFLAGS) \ $(CFLAGS) $(guacsvc_la_LDFLAGS) $(LDFLAGS) -o $@ @LEGACY_FREERDP_EXTENSIONS_TRUE@am_guacsvc_la_rpath = -rpath \ @LEGACY_FREERDP_EXTENSIONS_TRUE@ $(freerdpdir) libguac_client_rdp_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am__libguac_client_rdp_la_SOURCES_DIST = _generated_keymaps.c client.c \ guac_handlers.c rdp_bitmap.c rdp_cliprdr.c rdp_color.c \ rdp_fs.c rdp_gdi.c rdp_glyph.c rdp_keymap.c rdp_pointer.c \ rdp_rail.c rdp_settings.c rdp_stream.c rdp_svc.c resolution.c \ unicode.c compat/winpr-stream.c rdp_disp.c sftp.c @ENABLE_WINPR_FALSE@am__objects_13 = compat/libguac_client_rdp_la-winpr-stream.lo @ENABLE_DISPLAY_UPDATE_TRUE@am__objects_14 = \ @ENABLE_DISPLAY_UPDATE_TRUE@ libguac_client_rdp_la-rdp_disp.lo @ENABLE_COMMON_SSH_TRUE@am__objects_15 = \ @ENABLE_COMMON_SSH_TRUE@ libguac_client_rdp_la-sftp.lo am_libguac_client_rdp_la_OBJECTS = \ libguac_client_rdp_la-_generated_keymaps.lo \ libguac_client_rdp_la-client.lo \ libguac_client_rdp_la-guac_handlers.lo \ libguac_client_rdp_la-rdp_bitmap.lo \ libguac_client_rdp_la-rdp_cliprdr.lo \ libguac_client_rdp_la-rdp_color.lo \ libguac_client_rdp_la-rdp_fs.lo \ libguac_client_rdp_la-rdp_gdi.lo \ libguac_client_rdp_la-rdp_glyph.lo \ libguac_client_rdp_la-rdp_keymap.lo \ libguac_client_rdp_la-rdp_pointer.lo \ libguac_client_rdp_la-rdp_rail.lo \ libguac_client_rdp_la-rdp_settings.lo \ libguac_client_rdp_la-rdp_stream.lo \ libguac_client_rdp_la-rdp_svc.lo \ libguac_client_rdp_la-resolution.lo \ libguac_client_rdp_la-unicode.lo $(am__objects_13) \ $(am__objects_14) $(am__objects_15) libguac_client_rdp_la_OBJECTS = $(am_libguac_client_rdp_la_OBJECTS) libguac_client_rdp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) \ $(libguac_client_rdp_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(guacdr_client_la_SOURCES) $(guacdr_la_SOURCES) \ $(guacsnd_client_la_SOURCES) $(guacsnd_la_SOURCES) \ $(guacsvc_client_la_SOURCES) $(guacsvc_la_SOURCES) \ $(libguac_client_rdp_la_SOURCES) DIST_SOURCES = $(am__guacdr_client_la_SOURCES_DIST) \ $(am__guacdr_la_SOURCES_DIST) \ $(am__guacsnd_client_la_SOURCES_DIST) \ $(am__guacsnd_la_SOURCES_DIST) \ $(am__guacsvc_client_la_SOURCES_DIST) \ $(am__guacsvc_la_SOURCES_DIST) \ $(am__libguac_client_rdp_la_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__noinst_HEADERS_DIST = compat/client-cliprdr.h compat/rail.h \ guac_rdpdr/rdpdr_fs_messages.h \ guac_rdpdr/rdpdr_fs_messages_dir_info.h \ guac_rdpdr/rdpdr_fs_messages_file_info.h \ guac_rdpdr/rdpdr_fs_messages_vol_info.h \ guac_rdpdr/rdpdr_fs_service.h guac_rdpdr/rdpdr_messages.h \ guac_rdpdr/rdpdr_printer.h guac_rdpdr/rdpdr_service.h \ guac_rdpsnd/rdpsnd_messages.h guac_rdpsnd/rdpsnd_service.h \ guac_svc/svc_service.h client.h guac_handlers.h rdp_bitmap.h \ rdp_cliprdr.h rdp_color.h rdp_fs.h rdp_gdi.h rdp_glyph.h \ rdp_keymap.h rdp_pointer.h rdp_rail.h rdp_settings.h \ rdp_status.h rdp_stream.h rdp_svc.h resolution.h unicode.h \ compat/winpr-stream.h compat/winpr-wtypes.h rdp_disp.h sftp.h HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COMMON_INCLUDE = @COMMON_INCLUDE@ COMMON_LTLIB = @COMMON_LTLIB@ COMMON_SSH_INCLUDE = @COMMON_SSH_INCLUDE@ COMMON_SSH_LTLIB = @COMMON_SSH_LTLIB@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CUNIT_LIBS = @CUNIT_LIBS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBADD_DLOPEN = @LIBADD_DLOPEN@ LIBGUAC_INCLUDE = @LIBGUAC_INCLUDE@ LIBGUAC_LTLIB = @LIBGUAC_LTLIB@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MATH_LIBS = @MATH_LIBS@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@ PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@ PANGO_CFLAGS = @PANGO_CFLAGS@ PANGO_LIBS = @PANGO_LIBS@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_LIBS = @PNG_LIBS@ PTHREAD_LIBS = @PTHREAD_LIBS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ RDP_LIBS = @RDP_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSH_LIBS = @SSH_LIBS@ SSL_LIBS = @SSL_LIBS@ STRIP = @STRIP@ TELNET_LIBS = @TELNET_LIBS@ TERMINAL_INCLUDE = @TERMINAL_INCLUDE@ TERMINAL_LTLIB = @TERMINAL_LTLIB@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VNC_LIBS = @VNC_LIBS@ VORBIS_LIBS = @VORBIS_LIBS@ WEBP_LIBS = @WEBP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ init_dir = @init_dir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 lib_LTLIBRARIES = libguac-client-rdp.la libguac_client_rdp_la_SOURCES = _generated_keymaps.c client.c \ guac_handlers.c rdp_bitmap.c rdp_cliprdr.c rdp_color.c \ rdp_fs.c rdp_gdi.c rdp_glyph.c rdp_keymap.c rdp_pointer.c \ rdp_rail.c rdp_settings.c rdp_stream.c rdp_svc.c resolution.c \ unicode.c $(am__append_2) $(am__append_7) $(am__append_8) guacsvc_sources = guac_svc/svc_service.c rdp_svc.c $(am__append_3) guacsnd_sources = guac_rdpsnd/rdpsnd_messages.c \ guac_rdpsnd/rdpsnd_service.c $(am__append_4) guacdr_sources = guac_rdpdr/rdpdr_fs_messages.c \ guac_rdpdr/rdpdr_fs_messages_dir_info.c \ guac_rdpdr/rdpdr_fs_messages_file_info.c \ guac_rdpdr/rdpdr_fs_messages_vol_info.c \ guac_rdpdr/rdpdr_fs_service.c guac_rdpdr/rdpdr_messages.c \ guac_rdpdr/rdpdr_printer.c guac_rdpdr/rdpdr_service.c rdp_fs.c \ rdp_stream.c unicode.c $(am__append_5) noinst_HEADERS = compat/client-cliprdr.h compat/rail.h \ guac_rdpdr/rdpdr_fs_messages.h \ guac_rdpdr/rdpdr_fs_messages_dir_info.h \ guac_rdpdr/rdpdr_fs_messages_file_info.h \ guac_rdpdr/rdpdr_fs_messages_vol_info.h \ guac_rdpdr/rdpdr_fs_service.h guac_rdpdr/rdpdr_messages.h \ guac_rdpdr/rdpdr_printer.h guac_rdpdr/rdpdr_service.h \ guac_rdpsnd/rdpsnd_messages.h guac_rdpsnd/rdpsnd_service.h \ guac_svc/svc_service.h client.h guac_handlers.h rdp_bitmap.h \ rdp_cliprdr.h rdp_color.h rdp_fs.h rdp_gdi.h rdp_glyph.h \ rdp_keymap.h rdp_pointer.h rdp_rail.h rdp_settings.h \ rdp_status.h rdp_stream.h rdp_svc.h resolution.h unicode.h \ $(am__append_1) $(am__append_6) $(am__append_9) # # Main RDP client library # libguac_client_rdp_la_CFLAGS = \ -Werror -Wall -Iinclude \ @COMMON_INCLUDE@ \ @COMMON_SSH_INCLUDE@ \ @LIBGUAC_INCLUDE@ libguac_client_rdp_la_LDFLAGS = \ -version-info 0:0:0 \ @CAIRO_LIBS@ \ @PTHREAD_LIBS@ \ @RDP_LIBS@ libguac_client_rdp_la_LIBADD = @COMMON_LTLIB@ @LIBGUAC_LTLIB@ \ $(am__append_10) # # RDPDR # guacdr_cflags = \ -Werror -Wall -Iinclude \ @COMMON_INCLUDE@ \ @COMMON_SSH_INCLUDE@ \ @LIBGUAC_INCLUDE@ guacdr_ldflags = \ -module -avoid-version -shared \ @PTHREAD_LIBS@ \ @RDP_LIBS@ guacdr_libadd = \ @COMMON_LTLIB@ \ @LIBGUAC_LTLIB@ # # RDPSND # guacsnd_cflags = \ -Werror -Wall -Iinclude \ @COMMON_INCLUDE@ \ @COMMON_SSH_INCLUDE@ \ @LIBGUAC_INCLUDE@ guacsnd_ldflags = \ -module -avoid-version -shared \ @PTHREAD_LIBS@ \ @RDP_LIBS@ guacsnd_libadd = \ @COMMON_LTLIB@ \ @LIBGUAC_LTLIB@ # # Static Virtual Channels # guacsvc_cflags = \ -Werror -Wall -Iinclude \ @COMMON_INCLUDE@ \ @COMMON_SSH_INCLUDE@ \ @LIBGUAC_INCLUDE@ guacsvc_ldflags = \ -module -avoid-version -shared \ @PTHREAD_LIBS@ \ @RDP_LIBS@ guacsvc_libadd = \ @COMMON_LTLIB@ \ @LIBGUAC_LTLIB@ # # Autogenerate keymaps # CLEANFILES = _generated_keymaps.c BUILT_SOURCES = _generated_keymaps.c rdp_keymaps = \ keymaps/base.keymap \ keymaps/failsafe.keymap \ keymaps/de_de_qwertz.keymap \ keymaps/en_us_qwerty.keymap \ keymaps/fr_fr_azerty.keymap \ keymaps/it_it_qwerty.keymap \ keymaps/sv_se_qwerty.keymap EXTRA_DIST = \ $(rdp_keymaps) \ keymaps/generate.pl # FreeRDP 1.1 (and hopefully onward) extensions @LEGACY_FREERDP_EXTENSIONS_FALSE@freerdp_LTLIBRARIES = \ @LEGACY_FREERDP_EXTENSIONS_FALSE@ guacdr-client.la \ @LEGACY_FREERDP_EXTENSIONS_FALSE@ guacsnd-client.la \ @LEGACY_FREERDP_EXTENSIONS_FALSE@ guacsvc-client.la # FreeRDP 1.0-style extensions @LEGACY_FREERDP_EXTENSIONS_TRUE@freerdp_LTLIBRARIES = \ @LEGACY_FREERDP_EXTENSIONS_TRUE@ guacdr.la \ @LEGACY_FREERDP_EXTENSIONS_TRUE@ guacsnd.la \ @LEGACY_FREERDP_EXTENSIONS_TRUE@ guacsvc.la @LEGACY_FREERDP_EXTENSIONS_TRUE@guacdr_la_SOURCES = ${guacdr_sources} @LEGACY_FREERDP_EXTENSIONS_TRUE@guacdr_la_CFLAGS = ${guacdr_cflags} @LEGACY_FREERDP_EXTENSIONS_TRUE@guacdr_la_LDFLAGS = ${guacdr_ldflags} @LEGACY_FREERDP_EXTENSIONS_TRUE@guacdr_la_LIBADD = ${guacdr_libadd} @LEGACY_FREERDP_EXTENSIONS_TRUE@guacsnd_la_SOURCES = ${guacsnd_sources} @LEGACY_FREERDP_EXTENSIONS_TRUE@guacsnd_la_CFLAGS = ${guacsnd_cflags} @LEGACY_FREERDP_EXTENSIONS_TRUE@guacsnd_la_LDFLAGS = ${guacsnd_ldflags} @LEGACY_FREERDP_EXTENSIONS_TRUE@guacsnd_la_LIBADD = ${guacsnd_libadd} @LEGACY_FREERDP_EXTENSIONS_TRUE@guacsvc_la_SOURCES = ${guacsvc_sources} @LEGACY_FREERDP_EXTENSIONS_TRUE@guacsvc_la_CFLAGS = ${guacsvc_cflags} @LEGACY_FREERDP_EXTENSIONS_TRUE@guacsvc_la_LDFLAGS = ${guacsvc_ldflags} @LEGACY_FREERDP_EXTENSIONS_TRUE@guacsvc_la_LIBADD = ${guacsvc_libadd} @LEGACY_FREERDP_EXTENSIONS_FALSE@guacdr_client_la_SOURCES = ${guacdr_sources} @LEGACY_FREERDP_EXTENSIONS_FALSE@guacdr_client_la_CFLAGS = ${guacdr_cflags} @LEGACY_FREERDP_EXTENSIONS_FALSE@guacdr_client_la_LDFLAGS = ${guacdr_ldflags} @LEGACY_FREERDP_EXTENSIONS_FALSE@guacdr_client_la_LIBADD = ${guacdr_libadd} @LEGACY_FREERDP_EXTENSIONS_FALSE@guacsnd_client_la_SOURCES = ${guacsnd_sources} @LEGACY_FREERDP_EXTENSIONS_FALSE@guacsnd_client_la_CFLAGS = ${guacsnd_cflags} @LEGACY_FREERDP_EXTENSIONS_FALSE@guacsnd_client_la_LDFLAGS = ${guacsnd_ldflags} @LEGACY_FREERDP_EXTENSIONS_FALSE@guacsnd_client_la_LIBADD = ${guacsnd_libadd} @LEGACY_FREERDP_EXTENSIONS_FALSE@guacsvc_client_la_SOURCES = ${guacsvc_sources} @LEGACY_FREERDP_EXTENSIONS_FALSE@guacsvc_client_la_CFLAGS = ${guacsvc_cflags} @LEGACY_FREERDP_EXTENSIONS_FALSE@guacsvc_client_la_LDFLAGS = ${guacsvc_ldflags} @LEGACY_FREERDP_EXTENSIONS_FALSE@guacsvc_client_la_LIBADD = ${guacsvc_libadd} freerdpdir = ${libdir}/freerdp all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/protocols/rdp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/protocols/rdp/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-freerdpLTLIBRARIES: $(freerdp_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(freerdp_LTLIBRARIES)'; test -n "$(freerdpdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(freerdpdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(freerdpdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(freerdpdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(freerdpdir)"; \ } uninstall-freerdpLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(freerdp_LTLIBRARIES)'; test -n "$(freerdpdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(freerdpdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(freerdpdir)/$$f"; \ done clean-freerdpLTLIBRARIES: -test -z "$(freerdp_LTLIBRARIES)" || rm -f $(freerdp_LTLIBRARIES) @list='$(freerdp_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } guac_rdpdr/$(am__dirstamp): @$(MKDIR_P) guac_rdpdr @: > guac_rdpdr/$(am__dirstamp) guac_rdpdr/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) guac_rdpdr/$(DEPDIR) @: > guac_rdpdr/$(DEPDIR)/$(am__dirstamp) guac_rdpdr/guacdr_client_la-rdpdr_fs_messages.lo: \ guac_rdpdr/$(am__dirstamp) \ guac_rdpdr/$(DEPDIR)/$(am__dirstamp) guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_dir_info.lo: \ guac_rdpdr/$(am__dirstamp) \ guac_rdpdr/$(DEPDIR)/$(am__dirstamp) guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_file_info.lo: \ guac_rdpdr/$(am__dirstamp) \ guac_rdpdr/$(DEPDIR)/$(am__dirstamp) guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_vol_info.lo: \ guac_rdpdr/$(am__dirstamp) \ guac_rdpdr/$(DEPDIR)/$(am__dirstamp) guac_rdpdr/guacdr_client_la-rdpdr_fs_service.lo: \ guac_rdpdr/$(am__dirstamp) \ guac_rdpdr/$(DEPDIR)/$(am__dirstamp) guac_rdpdr/guacdr_client_la-rdpdr_messages.lo: \ guac_rdpdr/$(am__dirstamp) \ guac_rdpdr/$(DEPDIR)/$(am__dirstamp) guac_rdpdr/guacdr_client_la-rdpdr_printer.lo: \ guac_rdpdr/$(am__dirstamp) \ guac_rdpdr/$(DEPDIR)/$(am__dirstamp) guac_rdpdr/guacdr_client_la-rdpdr_service.lo: \ guac_rdpdr/$(am__dirstamp) \ guac_rdpdr/$(DEPDIR)/$(am__dirstamp) compat/$(am__dirstamp): @$(MKDIR_P) compat @: > compat/$(am__dirstamp) compat/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) compat/$(DEPDIR) @: > compat/$(DEPDIR)/$(am__dirstamp) compat/guacdr_client_la-winpr-stream.lo: compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) guacdr-client.la: $(guacdr_client_la_OBJECTS) $(guacdr_client_la_DEPENDENCIES) $(EXTRA_guacdr_client_la_DEPENDENCIES) $(AM_V_CCLD)$(guacdr_client_la_LINK) $(am_guacdr_client_la_rpath) $(guacdr_client_la_OBJECTS) $(guacdr_client_la_LIBADD) $(LIBS) guac_rdpdr/guacdr_la-rdpdr_fs_messages.lo: guac_rdpdr/$(am__dirstamp) \ guac_rdpdr/$(DEPDIR)/$(am__dirstamp) guac_rdpdr/guacdr_la-rdpdr_fs_messages_dir_info.lo: \ guac_rdpdr/$(am__dirstamp) \ guac_rdpdr/$(DEPDIR)/$(am__dirstamp) guac_rdpdr/guacdr_la-rdpdr_fs_messages_file_info.lo: \ guac_rdpdr/$(am__dirstamp) \ guac_rdpdr/$(DEPDIR)/$(am__dirstamp) guac_rdpdr/guacdr_la-rdpdr_fs_messages_vol_info.lo: \ guac_rdpdr/$(am__dirstamp) \ guac_rdpdr/$(DEPDIR)/$(am__dirstamp) guac_rdpdr/guacdr_la-rdpdr_fs_service.lo: guac_rdpdr/$(am__dirstamp) \ guac_rdpdr/$(DEPDIR)/$(am__dirstamp) guac_rdpdr/guacdr_la-rdpdr_messages.lo: guac_rdpdr/$(am__dirstamp) \ guac_rdpdr/$(DEPDIR)/$(am__dirstamp) guac_rdpdr/guacdr_la-rdpdr_printer.lo: guac_rdpdr/$(am__dirstamp) \ guac_rdpdr/$(DEPDIR)/$(am__dirstamp) guac_rdpdr/guacdr_la-rdpdr_service.lo: guac_rdpdr/$(am__dirstamp) \ guac_rdpdr/$(DEPDIR)/$(am__dirstamp) compat/guacdr_la-winpr-stream.lo: compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) guacdr.la: $(guacdr_la_OBJECTS) $(guacdr_la_DEPENDENCIES) $(EXTRA_guacdr_la_DEPENDENCIES) $(AM_V_CCLD)$(guacdr_la_LINK) $(am_guacdr_la_rpath) $(guacdr_la_OBJECTS) $(guacdr_la_LIBADD) $(LIBS) guac_rdpsnd/$(am__dirstamp): @$(MKDIR_P) guac_rdpsnd @: > guac_rdpsnd/$(am__dirstamp) guac_rdpsnd/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) guac_rdpsnd/$(DEPDIR) @: > guac_rdpsnd/$(DEPDIR)/$(am__dirstamp) guac_rdpsnd/guacsnd_client_la-rdpsnd_messages.lo: \ guac_rdpsnd/$(am__dirstamp) \ guac_rdpsnd/$(DEPDIR)/$(am__dirstamp) guac_rdpsnd/guacsnd_client_la-rdpsnd_service.lo: \ guac_rdpsnd/$(am__dirstamp) \ guac_rdpsnd/$(DEPDIR)/$(am__dirstamp) compat/guacsnd_client_la-winpr-stream.lo: compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) guacsnd-client.la: $(guacsnd_client_la_OBJECTS) $(guacsnd_client_la_DEPENDENCIES) $(EXTRA_guacsnd_client_la_DEPENDENCIES) $(AM_V_CCLD)$(guacsnd_client_la_LINK) $(am_guacsnd_client_la_rpath) $(guacsnd_client_la_OBJECTS) $(guacsnd_client_la_LIBADD) $(LIBS) guac_rdpsnd/guacsnd_la-rdpsnd_messages.lo: \ guac_rdpsnd/$(am__dirstamp) \ guac_rdpsnd/$(DEPDIR)/$(am__dirstamp) guac_rdpsnd/guacsnd_la-rdpsnd_service.lo: guac_rdpsnd/$(am__dirstamp) \ guac_rdpsnd/$(DEPDIR)/$(am__dirstamp) compat/guacsnd_la-winpr-stream.lo: compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) guacsnd.la: $(guacsnd_la_OBJECTS) $(guacsnd_la_DEPENDENCIES) $(EXTRA_guacsnd_la_DEPENDENCIES) $(AM_V_CCLD)$(guacsnd_la_LINK) $(am_guacsnd_la_rpath) $(guacsnd_la_OBJECTS) $(guacsnd_la_LIBADD) $(LIBS) guac_svc/$(am__dirstamp): @$(MKDIR_P) guac_svc @: > guac_svc/$(am__dirstamp) guac_svc/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) guac_svc/$(DEPDIR) @: > guac_svc/$(DEPDIR)/$(am__dirstamp) guac_svc/guacsvc_client_la-svc_service.lo: guac_svc/$(am__dirstamp) \ guac_svc/$(DEPDIR)/$(am__dirstamp) compat/guacsvc_client_la-winpr-stream.lo: compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) guacsvc-client.la: $(guacsvc_client_la_OBJECTS) $(guacsvc_client_la_DEPENDENCIES) $(EXTRA_guacsvc_client_la_DEPENDENCIES) $(AM_V_CCLD)$(guacsvc_client_la_LINK) $(am_guacsvc_client_la_rpath) $(guacsvc_client_la_OBJECTS) $(guacsvc_client_la_LIBADD) $(LIBS) guac_svc/guacsvc_la-svc_service.lo: guac_svc/$(am__dirstamp) \ guac_svc/$(DEPDIR)/$(am__dirstamp) compat/guacsvc_la-winpr-stream.lo: compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) guacsvc.la: $(guacsvc_la_OBJECTS) $(guacsvc_la_DEPENDENCIES) $(EXTRA_guacsvc_la_DEPENDENCIES) $(AM_V_CCLD)$(guacsvc_la_LINK) $(am_guacsvc_la_rpath) $(guacsvc_la_OBJECTS) $(guacsvc_la_LIBADD) $(LIBS) compat/libguac_client_rdp_la-winpr-stream.lo: compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) libguac-client-rdp.la: $(libguac_client_rdp_la_OBJECTS) $(libguac_client_rdp_la_DEPENDENCIES) $(EXTRA_libguac_client_rdp_la_DEPENDENCIES) $(AM_V_CCLD)$(libguac_client_rdp_la_LINK) -rpath $(libdir) $(libguac_client_rdp_la_OBJECTS) $(libguac_client_rdp_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f compat/*.$(OBJEXT) -rm -f compat/*.lo -rm -f guac_rdpdr/*.$(OBJEXT) -rm -f guac_rdpdr/*.lo -rm -f guac_rdpsnd/*.$(OBJEXT) -rm -f guac_rdpsnd/*.lo -rm -f guac_svc/*.$(OBJEXT) -rm -f guac_svc/*.lo distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guacdr_client_la-rdp_fs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guacdr_client_la-rdp_stream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guacdr_client_la-unicode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guacdr_la-rdp_fs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guacdr_la-rdp_stream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guacdr_la-unicode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guacsvc_client_la-rdp_svc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guacsvc_la-rdp_svc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-_generated_keymaps.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-client.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-guac_handlers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-rdp_bitmap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-rdp_cliprdr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-rdp_color.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-rdp_disp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-rdp_fs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-rdp_gdi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-rdp_glyph.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-rdp_keymap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-rdp_pointer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-rdp_rail.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-rdp_settings.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-rdp_stream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-rdp_svc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-resolution.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-sftp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_client_rdp_la-unicode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/guacdr_client_la-winpr-stream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/guacdr_la-winpr-stream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/guacsnd_client_la-winpr-stream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/guacsnd_la-winpr-stream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/guacsvc_client_la-winpr-stream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/guacsvc_la-winpr-stream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/libguac_client_rdp_la-winpr-stream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_messages.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_messages_dir_info.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_messages_file_info.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_messages_vol_info.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_service.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_messages.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_printer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_service.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_messages.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_messages_dir_info.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_messages_file_info.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_messages_vol_info.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_service.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_messages.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_printer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_service.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpsnd/$(DEPDIR)/guacsnd_client_la-rdpsnd_messages.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpsnd/$(DEPDIR)/guacsnd_client_la-rdpsnd_service.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpsnd/$(DEPDIR)/guacsnd_la-rdpsnd_messages.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_rdpsnd/$(DEPDIR)/guacsnd_la-rdpsnd_service.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_svc/$(DEPDIR)/guacsvc_client_la-svc_service.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@guac_svc/$(DEPDIR)/guacsvc_la-svc_service.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< guac_rdpdr/guacdr_client_la-rdpdr_fs_messages.lo: guac_rdpdr/rdpdr_fs_messages.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -MT guac_rdpdr/guacdr_client_la-rdpdr_fs_messages.lo -MD -MP -MF guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_messages.Tpo -c -o guac_rdpdr/guacdr_client_la-rdpdr_fs_messages.lo `test -f 'guac_rdpdr/rdpdr_fs_messages.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_messages.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_messages.Tpo guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_messages.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpdr/rdpdr_fs_messages.c' object='guac_rdpdr/guacdr_client_la-rdpdr_fs_messages.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -c -o guac_rdpdr/guacdr_client_la-rdpdr_fs_messages.lo `test -f 'guac_rdpdr/rdpdr_fs_messages.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_messages.c guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_dir_info.lo: guac_rdpdr/rdpdr_fs_messages_dir_info.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -MT guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_dir_info.lo -MD -MP -MF guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_messages_dir_info.Tpo -c -o guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_dir_info.lo `test -f 'guac_rdpdr/rdpdr_fs_messages_dir_info.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_messages_dir_info.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_messages_dir_info.Tpo guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_messages_dir_info.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpdr/rdpdr_fs_messages_dir_info.c' object='guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_dir_info.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -c -o guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_dir_info.lo `test -f 'guac_rdpdr/rdpdr_fs_messages_dir_info.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_messages_dir_info.c guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_file_info.lo: guac_rdpdr/rdpdr_fs_messages_file_info.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -MT guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_file_info.lo -MD -MP -MF guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_messages_file_info.Tpo -c -o guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_file_info.lo `test -f 'guac_rdpdr/rdpdr_fs_messages_file_info.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_messages_file_info.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_messages_file_info.Tpo guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_messages_file_info.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpdr/rdpdr_fs_messages_file_info.c' object='guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_file_info.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -c -o guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_file_info.lo `test -f 'guac_rdpdr/rdpdr_fs_messages_file_info.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_messages_file_info.c guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_vol_info.lo: guac_rdpdr/rdpdr_fs_messages_vol_info.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -MT guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_vol_info.lo -MD -MP -MF guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_messages_vol_info.Tpo -c -o guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_vol_info.lo `test -f 'guac_rdpdr/rdpdr_fs_messages_vol_info.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_messages_vol_info.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_messages_vol_info.Tpo guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_messages_vol_info.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpdr/rdpdr_fs_messages_vol_info.c' object='guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_vol_info.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -c -o guac_rdpdr/guacdr_client_la-rdpdr_fs_messages_vol_info.lo `test -f 'guac_rdpdr/rdpdr_fs_messages_vol_info.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_messages_vol_info.c guac_rdpdr/guacdr_client_la-rdpdr_fs_service.lo: guac_rdpdr/rdpdr_fs_service.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -MT guac_rdpdr/guacdr_client_la-rdpdr_fs_service.lo -MD -MP -MF guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_service.Tpo -c -o guac_rdpdr/guacdr_client_la-rdpdr_fs_service.lo `test -f 'guac_rdpdr/rdpdr_fs_service.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_service.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_service.Tpo guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_fs_service.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpdr/rdpdr_fs_service.c' object='guac_rdpdr/guacdr_client_la-rdpdr_fs_service.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -c -o guac_rdpdr/guacdr_client_la-rdpdr_fs_service.lo `test -f 'guac_rdpdr/rdpdr_fs_service.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_service.c guac_rdpdr/guacdr_client_la-rdpdr_messages.lo: guac_rdpdr/rdpdr_messages.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -MT guac_rdpdr/guacdr_client_la-rdpdr_messages.lo -MD -MP -MF guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_messages.Tpo -c -o guac_rdpdr/guacdr_client_la-rdpdr_messages.lo `test -f 'guac_rdpdr/rdpdr_messages.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_messages.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_messages.Tpo guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_messages.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpdr/rdpdr_messages.c' object='guac_rdpdr/guacdr_client_la-rdpdr_messages.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -c -o guac_rdpdr/guacdr_client_la-rdpdr_messages.lo `test -f 'guac_rdpdr/rdpdr_messages.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_messages.c guac_rdpdr/guacdr_client_la-rdpdr_printer.lo: guac_rdpdr/rdpdr_printer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -MT guac_rdpdr/guacdr_client_la-rdpdr_printer.lo -MD -MP -MF guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_printer.Tpo -c -o guac_rdpdr/guacdr_client_la-rdpdr_printer.lo `test -f 'guac_rdpdr/rdpdr_printer.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_printer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_printer.Tpo guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_printer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpdr/rdpdr_printer.c' object='guac_rdpdr/guacdr_client_la-rdpdr_printer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -c -o guac_rdpdr/guacdr_client_la-rdpdr_printer.lo `test -f 'guac_rdpdr/rdpdr_printer.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_printer.c guac_rdpdr/guacdr_client_la-rdpdr_service.lo: guac_rdpdr/rdpdr_service.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -MT guac_rdpdr/guacdr_client_la-rdpdr_service.lo -MD -MP -MF guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_service.Tpo -c -o guac_rdpdr/guacdr_client_la-rdpdr_service.lo `test -f 'guac_rdpdr/rdpdr_service.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_service.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_service.Tpo guac_rdpdr/$(DEPDIR)/guacdr_client_la-rdpdr_service.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpdr/rdpdr_service.c' object='guac_rdpdr/guacdr_client_la-rdpdr_service.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -c -o guac_rdpdr/guacdr_client_la-rdpdr_service.lo `test -f 'guac_rdpdr/rdpdr_service.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_service.c guacdr_client_la-rdp_fs.lo: rdp_fs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -MT guacdr_client_la-rdp_fs.lo -MD -MP -MF $(DEPDIR)/guacdr_client_la-rdp_fs.Tpo -c -o guacdr_client_la-rdp_fs.lo `test -f 'rdp_fs.c' || echo '$(srcdir)/'`rdp_fs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacdr_client_la-rdp_fs.Tpo $(DEPDIR)/guacdr_client_la-rdp_fs.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_fs.c' object='guacdr_client_la-rdp_fs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -c -o guacdr_client_la-rdp_fs.lo `test -f 'rdp_fs.c' || echo '$(srcdir)/'`rdp_fs.c guacdr_client_la-rdp_stream.lo: rdp_stream.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -MT guacdr_client_la-rdp_stream.lo -MD -MP -MF $(DEPDIR)/guacdr_client_la-rdp_stream.Tpo -c -o guacdr_client_la-rdp_stream.lo `test -f 'rdp_stream.c' || echo '$(srcdir)/'`rdp_stream.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacdr_client_la-rdp_stream.Tpo $(DEPDIR)/guacdr_client_la-rdp_stream.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_stream.c' object='guacdr_client_la-rdp_stream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -c -o guacdr_client_la-rdp_stream.lo `test -f 'rdp_stream.c' || echo '$(srcdir)/'`rdp_stream.c guacdr_client_la-unicode.lo: unicode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -MT guacdr_client_la-unicode.lo -MD -MP -MF $(DEPDIR)/guacdr_client_la-unicode.Tpo -c -o guacdr_client_la-unicode.lo `test -f 'unicode.c' || echo '$(srcdir)/'`unicode.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacdr_client_la-unicode.Tpo $(DEPDIR)/guacdr_client_la-unicode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unicode.c' object='guacdr_client_la-unicode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -c -o guacdr_client_la-unicode.lo `test -f 'unicode.c' || echo '$(srcdir)/'`unicode.c compat/guacdr_client_la-winpr-stream.lo: compat/winpr-stream.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -MT compat/guacdr_client_la-winpr-stream.lo -MD -MP -MF compat/$(DEPDIR)/guacdr_client_la-winpr-stream.Tpo -c -o compat/guacdr_client_la-winpr-stream.lo `test -f 'compat/winpr-stream.c' || echo '$(srcdir)/'`compat/winpr-stream.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/guacdr_client_la-winpr-stream.Tpo compat/$(DEPDIR)/guacdr_client_la-winpr-stream.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/winpr-stream.c' object='compat/guacdr_client_la-winpr-stream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_client_la_CFLAGS) $(CFLAGS) -c -o compat/guacdr_client_la-winpr-stream.lo `test -f 'compat/winpr-stream.c' || echo '$(srcdir)/'`compat/winpr-stream.c guac_rdpdr/guacdr_la-rdpdr_fs_messages.lo: guac_rdpdr/rdpdr_fs_messages.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -MT guac_rdpdr/guacdr_la-rdpdr_fs_messages.lo -MD -MP -MF guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_messages.Tpo -c -o guac_rdpdr/guacdr_la-rdpdr_fs_messages.lo `test -f 'guac_rdpdr/rdpdr_fs_messages.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_messages.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_messages.Tpo guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_messages.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpdr/rdpdr_fs_messages.c' object='guac_rdpdr/guacdr_la-rdpdr_fs_messages.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -c -o guac_rdpdr/guacdr_la-rdpdr_fs_messages.lo `test -f 'guac_rdpdr/rdpdr_fs_messages.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_messages.c guac_rdpdr/guacdr_la-rdpdr_fs_messages_dir_info.lo: guac_rdpdr/rdpdr_fs_messages_dir_info.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -MT guac_rdpdr/guacdr_la-rdpdr_fs_messages_dir_info.lo -MD -MP -MF guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_messages_dir_info.Tpo -c -o guac_rdpdr/guacdr_la-rdpdr_fs_messages_dir_info.lo `test -f 'guac_rdpdr/rdpdr_fs_messages_dir_info.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_messages_dir_info.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_messages_dir_info.Tpo guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_messages_dir_info.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpdr/rdpdr_fs_messages_dir_info.c' object='guac_rdpdr/guacdr_la-rdpdr_fs_messages_dir_info.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -c -o guac_rdpdr/guacdr_la-rdpdr_fs_messages_dir_info.lo `test -f 'guac_rdpdr/rdpdr_fs_messages_dir_info.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_messages_dir_info.c guac_rdpdr/guacdr_la-rdpdr_fs_messages_file_info.lo: guac_rdpdr/rdpdr_fs_messages_file_info.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -MT guac_rdpdr/guacdr_la-rdpdr_fs_messages_file_info.lo -MD -MP -MF guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_messages_file_info.Tpo -c -o guac_rdpdr/guacdr_la-rdpdr_fs_messages_file_info.lo `test -f 'guac_rdpdr/rdpdr_fs_messages_file_info.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_messages_file_info.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_messages_file_info.Tpo guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_messages_file_info.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpdr/rdpdr_fs_messages_file_info.c' object='guac_rdpdr/guacdr_la-rdpdr_fs_messages_file_info.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -c -o guac_rdpdr/guacdr_la-rdpdr_fs_messages_file_info.lo `test -f 'guac_rdpdr/rdpdr_fs_messages_file_info.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_messages_file_info.c guac_rdpdr/guacdr_la-rdpdr_fs_messages_vol_info.lo: guac_rdpdr/rdpdr_fs_messages_vol_info.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -MT guac_rdpdr/guacdr_la-rdpdr_fs_messages_vol_info.lo -MD -MP -MF guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_messages_vol_info.Tpo -c -o guac_rdpdr/guacdr_la-rdpdr_fs_messages_vol_info.lo `test -f 'guac_rdpdr/rdpdr_fs_messages_vol_info.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_messages_vol_info.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_messages_vol_info.Tpo guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_messages_vol_info.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpdr/rdpdr_fs_messages_vol_info.c' object='guac_rdpdr/guacdr_la-rdpdr_fs_messages_vol_info.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -c -o guac_rdpdr/guacdr_la-rdpdr_fs_messages_vol_info.lo `test -f 'guac_rdpdr/rdpdr_fs_messages_vol_info.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_messages_vol_info.c guac_rdpdr/guacdr_la-rdpdr_fs_service.lo: guac_rdpdr/rdpdr_fs_service.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -MT guac_rdpdr/guacdr_la-rdpdr_fs_service.lo -MD -MP -MF guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_service.Tpo -c -o guac_rdpdr/guacdr_la-rdpdr_fs_service.lo `test -f 'guac_rdpdr/rdpdr_fs_service.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_service.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_service.Tpo guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_fs_service.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpdr/rdpdr_fs_service.c' object='guac_rdpdr/guacdr_la-rdpdr_fs_service.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -c -o guac_rdpdr/guacdr_la-rdpdr_fs_service.lo `test -f 'guac_rdpdr/rdpdr_fs_service.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_fs_service.c guac_rdpdr/guacdr_la-rdpdr_messages.lo: guac_rdpdr/rdpdr_messages.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -MT guac_rdpdr/guacdr_la-rdpdr_messages.lo -MD -MP -MF guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_messages.Tpo -c -o guac_rdpdr/guacdr_la-rdpdr_messages.lo `test -f 'guac_rdpdr/rdpdr_messages.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_messages.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_messages.Tpo guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_messages.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpdr/rdpdr_messages.c' object='guac_rdpdr/guacdr_la-rdpdr_messages.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -c -o guac_rdpdr/guacdr_la-rdpdr_messages.lo `test -f 'guac_rdpdr/rdpdr_messages.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_messages.c guac_rdpdr/guacdr_la-rdpdr_printer.lo: guac_rdpdr/rdpdr_printer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -MT guac_rdpdr/guacdr_la-rdpdr_printer.lo -MD -MP -MF guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_printer.Tpo -c -o guac_rdpdr/guacdr_la-rdpdr_printer.lo `test -f 'guac_rdpdr/rdpdr_printer.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_printer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_printer.Tpo guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_printer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpdr/rdpdr_printer.c' object='guac_rdpdr/guacdr_la-rdpdr_printer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -c -o guac_rdpdr/guacdr_la-rdpdr_printer.lo `test -f 'guac_rdpdr/rdpdr_printer.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_printer.c guac_rdpdr/guacdr_la-rdpdr_service.lo: guac_rdpdr/rdpdr_service.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -MT guac_rdpdr/guacdr_la-rdpdr_service.lo -MD -MP -MF guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_service.Tpo -c -o guac_rdpdr/guacdr_la-rdpdr_service.lo `test -f 'guac_rdpdr/rdpdr_service.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_service.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_service.Tpo guac_rdpdr/$(DEPDIR)/guacdr_la-rdpdr_service.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpdr/rdpdr_service.c' object='guac_rdpdr/guacdr_la-rdpdr_service.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -c -o guac_rdpdr/guacdr_la-rdpdr_service.lo `test -f 'guac_rdpdr/rdpdr_service.c' || echo '$(srcdir)/'`guac_rdpdr/rdpdr_service.c guacdr_la-rdp_fs.lo: rdp_fs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -MT guacdr_la-rdp_fs.lo -MD -MP -MF $(DEPDIR)/guacdr_la-rdp_fs.Tpo -c -o guacdr_la-rdp_fs.lo `test -f 'rdp_fs.c' || echo '$(srcdir)/'`rdp_fs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacdr_la-rdp_fs.Tpo $(DEPDIR)/guacdr_la-rdp_fs.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_fs.c' object='guacdr_la-rdp_fs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -c -o guacdr_la-rdp_fs.lo `test -f 'rdp_fs.c' || echo '$(srcdir)/'`rdp_fs.c guacdr_la-rdp_stream.lo: rdp_stream.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -MT guacdr_la-rdp_stream.lo -MD -MP -MF $(DEPDIR)/guacdr_la-rdp_stream.Tpo -c -o guacdr_la-rdp_stream.lo `test -f 'rdp_stream.c' || echo '$(srcdir)/'`rdp_stream.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacdr_la-rdp_stream.Tpo $(DEPDIR)/guacdr_la-rdp_stream.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_stream.c' object='guacdr_la-rdp_stream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -c -o guacdr_la-rdp_stream.lo `test -f 'rdp_stream.c' || echo '$(srcdir)/'`rdp_stream.c guacdr_la-unicode.lo: unicode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -MT guacdr_la-unicode.lo -MD -MP -MF $(DEPDIR)/guacdr_la-unicode.Tpo -c -o guacdr_la-unicode.lo `test -f 'unicode.c' || echo '$(srcdir)/'`unicode.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacdr_la-unicode.Tpo $(DEPDIR)/guacdr_la-unicode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unicode.c' object='guacdr_la-unicode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -c -o guacdr_la-unicode.lo `test -f 'unicode.c' || echo '$(srcdir)/'`unicode.c compat/guacdr_la-winpr-stream.lo: compat/winpr-stream.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -MT compat/guacdr_la-winpr-stream.lo -MD -MP -MF compat/$(DEPDIR)/guacdr_la-winpr-stream.Tpo -c -o compat/guacdr_la-winpr-stream.lo `test -f 'compat/winpr-stream.c' || echo '$(srcdir)/'`compat/winpr-stream.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/guacdr_la-winpr-stream.Tpo compat/$(DEPDIR)/guacdr_la-winpr-stream.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/winpr-stream.c' object='compat/guacdr_la-winpr-stream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacdr_la_CFLAGS) $(CFLAGS) -c -o compat/guacdr_la-winpr-stream.lo `test -f 'compat/winpr-stream.c' || echo '$(srcdir)/'`compat/winpr-stream.c guac_rdpsnd/guacsnd_client_la-rdpsnd_messages.lo: guac_rdpsnd/rdpsnd_messages.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsnd_client_la_CFLAGS) $(CFLAGS) -MT guac_rdpsnd/guacsnd_client_la-rdpsnd_messages.lo -MD -MP -MF guac_rdpsnd/$(DEPDIR)/guacsnd_client_la-rdpsnd_messages.Tpo -c -o guac_rdpsnd/guacsnd_client_la-rdpsnd_messages.lo `test -f 'guac_rdpsnd/rdpsnd_messages.c' || echo '$(srcdir)/'`guac_rdpsnd/rdpsnd_messages.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpsnd/$(DEPDIR)/guacsnd_client_la-rdpsnd_messages.Tpo guac_rdpsnd/$(DEPDIR)/guacsnd_client_la-rdpsnd_messages.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpsnd/rdpsnd_messages.c' object='guac_rdpsnd/guacsnd_client_la-rdpsnd_messages.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsnd_client_la_CFLAGS) $(CFLAGS) -c -o guac_rdpsnd/guacsnd_client_la-rdpsnd_messages.lo `test -f 'guac_rdpsnd/rdpsnd_messages.c' || echo '$(srcdir)/'`guac_rdpsnd/rdpsnd_messages.c guac_rdpsnd/guacsnd_client_la-rdpsnd_service.lo: guac_rdpsnd/rdpsnd_service.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsnd_client_la_CFLAGS) $(CFLAGS) -MT guac_rdpsnd/guacsnd_client_la-rdpsnd_service.lo -MD -MP -MF guac_rdpsnd/$(DEPDIR)/guacsnd_client_la-rdpsnd_service.Tpo -c -o guac_rdpsnd/guacsnd_client_la-rdpsnd_service.lo `test -f 'guac_rdpsnd/rdpsnd_service.c' || echo '$(srcdir)/'`guac_rdpsnd/rdpsnd_service.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpsnd/$(DEPDIR)/guacsnd_client_la-rdpsnd_service.Tpo guac_rdpsnd/$(DEPDIR)/guacsnd_client_la-rdpsnd_service.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpsnd/rdpsnd_service.c' object='guac_rdpsnd/guacsnd_client_la-rdpsnd_service.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsnd_client_la_CFLAGS) $(CFLAGS) -c -o guac_rdpsnd/guacsnd_client_la-rdpsnd_service.lo `test -f 'guac_rdpsnd/rdpsnd_service.c' || echo '$(srcdir)/'`guac_rdpsnd/rdpsnd_service.c compat/guacsnd_client_la-winpr-stream.lo: compat/winpr-stream.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsnd_client_la_CFLAGS) $(CFLAGS) -MT compat/guacsnd_client_la-winpr-stream.lo -MD -MP -MF compat/$(DEPDIR)/guacsnd_client_la-winpr-stream.Tpo -c -o compat/guacsnd_client_la-winpr-stream.lo `test -f 'compat/winpr-stream.c' || echo '$(srcdir)/'`compat/winpr-stream.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/guacsnd_client_la-winpr-stream.Tpo compat/$(DEPDIR)/guacsnd_client_la-winpr-stream.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/winpr-stream.c' object='compat/guacsnd_client_la-winpr-stream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsnd_client_la_CFLAGS) $(CFLAGS) -c -o compat/guacsnd_client_la-winpr-stream.lo `test -f 'compat/winpr-stream.c' || echo '$(srcdir)/'`compat/winpr-stream.c guac_rdpsnd/guacsnd_la-rdpsnd_messages.lo: guac_rdpsnd/rdpsnd_messages.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsnd_la_CFLAGS) $(CFLAGS) -MT guac_rdpsnd/guacsnd_la-rdpsnd_messages.lo -MD -MP -MF guac_rdpsnd/$(DEPDIR)/guacsnd_la-rdpsnd_messages.Tpo -c -o guac_rdpsnd/guacsnd_la-rdpsnd_messages.lo `test -f 'guac_rdpsnd/rdpsnd_messages.c' || echo '$(srcdir)/'`guac_rdpsnd/rdpsnd_messages.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpsnd/$(DEPDIR)/guacsnd_la-rdpsnd_messages.Tpo guac_rdpsnd/$(DEPDIR)/guacsnd_la-rdpsnd_messages.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpsnd/rdpsnd_messages.c' object='guac_rdpsnd/guacsnd_la-rdpsnd_messages.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsnd_la_CFLAGS) $(CFLAGS) -c -o guac_rdpsnd/guacsnd_la-rdpsnd_messages.lo `test -f 'guac_rdpsnd/rdpsnd_messages.c' || echo '$(srcdir)/'`guac_rdpsnd/rdpsnd_messages.c guac_rdpsnd/guacsnd_la-rdpsnd_service.lo: guac_rdpsnd/rdpsnd_service.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsnd_la_CFLAGS) $(CFLAGS) -MT guac_rdpsnd/guacsnd_la-rdpsnd_service.lo -MD -MP -MF guac_rdpsnd/$(DEPDIR)/guacsnd_la-rdpsnd_service.Tpo -c -o guac_rdpsnd/guacsnd_la-rdpsnd_service.lo `test -f 'guac_rdpsnd/rdpsnd_service.c' || echo '$(srcdir)/'`guac_rdpsnd/rdpsnd_service.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_rdpsnd/$(DEPDIR)/guacsnd_la-rdpsnd_service.Tpo guac_rdpsnd/$(DEPDIR)/guacsnd_la-rdpsnd_service.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rdpsnd/rdpsnd_service.c' object='guac_rdpsnd/guacsnd_la-rdpsnd_service.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsnd_la_CFLAGS) $(CFLAGS) -c -o guac_rdpsnd/guacsnd_la-rdpsnd_service.lo `test -f 'guac_rdpsnd/rdpsnd_service.c' || echo '$(srcdir)/'`guac_rdpsnd/rdpsnd_service.c compat/guacsnd_la-winpr-stream.lo: compat/winpr-stream.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsnd_la_CFLAGS) $(CFLAGS) -MT compat/guacsnd_la-winpr-stream.lo -MD -MP -MF compat/$(DEPDIR)/guacsnd_la-winpr-stream.Tpo -c -o compat/guacsnd_la-winpr-stream.lo `test -f 'compat/winpr-stream.c' || echo '$(srcdir)/'`compat/winpr-stream.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/guacsnd_la-winpr-stream.Tpo compat/$(DEPDIR)/guacsnd_la-winpr-stream.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/winpr-stream.c' object='compat/guacsnd_la-winpr-stream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsnd_la_CFLAGS) $(CFLAGS) -c -o compat/guacsnd_la-winpr-stream.lo `test -f 'compat/winpr-stream.c' || echo '$(srcdir)/'`compat/winpr-stream.c guac_svc/guacsvc_client_la-svc_service.lo: guac_svc/svc_service.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsvc_client_la_CFLAGS) $(CFLAGS) -MT guac_svc/guacsvc_client_la-svc_service.lo -MD -MP -MF guac_svc/$(DEPDIR)/guacsvc_client_la-svc_service.Tpo -c -o guac_svc/guacsvc_client_la-svc_service.lo `test -f 'guac_svc/svc_service.c' || echo '$(srcdir)/'`guac_svc/svc_service.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_svc/$(DEPDIR)/guacsvc_client_la-svc_service.Tpo guac_svc/$(DEPDIR)/guacsvc_client_la-svc_service.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_svc/svc_service.c' object='guac_svc/guacsvc_client_la-svc_service.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsvc_client_la_CFLAGS) $(CFLAGS) -c -o guac_svc/guacsvc_client_la-svc_service.lo `test -f 'guac_svc/svc_service.c' || echo '$(srcdir)/'`guac_svc/svc_service.c guacsvc_client_la-rdp_svc.lo: rdp_svc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsvc_client_la_CFLAGS) $(CFLAGS) -MT guacsvc_client_la-rdp_svc.lo -MD -MP -MF $(DEPDIR)/guacsvc_client_la-rdp_svc.Tpo -c -o guacsvc_client_la-rdp_svc.lo `test -f 'rdp_svc.c' || echo '$(srcdir)/'`rdp_svc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacsvc_client_la-rdp_svc.Tpo $(DEPDIR)/guacsvc_client_la-rdp_svc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_svc.c' object='guacsvc_client_la-rdp_svc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsvc_client_la_CFLAGS) $(CFLAGS) -c -o guacsvc_client_la-rdp_svc.lo `test -f 'rdp_svc.c' || echo '$(srcdir)/'`rdp_svc.c compat/guacsvc_client_la-winpr-stream.lo: compat/winpr-stream.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsvc_client_la_CFLAGS) $(CFLAGS) -MT compat/guacsvc_client_la-winpr-stream.lo -MD -MP -MF compat/$(DEPDIR)/guacsvc_client_la-winpr-stream.Tpo -c -o compat/guacsvc_client_la-winpr-stream.lo `test -f 'compat/winpr-stream.c' || echo '$(srcdir)/'`compat/winpr-stream.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/guacsvc_client_la-winpr-stream.Tpo compat/$(DEPDIR)/guacsvc_client_la-winpr-stream.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/winpr-stream.c' object='compat/guacsvc_client_la-winpr-stream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsvc_client_la_CFLAGS) $(CFLAGS) -c -o compat/guacsvc_client_la-winpr-stream.lo `test -f 'compat/winpr-stream.c' || echo '$(srcdir)/'`compat/winpr-stream.c guac_svc/guacsvc_la-svc_service.lo: guac_svc/svc_service.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsvc_la_CFLAGS) $(CFLAGS) -MT guac_svc/guacsvc_la-svc_service.lo -MD -MP -MF guac_svc/$(DEPDIR)/guacsvc_la-svc_service.Tpo -c -o guac_svc/guacsvc_la-svc_service.lo `test -f 'guac_svc/svc_service.c' || echo '$(srcdir)/'`guac_svc/svc_service.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) guac_svc/$(DEPDIR)/guacsvc_la-svc_service.Tpo guac_svc/$(DEPDIR)/guacsvc_la-svc_service.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_svc/svc_service.c' object='guac_svc/guacsvc_la-svc_service.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsvc_la_CFLAGS) $(CFLAGS) -c -o guac_svc/guacsvc_la-svc_service.lo `test -f 'guac_svc/svc_service.c' || echo '$(srcdir)/'`guac_svc/svc_service.c guacsvc_la-rdp_svc.lo: rdp_svc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsvc_la_CFLAGS) $(CFLAGS) -MT guacsvc_la-rdp_svc.lo -MD -MP -MF $(DEPDIR)/guacsvc_la-rdp_svc.Tpo -c -o guacsvc_la-rdp_svc.lo `test -f 'rdp_svc.c' || echo '$(srcdir)/'`rdp_svc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacsvc_la-rdp_svc.Tpo $(DEPDIR)/guacsvc_la-rdp_svc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_svc.c' object='guacsvc_la-rdp_svc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsvc_la_CFLAGS) $(CFLAGS) -c -o guacsvc_la-rdp_svc.lo `test -f 'rdp_svc.c' || echo '$(srcdir)/'`rdp_svc.c compat/guacsvc_la-winpr-stream.lo: compat/winpr-stream.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsvc_la_CFLAGS) $(CFLAGS) -MT compat/guacsvc_la-winpr-stream.lo -MD -MP -MF compat/$(DEPDIR)/guacsvc_la-winpr-stream.Tpo -c -o compat/guacsvc_la-winpr-stream.lo `test -f 'compat/winpr-stream.c' || echo '$(srcdir)/'`compat/winpr-stream.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/guacsvc_la-winpr-stream.Tpo compat/$(DEPDIR)/guacsvc_la-winpr-stream.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/winpr-stream.c' object='compat/guacsvc_la-winpr-stream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacsvc_la_CFLAGS) $(CFLAGS) -c -o compat/guacsvc_la-winpr-stream.lo `test -f 'compat/winpr-stream.c' || echo '$(srcdir)/'`compat/winpr-stream.c libguac_client_rdp_la-_generated_keymaps.lo: _generated_keymaps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-_generated_keymaps.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-_generated_keymaps.Tpo -c -o libguac_client_rdp_la-_generated_keymaps.lo `test -f '_generated_keymaps.c' || echo '$(srcdir)/'`_generated_keymaps.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-_generated_keymaps.Tpo $(DEPDIR)/libguac_client_rdp_la-_generated_keymaps.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='_generated_keymaps.c' object='libguac_client_rdp_la-_generated_keymaps.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-_generated_keymaps.lo `test -f '_generated_keymaps.c' || echo '$(srcdir)/'`_generated_keymaps.c libguac_client_rdp_la-client.lo: client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-client.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-client.Tpo -c -o libguac_client_rdp_la-client.lo `test -f 'client.c' || echo '$(srcdir)/'`client.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-client.Tpo $(DEPDIR)/libguac_client_rdp_la-client.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client.c' object='libguac_client_rdp_la-client.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-client.lo `test -f 'client.c' || echo '$(srcdir)/'`client.c libguac_client_rdp_la-guac_handlers.lo: guac_handlers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-guac_handlers.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-guac_handlers.Tpo -c -o libguac_client_rdp_la-guac_handlers.lo `test -f 'guac_handlers.c' || echo '$(srcdir)/'`guac_handlers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-guac_handlers.Tpo $(DEPDIR)/libguac_client_rdp_la-guac_handlers.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_handlers.c' object='libguac_client_rdp_la-guac_handlers.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-guac_handlers.lo `test -f 'guac_handlers.c' || echo '$(srcdir)/'`guac_handlers.c libguac_client_rdp_la-rdp_bitmap.lo: rdp_bitmap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-rdp_bitmap.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-rdp_bitmap.Tpo -c -o libguac_client_rdp_la-rdp_bitmap.lo `test -f 'rdp_bitmap.c' || echo '$(srcdir)/'`rdp_bitmap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-rdp_bitmap.Tpo $(DEPDIR)/libguac_client_rdp_la-rdp_bitmap.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_bitmap.c' object='libguac_client_rdp_la-rdp_bitmap.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-rdp_bitmap.lo `test -f 'rdp_bitmap.c' || echo '$(srcdir)/'`rdp_bitmap.c libguac_client_rdp_la-rdp_cliprdr.lo: rdp_cliprdr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-rdp_cliprdr.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-rdp_cliprdr.Tpo -c -o libguac_client_rdp_la-rdp_cliprdr.lo `test -f 'rdp_cliprdr.c' || echo '$(srcdir)/'`rdp_cliprdr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-rdp_cliprdr.Tpo $(DEPDIR)/libguac_client_rdp_la-rdp_cliprdr.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_cliprdr.c' object='libguac_client_rdp_la-rdp_cliprdr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-rdp_cliprdr.lo `test -f 'rdp_cliprdr.c' || echo '$(srcdir)/'`rdp_cliprdr.c libguac_client_rdp_la-rdp_color.lo: rdp_color.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-rdp_color.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-rdp_color.Tpo -c -o libguac_client_rdp_la-rdp_color.lo `test -f 'rdp_color.c' || echo '$(srcdir)/'`rdp_color.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-rdp_color.Tpo $(DEPDIR)/libguac_client_rdp_la-rdp_color.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_color.c' object='libguac_client_rdp_la-rdp_color.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-rdp_color.lo `test -f 'rdp_color.c' || echo '$(srcdir)/'`rdp_color.c libguac_client_rdp_la-rdp_fs.lo: rdp_fs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-rdp_fs.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-rdp_fs.Tpo -c -o libguac_client_rdp_la-rdp_fs.lo `test -f 'rdp_fs.c' || echo '$(srcdir)/'`rdp_fs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-rdp_fs.Tpo $(DEPDIR)/libguac_client_rdp_la-rdp_fs.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_fs.c' object='libguac_client_rdp_la-rdp_fs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-rdp_fs.lo `test -f 'rdp_fs.c' || echo '$(srcdir)/'`rdp_fs.c libguac_client_rdp_la-rdp_gdi.lo: rdp_gdi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-rdp_gdi.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-rdp_gdi.Tpo -c -o libguac_client_rdp_la-rdp_gdi.lo `test -f 'rdp_gdi.c' || echo '$(srcdir)/'`rdp_gdi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-rdp_gdi.Tpo $(DEPDIR)/libguac_client_rdp_la-rdp_gdi.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_gdi.c' object='libguac_client_rdp_la-rdp_gdi.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-rdp_gdi.lo `test -f 'rdp_gdi.c' || echo '$(srcdir)/'`rdp_gdi.c libguac_client_rdp_la-rdp_glyph.lo: rdp_glyph.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-rdp_glyph.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-rdp_glyph.Tpo -c -o libguac_client_rdp_la-rdp_glyph.lo `test -f 'rdp_glyph.c' || echo '$(srcdir)/'`rdp_glyph.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-rdp_glyph.Tpo $(DEPDIR)/libguac_client_rdp_la-rdp_glyph.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_glyph.c' object='libguac_client_rdp_la-rdp_glyph.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-rdp_glyph.lo `test -f 'rdp_glyph.c' || echo '$(srcdir)/'`rdp_glyph.c libguac_client_rdp_la-rdp_keymap.lo: rdp_keymap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-rdp_keymap.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-rdp_keymap.Tpo -c -o libguac_client_rdp_la-rdp_keymap.lo `test -f 'rdp_keymap.c' || echo '$(srcdir)/'`rdp_keymap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-rdp_keymap.Tpo $(DEPDIR)/libguac_client_rdp_la-rdp_keymap.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_keymap.c' object='libguac_client_rdp_la-rdp_keymap.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-rdp_keymap.lo `test -f 'rdp_keymap.c' || echo '$(srcdir)/'`rdp_keymap.c libguac_client_rdp_la-rdp_pointer.lo: rdp_pointer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-rdp_pointer.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-rdp_pointer.Tpo -c -o libguac_client_rdp_la-rdp_pointer.lo `test -f 'rdp_pointer.c' || echo '$(srcdir)/'`rdp_pointer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-rdp_pointer.Tpo $(DEPDIR)/libguac_client_rdp_la-rdp_pointer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_pointer.c' object='libguac_client_rdp_la-rdp_pointer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-rdp_pointer.lo `test -f 'rdp_pointer.c' || echo '$(srcdir)/'`rdp_pointer.c libguac_client_rdp_la-rdp_rail.lo: rdp_rail.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-rdp_rail.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-rdp_rail.Tpo -c -o libguac_client_rdp_la-rdp_rail.lo `test -f 'rdp_rail.c' || echo '$(srcdir)/'`rdp_rail.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-rdp_rail.Tpo $(DEPDIR)/libguac_client_rdp_la-rdp_rail.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_rail.c' object='libguac_client_rdp_la-rdp_rail.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-rdp_rail.lo `test -f 'rdp_rail.c' || echo '$(srcdir)/'`rdp_rail.c libguac_client_rdp_la-rdp_settings.lo: rdp_settings.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-rdp_settings.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-rdp_settings.Tpo -c -o libguac_client_rdp_la-rdp_settings.lo `test -f 'rdp_settings.c' || echo '$(srcdir)/'`rdp_settings.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-rdp_settings.Tpo $(DEPDIR)/libguac_client_rdp_la-rdp_settings.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_settings.c' object='libguac_client_rdp_la-rdp_settings.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-rdp_settings.lo `test -f 'rdp_settings.c' || echo '$(srcdir)/'`rdp_settings.c libguac_client_rdp_la-rdp_stream.lo: rdp_stream.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-rdp_stream.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-rdp_stream.Tpo -c -o libguac_client_rdp_la-rdp_stream.lo `test -f 'rdp_stream.c' || echo '$(srcdir)/'`rdp_stream.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-rdp_stream.Tpo $(DEPDIR)/libguac_client_rdp_la-rdp_stream.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_stream.c' object='libguac_client_rdp_la-rdp_stream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-rdp_stream.lo `test -f 'rdp_stream.c' || echo '$(srcdir)/'`rdp_stream.c libguac_client_rdp_la-rdp_svc.lo: rdp_svc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-rdp_svc.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-rdp_svc.Tpo -c -o libguac_client_rdp_la-rdp_svc.lo `test -f 'rdp_svc.c' || echo '$(srcdir)/'`rdp_svc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-rdp_svc.Tpo $(DEPDIR)/libguac_client_rdp_la-rdp_svc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_svc.c' object='libguac_client_rdp_la-rdp_svc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-rdp_svc.lo `test -f 'rdp_svc.c' || echo '$(srcdir)/'`rdp_svc.c libguac_client_rdp_la-resolution.lo: resolution.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-resolution.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-resolution.Tpo -c -o libguac_client_rdp_la-resolution.lo `test -f 'resolution.c' || echo '$(srcdir)/'`resolution.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-resolution.Tpo $(DEPDIR)/libguac_client_rdp_la-resolution.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='resolution.c' object='libguac_client_rdp_la-resolution.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-resolution.lo `test -f 'resolution.c' || echo '$(srcdir)/'`resolution.c libguac_client_rdp_la-unicode.lo: unicode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-unicode.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-unicode.Tpo -c -o libguac_client_rdp_la-unicode.lo `test -f 'unicode.c' || echo '$(srcdir)/'`unicode.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-unicode.Tpo $(DEPDIR)/libguac_client_rdp_la-unicode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unicode.c' object='libguac_client_rdp_la-unicode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-unicode.lo `test -f 'unicode.c' || echo '$(srcdir)/'`unicode.c compat/libguac_client_rdp_la-winpr-stream.lo: compat/winpr-stream.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT compat/libguac_client_rdp_la-winpr-stream.lo -MD -MP -MF compat/$(DEPDIR)/libguac_client_rdp_la-winpr-stream.Tpo -c -o compat/libguac_client_rdp_la-winpr-stream.lo `test -f 'compat/winpr-stream.c' || echo '$(srcdir)/'`compat/winpr-stream.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/libguac_client_rdp_la-winpr-stream.Tpo compat/$(DEPDIR)/libguac_client_rdp_la-winpr-stream.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/winpr-stream.c' object='compat/libguac_client_rdp_la-winpr-stream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o compat/libguac_client_rdp_la-winpr-stream.lo `test -f 'compat/winpr-stream.c' || echo '$(srcdir)/'`compat/winpr-stream.c libguac_client_rdp_la-rdp_disp.lo: rdp_disp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-rdp_disp.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-rdp_disp.Tpo -c -o libguac_client_rdp_la-rdp_disp.lo `test -f 'rdp_disp.c' || echo '$(srcdir)/'`rdp_disp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-rdp_disp.Tpo $(DEPDIR)/libguac_client_rdp_la-rdp_disp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdp_disp.c' object='libguac_client_rdp_la-rdp_disp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-rdp_disp.lo `test -f 'rdp_disp.c' || echo '$(srcdir)/'`rdp_disp.c libguac_client_rdp_la-sftp.lo: sftp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -MT libguac_client_rdp_la-sftp.lo -MD -MP -MF $(DEPDIR)/libguac_client_rdp_la-sftp.Tpo -c -o libguac_client_rdp_la-sftp.lo `test -f 'sftp.c' || echo '$(srcdir)/'`sftp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_client_rdp_la-sftp.Tpo $(DEPDIR)/libguac_client_rdp_la-sftp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sftp.c' object='libguac_client_rdp_la-sftp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_client_rdp_la_CFLAGS) $(CFLAGS) -c -o libguac_client_rdp_la-sftp.lo `test -f 'sftp.c' || echo '$(srcdir)/'`sftp.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf compat/.libs compat/_libs -rm -rf guac_rdpdr/.libs guac_rdpdr/_libs -rm -rf guac_rdpsnd/.libs guac_rdpsnd/_libs -rm -rf guac_svc/.libs guac_svc/_libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(freerdpdir)" "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f compat/$(DEPDIR)/$(am__dirstamp) -rm -f compat/$(am__dirstamp) -rm -f guac_rdpdr/$(DEPDIR)/$(am__dirstamp) -rm -f guac_rdpdr/$(am__dirstamp) -rm -f guac_rdpsnd/$(DEPDIR)/$(am__dirstamp) -rm -f guac_rdpsnd/$(am__dirstamp) -rm -f guac_svc/$(DEPDIR)/$(am__dirstamp) -rm -f guac_svc/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-freerdpLTLIBRARIES clean-generic clean-libLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) compat/$(DEPDIR) guac_rdpdr/$(DEPDIR) guac_rdpsnd/$(DEPDIR) guac_svc/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-freerdpLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) compat/$(DEPDIR) guac_rdpdr/$(DEPDIR) guac_rdpsnd/$(DEPDIR) guac_svc/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-freerdpLTLIBRARIES uninstall-libLTLIBRARIES .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-freerdpLTLIBRARIES clean-generic clean-libLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am \ install-freerdpLTLIBRARIES install-html install-html-am \ install-info install-info-am install-libLTLIBRARIES \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-freerdpLTLIBRARIES \ uninstall-libLTLIBRARIES _generated_keymaps.c: $(rdp_keymaps) keymaps/generate.pl $(rdp_keymaps) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: guacamole-server-0.9.9/src/protocols/rdp/sftp.c0000664000175100017510000000316712626133327016453 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "guac_sftp.h" #include "sftp.h" #include #include int guac_rdp_sftp_file_handler(guac_client* client, guac_stream* stream, char* mimetype, char* filename) { rdp_guac_client_data* client_data = (rdp_guac_client_data*) client->data; guac_object* filesystem = client_data->sftp_filesystem; /* Handle file upload */ return guac_common_ssh_sftp_handle_file_stream(filesystem, stream, mimetype, filename); } guacamole-server-0.9.9/src/protocols/rdp/guac_svc/0000775000175100017510000000000012645400336017174 500000000000000guacamole-server-0.9.9/src/protocols/rdp/guac_svc/svc_service.h0000664000175100017510000000454212536405625021612 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_SVC_SERVICE_H #define __GUAC_SVC_SERVICE_H #include "config.h" #include "rdp_svc.h" #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif /** * Structure representing the current state of an arbitrary static virtual * channel. */ typedef struct guac_svcPlugin { /** * The FreeRDP parts of this plugin. This absolutely MUST be first. * FreeRDP depends on accessing this structure as if it were an instance * of rdpSvcPlugin. */ rdpSvcPlugin plugin; /** * The Guacamole-specific SVC structure describing the channel this * instance represents. */ guac_rdp_svc* svc; } guac_svcPlugin; /** * Handler called when this plugin is loaded by FreeRDP. */ void guac_svc_process_connect(rdpSvcPlugin* plugin); /** * Handler called when this plugin receives data along its designated channel. */ void guac_svc_process_receive(rdpSvcPlugin* plugin, wStream* input_stream); /** * Handler called when this plugin is being unloaded. */ void guac_svc_process_terminate(rdpSvcPlugin* plugin); /** * Handler called when this plugin receives an event. */ void guac_svc_process_event(rdpSvcPlugin* plugin, wMessage* event); #endif guacamole-server-0.9.9/src/protocols/rdp/guac_svc/svc_service.c0000664000175100017510000001117512612226234021575 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "svc_service.h" #include #include #include #include #include #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif /** * Entry point for arbitrary SVC. */ int VirtualChannelEntry(PCHANNEL_ENTRY_POINTS pEntryPoints) { /* Gain access to plugin data */ CHANNEL_ENTRY_POINTS_FREERDP* entry_points_ex = (CHANNEL_ENTRY_POINTS_FREERDP*) pEntryPoints; /* Allocate plugin */ guac_svcPlugin* svc_plugin = (guac_svcPlugin*) calloc(1, sizeof(guac_svcPlugin)); /* Get SVC descriptor from plugin parameters */ guac_rdp_svc* svc = (guac_rdp_svc*) entry_points_ex->pExtendedData; /* Init channel def */ strncpy(svc_plugin->plugin.channel_def.name, svc->name, GUAC_RDP_SVC_MAX_LENGTH); svc_plugin->plugin.channel_def.options = CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP | CHANNEL_OPTION_COMPRESS_RDP; /* Init plugin */ svc_plugin->svc = svc; /* Set callbacks */ svc_plugin->plugin.connect_callback = guac_svc_process_connect; svc_plugin->plugin.receive_callback = guac_svc_process_receive; svc_plugin->plugin.event_callback = guac_svc_process_event; svc_plugin->plugin.terminate_callback = guac_svc_process_terminate; /* Store plugin reference in SVC */ svc->plugin = (rdpSvcPlugin*) svc_plugin; /* Finish init */ svc_plugin_init((rdpSvcPlugin*) svc_plugin, pEntryPoints); return 1; } /* * Service Handlers */ void guac_svc_process_connect(rdpSvcPlugin* plugin) { /* Get corresponding guac_rdp_svc */ guac_svcPlugin* svc_plugin = (guac_svcPlugin*) plugin; guac_rdp_svc* svc = svc_plugin->svc; /* NULL out pExtendedData so we don't lose our guac_rdp_svc due to an * automatic free() within libfreerdp */ plugin->channel_entry_points.pExtendedData = NULL; /* Create pipe */ svc->output_pipe = guac_client_alloc_stream(svc->client); guac_protocol_send_pipe(svc->client->socket, svc->output_pipe, "application/octet-stream", svc->name); /* Log connection to static channel */ guac_client_log(svc->client, GUAC_LOG_INFO, "Static channel \"%s\" connected.", svc->name); } void guac_svc_process_terminate(rdpSvcPlugin* plugin) { /* Get corresponding guac_rdp_svc */ guac_svcPlugin* svc_plugin = (guac_svcPlugin*) plugin; guac_rdp_svc* svc = svc_plugin->svc; /* Remove and free SVC */ guac_client_log(svc->client, GUAC_LOG_INFO, "Closing channel \"%s\"...", svc->name); guac_rdp_remove_svc(svc->client, svc->name); free(svc); free(plugin); } void guac_svc_process_event(rdpSvcPlugin* plugin, wMessage* event) { freerdp_event_free(event); } void guac_svc_process_receive(rdpSvcPlugin* plugin, wStream* input_stream) { /* Get corresponding guac_rdp_svc */ guac_svcPlugin* svc_plugin = (guac_svcPlugin*) plugin; guac_rdp_svc* svc = svc_plugin->svc; /* Fail if output not created */ if (svc->output_pipe == NULL) { guac_client_log(svc->client, GUAC_LOG_ERROR, "Output for channel \"%s\" dropped.", svc->name); return; } /* Send blob */ guac_protocol_send_blob(svc->client->socket, svc->output_pipe, Stream_Buffer(input_stream), Stream_Length(input_stream)); guac_socket_flush(svc->client->socket); } guacamole-server-0.9.9/src/protocols/rdp/sftp.h0000664000175100017510000000360612626133327016456 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 GUAC_RDP_SFTP_H #define GUAC_RDP_SFTP_H #include "config.h" #include #include /** * Handles an incoming stream from a Guacamole "file" instruction, saving the * contents of that stream to the file having the given name. * * @param client * The client receiving the uploaded file. * * @param stream * The stream through which the uploaded file data will be received. * * @param mimetype * The mimetype of the data being received. * * @param filename * The filename of the file to write to. * * @return * Zero if the incoming stream has been handled successfully, non-zero on * failure. */ int guac_rdp_sftp_file_handler(guac_client* client, guac_stream* stream, char* mimetype, char* filename); #endif guacamole-server-0.9.9/src/protocols/rdp/rdp_glyph.h0000664000175100017510000000400712643542623017470 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_RDP_RDP_GLYPH_H #define _GUAC_RDP_RDP_GLYPH_H #include "config.h" #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-wtypes.h" #endif typedef struct guac_rdp_glyph { /** * FreeRDP glyph data - MUST GO FIRST. */ rdpGlyph glyph; /** * Cairo surface layer containing cached image data. */ cairo_surface_t* surface; } guac_rdp_glyph; void guac_rdp_glyph_new(rdpContext* context, rdpGlyph* glyph); void guac_rdp_glyph_draw(rdpContext* context, rdpGlyph* glyph, int x, int y); void guac_rdp_glyph_free(rdpContext* context, rdpGlyph* glyph); void guac_rdp_glyph_begindraw(rdpContext* context, int x, int y, int width, int height, UINT32 fgcolor, UINT32 bgcolor); void guac_rdp_glyph_enddraw(rdpContext* context, int x, int y, int width, int height, UINT32 fgcolor, UINT32 bgcolor); #endif guacamole-server-0.9.9/src/protocols/rdp/rdp_rail.c0000664000175100017510000000741712643542623017277 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "rdp_rail.h" #include "rdp_settings.h" #include #include #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-wtypes.h" #endif #ifdef LEGACY_FREERDP #include "compat/rail.h" #else #include #endif #include void guac_rdp_process_rail_event(guac_client* client, wMessage* event) { #ifdef LEGACY_EVENT switch (event->event_type) { #else switch (GetMessageType(event->id)) { #endif /* Get system parameters */ case RailChannel_GetSystemParam: guac_rdp_process_rail_get_sysparam(client, event); break; /* Currently ignored events */ case RailChannel_ServerSystemParam: case RailChannel_ServerExecuteResult: case RailChannel_ServerMinMaxInfo: case RailChannel_ServerLocalMoveSize: case RailChannel_ServerGetAppIdResponse: case RailChannel_ServerLanguageBarInfo: break; default: #ifdef LEGACY_EVENT guac_client_log(client, GUAC_LOG_INFO, "Unknown rail event type: 0x%x", event->event_type); #else guac_client_log(client, GUAC_LOG_INFO, "Unknown rail event type: 0x%x", GetMessageType(event->id)); #endif } } void guac_rdp_process_rail_get_sysparam(guac_client* client, wMessage* event) { wMessage* response; RAIL_SYSPARAM_ORDER* sysparam; /* Get channels */ rdp_guac_client_data* client_data = (rdp_guac_client_data*) client->data; rdpChannels* channels = client_data->rdp_inst->context->channels; /* Get sysparam structure */ #ifdef LEGACY_EVENT sysparam = (RAIL_SYSPARAM_ORDER*) event->user_data; #else sysparam = (RAIL_SYSPARAM_ORDER*) event->wParam; #endif response = freerdp_event_new(RailChannel_Class, RailChannel_ClientSystemParam, NULL, sysparam); /* Work area */ sysparam->workArea.left = 0; sysparam->workArea.top = 0; sysparam->workArea.right = client_data->settings.width; sysparam->workArea.bottom = client_data->settings.height; /* Taskbar */ sysparam->taskbarPos.left = 0; sysparam->taskbarPos.top = 0; sysparam->taskbarPos.right = 0; sysparam->taskbarPos.bottom = 0; sysparam->dragFullWindows = FALSE; /* Send response */ freerdp_channels_send_event(channels, response); } guacamole-server-0.9.9/src/protocols/rdp/rdp_settings.h0000664000175100017510000001634612643542623020216 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_RDP_SETTINGS_H #define __GUAC_RDP_SETTINGS_H #include "config.h" #include "rdp_keymap.h" #include /** * The maximum number of bytes in the client hostname claimed during * connection. */ #define RDP_CLIENT_HOSTNAME_SIZE 32 /** * The default RDP port. */ #define RDP_DEFAULT_PORT 3389 /** * Default screen width, in pixels. */ #define RDP_DEFAULT_WIDTH 1024 /** * Default screen height, in pixels. */ #define RDP_DEFAULT_HEIGHT 768 /** * Default color depth, in bits. */ #define RDP_DEFAULT_DEPTH 16 /** * All supported combinations of security types. */ typedef enum guac_rdp_security { /** * Standard RDP encryption. */ GUAC_SECURITY_RDP, /** * TLS encryption. */ GUAC_SECURITY_TLS, /** * Network level authentication. */ GUAC_SECURITY_NLA, /** * Any method supported by the server. */ GUAC_SECURITY_ANY } guac_rdp_security; /** * All settings supported by the Guacamole RDP client. */ typedef struct guac_rdp_settings { /** * The hostname to connect to. */ char* hostname; /** * The port to connect to. */ int port; /** * The domain of the user logging in. */ char* domain; /** * The username of the user logging in. */ char* username; /** * The password of the user logging in. */ char* password; /** * The color depth of the display to request, in bits. */ int color_depth; /** * The width of the display to request, in pixels. */ int width; /** * The height of the display to request, in pixels. */ int height; /** * The DPI of the remote display to assume when converting between * client pixels and remote pixels. */ int resolution; /** * Whether audio is enabled. */ int audio_enabled; /** * Whether printing is enabled. */ int printing_enabled; /** * Whether the virtual drive is enabled. */ int drive_enabled; /** * The local system path which will be used to persist the * virtual drive. */ char* drive_path; /** * Whether to automatically create the local system path if it does not * exist. */ int create_drive_path; /** * Whether this session is a console session. */ int console; /** * Whether to allow audio in the console session. */ int console_audio; /** * The keymap chosen as the layout of the server. */ const guac_rdp_keymap* server_layout; /** * The initial program to run, if any. */ char* initial_program; /** * The name of the client to submit to the RDP server upon connection, or * NULL if the name is not specified. */ char* client_name; /** * The type of security to use for the connection. */ guac_rdp_security security_mode; /** * Whether bad server certificates should be ignored. */ int ignore_certificate; /** * Whether authentication should be disabled. This is different from the * authentication that takes place when a user provides their username * and password. Authentication is required by definition for NLA. */ int disable_authentication; /** * The application to launch, if RemoteApp is in use. */ char* remote_app; /** * The working directory of the remote application, if RemoteApp is in use. */ char* remote_app_dir; /** * The arguments to pass to the remote application, if RemoteApp is in use. */ char* remote_app_args; /** * NULL-terminated list of all static virtual channel names, or NULL if * no channels whatsoever. */ char** svc_names; /** * Whether the desktop wallpaper should be visible. If unset, the desktop * wallpaper will be hidden, reducing the amount of bandwidth required. */ int wallpaper_enabled; /** * Whether desktop and window theming should be allowed. If unset, theming * is temporarily disabled on the desktop of the RDP server for the sake of * performance, reducing the amount of bandwidth required. */ int theming_enabled; /** * Whether glyphs should be smoothed with antialiasing (ClearType). If * unset, glyphs will be rendered with sharp edges and using single colors, * effectively 1-bit images, reducing the amount of bandwidth required. */ int font_smoothing_enabled; /** * Whether windows contents should be shown as they are moved. If unset, * only a window border will be shown during window move operations, * reducing the amount of bandwidth required. */ int full_window_drag_enabled; /** * Whether desktop composition (Aero) should be enabled during the session. * As desktop composition provides alpha blending and other special * effects, this increases the amount of bandwidth used. If unset, desktop * composition will be disabled. */ int desktop_composition_enabled; /** * Whether menu animations should be shown. If unset, menus will not be * animated, reducing the amount of bandwidth required. */ int menu_animations_enabled; /** * The preconnection ID to send within the preconnection PDU when * initiating an RDP connection, if any. If no preconnection ID is * specified, this will be -1. */ int preconnection_id; /** * The preconnection BLOB (PCB) to send to the RDP server prior to full RDP * connection negotiation. This value is used by Hyper-V to select the * destination VM. */ char* preconnection_blob; } guac_rdp_settings; /** * Save all given settings to the given freerdp instance. */ void guac_rdp_push_settings(guac_rdp_settings* guac_settings, freerdp* rdp); /** * Returns the width of the RDP session display. */ int guac_rdp_get_width(freerdp* rdp); /** * Returns the height of the RDP session display. */ int guac_rdp_get_height(freerdp* rdp); /** * Returns the depth of the RDP session display. */ int guac_rdp_get_depth(freerdp* rdp); #endif guacamole-server-0.9.9/src/protocols/rdp/rdp_rail.h0000664000175100017510000000312712643542623017276 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_RDP_RDP_RAIL_H #define __GUAC_RDP_RDP_RAIL_H #include "config.h" #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif /** * Dispatches a given RAIL event to the appropriate handler. */ void guac_rdp_process_rail_event(guac_client* client, wMessage* event); /** * Handles the event sent when updating system parameters. */ void guac_rdp_process_rail_get_sysparam(guac_client* client, wMessage* event); #endif guacamole-server-0.9.9/src/protocols/rdp/rdp_bitmap.c0000664000175100017510000002101412643542623017611 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "guac_surface.h" #include "rdp_bitmap.h" #include "rdp_settings.h" #include #include #include #include #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-wtypes.h" #endif #include #include void guac_rdp_cache_bitmap(rdpContext* context, rdpBitmap* bitmap) { guac_client* client = ((rdp_freerdp_context*) context)->client; guac_socket* socket = client->socket; /* Allocate surface */ guac_layer* buffer = guac_client_alloc_buffer(client); guac_common_surface* surface = guac_common_surface_alloc(client, socket, buffer, bitmap->width, bitmap->height); /* Cache image data if present */ if (bitmap->data != NULL) { /* Create surface from image data */ cairo_surface_t* image = cairo_image_surface_create_for_data( bitmap->data, CAIRO_FORMAT_RGB24, bitmap->width, bitmap->height, 4*bitmap->width); /* Send surface to buffer */ guac_common_surface_draw(surface, 0, 0, image); /* Free surface */ cairo_surface_destroy(image); } /* Store buffer reference in bitmap */ ((guac_rdp_bitmap*) bitmap)->buffer = buffer; ((guac_rdp_bitmap*) bitmap)->surface = surface; } void guac_rdp_bitmap_new(rdpContext* context, rdpBitmap* bitmap) { /* Convert image data if present */ if (bitmap->data != NULL && bitmap->bpp != 32) { /* Convert image data to 32-bit RGB */ unsigned char* image_buffer = freerdp_image_convert(bitmap->data, NULL, bitmap->width, bitmap->height, guac_rdp_get_depth(context->instance), 32, ((rdp_freerdp_context*) context)->clrconv); /* Free existing image, if any */ if (image_buffer != bitmap->data) { #ifdef FREERDP_BITMAP_REQUIRES_ALIGNED_MALLOC _aligned_free(bitmap->data); #else free(bitmap->data); #endif } /* Store converted image in bitmap */ bitmap->data = image_buffer; } /* No corresponding surface yet - caching is deferred. */ ((guac_rdp_bitmap*) bitmap)->buffer = NULL; ((guac_rdp_bitmap*) bitmap)->surface = NULL; /* Start at zero usage */ ((guac_rdp_bitmap*) bitmap)->used = 0; } void guac_rdp_bitmap_paint(rdpContext* context, rdpBitmap* bitmap) { guac_client* client = ((rdp_freerdp_context*) context)->client; rdp_guac_client_data* client_data = (rdp_guac_client_data*) client->data; guac_common_surface* surface = ((guac_rdp_bitmap*) bitmap)->surface; int width = bitmap->right - bitmap->left + 1; int height = bitmap->bottom - bitmap->top + 1; /* If not cached, cache if necessary */ if (surface == NULL && ((guac_rdp_bitmap*) bitmap)->used >= 1) guac_rdp_cache_bitmap(context, bitmap); /* If cached, retrieve from cache */ if (surface != NULL) guac_common_surface_copy(surface, 0, 0, width, height, client_data->default_surface, bitmap->left, bitmap->top); /* Otherwise, draw with stored image data */ else if (bitmap->data != NULL) { /* Create surface from image data */ cairo_surface_t* image = cairo_image_surface_create_for_data( bitmap->data, CAIRO_FORMAT_RGB24, width, height, 4*bitmap->width); /* Draw image on default surface */ guac_common_surface_draw(client_data->default_surface, bitmap->left, bitmap->top, image); /* Free surface */ cairo_surface_destroy(image); } /* Increment usage counter */ ((guac_rdp_bitmap*) bitmap)->used++; } void guac_rdp_bitmap_free(rdpContext* context, rdpBitmap* bitmap) { guac_client* client = ((rdp_freerdp_context*) context)->client; guac_layer* buffer = ((guac_rdp_bitmap*) bitmap)->buffer; guac_common_surface* surface = ((guac_rdp_bitmap*) bitmap)->surface; /* If cached, free surface */ if (surface != NULL) guac_common_surface_free(surface); /* If cached, free buffer */ if (buffer != NULL) guac_client_free_buffer(client, buffer); } void guac_rdp_bitmap_setsurface(rdpContext* context, rdpBitmap* bitmap, BOOL primary) { guac_client* client = ((rdp_freerdp_context*) context)->client; rdp_guac_client_data* client_data = (rdp_guac_client_data*) client->data; if (primary) client_data->current_surface = client_data->default_surface; else { /* Make sure that the recieved bitmap is not NULL before processing */ if (bitmap == NULL) { guac_client_log(client, GUAC_LOG_INFO, "NULL bitmap found in bitmap_setsurface instruction."); return; } /* If not available as a surface, make available. */ if (((guac_rdp_bitmap*) bitmap)->surface == NULL) guac_rdp_cache_bitmap(context, bitmap); client_data->current_surface = ((guac_rdp_bitmap*) bitmap)->surface; } } #ifdef LEGACY_RDPBITMAP void guac_rdp_bitmap_decompress(rdpContext* context, rdpBitmap* bitmap, UINT8* data, int width, int height, int bpp, int length, BOOL compressed) { #else void guac_rdp_bitmap_decompress(rdpContext* context, rdpBitmap* bitmap, UINT8* data, int width, int height, int bpp, int length, BOOL compressed, int codec_id) { #endif int size = width * height * 4; #ifdef FREERDP_BITMAP_REQUIRES_ALIGNED_MALLOC /* Free pre-existing data, if any (might be reused) */ if (bitmap->data != NULL) _aligned_free(bitmap->data); /* Allocate new data */ bitmap->data = (UINT8*) _aligned_malloc(size, 16); #else /* Free pre-existing data, if any (might be reused) */ free(bitmap->data); /* Allocate new data */ bitmap->data = (UINT8*) malloc(size); #endif if (compressed) { #ifdef HAVE_RDPCONTEXT_CODECS rdpCodecs* codecs = context->codecs; /* Decode as interleaved if less than 32 bits per pixel */ if (bpp < 32) { freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_INTERLEAVED); #ifdef INTERLEAVED_DECOMPRESS_TAKES_PALETTE interleaved_decompress(codecs->interleaved, data, length, bpp, &(bitmap->data), PIXEL_FORMAT_XRGB32, -1, 0, 0, width, height, (BYTE*) ((rdp_freerdp_context*) context)->palette); bitmap->bpp = 32; #else interleaved_decompress(codecs->interleaved, data, length, bpp, &(bitmap->data), PIXEL_FORMAT_XRGB32, -1, 0, 0, width, height); bitmap->bpp = bpp; #endif } /* Otherwise, decode as planar */ else { freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_PLANAR); #ifdef PLANAR_DECOMPRESS_CAN_FLIP planar_decompress(codecs->planar, data, length, &(bitmap->data), PIXEL_FORMAT_XRGB32, -1, 0, 0, width, height, TRUE); bitmap->bpp = 32; #else planar_decompress(codecs->planar, data, length, &(bitmap->data), PIXEL_FORMAT_XRGB32, -1, 0, 0, width, height); bitmap->bpp = bpp; #endif } #else bitmap_decompress(data, bitmap->data, width, height, length, bpp, bpp); bitmap->bpp = bpp; #endif } else { freerdp_image_flip(data, bitmap->data, width, height, bpp); bitmap->bpp = bpp; } bitmap->compressed = FALSE; bitmap->length = size; } guacamole-server-0.9.9/src/protocols/rdp/rdp_gdi.h0000664000175100017510000000537512643542623017121 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_RDP_RDP_GDI_H #define _GUAC_RDP_RDP_GDI_H #include "config.h" #include #include /** * Translates a standard RDP ROP3 value into a guac_composite_mode. */ guac_composite_mode guac_rdp_rop3_transfer_function(guac_client* client, int rop3); /** * Handler for RDP DSTBLT update. */ void guac_rdp_gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt); /** * Handler for RDP PATBLT update. */ void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt); /** * Handler for RDP SCRBLT update. */ void guac_rdp_gdi_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt); /** * Handler for RDP MEMBLT update. */ void guac_rdp_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt); /** * Handler for RDP OPAQUE_RECT update. */ void guac_rdp_gdi_opaquerect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect); /** * Handler called when the remote color palette is changing. */ void guac_rdp_gdi_palette_update(rdpContext* context, PALETTE_UPDATE* palette); /** * Handler called prior to calling the handlers for specific updates when * those updatese are clipped by a bounding rectangle. */ void guac_rdp_gdi_set_bounds(rdpContext* context, rdpBounds* bounds); /** * Handler called when a paint operation is complete. We don't actually * use this, but FreeRDP requires it. */ void guac_rdp_gdi_end_paint(rdpContext* context); /** * Handler called when the desktop dimensions change, either from a * true desktop resize event received by the RDP client, or due to * a revised size given by the server during initial connection * negotiation. */ void guac_rdp_gdi_desktop_resize(rdpContext* context); #endif guacamole-server-0.9.9/src/protocols/rdp/rdp_cliprdr.c0000664000175100017510000002012012643542623017771 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "rdp_cliprdr.h" #include "guac_clipboard.h" #include "guac_iconv.h" #include #include #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-wtypes.h" #endif #ifdef HAVE_FREERDP_CLIENT_CLIPRDR_H #include #else #include "compat/client-cliprdr.h" #endif #include #include void guac_rdp_process_cliprdr_event(guac_client* client, wMessage* event) { #ifdef LEGACY_EVENT switch (event->event_type) { #else switch (GetMessageType(event->id)) { #endif case CliprdrChannel_MonitorReady: guac_rdp_process_cb_monitor_ready(client, event); break; case CliprdrChannel_FormatList: guac_rdp_process_cb_format_list(client, (RDP_CB_FORMAT_LIST_EVENT*) event); break; case CliprdrChannel_DataRequest: guac_rdp_process_cb_data_request(client, (RDP_CB_DATA_REQUEST_EVENT*) event); break; case CliprdrChannel_DataResponse: guac_rdp_process_cb_data_response(client, (RDP_CB_DATA_RESPONSE_EVENT*) event); break; default: #ifdef LEGACY_EVENT guac_client_log(client, GUAC_LOG_INFO, "Unknown cliprdr event type: 0x%x", event->event_type); #else guac_client_log(client, GUAC_LOG_INFO, "Unknown cliprdr event type: 0x%x", GetMessageType(event->id)); #endif } } void guac_rdp_process_cb_monitor_ready(guac_client* client, wMessage* event) { rdpChannels* channels = ((rdp_guac_client_data*) client->data)->rdp_inst->context->channels; RDP_CB_FORMAT_LIST_EVENT* format_list = (RDP_CB_FORMAT_LIST_EVENT*) freerdp_event_new( CliprdrChannel_Class, CliprdrChannel_FormatList, NULL, NULL); /* Received notification of clipboard support. */ /* Respond with supported format list */ format_list->formats = (UINT32*) malloc(sizeof(UINT32)*2); format_list->formats[0] = CB_FORMAT_TEXT; format_list->formats[1] = CB_FORMAT_UNICODETEXT; format_list->num_formats = 2; freerdp_channels_send_event(channels, (wMessage*) format_list); } /** * Sends a clipboard data request for the given format. */ static void __guac_rdp_cb_request_format(guac_client* client, int format) { rdp_guac_client_data* client_data = (rdp_guac_client_data*) client->data; rdpChannels* channels = client_data->rdp_inst->context->channels; /* Create new data request */ RDP_CB_DATA_REQUEST_EVENT* data_request = (RDP_CB_DATA_REQUEST_EVENT*) freerdp_event_new( CliprdrChannel_Class, CliprdrChannel_DataRequest, NULL, NULL); /* Set to requested format */ client_data->requested_clipboard_format = format; data_request->format = format; /* Send request */ freerdp_channels_send_event(channels, (wMessage*) data_request); } void guac_rdp_process_cb_format_list(guac_client* client, RDP_CB_FORMAT_LIST_EVENT* event) { int formats = 0; /* Received notification of available data */ int i; for (i=0; inum_formats; i++) { /* If plain text available, request it */ if (event->formats[i] == CB_FORMAT_TEXT) formats |= GUAC_RDP_CLIPBOARD_FORMAT_CP1252; else if (event->formats[i] == CB_FORMAT_UNICODETEXT) formats |= GUAC_RDP_CLIPBOARD_FORMAT_UTF16; } /* Prefer Unicode to plain text */ if (formats & GUAC_RDP_CLIPBOARD_FORMAT_UTF16) { __guac_rdp_cb_request_format(client, CB_FORMAT_UNICODETEXT); return; } /* Use plain text if Unicode unavailable */ if (formats & GUAC_RDP_CLIPBOARD_FORMAT_CP1252) { __guac_rdp_cb_request_format(client, CB_FORMAT_TEXT); return; } /* Ignore if no supported format available */ guac_client_log(client, GUAC_LOG_INFO, "Ignoring unsupported clipboard data"); } void guac_rdp_process_cb_data_request(guac_client* client, RDP_CB_DATA_REQUEST_EVENT* event) { rdp_guac_client_data* client_data = (rdp_guac_client_data*) client->data; rdpChannels* channels = client_data->rdp_inst->context->channels; guac_iconv_write* writer; const char* input = client_data->clipboard->buffer; char* output = malloc(GUAC_RDP_CLIPBOARD_MAX_LENGTH); RDP_CB_DATA_RESPONSE_EVENT* data_response; /* Determine output encoding */ switch (event->format) { case CB_FORMAT_TEXT: writer = GUAC_WRITE_CP1252; break; case CB_FORMAT_UNICODETEXT: writer = GUAC_WRITE_UTF16; break; default: guac_client_log(client, GUAC_LOG_ERROR, "Server requested unsupported clipboard data type"); return; } /* Create new data response */ data_response = (RDP_CB_DATA_RESPONSE_EVENT*) freerdp_event_new( CliprdrChannel_Class, CliprdrChannel_DataResponse, NULL, NULL); /* Set data and size */ data_response->data = (BYTE*) output; guac_iconv(GUAC_READ_UTF8, &input, client_data->clipboard->length, writer, &output, GUAC_RDP_CLIPBOARD_MAX_LENGTH); data_response->size = ((BYTE*) output) - data_response->data; /* Send response */ freerdp_channels_send_event(channels, (wMessage*) data_response); } void guac_rdp_process_cb_data_response(guac_client* client, RDP_CB_DATA_RESPONSE_EVENT* event) { rdp_guac_client_data* client_data = (rdp_guac_client_data*) client->data; char received_data[GUAC_RDP_CLIPBOARD_MAX_LENGTH]; guac_iconv_read* reader; const char* input = (char*) event->data; char* output = received_data; /* Find correct source encoding */ switch (client_data->requested_clipboard_format) { /* Non-Unicode */ case CB_FORMAT_TEXT: reader = GUAC_READ_CP1252; break; /* Unicode (UTF-16) */ case CB_FORMAT_UNICODETEXT: reader = GUAC_READ_UTF16; break; default: guac_client_log(client, GUAC_LOG_ERROR, "Requested clipboard data in " "unsupported format %i", client_data->requested_clipboard_format); return; } /* Convert send clipboard data */ if (guac_iconv(reader, &input, event->size, GUAC_WRITE_UTF8, &output, sizeof(received_data))) { int length = strnlen(received_data, sizeof(received_data)); guac_common_clipboard_reset(client_data->clipboard, "text/plain"); guac_common_clipboard_append(client_data->clipboard, received_data, length); guac_common_clipboard_send(client_data->clipboard, client); } } guacamole-server-0.9.9/src/protocols/rdp/guac_handlers.h0000664000175100017510000000310012643542623020270 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_RDP_GUAC_HANDLERS_H #define _GUAC_RDP_GUAC_HANDLERS_H #include "config.h" #include int rdp_guac_client_free_handler(guac_client* client); int rdp_guac_client_handle_messages(guac_client* client); int rdp_guac_client_mouse_handler(guac_client* client, int x, int y, int mask); int rdp_guac_client_key_handler(guac_client* client, int keysym, int pressed); int rdp_guac_client_size_handler(guac_client* client, int width, int height); #endif guacamole-server-0.9.9/src/protocols/rdp/rdp_glyph.c0000664000175100017510000001167212643542623017471 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "guac_surface.h" #include "rdp_color.h" #include "rdp_glyph.h" #include "rdp_settings.h" #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-wtypes.h" #endif #include #include #include /* Define cairo_format_stride_for_width() if missing */ #ifndef HAVE_CAIRO_FORMAT_STRIDE_FOR_WIDTH #define cairo_format_stride_for_width(format, width) (width*4) #endif void guac_rdp_glyph_new(rdpContext* context, rdpGlyph* glyph) { int x, y, i; int stride; unsigned char* image_buffer; unsigned char* image_buffer_row; unsigned char* data = glyph->aj; int width = glyph->cx; int height = glyph->cy; /* Init Cairo buffer */ stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width); image_buffer = malloc(height*stride); image_buffer_row = image_buffer; /* Copy image data from image data to buffer */ for (y = 0; ysurface = cairo_image_surface_create_for_data( image_buffer, CAIRO_FORMAT_ARGB32, width, height, stride); } void guac_rdp_glyph_draw(rdpContext* context, rdpGlyph* glyph, int x, int y) { guac_client* client = ((rdp_freerdp_context*) context)->client; rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; guac_common_surface* current_surface = guac_client_data->current_surface; uint32_t fgcolor = guac_client_data->glyph_color; /* Paint with glyph as mask */ guac_common_surface_paint(current_surface, x, y, ((guac_rdp_glyph*) glyph)->surface, (fgcolor & 0xFF0000) >> 16, (fgcolor & 0x00FF00) >> 8, fgcolor & 0x0000FF); } void guac_rdp_glyph_free(rdpContext* context, rdpGlyph* glyph) { unsigned char* image_buffer = cairo_image_surface_get_data( ((guac_rdp_glyph*) glyph)->surface); /* Free surface */ cairo_surface_destroy(((guac_rdp_glyph*) glyph)->surface); free(image_buffer); } void guac_rdp_glyph_begindraw(rdpContext* context, int x, int y, int width, int height, UINT32 fgcolor, UINT32 bgcolor) { guac_client* client = ((rdp_freerdp_context*) context)->client; rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; /* Fill background with color if specified */ if (width != 0 && height != 0) { /* Convert background color */ bgcolor = guac_rdp_convert_color(context, bgcolor); guac_common_surface_rect(guac_client_data->current_surface, x, y, width, height, (bgcolor & 0xFF0000) >> 16, (bgcolor & 0x00FF00) >> 8, bgcolor & 0x0000FF); } /* Convert foreground color */ guac_client_data->glyph_color = guac_rdp_convert_color(context, fgcolor); } void guac_rdp_glyph_enddraw(rdpContext* context, int x, int y, int width, int height, UINT32 fgcolor, UINT32 bgcolor) { /* IGNORE */ } guacamole-server-0.9.9/src/protocols/rdp/rdp_color.h0000664000175100017510000000304312643542623017462 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 GUAC_RDP_COLOR_H #define GUAC_RDP_COLOR_H #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-wtypes.h" #endif /** * Converts the given color to ARGB32. The color given may be an index * referring to the palette, a 16-bit or 32-bit color, etc. all depending on * the current color depth of the RDP session. */ UINT32 guac_rdp_convert_color(rdpContext* context, UINT32 color); #endif guacamole-server-0.9.9/src/protocols/rdp/unicode.c0000664000175100017510000000435412536405625017127 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include #include void guac_rdp_utf16_to_utf8(const unsigned char* utf16, int length, char* utf8, int size) { int i; const uint16_t* in_codepoint = (const uint16_t*) utf16; /* For each UTF-16 character */ for (i=0; i #include /** * The minimum value for width or height, in pixels. */ #define GUAC_RDP_DISP_MIN_SIZE 200 /** * The maximum value for width or height, in pixels. */ #define GUAC_RDP_DISP_MAX_SIZE 8192 /** * The minimum amount of time that must elapse between display size updates, * in milliseconds. */ #define GUAC_RDP_DISP_UPDATE_INTERVAL 500 /** * Display size update module. */ typedef struct guac_rdp_disp { /** * Display control interface. */ DispClientContext* disp; /** * The timestamp of the last display update request, or 0 if no request * has been sent yet. */ guac_timestamp last_request; /** * The last requested screen width, in pixels. */ int requested_width; /** * The last requested screen height, in pixels. */ int requested_height; } guac_rdp_disp; /** * Allocates a new display update module, which will ultimately control the * display update channel once conected. * * @return A new display update module. */ guac_rdp_disp* guac_rdp_disp_alloc(); /** * Frees the given display update module. * * @param disp The display update module to free. */ void guac_rdp_disp_free(guac_rdp_disp* disp); /** * Loads the "disp" plugin for FreeRDP. It is still up to external code to * detect when the "disp" channel is connected, and update the guac_rdp_disp * with a call to guac_rdp_disp_connect(). * * @param context The rdpContext associated with the active RDP session. */ void guac_rdp_disp_load_plugin(rdpContext* context); /** * Stores the given DispClientContext within the given guac_rdp_disp, such that * display updates can be properly sent. Until this is called, changes to the * display size will be deferred. * * @param guac_disp The display update module to associate with the connected * display update channel. * @param disp The DispClientContext associated by FreeRDP with the connected * display update channel. */ void guac_rdp_disp_connect(guac_rdp_disp* guac_disp, DispClientContext* disp); /** * Requests a display size update, which may then be sent immediately to the * RDP server. If an update was recently sent, this update may be delayed until * the RDP server has had time to settle. The width/height values provided may * be automatically altered to comply with the restrictions imposed by the * display update channel. * * @param disp The display update module which should maintain the requested * size, sending the corresponding display update request when * appropriate. * @param context The rdpContext associated with the active RDP session. * @param width The desired display width, in pixels. Due to the restrictions * of the RDP display update channel, this will be contrained to * the range of 200 through 8192 inclusive, and rounded down to * the nearest even number. * @param height The desired display height, in pixels. Due to the restrictions * of the RDP display update channel, this will be contrained to * the range of 200 through 8192 inclusive. */ void guac_rdp_disp_set_size(guac_rdp_disp* disp, rdpContext* context, int width, int height); /** * Sends an actual display update request to the RDP server based on previous * calls to guac_rdp_disp_set_size(). If an update was recently sent, the * update may be delayed until a future call to this function. * * @param disp The display update module which should track the update request. * @param context The rdpContext associated with the active RDP session. */ void guac_rdp_disp_update_size(guac_rdp_disp* disp, rdpContext* context); #endif guacamole-server-0.9.9/src/protocols/rdp/rdp_fs.h0000664000175100017510000002616312643542623016764 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_RDP_FS_H #define __GUAC_RDP_FS_H /** * Functions and macros specific to filesystem handling and initialization * independent of RDP. The functions here may deal with the filesystem device * directly, but their semantics must not deal with RDP protocol messaging. * Functions here represent a virtual Windows-style filesystem on top of UNIX * system calls and structures, using the guac_rdp_fs structure as a home * for common data. * * @file rdp_fs.h */ #include "config.h" #include #include #include #include #include /** * The maximum number of file IDs to provide. */ #define GUAC_RDP_FS_MAX_FILES 128 /** * The maximum number of bytes in a path string. */ #define GUAC_RDP_FS_MAX_PATH 4096 /** * Error code returned when no more file IDs can be allocated. */ #define GUAC_RDP_FS_ENFILE -1 /** * Error code returned when no such file exists. */ #define GUAC_RDP_FS_ENOENT -2 /** * Error code returned when the operation required a directory * but the file was not a directory. */ #define GUAC_RDP_FS_ENOTDIR -3 /** * Error code returned when insufficient space exists to complete * the operation. */ #define GUAC_RDP_FS_ENOSPC -4 /** * Error code returned when the operation requires a normal file but * a directory was given. */ #define GUAC_RDP_FS_EISDIR -5 /** * Error code returned when permission is denied. */ #define GUAC_RDP_FS_EACCES -6 /** * Error code returned when the operation cannot be completed because the * file already exists. */ #define GUAC_RDP_FS_EEXIST -7 /** * Error code returned when invalid parameters were given. */ #define GUAC_RDP_FS_EINVAL -8 /** * Error code returned when the operation is not implemented. */ #define GUAC_RDP_FS_ENOSYS -9 /** * Error code returned when the operation is not supported. */ #define GUAC_RDP_FS_ENOTSUP -10 /* * Access constants. */ #define ACCESS_GENERIC_READ 0x80000000 #define ACCESS_GENERIC_WRITE 0x40000000 #define ACCESS_GENERIC_ALL 0x10000000 #define ACCESS_FILE_READ_DATA 0x00000001 #define ACCESS_FILE_WRITE_DATA 0x00000002 #define ACCESS_FILE_APPEND_DATA 0x00000004 #define ACCESS_DELETE 0x00010000 /* * Create disposition constants. */ #define DISP_FILE_SUPERSEDE 0x00000000 #define DISP_FILE_OPEN 0x00000001 #define DISP_FILE_CREATE 0x00000002 #define DISP_FILE_OPEN_IF 0x00000003 #define DISP_FILE_OVERWRITE 0x00000004 #define DISP_FILE_OVERWRITE_IF 0x00000005 /* * Information constants. * FreeRDP 1.1+ already defines those constants */ #ifdef LEGACY_FREERDP #define FILE_SUPERSEDED 0x00000000 #define FILE_OPENED 0x00000001 #define FILE_OVERWRITTEN 0x00000003 #endif /* * File attributes. */ #define FILE_ATTRIBUTE_READONLY 0x00000001 #define FILE_ATTRIBUTE_HIDDEN 0x00000002 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020 #define FILE_ATTRIBUTE_NORMAL 0x00000080 /* * Filesystem attributes. */ #define FILE_CASE_SENSITIVE_SEARCH 0x00000001 #define FILE_CASE_PRESERVED_NAMES 0x00000002 #define FILE_UNICODE_ON_DISK 0x00000004 /* * File create options. */ #define FILE_DIRECTORY_FILE 0x00000001 #define FILE_NON_DIRECTORY_FILE 0x00000040 /* * File device types. */ #define FILE_DEVICE_DISK 0x00000007 #define SEC_TO_UNIX_EPOCH 11644473600 /** * Converts a Windows timestamp (100 nanosecond intervals since Jan 1, 1601 * UTC) to UNIX timestamp (seconds since Jan 1, 1970 UTC). * * This conversion is lossy. */ #define UNIX_TIME(t) ((time_t) ((t / 10000000 + ((uint64_t) 11644473600)))) /** * Converts a UNIX timestamp (seconds since Jan 1, 1970 UTC) to Windows * timestamp (100 nanosecond intervals since Jan 1, 1601 UTC). */ #define WINDOWS_TIME(t) ((t - ((uint64_t) 11644473600)) * 10000000) /** * An arbitrary file on the virtual filesystem of the Guacamole drive. */ typedef struct guac_rdp_fs_file { /** * The ID of this file. */ int id; /** * The absolute path, including filename, of this file. */ char* absolute_path; /** * The real path of this file on the local filesystem. */ char* real_path; /** * Associated local file descriptor. */ int fd; /** * Associated directory stream, if any. This field only applies * if the file is being used as a directory. */ DIR* dir; /** * The last read dirent structure. This is used if traversing the contents * of a directory. */ struct dirent __dirent; /** * The pattern the check directory contents against, if any. */ char dir_pattern[GUAC_RDP_FS_MAX_PATH]; /** * Bitwise OR of all associated Windows file attributes. */ int attributes; /** * The size of this file, in bytes. */ int size; /** * The time this file was created, as a Windows timestamp. */ uint64_t ctime; /** * The time this file was last modified, as a Windows timestamp. */ uint64_t mtime; /** * The time this file was last accessed, as a Windows timestamp. */ uint64_t atime; /** * The number of bytes written to the file. */ uint64_t bytes_written; } guac_rdp_fs_file; /** * A virtual filesystem implementing RDP-style operations. */ typedef struct guac_rdp_fs { /** * The controlling client. */ guac_client* client; /** * The underlying filesystem object. */ guac_object* object; /** * The root of the filesystem. */ char* drive_path; /** * The number of currently open files. */ int open_files; /** * Pool of file IDs. */ guac_pool* file_id_pool; /** * All available file structures. */ guac_rdp_fs_file files[GUAC_RDP_FS_MAX_FILES]; } guac_rdp_fs; /** * Filesystem information structure. */ typedef struct guac_rdp_fs_info { /** * The number of free blocks available. */ int blocks_available; /** * The number of blocks in the filesystem. */ int blocks_total; /** * The number of bytes per block. */ int block_size; } guac_rdp_fs_info; /** * Allocates a new filesystem given a root path. */ guac_rdp_fs* guac_rdp_fs_alloc(guac_client* client, const char* drive_path, int create_drive_path); /** * Frees the given filesystem. */ void guac_rdp_fs_free(guac_rdp_fs* fs); /** * Converts the given relative path to an absolute path based on the given * parent path. If the path cannot be converted, non-zero is returned. */ int guac_rdp_fs_convert_path(const char* parent, const char* rel_path, char* abs_path); /** * Translates the given errno error code to a GUAC_RDP_FS error code. */ int guac_rdp_fs_get_errorcode(int err); /** * Teanslates the given GUAC_RDP_FS error code to an RDPDR status code. */ int guac_rdp_fs_get_status(int err); /** * Returns the next available file ID, or an error code less than zero * if an error occurs. */ int guac_rdp_fs_open(guac_rdp_fs* fs, const char* path, int access, int file_attributes, int create_disposition, int create_options); /** * Reads up to the given length of bytes from the given offset within the * file having the given ID. Returns the number of bytes read, zero on EOF, * and an error code if an error occurs. */ int guac_rdp_fs_read(guac_rdp_fs* fs, int file_id, int offset, void* buffer, int length); /** * Writes up to the given length of bytes from the given offset within the * file having the given ID. Returns the number of bytes written, and an * error code if an error occurs. */ int guac_rdp_fs_write(guac_rdp_fs* fs, int file_id, int offset, void* buffer, int length); /** * Renames (moves) the file with the given ID to the new path specified. * Returns zero on success, or an error code if an error occurs. */ int guac_rdp_fs_rename(guac_rdp_fs* fs, int file_id, const char* new_path); /** * Deletes the file with the given ID. */ int guac_rdp_fs_delete(guac_rdp_fs* fs, int file_id); /** * Truncates the file with the given ID to the given length (in bytes), which * may be larger. */ int guac_rdp_fs_truncate(guac_rdp_fs* fs, int file_id, int length); /** * Frees the given file ID, allowing future open operations to reuse it. */ void guac_rdp_fs_close(guac_rdp_fs* fs, int file_id); /** * Given an arbitrary path, which may contain ".." and ".", creates an * absolute path which does NOT contain ".." or ".". */ int guac_rdp_fs_normalize_path(const char* path, char* abs_path); /** * Given a parent path and a relative path, produces a normalized absolute path. */ int guac_rdp_fs_convert_path(const char* parent, const char* rel_path, char* abs_path); /** * Returns the next filename within the directory having the given file ID, * or NULL if no more files. */ const char* guac_rdp_fs_read_dir(guac_rdp_fs* fs, int file_id); /** * Returns the file having the given ID, or NULL if no such file exists. */ guac_rdp_fs_file* guac_rdp_fs_get_file(guac_rdp_fs* fs, int file_id); /** * Returns whether the given filename matches the given pattern. */ int guac_rdp_fs_matches(const char* filename, const char* pattern); /** * Populates the given structure with information about the filesystem, * particularly the amount of space available. */ int guac_rdp_fs_get_info(guac_rdp_fs* fs, guac_rdp_fs_info* info); /** * Concatenates the given filename with the given path, separating the two * with a single forward slash. The full result must be no more than * GUAC_RDP_FS_MAX_PATH bytes long, counting null terminator. * * @param fullpath * The buffer to store the result within. This buffer must be at least * GUAC_RDP_FS_MAX_PATH bytes long. * * @param path * The path to append the filename to. * * @param filename * The filename to append to the path. * * @return * Non-zero if the filename is valid and was successfully appended to the * path, zero otherwise. */ int guac_rdp_fs_append_filename(char* fullpath, const char* path, const char* filename); #endif guacamole-server-0.9.9/src/protocols/rdp/client.h0000664000175100017510000001534112643542623016761 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_RDP_CLIENT_H #define _GUAC_RDP_CLIENT_H #include "config.h" #include "guac_clipboard.h" #include "guac_list.h" #include "guac_surface.h" #include "rdp_fs.h" #include "rdp_keymap.h" #include "rdp_settings.h" #ifdef ENABLE_COMMON_SSH #include "guac_sftp.h" #include "guac_ssh.h" #include "guac_ssh_user.h" #endif #ifdef HAVE_FREERDP_DISPLAY_UPDATE_SUPPORT #include "rdp_disp.h" #endif #include #include #include #include #include #include /** * The maximum duration of a frame in milliseconds. */ #define GUAC_RDP_FRAME_DURATION 60 /** * The amount of time to allow per message read within a frame, in * milliseconds. If the server is silent for at least this amount of time, the * frame will be considered finished. */ #define GUAC_RDP_FRAME_TIMEOUT 10 /** * The native resolution of most RDP connections. As Windows and other systems * rely heavily on forced 96 DPI, we must assume 96 DPI. */ #define GUAC_RDP_NATIVE_RESOLUTION 96 /** * The resolution of an RDP connection that would be considered high, but is * tolerable in the case that the client display would be unreasonably small * otherwise. */ #define GUAC_RDP_HIGH_RESOLUTION 120 /** * The smallest area, in pixels^2, that would be considered reasonable large * screen DPI needs to be adjusted. */ #define GUAC_RDP_REASONABLE_AREA (800*600) /** * The maximum number of bytes to allow within the clipboard. */ #define GUAC_RDP_CLIPBOARD_MAX_LENGTH 262144 /** * Initial rate of audio to stream, in Hz. If the RDP server uses a different * value, the Guacamole audio stream will simply be reset appropriately. */ #define GUAC_RDP_AUDIO_RATE 44100 /** * The number of channels to stream for audio. If the RDP server uses a * different value, the Guacamole audio stream will simply be reset * appropriately. */ #define GUAC_RDP_AUDIO_CHANNELS 2 /** * The number of bits per sample within the audio stream. If the RDP server * uses a different value, the Guacamole audio stream will simply be reset * appropriately. */ #define GUAC_RDP_AUDIO_BPS 16 /** * Client data that will remain accessible through the guac_client. * This should generally include data commonly used by Guacamole handlers. */ typedef struct rdp_guac_client_data { /** * Pointer to the FreeRDP client instance handling the current connection. */ freerdp* rdp_inst; /** * All settings associated with the current or pending RDP connection. */ guac_rdp_settings settings; /** * Button mask containing the OR'd value of all currently pressed buttons. */ int mouse_button_mask; /** * Foreground color for any future glyphs. */ uint32_t glyph_color; /** * The display. */ guac_common_surface* default_surface; /** * The surface that GDI operations should draw to. RDP messages exist which * change this surface to allow drawing to occur off-screen. */ guac_common_surface* current_surface; /** * The keymap to use when translating keysyms into scancodes or sequences * of scancodes for RDP. */ guac_rdp_static_keymap keymap; /** * The state of all keys, based on whether events for pressing/releasing * particular keysyms have been received. This is necessary in order to * determine which keys must be released/pressed when a particular * keysym can only be typed through a sequence of scancodes (such as * an Alt-code) because the server-side keymap does not support that * keysym. */ guac_rdp_keysym_state_map keysym_state; /** * The current clipboard contents. */ guac_common_clipboard* clipboard; /** * The format of the clipboard which was requested. Data received from * the RDP server should conform to this format. This will be one of * several legal clipboard format values defined within FreeRDP, such as * CB_FORMAT_TEXT. */ int requested_clipboard_format; /** * Audio output, if any. */ guac_audio_stream* audio; /** * The filesystem being shared, if any. */ guac_rdp_fs* filesystem; #ifdef ENABLE_COMMON_SSH /** * The user and credentials used to authenticate for SFTP. */ guac_common_ssh_user* sftp_user; /** * The SSH session used for SFTP. */ guac_common_ssh_session* sftp_session; /** * The exposed filesystem object, implemented with SFTP. */ guac_object* sftp_filesystem; #endif #ifdef HAVE_FREERDP_DISPLAY_UPDATE_SUPPORT /** * Display size update module. */ guac_rdp_disp* disp; #endif /** * List of all available static virtual channels. */ guac_common_list* available_svc; /** * Lock which is locked and unlocked for each RDP message. */ pthread_mutex_t rdp_lock; /** * Common attributes for locks. */ pthread_mutexattr_t attributes; } rdp_guac_client_data; /** * Client data that will remain accessible through the RDP context. * This should generally include data commonly used by FreeRDP handlers. */ typedef struct rdp_freerdp_context { /** * The parent context. THIS MUST BE THE FIRST ELEMENT. */ rdpContext _p; /** * Pointer to the guac_client instance handling the RDP connection with * this context. */ guac_client* client; /** * Color conversion structure to be used to convert RDP images to PNGs. */ CLRCONV* clrconv; /** * The current color palette, as received from the RDP server. */ UINT32 palette[256]; } rdp_freerdp_context; #endif guacamole-server-0.9.9/src/protocols/rdp/rdp_pointer.h0000664000175100017510000000344112643542623020026 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_RDP_RDP_POINTER_H #define _GUAC_RDP_RDP_POINTER_H #include "config.h" #include #include typedef struct guac_rdp_pointer { /** * FreeRDP pointer data - MUST GO FIRST. */ rdpPointer pointer; /** * Guacamole layer containing cached image data. */ guac_layer* layer; } guac_rdp_pointer; void guac_rdp_pointer_new(rdpContext* context, rdpPointer* pointer); void guac_rdp_pointer_set(rdpContext* context, rdpPointer* pointer); void guac_rdp_pointer_free(rdpContext* context, rdpPointer* pointer); void guac_rdp_pointer_set_null(rdpContext* context); void guac_rdp_pointer_set_default(rdpContext* context); #endif guacamole-server-0.9.9/src/protocols/rdp/guac_rdpsnd/0000775000175100017510000000000012645400336017673 500000000000000guacamole-server-0.9.9/src/protocols/rdp/guac_rdpsnd/rdpsnd_service.h0000664000175100017510000001047512626724073023013 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 __GUAC_RDPSND_SERVICE_H #define __GUAC_RDPSND_SERVICE_H #include "config.h" #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif /** * The maximum number of PCM formats to accept during the initial RDPSND * handshake with the RDP server. */ #define GUAC_RDP_MAX_FORMATS 16 /** * Abstract representation of a PCM format, including the sample rate, number * of channels, and bits per sample. */ typedef struct guac_pcm_format { /** * The sample rate of this PCM format. */ int rate; /** * The number off channels used by this PCM format. This will typically * be 1 or 2. */ int channels; /** * The number of bits per sample within this PCM format. This should be * either 8 or 16. */ int bps; } guac_pcm_format; /** * Structure representing the current state of the Guacamole RDPSND plugin for * FreeRDP. */ typedef struct guac_rdpsndPlugin { /** * The FreeRDP parts of this plugin. This absolutely MUST be first. * FreeRDP depends on accessing this structure as if it were an instance * of rdpSvcPlugin. */ rdpSvcPlugin plugin; /** * The Guacamole client associated with the guac_audio_stream that this * plugin should use to stream received audio packets. */ guac_client* client; /** * The block number of the last SNDC_WAVE (WaveInfo) PDU received. */ int waveinfo_block_number; /** * Whether the next PDU coming is a SNDWAVE (Wave) PDU. Wave PDUs do not * have headers, and are indicated by the receipt of a WaveInfo PDU. */ int next_pdu_is_wave; /** * The wave data received within the last SNDC_WAVE (WaveInfo) PDU. */ unsigned char initial_wave_data[4]; /** * The size, in bytes, of the wave data in the coming Wave PDU, if any. * This does not include the initial wave data received within the last * SNDC_WAVE (WaveInfo) PDU, which is always the first four bytes of the * actual wave data block. */ int incoming_wave_size; /** * The last received server timestamp. */ int server_timestamp; /** * All formats agreed upon by server and client during the initial format * exchange. All of these formats will be PCM, which is the only format * guaranteed to be supported (based on the official RDP documentation). */ guac_pcm_format formats[GUAC_RDP_MAX_FORMATS]; /** * The total number of formats. */ int format_count; } guac_rdpsndPlugin; /** * Handler called when this plugin is loaded by FreeRDP. */ void guac_rdpsnd_process_connect(rdpSvcPlugin* plugin); /** * Handler called when this plugin receives data along its designated channel. */ void guac_rdpsnd_process_receive(rdpSvcPlugin* plugin, wStream* input_stream); /** * Handler called when this plugin is being unloaded. */ void guac_rdpsnd_process_terminate(rdpSvcPlugin* plugin); /** * Handler called when this plugin receives an event. For the sake of RDPSND, * all events will be ignored and simply free'd. */ void guac_rdpsnd_process_event(rdpSvcPlugin* plugin, wMessage* event); #endif guacamole-server-0.9.9/src/protocols/rdp/guac_rdpsnd/rdpsnd_messages.c0000664000175100017510000002611612626724073023154 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "rdpsnd_messages.h" #include "rdpsnd_service.h" #include #include #include #include #include #ifdef ENABLE_WINPR #include #include #else #include "compat/winpr-stream.h" #include "compat/winpr-wtypes.h" #endif /* MESSAGE HANDLERS */ void guac_rdpsnd_formats_handler(guac_rdpsndPlugin* rdpsnd, wStream* input_stream, guac_rdpsnd_pdu_header* header) { int server_format_count; int server_version; int i; wStream* output_stream; int output_body_size; unsigned char* output_stream_end; /* Get associated client data */ guac_client* client = rdpsnd->client; rdp_guac_client_data* client_data = (rdp_guac_client_data*) client->data; /* Get audio stream from client data */ guac_audio_stream* audio = client_data->audio; /* Format header */ Stream_Seek(input_stream, 14); Stream_Read_UINT16(input_stream, server_format_count); Stream_Seek_UINT8(input_stream); Stream_Read_UINT16(input_stream, server_version); Stream_Seek_UINT8(input_stream); /* Initialize Client Audio Formats and Version PDU */ output_stream = Stream_New(NULL, 24); Stream_Write_UINT8(output_stream, SNDC_FORMATS); Stream_Write_UINT8(output_stream, 0); /* Fill in body size later */ Stream_Seek_UINT16(output_stream); /* offset = 0x02 */ /* Flags, volume, and pitch */ Stream_Write_UINT32(output_stream, TSSNDCAPS_ALIVE); Stream_Write_UINT32(output_stream, 0); Stream_Write_UINT32(output_stream, 0); /* Datagram port (UDP) */ Stream_Write_UINT16(output_stream, 0); /* Fill in format count later */ Stream_Seek_UINT16(output_stream); /* offset = 0x12 */ /* Version and padding */ Stream_Write_UINT8(output_stream, 0); Stream_Write_UINT16(output_stream, 6); Stream_Write_UINT8(output_stream, 0); /* Check each server format, respond if supported and audio is enabled */ if (audio != NULL) { for (i=0; i < server_format_count; i++) { unsigned char* format_start; int format_tag; int channels; int rate; int bps; int body_size; /* Remember position in stream */ Stream_GetPointer(input_stream, format_start); /* Read format */ Stream_Read_UINT16(input_stream, format_tag); Stream_Read_UINT16(input_stream, channels); Stream_Read_UINT32(input_stream, rate); Stream_Seek_UINT32(input_stream); Stream_Seek_UINT16(input_stream); Stream_Read_UINT16(input_stream, bps); /* Skip past extra data */ Stream_Read_UINT16(input_stream, body_size); Stream_Seek(input_stream, body_size); /* If PCM, accept */ if (format_tag == WAVE_FORMAT_PCM) { /* If can fit another format, accept it */ if (rdpsnd->format_count < GUAC_RDP_MAX_FORMATS) { /* Add channel */ int current = rdpsnd->format_count++; rdpsnd->formats[current].rate = rate; rdpsnd->formats[current].channels = channels; rdpsnd->formats[current].bps = bps; /* Log format */ guac_client_log(client, GUAC_LOG_INFO, "Accepted format: %i-bit PCM with %i channels at " "%i Hz", bps, channels, rate); /* Ensure audio stream is configured to use accepted * format */ guac_audio_stream_reset(audio, NULL, rate, channels, bps); /* Queue format for sending as accepted */ Stream_EnsureRemainingCapacity(output_stream, 18 + body_size); Stream_Write(output_stream, format_start, 18 + body_size); /* * BEWARE that using Stream_EnsureRemainingCapacity means * that any pointers returned via Stream_GetPointer on * output_stream are invalid. */ } /* Otherwise, log that we dropped one */ else guac_client_log(client, GUAC_LOG_INFO, "Dropped valid format: %i-bit PCM with %i " "channels at %i Hz", bps, channels, rate); } } } /* Otherwise, ignore all supported formats as we do not intend to actually * receive audio */ else guac_client_log(client, GUAC_LOG_DEBUG, "Audio explicitly disabled. Ignoring supported formats."); /* Calculate size of PDU */ output_body_size = Stream_GetPosition(output_stream) - 4; Stream_GetPointer(output_stream, output_stream_end); /* Set body size */ Stream_SetPosition(output_stream, 0x02); Stream_Write_UINT16(output_stream, output_body_size); /* Set format count */ Stream_SetPosition(output_stream, 0x12); Stream_Write_UINT16(output_stream, rdpsnd->format_count); /* Reposition cursor at end (necessary for message send) */ Stream_SetPointer(output_stream, output_stream_end); /* Send accepted formats */ pthread_mutex_lock(&(client_data->rdp_lock)); svc_plugin_send((rdpSvcPlugin*)rdpsnd, output_stream); /* If version greater than 6, must send Quality Mode PDU */ if (server_version >= 6) { /* Always send High Quality for now */ output_stream = Stream_New(NULL, 8); Stream_Write_UINT8(output_stream, SNDC_QUALITYMODE); Stream_Write_UINT8(output_stream, 0); Stream_Write_UINT16(output_stream, 4); Stream_Write_UINT16(output_stream, HIGH_QUALITY); Stream_Write_UINT16(output_stream, 0); svc_plugin_send((rdpSvcPlugin*)rdpsnd, output_stream); } pthread_mutex_unlock(&(client_data->rdp_lock)); } /* server is getting a feel of the round trip time */ void guac_rdpsnd_training_handler(guac_rdpsndPlugin* rdpsnd, wStream* input_stream, guac_rdpsnd_pdu_header* header) { int data_size; wStream* output_stream; /* Get associated client data */ guac_client* client = rdpsnd->client; rdp_guac_client_data* client_data = (rdp_guac_client_data*) client->data; /* Read timestamp and data size */ Stream_Read_UINT16(input_stream, rdpsnd->server_timestamp); Stream_Read_UINT16(input_stream, data_size); /* Send training response */ output_stream = Stream_New(NULL, 8); Stream_Write_UINT8(output_stream, SNDC_TRAINING); Stream_Write_UINT8(output_stream, 0); Stream_Write_UINT16(output_stream, 4); Stream_Write_UINT16(output_stream, rdpsnd->server_timestamp); Stream_Write_UINT16(output_stream, data_size); pthread_mutex_lock(&(client_data->rdp_lock)); svc_plugin_send((rdpSvcPlugin*) rdpsnd, output_stream); pthread_mutex_unlock(&(client_data->rdp_lock)); } void guac_rdpsnd_wave_info_handler(guac_rdpsndPlugin* rdpsnd, wStream* input_stream, guac_rdpsnd_pdu_header* header) { int format; /* Get associated client data */ guac_client* client = rdpsnd->client; rdp_guac_client_data* client_data = (rdp_guac_client_data*) client->data; /* Get audio stream from client data */ guac_audio_stream* audio = client_data->audio; /* Read wave information */ Stream_Read_UINT16(input_stream, rdpsnd->server_timestamp); Stream_Read_UINT16(input_stream, format); Stream_Read_UINT8(input_stream, rdpsnd->waveinfo_block_number); Stream_Seek(input_stream, 3); Stream_Read(input_stream, rdpsnd->initial_wave_data, 4); /* * Size of incoming wave data is equal to the body size field of this * header, less the size of a WaveInfo PDU (not including the header), * thus body_size - 12. */ rdpsnd->incoming_wave_size = header->body_size - 12; /* Read wave in next iteration */ rdpsnd->next_pdu_is_wave = TRUE; /* Reset audio stream if format has changed */ if (audio != NULL) guac_audio_stream_reset(audio, NULL, rdpsnd->formats[format].rate, rdpsnd->formats[format].channels, rdpsnd->formats[format].bps); } void guac_rdpsnd_wave_handler(guac_rdpsndPlugin* rdpsnd, wStream* input_stream, guac_rdpsnd_pdu_header* header) { rdpSvcPlugin* plugin = (rdpSvcPlugin*)rdpsnd; /* Get associated client data */ guac_client* client = rdpsnd->client; rdp_guac_client_data* client_data = (rdp_guac_client_data*) client->data; /* Get audio stream from client data */ guac_audio_stream* audio = client_data->audio; /* Wave Confirmation PDU */ wStream* output_stream = Stream_New(NULL, 8); /* Get wave data */ unsigned char* buffer = Stream_Buffer(input_stream); /* Copy over first four bytes */ memcpy(buffer, rdpsnd->initial_wave_data, 4); /* Write rest of audio packet */ if (audio != NULL) { guac_audio_stream_write_pcm(audio, buffer, rdpsnd->incoming_wave_size + 4); guac_audio_stream_flush(audio); } /* Write Wave Confirmation PDU */ Stream_Write_UINT8(output_stream, SNDC_WAVECONFIRM); Stream_Write_UINT8(output_stream, 0); Stream_Write_UINT16(output_stream, 4); Stream_Write_UINT16(output_stream, rdpsnd->server_timestamp); Stream_Write_UINT8(output_stream, rdpsnd->waveinfo_block_number); Stream_Write_UINT8(output_stream, 0); /* Send Wave Confirmation PDU */ pthread_mutex_lock(&(client_data->rdp_lock)); svc_plugin_send(plugin, output_stream); pthread_mutex_unlock(&(client_data->rdp_lock)); /* We no longer expect to receive wave data */ rdpsnd->next_pdu_is_wave = FALSE; } void guac_rdpsnd_close_handler(guac_rdpsndPlugin* rdpsnd, wStream* input_stream, guac_rdpsnd_pdu_header* header) { /* Do nothing */ } guacamole-server-0.9.9/src/protocols/rdp/guac_rdpsnd/rdpsnd_service.c0000664000175100017510000001056312626724073023004 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "config.h" #include "rdpsnd_service.h" #include "rdpsnd_messages.h" #include #include #include #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif /** * Entry point for RDPSND virtual channel. */ int VirtualChannelEntry(PCHANNEL_ENTRY_POINTS pEntryPoints) { /* Allocate plugin */ guac_rdpsndPlugin* rdpsnd = (guac_rdpsndPlugin*) calloc(1, sizeof(guac_rdpsndPlugin)); /* Init channel def */ strcpy(rdpsnd->plugin.channel_def.name, "rdpsnd"); rdpsnd->plugin.channel_def.options = CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP; /* Set callbacks */ rdpsnd->plugin.connect_callback = guac_rdpsnd_process_connect; rdpsnd->plugin.receive_callback = guac_rdpsnd_process_receive; rdpsnd->plugin.event_callback = guac_rdpsnd_process_event; rdpsnd->plugin.terminate_callback = guac_rdpsnd_process_terminate; /* Finish init */ svc_plugin_init((rdpSvcPlugin*) rdpsnd, pEntryPoints); return 1; } /* * Service Handlers */ void guac_rdpsnd_process_connect(rdpSvcPlugin* plugin) { guac_rdpsndPlugin* rdpsnd = (guac_rdpsndPlugin*) plugin; /* Get client from plugin parameters */ guac_client* client = rdpsnd->client = (guac_client*) plugin->channel_entry_points.pExtendedData; /* NULL out pExtendedData so we don't lose our guac_client due to an * automatic free() within libfreerdp */ plugin->channel_entry_points.pExtendedData = NULL; #ifdef RDPSVCPLUGIN_INTERVAL_MS /* Update every 10 ms */ plugin->interval_ms = 10; #endif /* Log that sound has been loaded */ guac_client_log(client, GUAC_LOG_INFO, "guacsnd connected."); } void guac_rdpsnd_process_terminate(rdpSvcPlugin* plugin) { free(plugin); } void guac_rdpsnd_process_event(rdpSvcPlugin* plugin, wMessage* event) { freerdp_event_free(event); } void guac_rdpsnd_process_receive(rdpSvcPlugin* plugin, wStream* input_stream) { guac_rdpsndPlugin* rdpsnd = (guac_rdpsndPlugin*) plugin; guac_rdpsnd_pdu_header header; /* Read RDPSND PDU header */ Stream_Read_UINT8(input_stream, header.message_type); Stream_Seek_UINT8(input_stream); Stream_Read_UINT16(input_stream, header.body_size); /* * If next PDU is SNDWAVE (due to receiving WaveInfo PDU previously), * ignore the header and parse as a Wave PDU. */ if (rdpsnd->next_pdu_is_wave) { guac_rdpsnd_wave_handler(rdpsnd, input_stream, &header); return; } /* Dispatch message to standard handlers */ switch (header.message_type) { /* Server Audio Formats and Version PDU */ case SNDC_FORMATS: guac_rdpsnd_formats_handler(rdpsnd, input_stream, &header); break; /* Training PDU */ case SNDC_TRAINING: guac_rdpsnd_training_handler(rdpsnd, input_stream, &header); break; /* WaveInfo PDU */ case SNDC_WAVE: guac_rdpsnd_wave_info_handler(rdpsnd, input_stream, &header); break; /* Close PDU */ case SNDC_CLOSE: guac_rdpsnd_close_handler(rdpsnd, input_stream, &header); break; } } guacamole-server-0.9.9/src/protocols/rdp/guac_rdpsnd/rdpsnd_messages.h0000664000175100017510000001514712626724073023163 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 __GUAC_RDPSND_MESSAGES_H #define __GUAC_RDPSND_MESSAGES_H #include "config.h" #include "rdpsnd_service.h" #ifdef ENABLE_WINPR #include #else #include "compat/winpr-stream.h" #endif /* * PDU Message Types */ /** * Close PDU */ #define SNDC_CLOSE 1 /** * WaveInfo PDU. This PDU is sent just before wave data is sent. */ #define SNDC_WAVE 2 /** * Wave Confirm PDU. This PDU is sent in response to the WaveInfo PDU, * confirming it has been received and played. */ #define SNDC_WAVECONFIRM 5 /** * Training PDU. This PDU is sent by the server occasionally and must be * responded to with another training PDU, similar to Guac's sync message. */ #define SNDC_TRAINING 6 /** * Server Audio Formats and Version PDU. This PDU is sent by the server to * advertise to the client which audio formats are supported. */ #define SNDC_FORMATS 7 /** * Quality Mode PDU. This PDU must be sent by the client to select an audio * quality mode if the server is at least version 6. */ #define SNDC_QUALITYMODE 12 /* * Quality Modes */ /** * Dynamic Quality. The server will choose the audio quality based on its * perception of latency. */ #define DYNAMIC_QUALITY 0x0000 /** * Medium Quality. The server prioritizes bandwidth over quality. */ #define MEDIUM_QUALITY 0x0001 /** * High Quality. The server prioritizes quality over bandwidth. */ #define HIGH_QUALITY 0x0002 /* * Capabilities */ #define TSSNDCAPS_ALIVE 1 /* * Sound Formats */ #define WAVE_FORMAT_PCM 1 /** * The header common to all RDPSND PDUs. */ typedef struct guac_rdpsnd_pdu_header { /** * The type of message represented by this PDU (SNDC_WAVE, etc.) */ int message_type; /** * The size of the remainder of the message. */ int body_size; } guac_rdpsnd_pdu_header; /** * Handler for the SNDC_FORMATS (Server Audio Formats and Version) PDU. The * SNDC_FORMATS PDU describes all audio formats supported by the RDP server, as * well as the version of RDPSND implemented. * * @param rdpsnd * The Guacamole RDPSND plugin receiving the SNDC_FORMATS PDU. * * @param input_stream * The FreeRDP input stream containing the remaining raw bytes (after the * common header) of the SNDC_FORMATS PDU. * * @param header * The header content of the SNDC_FORMATS PDU. All RDPSND messages contain * the same header information. */ void guac_rdpsnd_formats_handler(guac_rdpsndPlugin* rdpsnd, wStream* input_stream, guac_rdpsnd_pdu_header* header); /** * Handler for the SNDC_TRAINING (Training) PDU. The SNDC_TRAINING PDU is used * to by RDP servers to test audio streaming latency, etc. without actually * sending audio data. See: * * https://msdn.microsoft.com/en-us/library/cc240961.aspx * * @param rdpsnd * The Guacamole RDPSND plugin receiving the SNDC_TRAINING PDU. * * @param input_stream * The FreeRDP input stream containing the remaining raw bytes (after the * common header) of the SNDC_TRAINING PDU. * * @param header * The header content of the SNDC_TRAINING PDU. All RDPSND messages contain * the same header information. */ void guac_rdpsnd_training_handler(guac_rdpsndPlugin* rdpsnd, wStream* input_stream, guac_rdpsnd_pdu_header* header); /** * Handler for the SNDC_WAVE (WaveInfo) PDU. The SNDC_WAVE immediately precedes * a SNDWAV PDU and describes the data about to be received. It also (very * strangely) contains exactly 4 bytes of audio data. The following SNDWAV PDU * then contains 4 bytes of padding prior to the audio data where it would make * perfect sense for this data to go. See: * * https://msdn.microsoft.com/en-us/library/cc240963.aspx * * @param rdpsnd * The Guacamole RDPSND plugin receiving the SNDC_WAVE PDU. * * @param input_stream * The FreeRDP input stream containing the remaining raw bytes (after the * common header) of the SNDC_WAVE PDU. * * @param header * The header content of the SNDC_WAVE PDU. All RDPSND messages contain * the same header information. */ void guac_rdpsnd_wave_info_handler(guac_rdpsndPlugin* rdpsnd, wStream* input_stream, guac_rdpsnd_pdu_header* header); /** * Handler for the SNDWAV (Wave) PDU which follows any WaveInfo PDU. The SNDWAV * PDU contains the actual audio data, less the four bytes of audio data * included in the SNDC_WAVE PDU. * * @param rdpsnd * The Guacamole RDPSND plugin receiving the SNDWAV PDU. * * @param input_stream * The FreeRDP input stream containing the remaining raw bytes (after the * common header) of the SNDWAV PDU. * * @param header * The header content of the SNDWAV PDU. All RDPSND messages contain * the same header information. */ void guac_rdpsnd_wave_handler(guac_rdpsndPlugin* rdpsnd, wStream* input_stream, guac_rdpsnd_pdu_header* header); /** * Handler for the SNDC_CLOSE (Close) PDU. This PDU is sent when audio * streaming has stopped. This PDU is currently ignored by Guacamole. See: * * https://msdn.microsoft.com/en-us/library/cc240970.aspx * * @param rdpsnd * The Guacamole RDPSND plugin receiving the SNDC_CLOSE PDU. * * @param input_stream * The FreeRDP input stream containing the remaining raw bytes (after the * common header) of the SNDC_CLOSE PDU. * * @param header * The header content of the SNDC_CLOSE PDU. All RDPSND messages contain * the same header information. */ void guac_rdpsnd_close_handler(guac_rdpsndPlugin* rdpsnd, wStream* input_stream, guac_rdpsnd_pdu_header* header); #endif guacamole-server-0.9.9/src/protocols/rdp/client.c0000664000175100017510000010200012643542623016741 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "guac_handlers.h" #include "guac_pointer_cursor.h" #include "guac_string.h" #include "rdp_bitmap.h" #include "rdp_gdi.h" #include "rdp_glyph.h" #include "rdp_keymap.h" #include "rdp_pointer.h" #include "rdp_stream.h" #include "rdp_svc.h" #include "resolution.h" #ifdef ENABLE_COMMON_SSH #include "guac_sftp.h" #include "guac_ssh.h" #include "sftp.h" #endif #ifdef HAVE_FREERDP_DISPLAY_UPDATE_SUPPORT #include "rdp_disp.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_FREERDP_CLIENT_CLIPRDR_H #include #else #include "compat/client-cliprdr.h" #endif #ifdef HAVE_FREERDP_CLIENT_DISP_H #include #endif #ifdef HAVE_FREERDP_EVENT_PUBSUB #include #endif #ifdef ENABLE_WINPR #include #else #include "compat/winpr-wtypes.h" #endif #ifdef HAVE_FREERDP_ADDIN_H #include #endif #ifdef HAVE_FREERDP_CLIENT_CHANNELS_H #include #endif #ifdef HAVE_FREERDP_VERSION_H #include #endif #include #include #include #include /* Client plugin arguments */ const char* GUAC_CLIENT_ARGS[] = { "hostname", "port", "domain", "username", "password", "width", "height", "dpi", "initial-program", "color-depth", "disable-audio", "enable-printing", "enable-drive", "drive-path", "create-drive-path", "console", "console-audio", "server-layout", "security", "ignore-cert", "disable-auth", "remote-app", "remote-app-dir", "remote-app-args", "static-channels", "client-name", "enable-wallpaper", "enable-theming", "enable-font-smoothing", "enable-full-window-drag", "enable-desktop-composition", "enable-menu-animations", "preconnection-id", "preconnection-blob", #ifdef ENABLE_COMMON_SSH "enable-sftp", "sftp-hostname", "sftp-port", "sftp-username", "sftp-password", "sftp-private-key", "sftp-passphrase", "sftp-directory", #endif NULL }; enum RDP_ARGS_IDX { IDX_HOSTNAME, IDX_PORT, IDX_DOMAIN, IDX_USERNAME, IDX_PASSWORD, IDX_WIDTH, IDX_HEIGHT, IDX_DPI, IDX_INITIAL_PROGRAM, IDX_COLOR_DEPTH, IDX_DISABLE_AUDIO, IDX_ENABLE_PRINTING, IDX_ENABLE_DRIVE, IDX_DRIVE_PATH, IDX_CREATE_DRIVE_PATH, IDX_CONSOLE, IDX_CONSOLE_AUDIO, IDX_SERVER_LAYOUT, IDX_SECURITY, IDX_IGNORE_CERT, IDX_DISABLE_AUTH, IDX_REMOTE_APP, IDX_REMOTE_APP_DIR, IDX_REMOTE_APP_ARGS, IDX_STATIC_CHANNELS, IDX_CLIENT_NAME, IDX_ENABLE_WALLPAPER, IDX_ENABLE_THEMING, IDX_ENABLE_FONT_SMOOTHING, IDX_ENABLE_FULL_WINDOW_DRAG, IDX_ENABLE_DESKTOP_COMPOSITION, IDX_ENABLE_MENU_ANIMATIONS, IDX_PRECONNECTION_ID, IDX_PRECONNECTION_BLOB, #ifdef ENABLE_COMMON_SSH IDX_ENABLE_SFTP, IDX_SFTP_HOSTNAME, IDX_SFTP_PORT, IDX_SFTP_USERNAME, IDX_SFTP_PASSWORD, IDX_SFTP_PRIVATE_KEY, IDX_SFTP_PASSPHRASE, IDX_SFTP_DIRECTORY, #endif RDP_ARGS_COUNT }; #if defined(FREERDP_VERSION_MAJOR) && (FREERDP_VERSION_MAJOR > 1 || FREERDP_VERSION_MINOR >= 2) int __guac_receive_channel_data(freerdp* rdp_inst, UINT16 channelId, BYTE* data, int size, int flags, int total_size) { #else int __guac_receive_channel_data(freerdp* rdp_inst, int channelId, UINT8* data, int size, int flags, int total_size) { #endif return freerdp_channels_data(rdp_inst, channelId, data, size, flags, total_size); } #ifdef HAVE_FREERDP_EVENT_PUBSUB /** * Called whenever a channel connects via the PubSub event system within * FreeRDP. * * @param context The rdpContext associated with the active RDP session. * @param e Event-specific arguments, mainly the name of the channel, and a * reference to the associated plugin loaded for that channel by * FreeRDP. */ static void guac_rdp_channel_connected(rdpContext* context, ChannelConnectedEventArgs* e) { #ifdef HAVE_RDPSETTINGS_SUPPORTDISPLAYCONTROL /* Store reference to the display update plugin once it's connected */ if (strcmp(e->name, DISP_DVC_CHANNEL_NAME) == 0) { DispClientContext* disp = (DispClientContext*) e->pInterface; guac_client* client = ((rdp_freerdp_context*) context)->client; rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; /* Init module with current display size */ guac_rdp_disp_set_size(guac_client_data->disp, context, guac_rdp_get_width(context->instance), guac_rdp_get_height(context->instance)); /* Store connected channel */ guac_rdp_disp_connect(guac_client_data->disp, disp); guac_client_log(client, GUAC_LOG_DEBUG, "Display update channel connected."); } #endif } #endif BOOL rdp_freerdp_pre_connect(freerdp* instance) { rdpContext* context = instance->context; guac_client* client = ((rdp_freerdp_context*) context)->client; rdpChannels* channels = context->channels; rdpBitmap* bitmap; rdpGlyph* glyph; rdpPointer* pointer; rdpPrimaryUpdate* primary; CLRCONV* clrconv; rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; #ifdef HAVE_FREERDP_REGISTER_ADDIN_PROVIDER /* Init FreeRDP add-in provider */ freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0); #endif #ifdef HAVE_FREERDP_EVENT_PUBSUB /* Subscribe to and handle channel connected events */ PubSub_SubscribeChannelConnected(context->pubSub, (pChannelConnectedEventHandler) guac_rdp_channel_connected); #endif #ifdef HAVE_FREERDP_DISPLAY_UPDATE_SUPPORT /* Load virtual channel management plugin */ if (freerdp_channels_load_plugin(channels, instance->settings, "drdynvc", instance->settings)) guac_client_log(client, GUAC_LOG_WARNING, "Failed to load drdynvc plugin."); /* Init display update plugin */ guac_client_data->disp = guac_rdp_disp_alloc(); guac_rdp_disp_load_plugin(instance->context); #endif /* Load clipboard plugin */ if (freerdp_channels_load_plugin(channels, instance->settings, "cliprdr", NULL)) guac_client_log(client, GUAC_LOG_WARNING, "Failed to load cliprdr plugin. Clipboard will not work."); /* If audio enabled, choose an encoder */ if (guac_client_data->settings.audio_enabled) { guac_client_data->audio = guac_audio_stream_alloc(client, NULL, GUAC_RDP_AUDIO_RATE, GUAC_RDP_AUDIO_CHANNELS, GUAC_RDP_AUDIO_BPS); /* Warn if no audio encoding is available */ if (guac_client_data->audio == NULL) guac_client_log(client, GUAC_LOG_INFO, "No available audio encoding. Sound disabled."); } /* end if audio enabled */ /* Load filesystem if drive enabled */ if (guac_client_data->settings.drive_enabled) { /* Allocate filesystem */ guac_client_data->filesystem = guac_rdp_fs_alloc(client, guac_client_data->settings.drive_path, guac_client_data->settings.create_drive_path); /* Use for basic uploads if no other handler set */ if (client->file_handler == NULL) client->file_handler = guac_rdp_upload_file_handler; } /* If RDPSND/RDPDR required, load them */ if (guac_client_data->settings.printing_enabled || guac_client_data->settings.drive_enabled || guac_client_data->settings.audio_enabled) { /* Load RDPDR plugin */ if (freerdp_channels_load_plugin(channels, instance->settings, "guacdr", client)) guac_client_log(client, GUAC_LOG_WARNING, "Failed to load guacdr plugin. Drive redirection and " "printing will not work. Sound MAY not work."); /* Load RDPSND plugin */ if (freerdp_channels_load_plugin(channels, instance->settings, "guacsnd", client)) guac_client_log(client, GUAC_LOG_WARNING, "Failed to load guacsnd alongside guacdr plugin. Sound " "will not work. Drive redirection and printing MAY not " "work."); } /* Load RAIL plugin if RemoteApp in use */ if (guac_client_data->settings.remote_app != NULL) { #ifdef LEGACY_FREERDP RDP_PLUGIN_DATA* plugin_data = malloc(sizeof(RDP_PLUGIN_DATA) * 2); plugin_data[0].size = sizeof(RDP_PLUGIN_DATA); plugin_data[0].data[0] = guac_client_data->settings.remote_app; plugin_data[0].data[1] = guac_client_data->settings.remote_app_dir; plugin_data[0].data[2] = guac_client_data->settings.remote_app_args; plugin_data[0].data[3] = NULL; plugin_data[1].size = 0; /* Attempt to load rail */ if (freerdp_channels_load_plugin(channels, instance->settings, "rail", plugin_data)) guac_client_log(client, GUAC_LOG_WARNING, "Failed to load rail plugin. RemoteApp will not work."); #else /* Attempt to load rail */ if (freerdp_channels_load_plugin(channels, instance->settings, "rail", instance->settings)) guac_client_log(client, GUAC_LOG_WARNING, "Failed to load rail plugin. RemoteApp will not work."); #endif } /* Load SVC plugin instances for all static channels */ if (guac_client_data->settings.svc_names != NULL) { char** current = guac_client_data->settings.svc_names; do { guac_rdp_svc* svc = guac_rdp_alloc_svc(client, *current); /* Attempt to load guacsvc plugin for new static channel */ if (freerdp_channels_load_plugin(channels, instance->settings, "guacsvc", svc)) { guac_client_log(client, GUAC_LOG_WARNING, "Cannot create static channel \"%s\": failed to load guacsvc plugin.", svc->name); guac_rdp_free_svc(svc); } /* Store and log on success */ else { guac_rdp_add_svc(client, svc); guac_client_log(client, GUAC_LOG_INFO, "Created static channel \"%s\"...", svc->name); } } while (*(++current) != NULL); } /* Init color conversion structure */ clrconv = calloc(1, sizeof(CLRCONV)); clrconv->alpha = 1; clrconv->invert = 0; clrconv->rgb555 = 0; clrconv->palette = calloc(1, sizeof(rdpPalette)); ((rdp_freerdp_context*) context)->clrconv = clrconv; /* Init FreeRDP cache */ instance->context->cache = cache_new(instance->settings); /* Set up bitmap handling */ bitmap = calloc(1, sizeof(rdpBitmap)); bitmap->size = sizeof(guac_rdp_bitmap); bitmap->New = guac_rdp_bitmap_new; bitmap->Free = guac_rdp_bitmap_free; bitmap->Paint = guac_rdp_bitmap_paint; bitmap->Decompress = guac_rdp_bitmap_decompress; bitmap->SetSurface = guac_rdp_bitmap_setsurface; graphics_register_bitmap(context->graphics, bitmap); free(bitmap); /* Set up glyph handling */ glyph = calloc(1, sizeof(rdpGlyph)); glyph->size = sizeof(guac_rdp_glyph); glyph->New = guac_rdp_glyph_new; glyph->Free = guac_rdp_glyph_free; glyph->Draw = guac_rdp_glyph_draw; glyph->BeginDraw = guac_rdp_glyph_begindraw; glyph->EndDraw = guac_rdp_glyph_enddraw; graphics_register_glyph(context->graphics, glyph); free(glyph); /* Set up pointer handling */ pointer = calloc(1, sizeof(rdpPointer)); pointer->size = sizeof(guac_rdp_pointer); pointer->New = guac_rdp_pointer_new; pointer->Free = guac_rdp_pointer_free; pointer->Set = guac_rdp_pointer_set; #ifdef HAVE_RDPPOINTER_SETNULL pointer->SetNull = guac_rdp_pointer_set_null; #endif #ifdef HAVE_RDPPOINTER_SETDEFAULT pointer->SetDefault = guac_rdp_pointer_set_default; #endif graphics_register_pointer(context->graphics, pointer); free(pointer); /* Set up GDI */ instance->update->DesktopResize = guac_rdp_gdi_desktop_resize; instance->update->EndPaint = guac_rdp_gdi_end_paint; instance->update->Palette = guac_rdp_gdi_palette_update; instance->update->SetBounds = guac_rdp_gdi_set_bounds; primary = instance->update->primary; primary->DstBlt = guac_rdp_gdi_dstblt; primary->PatBlt = guac_rdp_gdi_patblt; primary->ScrBlt = guac_rdp_gdi_scrblt; primary->MemBlt = guac_rdp_gdi_memblt; primary->OpaqueRect = guac_rdp_gdi_opaquerect; pointer_cache_register_callbacks(instance->update); glyph_cache_register_callbacks(instance->update); brush_cache_register_callbacks(instance->update); bitmap_cache_register_callbacks(instance->update); offscreen_cache_register_callbacks(instance->update); palette_cache_register_callbacks(instance->update); /* Init channels (pre-connect) */ if (freerdp_channels_pre_connect(channels, instance)) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Error initializing RDP client channel manager"); return FALSE; } return TRUE; } BOOL rdp_freerdp_post_connect(freerdp* instance) { rdpContext* context = instance->context; guac_client* client = ((rdp_freerdp_context*) context)->client; rdpChannels* channels = instance->context->channels; /* Init channels (post-connect) */ if (freerdp_channels_post_connect(channels, instance)) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Error initializing RDP client channel manager"); return FALSE; } /* Client handlers */ client->free_handler = rdp_guac_client_free_handler; client->handle_messages = rdp_guac_client_handle_messages; client->mouse_handler = rdp_guac_client_mouse_handler; client->key_handler = rdp_guac_client_key_handler; client->size_handler = rdp_guac_client_size_handler; /* Stream handlers */ client->clipboard_handler = guac_rdp_clipboard_handler; client->pipe_handler = guac_rdp_svc_pipe_handler; return TRUE; } BOOL rdp_freerdp_authenticate(freerdp* instance, char** username, char** password, char** domain) { rdpContext* context = instance->context; guac_client* client = ((rdp_freerdp_context*) context)->client; /* Warn if connection is likely to fail due to lack of credentials */ guac_client_log(client, GUAC_LOG_INFO, "Authentication requested but username or password not given"); return TRUE; } BOOL rdp_freerdp_verify_certificate(freerdp* instance, char* subject, char* issuer, char* fingerprint) { rdpContext* context = instance->context; guac_client* client = ((rdp_freerdp_context*) context)->client; rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; /* Bypass validation if ignore_certificate given */ if (guac_client_data->settings.ignore_certificate) { guac_client_log(client, GUAC_LOG_INFO, "Certificate validation bypassed"); return TRUE; } guac_client_log(client, GUAC_LOG_INFO, "Certificate validation failed"); return FALSE; } void rdp_freerdp_context_new(freerdp* instance, rdpContext* context) { context->channels = freerdp_channels_new(); } void rdp_freerdp_context_free(freerdp* instance, rdpContext* context) { /* EMPTY */ } void __guac_rdp_client_load_keymap(guac_client* client, const guac_rdp_keymap* keymap) { rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; /* Get mapping */ const guac_rdp_keysym_desc* mapping = keymap->mapping; /* If parent exists, load parent first */ if (keymap->parent != NULL) __guac_rdp_client_load_keymap(client, keymap->parent); /* Log load */ guac_client_log(client, GUAC_LOG_INFO, "Loading keymap \"%s\"", keymap->name); /* Load mapping into keymap */ while (mapping->keysym != 0) { /* Copy mapping */ GUAC_RDP_KEYSYM_LOOKUP(guac_client_data->keymap, mapping->keysym) = *mapping; /* Next keysym */ mapping++; } } int guac_client_init(guac_client* client, int argc, char** argv) { rdp_guac_client_data* guac_client_data; guac_rdp_settings* settings; freerdp* rdp_inst; /* Validate number of arguments received */ if (argc != RDP_ARGS_COUNT) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Wrong argument count received."); return 1; } /* Allocate client data */ guac_client_data = malloc(sizeof(rdp_guac_client_data)); /* Init random number generator */ srandom(time(NULL)); /* Init client */ #ifdef HAVE_FREERDP_CHANNELS_GLOBAL_INIT freerdp_channels_global_init(); #endif rdp_inst = freerdp_new(); rdp_inst->PreConnect = rdp_freerdp_pre_connect; rdp_inst->PostConnect = rdp_freerdp_post_connect; rdp_inst->Authenticate = rdp_freerdp_authenticate; rdp_inst->VerifyCertificate = rdp_freerdp_verify_certificate; rdp_inst->ReceiveChannelData = __guac_receive_channel_data; /* Allocate FreeRDP context */ #ifdef LEGACY_FREERDP rdp_inst->context_size = sizeof(rdp_freerdp_context); #else rdp_inst->ContextSize = sizeof(rdp_freerdp_context); #endif rdp_inst->ContextNew = (pContextNew) rdp_freerdp_context_new; rdp_inst->ContextFree = (pContextFree) rdp_freerdp_context_free; freerdp_context_new(rdp_inst); /* Set settings */ settings = &(guac_client_data->settings); /* Console */ settings->console = (strcmp(argv[IDX_CONSOLE], "true") == 0); settings->console_audio = (strcmp(argv[IDX_CONSOLE_AUDIO], "true") == 0); /* Certificate and auth */ settings->ignore_certificate = (strcmp(argv[IDX_IGNORE_CERT], "true") == 0); settings->disable_authentication = (strcmp(argv[IDX_DISABLE_AUTH], "true") == 0); /* NLA security */ if (strcmp(argv[IDX_SECURITY], "nla") == 0) { guac_client_log(client, GUAC_LOG_INFO, "Security mode: NLA"); settings->security_mode = GUAC_SECURITY_NLA; } /* TLS security */ else if (strcmp(argv[IDX_SECURITY], "tls") == 0) { guac_client_log(client, GUAC_LOG_INFO, "Security mode: TLS"); settings->security_mode = GUAC_SECURITY_TLS; } /* RDP security */ else if (strcmp(argv[IDX_SECURITY], "rdp") == 0) { guac_client_log(client, GUAC_LOG_INFO, "Security mode: RDP"); settings->security_mode = GUAC_SECURITY_RDP; } /* ANY security (allow server to choose) */ else if (strcmp(argv[IDX_SECURITY], "any") == 0) { guac_client_log(client, GUAC_LOG_INFO, "Security mode: ANY"); settings->security_mode = GUAC_SECURITY_ANY; } /* If nothing given, default to RDP */ else { guac_client_log(client, GUAC_LOG_INFO, "No security mode specified. Defaulting to RDP."); settings->security_mode = GUAC_SECURITY_RDP; } /* Set hostname */ settings->hostname = strdup(argv[IDX_HOSTNAME]); /* If port specified, use it */ settings->port = RDP_DEFAULT_PORT; if (argv[IDX_PORT][0] != '\0') settings->port = atoi(argv[IDX_PORT]); guac_client_log(client, GUAC_LOG_DEBUG, "Client resolution is %ix%i at %i DPI", client->info.optimal_width, client->info.optimal_height, client->info.optimal_resolution); /* Use suggested resolution unless overridden */ settings->resolution = guac_rdp_suggest_resolution(client); if (argv[IDX_DPI][0] != '\0') settings->resolution = atoi(argv[IDX_DPI]); /* Use optimal width unless overridden */ settings->width = client->info.optimal_width * settings->resolution / client->info.optimal_resolution; if (argv[IDX_WIDTH][0] != '\0') settings->width = atoi(argv[IDX_WIDTH]); /* Use default width if given width is invalid. */ if (settings->width <= 0) { settings->width = RDP_DEFAULT_WIDTH; guac_client_log(client, GUAC_LOG_ERROR, "Invalid width: \"%s\". Using default of %i.", argv[IDX_WIDTH], settings->width); } /* Round width down to nearest multiple of 4 */ settings->width = settings->width & ~0x3; /* Use optimal height unless overridden */ settings->height = client->info.optimal_height * settings->resolution / client->info.optimal_resolution; if (argv[IDX_HEIGHT][0] != '\0') settings->height = atoi(argv[IDX_HEIGHT]); /* Use default height if given height is invalid. */ if (settings->height <= 0) { settings->height = RDP_DEFAULT_HEIGHT; guac_client_log(client, GUAC_LOG_ERROR, "Invalid height: \"%s\". Using default of %i.", argv[IDX_WIDTH], settings->height); } guac_client_log(client, GUAC_LOG_DEBUG, "Using resolution of %ix%i at %i DPI", settings->width, settings->height, settings->resolution); /* Domain */ settings->domain = NULL; if (argv[IDX_DOMAIN][0] != '\0') settings->domain = strdup(argv[IDX_DOMAIN]); /* Username */ settings->username = NULL; if (argv[IDX_USERNAME][0] != '\0') settings->username = strdup(argv[IDX_USERNAME]); /* Password */ settings->password = NULL; if (argv[IDX_PASSWORD][0] != '\0') settings->password = strdup(argv[IDX_PASSWORD]); /* Client name */ settings->client_name = NULL; if (argv[IDX_CLIENT_NAME][0] != '\0') settings->client_name = strdup(argv[IDX_CLIENT_NAME]); /* Initial program */ settings->initial_program = NULL; if (argv[IDX_INITIAL_PROGRAM][0] != '\0') settings->initial_program = strdup(argv[IDX_INITIAL_PROGRAM]); /* RemoteApp program */ settings->remote_app = NULL; if (argv[IDX_REMOTE_APP][0] != '\0') settings->remote_app = strdup(argv[IDX_REMOTE_APP]); /* RemoteApp working directory */ settings->remote_app_dir = NULL; if (argv[IDX_REMOTE_APP_DIR][0] != '\0') settings->remote_app_dir = strdup(argv[IDX_REMOTE_APP_DIR]); /* RemoteApp arguments */ settings->remote_app_args = NULL; if (argv[IDX_REMOTE_APP_ARGS][0] != '\0') settings->remote_app_args = strdup(argv[IDX_REMOTE_APP_ARGS]); /* Static virtual channels */ settings->svc_names = NULL; if (argv[IDX_STATIC_CHANNELS][0] != '\0') settings->svc_names = guac_split(argv[IDX_STATIC_CHANNELS], ','); /* Performance flags */ settings->wallpaper_enabled = (strcmp(argv[IDX_ENABLE_WALLPAPER], "true") == 0); settings->theming_enabled = (strcmp(argv[IDX_ENABLE_THEMING], "true") == 0); settings->font_smoothing_enabled = (strcmp(argv[IDX_ENABLE_FONT_SMOOTHING], "true") == 0); settings->full_window_drag_enabled = (strcmp(argv[IDX_ENABLE_FULL_WINDOW_DRAG], "true") == 0); settings->desktop_composition_enabled = (strcmp(argv[IDX_ENABLE_DESKTOP_COMPOSITION], "true") == 0); settings->menu_animations_enabled = (strcmp(argv[IDX_ENABLE_MENU_ANIMATIONS], "true") == 0); /* Session color depth */ settings->color_depth = RDP_DEFAULT_DEPTH; if (argv[IDX_COLOR_DEPTH][0] != '\0') settings->color_depth = atoi(argv[IDX_COLOR_DEPTH]); /* Use default depth if given depth is invalid. */ if (settings->color_depth == 0) { settings->color_depth = RDP_DEFAULT_DEPTH; guac_client_log(client, GUAC_LOG_ERROR, "Invalid color-depth: \"%s\". Using default of %i.", argv[IDX_WIDTH], settings->color_depth); } /* Preconnection ID */ settings->preconnection_id = -1; if (argv[IDX_PRECONNECTION_ID][0] != '\0') { /* Parse preconnection ID, warn if invalid */ int preconnection_id = atoi(argv[IDX_PRECONNECTION_ID]); if (preconnection_id < 0) guac_client_log(client, GUAC_LOG_WARNING, "Ignoring invalid preconnection ID: %i", preconnection_id); /* Otherwise, assign specified ID */ else { settings->preconnection_id = preconnection_id; guac_client_log(client, GUAC_LOG_DEBUG, "Preconnection ID: %i", settings->preconnection_id); } } /* Preconnection BLOB */ settings->preconnection_blob = NULL; if (argv[IDX_PRECONNECTION_BLOB][0] != '\0') { settings->preconnection_blob = strdup(argv[IDX_PRECONNECTION_BLOB]); guac_client_log(client, GUAC_LOG_DEBUG, "Preconnection BLOB: \"%s\"", settings->preconnection_blob); } #ifndef HAVE_RDPSETTINGS_SENDPRECONNECTIONPDU /* Warn if support for the preconnection BLOB / ID is absent */ if (settings->preconnection_blob != NULL || settings->preconnection_id != -1) { guac_client_log(client, GUAC_LOG_WARNING, "Installed version of FreeRDP lacks support for the " "preconnection PDU. The specified preconnection BLOB and/or " "ID will be ignored."); } #endif /* Audio enable/disable */ guac_client_data->settings.audio_enabled = (strcmp(argv[IDX_DISABLE_AUDIO], "true") != 0); /* Printing enable/disable */ guac_client_data->settings.printing_enabled = (strcmp(argv[IDX_ENABLE_PRINTING], "true") == 0); /* Drive enable/disable */ guac_client_data->settings.drive_enabled = (strcmp(argv[IDX_ENABLE_DRIVE], "true") == 0); guac_client_data->settings.drive_path = strdup(argv[IDX_DRIVE_PATH]); guac_client_data->settings.create_drive_path = (strcmp(argv[IDX_CREATE_DRIVE_PATH], "true") == 0); /* Store client data */ guac_client_data->rdp_inst = rdp_inst; guac_client_data->mouse_button_mask = 0; guac_client_data->clipboard = guac_common_clipboard_alloc(GUAC_RDP_CLIPBOARD_MAX_LENGTH); guac_client_data->requested_clipboard_format = CB_FORMAT_TEXT; guac_client_data->audio = NULL; guac_client_data->filesystem = NULL; guac_client_data->available_svc = guac_common_list_alloc(); /* Main socket needs to be threadsafe */ guac_socket_require_threadsafe(client->socket); /* Recursive attribute for locks */ pthread_mutexattr_init(&(guac_client_data->attributes)); pthread_mutexattr_settype(&(guac_client_data->attributes), PTHREAD_MUTEX_RECURSIVE); /* Init RDP lock */ pthread_mutex_init(&(guac_client_data->rdp_lock), &(guac_client_data->attributes)); /* Clear keysym state mapping and keymap */ memset(guac_client_data->keysym_state, 0, sizeof(guac_rdp_keysym_state_map)); memset(guac_client_data->keymap, 0, sizeof(guac_rdp_static_keymap)); client->data = guac_client_data; ((rdp_freerdp_context*) rdp_inst->context)->client = client; /* Pick keymap based on argument */ settings->server_layout = NULL; if (argv[IDX_SERVER_LAYOUT][0] != '\0') settings->server_layout = guac_rdp_keymap_find(argv[IDX_SERVER_LAYOUT]); /* If no keymap requested, use default */ if (settings->server_layout == NULL) settings->server_layout = guac_rdp_keymap_find(GUAC_DEFAULT_KEYMAP); /* Load keymap into client */ __guac_rdp_client_load_keymap(client, settings->server_layout); #ifdef ENABLE_COMMON_SSH guac_common_ssh_init(client); /* Connect via SSH if SFTP is enabled */ if (strcmp(argv[IDX_ENABLE_SFTP], "true") == 0) { guac_client_log(client, GUAC_LOG_DEBUG, "Connecting via SSH for SFTP filesystem access."); /* Parse username - use RDP username by default */ const char* sftp_username = argv[IDX_SFTP_USERNAME]; if (sftp_username[0] == '\0' && settings->username != NULL) sftp_username = settings->username; guac_client_data->sftp_user = guac_common_ssh_create_user(sftp_username); /* Import private key, if given */ if (argv[IDX_SFTP_PRIVATE_KEY][0] != '\0') { guac_client_log(client, GUAC_LOG_DEBUG, "Authenticating with private key."); /* Abort if private key cannot be read */ if (guac_common_ssh_user_import_key(guac_client_data->sftp_user, argv[IDX_SFTP_PRIVATE_KEY], argv[IDX_SFTP_PASSPHRASE])) { guac_common_ssh_destroy_user(guac_client_data->sftp_user); return 1; } } /* Otherwise, use specified password */ else { guac_client_log(client, GUAC_LOG_DEBUG, "Authenticating with password."); /* Parse password - use RDP password by default */ const char* sftp_password = argv[IDX_SFTP_PASSWORD]; if (sftp_password[0] == '\0' && settings->password != NULL) sftp_password = settings->password; guac_common_ssh_user_set_password(guac_client_data->sftp_user, sftp_password); } /* Parse hostname - use RDP hostname by default */ const char* sftp_hostname = argv[IDX_SFTP_HOSTNAME]; if (sftp_hostname[0] == '\0') sftp_hostname = settings->hostname; /* Parse port, defaulting to standard SSH port */ const char* sftp_port = argv[IDX_SFTP_PORT]; if (sftp_port[0] == '\0') sftp_port = "22"; /* Attempt SSH connection */ guac_client_data->sftp_session = guac_common_ssh_create_session(client, sftp_hostname, sftp_port, guac_client_data->sftp_user); /* Fail if SSH connection does not succeed */ if (guac_client_data->sftp_session == NULL) { /* Already aborted within guac_common_ssh_create_session() */ guac_common_ssh_destroy_user(guac_client_data->sftp_user); return 1; } /* Load and expose filesystem */ guac_client_data->sftp_filesystem = guac_common_ssh_create_sftp_filesystem( guac_client_data->sftp_session, "/"); /* Abort if SFTP connection fails */ if (guac_client_data->sftp_filesystem == NULL) { guac_common_ssh_destroy_session(guac_client_data->sftp_session); guac_common_ssh_destroy_user(guac_client_data->sftp_user); return 1; } /* Configure destination for basic uploads, if specified */ if (argv[IDX_SFTP_DIRECTORY][0] != '\0') { client->file_handler = guac_rdp_sftp_file_handler; guac_common_ssh_sftp_set_upload_path( guac_client_data->sftp_filesystem, argv[IDX_SFTP_DIRECTORY]); } /* Otherwise, use SFTP for basic uploads only if drive not enabled */ else if (!settings->drive_enabled) client->file_handler = guac_rdp_sftp_file_handler; guac_client_log(client, GUAC_LOG_DEBUG, "SFTP connection succeeded."); } #endif /* Create default surface */ guac_client_data->default_surface = guac_common_surface_alloc(client, client->socket, GUAC_DEFAULT_LAYER, settings->width, settings->height); guac_client_data->current_surface = guac_client_data->default_surface; /* Send connection name */ guac_protocol_send_name(client->socket, settings->hostname); /* Set default pointer */ guac_common_set_pointer_cursor(client); /* Push desired settings to FreeRDP */ guac_rdp_push_settings(settings, rdp_inst); /* Connect to RDP server */ if (!freerdp_connect(rdp_inst)) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR, "Error connecting to RDP server"); return 1; } /* Success */ return 0; } guacamole-server-0.9.9/src/protocols/rdp/rdp_svc.h0000664000175100017510000000563212643542623017145 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_RDP_RDP_SVC_H #define __GUAC_RDP_RDP_SVC_H #include "config.h" #include #include #include /** * The maximum number of characters to allow for each channel name. */ #define GUAC_RDP_SVC_MAX_LENGTH 7 /** * Structure describing a static virtual channel, and the corresponding * Guacamole pipes. */ typedef struct guac_rdp_svc { /** * Reference to the client owning this static channel. */ guac_client* client; /** * Reference to associated SVC plugin. */ rdpSvcPlugin* plugin; /** * The name of the RDP channel in use, and the name to use for each pipe. */ char name[GUAC_RDP_SVC_MAX_LENGTH+1]; /** * The pipe opened by the Guacamole client, if any. This should be * opened in response to the output pipe. */ guac_stream* input_pipe; /** * The output pipe, opened when the RDP server receives a connection to * the static channel. */ guac_stream* output_pipe; } guac_rdp_svc; /** * Allocate a new SVC with the given name. */ guac_rdp_svc* guac_rdp_alloc_svc(guac_client* client, char* name); /** * Free the given SVC. */ void guac_rdp_free_svc(guac_rdp_svc* svc); /** * Add the given SVC to the list of all available SVCs. */ void guac_rdp_add_svc(guac_client* client, guac_rdp_svc* svc); /** * Retrieve the SVC with the given name from the list stored in the client. */ guac_rdp_svc* guac_rdp_get_svc(guac_client* client, const char* name); /** * Remove the SVC with the given name from the list stored in the client. */ guac_rdp_svc* guac_rdp_remove_svc(guac_client* client, const char* name); /** * Write the given blob of data to the virtual channel. */ void guac_rdp_svc_write(guac_rdp_svc* svc, void* data, int length); #endif guacamole-server-0.9.9/src/protocols/rdp/rdp_stream.c0000664000175100017510000004371712643542623017646 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "guac_clipboard.h" #include "rdp_fs.h" #include "rdp_svc.h" #include "rdp_stream.h" #include #include #include #include #include #include #ifdef HAVE_FREERDP_CLIENT_CLIPRDR_H #include #else #include "compat/client-cliprdr.h" #endif #ifdef ENABLE_WINPR #include #include #else #include "compat/winpr-stream.h" #include "compat/winpr-wtypes.h" #endif #include /** * Writes the given filename to the given upload path, sanitizing the filename * and translating the filename to the root directory. */ static void __generate_upload_path(const char* filename, char* path) { int i; /* Add initial backslash */ *(path++) = '\\'; for (i=1; idata)->filesystem; if (fs == NULL) { guac_protocol_send_ack(client->socket, stream, "FAIL (NO FS)", GUAC_PROTOCOL_STATUS_SERVER_ERROR); guac_socket_flush(client->socket); return 0; } /* Translate name */ __generate_upload_path(filename, file_path); /* Open file */ file_id = guac_rdp_fs_open(fs, file_path, ACCESS_GENERIC_WRITE, 0, DISP_FILE_OVERWRITE_IF, 0); if (file_id < 0) { guac_protocol_send_ack(client->socket, stream, "FAIL (CANNOT OPEN)", GUAC_PROTOCOL_STATUS_CLIENT_FORBIDDEN); guac_socket_flush(client->socket); return 0; } /* Init upload status */ rdp_stream = malloc(sizeof(guac_rdp_stream)); rdp_stream->type = GUAC_RDP_UPLOAD_STREAM; rdp_stream->upload_status.offset = 0; rdp_stream->upload_status.file_id = file_id; stream->data = rdp_stream; stream->blob_handler = guac_rdp_upload_blob_handler; stream->end_handler = guac_rdp_upload_end_handler; guac_protocol_send_ack(client->socket, stream, "OK (STREAM BEGIN)", GUAC_PROTOCOL_STATUS_SUCCESS); guac_socket_flush(client->socket); return 0; } int guac_rdp_svc_pipe_handler(guac_client* client, guac_stream* stream, char* mimetype, char* name) { guac_rdp_stream* rdp_stream; guac_rdp_svc* svc = guac_rdp_get_svc(client, name); /* Fail if no such SVC */ if (svc == NULL) { guac_client_log(client, GUAC_LOG_ERROR, "Requested non-existent pipe: \"%s\".", name); guac_protocol_send_ack(client->socket, stream, "FAIL (NO SUCH PIPE)", GUAC_PROTOCOL_STATUS_CLIENT_BAD_REQUEST); guac_socket_flush(client->socket); return 0; } else guac_client_log(client, GUAC_LOG_ERROR, "Inbound half of channel \"%s\" connected.", name); /* Init stream data */ stream->data = rdp_stream = malloc(sizeof(guac_rdp_stream)); stream->blob_handler = guac_rdp_svc_blob_handler; rdp_stream->type = GUAC_RDP_INBOUND_SVC_STREAM; rdp_stream->svc = svc; svc->input_pipe = stream; return 0; } int guac_rdp_clipboard_handler(guac_client* client, guac_stream* stream, char* mimetype) { rdp_guac_client_data* client_data = (rdp_guac_client_data*) client->data; guac_rdp_stream* rdp_stream; /* Init stream data */ stream->data = rdp_stream = malloc(sizeof(guac_rdp_stream)); stream->blob_handler = guac_rdp_clipboard_blob_handler; stream->end_handler = guac_rdp_clipboard_end_handler; rdp_stream->type = GUAC_RDP_INBOUND_CLIPBOARD_STREAM; guac_common_clipboard_reset(client_data->clipboard, mimetype); return 0; } int guac_rdp_upload_blob_handler(guac_client* client, guac_stream* stream, void* data, int length) { int bytes_written; guac_rdp_stream* rdp_stream = (guac_rdp_stream*) stream->data; /* Get filesystem, return error if no filesystem 0*/ guac_rdp_fs* fs = ((rdp_guac_client_data*) client->data)->filesystem; if (fs == NULL) { guac_protocol_send_ack(client->socket, stream, "FAIL (NO FS)", GUAC_PROTOCOL_STATUS_SERVER_ERROR); guac_socket_flush(client->socket); return 0; } /* Write entire block */ while (length > 0) { /* Attempt write */ bytes_written = guac_rdp_fs_write(fs, rdp_stream->upload_status.file_id, rdp_stream->upload_status.offset, data, length); /* On error, abort */ if (bytes_written < 0) { guac_protocol_send_ack(client->socket, stream, "FAIL (BAD WRITE)", GUAC_PROTOCOL_STATUS_CLIENT_FORBIDDEN); guac_socket_flush(client->socket); return 0; } /* Update counters */ rdp_stream->upload_status.offset += bytes_written; data += bytes_written; length -= bytes_written; } guac_protocol_send_ack(client->socket, stream, "OK (DATA RECEIVED)", GUAC_PROTOCOL_STATUS_SUCCESS); guac_socket_flush(client->socket); return 0; } int guac_rdp_svc_blob_handler(guac_client* client, guac_stream* stream, void* data, int length) { guac_rdp_stream* rdp_stream = (guac_rdp_stream*) stream->data; /* Write blob data to SVC directly */ guac_rdp_svc_write(rdp_stream->svc, data, length); guac_protocol_send_ack(client->socket, stream, "OK (DATA RECEIVED)", GUAC_PROTOCOL_STATUS_SUCCESS); guac_socket_flush(client->socket); return 0; } int guac_rdp_clipboard_blob_handler(guac_client* client, guac_stream* stream, void* data, int length) { rdp_guac_client_data* client_data = (rdp_guac_client_data*) client->data; guac_common_clipboard_append(client_data->clipboard, (char*) data, length); return 0; } int guac_rdp_upload_end_handler(guac_client* client, guac_stream* stream) { guac_rdp_stream* rdp_stream = (guac_rdp_stream*) stream->data; /* Get filesystem, return error if no filesystem */ guac_rdp_fs* fs = ((rdp_guac_client_data*) client->data)->filesystem; if (fs == NULL) { guac_protocol_send_ack(client->socket, stream, "FAIL (NO FS)", GUAC_PROTOCOL_STATUS_SERVER_ERROR); guac_socket_flush(client->socket); return 0; } /* Close file */ guac_rdp_fs_close(fs, rdp_stream->upload_status.file_id); /* Acknowledge stream end */ guac_protocol_send_ack(client->socket, stream, "OK (STREAM END)", GUAC_PROTOCOL_STATUS_SUCCESS); guac_socket_flush(client->socket); free(rdp_stream); return 0; } int guac_rdp_clipboard_end_handler(guac_client* client, guac_stream* stream) { rdp_guac_client_data* client_data = (rdp_guac_client_data*) client->data; rdpChannels* channels = client_data->rdp_inst->context->channels; RDP_CB_FORMAT_LIST_EVENT* format_list = (RDP_CB_FORMAT_LIST_EVENT*) freerdp_event_new( CliprdrChannel_Class, CliprdrChannel_FormatList, NULL, NULL); /* Terminate clipboard data with NULL */ guac_common_clipboard_append(client_data->clipboard, "", 1); /* Notify server that text data is now available */ format_list->formats = (UINT32*) malloc(sizeof(UINT32)); format_list->formats[0] = CB_FORMAT_TEXT; format_list->formats[1] = CB_FORMAT_UNICODETEXT; format_list->num_formats = 2; freerdp_channels_send_event(channels, (wMessage*) format_list); return 0; } int guac_rdp_download_ack_handler(guac_client* client, guac_stream* stream, char* message, guac_protocol_status status) { guac_rdp_stream* rdp_stream = (guac_rdp_stream*) stream->data; /* Get filesystem, return error if no filesystem */ guac_rdp_fs* fs = ((rdp_guac_client_data*) client->data)->filesystem; if (fs == NULL) { guac_protocol_send_ack(client->socket, stream, "FAIL (NO FS)", GUAC_PROTOCOL_STATUS_SERVER_ERROR); guac_socket_flush(client->socket); return 0; } /* If successful, read data */ if (status == GUAC_PROTOCOL_STATUS_SUCCESS) { /* Attempt read into buffer */ char buffer[4096]; int bytes_read = guac_rdp_fs_read(fs, rdp_stream->download_status.file_id, rdp_stream->download_status.offset, buffer, sizeof(buffer)); /* If bytes read, send as blob */ if (bytes_read > 0) { rdp_stream->download_status.offset += bytes_read; guac_protocol_send_blob(client->socket, stream, buffer, bytes_read); } /* If EOF, send end */ else if (bytes_read == 0) { guac_protocol_send_end(client->socket, stream); guac_client_free_stream(client, stream); free(rdp_stream); } /* Otherwise, fail stream */ else { guac_client_log(client, GUAC_LOG_ERROR, "Error reading file for download"); guac_protocol_send_end(client->socket, stream); guac_client_free_stream(client, stream); free(rdp_stream); } guac_socket_flush(client->socket); } /* Otherwise, return stream to client */ else guac_client_free_stream(client, stream); return 0; } int guac_rdp_ls_ack_handler(guac_client* client, guac_stream* stream, char* message, guac_protocol_status status) { int blob_written = 0; const char* filename; guac_rdp_stream* rdp_stream = (guac_rdp_stream*) stream->data; /* If unsuccessful, free stream and abort */ if (status != GUAC_PROTOCOL_STATUS_SUCCESS) { guac_rdp_fs_close(rdp_stream->ls_status.fs, rdp_stream->ls_status.file_id); guac_client_free_stream(client, stream); free(rdp_stream); return 0; } /* While directory entries remain */ while ((filename = guac_rdp_fs_read_dir(rdp_stream->ls_status.fs, rdp_stream->ls_status.file_id)) != NULL && !blob_written) { char absolute_path[GUAC_RDP_FS_MAX_PATH]; /* Skip current and parent directory entries */ if (strcmp(filename, ".") == 0 || strcmp(filename, "..") == 0) continue; /* Concatenate into absolute path - skip if invalid */ if (!guac_rdp_fs_append_filename(absolute_path, rdp_stream->ls_status.directory_name, filename)) { guac_client_log(client, GUAC_LOG_DEBUG, "Skipping filename \"%s\" - filename is invalid or " "resulting path is too long", filename); continue; } /* Attempt to open file to determine type */ int file_id = guac_rdp_fs_open(rdp_stream->ls_status.fs, absolute_path, ACCESS_GENERIC_READ, 0, DISP_FILE_OPEN, 0); if (file_id < 0) continue; /* Get opened file */ guac_rdp_fs_file* file = guac_rdp_fs_get_file(rdp_stream->ls_status.fs, file_id); if (file == NULL) { guac_client_log(rdp_stream->ls_status.fs->client, GUAC_LOG_DEBUG, "%s: Successful open produced bad file_id: %i", __func__, file_id); return 0; } /* Determine mimetype */ const char* mimetype; if (file->attributes & FILE_ATTRIBUTE_DIRECTORY) mimetype = GUAC_CLIENT_STREAM_INDEX_MIMETYPE; else mimetype = "application/octet-stream"; /* Write entry */ blob_written |= guac_common_json_write_property(client, stream, &rdp_stream->ls_status.json_state, absolute_path, mimetype); guac_rdp_fs_close(rdp_stream->ls_status.fs, file_id); } /* Complete JSON and cleanup at end of directory */ if (filename == NULL) { /* Complete JSON object */ guac_common_json_end_object(client, stream, &rdp_stream->ls_status.json_state); guac_common_json_flush(client, stream, &rdp_stream->ls_status.json_state); /* Clean up resources */ guac_rdp_fs_close(rdp_stream->ls_status.fs, rdp_stream->ls_status.file_id); free(rdp_stream); /* Signal of stream */ guac_protocol_send_end(client->socket, stream); guac_client_free_stream(client, stream); } guac_socket_flush(client->socket); return 0; } int guac_rdp_download_get_handler(guac_client* client, guac_object* object, char* name) { /* Get filesystem, ignore request if no filesystem */ guac_rdp_fs* fs = ((rdp_guac_client_data*) client->data)->filesystem; if (fs == NULL) return 0; /* Attempt to open file for reading */ int file_id = guac_rdp_fs_open(fs, name, ACCESS_GENERIC_READ, 0, DISP_FILE_OPEN, 0); if (file_id < 0) { guac_client_log(client, GUAC_LOG_INFO, "Unable to read file \"%s\"", name); return 0; } /* Get opened file */ guac_rdp_fs_file* file = guac_rdp_fs_get_file(fs, file_id); if (file == NULL) { guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: Successful open produced bad file_id: %i", __func__, file_id); return 0; } /* If directory, send contents of directory */ if (file->attributes & FILE_ATTRIBUTE_DIRECTORY) { /* Create stream data */ guac_rdp_stream* rdp_stream = malloc(sizeof(guac_rdp_stream)); rdp_stream->type = GUAC_RDP_LS_STREAM; rdp_stream->ls_status.fs = fs; rdp_stream->ls_status.file_id = file_id; strncpy(rdp_stream->ls_status.directory_name, name, sizeof(rdp_stream->ls_status.directory_name) - 1); /* Allocate stream for body */ guac_stream* stream = guac_client_alloc_stream(client); stream->ack_handler = guac_rdp_ls_ack_handler; stream->data = rdp_stream; /* Init JSON object state */ guac_common_json_begin_object(client, stream, &rdp_stream->ls_status.json_state); /* Associate new stream with get request */ guac_protocol_send_body(client->socket, object, stream, GUAC_CLIENT_STREAM_INDEX_MIMETYPE, name); } /* Otherwise, send file contents */ else { /* Create stream data */ guac_rdp_stream* rdp_stream = malloc(sizeof(guac_rdp_stream)); rdp_stream->type = GUAC_RDP_DOWNLOAD_STREAM; rdp_stream->download_status.file_id = file_id; rdp_stream->download_status.offset = 0; /* Allocate stream for body */ guac_stream* stream = guac_client_alloc_stream(client); stream->data = rdp_stream; stream->ack_handler = guac_rdp_download_ack_handler; /* Associate new stream with get request */ guac_protocol_send_body(client->socket, object, stream, "application/octet-stream", name); } guac_socket_flush(client->socket); return 0; } int guac_rdp_upload_put_handler(guac_client* client, guac_object* object, guac_stream* stream, char* mimetype, char* name) { /* Get filesystem, return error if no filesystem */ guac_rdp_fs* fs = ((rdp_guac_client_data*) client->data)->filesystem; if (fs == NULL) { guac_protocol_send_ack(client->socket, stream, "FAIL (NO FS)", GUAC_PROTOCOL_STATUS_SERVER_ERROR); guac_socket_flush(client->socket); return 0; } /* Open file */ int file_id = guac_rdp_fs_open(fs, name, ACCESS_GENERIC_WRITE, 0, DISP_FILE_OVERWRITE_IF, 0); /* Abort on failure */ if (file_id < 0) { guac_protocol_send_ack(client->socket, stream, "FAIL (CANNOT OPEN)", GUAC_PROTOCOL_STATUS_CLIENT_FORBIDDEN); guac_socket_flush(client->socket); return 0; } /* Init upload stream data */ guac_rdp_stream* rdp_stream = malloc(sizeof(guac_rdp_stream)); rdp_stream->type = GUAC_RDP_UPLOAD_STREAM; rdp_stream->upload_status.offset = 0; rdp_stream->upload_status.file_id = file_id; /* Allocate stream, init for file upload */ stream->data = rdp_stream; stream->blob_handler = guac_rdp_upload_blob_handler; stream->end_handler = guac_rdp_upload_end_handler; /* Acknowledge stream creation */ guac_protocol_send_ack(client->socket, stream, "OK (STREAM BEGIN)", GUAC_PROTOCOL_STATUS_SUCCESS); guac_socket_flush(client->socket); return 0; } guacamole-server-0.9.9/src/protocols/rdp/guac_handlers.c0000664000175100017510000004065012643542623020276 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "guac_clipboard.h" #include "guac_handlers.h" #include "guac_list.h" #include "guac_surface.h" #include "rdp_cliprdr.h" #include "rdp_keymap.h" #include "rdp_fs.h" #include "rdp_rail.h" #include "rdp_stream.h" #ifdef ENABLE_COMMON_SSH #include #include #include #endif #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_FREERDP_DISPLAY_UPDATE_SUPPORT #include "rdp_disp.h" #endif #ifdef HAVE_FREERDP_CLIENT_CLIPRDR_H #include #else #include "compat/client-cliprdr.h" #endif #ifdef LEGACY_FREERDP #include "compat/rail.h" #else #include #endif #include #include #include #include #include void __guac_rdp_update_keysyms(guac_client* client, const int* keysym_string, int from, int to); int __guac_rdp_send_keysym(guac_client* client, int keysym, int pressed); int rdp_guac_client_free_handler(guac_client* client) { rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; freerdp* rdp_inst = guac_client_data->rdp_inst; rdpChannels* channels = rdp_inst->context->channels; /* Clean up RDP client */ freerdp_channels_close(channels, rdp_inst); freerdp_channels_free(channels); freerdp_disconnect(rdp_inst); freerdp_clrconv_free(((rdp_freerdp_context*) rdp_inst->context)->clrconv); cache_free(rdp_inst->context->cache); freerdp_free(rdp_inst); /* Clean up filesystem, if allocated */ if (guac_client_data->filesystem != NULL) guac_rdp_fs_free(guac_client_data->filesystem); #ifdef ENABLE_COMMON_SSH /* Free SFTP filesystem, if loaded */ if (guac_client_data->sftp_filesystem) guac_common_ssh_destroy_sftp_filesystem(guac_client_data->sftp_filesystem); /* Free SFTP session */ if (guac_client_data->sftp_session) guac_common_ssh_destroy_session(guac_client_data->sftp_session); /* Free SFTP user */ if (guac_client_data->sftp_user) guac_common_ssh_destroy_user(guac_client_data->sftp_user); guac_common_ssh_uninit(); #endif #ifdef HAVE_FREERDP_DISPLAY_UPDATE_SUPPORT /* Free display update module */ guac_rdp_disp_free(guac_client_data->disp); #endif /* Free SVC list */ guac_common_list_free(guac_client_data->available_svc); /* Free client data */ guac_common_clipboard_free(guac_client_data->clipboard); guac_common_surface_free(guac_client_data->default_surface); free(guac_client_data); return 0; } static int rdp_guac_client_wait_for_messages(guac_client* client, int timeout_usecs) { rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; freerdp* rdp_inst = guac_client_data->rdp_inst; rdpChannels* channels = rdp_inst->context->channels; int result; int index; int max_fd, fd; void* read_fds[32]; void* write_fds[32]; int read_count = 0; int write_count = 0; fd_set rfds, wfds; struct timeval timeout = { .tv_sec = 0, .tv_usec = timeout_usecs }; /* Get RDP fds */ if (!freerdp_get_fds(rdp_inst, read_fds, &read_count, write_fds, &write_count)) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Unable to read RDP file descriptors."); return -1; } /* Get channel fds */ if (!freerdp_channels_get_fds(channels, rdp_inst, read_fds, &read_count, write_fds, &write_count)) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Unable to read RDP channel file descriptors."); return -1; } /* Construct read fd_set */ max_fd = 0; FD_ZERO(&rfds); for (index = 0; index < read_count; index++) { fd = (int)(long) (read_fds[index]); if (fd > max_fd) max_fd = fd; FD_SET(fd, &rfds); } /* Construct write fd_set */ FD_ZERO(&wfds); for (index = 0; index < write_count; index++) { fd = (int)(long) (write_fds[index]); if (fd > max_fd) max_fd = fd; FD_SET(fd, &wfds); } /* If no file descriptors, error */ if (max_fd == 0) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "No file descriptors associated with RDP connection."); return -1; } /* Wait for all RDP file descriptors */ result = select(max_fd + 1, &rfds, &wfds, NULL, &timeout); if (result < 0) { /* If error ignorable, pretend timout occurred */ if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINPROGRESS || errno == EINTR) return 0; /* Otherwise, return as error */ guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Error waiting for file descriptor."); return -1; } /* Return wait result */ return result; } int rdp_guac_client_handle_messages(guac_client* client) { rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; freerdp* rdp_inst = guac_client_data->rdp_inst; rdpChannels* channels = rdp_inst->context->channels; wMessage* event; #ifdef HAVE_FREERDP_DISPLAY_UPDATE_SUPPORT /* Update remote display size */ pthread_mutex_lock(&(guac_client_data->rdp_lock)); guac_rdp_disp_update_size(guac_client_data->disp, rdp_inst->context); pthread_mutex_unlock(&(guac_client_data->rdp_lock)); #endif /* Wait for messages */ int wait_result = rdp_guac_client_wait_for_messages(client, 250000); guac_timestamp frame_start = guac_timestamp_current(); while (wait_result > 0) { guac_timestamp frame_end; int frame_remaining; pthread_mutex_lock(&(guac_client_data->rdp_lock)); /* Check the libfreerdp fds */ if (!freerdp_check_fds(rdp_inst)) { guac_client_log(client, GUAC_LOG_DEBUG, "Error handling RDP file descriptors"); pthread_mutex_unlock(&(guac_client_data->rdp_lock)); return 1; } /* Check channel fds */ if (!freerdp_channels_check_fds(channels, rdp_inst)) { guac_client_log(client, GUAC_LOG_DEBUG, "Error handling RDP channel file descriptors"); pthread_mutex_unlock(&(guac_client_data->rdp_lock)); return 1; } /* Check for channel events */ event = freerdp_channels_pop_event(channels); if (event) { /* Handle channel events (clipboard and RAIL) */ #ifdef LEGACY_EVENT if (event->event_class == CliprdrChannel_Class) guac_rdp_process_cliprdr_event(client, event); else if (event->event_class == RailChannel_Class) guac_rdp_process_rail_event(client, event); #else if (GetMessageClass(event->id) == CliprdrChannel_Class) guac_rdp_process_cliprdr_event(client, event); else if (GetMessageClass(event->id) == RailChannel_Class) guac_rdp_process_rail_event(client, event); #endif freerdp_event_free(event); } /* Handle RDP disconnect */ if (freerdp_shall_disconnect(rdp_inst)) { guac_client_log(client, GUAC_LOG_INFO, "RDP server closed connection"); pthread_mutex_unlock(&(guac_client_data->rdp_lock)); return 1; } pthread_mutex_unlock(&(guac_client_data->rdp_lock)); /* Calculate time remaining in frame */ frame_end = guac_timestamp_current(); frame_remaining = frame_start + GUAC_RDP_FRAME_DURATION - frame_end; /* Wait again if frame remaining */ if (frame_remaining > 0) wait_result = rdp_guac_client_wait_for_messages(client, GUAC_RDP_FRAME_TIMEOUT*1000); else break; } /* If an error occurred, fail */ if (wait_result < 0) return 1; /* Success */ guac_common_surface_flush(guac_client_data->default_surface); return 0; } int rdp_guac_client_mouse_handler(guac_client* client, int x, int y, int mask) { rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; freerdp* rdp_inst = guac_client_data->rdp_inst; pthread_mutex_lock(&(guac_client_data->rdp_lock)); /* If button mask unchanged, just send move event */ if (mask == guac_client_data->mouse_button_mask) rdp_inst->input->MouseEvent(rdp_inst->input, PTR_FLAGS_MOVE, x, y); /* Otherwise, send events describing button change */ else { /* Mouse buttons which have JUST become released */ int released_mask = guac_client_data->mouse_button_mask & ~mask; /* Mouse buttons which have JUST become pressed */ int pressed_mask = ~guac_client_data->mouse_button_mask & mask; /* Release event */ if (released_mask & 0x07) { /* Calculate flags */ int flags = 0; if (released_mask & 0x01) flags |= PTR_FLAGS_BUTTON1; if (released_mask & 0x02) flags |= PTR_FLAGS_BUTTON3; if (released_mask & 0x04) flags |= PTR_FLAGS_BUTTON2; rdp_inst->input->MouseEvent(rdp_inst->input, flags, x, y); } /* Press event */ if (pressed_mask & 0x07) { /* Calculate flags */ int flags = PTR_FLAGS_DOWN; if (pressed_mask & 0x01) flags |= PTR_FLAGS_BUTTON1; if (pressed_mask & 0x02) flags |= PTR_FLAGS_BUTTON3; if (pressed_mask & 0x04) flags |= PTR_FLAGS_BUTTON2; if (pressed_mask & 0x08) flags |= PTR_FLAGS_WHEEL | 0x78; if (pressed_mask & 0x10) flags |= PTR_FLAGS_WHEEL | PTR_FLAGS_WHEEL_NEGATIVE | 0x88; /* Send event */ rdp_inst->input->MouseEvent(rdp_inst->input, flags, x, y); } /* Scroll event */ if (pressed_mask & 0x18) { /* Down */ if (pressed_mask & 0x08) rdp_inst->input->MouseEvent( rdp_inst->input, PTR_FLAGS_WHEEL | 0x78, x, y); /* Up */ if (pressed_mask & 0x10) rdp_inst->input->MouseEvent( rdp_inst->input, PTR_FLAGS_WHEEL | PTR_FLAGS_WHEEL_NEGATIVE | 0x88, x, y); } guac_client_data->mouse_button_mask = mask; } pthread_mutex_unlock(&(guac_client_data->rdp_lock)); return 0; } int __guac_rdp_send_keysym(guac_client* client, int keysym, int pressed) { rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; freerdp* rdp_inst = guac_client_data->rdp_inst; /* If keysym can be in lookup table */ if (GUAC_RDP_KEYSYM_STORABLE(keysym)) { int pressed_flags; /* Look up scancode mapping */ const guac_rdp_keysym_desc* keysym_desc = &GUAC_RDP_KEYSYM_LOOKUP(guac_client_data->keymap, keysym); /* If defined, send event */ if (keysym_desc->scancode != 0) { pthread_mutex_lock(&(guac_client_data->rdp_lock)); /* If defined, send any prerequesite keys that must be set */ if (keysym_desc->set_keysyms != NULL) __guac_rdp_update_keysyms(client, keysym_desc->set_keysyms, 0, 1); /* If defined, release any keys that must be cleared */ if (keysym_desc->clear_keysyms != NULL) __guac_rdp_update_keysyms(client, keysym_desc->clear_keysyms, 1, 0); /* Determine proper event flag for pressed state */ if (pressed) pressed_flags = KBD_FLAGS_DOWN; else pressed_flags = KBD_FLAGS_RELEASE; /* Send actual key */ rdp_inst->input->KeyboardEvent(rdp_inst->input, keysym_desc->flags | pressed_flags, keysym_desc->scancode); /* If defined, release any keys that were originally released */ if (keysym_desc->set_keysyms != NULL) __guac_rdp_update_keysyms(client, keysym_desc->set_keysyms, 0, 0); /* If defined, send any keys that were originally set */ if (keysym_desc->clear_keysyms != NULL) __guac_rdp_update_keysyms(client, keysym_desc->clear_keysyms, 1, 1); pthread_mutex_unlock(&(guac_client_data->rdp_lock)); return 0; } } /* Fall back to unicode events if undefined inside current keymap */ /* Only send when key pressed - Unicode events do not have * DOWN/RELEASE flags */ if (pressed) { guac_client_log(client, GUAC_LOG_DEBUG, "Sending keysym 0x%x as Unicode", keysym); /* Translate keysym into codepoint */ int codepoint; if (keysym <= 0xFF) codepoint = keysym; else if (keysym >= 0x1000000) codepoint = keysym & 0xFFFFFF; else { guac_client_log(client, GUAC_LOG_DEBUG, "Unmapped keysym has no equivalent unicode " "value: 0x%x", keysym); return 0; } pthread_mutex_lock(&(guac_client_data->rdp_lock)); /* Send Unicode event */ rdp_inst->input->UnicodeKeyboardEvent( rdp_inst->input, 0, codepoint); pthread_mutex_unlock(&(guac_client_data->rdp_lock)); } return 0; } void __guac_rdp_update_keysyms(guac_client* client, const int* keysym_string, int from, int to) { rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; int keysym; /* Send all keysyms in string, NULL terminated */ while ((keysym = *keysym_string) != 0) { /* Get current keysym state */ int current_state = GUAC_RDP_KEYSYM_LOOKUP(guac_client_data->keysym_state, keysym); /* If key is currently in given state, send event for changing it to specified "to" state */ if (current_state == from) __guac_rdp_send_keysym(client, *keysym_string, to); /* Next keysym */ keysym_string++; } } int rdp_guac_client_key_handler(guac_client* client, int keysym, int pressed) { rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; /* Update keysym state */ if (GUAC_RDP_KEYSYM_STORABLE(keysym)) GUAC_RDP_KEYSYM_LOOKUP(guac_client_data->keysym_state, keysym) = pressed; return __guac_rdp_send_keysym(client, keysym, pressed); } int rdp_guac_client_size_handler(guac_client* client, int width, int height) { #ifdef HAVE_FREERDP_DISPLAY_UPDATE_SUPPORT rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; freerdp* rdp_inst = guac_client_data->rdp_inst; /* Convert client pixels to remote pixels */ width = width * guac_client_data->settings.resolution / client->info.optimal_resolution; height = height * guac_client_data->settings.resolution / client->info.optimal_resolution; /* Send display update */ pthread_mutex_lock(&(guac_client_data->rdp_lock)); guac_rdp_disp_set_size(guac_client_data->disp, rdp_inst->context, width, height); pthread_mutex_unlock(&(guac_client_data->rdp_lock)); #endif return 0; } guacamole-server-0.9.9/src/protocols/rdp/rdp_color.c0000664000175100017510000000434412643542623017462 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "rdp_settings.h" #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-wtypes.h" #endif UINT32 guac_rdp_convert_color(rdpContext* context, UINT32 color) { #ifdef HAVE_FREERDP_CONVERT_GDI_ORDER_COLOR UINT32* palette = ((rdp_freerdp_context*) context)->palette; /* Convert given color to ARGB32 */ return freerdp_convert_gdi_order_color(color, guac_rdp_get_depth(context->instance), PIXEL_FORMAT_ARGB32, (BYTE*) palette); #elif defined(HAVE_FREERDP_COLOR_CONVERT_DRAWING_ORDER_COLOR_TO_GDI_COLOR) CLRCONV* clrconv = ((rdp_freerdp_context*) context)->clrconv; /* Convert given color to ARGB32 */ return freerdp_color_convert_drawing_order_color_to_gdi_color(color, guac_rdp_get_depth(context->instance), clrconv); #else CLRCONV* clrconv = ((rdp_freerdp_context*) context)->clrconv; /* Convert given color to ARGB32 */ return freerdp_color_convert_var(color, guac_rdp_get_depth(context->instance), 32, clrconv); #endif } guacamole-server-0.9.9/src/protocols/rdp/rdp_fs.c0000664000175100017510000005347712643542623016767 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "rdp_fs.h" #include "rdp_status.h" #include "rdp_stream.h" #include #include #include #include #include #include #include #include #include #include #include #include #include guac_rdp_fs* guac_rdp_fs_alloc(guac_client* client, const char* drive_path, int create_drive_path) { /* Create drive path if it does not exist */ if (create_drive_path) { guac_client_log(client, GUAC_LOG_DEBUG, "%s: Creating directory \"%s\" if necessary.", __func__, drive_path); /* Log error if directory creation fails */ if (mkdir(drive_path, S_IRWXU) && errno != EEXIST) { guac_client_log(client, GUAC_LOG_ERROR, "Unable to create directory \"%s\": %s", drive_path, strerror(errno)); } } guac_rdp_fs* fs = malloc(sizeof(guac_rdp_fs)); fs->client = client; fs->object = guac_client_alloc_object(client); fs->object->get_handler = guac_rdp_download_get_handler; fs->object->put_handler = guac_rdp_upload_put_handler; fs->drive_path = strdup(drive_path); fs->file_id_pool = guac_pool_alloc(0); fs->open_files = 0; return fs; } void guac_rdp_fs_free(guac_rdp_fs* fs) { guac_client_free_object(fs->client, fs->object); guac_pool_free(fs->file_id_pool); free(fs->drive_path); free(fs); } /** * Translates an absolute Windows virtual_path to an absolute virtual_path * which is within the "drive virtual_path" specified in the connection * settings. */ static void __guac_rdp_fs_translate_path(guac_rdp_fs* fs, const char* virtual_path, char* real_path) { /* Get drive path */ char* drive_path = fs->drive_path; int i; /* Start with path from settings */ for (i=0; iclient, GUAC_LOG_DEBUG, "%s: path=\"%s\", access=0x%x, file_attributes=0x%x, " "create_disposition=0x%x, create_options=0x%x", __func__, path, access, file_attributes, create_disposition, create_options); /* If no files available, return too many open */ if (fs->open_files >= GUAC_RDP_FS_MAX_FILES) { guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: Too many open files.", __func__, path); return GUAC_RDP_FS_ENFILE; } /* If path empty, transform to root path */ if (path[0] == '\0') path = "\\"; /* If path is relative, the file does not exist */ else if (path[0] != '\\' && path[0] != '/') { guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: Access denied - supplied path \"%s\" is relative.", __func__, path); return GUAC_RDP_FS_ENOENT; } /* Translate access into flags */ if (access & ACCESS_GENERIC_ALL) flags = O_RDWR; else if ((access & ( ACCESS_GENERIC_WRITE | ACCESS_FILE_WRITE_DATA | ACCESS_FILE_APPEND_DATA)) && (access & (ACCESS_GENERIC_READ | ACCESS_FILE_READ_DATA))) flags = O_RDWR; else if (access & ( ACCESS_GENERIC_WRITE | ACCESS_FILE_WRITE_DATA | ACCESS_FILE_APPEND_DATA)) flags = O_WRONLY; else flags = O_RDONLY; /* Normalize path, return no-such-file if invalid */ if (guac_rdp_fs_normalize_path(path, normalized_path)) { guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: Normalization of path \"%s\" failed.", __func__, path); return GUAC_RDP_FS_ENOENT; } guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: Normalized path \"%s\" to \"%s\".", __func__, path, normalized_path); /* Translate normalized path to real path */ __guac_rdp_fs_translate_path(fs, normalized_path, real_path); guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: Translated path \"%s\" to \"%s\".", __func__, normalized_path, real_path); switch (create_disposition) { /* Create if not exist, fail otherwise */ case DISP_FILE_CREATE: flags |= O_CREAT | O_EXCL; break; /* Open file if exists and do not overwrite, fail otherwise */ case DISP_FILE_OPEN: /* No flag necessary - default functionality of open */ break; /* Open if exists, create otherwise */ case DISP_FILE_OPEN_IF: flags |= O_CREAT; break; /* Overwrite if exists, fail otherwise */ case DISP_FILE_OVERWRITE: flags |= O_TRUNC; break; /* Overwrite if exists, create otherwise */ case DISP_FILE_OVERWRITE_IF: flags |= O_CREAT | O_TRUNC; break; /* Supersede (replace) if exists, otherwise create */ case DISP_FILE_SUPERSEDE: unlink(real_path); flags |= O_CREAT | O_TRUNC; break; /* Unrecognised disposition */ default: return GUAC_RDP_FS_ENOSYS; } /* Create directory first, if necessary */ if ((create_options & FILE_DIRECTORY_FILE) && (flags & O_CREAT)) { /* Create directory */ if (mkdir(real_path, S_IRWXU)) { if (errno != EEXIST || (flags & O_EXCL)) { guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: mkdir() failed: %s", __func__, strerror(errno)); return guac_rdp_fs_get_errorcode(errno); } } /* Unset O_CREAT and O_EXCL as directory must exist before open() */ flags &= ~(O_CREAT | O_EXCL); } guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: native open: real_path=\"%s\", flags=0x%x", __func__, real_path, flags); /* Open file */ fd = open(real_path, flags, S_IRUSR | S_IWUSR); /* If file open failed as we're trying to write a dir, retry as read-only */ if (fd == -1 && errno == EISDIR) { flags &= ~(O_WRONLY | O_RDWR); flags |= O_RDONLY; fd = open(real_path, flags, S_IRUSR | S_IWUSR); } if (fd == -1) { guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: open() failed: %s", __func__, strerror(errno)); return guac_rdp_fs_get_errorcode(errno); } /* Get file ID, init file */ file_id = guac_pool_next_int(fs->file_id_pool); file = &(fs->files[file_id]); file->id = file_id; file->fd = fd; file->dir = NULL; file->dir_pattern[0] = '\0'; file->absolute_path = strdup(normalized_path); file->real_path = strdup(real_path); file->bytes_written = 0; guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: Opened \"%s\" as file_id=%i", __func__, normalized_path, file_id); /* Attempt to pull file information */ if (fstat(fd, &file_stat) == 0) { /* Load size and times */ file->size = file_stat.st_size; file->ctime = WINDOWS_TIME(file_stat.st_ctime); file->mtime = WINDOWS_TIME(file_stat.st_mtime); file->atime = WINDOWS_TIME(file_stat.st_atime); /* Set type */ if (S_ISDIR(file_stat.st_mode)) file->attributes = FILE_ATTRIBUTE_DIRECTORY; else file->attributes = FILE_ATTRIBUTE_NORMAL; } /* If information cannot be retrieved, fake it */ else { /* Init information to 0, lacking any alternative */ file->size = 0; file->ctime = 0; file->mtime = 0; file->atime = 0; file->attributes = FILE_ATTRIBUTE_NORMAL; } fs->open_files++; return file_id; } int guac_rdp_fs_read(guac_rdp_fs* fs, int file_id, int offset, void* buffer, int length) { int bytes_read; guac_rdp_fs_file* file = guac_rdp_fs_get_file(fs, file_id); if (file == NULL) { guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: Read from bad file_id: %i", __func__, file_id); return GUAC_RDP_FS_EINVAL; } /* Attempt read */ lseek(file->fd, offset, SEEK_SET); bytes_read = read(file->fd, buffer, length); /* Translate errno on error */ if (bytes_read < 0) return guac_rdp_fs_get_errorcode(errno); return bytes_read; } int guac_rdp_fs_write(guac_rdp_fs* fs, int file_id, int offset, void* buffer, int length) { int bytes_written; guac_rdp_fs_file* file = guac_rdp_fs_get_file(fs, file_id); if (file == NULL) { guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: Write to bad file_id: %i", __func__, file_id); return GUAC_RDP_FS_EINVAL; } /* Attempt write */ lseek(file->fd, offset, SEEK_SET); bytes_written = write(file->fd, buffer, length); /* Translate errno on error */ if (bytes_written < 0) return guac_rdp_fs_get_errorcode(errno); file->bytes_written += bytes_written; return bytes_written; } int guac_rdp_fs_rename(guac_rdp_fs* fs, int file_id, const char* new_path) { char real_path[GUAC_RDP_FS_MAX_PATH]; char normalized_path[GUAC_RDP_FS_MAX_PATH]; guac_rdp_fs_file* file = guac_rdp_fs_get_file(fs, file_id); if (file == NULL) { guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: Rename of bad file_id: %i", __func__, file_id); return GUAC_RDP_FS_EINVAL; } /* Normalize path, return no-such-file if invalid */ if (guac_rdp_fs_normalize_path(new_path, normalized_path)) { guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: Normalization of path \"%s\" failed.", __func__, new_path); return GUAC_RDP_FS_ENOENT; } /* Translate normalized path to real path */ __guac_rdp_fs_translate_path(fs, normalized_path, real_path); guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: Renaming \"%s\" -> \"%s\"", __func__, file->real_path, real_path); /* Perform rename */ if (rename(file->real_path, real_path)) { guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: rename() failed: \"%s\" -> \"%s\"", __func__, file->real_path, real_path); return guac_rdp_fs_get_errorcode(errno); } return 0; } int guac_rdp_fs_delete(guac_rdp_fs* fs, int file_id) { /* Get file */ guac_rdp_fs_file* file = guac_rdp_fs_get_file(fs, file_id); if (file == NULL) { guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: Delete of bad file_id: %i", __func__, file_id); return GUAC_RDP_FS_EINVAL; } /* If directory, attempt removal */ if (file->attributes & FILE_ATTRIBUTE_DIRECTORY) { if (rmdir(file->real_path)) { guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: rmdir() failed: \"%s\"", __func__, file->real_path); return guac_rdp_fs_get_errorcode(errno); } } /* Otherwise, attempt deletion */ else if (unlink(file->real_path)) { guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: unlink() failed: \"%s\"", __func__, file->real_path); return guac_rdp_fs_get_errorcode(errno); } return 0; } int guac_rdp_fs_truncate(guac_rdp_fs* fs, int file_id, int length) { /* Get file */ guac_rdp_fs_file* file = guac_rdp_fs_get_file(fs, file_id); if (file == NULL) { guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: Delete of bad file_id: %i", __func__, file_id); return GUAC_RDP_FS_EINVAL; } /* Attempt truncate */ if (ftruncate(file->fd, length)) { guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: ftruncate() to %i bytes failed: \"%s\"", __func__, length, file->real_path); return guac_rdp_fs_get_errorcode(errno); } return 0; } void guac_rdp_fs_close(guac_rdp_fs* fs, int file_id) { guac_rdp_fs_file* file = guac_rdp_fs_get_file(fs, file_id); if (file == NULL) { guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: Ignoring close for bad file_id: %i", __func__, file_id); return; } file = &(fs->files[file_id]); guac_client_log(fs->client, GUAC_LOG_DEBUG, "%s: Closed \"%s\" (file_id=%i)", __func__, file->absolute_path, file_id); /* Close directory, if open */ if (file->dir != NULL) closedir(file->dir); /* Close file */ close(file->fd); /* Free name */ free(file->absolute_path); free(file->real_path); /* Free ID back to pool */ guac_pool_free_int(fs->file_id_pool, file_id); fs->open_files--; } const char* guac_rdp_fs_read_dir(guac_rdp_fs* fs, int file_id) { guac_rdp_fs_file* file; struct dirent* result; /* Only read if file ID is valid */ if (file_id < 0 || file_id >= GUAC_RDP_FS_MAX_FILES) return NULL; file = &(fs->files[file_id]); /* Open directory if not yet open, stop if error */ if (file->dir == NULL) { file->dir = fdopendir(file->fd); if (file->dir == NULL) return NULL; } /* Read next entry, stop if error */ if (readdir_r(file->dir, &(file->__dirent), &result)) return NULL; /* If no more entries, return NULL */ if (result == NULL) return NULL; /* Return filename */ return file->__dirent.d_name; } int guac_rdp_fs_normalize_path(const char* path, char* abs_path) { int i; int path_depth = 0; char path_component_data[GUAC_RDP_FS_MAX_PATH]; const char* path_components[64]; const char** current_path_component = &(path_components[0]); const char* current_path_component_data = &(path_component_data[0]); /* If original path is not absolute, normalization fails */ if (path[0] != '\\' && path[0] != '/') return 1; /* Skip past leading slash */ path++; /* Copy path into component data for parsing */ strncpy(path_component_data, path, GUAC_RDP_FS_MAX_PATH-1); /* Find path components within path */ for (i=0; i 0) path_depth--; } /* Otherwise, if component not current directory, add to list */ else if (strcmp(current_path_component_data, ".") != 0 && strcmp(current_path_component_data, "") != 0) path_components[path_depth++] = current_path_component_data; /* If end of string, stop */ if (c == 0) break; /* Update start of next component */ current_path_component_data = &(path_component_data[i+1]); } /* end if separator */ } /* end for each character */ /* If no components, the path is simply root */ if (path_depth == 0) { strcpy(abs_path, "\\"); return 0; } /* Ensure last component is null-terminated */ path_component_data[i] = 0; /* Convert components back into path */ for (; path_depth > 0; path_depth--) { const char* filename = *(current_path_component++); /* Add separator */ *(abs_path++) = '\\'; /* Copy string */ while (*filename != 0) *(abs_path++) = *(filename++); } /* Terminate absolute path */ *(abs_path++) = 0; return 0; } int guac_rdp_fs_convert_path(const char* parent, const char* rel_path, char* abs_path) { int i; char combined_path[GUAC_RDP_FS_MAX_PATH]; char* current = combined_path; /* Copy parent path */ for (i=0; i= GUAC_RDP_FS_MAX_FILES) return NULL; /* Return file at given ID */ return &(fs->files[file_id]); } int guac_rdp_fs_matches(const char* filename, const char* pattern) { return fnmatch(pattern, filename, FNM_NOESCAPE) != 0; } int guac_rdp_fs_get_info(guac_rdp_fs* fs, guac_rdp_fs_info* info) { /* Read FS information */ struct statvfs fs_stat; if (statvfs(fs->drive_path, &fs_stat)) return guac_rdp_fs_get_status(errno); /* Assign to structure */ info->blocks_available = fs_stat.f_bfree; info->blocks_total = fs_stat.f_blocks; info->block_size = fs_stat.f_bsize; return 0; } int guac_rdp_fs_append_filename(char* fullpath, const char* path, const char* filename) { int i; /* Disallow "." as a filename */ if (strcmp(filename, ".") == 0) return 0; /* Disallow ".." as a filename */ if (strcmp(filename, "..") == 0) return 0; /* Copy path, append trailing slash */ for (i=0; i 0 && path[i-1] != '/' && path[i-1] != '\\') fullpath[i++] = '/'; break; } /* Copy character if not end of string */ fullpath[i] = c; } /* Append filename */ for (; i #ifdef HAVE_FREERDP_LOCALE_KEYBOARD_H #include #else #include #endif #include /* Autogenerated from keymaps/base.keymap */ static guac_rdp_keysym_desc __guac_rdp_keymap_base[] = { { .keysym = 32, .scancode = 57 }, { .keysym = 65289, .scancode = 15 }, { .keysym = 65288, .scancode = 14 }, { .keysym = 65293, .scancode = 28 }, { .keysym = 65307, .scancode = 1 }, { .keysym = 65379, .scancode = 82, .flags = KBD_FLAGS_EXTENDED }, { .keysym = 65535, .scancode = 83, .flags = KBD_FLAGS_EXTENDED }, { .keysym = 65360, .scancode = 71, .flags = KBD_FLAGS_EXTENDED }, { .keysym = 65367, .scancode = 79, .flags = KBD_FLAGS_EXTENDED }, { .keysym = 65361, .scancode = 75, .flags = KBD_FLAGS_EXTENDED }, { .keysym = 65362, .scancode = 72, .flags = KBD_FLAGS_EXTENDED }, { .keysym = 65363, .scancode = 77, .flags = KBD_FLAGS_EXTENDED }, { .keysym = 65364, .scancode = 80, .flags = KBD_FLAGS_EXTENDED }, { .keysym = 65365, .scancode = 73, .flags = KBD_FLAGS_EXTENDED }, { .keysym = 65366, .scancode = 81, .flags = KBD_FLAGS_EXTENDED }, { .keysym = 65407, .scancode = 69 }, { .keysym = 65300, .scancode = 70 }, { .keysym = 65509, .scancode = 58, .flags = KBD_FLAGS_EXTENDED }, { .keysym = 65456, .scancode = 82 }, { .keysym = 65457, .scancode = 79 }, { .keysym = 65458, .scancode = 80 }, { .keysym = 65459, .scancode = 81 }, { .keysym = 65460, .scancode = 75 }, { .keysym = 65461, .scancode = 76 }, { .keysym = 65462, .scancode = 77 }, { .keysym = 65463, .scancode = 71 }, { .keysym = 65464, .scancode = 72 }, { .keysym = 65465, .scancode = 73 }, { .keysym = 65450, .scancode = 55 }, { .keysym = 65451, .scancode = 78 }, { .keysym = 65453, .scancode = 74 }, { .keysym = 65454, .scancode = 83 }, { .keysym = 65455, .scancode = 53, .flags = KBD_FLAGS_EXTENDED }, { .keysym = 65470, .scancode = 59 }, { .keysym = 65471, .scancode = 60 }, { .keysym = 65472, .scancode = 61 }, { .keysym = 65473, .scancode = 62 }, { .keysym = 65474, .scancode = 63 }, { .keysym = 65475, .scancode = 64 }, { .keysym = 65476, .scancode = 65 }, { .keysym = 65477, .scancode = 66 }, { .keysym = 65478, .scancode = 67 }, { .keysym = 65479, .scancode = 68 }, { .keysym = 65480, .scancode = 87 }, { .keysym = 65481, .scancode = 88 }, { .keysym = 65505, .scancode = 42 }, { .keysym = 65506, .scancode = 54 }, { .keysym = 65507, .scancode = 29 }, { .keysym = 65508, .scancode = 157 }, { .keysym = 65513, .scancode = 56 }, { .keysym = 65514, .scancode = 56, .flags = KBD_FLAGS_EXTENDED }, { .keysym = 65515, .scancode = 91, .flags = KBD_FLAGS_EXTENDED }, { .keysym = 65516, .scancode = 92, .flags = KBD_FLAGS_EXTENDED }, { .keysym = 65383, .scancode = 93, .flags = KBD_FLAGS_EXTENDED }, {0} }; static const guac_rdp_keymap guac_rdp_keymap_base = { .name = "base", .mapping = __guac_rdp_keymap_base }; /* Autogenerated from keymaps/failsafe.keymap */ static guac_rdp_keysym_desc __guac_rdp_keymap_failsafe[] = { {0} }; static const guac_rdp_keymap guac_rdp_keymap_failsafe = { .name = "failsafe", .parent = &guac_rdp_keymap_base, .freerdp_keyboard_layout = KBD_US, .mapping = __guac_rdp_keymap_failsafe }; /* Autogenerated from keymaps/de_de_qwertz.keymap */ static guac_rdp_keysym_desc __guac_rdp_keymap_de_de_qwertz[] = { { .keysym = 49, .scancode = 2, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 50, .scancode = 3, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 51, .scancode = 4, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 52, .scancode = 5, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 53, .scancode = 6, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 54, .scancode = 7, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 55, .scancode = 8, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 56, .scancode = 9, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 57, .scancode = 10, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 48, .scancode = 11, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 223, .scancode = 12, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 113, .scancode = 16, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 119, .scancode = 17, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 101, .scancode = 18, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 114, .scancode = 19, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 116, .scancode = 20, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 122, .scancode = 21, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 117, .scancode = 22, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 105, .scancode = 23, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 111, .scancode = 24, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 112, .scancode = 25, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 252, .scancode = 26, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 43, .scancode = 27, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 97, .scancode = 30, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 115, .scancode = 31, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 100, .scancode = 32, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 102, .scancode = 33, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 103, .scancode = 34, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 104, .scancode = 35, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 106, .scancode = 36, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 107, .scancode = 37, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 108, .scancode = 38, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 246, .scancode = 39, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 228, .scancode = 40, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 35, .scancode = 43, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 60, .scancode = 86, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 121, .scancode = 44, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 120, .scancode = 45, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 99, .scancode = 46, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 118, .scancode = 47, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 98, .scancode = 48, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 110, .scancode = 49, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 109, .scancode = 50, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 44, .scancode = 51, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 46, .scancode = 52, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 45, .scancode = 53, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 176, .scancode = 41, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 33, .scancode = 2, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 34, .scancode = 3, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 167, .scancode = 4, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 36, .scancode = 5, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 37, .scancode = 6, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 38, .scancode = 7, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 47, .scancode = 8, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 40, .scancode = 9, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 41, .scancode = 10, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 61, .scancode = 11, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 63, .scancode = 12, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 81, .scancode = 16, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 87, .scancode = 17, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 69, .scancode = 18, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 82, .scancode = 19, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 84, .scancode = 20, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 90, .scancode = 21, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 85, .scancode = 22, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 73, .scancode = 23, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 79, .scancode = 24, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 80, .scancode = 25, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 220, .scancode = 26, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 42, .scancode = 27, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 65, .scancode = 30, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 83, .scancode = 31, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 68, .scancode = 32, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 70, .scancode = 33, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 71, .scancode = 34, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 72, .scancode = 35, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 74, .scancode = 36, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 75, .scancode = 37, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 76, .scancode = 38, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 214, .scancode = 39, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 196, .scancode = 40, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 39, .scancode = 43, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 62, .scancode = 86, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 89, .scancode = 44, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 88, .scancode = 45, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 67, .scancode = 46, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 86, .scancode = 47, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 66, .scancode = 48, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 78, .scancode = 49, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 77, .scancode = 50, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 59, .scancode = 51, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 58, .scancode = 52, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 95, .scancode = 53, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 178, .scancode = 3, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 179, .scancode = 4, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 123, .scancode = 8, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 91, .scancode = 9, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 93, .scancode = 10, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 125, .scancode = 11, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 92, .scancode = 12, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 64, .scancode = 16, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 16785580, .scancode = 18, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 124, .scancode = 86, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 181, .scancode = 50, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 65104, .scancode = 13, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 65105, .scancode = 13, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 65106, .scancode = 41, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 65107, .scancode = 12, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, {0} }; static const guac_rdp_keymap guac_rdp_keymap_de_de_qwertz = { .name = "de-de-qwertz", .parent = &guac_rdp_keymap_base, .freerdp_keyboard_layout = KBD_GERMAN, .mapping = __guac_rdp_keymap_de_de_qwertz }; /* Autogenerated from keymaps/en_us_qwerty.keymap */ static guac_rdp_keysym_desc __guac_rdp_keymap_en_us_qwerty[] = { { .keysym = 96, .scancode = 41, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 49, .scancode = 2, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 50, .scancode = 3, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 51, .scancode = 4, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 52, .scancode = 5, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 53, .scancode = 6, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 54, .scancode = 7, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 55, .scancode = 8, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 56, .scancode = 9, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 57, .scancode = 10, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 48, .scancode = 11, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 45, .scancode = 12, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 61, .scancode = 13, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 113, .scancode = 16, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 119, .scancode = 17, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 101, .scancode = 18, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 114, .scancode = 19, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 116, .scancode = 20, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 121, .scancode = 21, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 117, .scancode = 22, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 105, .scancode = 23, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 111, .scancode = 24, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 112, .scancode = 25, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 91, .scancode = 26, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 93, .scancode = 27, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 92, .scancode = 43, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 97, .scancode = 30, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 115, .scancode = 31, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 100, .scancode = 32, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 102, .scancode = 33, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 103, .scancode = 34, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 104, .scancode = 35, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 106, .scancode = 36, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 107, .scancode = 37, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 108, .scancode = 38, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 59, .scancode = 39, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 39, .scancode = 40, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 122, .scancode = 44, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 120, .scancode = 45, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 99, .scancode = 46, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 118, .scancode = 47, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 98, .scancode = 48, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 110, .scancode = 49, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 109, .scancode = 50, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 44, .scancode = 51, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 46, .scancode = 52, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 47, .scancode = 53, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 126, .scancode = 41, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 33, .scancode = 2, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 64, .scancode = 3, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 35, .scancode = 4, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 36, .scancode = 5, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 37, .scancode = 6, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 94, .scancode = 7, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 38, .scancode = 8, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 42, .scancode = 9, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 40, .scancode = 10, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 41, .scancode = 11, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 95, .scancode = 12, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 43, .scancode = 13, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 81, .scancode = 16, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 87, .scancode = 17, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 69, .scancode = 18, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 82, .scancode = 19, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 84, .scancode = 20, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 89, .scancode = 21, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 85, .scancode = 22, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 73, .scancode = 23, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 79, .scancode = 24, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 80, .scancode = 25, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 123, .scancode = 26, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 125, .scancode = 27, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 124, .scancode = 43, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 65, .scancode = 30, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 83, .scancode = 31, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 68, .scancode = 32, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 70, .scancode = 33, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 71, .scancode = 34, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 72, .scancode = 35, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 74, .scancode = 36, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 75, .scancode = 37, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 76, .scancode = 38, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 58, .scancode = 39, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 34, .scancode = 40, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 90, .scancode = 44, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 88, .scancode = 45, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 67, .scancode = 46, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 86, .scancode = 47, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 66, .scancode = 48, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 78, .scancode = 49, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 77, .scancode = 50, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 60, .scancode = 51, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 62, .scancode = 52, .set_keysyms = GUAC_KEYSYMS_SHIFT }, { .keysym = 63, .scancode = 53, .set_keysyms = GUAC_KEYSYMS_SHIFT }, {0} }; static const guac_rdp_keymap guac_rdp_keymap_en_us_qwerty = { .name = "en-us-qwerty", .parent = &guac_rdp_keymap_base, .freerdp_keyboard_layout = KBD_US, .mapping = __guac_rdp_keymap_en_us_qwerty }; /* Autogenerated from keymaps/fr_fr_azerty.keymap */ static guac_rdp_keysym_desc __guac_rdp_keymap_fr_fr_azerty[] = { { .keysym = 178, .scancode = 41, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 38, .scancode = 2, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 233, .scancode = 3, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 34, .scancode = 4, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 39, .scancode = 5, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 40, .scancode = 6, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 45, .scancode = 7, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 232, .scancode = 8, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 95, .scancode = 9, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 231, .scancode = 10, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 224, .scancode = 11, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 41, .scancode = 12, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 61, .scancode = 13, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 97, .scancode = 16, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 122, .scancode = 17, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 101, .scancode = 18, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 114, .scancode = 19, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 116, .scancode = 20, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 121, .scancode = 21, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 117, .scancode = 22, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 105, .scancode = 23, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 111, .scancode = 24, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 112, .scancode = 25, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 36, .scancode = 27, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 113, .scancode = 30, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 115, .scancode = 31, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 100, .scancode = 32, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 102, .scancode = 33, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 103, .scancode = 34, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 104, .scancode = 35, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 106, .scancode = 36, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 107, .scancode = 37, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 108, .scancode = 38, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 109, .scancode = 39, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 249, .scancode = 40, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 42, .scancode = 43, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 60, .scancode = 86, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 119, .scancode = 44, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 120, .scancode = 45, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 99, .scancode = 46, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 118, .scancode = 47, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 98, .scancode = 48, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 110, .scancode = 49, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 44, .scancode = 50, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 59, .scancode = 51, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 58, .scancode = 52, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 33, .scancode = 53, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 49, .scancode = 2, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 50, .scancode = 3, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 51, .scancode = 4, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 52, .scancode = 5, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 53, .scancode = 6, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 54, .scancode = 7, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 55, .scancode = 8, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 56, .scancode = 9, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 57, .scancode = 10, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 48, .scancode = 11, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 176, .scancode = 12, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 43, .scancode = 13, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 65, .scancode = 16, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 90, .scancode = 17, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 69, .scancode = 18, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 82, .scancode = 19, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 84, .scancode = 20, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 89, .scancode = 21, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 85, .scancode = 22, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 73, .scancode = 23, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 79, .scancode = 24, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 80, .scancode = 25, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 163, .scancode = 27, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 81, .scancode = 30, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 83, .scancode = 31, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 68, .scancode = 32, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 70, .scancode = 33, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 71, .scancode = 34, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 72, .scancode = 35, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 74, .scancode = 36, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 75, .scancode = 37, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 76, .scancode = 38, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 77, .scancode = 39, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 37, .scancode = 40, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 181, .scancode = 43, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 62, .scancode = 86, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 87, .scancode = 44, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 88, .scancode = 45, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 67, .scancode = 46, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 86, .scancode = 47, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 66, .scancode = 48, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 78, .scancode = 49, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 63, .scancode = 50, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 46, .scancode = 51, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 47, .scancode = 52, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 167, .scancode = 53, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 126, .scancode = 3, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 35, .scancode = 4, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 123, .scancode = 5, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 91, .scancode = 6, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 124, .scancode = 7, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 96, .scancode = 8, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 92, .scancode = 9, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 94, .scancode = 10, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 64, .scancode = 11, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 93, .scancode = 12, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 125, .scancode = 13, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 16785580, .scancode = 18, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 164, .scancode = 27, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 65106, .scancode = 26, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 65111, .scancode = 26, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, {0} }; static const guac_rdp_keymap guac_rdp_keymap_fr_fr_azerty = { .name = "fr-fr-azerty", .parent = &guac_rdp_keymap_base, .freerdp_keyboard_layout = KBD_FRENCH, .mapping = __guac_rdp_keymap_fr_fr_azerty }; /* Autogenerated from keymaps/it_it_qwerty.keymap */ static guac_rdp_keysym_desc __guac_rdp_keymap_it_it_qwerty[] = { { .keysym = 92, .scancode = 41, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 49, .scancode = 2, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 50, .scancode = 3, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 51, .scancode = 4, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 52, .scancode = 5, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 53, .scancode = 6, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 54, .scancode = 7, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 55, .scancode = 8, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 56, .scancode = 9, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 57, .scancode = 10, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 48, .scancode = 11, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 39, .scancode = 12, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 236, .scancode = 13, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 113, .scancode = 16, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 119, .scancode = 17, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 101, .scancode = 18, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 114, .scancode = 19, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 116, .scancode = 20, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 121, .scancode = 21, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 117, .scancode = 22, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 105, .scancode = 23, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 111, .scancode = 24, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 112, .scancode = 25, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 232, .scancode = 26, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 43, .scancode = 27, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 97, .scancode = 30, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 115, .scancode = 31, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 100, .scancode = 32, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 102, .scancode = 33, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 103, .scancode = 34, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 104, .scancode = 35, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 106, .scancode = 36, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 107, .scancode = 37, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 108, .scancode = 38, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 242, .scancode = 39, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 224, .scancode = 40, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 249, .scancode = 43, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 60, .scancode = 86, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 122, .scancode = 44, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 120, .scancode = 45, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 99, .scancode = 46, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 118, .scancode = 47, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 98, .scancode = 48, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 110, .scancode = 49, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 109, .scancode = 50, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 44, .scancode = 51, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 46, .scancode = 52, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 45, .scancode = 53, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 124, .scancode = 41, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 33, .scancode = 2, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 34, .scancode = 3, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 163, .scancode = 4, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 36, .scancode = 5, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 37, .scancode = 6, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 38, .scancode = 7, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 47, .scancode = 8, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 40, .scancode = 9, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 41, .scancode = 10, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 61, .scancode = 11, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 63, .scancode = 12, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 94, .scancode = 13, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 81, .scancode = 16, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 87, .scancode = 17, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 69, .scancode = 18, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 82, .scancode = 19, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 84, .scancode = 20, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 89, .scancode = 21, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 85, .scancode = 22, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 73, .scancode = 23, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 79, .scancode = 24, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 80, .scancode = 25, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 233, .scancode = 26, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 42, .scancode = 27, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 65, .scancode = 30, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 83, .scancode = 31, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 68, .scancode = 32, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 70, .scancode = 33, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 71, .scancode = 34, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 72, .scancode = 35, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 74, .scancode = 36, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 75, .scancode = 37, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 76, .scancode = 38, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 231, .scancode = 39, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 176, .scancode = 40, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 167, .scancode = 43, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 62, .scancode = 86, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 90, .scancode = 44, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 88, .scancode = 45, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 67, .scancode = 46, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 86, .scancode = 47, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 66, .scancode = 48, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 78, .scancode = 49, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 77, .scancode = 50, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 59, .scancode = 51, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 58, .scancode = 52, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 95, .scancode = 53, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 16785580, .scancode = 18, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 91, .scancode = 26, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 93, .scancode = 27, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 64, .scancode = 39, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 35, .scancode = 40, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 123, .scancode = 26, .set_keysyms = GUAC_KEYSYMS_SHIFT_ALTGR }, { .keysym = 125, .scancode = 27, .set_keysyms = GUAC_KEYSYMS_SHIFT_ALTGR }, {0} }; static const guac_rdp_keymap guac_rdp_keymap_it_it_qwerty = { .name = "it-it-qwerty", .parent = &guac_rdp_keymap_base, .freerdp_keyboard_layout = KBD_ITALIAN, .mapping = __guac_rdp_keymap_it_it_qwerty }; /* Autogenerated from keymaps/sv_se_qwerty.keymap */ static guac_rdp_keysym_desc __guac_rdp_keymap_sv_se_qwerty[] = { { .keysym = 167, .scancode = 41, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 49, .scancode = 2, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 50, .scancode = 3, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 51, .scancode = 4, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 52, .scancode = 5, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 53, .scancode = 6, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 54, .scancode = 7, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 55, .scancode = 8, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 56, .scancode = 9, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 57, .scancode = 10, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 48, .scancode = 11, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 43, .scancode = 12, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 113, .scancode = 16, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 119, .scancode = 17, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 101, .scancode = 18, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 114, .scancode = 19, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 116, .scancode = 20, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 121, .scancode = 21, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 117, .scancode = 22, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 105, .scancode = 23, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 111, .scancode = 24, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 112, .scancode = 25, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 229, .scancode = 26, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 97, .scancode = 30, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 115, .scancode = 31, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 100, .scancode = 32, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 102, .scancode = 33, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 103, .scancode = 34, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 104, .scancode = 35, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 106, .scancode = 36, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 107, .scancode = 37, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 108, .scancode = 38, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 246, .scancode = 39, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 228, .scancode = 40, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 39, .scancode = 43, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 60, .scancode = 86, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 122, .scancode = 44, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 120, .scancode = 45, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 99, .scancode = 46, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 118, .scancode = 47, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 98, .scancode = 48, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 110, .scancode = 49, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 109, .scancode = 50, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 44, .scancode = 51, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 46, .scancode = 52, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 45, .scancode = 53, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 189, .scancode = 41, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 33, .scancode = 2, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 34, .scancode = 3, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 35, .scancode = 4, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 164, .scancode = 5, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 37, .scancode = 6, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 38, .scancode = 7, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 47, .scancode = 8, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 40, .scancode = 9, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 41, .scancode = 10, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 61, .scancode = 11, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 63, .scancode = 12, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 81, .scancode = 16, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 87, .scancode = 17, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 69, .scancode = 18, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 82, .scancode = 19, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 84, .scancode = 20, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 89, .scancode = 21, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 85, .scancode = 22, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 73, .scancode = 23, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 79, .scancode = 24, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 80, .scancode = 25, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 197, .scancode = 26, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 65, .scancode = 30, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 83, .scancode = 31, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 68, .scancode = 32, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 70, .scancode = 33, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 71, .scancode = 34, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 72, .scancode = 35, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 74, .scancode = 36, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 75, .scancode = 37, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 76, .scancode = 38, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 214, .scancode = 39, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 196, .scancode = 40, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 42, .scancode = 43, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 62, .scancode = 86, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 90, .scancode = 44, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 88, .scancode = 45, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 67, .scancode = 46, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 86, .scancode = 47, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 66, .scancode = 48, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 78, .scancode = 49, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 77, .scancode = 50, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 59, .scancode = 51, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 58, .scancode = 52, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 95, .scancode = 53, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 64, .scancode = 3, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 163, .scancode = 4, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 36, .scancode = 5, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 123, .scancode = 8, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 91, .scancode = 9, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 93, .scancode = 10, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 125, .scancode = 11, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 92, .scancode = 12, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 16785580, .scancode = 18, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 124, .scancode = 86, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 181, .scancode = 50, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, { .keysym = 65105, .scancode = 13, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 65104, .scancode = 13, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 65111, .scancode = 27, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR }, { .keysym = 65106, .scancode = 27, .set_keysyms = GUAC_KEYSYMS_SHIFT, .clear_keysyms = GUAC_KEYSYMS_ALTGR }, { .keysym = 65107, .scancode = 27, .set_keysyms = GUAC_KEYSYMS_ALTGR, .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT }, {0} }; static const guac_rdp_keymap guac_rdp_keymap_sv_se_qwerty = { .name = "sv-se-qwerty", .parent = &guac_rdp_keymap_base, .freerdp_keyboard_layout = KBD_SWEDISH, .mapping = __guac_rdp_keymap_sv_se_qwerty }; const guac_rdp_keymap* GUAC_KEYMAPS[] = { &guac_rdp_keymap_base, &guac_rdp_keymap_failsafe, &guac_rdp_keymap_de_de_qwertz, &guac_rdp_keymap_en_us_qwerty, &guac_rdp_keymap_fr_fr_azerty, &guac_rdp_keymap_it_it_qwerty, &guac_rdp_keymap_sv_se_qwerty, NULL }; guacamole-server-0.9.9/src/protocols/rdp/keymaps/0000775000175100017510000000000012645400336017053 500000000000000guacamole-server-0.9.9/src/protocols/rdp/keymaps/generate.pl0000775000175100017510000002127512536405625021141 00000000000000#!/usr/bin/perl # # Copyright (C) 2013 Glyptodon LLC # # 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. # # # generate.pl # # Parse .keymap files, producing corresponding .c files that can be included # into the RDP plugin source. # # We need at least Perl 5.8 for Unicode's sake use 5.008; sub keymap_symbol { my $name = shift; $name =~ s/-/_/g; return 'guac_rdp_keymap_' . $name; } # # _generated_keymaps.c # my @keymaps = (); open OUTPUT, ">", "_generated_keymaps.c"; print OUTPUT '#include "config.h"' . "\n" . '#include "rdp_keymap.h"' . "\n" . '#include ' . "\n" . "\n" . '#ifdef HAVE_FREERDP_LOCALE_KEYBOARD_H' . "\n" . '#include ' . "\n" . '#else' . "\n" . '#include ' . "\n" . '#endif' . "\n" . "\n" . '#include ' . "\n" . "\n"; for my $filename (@ARGV) { my $content = ""; my $parent = ""; my $layout_name = ""; my $freerdp = ""; # Parse file open INPUT, '<', "$filename"; binmode INPUT, ":encoding(utf8)"; while () { chomp; # Comments if (m/^\s*#/) {} # Name elsif ((my $name) = m/^\s*name\s+"(.*)"\s*(?:#.*)?$/) { $layout_name = $name; } # Parent map elsif ((my $name) = m/^\s*parent\s+"(.*)"\s*(?:#.*)?$/) { $parent = keymap_symbol($name); } # FreeRDP equiv elsif ((my $name) = m/^\s*freerdp\s+"(.*)"\s*(?:#.*)?$/) { $freerdp = $name; } # Map elsif ((my $range, my $onto) = m/^\s*map\s+([^~]*)\s+~\s+(".*"|0x[0-9A-Fa-f]+)\s*(?:#.*)?$/) { my @keysyms = (); my @scancodes = (); my $ext_flags = 0; my $set_shift = 0; my $set_altgr = 0; my $clear_shift = 0; my $clear_altgr = 0; # Parse ranges and options foreach $_ (split(/\s+/, $range)) { # Set option/modifier if ((my $opt) = m/^\+([a-z]+)$/) { if ($opt eq "shift") { $set_shift = 1; } elsif ($opt eq "altgr") { $set_altgr = 1; } elsif ($opt eq "ext") { $ext_flags = 1; } else { die "$filename: $.: ERROR: " . "Invalid set option\n"; } } # Clear option/modifier elsif ((my $opt) = m/^-([a-z]+)$/) { if ($opt eq "shift") { $clear_shift = 1; } elsif ($opt eq "altgr") { $clear_altgr = 1; } else { die "$filename: $.: ERROR: " . "Invalid clear option\n"; } } # Single scancode elsif ((my $scancode) = m/^(0x[0-9A-Fa-f]+)$/) { $scancodes[++$#scancodes] = hex($scancode); } # Range of scancodes elsif ((my $start, my $end) = m/^(0x[0-9A-Fa-f]+)\.\.(0x[0-9A-Fa-f]+)$/) { for (my $i=hex($start); $i<=hex($end); $i++) { $scancodes[++$#scancodes] = $i; } } # Invalid token else { die "$filename: $.: ERROR: " . "Invalid token\n"; } } # Parse onto if ($onto =~ m/^0x/) { $keysyms[0] = hex($onto); } else { foreach my $char (split('', substr($onto, 1, length($onto)-2))) { my $codepoint = ord($char); if ($codepoint >= 0x0100) { $keysyms[++$#keysyms] = 0x01000000 | $codepoint; } else { $keysyms[++$#keysyms] = $codepoint; } } } # Check mapping if ($#keysyms != $#scancodes) { die "$filename: $.: ERROR: " . "Keysym and scancode range lengths differ\n"; } # Write keysym/scancode pairs for (my $i=0; $i<=$#keysyms; $i++) { $content .= " {" . " .keysym = " . $keysyms[$i] . "," . " .scancode = " . $scancodes[$i]; # Set requirements if ($set_shift && !$set_altgr) { $content .= ", .set_keysyms = GUAC_KEYSYMS_SHIFT"; } elsif (!$set_shift && $set_altgr) { $content .= ", .set_keysyms = GUAC_KEYSYMS_ALTGR"; } elsif ($set_shift && $set_altgr) { $content .= ", .set_keysyms = GUAC_KEYSYMS_SHIFT_ALTGR"; } # Clear requirements if ($clear_shift && !$clear_altgr) { $content .= ", .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT"; } elsif (!$clear_shift && $clear_altgr) { $content .= ", .clear_keysyms = GUAC_KEYSYMS_ALTGR"; } elsif ($clear_shift && $clear_altgr) { $content .= ", .clear_keysyms = GUAC_KEYSYMS_ALL_SHIFT_ALTGR"; } # Flags if ($ext_flags) { $content .= ", .flags = KBD_FLAGS_EXTENDED"; } $content .= " },\n"; } } # Invalid token elsif (m/\S/) { die "$filename: $.: ERROR: " . "Invalid token\n"; } } close INPUT; # Header my $sym = keymap_symbol($layout_name); print OUTPUT "\n" . '/* Autogenerated from ' . $filename . ' */' . "\n" . 'static guac_rdp_keysym_desc __' . $sym . '[] = {' . "\n" . $content . ' {0}' . "\n" . '};' . "\n"; # Desc header print OUTPUT "\n" . 'static const guac_rdp_keymap ' . $sym . ' = { ' . "\n"; # Layout name print OUTPUT " .name = \"$layout_name\",\n"; # Parent layout (if any) if ($parent) { print OUTPUT " .parent = &$parent,\n"; } # FreeRDP layout (if any) if ($freerdp) { print OUTPUT " .freerdp_keyboard_layout = $freerdp,\n"; } # Desc footer print OUTPUT ' .mapping = __' . $sym . "\n" . '};' . "\n"; $keymaps[++$#keymaps] = $sym; print STDERR "Added: $layout_name\n"; } print OUTPUT "\n" . 'const guac_rdp_keymap* GUAC_KEYMAPS[] = {' . "\n"; foreach my $keymap (@keymaps) { print OUTPUT " &$keymap,\n"; } print OUTPUT ' NULL' . "\n" . '};' . "\n"; close OUTPUT; guacamole-server-0.9.9/src/protocols/rdp/keymaps/sv_se_qwerty.keymap0000664000175100017510000000427212612226234022737 00000000000000# # Copyright (C) 2014 Glyptodon LLC # # 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. # parent "base" name "sv-se-qwerty" freerdp "KBD_SWEDISH" # # Basic keys # map -altgr -shift 0x29 0x02..0x0C ~ "§1234567890+" map -altgr -shift 0x10..0x1A ~ "qwertyuiopÃ¥" map -altgr -shift 0x1E..0x28 0x2B ~ "asdfghjklöä'" map -altgr -shift 0x56 0x2C..0x35 ~ "ZXCVBNM;:_" # # Keys requiring AltGr # map +altgr -shift 0x03 ~ "@" map +altgr -shift 0x04 ~ "£" map +altgr -shift 0x05 ~ "$" map +altgr -shift 0x08 ~ "{" map +altgr -shift 0x09 ~ "[" map +altgr -shift 0x0A ~ "]" map +altgr -shift 0x0B ~ "}" map +altgr -shift 0x0C ~ "\" map +altgr -shift 0x12 ~ "€" map +altgr -shift 0x56 ~ "|" map +altgr -shift 0x32 ~ "µ" # # Dead keys # map -altgr -shift 0x0D ~ 0xFE51 # Dead acute map -altgr +shift 0x0D ~ 0xFE50 # Dead grave map -altgr -shift 0x1B ~ 0xFE57 # Dead umlaut map -altgr +shift 0x1B ~ 0xFE52 # Dead circumflex map +altgr -shift 0x1B ~ 0xFE53 # Dead tilde guacamole-server-0.9.9/src/protocols/rdp/keymaps/base.keymap0000664000175100017510000000534712626724073021134 00000000000000# # Copyright (C) 2013 Glyptodon LLC # # 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. # name "base" # Typeable characters map 0x39 ~ " " # Space map 0x0F ~ 0xff09 # Tab # Control characters map 0x0E ~ 0xff08 # BackSpace map 0x1C ~ 0xff0d # Return map 0x01 ~ 0xff1b # Escape map +ext 0x52 ~ 0xff63 # Insert map +ext 0x53 ~ 0xffff # Delete map +ext 0x47 ~ 0xff50 # Home map +ext 0x4F ~ 0xff57 # End map +ext 0x4B ~ 0xff51 # Left map +ext 0x48 ~ 0xff52 # Up map +ext 0x4D ~ 0xff53 # Right map +ext 0x50 ~ 0xff54 # Down map +ext 0x49 ~ 0xff55 # Page_Up map +ext 0x51 ~ 0xff56 # Page_Down # Locks map 0x45 ~ 0xff7f # Num_Lock map 0x46 ~ 0xff14 # Scroll_Lock map +ext 0x3A ~ 0xffe5 # Caps_Lock # Keypad numerals map 0x52 ~ 0xffb0 # KP_0 map 0x4F ~ 0xffb1 # KP_1 map 0x50 ~ 0xffb2 # KP_2 map 0x51 ~ 0xffb3 # KP_3 map 0x4B ~ 0xffb4 # KP_4 map 0x4C ~ 0xffb5 # KP_5 map 0x4D ~ 0xffb6 # KP_6 map 0x47 ~ 0xffb7 # KP_7 map 0x48 ~ 0xffb8 # KP_8 map 0x49 ~ 0xffb9 # KP_9 # Keypad operators map 0x37 ~ 0xffaa # KP_multiply map 0x4e ~ 0xffab # KP_add map 0x4a ~ 0xffad # KP_subtract map 0x53 ~ 0xffae # KP_decimal map +ext 0x35 ~ 0xffaf # KP_divide # F keys map 0x3B ~ 0xffbe # F1 map 0x3C ~ 0xffbf # F2 map 0x3D ~ 0xffc0 # F3 map 0x3E ~ 0xffc1 # F4 map 0x3F ~ 0xffc2 # F5 map 0x40 ~ 0xffc3 # F6 map 0x41 ~ 0xffc4 # F7 map 0x42 ~ 0xffc5 # F8 map 0x43 ~ 0xffc6 # F9 map 0x44 ~ 0xffc7 # F10 map 0x57 ~ 0xffc8 # F11 map 0x58 ~ 0xffc9 # F12 # Modifiers map 0x2A ~ 0xffe1 # Shift_L map 0x36 ~ 0xffe2 # Shift_R map 0x1D ~ 0xffe3 # Control_L map 0x9D ~ 0xffe4 # Control_R map 0x38 ~ 0xffe9 # Alt_L map +ext 0x38 ~ 0xffea # Alt_R map +ext 0x5B ~ 0xffeb # Super_L map +ext 0x5C ~ 0xffec # Super_R map +ext 0x5D ~ 0xff67 # Menu guacamole-server-0.9.9/src/protocols/rdp/keymaps/it_it_qwerty.keymap0000664000175100017510000000351712626133327022736 00000000000000# # Copyright (C) 2013 Glyptodon LLC # # 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. # parent "base" name "it-it-qwerty" freerdp "KBD_ITALIAN" # # Basic keys # map -altgr -shift 0x29 0x02..0x0D ~ "\1234567890'ì" map -altgr -shift 0x10..0x1B ~ "qwertyuiopè+" map -altgr -shift 0x1E..0x28 0x2B ~ "asdfghjklòàù" map -altgr -shift 0x56 0x2C..0x35 ~ "ZXCVBNM;:_" # # Keys requiring AltGr # map +altgr -shift 0x12 ~ "€" map +altgr -shift 0x1A ~ "[" map +altgr -shift 0x1B ~ "]" map +altgr -shift 0x27 ~ "@" map +altgr -shift 0x28 ~ "#" map +altgr +shift 0x1A ~ "{" map +altgr +shift 0x1B ~ "}" guacamole-server-0.9.9/src/protocols/rdp/keymaps/fr_fr_azerty.keymap0000664000175100017510000000353212536405625022707 00000000000000# # Copyright (C) 2013 Glyptodon LLC # # 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. # parent "base" name "fr-fr-azerty" freerdp "KBD_FRENCH" # # Basic keys # map -altgr -shift 0x29 0x02..0x0D ~ "²&é"'(-è_çà)=" map -altgr -shift 0x10..0x19 0x1B ~ "azertyuiop$" map -altgr -shift 0x1E..0x28 0x2B ~ "qsdfghjklmù*" map -altgr -shift 0x56 0x2C..0x35 ~ "WXCVBN?./§" # # Keys requiring AltGr # map +altgr -shift 0x03..0x0D ~ "~#{[|`\^@]}" map +altgr -shift 0x12 ~ "€" map +altgr -shift 0x1B ~ "¤" # # Dead keys # map -altgr -shift 0x1A ~ 0xFE52 # Dead circumflex map -altgr +shift 0x1A ~ 0xFE57 # Dead umlaut guacamole-server-0.9.9/src/protocols/rdp/keymaps/de_de_qwertz.keymap0000664000175100017510000000421512536405625022666 00000000000000# # Copyright (C) 2013 Glyptodon LLC # # 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. # parent "base" name "de-de-qwertz" freerdp "KBD_GERMAN" # # Basic keys # map -altgr -shift 0x02..0x0C ~ "1234567890ß" map -altgr -shift 0x10..0x1B ~ "qwertzuiopü+" map -altgr -shift 0x1E..0x28 0x2B ~ "asdfghjklöä#" map -altgr -shift 0x56 0x2C..0x35 ~ "YXCVBNM;:_" # # Keys requiring AltGr # map +altgr -shift 0x03 ~ "²" map +altgr -shift 0x04 ~ "³" map +altgr -shift 0x08 ~ "{" map +altgr -shift 0x09 ~ "[" map +altgr -shift 0x0A ~ "]" map +altgr -shift 0x0B ~ "}" map +altgr -shift 0x0C ~ "\" map +altgr -shift 0x10 ~ "@" map +altgr -shift 0x12 ~ "€" map +altgr -shift 0x56 ~ "|" map +altgr -shift 0x32 ~ "µ" # # Dead keys # map -altgr +shift 0x0D ~ 0xFE50 # Dead grave map -altgr -shift 0x0D ~ 0xFE51 # Dead acute map -altgr -shift 0x29 ~ 0xFE52 # Dead circumflex map +altgr -shift 0x0C ~ 0xFE53 # Dead tilde guacamole-server-0.9.9/src/protocols/rdp/keymaps/failsafe.keymap0000664000175100017510000000217512536405625021767 00000000000000# # Copyright (C) 2013 Glyptodon LLC # # 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. # parent "base" name "failsafe" freerdp "KBD_US" guacamole-server-0.9.9/src/protocols/rdp/keymaps/en_us_qwerty.keymap0000664000175100017510000000301112536405625022727 00000000000000# # Copyright (C) 2013 Glyptodon LLC # # 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. # parent "base" name "en-us-qwerty" freerdp "KBD_US" map -shift 0x29 0x02..0x0D ~ "`1234567890-=" map -shift 0x10..0x1B 0x2B ~ "qwertyuiop[]\" map -shift 0x1E..0x28 ~ "asdfghjkl;'" map -shift 0x2C..0x35 ~ "zxcvbnm,./" map +shift 0x29 0x02..0x0D ~ "~!@#$%^&*()_+" map +shift 0x10..0x1B 0x2B ~ "QWERTYUIOP{}|" map +shift 0x1E..0x28 ~ "ASDFGHJKL:"" map +shift 0x2C..0x35 ~ "ZXCVBNM<>?" guacamole-server-0.9.9/src/protocols/rdp/Makefile.am0000664000175100017510000001750712643542623017374 00000000000000# # Copyright (C) 2015 Glyptodon LLC # # 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. # AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 lib_LTLIBRARIES = libguac-client-rdp.la libguac_client_rdp_la_SOURCES = \ _generated_keymaps.c \ client.c \ guac_handlers.c \ rdp_bitmap.c \ rdp_cliprdr.c \ rdp_color.c \ rdp_fs.c \ rdp_gdi.c \ rdp_glyph.c \ rdp_keymap.c \ rdp_pointer.c \ rdp_rail.c \ rdp_settings.c \ rdp_stream.c \ rdp_svc.c \ resolution.c \ unicode.c guacsvc_sources = \ guac_svc/svc_service.c \ rdp_svc.c guacsnd_sources = \ guac_rdpsnd/rdpsnd_messages.c \ guac_rdpsnd/rdpsnd_service.c guacdr_sources = \ guac_rdpdr/rdpdr_fs_messages.c \ guac_rdpdr/rdpdr_fs_messages_dir_info.c \ guac_rdpdr/rdpdr_fs_messages_file_info.c \ guac_rdpdr/rdpdr_fs_messages_vol_info.c \ guac_rdpdr/rdpdr_fs_service.c \ guac_rdpdr/rdpdr_messages.c \ guac_rdpdr/rdpdr_printer.c \ guac_rdpdr/rdpdr_service.c \ rdp_fs.c \ rdp_stream.c \ unicode.c noinst_HEADERS = \ compat/client-cliprdr.h \ compat/rail.h \ guac_rdpdr/rdpdr_fs_messages.h \ guac_rdpdr/rdpdr_fs_messages_dir_info.h \ guac_rdpdr/rdpdr_fs_messages_file_info.h \ guac_rdpdr/rdpdr_fs_messages_vol_info.h \ guac_rdpdr/rdpdr_fs_service.h \ guac_rdpdr/rdpdr_messages.h \ guac_rdpdr/rdpdr_printer.h \ guac_rdpdr/rdpdr_service.h \ guac_rdpsnd/rdpsnd_messages.h \ guac_rdpsnd/rdpsnd_service.h \ guac_svc/svc_service.h \ client.h \ guac_handlers.h \ rdp_bitmap.h \ rdp_cliprdr.h \ rdp_color.h \ rdp_fs.h \ rdp_gdi.h \ rdp_glyph.h \ rdp_keymap.h \ rdp_pointer.h \ rdp_rail.h \ rdp_settings.h \ rdp_status.h \ rdp_stream.h \ rdp_svc.h \ resolution.h \ unicode.h # Add compatibility layer for WinPR if not available if ! ENABLE_WINPR noinst_HEADERS += compat/winpr-stream.h compat/winpr-wtypes.h libguac_client_rdp_la_SOURCES += compat/winpr-stream.c guacsvc_sources += compat/winpr-stream.c guacsnd_sources += compat/winpr-stream.c guacdr_sources += compat/winpr-stream.c endif # Add display update channel support, if supported by FreeRDP if ENABLE_DISPLAY_UPDATE noinst_HEADERS += rdp_disp.h libguac_client_rdp_la_SOURCES += rdp_disp.c endif # # Main RDP client library # libguac_client_rdp_la_CFLAGS = \ -Werror -Wall -Iinclude \ @COMMON_INCLUDE@ \ @COMMON_SSH_INCLUDE@ \ @LIBGUAC_INCLUDE@ libguac_client_rdp_la_LDFLAGS = \ -version-info 0:0:0 \ @CAIRO_LIBS@ \ @PTHREAD_LIBS@ \ @RDP_LIBS@ libguac_client_rdp_la_LIBADD = \ @COMMON_LTLIB@ \ @LIBGUAC_LTLIB@ # # RDPDR # guacdr_cflags = \ -Werror -Wall -Iinclude \ @COMMON_INCLUDE@ \ @COMMON_SSH_INCLUDE@ \ @LIBGUAC_INCLUDE@ guacdr_ldflags = \ -module -avoid-version -shared \ @PTHREAD_LIBS@ \ @RDP_LIBS@ guacdr_libadd = \ @COMMON_LTLIB@ \ @LIBGUAC_LTLIB@ # # RDPSND # guacsnd_cflags = \ -Werror -Wall -Iinclude \ @COMMON_INCLUDE@ \ @COMMON_SSH_INCLUDE@ \ @LIBGUAC_INCLUDE@ guacsnd_ldflags = \ -module -avoid-version -shared \ @PTHREAD_LIBS@ \ @RDP_LIBS@ guacsnd_libadd = \ @COMMON_LTLIB@ \ @LIBGUAC_LTLIB@ # # Static Virtual Channels # guacsvc_cflags = \ -Werror -Wall -Iinclude \ @COMMON_INCLUDE@ \ @COMMON_SSH_INCLUDE@ \ @LIBGUAC_INCLUDE@ guacsvc_ldflags = \ -module -avoid-version -shared \ @PTHREAD_LIBS@ \ @RDP_LIBS@ guacsvc_libadd = \ @COMMON_LTLIB@ \ @LIBGUAC_LTLIB@ # # Optional SFTP support # if ENABLE_COMMON_SSH libguac_client_rdp_la_SOURCES += sftp.c noinst_HEADERS += sftp.h libguac_client_rdp_la_LIBADD += @COMMON_SSH_LTLIB@ endif # # Autogenerate keymaps # CLEANFILES = _generated_keymaps.c BUILT_SOURCES = _generated_keymaps.c rdp_keymaps = \ keymaps/base.keymap \ keymaps/failsafe.keymap \ keymaps/de_de_qwertz.keymap \ keymaps/en_us_qwerty.keymap \ keymaps/fr_fr_azerty.keymap \ keymaps/it_it_qwerty.keymap \ keymaps/sv_se_qwerty.keymap _generated_keymaps.c: $(rdp_keymaps) keymaps/generate.pl $(rdp_keymaps) EXTRA_DIST = \ $(rdp_keymaps) \ keymaps/generate.pl if LEGACY_FREERDP_EXTENSIONS # FreeRDP 1.0-style extensions freerdp_LTLIBRARIES = \ guacdr.la \ guacsnd.la \ guacsvc.la guacdr_la_SOURCES = ${guacdr_sources} guacdr_la_CFLAGS = ${guacdr_cflags} guacdr_la_LDFLAGS = ${guacdr_ldflags} guacdr_la_LIBADD = ${guacdr_libadd} guacsnd_la_SOURCES = ${guacsnd_sources} guacsnd_la_CFLAGS = ${guacsnd_cflags} guacsnd_la_LDFLAGS = ${guacsnd_ldflags} guacsnd_la_LIBADD = ${guacsnd_libadd} guacsvc_la_SOURCES = ${guacsvc_sources} guacsvc_la_CFLAGS = ${guacsvc_cflags} guacsvc_la_LDFLAGS = ${guacsvc_ldflags} guacsvc_la_LIBADD = ${guacsvc_libadd} else # FreeRDP 1.1 (and hopefully onward) extensions freerdp_LTLIBRARIES = \ guacdr-client.la \ guacsnd-client.la \ guacsvc-client.la guacdr_client_la_SOURCES = ${guacdr_sources} guacdr_client_la_CFLAGS = ${guacdr_cflags} guacdr_client_la_LDFLAGS = ${guacdr_ldflags} guacdr_client_la_LIBADD = ${guacdr_libadd} guacsnd_client_la_SOURCES = ${guacsnd_sources} guacsnd_client_la_CFLAGS = ${guacsnd_cflags} guacsnd_client_la_LDFLAGS = ${guacsnd_ldflags} guacsnd_client_la_LIBADD = ${guacsnd_libadd} guacsvc_client_la_SOURCES = ${guacsvc_sources} guacsvc_client_la_CFLAGS = ${guacsvc_cflags} guacsvc_client_la_LDFLAGS = ${guacsvc_ldflags} guacsvc_client_la_LIBADD = ${guacsvc_libadd} endif freerdpdir = ${libdir}/freerdp guacamole-server-0.9.9/src/protocols/rdp/rdp_settings.c0000664000175100017510000003307412643542623020206 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "rdp_settings.h" #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-wtypes.h" #endif #include #include int guac_rdp_get_width(freerdp* rdp) { #ifdef LEGACY_RDPSETTINGS return rdp->settings->width; #else return rdp->settings->DesktopWidth; #endif } int guac_rdp_get_height(freerdp* rdp) { #ifdef LEGACY_RDPSETTINGS return rdp->settings->height; #else return rdp->settings->DesktopHeight; #endif } int guac_rdp_get_depth(freerdp* rdp) { #ifdef LEGACY_RDPSETTINGS return rdp->settings->color_depth; #else return rdp->settings->ColorDepth; #endif } /** * Given the settings structure of the Guacamole RDP client, calculates the * standard performance flag value to send to the RDP server. The value of * these flags is dictated by the RDP standard. * * @param guac_settings * The settings structure to read performance settings from. * * @returns * The standard RDP performance flag value representing the union of all * performance settings within the given settings structure. */ static int guac_rdp_get_performance_flags(guac_rdp_settings* guac_settings) { /* No performance flags initially */ int flags = PERF_FLAG_NONE; /* Desktop wallpaper */ if (!guac_settings->wallpaper_enabled) flags |= PERF_DISABLE_WALLPAPER; /* Theming of desktop/windows */ if (!guac_settings->theming_enabled) flags |= PERF_DISABLE_THEMING; /* Font smoothing (ClearType) */ if (guac_settings->font_smoothing_enabled) flags |= PERF_ENABLE_FONT_SMOOTHING; /* Full-window drag */ if (!guac_settings->full_window_drag_enabled) flags |= PERF_DISABLE_FULLWINDOWDRAG; /* Desktop composition (Aero) */ if (guac_settings->desktop_composition_enabled) flags |= PERF_ENABLE_DESKTOP_COMPOSITION; /* Menu animations */ if (!guac_settings->menu_animations_enabled) flags |= PERF_DISABLE_MENUANIMATIONS; return flags; } void guac_rdp_push_settings(guac_rdp_settings* guac_settings, freerdp* rdp) { BOOL bitmap_cache; rdpSettings* rdp_settings = rdp->settings; /* Authentication */ #ifdef LEGACY_RDPSETTINGS rdp_settings->domain = guac_settings->domain; rdp_settings->username = guac_settings->username; rdp_settings->password = guac_settings->password; #else rdp_settings->Domain = guac_settings->domain; rdp_settings->Username = guac_settings->username; rdp_settings->Password = guac_settings->password; #endif /* Connection */ #ifdef LEGACY_RDPSETTINGS rdp_settings->hostname = guac_settings->hostname; rdp_settings->port = guac_settings->port; #else rdp_settings->ServerHostname = guac_settings->hostname; rdp_settings->ServerPort = guac_settings->port; #endif /* Session */ #ifdef LEGACY_RDPSETTINGS rdp_settings->color_depth = guac_settings->color_depth; rdp_settings->width = guac_settings->width; rdp_settings->height = guac_settings->height; rdp_settings->shell = guac_settings->initial_program; rdp_settings->kbd_layout = guac_settings->server_layout->freerdp_keyboard_layout; #else rdp_settings->ColorDepth = guac_settings->color_depth; rdp_settings->DesktopWidth = guac_settings->width; rdp_settings->DesktopHeight = guac_settings->height; rdp_settings->AlternateShell = guac_settings->initial_program; rdp_settings->KeyboardLayout = guac_settings->server_layout->freerdp_keyboard_layout; #endif /* Performance flags */ #ifdef LEGACY_RDPSETTINGS rdp_settings->performance_flags = guac_rdp_get_performance_flags(guac_settings); #else rdp_settings->PerformanceFlags = guac_rdp_get_performance_flags(guac_settings); #endif /* Client name */ if (guac_settings->client_name != NULL) { #ifdef LEGACY_RDPSETTINGS strncpy(rdp_settings->client_hostname, guac_settings->client_name, RDP_CLIENT_HOSTNAME_SIZE - 1); #else strncpy(rdp_settings->ClientHostname, guac_settings->client_name, RDP_CLIENT_HOSTNAME_SIZE - 1); #endif } /* Console */ #ifdef LEGACY_RDPSETTINGS rdp_settings->console_session = guac_settings->console; rdp_settings->console_audio = guac_settings->console_audio; #else rdp_settings->ConsoleSession = guac_settings->console; rdp_settings->RemoteConsoleAudio = guac_settings->console_audio; #endif /* Audio */ #ifdef LEGACY_RDPSETTINGS #ifdef HAVE_RDPSETTINGS_AUDIOPLAYBACK rdp_settings->audio_playback = guac_settings->audio_enabled; #endif #else #ifdef HAVE_RDPSETTINGS_AUDIOPLAYBACK rdp_settings->AudioPlayback = guac_settings->audio_enabled; #endif #endif /* Device redirection */ #ifdef LEGACY_RDPSETTINGS #ifdef HAVE_RDPSETTINGS_DEVICEREDIRECTION rdp_settings->device_redirection = guac_settings->audio_enabled || guac_settings->drive_enabled || guac_settings->printing_enabled; #endif #else #ifdef HAVE_RDPSETTINGS_DEVICEREDIRECTION rdp_settings->DeviceRedirection = guac_settings->audio_enabled || guac_settings->drive_enabled || guac_settings->printing_enabled; #endif #endif /* Security */ switch (guac_settings->security_mode) { /* Standard RDP encryption */ case GUAC_SECURITY_RDP: #ifdef LEGACY_RDPSETTINGS rdp_settings->rdp_security = TRUE; rdp_settings->tls_security = FALSE; rdp_settings->nla_security = FALSE; rdp_settings->encryption_level = ENCRYPTION_LEVEL_CLIENT_COMPATIBLE; rdp_settings->encryption_method = ENCRYPTION_METHOD_40BIT | ENCRYPTION_METHOD_128BIT | ENCRYPTION_METHOD_FIPS; #else rdp_settings->RdpSecurity = TRUE; rdp_settings->TlsSecurity = FALSE; rdp_settings->NlaSecurity = FALSE; rdp_settings->EncryptionLevel = ENCRYPTION_LEVEL_CLIENT_COMPATIBLE; rdp_settings->EncryptionMethods = ENCRYPTION_METHOD_40BIT | ENCRYPTION_METHOD_128BIT | ENCRYPTION_METHOD_FIPS; #endif break; /* TLS encryption */ case GUAC_SECURITY_TLS: #ifdef LEGACY_RDPSETTINGS rdp_settings->rdp_security = FALSE; rdp_settings->tls_security = TRUE; rdp_settings->nla_security = FALSE; #else rdp_settings->RdpSecurity = FALSE; rdp_settings->TlsSecurity = TRUE; rdp_settings->NlaSecurity = FALSE; #endif break; /* Network level authentication */ case GUAC_SECURITY_NLA: #ifdef LEGACY_RDPSETTINGS rdp_settings->rdp_security = FALSE; rdp_settings->tls_security = FALSE; rdp_settings->nla_security = TRUE; #else rdp_settings->RdpSecurity = FALSE; rdp_settings->TlsSecurity = FALSE; rdp_settings->NlaSecurity = TRUE; #endif break; /* All security types */ case GUAC_SECURITY_ANY: #ifdef LEGACY_RDPSETTINGS rdp_settings->rdp_security = TRUE; rdp_settings->tls_security = TRUE; rdp_settings->nla_security = TRUE; #else rdp_settings->RdpSecurity = TRUE; rdp_settings->TlsSecurity = TRUE; rdp_settings->NlaSecurity = TRUE; #endif break; } /* Authentication */ #ifdef LEGACY_RDPSETTINGS rdp_settings->authentication = !guac_settings->disable_authentication; rdp_settings->ignore_certificate = guac_settings->ignore_certificate; rdp_settings->encryption = TRUE; #else rdp_settings->Authentication = !guac_settings->disable_authentication; rdp_settings->IgnoreCertificate = guac_settings->ignore_certificate; rdp_settings->DisableEncryption = FALSE; #endif /* RemoteApp */ if (guac_settings->remote_app != NULL) { #ifdef LEGACY_RDPSETTINGS rdp_settings->workarea = TRUE; rdp_settings->remote_app = TRUE; rdp_settings->rail_langbar_supported = TRUE; #else rdp_settings->Workarea = TRUE; rdp_settings->RemoteApplicationMode = TRUE; rdp_settings->RemoteAppLanguageBarSupported = TRUE; rdp_settings->RemoteApplicationProgram = guac_settings->remote_app; rdp_settings->ShellWorkingDirectory = guac_settings->remote_app_dir; rdp_settings->RemoteApplicationCmdLine = guac_settings->remote_app_args; #endif } #ifdef HAVE_RDPSETTINGS_SENDPRECONNECTIONPDU /* Preconnection ID */ if (guac_settings->preconnection_id != -1) { rdp_settings->NegotiateSecurityLayer = FALSE; rdp_settings->SendPreconnectionPdu = TRUE; rdp_settings->PreconnectionId = guac_settings->preconnection_id; } /* Preconnection BLOB */ if (guac_settings->preconnection_blob != NULL) { rdp_settings->NegotiateSecurityLayer = FALSE; rdp_settings->SendPreconnectionPdu = TRUE; rdp_settings->PreconnectionBlob = guac_settings->preconnection_blob; } #endif /* Order support */ #ifdef LEGACY_RDPSETTINGS bitmap_cache = rdp_settings->bitmap_cache; rdp_settings->os_major_type = OSMAJORTYPE_UNSPECIFIED; rdp_settings->os_minor_type = OSMINORTYPE_UNSPECIFIED; rdp_settings->desktop_resize = TRUE; rdp_settings->order_support[NEG_DSTBLT_INDEX] = TRUE; rdp_settings->order_support[NEG_PATBLT_INDEX] = FALSE; /* PATBLT not yet supported */ rdp_settings->order_support[NEG_SCRBLT_INDEX] = TRUE; rdp_settings->order_support[NEG_OPAQUE_RECT_INDEX] = TRUE; rdp_settings->order_support[NEG_DRAWNINEGRID_INDEX] = FALSE; rdp_settings->order_support[NEG_MULTIDSTBLT_INDEX] = FALSE; rdp_settings->order_support[NEG_MULTIPATBLT_INDEX] = FALSE; rdp_settings->order_support[NEG_MULTISCRBLT_INDEX] = FALSE; rdp_settings->order_support[NEG_MULTIOPAQUERECT_INDEX] = FALSE; rdp_settings->order_support[NEG_MULTI_DRAWNINEGRID_INDEX] = FALSE; rdp_settings->order_support[NEG_LINETO_INDEX] = FALSE; rdp_settings->order_support[NEG_POLYLINE_INDEX] = FALSE; rdp_settings->order_support[NEG_MEMBLT_INDEX] = bitmap_cache; rdp_settings->order_support[NEG_MEM3BLT_INDEX] = FALSE; rdp_settings->order_support[NEG_MEMBLT_V2_INDEX] = bitmap_cache; rdp_settings->order_support[NEG_MEM3BLT_V2_INDEX] = FALSE; rdp_settings->order_support[NEG_SAVEBITMAP_INDEX] = FALSE; rdp_settings->order_support[NEG_GLYPH_INDEX_INDEX] = TRUE; rdp_settings->order_support[NEG_FAST_INDEX_INDEX] = TRUE; rdp_settings->order_support[NEG_FAST_GLYPH_INDEX] = TRUE; rdp_settings->order_support[NEG_POLYGON_SC_INDEX] = FALSE; rdp_settings->order_support[NEG_POLYGON_CB_INDEX] = FALSE; rdp_settings->order_support[NEG_ELLIPSE_SC_INDEX] = FALSE; rdp_settings->order_support[NEG_ELLIPSE_CB_INDEX] = FALSE; #else bitmap_cache = rdp_settings->BitmapCacheEnabled; rdp_settings->OsMajorType = OSMAJORTYPE_UNSPECIFIED; rdp_settings->OsMinorType = OSMINORTYPE_UNSPECIFIED; rdp_settings->DesktopResize = TRUE; rdp_settings->OrderSupport[NEG_DSTBLT_INDEX] = TRUE; rdp_settings->OrderSupport[NEG_PATBLT_INDEX] = FALSE; /* PATBLT not yet supported */ rdp_settings->OrderSupport[NEG_SCRBLT_INDEX] = TRUE; rdp_settings->OrderSupport[NEG_OPAQUE_RECT_INDEX] = TRUE; rdp_settings->OrderSupport[NEG_DRAWNINEGRID_INDEX] = FALSE; rdp_settings->OrderSupport[NEG_MULTIDSTBLT_INDEX] = FALSE; rdp_settings->OrderSupport[NEG_MULTIPATBLT_INDEX] = FALSE; rdp_settings->OrderSupport[NEG_MULTISCRBLT_INDEX] = FALSE; rdp_settings->OrderSupport[NEG_MULTIOPAQUERECT_INDEX] = FALSE; rdp_settings->OrderSupport[NEG_MULTI_DRAWNINEGRID_INDEX] = FALSE; rdp_settings->OrderSupport[NEG_LINETO_INDEX] = FALSE; rdp_settings->OrderSupport[NEG_POLYLINE_INDEX] = FALSE; rdp_settings->OrderSupport[NEG_MEMBLT_INDEX] = bitmap_cache; rdp_settings->OrderSupport[NEG_MEM3BLT_INDEX] = FALSE; rdp_settings->OrderSupport[NEG_MEMBLT_V2_INDEX] = bitmap_cache; rdp_settings->OrderSupport[NEG_MEM3BLT_V2_INDEX] = FALSE; rdp_settings->OrderSupport[NEG_SAVEBITMAP_INDEX] = FALSE; rdp_settings->OrderSupport[NEG_GLYPH_INDEX_INDEX] = TRUE; rdp_settings->OrderSupport[NEG_FAST_INDEX_INDEX] = TRUE; rdp_settings->OrderSupport[NEG_FAST_GLYPH_INDEX] = TRUE; rdp_settings->OrderSupport[NEG_POLYGON_SC_INDEX] = FALSE; rdp_settings->OrderSupport[NEG_POLYGON_CB_INDEX] = FALSE; rdp_settings->OrderSupport[NEG_ELLIPSE_SC_INDEX] = FALSE; rdp_settings->OrderSupport[NEG_ELLIPSE_CB_INDEX] = FALSE; #endif } guacamole-server-0.9.9/src/protocols/rdp/rdp_bitmap.h0000664000175100017510000000472512643542623017630 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_RDP_RDP_BITMAP_H #define _GUAC_RDP_RDP_BITMAP_H #include "config.h" #include "guac_surface.h" #include #include #ifdef ENABLE_WINPR #include #else #include "compat/winpr-wtypes.h" #endif typedef struct guac_rdp_bitmap { /** * FreeRDP bitmap data - MUST GO FIRST. */ rdpBitmap bitmap; /** * The allocated buffer which backs this bitmap. */ guac_layer* buffer; /** * Surface containing cached image data. */ guac_common_surface* surface; /** * The number of times a bitmap has been used. */ int used; } guac_rdp_bitmap; void guac_rdp_cache_bitmap(rdpContext* context, rdpBitmap* bitmap); void guac_rdp_bitmap_new(rdpContext* context, rdpBitmap* bitmap); void guac_rdp_bitmap_paint(rdpContext* context, rdpBitmap* bitmap); void guac_rdp_bitmap_free(rdpContext* context, rdpBitmap* bitmap); void guac_rdp_bitmap_setsurface(rdpContext* context, rdpBitmap* bitmap, BOOL primary); #ifdef LEGACY_RDPBITMAP void guac_rdp_bitmap_decompress(rdpContext* context, rdpBitmap* bitmap, UINT8* data, int width, int height, int bpp, int length, BOOL compressed); #else void guac_rdp_bitmap_decompress(rdpContext* context, rdpBitmap* bitmap, UINT8* data, int width, int height, int bpp, int length, BOOL compressed, int codec_id); #endif #endif guacamole-server-0.9.9/src/protocols/rdp/unicode.h0000664000175100017510000000273112643542623017130 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" /** * Convert the given number of UTF-16 characters to UTF-8 characters. */ void guac_rdp_utf16_to_utf8(const unsigned char* utf16, int length, char* utf8, int size); /** * Convert the given number of UTF-8 characters to UTF-16 characters. */ void guac_rdp_utf8_to_utf16(const unsigned char* utf8, int length, char* utf16, int size); guacamole-server-0.9.9/src/protocols/rdp/rdp_keymap.h0000664000175100017510000001217612643542623017641 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_RDP_RDP_KEYMAP_H #define _GUAC_RDP_RDP_KEYMAP_H #include "config.h" #ifdef ENABLE_WINPR #include #else #include "compat/winpr-wtypes.h" #endif /** * Represents a keysym-to-scancode mapping for RDP, with extra information * about the state of prerequisite keysyms. */ typedef struct guac_rdp_keysym_desc { /** * The keysym being mapped. */ int keysym; /** * The scancode this keysym maps to. */ int scancode; /** * Required RDP-specific flags. */ int flags; /** * Null-terminated list of keysyms which must be down for this keysym * to be properly typed. */ const int* set_keysyms; /** * Null-terminated list of keysyms which must be up for this keysym * to be properly typed. */ const int* clear_keysyms; } guac_rdp_keysym_desc; /** * Hierarchical keysym mapping */ typedef struct guac_rdp_keymap guac_rdp_keymap; struct guac_rdp_keymap { /** * The parent mapping this map will inherit its initial mapping from. * Any other mapping information will add to or override the mapping * inherited from the parent. */ const guac_rdp_keymap* parent; /** * Descriptive name of this keymap */ const char* name; /** * Null-terminated array of scancode mappings. */ const guac_rdp_keysym_desc* mapping; /** * FreeRDP keyboard layout associated with this * keymap. If this keymap is selected, this layout * will be requested from the server. */ const UINT32 freerdp_keyboard_layout; }; /** * Static mapping from keysyms to scancodes. */ typedef guac_rdp_keysym_desc guac_rdp_static_keymap[0x200][0x100]; /** * Mapping from keysym to current state */ typedef int guac_rdp_keysym_state_map[0x200][0x100]; /** * Simple macro for determing whether a keysym can be stored (or retrieved) * from any keymap. */ #define GUAC_RDP_KEYSYM_STORABLE(keysym) ((keysym) <= 0xFFFF || ((keysym) & 0xFFFF0000) == 0x01000000) /** * Simple macro for referencing the mapped value of a scancode for a given * keysym. The idea here is that a keysym of the form 0xABCD will map to * mapping[0xAB][0xCD] while a keysym of the form 0x100ABCD will map to * mapping[0x1AB][0xCD]. */ #define GUAC_RDP_KEYSYM_LOOKUP(keysym_mapping, keysym) ( \ (keysym_mapping) \ [(((keysym) & 0xFF00) >> 8) | ((keysym) >> 16)] \ [(keysym) & 0xFF] \ ) /** * The name of the default keymap, which MUST exist. */ #define GUAC_DEFAULT_KEYMAP "en-us-qwerty" /** * Keysym string containing only the left "shift" key. */ extern const int GUAC_KEYSYMS_SHIFT[]; /** * Keysym string containing both "shift" keys. */ extern const int GUAC_KEYSYMS_ALL_SHIFT[]; /** * Keysym string containing only the right "alt" key (AltGr). */ extern const int GUAC_KEYSYMS_ALTGR[]; /** * Keysym string containing the right "alt" key (AltGr) and * left shift. */ extern const int GUAC_KEYSYMS_SHIFT_ALTGR[]; /** * Keysym string containing the right "alt" key (AltGr) and * both shift keys. */ extern const int GUAC_KEYSYMS_ALL_SHIFT_ALTGR[]; /** * Keysym string containing only the left "ctrl" key. */ extern const int GUAC_KEYSYMS_CTRL[]; /** * Keysym string containing both "ctrl" keys. */ extern const int GUAC_KEYSYMS_ALL_CTRL[]; /** * Keysym string containing only the left "alt" key. */ extern const int GUAC_KEYSYMS_ALT[]; /** * Keysym string containing both "alt" keys. */ extern const int GUAC_KEYSYMS_ALL_ALT[]; /** * Keysym string containing the left "alt" and left "ctrl" keys */ extern const int GUAC_KEYSYMS_CTRL_ALT[]; /** * Keysym string containing all modifier keys. */ extern const int GUAC_KEYSYMS_ALL_MODIFIERS[]; /** * NULL-terminated array of all keymaps. */ extern const guac_rdp_keymap* GUAC_KEYMAPS[]; /** * Return the keymap having the given name, if any, or NULL otherwise. */ const guac_rdp_keymap* guac_rdp_keymap_find(const char* name); #endif guacamole-server-0.9.9/src/protocols/rdp/rdp_stream.h0000664000175100017510000001643312643542623017646 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_RDP_STREAM_H #define _GUAC_RDP_STREAM_H #include "config.h" #include "guac_json.h" #include "rdp_svc.h" #include #include #include #include /** * The transfer status of a file being downloaded. */ typedef struct guac_rdp_download_status { /** * The file ID of the file being downloaded. */ int file_id; /** * The current position within the file. */ uint64_t offset; } guac_rdp_download_status; /** * Structure which represents the current state of an upload. */ typedef struct guac_rdp_upload_status { /** * The overall offset within the file that the next write should * occur at. */ int offset; /** * The ID of the file being written to. */ int file_id; } guac_rdp_upload_status; /** * The current state of a directory listing operation. */ typedef struct guac_rdp_ls_status { /** * The filesystem associated with the directory being listed. */ guac_rdp_fs* fs; /** * The file ID of the directory being listed. */ int file_id; /** * The absolute path of the directory being listed. */ char directory_name[GUAC_RDP_FS_MAX_PATH]; /** * The current state of the JSON directory object being written. */ guac_common_json_state json_state; } guac_rdp_ls_status; /** * All available stream types. */ typedef enum guac_rdp_stream_type { /** * An in-progress file upload. */ GUAC_RDP_UPLOAD_STREAM, /** * An in-progress file download. */ GUAC_RDP_DOWNLOAD_STREAM, /** * An in-progress stream of a directory listing. */ GUAC_RDP_LS_STREAM, /** * The inbound half of a static virtual channel. */ GUAC_RDP_INBOUND_SVC_STREAM, /** * An inbound stream of clipboard data. */ GUAC_RDP_INBOUND_CLIPBOARD_STREAM } guac_rdp_stream_type; /** * Variable-typed stream data. */ typedef struct guac_rdp_stream { /** * The type of this stream. */ guac_rdp_stream_type type; /** * The file upload status. Only valid for GUAC_RDP_UPLOAD_STREAM. */ guac_rdp_upload_status upload_status; /** * The file upload status. Only valid for GUAC_RDP_DOWNLOAD_STREAM. */ guac_rdp_download_status download_status; /** * The directory list status. Only valid for GUAC_RDP_LS_STREAM. */ guac_rdp_ls_status ls_status; /** * Associated SVC instance. Only valid for GUAC_RDP_INBOUND_SVC_STREAM. */ guac_rdp_svc* svc; } guac_rdp_stream; /** * Handler for inbound files related to file uploads. */ int guac_rdp_upload_file_handler(guac_client* client, guac_stream* stream, char* mimetype, char* filename); /** * Handler for inbound pipes related to static virtual channels. */ int guac_rdp_svc_pipe_handler(guac_client* client, guac_stream* stream, char* mimetype, char* name); /** * Handler for inbound clipboard data. */ int guac_rdp_clipboard_handler(guac_client* client, guac_stream* stream, char* mimetype); /** * Handler for stream data related to file uploads. */ int guac_rdp_upload_blob_handler(guac_client* client, guac_stream* stream, void* data, int length); /** * Handler for stream data related to static virtual channels. */ int guac_rdp_svc_blob_handler(guac_client* client, guac_stream* stream, void* data, int length); /** * Handler for stream data related to clipboard. */ int guac_rdp_clipboard_blob_handler(guac_client* client, guac_stream* stream, void* data, int length); /** * Handler for end-of-stream related to file uploads. */ int guac_rdp_upload_end_handler(guac_client* client, guac_stream* stream); /** * Handler for end-of-stream related to clipboard. */ int guac_rdp_clipboard_end_handler(guac_client* client, guac_stream* stream); /** * Handler for acknowledgements of receipt of data related to file downloads. */ int guac_rdp_download_ack_handler(guac_client* client, guac_stream* stream, char* message, guac_protocol_status status); /** * Handler for ack messages received due to receipt of a "body" or "blob" * instruction associated with a directory list operation. * * @param client * The client receiving the ack message. * * @param stream * The Guacamole protocol stream associated with the received ack message. * * @param message * An arbitrary human-readable message describing the nature of the * success or failure denoted by this ack message. * * @param status * The status code associated with this ack message, which may indicate * success or an error. * * @return * Zero on success, non-zero on error. */ int guac_rdp_ls_ack_handler(guac_client* client, guac_stream* stream, char* message, guac_protocol_status status); /** * Handler for get messages. In context of downloads and the filesystem exposed * via the Guacamole protocol, get messages request the body of a file within * the filesystem. * * @param client * The client receiving the get message. * * @param object * The Guacamole protocol object associated with the get request itself. * * @param name * The name of the input stream (file) being requested. * * @return * Zero on success, non-zero on error. */ int guac_rdp_download_get_handler(guac_client* client, guac_object* object, char* name); /** * Handler for put messages. In context of uploads and the filesystem exposed * via the Guacamole protocol, put messages request write access to a file * within the filesystem. * * @param client * The client receiving the put message. * * @param object * The Guacamole protocol object associated with the put request itself. * * @param stream * The Guacamole protocol stream along which the client will be sending * file data. * * @param mimetype * The mimetype of the data being send along the stream. * * @param name * The name of the input stream (file) being requested. * * @return * Zero on success, non-zero on error. */ int guac_rdp_upload_put_handler(guac_client* client, guac_object* object, guac_stream* stream, char* mimetype, char* name); #endif guacamole-server-0.9.9/src/protocols/rdp/rdp_disp.c0000664000175100017510000001227712643542623017307 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include #include #include #include guac_rdp_disp* guac_rdp_disp_alloc() { guac_rdp_disp* disp = malloc(sizeof(guac_rdp_disp)); /* Not yet connected */ disp->disp = NULL; /* No requests have been made */ disp->last_request = 0; disp->requested_width = 0; disp->requested_height = 0; return disp; } void guac_rdp_disp_free(guac_rdp_disp* disp) { free(disp); } void guac_rdp_disp_load_plugin(rdpContext* context) { #ifdef HAVE_RDPSETTINGS_SUPPORTDISPLAYCONTROL context->settings->SupportDisplayControl = TRUE; #endif /* Add "disp" channel */ ADDIN_ARGV* args = malloc(sizeof(ADDIN_ARGV)); args->argc = 1; args->argv = malloc(sizeof(char**) * 1); args->argv[0] = strdup("disp"); freerdp_dynamic_channel_collection_add(context->settings, args); } void guac_rdp_disp_connect(guac_rdp_disp* guac_disp, DispClientContext* disp) { guac_disp->disp = disp; } /** * Fits a given dimension within the allowed bounds for Display Update * messages, adjusting the other dimension such that aspect ratio is * maintained. * * @param a The dimension to fit within allowed bounds. * * @param b * The other dimension to adjust if and only if necessary to preserve * aspect ratio. */ static void guac_rdp_disp_fit(int* a, int* b) { int a_value = *a; int b_value = *b; /* Ensure first dimension is within allowed range */ if (a_value < GUAC_RDP_DISP_MIN_SIZE) { /* Adjust other dimension to maintain aspect ratio */ int adjusted_b = b_value * GUAC_RDP_DISP_MIN_SIZE / a_value; if (adjusted_b > GUAC_RDP_DISP_MAX_SIZE) adjusted_b = GUAC_RDP_DISP_MAX_SIZE; *a = GUAC_RDP_DISP_MIN_SIZE; *b = adjusted_b; } else if (a_value > GUAC_RDP_DISP_MAX_SIZE) { /* Adjust other dimension to maintain aspect ratio */ int adjusted_b = b_value * GUAC_RDP_DISP_MAX_SIZE / a_value; if (adjusted_b < GUAC_RDP_DISP_MIN_SIZE) adjusted_b = GUAC_RDP_DISP_MIN_SIZE; *a = GUAC_RDP_DISP_MAX_SIZE; *b = adjusted_b; } } void guac_rdp_disp_set_size(guac_rdp_disp* disp, rdpContext* context, int width, int height) { /* Fit width within bounds, adjusting height to maintain aspect ratio */ guac_rdp_disp_fit(&width, &height); /* Fit height within bounds, adjusting width to maintain aspect ratio */ guac_rdp_disp_fit(&height, &width); /* Width must be even */ if (width % 2 == 1) width -= 1; /* Store deferred size */ disp->requested_width = width; disp->requested_height = height; /* Send display update notification if possible */ guac_rdp_disp_update_size(disp, context); } void guac_rdp_disp_update_size(guac_rdp_disp* disp, rdpContext* context) { guac_client* client = ((rdp_freerdp_context*) context)->client; /* Send display update notification if display channel is connected */ if (disp->disp == NULL) return; int width = disp->requested_width; int height = disp->requested_height; DISPLAY_CONTROL_MONITOR_LAYOUT monitors[1] = {{ .Flags = 0x1, /* DISPLAYCONTROL_MONITOR_PRIMARY */ .Left = 0, .Top = 0, .Width = width, .Height = height, .PhysicalWidth = 0, .PhysicalHeight = 0, .Orientation = 0, .DesktopScaleFactor = 0, .DeviceScaleFactor = 0 }}; guac_timestamp now = guac_timestamp_current(); /* Limit display update frequency */ if (disp->last_request != 0 && now - disp->last_request <= GUAC_RDP_DISP_UPDATE_INTERVAL) return; /* Do NOT send requests unless the size will change */ if (width == guac_rdp_get_width(context->instance) && height == guac_rdp_get_height(context->instance)) return; guac_client_log(client, GUAC_LOG_DEBUG, "Resizing remote display to %ix%i", width, height); disp->last_request = now; disp->disp->SendMonitorLayout(disp->disp, 1, monitors); } guacamole-server-0.9.9/src/libguac/0000775000175100017510000000000012645400336014177 500000000000000guacamole-server-0.9.9/src/libguac/Makefile.in0000664000175100017510000013504012645400275016171 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Copyright (C) 2015 Glyptodon LLC # # 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. # VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ # Compile WebP support if available @ENABLE_WEBP_TRUE@am__append_1 = encode-webp.c @ENABLE_WEBP_TRUE@am__append_2 = encode-webp.h subdir = src/libguac DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(libguacinc_HEADERS) \ $(am__noinst_HEADERS_DIST) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libguacincdir)" LTLIBRARIES = $(lib_LTLIBRARIES) libguac_la_DEPENDENCIES = am__libguac_la_SOURCES_DIST = audio.c client.c client-handlers.c \ encode-jpeg.c encode-png.c error.c hash.c instruction.c \ palette.c plugin.c pool.c protocol.c raw_encoder.c socket.c \ socket-fd.c socket-nest.c timestamp.c unicode.c encode-webp.c @ENABLE_WEBP_TRUE@am__objects_1 = libguac_la-encode-webp.lo am_libguac_la_OBJECTS = libguac_la-audio.lo libguac_la-client.lo \ libguac_la-client-handlers.lo libguac_la-encode-jpeg.lo \ libguac_la-encode-png.lo libguac_la-error.lo \ libguac_la-hash.lo libguac_la-instruction.lo \ libguac_la-palette.lo libguac_la-plugin.lo libguac_la-pool.lo \ libguac_la-protocol.lo libguac_la-raw_encoder.lo \ libguac_la-socket.lo libguac_la-socket-fd.lo \ libguac_la-socket-nest.lo libguac_la-timestamp.lo \ libguac_la-unicode.lo $(am__objects_1) libguac_la_OBJECTS = $(am_libguac_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libguac_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libguac_la_CFLAGS) \ $(CFLAGS) $(libguac_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libguac_la_SOURCES) DIST_SOURCES = $(am__libguac_la_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__noinst_HEADERS_DIST = client-handlers.h encode-jpeg.h encode-png.h \ palette.h raw_encoder.h encode-webp.h HEADERS = $(libguacinc_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COMMON_INCLUDE = @COMMON_INCLUDE@ COMMON_LTLIB = @COMMON_LTLIB@ COMMON_SSH_INCLUDE = @COMMON_SSH_INCLUDE@ COMMON_SSH_LTLIB = @COMMON_SSH_LTLIB@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CUNIT_LIBS = @CUNIT_LIBS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBADD_DLOPEN = @LIBADD_DLOPEN@ LIBGUAC_INCLUDE = @LIBGUAC_INCLUDE@ LIBGUAC_LTLIB = @LIBGUAC_LTLIB@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MATH_LIBS = @MATH_LIBS@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@ PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@ PANGO_CFLAGS = @PANGO_CFLAGS@ PANGO_LIBS = @PANGO_LIBS@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_LIBS = @PNG_LIBS@ PTHREAD_LIBS = @PTHREAD_LIBS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ RDP_LIBS = @RDP_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSH_LIBS = @SSH_LIBS@ SSL_LIBS = @SSL_LIBS@ STRIP = @STRIP@ TELNET_LIBS = @TELNET_LIBS@ TERMINAL_INCLUDE = @TERMINAL_INCLUDE@ TERMINAL_LTLIB = @TERMINAL_LTLIB@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VNC_LIBS = @VNC_LIBS@ VORBIS_LIBS = @VORBIS_LIBS@ WEBP_LIBS = @WEBP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ init_dir = @init_dir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 lib_LTLIBRARIES = libguac.la libguacincdir = $(includedir)/guacamole libguacinc_HEADERS = \ guacamole/audio.h \ guacamole/audio-fntypes.h \ guacamole/audio-types.h \ guacamole/client-constants.h \ guacamole/client.h \ guacamole/client-fntypes.h \ guacamole/client-types.h \ guacamole/error.h \ guacamole/error-types.h \ guacamole/hash.h \ guacamole/instruction-constants.h \ guacamole/instruction.h \ guacamole/instruction-types.h \ guacamole/layer.h \ guacamole/layer-types.h \ guacamole/object.h \ guacamole/object-types.h \ guacamole/plugin-constants.h \ guacamole/plugin.h \ guacamole/plugin-types.h \ guacamole/pool.h \ guacamole/pool-types.h \ guacamole/protocol.h \ guacamole/protocol-types.h \ guacamole/socket-constants.h \ guacamole/socket.h \ guacamole/socket-fntypes.h \ guacamole/socket-types.h \ guacamole/stream.h \ guacamole/stream-types.h \ guacamole/timestamp.h \ guacamole/timestamp-types.h \ guacamole/unicode.h noinst_HEADERS = client-handlers.h encode-jpeg.h encode-png.h \ palette.h raw_encoder.h $(am__append_2) libguac_la_SOURCES = audio.c client.c client-handlers.c encode-jpeg.c \ encode-png.c error.c hash.c instruction.c palette.c plugin.c \ pool.c protocol.c raw_encoder.c socket.c socket-fd.c \ socket-nest.c timestamp.c unicode.c $(am__append_1) libguac_la_CFLAGS = \ -Werror -Wall -pedantic -Iguacamole libguac_la_LDFLAGS = \ -version-info 11:0:0 \ @CAIRO_LIBS@ \ @JPEG_LIBS@ \ @PNG_LIBS@ \ @PTHREAD_LIBS@ \ @UUID_LIBS@ \ @VORBIS_LIBS@ \ @WEBP_LIBS@ libguac_la_LIBADD = \ @LIBADD_DLOPEN@ all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/libguac/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/libguac/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libguac.la: $(libguac_la_OBJECTS) $(libguac_la_DEPENDENCIES) $(EXTRA_libguac_la_DEPENDENCIES) $(AM_V_CCLD)$(libguac_la_LINK) -rpath $(libdir) $(libguac_la_OBJECTS) $(libguac_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-audio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-client-handlers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-client.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-encode-jpeg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-encode-png.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-encode-webp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-error.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-hash.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-instruction.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-palette.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-plugin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-pool.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-protocol.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-raw_encoder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-socket-fd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-socket-nest.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-socket.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-timestamp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_la-unicode.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libguac_la-audio.lo: audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-audio.lo -MD -MP -MF $(DEPDIR)/libguac_la-audio.Tpo -c -o libguac_la-audio.lo `test -f 'audio.c' || echo '$(srcdir)/'`audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-audio.Tpo $(DEPDIR)/libguac_la-audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audio.c' object='libguac_la-audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-audio.lo `test -f 'audio.c' || echo '$(srcdir)/'`audio.c libguac_la-client.lo: client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-client.lo -MD -MP -MF $(DEPDIR)/libguac_la-client.Tpo -c -o libguac_la-client.lo `test -f 'client.c' || echo '$(srcdir)/'`client.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-client.Tpo $(DEPDIR)/libguac_la-client.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client.c' object='libguac_la-client.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-client.lo `test -f 'client.c' || echo '$(srcdir)/'`client.c libguac_la-client-handlers.lo: client-handlers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-client-handlers.lo -MD -MP -MF $(DEPDIR)/libguac_la-client-handlers.Tpo -c -o libguac_la-client-handlers.lo `test -f 'client-handlers.c' || echo '$(srcdir)/'`client-handlers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-client-handlers.Tpo $(DEPDIR)/libguac_la-client-handlers.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client-handlers.c' object='libguac_la-client-handlers.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-client-handlers.lo `test -f 'client-handlers.c' || echo '$(srcdir)/'`client-handlers.c libguac_la-encode-jpeg.lo: encode-jpeg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-encode-jpeg.lo -MD -MP -MF $(DEPDIR)/libguac_la-encode-jpeg.Tpo -c -o libguac_la-encode-jpeg.lo `test -f 'encode-jpeg.c' || echo '$(srcdir)/'`encode-jpeg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-encode-jpeg.Tpo $(DEPDIR)/libguac_la-encode-jpeg.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='encode-jpeg.c' object='libguac_la-encode-jpeg.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-encode-jpeg.lo `test -f 'encode-jpeg.c' || echo '$(srcdir)/'`encode-jpeg.c libguac_la-encode-png.lo: encode-png.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-encode-png.lo -MD -MP -MF $(DEPDIR)/libguac_la-encode-png.Tpo -c -o libguac_la-encode-png.lo `test -f 'encode-png.c' || echo '$(srcdir)/'`encode-png.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-encode-png.Tpo $(DEPDIR)/libguac_la-encode-png.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='encode-png.c' object='libguac_la-encode-png.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-encode-png.lo `test -f 'encode-png.c' || echo '$(srcdir)/'`encode-png.c libguac_la-error.lo: error.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-error.lo -MD -MP -MF $(DEPDIR)/libguac_la-error.Tpo -c -o libguac_la-error.lo `test -f 'error.c' || echo '$(srcdir)/'`error.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-error.Tpo $(DEPDIR)/libguac_la-error.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='error.c' object='libguac_la-error.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-error.lo `test -f 'error.c' || echo '$(srcdir)/'`error.c libguac_la-hash.lo: hash.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-hash.lo -MD -MP -MF $(DEPDIR)/libguac_la-hash.Tpo -c -o libguac_la-hash.lo `test -f 'hash.c' || echo '$(srcdir)/'`hash.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-hash.Tpo $(DEPDIR)/libguac_la-hash.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hash.c' object='libguac_la-hash.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-hash.lo `test -f 'hash.c' || echo '$(srcdir)/'`hash.c libguac_la-instruction.lo: instruction.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-instruction.lo -MD -MP -MF $(DEPDIR)/libguac_la-instruction.Tpo -c -o libguac_la-instruction.lo `test -f 'instruction.c' || echo '$(srcdir)/'`instruction.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-instruction.Tpo $(DEPDIR)/libguac_la-instruction.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='instruction.c' object='libguac_la-instruction.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-instruction.lo `test -f 'instruction.c' || echo '$(srcdir)/'`instruction.c libguac_la-palette.lo: palette.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-palette.lo -MD -MP -MF $(DEPDIR)/libguac_la-palette.Tpo -c -o libguac_la-palette.lo `test -f 'palette.c' || echo '$(srcdir)/'`palette.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-palette.Tpo $(DEPDIR)/libguac_la-palette.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='palette.c' object='libguac_la-palette.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-palette.lo `test -f 'palette.c' || echo '$(srcdir)/'`palette.c libguac_la-plugin.lo: plugin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-plugin.lo -MD -MP -MF $(DEPDIR)/libguac_la-plugin.Tpo -c -o libguac_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-plugin.Tpo $(DEPDIR)/libguac_la-plugin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugin.c' object='libguac_la-plugin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c libguac_la-pool.lo: pool.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-pool.lo -MD -MP -MF $(DEPDIR)/libguac_la-pool.Tpo -c -o libguac_la-pool.lo `test -f 'pool.c' || echo '$(srcdir)/'`pool.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-pool.Tpo $(DEPDIR)/libguac_la-pool.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pool.c' object='libguac_la-pool.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-pool.lo `test -f 'pool.c' || echo '$(srcdir)/'`pool.c libguac_la-protocol.lo: protocol.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-protocol.lo -MD -MP -MF $(DEPDIR)/libguac_la-protocol.Tpo -c -o libguac_la-protocol.lo `test -f 'protocol.c' || echo '$(srcdir)/'`protocol.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-protocol.Tpo $(DEPDIR)/libguac_la-protocol.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='protocol.c' object='libguac_la-protocol.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-protocol.lo `test -f 'protocol.c' || echo '$(srcdir)/'`protocol.c libguac_la-raw_encoder.lo: raw_encoder.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-raw_encoder.lo -MD -MP -MF $(DEPDIR)/libguac_la-raw_encoder.Tpo -c -o libguac_la-raw_encoder.lo `test -f 'raw_encoder.c' || echo '$(srcdir)/'`raw_encoder.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-raw_encoder.Tpo $(DEPDIR)/libguac_la-raw_encoder.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='raw_encoder.c' object='libguac_la-raw_encoder.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-raw_encoder.lo `test -f 'raw_encoder.c' || echo '$(srcdir)/'`raw_encoder.c libguac_la-socket.lo: socket.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-socket.lo -MD -MP -MF $(DEPDIR)/libguac_la-socket.Tpo -c -o libguac_la-socket.lo `test -f 'socket.c' || echo '$(srcdir)/'`socket.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-socket.Tpo $(DEPDIR)/libguac_la-socket.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='socket.c' object='libguac_la-socket.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-socket.lo `test -f 'socket.c' || echo '$(srcdir)/'`socket.c libguac_la-socket-fd.lo: socket-fd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-socket-fd.lo -MD -MP -MF $(DEPDIR)/libguac_la-socket-fd.Tpo -c -o libguac_la-socket-fd.lo `test -f 'socket-fd.c' || echo '$(srcdir)/'`socket-fd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-socket-fd.Tpo $(DEPDIR)/libguac_la-socket-fd.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='socket-fd.c' object='libguac_la-socket-fd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-socket-fd.lo `test -f 'socket-fd.c' || echo '$(srcdir)/'`socket-fd.c libguac_la-socket-nest.lo: socket-nest.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-socket-nest.lo -MD -MP -MF $(DEPDIR)/libguac_la-socket-nest.Tpo -c -o libguac_la-socket-nest.lo `test -f 'socket-nest.c' || echo '$(srcdir)/'`socket-nest.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-socket-nest.Tpo $(DEPDIR)/libguac_la-socket-nest.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='socket-nest.c' object='libguac_la-socket-nest.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-socket-nest.lo `test -f 'socket-nest.c' || echo '$(srcdir)/'`socket-nest.c libguac_la-timestamp.lo: timestamp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-timestamp.lo -MD -MP -MF $(DEPDIR)/libguac_la-timestamp.Tpo -c -o libguac_la-timestamp.lo `test -f 'timestamp.c' || echo '$(srcdir)/'`timestamp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-timestamp.Tpo $(DEPDIR)/libguac_la-timestamp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='timestamp.c' object='libguac_la-timestamp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-timestamp.lo `test -f 'timestamp.c' || echo '$(srcdir)/'`timestamp.c libguac_la-unicode.lo: unicode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-unicode.lo -MD -MP -MF $(DEPDIR)/libguac_la-unicode.Tpo -c -o libguac_la-unicode.lo `test -f 'unicode.c' || echo '$(srcdir)/'`unicode.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-unicode.Tpo $(DEPDIR)/libguac_la-unicode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unicode.c' object='libguac_la-unicode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-unicode.lo `test -f 'unicode.c' || echo '$(srcdir)/'`unicode.c libguac_la-encode-webp.lo: encode-webp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -MT libguac_la-encode-webp.lo -MD -MP -MF $(DEPDIR)/libguac_la-encode-webp.Tpo -c -o libguac_la-encode-webp.lo `test -f 'encode-webp.c' || echo '$(srcdir)/'`encode-webp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_la-encode-webp.Tpo $(DEPDIR)/libguac_la-encode-webp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='encode-webp.c' object='libguac_la-encode-webp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_la_CFLAGS) $(CFLAGS) -c -o libguac_la-encode-webp.lo `test -f 'encode-webp.c' || echo '$(srcdir)/'`encode-webp.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-libguacincHEADERS: $(libguacinc_HEADERS) @$(NORMAL_INSTALL) @list='$(libguacinc_HEADERS)'; test -n "$(libguacincdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(libguacincdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libguacincdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libguacincdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libguacincdir)" || exit $$?; \ done uninstall-libguacincHEADERS: @$(NORMAL_UNINSTALL) @list='$(libguacinc_HEADERS)'; test -n "$(libguacincdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(libguacincdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libguacincdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-libguacincHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES uninstall-libguacincHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libLTLIBRARIES \ install-libguacincHEADERS install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES \ uninstall-libguacincHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: guacamole-server-0.9.9/src/libguac/instruction.c0000664000175100017510000002322212643542623016651 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "error.h" #include "instruction.h" #include "socket.h" #include "unicode.h" #include #include #include guac_instruction* guac_instruction_alloc() { /* Allocate space for instruction */ guac_instruction* instruction = malloc(sizeof(guac_instruction)); if (instruction == NULL) { guac_error = GUAC_STATUS_NO_MEMORY; guac_error_message = "Insufficient memory to allocate instruction"; return NULL; } guac_instruction_reset(instruction); return instruction; } void guac_instruction_reset(guac_instruction* instruction) { instruction->opcode = NULL; instruction->argc = 0; instruction->state = GUAC_INSTRUCTION_PARSE_LENGTH; instruction->__elementc = 0; instruction->__element_length = 0; } int guac_instruction_append(guac_instruction* instr, void* buffer, int length) { char* char_buffer = (char*) buffer; int bytes_parsed = 0; /* Do not exceed maximum number of elements */ if (instr->__elementc == GUAC_INSTRUCTION_MAX_ELEMENTS && instr->state != GUAC_INSTRUCTION_PARSE_COMPLETE) { instr->state = GUAC_INSTRUCTION_PARSE_ERROR; return 0; } /* Parse element length */ if (instr->state == GUAC_INSTRUCTION_PARSE_LENGTH) { int parsed_length = instr->__element_length; while (bytes_parsed < length) { /* Pull next character */ char c = *(char_buffer++); bytes_parsed++; /* If digit, add to length */ if (c >= '0' && c <= '9') parsed_length = parsed_length*10 + c - '0'; /* If period, switch to parsing content */ else if (c == '.') { instr->__elementv[instr->__elementc++] = char_buffer; instr->state = GUAC_INSTRUCTION_PARSE_CONTENT; break; } /* If not digit, parse error */ else { instr->state = GUAC_INSTRUCTION_PARSE_ERROR; return 0; } } /* If too long, parse error */ if (parsed_length > GUAC_INSTRUCTION_MAX_LENGTH) { instr->state = GUAC_INSTRUCTION_PARSE_ERROR; return 0; } /* Save length */ instr->__element_length = parsed_length; } /* end parse length */ /* Parse element content */ if (instr->state == GUAC_INSTRUCTION_PARSE_CONTENT) { while (bytes_parsed < length && instr->__element_length >= 0) { /* Get length of current character */ char c = *char_buffer; int char_length = guac_utf8_charsize((unsigned char) c); /* If full character not present in buffer, stop now */ if (char_length + bytes_parsed > length) break; /* Record character as parsed */ bytes_parsed += char_length; /* If end of element, handle terminator */ if (instr->__element_length == 0) { *char_buffer = '\0'; /* If semicolon, store end-of-instruction */ if (c == ';') { instr->state = GUAC_INSTRUCTION_PARSE_COMPLETE; instr->opcode = instr->__elementv[0]; instr->argv = &(instr->__elementv[1]); instr->argc = instr->__elementc - 1; break; } /* If comma, move on to next element */ else if (c == ',') { instr->state = GUAC_INSTRUCTION_PARSE_LENGTH; break; } /* Otherwise, parse error */ else { instr->state = GUAC_INSTRUCTION_PARSE_ERROR; return 0; } } /* end if end of element */ /* Advance to next character */ instr->__element_length--; char_buffer += char_length; } } /* end parse content */ return bytes_parsed; } /* Returns new instruction if one exists, or NULL if no more instructions. */ guac_instruction* guac_instruction_read(guac_socket* socket, int usec_timeout) { char* unparsed_end = socket->__instructionbuf_unparsed_end; char* unparsed_start = socket->__instructionbuf_unparsed_start; char* instr_start = socket->__instructionbuf_unparsed_start; char* buffer_end = socket->__instructionbuf + sizeof(socket->__instructionbuf); guac_instruction* instruction = guac_instruction_alloc(); while (instruction->state != GUAC_INSTRUCTION_PARSE_COMPLETE && instruction->state != GUAC_INSTRUCTION_PARSE_ERROR) { /* Add any available data to buffer */ int parsed = guac_instruction_append(instruction, unparsed_start, unparsed_end - unparsed_start); /* Read more data if not enough data to parse */ if (parsed == 0) { int retval; /* If no space left to read, fail */ if (unparsed_end == buffer_end) { /* Shift backward if possible */ if (instr_start != socket->__instructionbuf) { int i; /* Shift buffer */ int offset = instr_start - socket->__instructionbuf; memmove(socket->__instructionbuf, instr_start, unparsed_end - instr_start); /* Update tracking pointers */ unparsed_end -= offset; unparsed_start -= offset; instr_start = socket->__instructionbuf; /* Update parsed elements, if any */ for (i=0; i__elementc; i++) instruction->__elementv[i] -= offset; } /* Otherwise, no memory to read */ else { guac_error = GUAC_STATUS_NO_MEMORY; guac_error_message = "Instruction too long"; return NULL; } } /* No instruction yet? Get more data ... */ retval = guac_socket_select(socket, usec_timeout); if (retval <= 0) return NULL; /* Attempt to fill buffer */ retval = guac_socket_read(socket, unparsed_end, buffer_end - unparsed_end); /* Set guac_error if read unsuccessful */ if (retval < 0) { guac_error = GUAC_STATUS_SEE_ERRNO; guac_error_message = "Error filling instruction buffer"; return NULL; } /* EOF */ if (retval == 0) { guac_error = GUAC_STATUS_CLOSED; guac_error_message = "End of stream reached while " "reading instruction"; return NULL; } /* Update internal buffer */ unparsed_end += retval; } /* If data was parsed, advance buffer */ else unparsed_start += parsed; } /* end while parsing data */ /* Fail on error */ if (instruction->state == GUAC_INSTRUCTION_PARSE_ERROR) { guac_error = GUAC_STATUS_PROTOCOL_ERROR; guac_error_message = "Instruction parse error"; return NULL; } socket->__instructionbuf_unparsed_start = unparsed_start; socket->__instructionbuf_unparsed_end = unparsed_end; return instruction; } guac_instruction* guac_instruction_expect(guac_socket* socket, int usec_timeout, const char* opcode) { guac_instruction* instruction; /* Wait for data until timeout */ if (guac_instruction_waiting(socket, usec_timeout) <= 0) return NULL; /* Read available instruction */ instruction = guac_instruction_read(socket, usec_timeout); if (instruction == NULL) return NULL; /* Validate instruction */ if (strcmp(instruction->opcode, opcode) != 0) { guac_error = GUAC_STATUS_PROTOCOL_ERROR; guac_error_message = "Instruction read did not have expected opcode"; guac_instruction_free(instruction); return NULL; } /* Return instruction if valid */ return instruction; } void guac_instruction_free(guac_instruction* instruction) { free(instruction); } int guac_instruction_waiting(guac_socket* socket, int usec_timeout) { if (socket->__instructionbuf_unparsed_end > socket->__instructionbuf_unparsed_start) return 1; return guac_socket_select(socket, usec_timeout); } guacamole-server-0.9.9/src/libguac/protocol.c0000664000175100017510000010606112626724073016136 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "error.h" #include "layer.h" #include "object.h" #include "palette.h" #include "protocol.h" #include "socket.h" #include "stream.h" #include "unicode.h" #include #include #include #include #include #include #include #include #include /* Output formatting functions */ ssize_t __guac_socket_write_length_string(guac_socket* socket, const char* str) { return guac_socket_write_int(socket, guac_utf8_strlen(str)) || guac_socket_write_string(socket, ".") || guac_socket_write_string(socket, str); } ssize_t __guac_socket_write_length_int(guac_socket* socket, int64_t i) { char buffer[128]; snprintf(buffer, sizeof(buffer), "%"PRIi64, i); return __guac_socket_write_length_string(socket, buffer); } ssize_t __guac_socket_write_length_double(guac_socket* socket, double d) { char buffer[128]; snprintf(buffer, sizeof(buffer), "%.16g", d); return __guac_socket_write_length_string(socket, buffer); } /* Protocol functions */ int guac_protocol_send_ack(guac_socket* socket, guac_stream* stream, const char* error, guac_protocol_status status) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "3.ack,") || __guac_socket_write_length_int(socket, stream->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_string(socket, error) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, status) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } static int __guac_protocol_send_args(guac_socket* socket, const char** args) { int i; if (guac_socket_write_string(socket, "4.args")) return -1; for (i=0; args[i] != NULL; i++) { if (guac_socket_write_string(socket, ",")) return -1; if (__guac_socket_write_length_string(socket, args[i])) return -1; } return guac_socket_write_string(socket, ";"); } int guac_protocol_send_args(guac_socket* socket, const char** args) { int ret_val; guac_socket_instruction_begin(socket); ret_val = __guac_protocol_send_args(socket, args); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_arc(guac_socket* socket, const guac_layer* layer, int x, int y, int radius, double startAngle, double endAngle, int negative) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "3.arc,") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, x) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, y) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, radius) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_double(socket, startAngle) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_double(socket, endAngle) || guac_socket_write_string(socket, ",") || guac_socket_write_string(socket, negative ? "1.1" : "1.0") || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_audio(guac_socket* socket, const guac_stream* stream, const char* mimetype) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "5.audio,") || __guac_socket_write_length_int(socket, stream->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_string(socket, mimetype) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_blob(guac_socket* socket, const guac_stream* stream, const void* data, int count) { int base64_length = (count + 2) / 3 * 4; int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "4.blob,") || __guac_socket_write_length_int(socket, stream->index) || guac_socket_write_string(socket, ",") || guac_socket_write_int(socket, base64_length) || guac_socket_write_string(socket, ".") || guac_socket_write_base64(socket, data, count) || guac_socket_flush_base64(socket) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_body(guac_socket* socket, const guac_object* object, const guac_stream* stream, const char* mimetype, const char* name) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "4.body,") || __guac_socket_write_length_int(socket, object->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, stream->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_string(socket, mimetype) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_string(socket, name) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_cfill(guac_socket* socket, guac_composite_mode mode, const guac_layer* layer, int r, int g, int b, int a) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "5.cfill,") || __guac_socket_write_length_int(socket, mode) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, r) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, g) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, b) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, a) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_close(guac_socket* socket, const guac_layer* layer) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "5.close,") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } static int __guac_protocol_send_connect(guac_socket* socket, const char** args) { int i; if (guac_socket_write_string(socket, "7.connect")) return -1; for (i=0; args[i] != NULL; i++) { if (guac_socket_write_string(socket, ",")) return -1; if (__guac_socket_write_length_string(socket, args[i])) return -1; } return guac_socket_write_string(socket, ";"); } int guac_protocol_send_connect(guac_socket* socket, const char** args) { int ret_val; guac_socket_instruction_begin(socket); ret_val = __guac_protocol_send_connect(socket, args); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_clip(guac_socket* socket, const guac_layer* layer) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "4.clip,") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_clipboard(guac_socket* socket, const guac_stream* stream, const char* mimetype) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "9.clipboard,") || __guac_socket_write_length_int(socket, stream->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_string(socket, mimetype) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_copy(guac_socket* socket, const guac_layer* srcl, int srcx, int srcy, int w, int h, guac_composite_mode mode, const guac_layer* dstl, int dstx, int dsty) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "4.copy,") || __guac_socket_write_length_int(socket, srcl->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, srcx) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, srcy) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, w) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, h) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, mode) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, dstl->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, dstx) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, dsty) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_cstroke(guac_socket* socket, guac_composite_mode mode, const guac_layer* layer, guac_line_cap_style cap, guac_line_join_style join, int thickness, int r, int g, int b, int a) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "7.cstroke,") || __guac_socket_write_length_int(socket, mode) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, cap) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, join) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, thickness) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, r) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, g) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, b) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, a) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_cursor(guac_socket* socket, int x, int y, const guac_layer* srcl, int srcx, int srcy, int w, int h) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "6.cursor,") || __guac_socket_write_length_int(socket, x) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, y) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, srcl->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, srcx) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, srcy) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, w) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, h) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_curve(guac_socket* socket, const guac_layer* layer, int cp1x, int cp1y, int cp2x, int cp2y, int x, int y) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "5.curve,") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, cp1x) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, cp1y) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, cp2x) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, cp2y) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, x) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, y) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_disconnect(guac_socket* socket) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "10.disconnect;"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_dispose(guac_socket* socket, const guac_layer* layer) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "7.dispose,") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_distort(guac_socket* socket, const guac_layer* layer, double a, double b, double c, double d, double e, double f) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "7.distort,") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_double(socket, a) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_double(socket, b) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_double(socket, c) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_double(socket, d) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_double(socket, e) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_double(socket, f) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_end(guac_socket* socket, const guac_stream* stream) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "3.end,") || __guac_socket_write_length_int(socket, stream->index) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_error(guac_socket* socket, const char* error, guac_protocol_status status) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "5.error,") || __guac_socket_write_length_string(socket, error) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, status) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int vguac_protocol_send_log(guac_socket* socket, const char* format, va_list args) { int ret_val; /* Copy log message into buffer */ char message[4096]; vsnprintf(message, sizeof(message), format, args); /* Log to instruction */ guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "3.log,") || __guac_socket_write_length_string(socket, message) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_log(guac_socket* socket, const char* format, ...) { int ret_val; va_list args; va_start(args, format); ret_val = vguac_protocol_send_log(socket, format, args); va_end(args); return ret_val; } int guac_protocol_send_file(guac_socket* socket, const guac_stream* stream, const char* mimetype, const char* name) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "4.file,") || __guac_socket_write_length_int(socket, stream->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_string(socket, mimetype) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_string(socket, name) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_filesystem(guac_socket* socket, const guac_object* object, const char* name) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "10.filesystem,") || __guac_socket_write_length_int(socket, object->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_string(socket, name) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_identity(guac_socket* socket, const guac_layer* layer) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "8.identity,") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_lfill(guac_socket* socket, guac_composite_mode mode, const guac_layer* layer, const guac_layer* srcl) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "5.lfill,") || __guac_socket_write_length_int(socket, mode) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, srcl->index) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_line(guac_socket* socket, const guac_layer* layer, int x, int y) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "4.line,") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, x) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, y) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_lstroke(guac_socket* socket, guac_composite_mode mode, const guac_layer* layer, guac_line_cap_style cap, guac_line_join_style join, int thickness, const guac_layer* srcl) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "7.lstroke,") || __guac_socket_write_length_int(socket, mode) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, cap) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, join) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, thickness) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, srcl->index) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_move(guac_socket* socket, const guac_layer* layer, const guac_layer* parent, int x, int y, int z) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "4.move,") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, parent->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, x) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, y) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, z) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_name(guac_socket* socket, const char* name) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "4.name,") || __guac_socket_write_length_string(socket, name) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_nest(guac_socket* socket, int index, const char* data) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "4.nest,") || __guac_socket_write_length_int(socket, index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_string(socket, data) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_nop(guac_socket* socket) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "3.nop;"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_pipe(guac_socket* socket, const guac_stream* stream, const char* mimetype, const char* name) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "4.pipe,") || __guac_socket_write_length_int(socket, stream->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_string(socket, mimetype) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_string(socket, name) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_img(guac_socket* socket, const guac_stream* stream, guac_composite_mode mode, const guac_layer* layer, const char* mimetype, int x, int y) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "3.img,") || __guac_socket_write_length_int(socket, stream->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, mode) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_string(socket, mimetype) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, x) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, y) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_pop(guac_socket* socket, const guac_layer* layer) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "3.pop,") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_push(guac_socket* socket, const guac_layer* layer) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "4.push,") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_ready(guac_socket* socket, const char* id) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "5.ready,") || __guac_socket_write_length_string(socket, id) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_rect(guac_socket* socket, const guac_layer* layer, int x, int y, int width, int height) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "4.rect,") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, x) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, y) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, width) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, height) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_reset(guac_socket* socket, const guac_layer* layer) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "5.reset,") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_set(guac_socket* socket, const guac_layer* layer, const char* name, const char* value) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "3.set,") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_string(socket, name) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_string(socket, value) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_select(guac_socket* socket, const char* protocol) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "6.select,") || __guac_socket_write_length_string(socket, protocol) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_shade(guac_socket* socket, const guac_layer* layer, int a) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "5.shade,") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, a) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_size(guac_socket* socket, const guac_layer* layer, int w, int h) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "4.size,") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, w) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, h) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_start(guac_socket* socket, const guac_layer* layer, int x, int y) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "5.start,") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, x) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, y) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_sync(guac_socket* socket, guac_timestamp timestamp) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "4.sync,") || __guac_socket_write_length_int(socket, timestamp) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_transfer(guac_socket* socket, const guac_layer* srcl, int srcx, int srcy, int w, int h, guac_transfer_function fn, const guac_layer* dstl, int dstx, int dsty) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "8.transfer,") || __guac_socket_write_length_int(socket, srcl->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, srcx) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, srcy) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, w) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, h) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, fn) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, dstl->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, dstx) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, dsty) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_transform(guac_socket* socket, const guac_layer* layer, double a, double b, double c, double d, double e, double f) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "9.transform,") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_double(socket, a) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_double(socket, b) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_double(socket, c) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_double(socket, d) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_double(socket, e) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_double(socket, f) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_undefine(guac_socket* socket, const guac_object* object) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "8.undefine,") || __guac_socket_write_length_int(socket, object->index) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } int guac_protocol_send_video(guac_socket* socket, const guac_stream* stream, const guac_layer* layer, const char* mimetype) { int ret_val; guac_socket_instruction_begin(socket); ret_val = guac_socket_write_string(socket, "5.video,") || __guac_socket_write_length_int(socket, stream->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_int(socket, layer->index) || guac_socket_write_string(socket, ",") || __guac_socket_write_length_string(socket, mimetype) || guac_socket_write_string(socket, ";"); guac_socket_instruction_end(socket); return ret_val; } /** * Returns the value of a single base64 character. */ static int __guac_base64_value(char c) { if (c >= 'A' && c <= 'Z') return c - 'A'; if (c >= 'a' && c <= 'z') return c - 'a' + 26; if (c >= '0' && c <= '9') return c - '0' + 52; if (c == '+') return 62; if (c == '/') return 63; return 0; } int guac_protocol_decode_base64(char* base64) { char* input = base64; char* output = base64; int length = 0; int bits_read = 0; int value = 0; char current; /* For all characters in string */ while ((current = *(input++)) != 0) { /* If we've reached padding, then we're done */ if (current == '=') break; /* Otherwise, shift on the latest 6 bits */ value = (value << 6) | __guac_base64_value(current); bits_read += 6; /* If we have at least one byte, write out the latest whole byte */ if (bits_read >= 8) { *(output++) = (value >> (bits_read % 8)) & 0xFF; bits_read -= 8; length++; } } /* Return number of bytes written */ return length; } guacamole-server-0.9.9/src/libguac/pool.c0000664000175100017510000000600712643542623015243 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "pool.h" #include guac_pool* guac_pool_alloc(int size) { guac_pool* pool = malloc(sizeof(guac_pool)); /* If unable to allocate, just return NULL. */ if (pool == NULL) return NULL; /* Initialize empty pool */ pool->min_size = size; pool->active = 0; pool->__next_value = 0; pool->__head = NULL; pool->__tail = NULL; return pool; } void guac_pool_free(guac_pool* pool) { /* Free all ints in pool */ guac_pool_int* current = pool->__head; while (current != NULL) { guac_pool_int* old = current; current = current->__next; free(old); } /* Free pool */ free(pool); } int guac_pool_next_int(guac_pool* pool) { int value; pool->active++; /* If more integers are needed, return a new one. */ if (pool->__head == NULL || pool->__next_value < pool->min_size) return pool->__next_value++; /* Otherwise, remove first integer. */ value = pool->__head->value; /* If only one element exists, reset pool to empty. */ if (pool->__tail == pool->__head) { free(pool->__head); pool->__head = NULL; pool->__tail = NULL; } /* Otherwise, advance head. */ else { guac_pool_int* old_head = pool->__head; pool->__head = old_head->__next; free(old_head); } /* Return retrieved value. */ return value; } void guac_pool_free_int(guac_pool* pool, int value) { /* Allocate and initialize new returned value */ guac_pool_int* pool_int = malloc(sizeof(guac_pool_int)); pool_int->value = value; pool_int->__next = NULL; pool->active--; /* If pool empty, store as sole entry. */ if (pool->__tail == NULL) pool->__head = pool->__tail = pool_int; /* Otherwise, append to end of pool. */ else { pool->__tail->__next = pool_int; pool->__tail = pool_int; } } guacamole-server-0.9.9/src/libguac/audio.c0000664000175100017510000001045212626724073015374 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "raw_encoder.h" #include #include #include #include #include #include guac_audio_stream* guac_audio_stream_alloc(guac_client* client, guac_audio_encoder* encoder, int rate, int channels, int bps) { guac_audio_stream* audio; /* Choose an encoding if not specified */ if (encoder == NULL) { int i; /* For each supported mimetype, check for an associated encoder */ for (i=0; client->info.audio_mimetypes[i] != NULL; i++) { const char* mimetype = client->info.audio_mimetypes[i]; /* If 16-bit raw audio is supported, done. */ if (bps == 16 && strcmp(mimetype, raw16_encoder->mimetype) == 0) { encoder = raw16_encoder; break; } /* If 8-bit raw audio is supported, done. */ if (bps == 8 && strcmp(mimetype, raw8_encoder->mimetype) == 0) { encoder = raw8_encoder; break; } } /* end for each mimetype */ /* If still no encoder could be found, fail */ if (encoder == NULL) return NULL; } /* Allocate stream */ audio = (guac_audio_stream*) calloc(1, sizeof(guac_audio_stream)); audio->client = client; /* Assign encoder */ audio->encoder = encoder; audio->stream = guac_client_alloc_stream(client); /* Load PCM properties */ audio->rate = rate; audio->channels = channels; audio->bps = bps; /* Call handler, if defined */ if (audio->encoder->begin_handler) audio->encoder->begin_handler(audio); return audio; } void guac_audio_stream_reset(guac_audio_stream* audio, guac_audio_encoder* encoder, int rate, int channels, int bps) { /* Do nothing if nothing is changing */ if ((encoder == NULL || encoder == audio->encoder) && rate == audio->rate && channels == audio->channels && bps == audio->bps) { return; } /* Free old encoder data */ if (audio->encoder->end_handler) audio->encoder->end_handler(audio); /* Assign new encoder, if changed */ if (encoder != NULL) audio->encoder = encoder; /* Set PCM properties */ audio->rate = rate; audio->channels = channels; audio->bps = bps; /* Init encoder with new data */ if (audio->encoder->begin_handler) audio->encoder->begin_handler(audio); } void guac_audio_stream_free(guac_audio_stream* audio) { /* Flush stream encoding */ guac_audio_stream_flush(audio); /* Clean up encoder */ if (audio->encoder->end_handler) audio->encoder->end_handler(audio); /* Free associated data */ free(audio); } void guac_audio_stream_write_pcm(guac_audio_stream* audio, const unsigned char* data, int length) { /* Write data */ if (audio->encoder->write_handler) audio->encoder->write_handler(audio, data, length); } void guac_audio_stream_flush(guac_audio_stream* audio) { /* Flush any buffered data */ if (audio->encoder->flush_handler) audio->encoder->flush_handler(audio); } guacamole-server-0.9.9/src/libguac/client-handlers.h0000664000175100017510000001355712643542623017363 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_CLIENT_HANDLERS__H #define _GUAC_CLIENT_HANDLERS__H /** * Provides initial handler functions and a lookup structure for automatically * handling client instructions. This is used only internally within libguac, * and is not installed along with the library. * * @file client-handlers.h */ #include "config.h" #include "client.h" #include "instruction.h" /** * Internal handler for Guacamole instructions. */ typedef int __guac_instruction_handler(guac_client* client, guac_instruction* copied); /** * Structure mapping an instruction opcode to an instruction handler. */ typedef struct __guac_instruction_handler_mapping { /** * The instruction opcode which maps to a specific handler. */ char* opcode; /** * The handler which maps to a specific opcode. */ __guac_instruction_handler* handler; } __guac_instruction_handler_mapping; /** * Internal initial handler for the sync instruction. When a sync instruction * is received, this handler will be called. Sync instructions are automatically * handled, thus there is no client handler for sync instruction. */ int __guac_handle_sync(guac_client* client, guac_instruction* instruction); /** * Internal initial handler for the mouse instruction. When a mouse instruction * is received, this handler will be called. The client's mouse handler will * be invoked if defined. */ int __guac_handle_mouse(guac_client* client, guac_instruction* instruction); /** * Internal initial handler for the key instruction. When a key instruction * is received, this handler will be called. The client's key handler will * be invoked if defined. */ int __guac_handle_key(guac_client* client, guac_instruction* instruction); /** * Internal initial handler for the clipboard instruction. When a clipboard instruction * is received, this handler will be called. The client's clipboard handler will * be invoked if defined. */ int __guac_handle_clipboard(guac_client* client, guac_instruction* instruction); /** * Internal initial handler for the file instruction. When a file instruction * is received, this handler will be called. The client's file handler will * be invoked if defined. */ int __guac_handle_file(guac_client* client, guac_instruction* instruction); /** * Internal initial handler for the pipe instruction. When a pipe instruction * is received, this handler will be called. The client's pipe handler will * be invoked if defined. */ int __guac_handle_pipe(guac_client* client, guac_instruction* instruction); /** * Internal initial handler for the ack instruction. When a ack instruction * is received, this handler will be called. The client's ack handler will * be invoked if defined. */ int __guac_handle_ack(guac_client* client, guac_instruction* instruction); /** * Internal initial handler for the blob instruction. When a blob instruction * is received, this handler will be called. The client's blob handler will * be invoked if defined. */ int __guac_handle_blob(guac_client* client, guac_instruction* instruction); /** * Internal initial handler for the end instruction. When a end instruction * is received, this handler will be called. The client's end handler will * be invoked if defined. */ int __guac_handle_end(guac_client* client, guac_instruction* instruction); /** * Internal initial handler for the get instruction. When a get instruction * is received, this handler will be called. The client's get handler will * be invoked if defined. */ int __guac_handle_get(guac_client* client, guac_instruction* instruction); /** * Internal initial handler for the put instruction. When a put instruction * is received, this handler will be called. The client's put handler will * be invoked if defined. */ int __guac_handle_put(guac_client* client, guac_instruction* instruction); /** * Internal initial handler for the size instruction. When a size instruction * is received, this handler will be called. The client's size handler will * be invoked if defined. */ int __guac_handle_size(guac_client* client, guac_instruction* instruction); /** * Internal initial handler for the disconnect instruction. When a disconnect instruction * is received, this handler will be called. Disconnect instructions are automatically * handled, thus there is no client handler for disconnect instruction. */ int __guac_handle_disconnect(guac_client* client, guac_instruction* instruction); /** * Instruction handler mapping table. This is a NULL-terminated array of * __guac_instruction_handler_mapping structures, each mapping an opcode * to a __guac_instruction_handler. The end of the array must be marked * with a __guac_instruction_handler_mapping with the opcode set to * NULL (the NULL terminator). */ extern __guac_instruction_handler_mapping __guac_instruction_handler_map[]; #endif guacamole-server-0.9.9/src/libguac/encode-webp.c0000664000175100017510000001615212633431612016456 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "config.h" #include "encode-webp.h" #include "error.h" #include "palette.h" #include "protocol.h" #include "stream.h" #include #include #include #include #include #include #include /** * Structure which describes the current state of the WebP image writer. */ typedef struct guac_webp_stream_writer { /** * The socket over which all WebP blobs will be written. */ guac_socket* socket; /** * The Guacamole stream to associate with each WebP blob. */ guac_stream* stream; /** * Buffer of pending WebP data. */ char buffer[6048]; /** * The number of bytes currently stored in the buffer. */ int buffer_size; } guac_webp_stream_writer; /** * Writes the contents of the WebP stream writer as a blob to its associated * socket. * * @param writer * The writer structure to flush. */ static void guac_webp_flush_data(guac_webp_stream_writer* writer) { /* Send blob */ guac_protocol_send_blob(writer->socket, writer->stream, writer->buffer, writer->buffer_size); /* Clear buffer */ writer->buffer_size = 0; } /** * Configures the given stream writer object to use the given Guacamole stream * object for WebP output. * * @param writer * The Guacamole WebP stream writer structure to configure. * * @param socket * The Guacamole socket to use when sending blob instructions. * * @param stream * The stream over which WebP-encoded blobs of image data should be sent. */ static void guac_webp_stream_writer_init(guac_webp_stream_writer* writer, guac_socket* socket, guac_stream* stream) { writer->buffer_size = 0; /* Store Guacamole-specific objects */ writer->socket = socket; writer->stream = stream; } /** * WebP output function which appends the given WebP data to the internal * buffer of the Guacamole stream writer structure, automatically flushing the * writer as necessary. * * @param data * The segment of data to write. * * @param data_size * The size of segment of data to write. * * @param picture * The WebP picture associated with this write operation. Provides access to * picture->custom_ptr which contains the Guacamole stream writer structure. * * @return * Non-zero if writing was successful, zero on failure. */ static int guac_webp_stream_write(const uint8_t* data, size_t data_size, const WebPPicture* picture) { guac_webp_stream_writer* const writer = (guac_webp_stream_writer*) picture->custom_ptr; assert(writer != NULL); const unsigned char* current = data; int length = data_size; /* Append all data given */ while (length > 0) { /* Calculate space remaining */ int remaining = sizeof(writer->buffer) - writer->buffer_size; /* If no space remains, flush buffer to make room */ if (remaining == 0) { guac_webp_flush_data(writer); remaining = sizeof(writer->buffer); } /* Calculate size of next block of data to append */ int block_size = remaining; if (block_size > length) block_size = length; /* Append block */ memcpy(writer->buffer + writer->buffer_size, current, block_size); /* Next block */ current += block_size; writer->buffer_size += block_size; length -= block_size; } return 1; } int guac_webp_write(guac_socket* socket, guac_stream* stream, cairo_surface_t* surface, int quality, int lossless) { guac_webp_stream_writer writer; WebPPicture picture; uint32_t* argb_output; int x, y; int width = cairo_image_surface_get_width(surface); int height = cairo_image_surface_get_height(surface); int stride = cairo_image_surface_get_stride(surface); cairo_format_t format = cairo_image_surface_get_format(surface); unsigned char* data = cairo_image_surface_get_data(surface); if (format != CAIRO_FORMAT_RGB24 && format != CAIRO_FORMAT_ARGB32) { guac_error = GUAC_STATUS_INTERNAL_ERROR; guac_error_message = "Invalid Cairo image format. Unable to create WebP."; return -1; } /* Flush pending operations to surface */ cairo_surface_flush(surface); /* Configure WebP compression bits */ WebPConfig config; if (!WebPConfigPreset(&config, WEBP_PRESET_DEFAULT, quality)) return -1; /* Add additional tuning */ config.lossless = lossless; config.quality = quality; config.thread_level = 1; /* Multi threaded */ config.method = 2; /* Compression method (0=fast/larger, 6=slow/smaller) */ /* Validate configuration */ WebPValidateConfig(&config); /* Set up WebP picture */ WebPPictureInit(&picture); picture.use_argb = 1; picture.width = width; picture.height = height; /* Allocate and init writer */ WebPPictureAlloc(&picture); picture.writer = guac_webp_stream_write; picture.custom_ptr = &writer; guac_webp_stream_writer_init(&writer, socket, stream); /* Copy image data into WebP picture */ argb_output = picture.argb; for (y = 0; y < height; y++) { /* Get pixels at start of each row */ uint32_t* src = (uint32_t*) data; uint32_t* dst = argb_output; /* For each pixel in row */ for (x = 0; x < width; x++) { /* Pull pixel data, removing alpha channel if necessary */ uint32_t src_pixel = *src; if (format != CAIRO_FORMAT_ARGB32) src_pixel |= 0xFF000000; /* Store converted pixel data */ *dst = src_pixel; /* Next pixel */ src++; dst++; } /* Next row */ data += stride; argb_output += picture.argb_stride; } /* Encode image */ WebPEncode(&config, &picture); /* Free picture */ WebPPictureFree(&picture); /* Ensure all data is written */ guac_webp_flush_data(&writer); return 0; } guacamole-server-0.9.9/src/libguac/hash.c0000664000175100017510000000767312536405625015230 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include #include #include /* * Arbitrary hash function whhich maps ALL 32-bit numbers onto 24-bit numbers * evenly, while guaranteeing that all 24-bit numbers are mapped onto * themselves. */ unsigned int _guac_hash_32to24(unsigned int value) { /* Grab highest-order byte */ unsigned int upper = value & 0xFF000000; /* XOR upper with lower three bytes, truncate to 24-bit */ return (value & 0xFFFFFF) ^ (upper >> 8) ^ (upper >> 16) ^ (upper >> 24); } /** * Rotates a given 32-bit integer by N bits. * * NOTE: We probably should check for available bitops.h macros first. */ unsigned int _guac_rotate(unsigned int value, int amount) { /* amount = amount % 32 */ amount &= 0x1F; /* Return rotated amount */ return (value >> amount) | (value << (32 - amount)); } unsigned int guac_hash_surface(cairo_surface_t* surface) { /* Init to zero */ unsigned int hash_value = 0; int x, y; /* Get image data and metrics */ unsigned char* data = cairo_image_surface_get_data(surface); int width = cairo_image_surface_get_width(surface); int height = cairo_image_surface_get_height(surface); int stride = cairo_image_surface_get_stride(surface); for (y=0; y #include #include #include #include guac_palette* guac_palette_alloc(cairo_surface_t* surface) { int x, y; int width = cairo_image_surface_get_width(surface); int height = cairo_image_surface_get_height(surface); int stride = cairo_image_surface_get_stride(surface); unsigned char* data = cairo_image_surface_get_data(surface); /* Allocate palette */ guac_palette* palette = (guac_palette*) malloc(sizeof(guac_palette)); memset(palette, 0, sizeof(guac_palette)); for (y=0; y> 12) ^ (color & 0xFFF); guac_palette_entry* entry; /* Search for open palette entry */ for (;;) { entry = &(palette->entries[hash]); /* If we've found a free space, use it */ if (entry->index == 0) { png_color* c; /* Stop if already at capacity */ if (palette->size == 256) { guac_palette_free(palette); return NULL; } /* Store in palette */ c = &(palette->colors[palette->size]); c->blue = (color ) & 0xFF; c->green = (color >> 8 ) & 0xFF; c->red = (color >> 16) & 0xFF; /* Add color to map */ entry->index = ++palette->size; entry->color = color; break; } /* Otherwise, if already stored here, done */ if (entry->color == color) break; /* Otherwise, collision. Move on to another bucket */ hash = (hash+1) & 0xFFF; } } /* Advance to next data row */ data += stride; } return palette; } int guac_palette_find(guac_palette* palette, int color) { /* Calculate hash code */ int hash = ((color & 0xFFF000) >> 12) ^ (color & 0xFFF); guac_palette_entry* entry; /* Search for palette entry */ for (;;) { entry = &(palette->entries[hash]); /* If we've found a free space, color not stored. */ if (entry->index == 0) return -1; /* Otherwise, if color indeed stored here, done */ if (entry->color == color) return entry->index - 1; /* Otherwise, collision. Move on to another bucket */ hash = (hash+1) & 0xFFF; } } void guac_palette_free(guac_palette* palette) { free(palette); } guacamole-server-0.9.9/src/libguac/timestamp.c0000664000175100017510000000337112602261312016262 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "timestamp.h" #include #if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_NANOSLEEP) #include #endif guac_timestamp guac_timestamp_current() { #ifdef HAVE_CLOCK_GETTIME struct timespec current; /* Get current time */ clock_gettime(CLOCK_REALTIME, ¤t); /* Calculate milliseconds */ return (guac_timestamp) current.tv_sec * 1000 + current.tv_nsec / 1000000; #else struct timeval current; /* Get current time */ gettimeofday(¤t, NULL); /* Calculate milliseconds */ return (guac_timestamp) current.tv_sec * 1000 + current.tv_usec / 1000; #endif } guacamole-server-0.9.9/src/libguac/encode-jpeg.c0000664000175100017510000002057312626133327016454 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "config.h" #include "encode-jpeg.h" #include "error.h" #include "palette.h" #include "protocol.h" #include "stream.h" #include #include #include #include #include #include /** * Extended version of the standard libjpeg jpeg_destination_mgr struct, which * provides access to the pointers to the output buffer and size. The values * of this structure will be initialized by jpeg_guac_dest(). */ typedef struct guac_jpeg_destination_mgr { /** * Original jpeg_destination_mgr structure. This MUST be the first member * for guac_jpeg_destination_mgr to be usable as a jpeg_destination_mgr. */ struct jpeg_destination_mgr parent; /** * The socket over which all JPEG blobs will be written. */ guac_socket* socket; /** * The Guacamole stream to associate with each JPEG blob. */ guac_stream* stream; /** * The output buffer. */ unsigned char buffer[6048]; } guac_jpeg_destination_mgr; /** * Initializes the destination structure of the given compression structure. * * @param cinfo * The compression structure whose destination structure should be * initialized. */ static void guac_jpeg_init_destination(j_compress_ptr cinfo) { guac_jpeg_destination_mgr* dest = (guac_jpeg_destination_mgr*) cinfo->dest; /* Init parent destination state */ dest->parent.next_output_byte = dest->buffer; dest->parent.free_in_buffer = sizeof(dest->buffer); } /** * Flushes the current output buffer associated with the given compression * structure, as the current output buffer is full. * * @param cinfo * The compression structure whose output buffer should be flushed. * * @return * TRUE, always, indicating that space is now available. FALSE is returned * only by applications that may need additional time to empty the buffer. */ static boolean guac_jpeg_empty_output_buffer(j_compress_ptr cinfo) { guac_jpeg_destination_mgr* dest = (guac_jpeg_destination_mgr*) cinfo->dest; /* Write blob */ guac_protocol_send_blob(dest->socket, dest->stream, dest->buffer, sizeof(dest->buffer)); /* Update destination offset */ dest->parent.next_output_byte = dest->buffer; dest->parent.free_in_buffer = sizeof(dest->buffer); return TRUE; } /** * Flushes the final blob of JPEG data, if any, as JPEG compression is now * complete. * * @param cinfo * The compression structure associated with the now-complete JPEG * compression operation. */ static void guac_jpeg_term_destination(j_compress_ptr cinfo) { guac_jpeg_destination_mgr* dest = (guac_jpeg_destination_mgr*) cinfo->dest; /* Write final blob, if any */ if (dest->parent.free_in_buffer != sizeof(dest->buffer)) guac_protocol_send_blob(dest->socket, dest->stream, dest->buffer, sizeof(dest->buffer) - dest->parent.free_in_buffer); } /** * Configures the given compression structure to use the given Guacamole stream * for JPEG output. * * @param cinfo * The libjpeg compression structure to configure. * * @param socket * The Guacamole socket to use when sending blob instructions. * * @param stream * The stream over which JPEG-encoded blobs of image data should be sent. */ static void jpeg_guac_dest(j_compress_ptr cinfo, guac_socket* socket, guac_stream* stream) { guac_jpeg_destination_mgr* dest; /* Allocate dest from pool if not already allocated */ if (cinfo->dest == NULL) cinfo->dest = (struct jpeg_destination_mgr*) (cinfo->mem->alloc_small)((j_common_ptr) cinfo, JPOOL_PERMANENT, sizeof(guac_jpeg_destination_mgr)); /* Pull possibly-new destination struct from cinfo */ dest = (guac_jpeg_destination_mgr*) cinfo->dest; /* Associate destination handlers */ dest->parent.init_destination = guac_jpeg_init_destination; dest->parent.empty_output_buffer = guac_jpeg_empty_output_buffer; dest->parent.term_destination = guac_jpeg_term_destination; /* Store Guacamole-specific objects */ dest->socket = socket; dest->stream = stream; } int guac_jpeg_write(guac_socket* socket, guac_stream* stream, cairo_surface_t* surface, int quality) { /* Get image surface properties and data */ cairo_format_t format = cairo_image_surface_get_format(surface); if (format != CAIRO_FORMAT_RGB24) { guac_error = GUAC_STATUS_INTERNAL_ERROR; guac_error_message = "Invalid Cairo image format. Unable to create JPEG."; return -1; } int width = cairo_image_surface_get_width(surface); int height = cairo_image_surface_get_height(surface); int stride = cairo_image_surface_get_stride(surface); unsigned char* data = cairo_image_surface_get_data(surface); /* Flush pending operations to surface */ cairo_surface_flush(surface); /* Prepare JPEG bits */ struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); /* Write JPEG directly to given stream */ jpeg_guac_dest(&cinfo, socket, stream); cinfo.image_width = width; /* image width and height, in pixels */ cinfo.image_height = height; cinfo.arith_code = TRUE; #ifdef JCS_EXTENSIONS /* The Turbo JPEG extentions allows us to use the Cairo surface * (BGRx) as input without converting it */ cinfo.input_components = 4; cinfo.in_color_space = JCS_EXT_BGRX; #else /* Standard JPEG supports RGB as input so we will have to convert * the contents of the Cairo surface from (BGRx) to RGB */ cinfo.input_components = 3; cinfo.in_color_space = JCS_RGB; /* Create a buffer for the write scan line which is where we will * put the converted pixels (BGRx -> RGB) */ int write_stride = cinfo.image_width * cinfo.input_components; unsigned char *scanline_data = malloc(write_stride); memset(scanline_data, 0, write_stride); #endif /* Initialize the JPEG compressor */ jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, quality, TRUE /* limit to baseline-JPEG values */); jpeg_start_compress(&cinfo, TRUE); JSAMPROW row_pointer[1]; /* pointer to a single row */ /* Write scanlines to be used in JPEG compression */ while (cinfo.next_scanline < cinfo.image_height) { int row_offset = stride * cinfo.next_scanline; #ifdef JCS_EXTENSIONS /* In Turbo JPEG we can use the raw BGRx scanline */ row_pointer[0] = &data[row_offset]; #else /* For standard JPEG libraries we have to convert the * scanline from 24 bit (4 byte) BGRx to 24 bit (3 byte) RGB */ unsigned char *inptr = data + row_offset; unsigned char *outptr = scanline_data; for (int x = 0; x < width; ++x) { outptr[2] = *inptr++; /* B */ outptr[1] = *inptr++; /* G */ outptr[0] = *inptr++; /* R */ inptr++; /* skip the upper byte (x/A) */ outptr += 3; } row_pointer[0] = scanline_data; #endif jpeg_write_scanlines(&cinfo, row_pointer, 1); } #ifndef JCS_EXTENSIONS free(scanline_data); #endif /* Finalize compression */ jpeg_finish_compress(&cinfo); /* Clean up */ jpeg_destroy_compress(&cinfo); return 0; } guacamole-server-0.9.9/src/libguac/plugin.c0000664000175100017510000000717212643542623015574 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "error.h" #include "plugin.h" #include #include #include #include guac_client_plugin* guac_client_plugin_open(const char* protocol) { guac_client_plugin* plugin; /* Reference to dlopen()'d plugin */ void* client_plugin_handle; /* Client args description */ const char** client_args; /* Pluggable client */ char protocol_lib[GUAC_PROTOCOL_LIBRARY_LIMIT] = GUAC_PROTOCOL_LIBRARY_PREFIX; union { guac_client_init_handler* client_init; void* obj; } alias; /* Add protocol and .so suffix to protocol_lib */ strncat(protocol_lib, protocol, GUAC_PROTOCOL_NAME_LIMIT-1); strcat(protocol_lib, GUAC_PROTOCOL_LIBRARY_SUFFIX); /* Load client plugin */ client_plugin_handle = dlopen(protocol_lib, RTLD_LAZY); if (!client_plugin_handle) { guac_error = GUAC_STATUS_NOT_FOUND; guac_error_message = dlerror(); return NULL; } dlerror(); /* Clear errors */ /* Get init function */ alias.obj = dlsym(client_plugin_handle, "guac_client_init"); /* Fail if cannot find guac_client_init */ if (dlerror() != NULL) { guac_error = GUAC_STATUS_INTERNAL_ERROR; guac_error_message = dlerror(); return NULL; } /* Get usage strig */ client_args = (const char**) dlsym(client_plugin_handle, "GUAC_CLIENT_ARGS"); /* Fail if cannot find GUAC_CLIENT_ARGS */ if (dlerror() != NULL) { guac_error = GUAC_STATUS_INTERNAL_ERROR; guac_error_message = dlerror(); return NULL; } /* Allocate plugin */ plugin = malloc(sizeof(guac_client_plugin)); if (plugin == NULL) { guac_error = GUAC_STATUS_NO_MEMORY; guac_error_message = "Could not allocate memory for client plugin"; return NULL; } /* Init and return plugin */ plugin->__client_plugin_handle = client_plugin_handle; plugin->init_handler = alias.client_init; plugin->args = client_args; return plugin; } int guac_client_plugin_close(guac_client_plugin* plugin) { /* Unload client plugin */ if (dlclose(plugin->__client_plugin_handle)) { guac_error = GUAC_STATUS_INTERNAL_ERROR; guac_error_message = dlerror(); return -1; } /* Free plugin handle */ free(plugin); return 0; } int guac_client_plugin_init_client(guac_client_plugin* plugin, guac_client* client, int argc, char** argv) { return plugin->init_handler(client, argc, argv); } guacamole-server-0.9.9/src/libguac/socket.c0000664000175100017510000002703212643542623015563 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "error.h" #include "protocol.h" #include "socket.h" #include "timestamp.h" #include #include #include #include #include #include #include #include char __guac_socket_BASE64_CHARACTERS[64] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; static void* __guac_socket_keep_alive_thread(void* data) { /* Calculate sleep interval */ struct timespec interval; interval.tv_sec = GUAC_SOCKET_KEEP_ALIVE_INTERVAL / 1000; interval.tv_nsec = (GUAC_SOCKET_KEEP_ALIVE_INTERVAL % 1000) * 1000000L; /* Socket keep-alive loop */ guac_socket* socket = (guac_socket*) data; while (socket->state == GUAC_SOCKET_OPEN) { /* Send NOP keep-alive if it's been a while since the last output */ guac_timestamp timestamp = guac_timestamp_current(); if (timestamp - socket->last_write_timestamp > GUAC_SOCKET_KEEP_ALIVE_INTERVAL) { /* Send NOP */ if (guac_protocol_send_nop(socket) || guac_socket_flush(socket)) break; } /* Sleep until next keep-alive check */ nanosleep(&interval, NULL); } return NULL; } static ssize_t __guac_socket_write(guac_socket* socket, const void* buf, size_t count) { /* Update timestamp of last write */ socket->last_write_timestamp = guac_timestamp_current(); /* If handler defined, call it. */ if (socket->write_handler) return socket->write_handler(socket, buf, count); /* Otherwise, pretend everything was written. */ return count; } ssize_t guac_socket_write(guac_socket* socket, const void* buf, size_t count) { const char* buffer = buf; /* Write until completely written */ while (count > 0) { /* Attempt to write, return on error */ int written = __guac_socket_write(socket, buffer, count); if (written == -1) return 1; /* Advance buffer as data written */ buffer += written; count -= written; } return 0; } ssize_t guac_socket_read(guac_socket* socket, void* buf, size_t count) { /* If handler defined, call it. */ if (socket->read_handler) return socket->read_handler(socket, buf, count); /* Otherwise, pretend nothing was read. */ return 0; } int guac_socket_select(guac_socket* socket, int usec_timeout) { /* Call select handler if defined */ if (socket->select_handler) return socket->select_handler(socket, usec_timeout); /* Otherwise, assume ready. */ return 1; } guac_socket* guac_socket_alloc() { pthread_mutexattr_t lock_attributes; guac_socket* socket = malloc(sizeof(guac_socket)); /* If no memory available, return with error */ if (socket == NULL) { guac_error = GUAC_STATUS_NO_MEMORY; guac_error_message = "Could not allocate memory for socket"; return NULL; } socket->__ready = 0; socket->__written = 0; socket->data = NULL; socket->state = GUAC_SOCKET_OPEN; socket->last_write_timestamp = guac_timestamp_current(); /* Init members */ socket->__instructionbuf_unparsed_start = socket->__instructionbuf; socket->__instructionbuf_unparsed_end = socket->__instructionbuf; /* Default to unsafe threading */ socket->__threadsafe_instructions = 0; /* No keep alive ping by default */ socket->__keep_alive_enabled = 0; pthread_mutexattr_init(&lock_attributes); pthread_mutexattr_setpshared(&lock_attributes, PTHREAD_PROCESS_SHARED); pthread_mutex_init(&(socket->__instruction_write_lock), &lock_attributes); pthread_mutex_init(&(socket->__buffer_lock), &lock_attributes); /* No handlers yet */ socket->read_handler = NULL; socket->write_handler = NULL; socket->select_handler = NULL; socket->free_handler = NULL; return socket; } void guac_socket_require_threadsafe(guac_socket* socket) { socket->__threadsafe_instructions = 1; } void guac_socket_require_keep_alive(guac_socket* socket) { /* Keep-alive thread requires a threadsafe socket */ guac_socket_require_threadsafe(socket); /* Start keep-alive thread */ socket->__keep_alive_enabled = 1; pthread_create(&(socket->__keep_alive_thread), NULL, __guac_socket_keep_alive_thread, (void*) socket); } void guac_socket_instruction_begin(guac_socket* socket) { /* Lock writes if threadsafety enabled */ if (socket->__threadsafe_instructions) pthread_mutex_lock(&(socket->__instruction_write_lock)); } void guac_socket_instruction_end(guac_socket* socket) { /* Unlock writes if threadsafety enabled */ if (socket->__threadsafe_instructions) pthread_mutex_unlock(&(socket->__instruction_write_lock)); } void guac_socket_update_buffer_begin(guac_socket* socket) { /* Lock if threadsafety enabled */ if (socket->__threadsafe_instructions) pthread_mutex_lock(&(socket->__buffer_lock)); } void guac_socket_update_buffer_end(guac_socket* socket) { /* Unlock if threadsafety enabled */ if (socket->__threadsafe_instructions) pthread_mutex_unlock(&(socket->__buffer_lock)); } void guac_socket_free(guac_socket* socket) { /* Call free handler if defined */ if (socket->free_handler) socket->free_handler(socket); guac_socket_flush(socket); /* Mark as closed */ socket->state = GUAC_SOCKET_CLOSED; /* Wait for keep-alive, if enabled */ if (socket->__keep_alive_enabled) pthread_join(socket->__keep_alive_thread, NULL); pthread_mutex_destroy(&(socket->__instruction_write_lock)); free(socket); } ssize_t guac_socket_write_int(guac_socket* socket, int64_t i) { char buffer[128]; snprintf(buffer, sizeof(buffer), "%"PRIi64, i); return guac_socket_write_string(socket, buffer); } ssize_t guac_socket_write_string(guac_socket* socket, const char* str) { char* __out_buf = socket->__out_buf; guac_socket_update_buffer_begin(socket); for (; *str != '\0'; str++) { __out_buf[socket->__written++] = *str; /* Flush when necessary, return on error. Note that we must flush within 4 bytes of boundary because * __guac_socket_write_base64_triplet ALWAYS writes four bytes, and would otherwise potentially overflow * the buffer. */ if (socket->__written > GUAC_SOCKET_OUTPUT_BUFFER_SIZE - 4) { if (guac_socket_write(socket, __out_buf, socket->__written)) { guac_socket_update_buffer_end(socket); return 1; } socket->__written = 0; } } guac_socket_update_buffer_end(socket); return 0; } ssize_t __guac_socket_write_base64_triplet(guac_socket* socket, int a, int b, int c) { char* __out_buf = socket->__out_buf; /* Byte 1 */ __out_buf[socket->__written++] = __guac_socket_BASE64_CHARACTERS[(a & 0xFC) >> 2]; /* [AAAAAA]AABBBB BBBBCC CCCCCC */ if (b >= 0) { __out_buf[socket->__written++] = __guac_socket_BASE64_CHARACTERS[((a & 0x03) << 4) | ((b & 0xF0) >> 4)]; /* AAAAAA[AABBBB]BBBBCC CCCCCC */ if (c >= 0) { __out_buf[socket->__written++] = __guac_socket_BASE64_CHARACTERS[((b & 0x0F) << 2) | ((c & 0xC0) >> 6)]; /* AAAAAA AABBBB[BBBBCC]CCCCCC */ __out_buf[socket->__written++] = __guac_socket_BASE64_CHARACTERS[c & 0x3F]; /* AAAAAA AABBBB BBBBCC[CCCCCC] */ } else { __out_buf[socket->__written++] = __guac_socket_BASE64_CHARACTERS[((b & 0x0F) << 2)]; /* AAAAAA AABBBB[BBBB--]------ */ __out_buf[socket->__written++] = '='; /* AAAAAA AABBBB BBBB--[------] */ } } else { __out_buf[socket->__written++] = __guac_socket_BASE64_CHARACTERS[((a & 0x03) << 4)]; /* AAAAAA[AA----]------ ------ */ __out_buf[socket->__written++] = '='; /* AAAAAA AA----[------]------ */ __out_buf[socket->__written++] = '='; /* AAAAAA AA---- ------[------] */ } /* At this point, 4 bytes have been socket->__written */ /* Flush when necessary, return on error */ if (socket->__written > GUAC_SOCKET_OUTPUT_BUFFER_SIZE - 4) { if (guac_socket_write(socket, __out_buf, socket->__written)) return -1; socket->__written = 0; } if (b < 0) return 1; if (c < 0) return 2; return 3; } ssize_t __guac_socket_write_base64_byte(guac_socket* socket, int buf) { int* __ready_buf = socket->__ready_buf; int retval; __ready_buf[socket->__ready++] = buf; /* Flush triplet */ if (socket->__ready == 3) { retval = __guac_socket_write_base64_triplet(socket, __ready_buf[0], __ready_buf[1], __ready_buf[2]); if (retval < 0) return retval; socket->__ready = 0; } return 1; } ssize_t guac_socket_write_base64(guac_socket* socket, const void* buf, size_t count) { int retval; const unsigned char* char_buf = (const unsigned char*) buf; const unsigned char* end = char_buf + count; guac_socket_update_buffer_begin(socket); while (char_buf < end) { retval = __guac_socket_write_base64_byte(socket, *(char_buf++)); if (retval < 0) { guac_socket_update_buffer_end(socket); return retval; } } guac_socket_update_buffer_end(socket); return 0; } ssize_t guac_socket_flush(guac_socket* socket) { /* Flush remaining bytes in buffer */ guac_socket_update_buffer_begin(socket); if (socket->__written > 0) { if (guac_socket_write(socket, socket->__out_buf, socket->__written)) { guac_socket_update_buffer_end(socket); return 1; } socket->__written = 0; } guac_socket_update_buffer_end(socket); return 0; } ssize_t guac_socket_flush_base64(guac_socket* socket) { int retval; /* Flush triplet to output buffer */ guac_socket_update_buffer_begin(socket); while (socket->__ready > 0) { retval = __guac_socket_write_base64_byte(socket, -1); if (retval < 0) { guac_socket_update_buffer_end(socket); return retval; } } guac_socket_update_buffer_end(socket); return 0; } guacamole-server-0.9.9/src/libguac/raw_encoder.c0000664000175100017510000001160212626724073016561 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "config.h" #include "audio.h" #include "raw_encoder.h" #include #include #include #include #include #include #include static void raw_encoder_begin_handler(guac_audio_stream* audio) { raw_encoder_state* state; char mimetype[256]; /* Produce mimetype string from format info */ snprintf(mimetype, sizeof(mimetype), "audio/L%i;rate=%i,channels=%i", audio->bps, audio->rate, audio->channels); /* Associate stream */ guac_protocol_send_audio(audio->client->socket, audio->stream, mimetype); /* Allocate and init encoder state */ audio->data = state = malloc(sizeof(raw_encoder_state)); state->written = 0; state->length = GUAC_RAW_ENCODER_BUFFER_SIZE * audio->rate * audio->channels * audio->bps / 8 / 1000; state->buffer = malloc(state->length); guac_client_log(audio->client, GUAC_LOG_DEBUG, "Using raw encoder (%s) with a %i byte buffer.", mimetype, state->length); } static void raw_encoder_end_handler(guac_audio_stream* audio) { raw_encoder_state* state = (raw_encoder_state*) audio->data; /* Send end of stream */ guac_protocol_send_end(audio->client->socket, audio->stream); /* Free state information */ free(state->buffer); free(state); } static void raw_encoder_write_handler(guac_audio_stream* audio, const unsigned char* pcm_data, int length) { raw_encoder_state* state = (raw_encoder_state*) audio->data; while (length > 0) { /* Prefer to copy a chunk of equal size to available buffer space */ int chunk_size = state->length - state->written; /* If no space remains, flush and retry */ if (chunk_size == 0) { guac_audio_stream_flush(audio); continue; } /* Do not copy more data than is available in source PCM */ if (chunk_size > length) chunk_size = length; /* Copy block of PCM data into buffer */ memcpy(state->buffer + state->written, pcm_data, chunk_size); /* Advance to next block */ state->written += chunk_size; pcm_data += chunk_size; length -= chunk_size; } } static void raw_encoder_flush_handler(guac_audio_stream* audio) { raw_encoder_state* state = (raw_encoder_state*) audio->data; guac_socket* socket = audio->client->socket; guac_stream* stream = audio->stream; unsigned char* current = state->buffer; int remaining = state->written; /* Flush all data in buffer as blobs */ while (remaining > 0) { /* Determine size of blob to be written */ int chunk_size = remaining; if (chunk_size > 6048) chunk_size = 6048; /* Send audio data */ guac_protocol_send_blob(socket, stream, current, chunk_size); /* Advance to next blob */ current += chunk_size; remaining -= chunk_size; } /* All data has been flushed */ state->written = 0; } /* 8-bit raw encoder handlers */ guac_audio_encoder _raw8_encoder = { .mimetype = "audio/L8", .begin_handler = raw_encoder_begin_handler, .write_handler = raw_encoder_write_handler, .flush_handler = raw_encoder_flush_handler, .end_handler = raw_encoder_end_handler }; /* 16-bit raw encoder handlers */ guac_audio_encoder _raw16_encoder = { .mimetype = "audio/L16", .begin_handler = raw_encoder_begin_handler, .write_handler = raw_encoder_write_handler, .flush_handler = raw_encoder_flush_handler, .end_handler = raw_encoder_end_handler }; /* Actual encoder definitions */ guac_audio_encoder* raw8_encoder = &_raw8_encoder; guac_audio_encoder* raw16_encoder = &_raw16_encoder; guacamole-server-0.9.9/src/libguac/socket-nest.c0000664000175100017510000000715412643542623016535 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "protocol.h" #include "socket.h" #include "unicode.h" #include #include #include #define GUAC_SOCKET_NEST_BUFFER_SIZE 8192 typedef struct __guac_socket_nest_data { guac_socket* parent; char buffer[GUAC_SOCKET_NEST_BUFFER_SIZE]; int index; } __guac_socket_nest_data; ssize_t __guac_socket_nest_write_handler(guac_socket* socket, const void* buf, size_t count) { __guac_socket_nest_data* data = (__guac_socket_nest_data*) socket->data; unsigned char* source = (unsigned char*) buf; /* Current location in destination buffer during copy */ char* current = data->buffer; /* Number of bytes remaining in source buffer */ int remaining = count; /* If we can't actually store that many bytes, reduce number of bytes * expected to be written */ if (remaining > GUAC_SOCKET_NEST_BUFFER_SIZE) remaining = GUAC_SOCKET_NEST_BUFFER_SIZE; /* Current offset within destination buffer */ int offset; /* Number of characters before start of next character */ int skip = 0; /* Copy UTF-8 characters into buffer */ for (offset = 0; offset < GUAC_SOCKET_NEST_BUFFER_SIZE; offset++) { /* Get next byte */ unsigned char c = *source; remaining--; /* If skipping, then skip */ if (skip > 0) skip--; /* Otherwise, determine next skip value, and increment length */ else { /* Determine skip value (size in bytes of rest of character) */ skip = guac_utf8_charsize(c) - 1; /* If not enough bytes to complete character, break */ if (skip > remaining) break; } /* Store byte */ *current = c; /* Advance to next character */ source++; current++; } /* Append null-terminator */ *current = 0; /* Send nest instruction containing read UTF-8 segment */ guac_protocol_send_nest(data->parent, data->index, data->buffer); /* Return number of bytes actually written */ return offset; } guac_socket* guac_socket_nest(guac_socket* parent, int index) { /* Allocate socket and associated data */ guac_socket* socket = guac_socket_alloc(); __guac_socket_nest_data* data = malloc(sizeof(__guac_socket_nest_data)); /* Store file descriptor as socket data */ data->parent = parent; socket->data = data; /* Set write handler */ socket->write_handler = __guac_socket_nest_write_handler; return socket; } guacamole-server-0.9.9/src/libguac/guacamole/0000775000175100017510000000000012645400336016134 500000000000000guacamole-server-0.9.9/src/libguac/guacamole/timestamp.h0000664000175100017510000000316712602261312020227 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_TIMESTAMP_H #define _GUAC_TIMESTAMP_H /** * Provides functions and structures for creating timestamps. * * @file timestamp.h */ #include "timestamp-types.h" /** * Returns an arbitrary timestamp. The difference between return values of any * two calls is equal to the amount of time in milliseconds between those * calls. The return value from a single call will not have any useful * (or defined) meaning. * * @return An arbitrary millisecond timestamp. */ guac_timestamp guac_timestamp_current(); #endif guacamole-server-0.9.9/src/libguac/guacamole/pool.h0000664000175100017510000000701412643542623017204 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_POOL_H #define _GUAC_POOL_H /** * Provides functions and structures for maintaining dynamically allocated and * freed pools of integers. * * @file pool.h */ #include "pool-types.h" struct guac_pool { /** * The minimum number of integers which must have been returned by * guac_pool_next_int before previously-used and freed integers are * allowed to be returned. */ int min_size; /** * The number of integers currently in use. */ int active; /** * The next integer to be released (after no more integers remain in the * pool. */ int __next_value; /** * The first integer in the pool, if any. */ guac_pool_int* __head; /** * The last integer in the pool, if any. */ guac_pool_int* __tail; }; struct guac_pool_int { /** * The integer value of this pool entry. */ int value; /** * The next available (unused) guac_pool_int in the list of * allocated but free'd ints. */ guac_pool_int* __next; }; /** * Allocates a new guac_pool having the given minimum size. * * @param size The minimum number of integers which must have been returned by * guac_pool_next_int before freed integers (previously used * integers) are allowed to be returned. * @return A new, empty guac_pool, having the given minimum size. */ guac_pool* guac_pool_alloc(int size); /** * Frees the given guac_pool. * * @param pool The guac_pool to free. */ void guac_pool_free(guac_pool* pool); /** * Returns the next available integer from the given guac_pool. All integers * returned are non-negative, and are returned in sequences, starting from 0. * * @param pool The guac_pool to retrieve an integer from. * @return The next available integer, which may be either an integer not yet * returned by a call to guac_pool_next_int, or an integer which was * previosly returned, but has since been freed. */ int guac_pool_next_int(guac_pool* pool); /** * Frees the given integer back into the given guac_pool. The integer given * will be available for future calls to guac_pool_next_int. * * @param pool The guac_pool to free the given integer into. * @param value The integer which should be returned to the given pool, such * that it can be received by a future call to guac_pool_next_int. */ void guac_pool_free_int(guac_pool* pool, int value); #endif guacamole-server-0.9.9/src/libguac/guacamole/socket-constants.h0000664000175100017510000000303112602261312021514 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUAC_SOCKET_CONSTANTS_H #define _GUAC_SOCKET_CONSTANTS_H /** * Constants related to the guac_socket object. * * @file socket-constants.h */ /** * The number of bytes to buffer within each socket before flushing. */ #define GUAC_SOCKET_OUTPUT_BUFFER_SIZE 8192 /** * The number of milliseconds to wait between keep-alive pings on a socket * with keep-alive enabled. */ #define GUAC_SOCKET_KEEP_ALIVE_INTERVAL 5000 #endif guacamole-server-0.9.9/src/libguac/guacamole/layer.h0000664000175100017510000000266712536405624017360 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_LAYER_H #define _GUAC_LAYER_H /** * Provides functions and structures required for allocating and using layers. * * @file layer.h */ #include "layer-types.h" /** * Represents a single layer within the Guacamole protocol. */ struct guac_layer { /** * The index of this layer. */ int index; }; #endif guacamole-server-0.9.9/src/libguac/guacamole/stream.h0000664000175100017510000000711412643542623017527 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_STREAM_H #define _GUAC_STREAM_H /** * Provides functions and structures required for allocating and using streams. * * @file stream.h */ #include "client-fntypes.h" #include "stream-types.h" struct guac_stream { /** * The index of this stream. */ int index; /** * Arbitrary data associated with this stream. */ void* data; /** * Handler for ack events sent by the Guacamole web-client. * * The handler takes a guac_stream which contains the stream index and * will persist through the duration of the transfer, a string containing * the error or status message, and a status code. * * Example: * @code * int ack_handler(guac_client* client, guac_stream* stream, * char* error, guac_protocol_status status); * * int some_function(guac_client* client) { * * guac_stream* stream = guac_client_alloc_stream(client); * stream->ack_handler = ack_handler; * * guac_protocol_send_clipboard(client->socket, * stream, "text/plain"); * * } * @endcode */ guac_client_ack_handler* ack_handler; /** * Handler for blob events sent by the Guacamole web-client. * * The handler takes a guac_stream which contains the stream index and * will persist through the duration of the transfer, an arbitrary buffer * containing the blob, and the length of the blob. * * Example: * @code * int blob_handler(guac_client* client, guac_stream* stream, * void* data, int length); * * int my_clipboard_handler(guac_client* client, guac_stream* stream, * char* mimetype) { * stream->blob_handler = blob_handler; * } * @endcode */ guac_client_blob_handler* blob_handler; /** * Handler for stream end events sent by the Guacamole web-client. * * The handler takes only a guac_stream which contains the stream index. * This guac_stream will be disposed of immediately after this event is * finished. * * Example: * @code * int end_handler(guac_client* client, guac_stream* stream); * * int my_clipboard_handler(guac_client* client, guac_stream* stream, * char* mimetype) { * stream->end_handler = end_handler; * } * @endcode */ guac_client_end_handler* end_handler; }; #endif guacamole-server-0.9.9/src/libguac/guacamole/object-types.h0000664000175100017510000000255512626133327020646 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 GUAC_OBJECT_TYPES_H #define GUAC_OBJECT_TYPES_H /** * Type definitions related to Guacamole protocol objects. * * @file object-types.h */ /** * Represents a single object within the Guacamole protocol. */ typedef struct guac_object guac_object; #endif guacamole-server-0.9.9/src/libguac/guacamole/error.h0000664000175100017510000000657012536405624017372 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_ERROR_H #define _GUAC_ERROR_H /** * Provides functions and structures required for handling return values and * errors. * * @file error.h */ #include "error-types.h" /** * Returns a human-readable explanation of the status code given. */ const char* guac_status_string(guac_status status); /** * Returns the status code associated with the error which occurred during the * last function call. This value will only be set by functions documented to * use it (most libguac functions), and is undefined if no error occurred. * * The storage of this value is thread-local. Assignment of a status code to * guac_error in one thread will not affect its value in another thread. */ #define guac_error (*__guac_error()) guac_status* __guac_error(); /** * Returns a message describing the error which occurred during the last * function call. If an error occurred, but no message is associated with it, * NULL is returned. This value is undefined if no error occurred. * * The storage of this value is thread-local. Assignment of a message to * guac_error_message in one thread will not affect its value in another * thread. */ #define guac_error_message (*__guac_error_message()) const char** __guac_error_message(); /** * Returns a human-readable explanation of the status code given. */ const char* guac_status_string(guac_status status); /** * Returns the status code associated with the error which occurred during the * last function call. This value will only be set by functions documented to * use it (most libguac functions), and is undefined if no error occurred. * * The storage of this value is thread-local. Assignment of a status code to * guac_error in one thread will not affect its value in another thread. */ #define guac_error (*__guac_error()) guac_status* __guac_error(); /** * Returns a message describing the error which occurred during the last * function call. If an error occurred, but no message is associated with it, * NULL is returned. This value is undefined if no error occurred. * * The storage of this value is thread-local. Assignment of a message to * guac_error_message in one thread will not affect its value in another * thread. */ #define guac_error_message (*__guac_error_message()) const char** __guac_error_message(); #endif guacamole-server-0.9.9/src/libguac/guacamole/audio.h0000664000175100017510000001402412637656315017342 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 __GUAC_AUDIO_H #define __GUAC_AUDIO_H /** * Provides functions and structures used for providing simple streaming audio. * * @file audio.h */ #include "audio-fntypes.h" #include "audio-types.h" #include "client-types.h" #include "stream-types.h" struct guac_audio_encoder { /** * The mimetype of the audio data encoded by this audio * encoder. */ const char* mimetype; /** * Handler which will be called when the audio stream is first created. */ guac_audio_encoder_begin_handler* begin_handler; /** * Handler which will be called when PCM data is written to the audio * stream for encoding. */ guac_audio_encoder_write_handler* write_handler; /** * Handler which will be called when the audio stream is flushed. */ guac_audio_encoder_flush_handler* flush_handler; /** * Handler which will be called when the audio stream is closed. */ guac_audio_encoder_end_handler* end_handler; }; struct guac_audio_stream { /** * Arbitrary codec encoder which will receive raw PCM data. */ guac_audio_encoder* encoder; /** * The client associated with this audio stream. */ guac_client* client; /** * The actual stream associated with this audio stream. */ guac_stream* stream; /** * The number of samples per second of PCM data sent to this stream. */ int rate; /** * The number of audio channels per sample of PCM data. Legal values are * 1 or 2. */ int channels; /** * The number of bits per sample per channel for PCM data. Legal values are * 8 or 16. */ int bps; /** * Encoder-specific state data. */ void* data; }; /** * Allocates a new audio stream which encodes audio data using the given * encoder. If NULL is specified for the encoder, an appropriate encoder * will be selected based on the encoders built into libguac and the level * of client support. The PCM format specified here (via rate, channels, and * bps) must be the format used for all PCM data provided to the audio stream. * The format may only be changed using guac_audio_stream_reset(). * * @param client * The guac_client for which this audio stream is being allocated. * * @param encoder * The guac_audio_encoder to use when encoding audio, or NULL if libguac * should select an appropriate built-in encoder on its own. * * @param rate * The number of samples per second of PCM data sent to this stream. * * @param channels * The number of audio channels per sample of PCM data. Legal values are * 1 or 2. * * @param bps * The number of bits per sample per channel for PCM data. Legal values are * 8 or 16. * * @return * The newly allocated guac_audio_stream, or NULL if no audio stream could * be allocated due to lack of client support. */ guac_audio_stream* guac_audio_stream_alloc(guac_client* client, guac_audio_encoder* encoder, int rate, int channels, int bps); /** * Resets the given audio stream, switching to the given encoder, rate, * channels, and bits per sample. If NULL is specified for the encoder, the * encoder is left unchanged. If the encoder, rate, channels, and bits per * sample are all identical to the current settings, this function has no * effect. * * @param audio * The guac_audio_stream to reset. * * @param encoder * The guac_audio_encoder to use when encoding audio, or NULL to leave this * unchanged. * * @param rate * The number of samples per second of PCM data sent to this stream. * * @param channels * The number of audio channels per sample of PCM data. Legal values are * 1 or 2. * * @param bps * The number of bits per sample per channel for PCM data. Legal values are * 8 or 16. */ void guac_audio_stream_reset(guac_audio_stream* audio, guac_audio_encoder* encoder, int rate, int channels, int bps); /** * Closes and frees the given audio stream. * * @param stream * The guac_audio_stream to free. */ void guac_audio_stream_free(guac_audio_stream* stream); /** * Writes PCM data to the given audio stream. This PCM data will be * automatically encoded by the audio encoder associated with this stream. The * PCM data must be 2-channel, 44100 Hz, with signed 16-bit samples. * * @param stream * The guac_audio_stream to write PCM data through. * * @param data * The PCM data to write. * * @param length * The number of bytes of PCM data provided. */ void guac_audio_stream_write_pcm(guac_audio_stream* stream, const unsigned char* data, int length); /** * Flushes the underlying audio buffer, if any, ensuring that all audio * previously written via guac_audio_stream_write_pcm() has been encoded and * sent to the client. * * @param stream * The guac_audio_stream whose audio buffers should be flushed. */ void guac_audio_stream_flush(guac_audio_stream* stream); #endif guacamole-server-0.9.9/src/libguac/guacamole/protocol.h0000664000175100017510000007653312637656315020117 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_PROTOCOL_H #define _GUAC_PROTOCOL_H /** * Provides functions and structures required for communicating using the * Guacamole protocol over a guac_socket connection, such as that provided by * guac_client objects. * * @file protocol.h */ #include "layer-types.h" #include "object-types.h" #include "protocol-types.h" #include "socket-types.h" #include "stream-types.h" #include "timestamp-types.h" #include #include /* CONTROL INSTRUCTIONS */ /** * Sends an ack instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param stream The guac_stream associated with the operation this ack is * acknowledging. * @param error The human-readable description associated with the error or * status update. * @param status The status code related to the error or status. * @return Zero on success, non-zero on error. */ int guac_protocol_send_ack(guac_socket* socket, guac_stream* stream, const char* error, guac_protocol_status status); /** * Sends an args instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param args The NULL-terminated array of argument names (strings). * @return Zero on success, non-zero on error. */ int guac_protocol_send_args(guac_socket* socket, const char** args); /** * Sends a connect instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param args The NULL-terminated array of argument values (strings). * @return Zero on success, non-zero on error. */ int guac_protocol_send_connect(guac_socket* socket, const char** args); /** * Sends a disconnect instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @return Zero on success, non-zero on error. */ int guac_protocol_send_disconnect(guac_socket* socket); /** * Sends an error instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param error The human-readable description associated with the error. * @param status The status code related to the error. * @return Zero on success, non-zero on error. */ int guac_protocol_send_error(guac_socket* socket, const char* error, guac_protocol_status status); /** * Sends a log instruction over the given guac_socket connection. This is * mainly useful in debugging. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param format A printf-style format string to log. * @param ... Arguments to use when filling the format string for printing. * @return Zero on success, non-zero on error. */ int guac_protocol_send_log(guac_socket* socket, const char* format, ...); /** * Sends a log instruction over the given guac_socket connection. This is * mainly useful in debugging. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket * The guac_socket connection to use. * * @param format * A printf-style format string to log. * * @param args * The va_list containing the arguments to be used when filling the * format string for printing. * * @return * Zero if the instruction was sent successfully, non-zero if an error * occurs. */ int vguac_protocol_send_log(guac_socket* socket, const char* format, va_list args); /** * Sends a nest instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param index The integer index of the stram to send the protocol * data over. * @param data A string containing protocol data, which must be UTF-8 * encoded and null-terminated. * @return Zero on success, non-zero on error. */ int guac_protocol_send_nest(guac_socket* socket, int index, const char* data); /** * Sends a nop instruction (null-operation) over the given guac_socket * connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @return Zero on success, non-zero on error. */ int guac_protocol_send_nop(guac_socket* socket); /** * Sends a ready instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param id The connection ID of the connection that is ready. * @return Zero on success, non-zero on error. */ int guac_protocol_send_ready(guac_socket* socket, const char* id); /** * Sends a set instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param layer The layer to set the parameter of. * @param name The name of the parameter to set. * @param value The value to set the parameter to. * @return Zero on success, non-zero on error. */ int guac_protocol_send_set(guac_socket* socket, const guac_layer* layer, const char* name, const char* value); /** * Sends a select instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param protocol The protocol to request. * @return Zero on success, non-zero on error. */ int guac_protocol_send_select(guac_socket* socket, const char* protocol); /** * Sends a sync instruction over the given guac_socket connection. The * current time in milliseconds should be passed in as the timestamp. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param timestamp The current timestamp (in milliseconds). * @return Zero on success, non-zero on error. */ int guac_protocol_send_sync(guac_socket* socket, guac_timestamp timestamp); /* OBJECT INSTRUCTIONS */ /** * Sends a body instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket * The guac_socket connection to use. * * @param object * The object to associated with the stream being used. * * @param stream * The stream to use. * * @param mimetype * The mimetype of the data being sent. * * @param name * The name of the stream whose body is being sent, as requested by a "get" * instruction. * * @return * Zero on success, non-zero on error. */ int guac_protocol_send_body(guac_socket* socket, const guac_object* object, const guac_stream* stream, const char* mimetype, const char* name); /** * Sends a filesystem instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket * The guac_socket connection to use. * * @param object * The object representing the filesystem being exposed. * * @param name * A name describing the filesystem being exposed. * * @return * Zero on success, non-zero on error. */ int guac_protocol_send_filesystem(guac_socket* socket, const guac_object* object, const char* name); /** * Sends an undefine instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket * The guac_socket connection to use. * * @param object * The object being undefined. * * @return * Zero on success, non-zero on error. */ int guac_protocol_send_undefine(guac_socket* socket, const guac_object* object); /* MEDIA INSTRUCTIONS */ /** * Sends an audio instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket * The guac_socket connection to use when sending the audio instruction. * * @param stream * The stream to use for future audio data. * * @param mimetype * The mimetype of the audio data which will be sent over the given stream. * * @return * Zero on success, non-zero on error. */ int guac_protocol_send_audio(guac_socket* socket, const guac_stream* stream, const char* mimetype); /** * Sends a file instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param stream The stream to use. * @param mimetype The mimetype of the data being sent. * @param name A name describing the file being sent. * @return Zero on success, non-zero on error. */ int guac_protocol_send_file(guac_socket* socket, const guac_stream* stream, const char* mimetype, const char* name); /** * Sends a pipe instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param stream The stream to use. * @param mimetype The mimetype of the data being sent. * @param name An arbitrary name uniquely identifying this pipe. * @return Zero on success, non-zero on error. */ int guac_protocol_send_pipe(guac_socket* socket, const guac_stream* stream, const char* mimetype, const char* name); /** * Writes a block of data to the currently in-progress blob which was already * created. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param stream The stream to use. * @param data The file data to write. * @param count The number of bytes within the given buffer of file data * that must be written. * @return Zero on success, non-zero on error. */ int guac_protocol_send_blob(guac_socket* socket, const guac_stream* stream, const void* data, int count); /** * Sends an end instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param stream The stream to use. * @return Zero on success, non-zero on error. */ int guac_protocol_send_end(guac_socket* socket, const guac_stream* stream); /** * Sends a video instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket * The guac_socket connection to use when sending the video instruction. * * @param stream * The stream to use for future video data. * * @param layer * The destination layer on which the streamed video should be played. * * @param mimetype * The mimetype of the video data which will be sent over the given stream. * * @return * Zero on success, non-zero on error. */ int guac_protocol_send_video(guac_socket* socket, const guac_stream* stream, const guac_layer* layer, const char* mimetype); /* DRAWING INSTRUCTIONS */ /** * Sends an arc instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param layer The destination layer. * @param x The X coordinate of the center of the circle containing the arc. * @param y The Y coordinate of the center of the circle containing the arc. * @param radius The radius of the circle containing the arc. * @param startAngle The starting angle, in radians. * @param endAngle The ending angle, in radians. * @param negative Zero if the arc should be drawn in order of increasing * angle, non-zero otherwise. * @return Zero on success, non-zero on error. */ int guac_protocol_send_arc(guac_socket* socket, const guac_layer* layer, int x, int y, int radius, double startAngle, double endAngle, int negative); /** * Sends a cfill instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param mode The composite mode to use. * @param layer The destination layer. * @param r The red component of the color of the rectangle. * @param g The green component of the color of the rectangle. * @param b The blue component of the color of the rectangle. * @param a The alpha (transparency) component of the color of the rectangle. * @return Zero on success, non-zero on error. */ int guac_protocol_send_cfill(guac_socket* socket, guac_composite_mode mode, const guac_layer* layer, int r, int g, int b, int a); /** * Sends a clip instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param layer The layer to set the clipping region of. * @return Zero on success, non-zero on error. */ int guac_protocol_send_clip(guac_socket* socket, const guac_layer* layer); /** * Sends a close instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param layer The destination layer. * @return Zero on success, non-zero on error. */ int guac_protocol_send_close(guac_socket* socket, const guac_layer* layer); /** * Sends a copy instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param srcl The source layer. * @param srcx The X coordinate of the source rectangle. * @param srcy The Y coordinate of the source rectangle. * @param w The width of the source rectangle. * @param h The height of the source rectangle. * @param mode The composite mode to use. * @param dstl The destination layer. * @param dstx The X coordinate of the destination, where the source rectangle * should be copied. * @param dsty The Y coordinate of the destination, where the source rectangle * should be copied. * @return Zero on success, non-zero on error. */ int guac_protocol_send_copy(guac_socket* socket, const guac_layer* srcl, int srcx, int srcy, int w, int h, guac_composite_mode mode, const guac_layer* dstl, int dstx, int dsty); /** * Sends a cstroke instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param mode The composite mode to use. * @param layer The destination layer. * @param cap The style of line cap to use when drawing the stroke. * @param join The style of line join to use when drawing the stroke. * @param thickness The thickness of the stroke in pixels. * @param r The red component of the color of the rectangle. * @param g The green component of the color of the rectangle. * @param b The blue component of the color of the rectangle. * @param a The alpha (transparency) component of the color of the rectangle. * @return Zero on success, non-zero on error. */ int guac_protocol_send_cstroke(guac_socket* socket, guac_composite_mode mode, const guac_layer* layer, guac_line_cap_style cap, guac_line_join_style join, int thickness, int r, int g, int b, int a); /** * Sends a cursor instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param x The X coordinate of the cursor hotspot. * @param y The Y coordinate of the cursor hotspot. * @param srcl The source layer. * @param srcx The X coordinate of the source rectangle. * @param srcy The Y coordinate of the source rectangle. * @param w The width of the source rectangle. * @param h The height of the source rectangle. * @return Zero on success, non-zero on error. */ int guac_protocol_send_cursor(guac_socket* socket, int x, int y, const guac_layer* srcl, int srcx, int srcy, int w, int h); /** * Sends a curve instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param layer The destination layer. * @param cp1x The X coordinate of the first control point. * @param cp1y The Y coordinate of the first control point. * @param cp2x The X coordinate of the second control point. * @param cp2y The Y coordinate of the second control point. * @param x The X coordinate of the endpoint of the curve. * @param y The Y coordinate of the endpoint of the curve. * @return Zero on success, non-zero on error. */ int guac_protocol_send_curve(guac_socket* socket, const guac_layer* layer, int cp1x, int cp1y, int cp2x, int cp2y, int x, int y); /** * Sends an identity instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param layer The destination layer. * @return Zero on success, non-zero on error. */ int guac_protocol_send_identity(guac_socket* socket, const guac_layer* layer); /** * Sends an lfill instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param mode The composite mode to use. * @param layer The destination layer. * @param srcl The source layer. * @return Zero on success, non-zero on error. */ int guac_protocol_send_lfill(guac_socket* socket, guac_composite_mode mode, const guac_layer* layer, const guac_layer* srcl); /** * Sends a line instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param layer The destination layer. * @param x The X coordinate of the endpoint of the line. * @param y The Y coordinate of the endpoint of the line. * @return Zero on success, non-zero on error. */ int guac_protocol_send_line(guac_socket* socket, const guac_layer* layer, int x, int y); /** * Sends an lstroke instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param mode The composite mode to use. * @param layer The destination layer. * @param cap The style of line cap to use when drawing the stroke. * @param join The style of line join to use when drawing the stroke. * @param thickness The thickness of the stroke in pixels. * @param srcl The source layer. * @return Zero on success, non-zero on error. */ int guac_protocol_send_lstroke(guac_socket* socket, guac_composite_mode mode, const guac_layer* layer, guac_line_cap_style cap, guac_line_join_style join, int thickness, const guac_layer* srcl); /** * Sends an img instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket * The guac_socket connection to use when sending the img instruction. * * @param stream * The stream over which the image data will be sent. * * @param mode * The composite mode to use when drawing the image over the destination * layer. * * @param layer * The destination layer. * * @param mimetype * The mimetype of the image data being sent. * * @param x * The X coordinate of the upper-left corner of the destination rectangle * within the destination layer, in pixels. * * @param y * The Y coordinate of the upper-left corner of the destination rectangle * within the destination layer, in pixels. * * @return * Zero if the instruction was successfully sent, non-zero on error. */ int guac_protocol_send_img(guac_socket* socket, const guac_stream* stream, guac_composite_mode mode, const guac_layer* layer, const char* mimetype, int x, int y); /** * Sends a pop instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param layer The layer to set the clipping region of. * @return Zero on success, non-zero on error. */ int guac_protocol_send_pop(guac_socket* socket, const guac_layer* layer); /** * Sends a push instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param layer The layer to set the clipping region of. * @return Zero on success, non-zero on error. */ int guac_protocol_send_push(guac_socket* socket, const guac_layer* layer); /** * Sends a rect instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param layer The destination layer. * @param x The X coordinate of the rectangle. * @param y The Y coordinate of the rectangle. * @param width The width of the rectangle. * @param height The height of the rectangle. * @return Zero on success, non-zero on error. */ int guac_protocol_send_rect(guac_socket* socket, const guac_layer* layer, int x, int y, int width, int height); /** * Sends a reset instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param layer The layer to set the clipping region of. * @return Zero on success, non-zero on error. */ int guac_protocol_send_reset(guac_socket* socket, const guac_layer* layer); /** * Sends a start instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param layer The destination layer. * @param x The X coordinate of the first point of the subpath. * @param y The Y coordinate of the first point of the subpath. * @return Zero on success, non-zero on error. */ int guac_protocol_send_start(guac_socket* socket, const guac_layer* layer, int x, int y); /** * Sends a transfer instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param srcl The source layer. * @param srcx The X coordinate of the source rectangle. * @param srcy The Y coordinate of the source rectangle. * @param w The width of the source rectangle. * @param h The height of the source rectangle. * @param fn The transfer function to use. * @param dstl The destination layer. * @param dstx The X coordinate of the destination, where the source rectangle * should be copied. * @param dsty The Y coordinate of the destination, where the source rectangle * should be copied. * @return Zero on success, non-zero on error. */ int guac_protocol_send_transfer(guac_socket* socket, const guac_layer* srcl, int srcx, int srcy, int w, int h, guac_transfer_function fn, const guac_layer* dstl, int dstx, int dsty); /** * Sends a transform instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param layer The layer to apply the given transform matrix to. * @param a The first value of the affine transform matrix. * @param b The second value of the affine transform matrix. * @param c The third value of the affine transform matrix. * @param d The fourth value of the affine transform matrix. * @param e The fifth value of the affine transform matrix. * @param f The sixth value of the affine transform matrix. * @return Zero on success, non-zero on error. */ int guac_protocol_send_transform(guac_socket* socket, const guac_layer* layer, double a, double b, double c, double d, double e, double f); /* LAYER INSTRUCTIONS */ /** * Sends a dispose instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param layer The layer to dispose. * @return Zero on success, non-zero on error. */ int guac_protocol_send_dispose(guac_socket* socket, const guac_layer* layer); /** * Sends a distort instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param layer The layer to distort with the given transform matrix. * @param a The first value of the affine transform matrix. * @param b The second value of the affine transform matrix. * @param c The third value of the affine transform matrix. * @param d The fourth value of the affine transform matrix. * @param e The fifth value of the affine transform matrix. * @param f The sixth value of the affine transform matrix. * @return Zero on success, non-zero on error. */ int guac_protocol_send_distort(guac_socket* socket, const guac_layer* layer, double a, double b, double c, double d, double e, double f); /** * Sends a move instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param layer The layer to move. * @param parent The parent layer the specified layer will be positioned * relative to. * @param x The X coordinate of the layer. * @param y The Y coordinate of the layer. * @param z The Z index of the layer, relative to other layers in its parent. * @return Zero on success, non-zero on error. */ int guac_protocol_send_move(guac_socket* socket, const guac_layer* layer, const guac_layer* parent, int x, int y, int z); /** * Sends a shade instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param layer The layer to shade. * @param a The alpha value of the layer. * @return Zero on success, non-zero on error. */ int guac_protocol_send_shade(guac_socket* socket, const guac_layer* layer, int a); /** * Sends a size instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param layer The layer to resize. * @param w The new width of the layer. * @param h The new height of the layer. * @return Zero on success, non-zero on error. */ int guac_protocol_send_size(guac_socket* socket, const guac_layer* layer, int w, int h); /* TEXT INSTRUCTIONS */ /** * Sends a clipboard instruction over the given guac_socket connection. * * If an error occurs sending the instruction, a non-zero value is * returned, and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param stream The stream to use. * @param mimetype The mimetype of the clipboard data being sent. * @return Zero on success, non-zero on error. */ int guac_protocol_send_clipboard(guac_socket* socket, const guac_stream* stream, const char* mimetype); /** * Sends a name instruction over the given guac_socket connection. * * @param socket The guac_socket connection to use. * @param name The name to send within the name instruction. * @return Zero on success, non-zero on error. */ int guac_protocol_send_name(guac_socket* socket, const char* name); /** * Decodes the given base64-encoded string in-place. The base64 string must * be NULL-terminated. * * @param base64 The base64-encoded string to decode. * @return The number of bytes resulting from the decode operation. */ int guac_protocol_decode_base64(char* base64); #endif guacamole-server-0.9.9/src/libguac/guacamole/instruction-types.h0000664000175100017510000000414412643542623021757 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_INSTRUCTION_TYPES_H #define _GUAC_INSTRUCTION_TYPES_H /** * Type definitions related to Guacamole instructions. * * @file instruction-types.h */ /** * All possible states of the instruction parser. */ typedef enum guac_instruction_parse_state { /** * The parser is currently waiting for data to complete the length prefix * of the current element of the instruction. */ GUAC_INSTRUCTION_PARSE_LENGTH, /** * The parser has finished reading the length prefix and is currently * waiting for data to complete the content of the instruction. */ GUAC_INSTRUCTION_PARSE_CONTENT, /** * The instruction has been fully parsed. */ GUAC_INSTRUCTION_PARSE_COMPLETE, /** * The instruction cannot be parsed because of a protocol error. */ GUAC_INSTRUCTION_PARSE_ERROR } guac_instruction_parse_state; /** * Represents a single instruction within the Guacamole protocol. */ typedef struct guac_instruction guac_instruction; #endif guacamole-server-0.9.9/src/libguac/guacamole/stream-types.h0000664000175100017510000000255712536405625020700 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUAC_STREAM_TYPES_H #define _GUAC_STREAM_TYPES_H /** * Type definitions related to Guacamole protocol streams. * * @file stream-types.h */ /** * Represents a single stream within the Guacamole protocol. */ typedef struct guac_stream guac_stream; #endif guacamole-server-0.9.9/src/libguac/guacamole/timestamp-types.h0000664000175100017510000000262512602261312021367 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUAC_TIMESTAMP_TYPES_H #define _GUAC_TIMESTAMP_TYPES_H /** * Type definitions related to Guacamole protocol timestamps. * * @file timestamp-types.h */ #include /** * An arbitrary timestamp denoting a relative time value in milliseconds. */ typedef int64_t guac_timestamp; #endif guacamole-server-0.9.9/src/libguac/guacamole/client-constants.h0000664000175100017510000000710512643542623021524 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUAC_CLIENT_CONSTANTS_H #define _GUAC_CLIENT_CONSTANTS_H /** * Constants related to the Guacamole client structure, guac_client. * * @file client-constants.h */ /** * The maximum number of inbound streams supported by any one guac_client. */ #define GUAC_CLIENT_MAX_STREAMS 64 /** * The index of a closed stream. */ #define GUAC_CLIENT_CLOSED_STREAM_INDEX -1 /** * The maximum number of objects supported by any one guac_client. */ #define GUAC_CLIENT_MAX_OBJECTS 64 /** * The index of an object which has not been defined. */ #define GUAC_CLIENT_UNDEFINED_OBJECT_INDEX -1 /** * The stream name reserved for the root of a Guacamole protocol object. */ #define GUAC_CLIENT_OBJECT_ROOT_NAME "/" /** * The mimetype of a stream containing a map of available stream names to their * corresponding mimetypes. The root of a Guacamole protocol object is * guaranteed to have this type. */ #define GUAC_CLIENT_STREAM_INDEX_MIMETYPE "application/vnd.glyptodon.guacamole.stream-index+json" /** * The flag set in the mouse button mask when the left mouse button is down. */ #define GUAC_CLIENT_MOUSE_LEFT 0x01 /** * The flag set in the mouse button mask when the middle mouse button is down. */ #define GUAC_CLIENT_MOUSE_MIDDLE 0x02 /** * The flag set in the mouse button mask when the right mouse button is down. */ #define GUAC_CLIENT_MOUSE_RIGHT 0x04 /** * The flag set in the mouse button mask when the mouse scrollwheel is scrolled * up. Note that mouse scrollwheels are actually sets of two buttons. One * button is pressed and released for an upward scroll, and the other is * pressed and released for a downward scroll. Some mice may actually implement * these as separate buttons, not a wheel. */ #define GUAC_CLIENT_MOUSE_SCROLL_UP 0x08 /** * The flag set in the mouse button mask when the mouse scrollwheel is scrolled * down. Note that mouse scrollwheels are actually sets of two buttons. One * button is pressed and released for an upward scroll, and the other is * pressed and released for a downward scroll. Some mice may actually implement * these as separate buttons, not a wheel. */ #define GUAC_CLIENT_MOUSE_SCROLL_DOWN 0x10 /** * The minimum number of buffers to create before allowing free'd buffers to * be reclaimed. In the case a protocol rapidly creates, uses, and destroys * buffers, this can prevent unnecessary reuse of the same buffer (which * would make draw operations unnecessarily synchronous). */ #define GUAC_BUFFER_POOL_INITIAL_SIZE 1024 #endif guacamole-server-0.9.9/src/libguac/guacamole/instruction.h0000664000175100017510000001343612643542623020621 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_INSTRUCTION_H #define _GUAC_INSTRUCTION_H /** * Provides functions and structures for reading, writing, and manipulating * Guacamole instructions. * * @file instruction.h */ #include "instruction-types.h" #include "instruction-constants.h" #include "socket-types.h" struct guac_instruction { /** * The opcode of the instruction. */ char* opcode; /** * The number of arguments passed to this instruction. */ int argc; /** * Array of all arguments passed to this instruction. */ char** argv; /** * The parse state of the instruction. */ guac_instruction_parse_state state; /** * The length of the current element, if known. */ int __element_length; /** * The number of elements currently parsed. */ int __elementc; /** * All currently parsed elements. */ char* __elementv[GUAC_INSTRUCTION_MAX_ELEMENTS]; }; /** * Allocates a new instruction. Each instruction contains within itself the * necessary facilities to parse instruction data. * * @return The newly allocated instruction, or NULL if an error occurs during * allocation, in which case guac_error will be set appropriately. */ guac_instruction* guac_instruction_alloc(); /** * Resets the parse state and contents of the given instruction, such that the * memory of that instruction can be reused for another parse cycle. * * @param instruction The instruction to reset. */ void guac_instruction_reset(guac_instruction* instruction); /** * Appends data from the given buffer to the given instruction. The data will * be appended, if possible, to this instruction as a reference and thus the * buffer must remain valid throughout the life of the instruction. This * function may modify the contents of the buffer when those contents are * part of an element within the instruction being read. * * @param instruction The instruction to append data to. * @param buffer A buffer containing data that should be appended to this * instruction. * @param length The number of bytes available for appending within the buffer. * @return The number of bytes appended to this instruction, which may be * zero if more data is needed. */ int guac_instruction_append(guac_instruction* instruction, void* buffer, int length); /** * Frees all memory allocated to the given instruction. * * @param instruction The instruction to free. */ void guac_instruction_free(guac_instruction* instruction); /** * Returns whether new instruction data is available on the given guac_socket * connection for parsing. * * @param socket The guac_socket connection to use. * @param usec_timeout The maximum number of microseconds to wait before * giving up. * @return A positive value if data is available, negative on error, or * zero if no data is currently available. */ int guac_instruction_waiting(guac_socket* socket, int usec_timeout); /** * Reads a single instruction from the given guac_socket connection. * * If an error occurs reading the instruction, NULL is returned, * and guac_error is set appropriately. * * @param socket The guac_socket connection to use. * @param usec_timeout The maximum number of microseconds to wait before * giving up. * @return A new instruction if data was successfully read, NULL on * error or if the instruction could not be read completely * because the timeout elapsed, in which case guac_error will be * set to GUAC_STATUS_INPUT_TIMEOUT and subsequent calls to * guac_protocol_read_instruction() will return the parsed instruction * once enough data is available. */ guac_instruction* guac_instruction_read(guac_socket* socket, int usec_timeout); /** * Reads a single instruction with the given opcode from the given guac_socket * connection. * * If an error occurs reading the instruction, NULL is returned, * and guac_error is set appropriately. * * If the instruction read is not the expected instruction, NULL is returned, * and guac_error is set to GUAC_STATUS_BAD_STATE. * * @param socket The guac_socket connection to use. * @param usec_timeout The maximum number of microseconds to wait before * giving up. * @param opcode The opcode of the instruction to read. * @return A new instruction if an instruction with the given opcode was read, * NULL otherwise. If an instruction was read, but the instruction had * a different opcode, NULL is returned and guac_error is set to * GUAC_STATUS_BAD_STATE. */ guac_instruction* guac_instruction_expect(guac_socket* socket, int usec_timeout, const char* opcode); #endif guacamole-server-0.9.9/src/libguac/guacamole/error-types.h0000664000175100017510000001062112612226234020515 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUAC_ERROR_TYPES_H #define _GUAC_ERROR_TYPES_H /** * Type definitions related to return values and errors. * * @file error-types.h */ /** * Return codes shared by all Guacamole functions which can fail. */ typedef enum guac_status { /** * No errors occurred and the operation was successful. */ GUAC_STATUS_SUCCESS = 0, /** * Insufficient memory to complete the operation. */ GUAC_STATUS_NO_MEMORY, /** * The resource associated with the operation can no longer be used as it * has reached the end of its normal lifecycle. */ GUAC_STATUS_CLOSED, /** * Time ran out before the operation could complete. */ GUAC_STATUS_TIMEOUT, /** * An error occurred, and further information about the error is already * stored in errno. */ GUAC_STATUS_SEE_ERRNO, /** * An I/O error prevented the operation from succeeding. */ GUAC_STATUS_IO_ERROR, /** * The operation could not be performed because an invalid argument was * given. */ GUAC_STATUS_INVALID_ARGUMENT, /** * The operation failed due to a bug in the software or a serious system * problem. */ GUAC_STATUS_INTERNAL_ERROR, /** * Insufficient space remaining to complete the operation. */ GUAC_STATUS_NO_SPACE, /** * The operation failed because the input provided is too large. */ GUAC_STATUS_INPUT_TOO_LARGE, /** * The operation failed because the result could not be stored in the * space provided. */ GUAC_STATUS_RESULT_TOO_LARGE, /** * Permission was denied to perform the operation. */ GUAC_STATUS_PERMISSION_DENIED, /** * The operation could not be performed because associated resources are * busy. */ GUAC_STATUS_BUSY, /** * The operation could not be performed because, while the associated * resources do exist, they are not currently available for use. */ GUAC_STATUS_NOT_AVAILABLE, /** * The requested operation is not supported. */ GUAC_STATUS_NOT_SUPPORTED, /** * Support for the requested operation is not yet implemented. */ GUAC_STATUS_NOT_INPLEMENTED, /** * The operation is temporarily unable to be performed, but may succeed if * reattempted. */ GUAC_STATUS_TRY_AGAIN, /** * A violation of the Guacamole protocol occurred. */ GUAC_STATUS_PROTOCOL_ERROR, /** * The operation could not be performed because the requested resources do * not exist. */ GUAC_STATUS_NOT_FOUND, /** * The operation was canceled prior to completion. */ GUAC_STATUS_CANCELED, /** * The operation could not be performed because input values are outside * the allowed range. */ GUAC_STATUS_OUT_OF_RANGE, /** * The operation could not be performed because access to an underlying * resource is explicitly not allowed, though not necessarily due to * permissions. */ GUAC_STATUS_REFUSED, /** * The operation failed because too many resources are already in use. */ GUAC_STATUS_TOO_MANY, /** * The operation was not performed because it would otherwise block. */ GUAC_STATUS_WOULD_BLOCK } guac_status; #endif guacamole-server-0.9.9/src/libguac/guacamole/protocol-types.h0000664000175100017510000001732112536405625021241 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUAC_PROTOCOL_TYPES_H #define _GUAC_PROTOCOL_TYPES_H /** * Type definitions related to the Guacamole protocol. * * @file protocol-types.h */ /** * Set of all possible status codes returned by protocol operations. These * codes relate to Guacamole server/client communication, and not to internal * communication of errors within libguac and linked software. * * In general: * * 0x0000 - 0x00FF: Successful operations. * 0x0100 - 0x01FF: Operations that failed due to implementation status. * 0x0200 - 0x02FF: Operations that failed due to environmental. * 0x0300 - 0x03FF: Operations that failed due to user action. * * There is a general correspondence of these status codes with HTTP response * codes. */ typedef enum guac_protocol_status { /** * The operation succeeded. */ GUAC_PROTOCOL_STATUS_SUCCESS = 0x0000, /** * The requested operation is unsupported. */ GUAC_PROTOCOL_STATUS_UNSUPPORTED = 0x0100, /** * The operation could not be performed due to an internal failure. */ GUAC_PROTOCOL_STATUS_SERVER_ERROR = 0x0200, /** * The operation could not be performed due as the server is busy. */ GUAC_PROTOCOL_STATUS_SERVER_BUSY = 0x0201, /** * The operation could not be performed because the upstream server * is not responding. */ GUAC_PROTOCOL_STATUS_UPSTREAM_TIMEOUT = 0x202, /** * The operation was unsuccessful due to an error or otherwise * unexpected condition of the upstream server. */ GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR = 0x203, /** * The operation could not be performed as the requested resource * does not exist. */ GUAC_PROTOCOL_STATUS_RESOURCE_NOT_FOUND = 0x204, /** * The operation could not be performed as the requested resource is * already in use. */ GUAC_PROTOCOL_STATUS_RESOURCE_CONFLICT = 0x205, /** * The operation could not be performed because bad parameters were * given. */ GUAC_PROTOCOL_STATUS_CLIENT_BAD_REQUEST = 0x300, /** * Permission was denied to perform the operation, as the user is not * yet authorized (not yet logged in, for example). */ GUAC_PROTOCOL_STATUS_CLIENT_UNAUTHORIZED = 0x0301, /** * Permission was denied to perform the operation, and this permission * will not be granted even if the user is authorized. */ GUAC_PROTOCOL_STATUS_CLIENT_FORBIDDEN = 0x0303, /** * The client took too long to respond. */ GUAC_PROTOCOL_STATUS_CLIENT_TIMEOUT = 0x308, /** * The client sent too much data. */ GUAC_PROTOCOL_STATUS_CLIENT_OVERRUN = 0x30D, /** * The client sent data of an unsupported or unexpected type. */ GUAC_PROTOCOL_STATUS_CLIENT_BAD_TYPE = 0x30F, /** * The operation failed because the current client is already * using too many resources. */ GUAC_PROTOCOL_STATUS_CLIENT_TOO_MANY = 0x31D } guac_protocol_status; /** * Composite modes used by Guacamole draw instructions. Each * composite mode maps to a unique channel mask integer. */ typedef enum guac_composite_mode { /* * A: Source where destination transparent = S n D' * B: Source where destination opaque = S n D * C: Destination where source transparent = D n S' * D: Destination where source opaque = D n S * * 0 = Active, 1 = Inactive */ /* ABCD */ GUAC_COMP_ROUT = 0x2, /* 0010 - Clears destination where source opaque */ GUAC_COMP_ATOP = 0x6, /* 0110 - Fill where destination opaque only */ GUAC_COMP_XOR = 0xA, /* 1010 - XOR */ GUAC_COMP_ROVER = 0xB, /* 1011 - Fill where destination transparent only */ GUAC_COMP_OVER = 0xE, /* 1110 - Draw normally */ GUAC_COMP_PLUS = 0xF, /* 1111 - Add */ /* Unimplemented in client: */ /* NOT IMPLEMENTED: 0000 - Clear */ /* NOT IMPLEMENTED: 0011 - No operation */ /* NOT IMPLEMENTED: 0101 - Additive IN */ /* NOT IMPLEMENTED: 0111 - Additive ATOP */ /* NOT IMPLEMENTED: 1101 - Additive RATOP */ /* Buggy in webkit browsers, as they keep channel C on in all cases: */ GUAC_COMP_RIN = 0x1, /* 0001 */ GUAC_COMP_IN = 0x4, /* 0100 */ GUAC_COMP_OUT = 0x8, /* 1000 */ GUAC_COMP_RATOP = 0x9, /* 1001 */ GUAC_COMP_SRC = 0xC /* 1100 */ /* Bitwise composite operations (binary) */ /* * A: S' & D' * B: S' & D * C: S & D' * D: S & D * * 0 = Active, 1 = Inactive */ } guac_composite_mode; /** * Default transfer functions. There is no current facility in the * Guacamole protocol to define custom transfer functions. */ typedef enum guac_transfer_function { /* Constant functions */ /* ABCD */ GUAC_TRANSFER_BINARY_BLACK = 0x0, /* 0000 */ GUAC_TRANSFER_BINARY_WHITE = 0xF, /* 1111 */ /* Copy functions */ GUAC_TRANSFER_BINARY_SRC = 0x3, /* 0011 */ GUAC_TRANSFER_BINARY_DEST = 0x5, /* 0101 */ GUAC_TRANSFER_BINARY_NSRC = 0xC, /* 1100 */ GUAC_TRANSFER_BINARY_NDEST = 0xA, /* 1010 */ /* AND / NAND */ GUAC_TRANSFER_BINARY_AND = 0x1, /* 0001 */ GUAC_TRANSFER_BINARY_NAND = 0xE, /* 1110 */ /* OR / NOR */ GUAC_TRANSFER_BINARY_OR = 0x7, /* 0111 */ GUAC_TRANSFER_BINARY_NOR = 0x8, /* 1000 */ /* XOR / XNOR */ GUAC_TRANSFER_BINARY_XOR = 0x6, /* 0110 */ GUAC_TRANSFER_BINARY_XNOR = 0x9, /* 1001 */ /* AND / NAND with inverted source */ GUAC_TRANSFER_BINARY_NSRC_AND = 0x4, /* 0100 */ GUAC_TRANSFER_BINARY_NSRC_NAND = 0xB, /* 1011 */ /* OR / NOR with inverted source */ GUAC_TRANSFER_BINARY_NSRC_OR = 0xD, /* 1101 */ GUAC_TRANSFER_BINARY_NSRC_NOR = 0x2, /* 0010 */ /* AND / NAND with inverted destination */ GUAC_TRANSFER_BINARY_NDEST_AND = 0x2, /* 0010 */ GUAC_TRANSFER_BINARY_NDEST_NAND = 0xD, /* 1101 */ /* OR / NOR with inverted destination */ GUAC_TRANSFER_BINARY_NDEST_OR = 0xB, /* 1011 */ GUAC_TRANSFER_BINARY_NDEST_NOR = 0x4 /* 0100 */ } guac_transfer_function; /** * Supported line cap styles */ typedef enum guac_line_cap_style { GUAC_LINE_CAP_BUTT = 0x0, GUAC_LINE_CAP_ROUND = 0x1, GUAC_LINE_CAP_SQUARE = 0x2 } guac_line_cap_style; /** * Supported line join styles */ typedef enum guac_line_join_style { GUAC_LINE_JOIN_BEVEL = 0x0, GUAC_LINE_JOIN_MITER = 0x1, GUAC_LINE_JOIN_ROUND = 0x2 } guac_line_join_style; #endif guacamole-server-0.9.9/src/libguac/guacamole/instruction-constants.h0000664000175100017510000000313612643542623022627 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUAC_INSTRUCTION_CONSTANTS_H #define _GUAC_INSTRUCTION_CONSTANTS_H /** * Constants related to Guacamole instructions. * * @file instruction-constants.h */ /** * The maximum number of characters per instruction. */ #define GUAC_INSTRUCTION_MAX_LENGTH 8192 /** * The maximum number of digits to allow per length prefix. */ #define GUAC_INSTRUCTION_MAX_DIGITS 5 /** * The maximum number of elements per instruction, including the opcode. */ #define GUAC_INSTRUCTION_MAX_ELEMENTS 64 #endif guacamole-server-0.9.9/src/libguac/guacamole/socket-types.h0000664000175100017510000000337312536405625020672 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUAC_SOCKET_TYPES_H #define _GUAC_SOCKET_TYPES_H /** * Type definitions related to the guac_socket object. * * @file socket-types.h */ /** * The core I/O object of Guacamole. guac_socket provides buffered input and * output as well as convenience methods for efficiently writing base64 data. */ typedef struct guac_socket guac_socket; /** * Possible current states of a guac_socket. */ typedef enum guac_socket_state { /** * The socket is open and can be written to / read from. */ GUAC_SOCKET_OPEN, /** * The socket is closed. Reads and writes will fail. */ GUAC_SOCKET_CLOSED } guac_socket_state; #endif guacamole-server-0.9.9/src/libguac/guacamole/object.h0000664000175100017510000000577412643542623017514 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 GUAC_OBJECT_H #define GUAC_OBJECT_H /** * Provides functions and structures required for allocating and using objects. * * @file object.h */ #include "client-fntypes.h" #include "object-types.h" struct guac_object { /** * The index of this object. */ int index; /** * Arbitrary data associated with this object. */ void* data; /** * Handler for get events sent by the Guacamole web-client. * * The handler takes a guac_object, containing the object index which will * persist through the duration of the transfer, and the name of the stream * being requested. It is up to the get handler to create the required body * stream. * * Example: * @code * int get_handler(guac_client* client, guac_object* object, * char* name); * * int some_function(guac_client* client) { * * guac_object* object = guac_client_alloc_object(client); * object->get_handler = get_handler; * * } * @endcode */ guac_client_get_handler* get_handler; /** * Handler for put events sent by the Guacamole web-client. * * The handler takes a guac_object and guac_stream, which each contain their * respective indices which will persist through the duration of the * transfer, the mimetype of the data being transferred, and the name of * the stream within the object being written to. * * Example: * @code * int put_handler(guac_client* client, guac_object* object, * guac_stream* stream, char* mimetype, char* name); * * int some_function(guac_client* client) { * * guac_object* object = guac_client_alloc_object(client); * object->put_handler = put_handler; * * } * @endcode */ guac_client_put_handler* put_handler; }; #endif guacamole-server-0.9.9/src/libguac/guacamole/hash.h0000664000175100017510000000457212536405624017164 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_HASH_H #define _GUAC_HASH_H /** * Provides functions and structures for producing likely-to-be-unique hash * values for images. * * @file hash.h */ #include /** * Produces a 24-bit hash value from all pixels of the given surface. The * surface provided must be RGB or ARGB with each pixel stored in 32 bits. * The hashing algorithm used is a variant of the cyclic polynomial rolling * hash. * * @param surface The Cairo surface to hash. * @return An arbitrary 24-bit unsigned integer value intended to be well * distributed across different images. */ unsigned int guac_hash_surface(cairo_surface_t* surface); /** * Given two Cairo surfaces, returns zero if the data contained within each * is identical, and a positive or negative value if the value of the first * is found to be lexically greater or less than the second respectively. * * @param a The first Cairo surface to compare. * @param b The Cairo surface to compare the first surface against. * @return Zero if the data contained within each is identical, and a positive * or negative value if the value of the first is found to be lexically * greater or less than the second respectively. */ int guac_surface_cmp(cairo_surface_t* a, cairo_surface_t* b); #endif guacamole-server-0.9.9/src/libguac/guacamole/socket-fntypes.h0000664000175100017510000000662712643542623021222 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUAC_SOCKET_FNTYPES_H #define _GUAC_SOCKET_FNTYPES_H /** * Function type definitions related to the guac_socket object. * * @file socket-fntypes.h */ #include "socket-types.h" #include /** * Generic read handler for socket read operations, modeled after the standard * POSIX read() function. When set within a guac_socket, a handler of this type * will be called when data needs to be read into the socket. * * @param socket The guac_socket being read from. * @param buf The arbitrary buffer we must populate with data. * @param count The maximum number of bytes to read into the buffer. * @return The number of bytes read, or -1 if an error occurs. */ typedef ssize_t guac_socket_read_handler(guac_socket* socket, void* buf, size_t count); /** * Generic write handler for socket write operations, modeled after the standard * POSIX write() function. When set within a guac_socket, a handler of this type * will be called when data needs to be write into the socket. * * @param socket The guac_socket being written to. * @param buf The arbitrary buffer containing data to be written. * @param count The maximum number of bytes to write from the buffer. * @return The number of bytes written, or -1 if an error occurs. */ typedef ssize_t guac_socket_write_handler(guac_socket* socket, const void* buf, size_t count); /** * Generic handler for socket select operations, similar to the POSIX select() * function. When guac_socket_select() is called on a guac_socket, its * guac_socket_select_handler will be invoked, if defined. * * @param socket The guac_socket being selected. * @param usec_timeout The maximum number of microseconds to wait for data, or * -1 to potentially wait forever. * @return Positive on success, zero if the timeout elapsed and no data is * available, negative on error. */ typedef int guac_socket_select_handler(guac_socket* socket, int usec_timeout); /** * Generic handler for the closing of a socket, modeled after the standard * POSIX close() function. When set within a guac_socket, a handler of this type * will be called when the socket is closed. * * @param socket The guac_socket being closed. * @return Zero on success, or -1 if an error occurs. */ typedef int guac_socket_free_handler(guac_socket* socket); #endif guacamole-server-0.9.9/src/libguac/guacamole/client.h0000664000175100017510000006455312643542623017524 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_CLIENT_H #define _GUAC_CLIENT_H /** * Functions and structure contents for the Guacamole proxy client. * * @file client.h */ #include "client-fntypes.h" #include "client-types.h" #include "client-constants.h" #include "instruction-types.h" #include "layer-types.h" #include "object-types.h" #include "pool-types.h" #include "socket-types.h" #include "stream-types.h" #include "timestamp-types.h" #include #include struct guac_client_info { /** * The number of pixels the remote client requests for the display width. * This need not be honored by a client plugin implementation, but if the * underlying protocol of the client plugin supports dynamic sizing of the * screen, honoring the display size request is recommended. */ int optimal_width; /** * The number of pixels the remote client requests for the display height. * This need not be honored by a client plugin implementation, but if the * underlying protocol of the client plugin supports dynamic sizing of the * screen, honoring the display size request is recommended. */ int optimal_height; /** * NULL-terminated array of client-supported audio mimetypes. If the client * does not support audio at all, this will be NULL. */ char** audio_mimetypes; /** * NULL-terminated array of client-supported video mimetypes. If the client * does not support video at all, this will be NULL. */ char** video_mimetypes; /** * NULL-terminated array of client-supported image mimetypes. Though all * supported image mimetypes will be listed here, it can be safely assumed * that all clients will support at least "image/png" and "image/jpeg". */ char** image_mimetypes; /** * The DPI of the physical remote display if configured for the optimal * width/height combination described here. This need not be honored by * a client plugin implementation, but if the underlying protocol of the * client plugin supports dynamic sizing of the screen, honoring the * stated resolution of the display size request is recommended. */ int optimal_resolution; }; struct guac_client { /** * The guac_socket structure to be used to communicate with the web-client. * It is expected that the implementor of any Guacamole proxy client will * provide their own mechanism of I/O for their protocol. The guac_socket * structure is used only to communicate conveniently with the Guacamole * web-client. */ guac_socket* socket; /** * The current state of the client. When the client is first allocated, * this will be initialized to GUAC_CLIENT_RUNNING. It will remain at * GUAC_CLIENT_RUNNING until an event occurs which requires the client to * shutdown, at which point the state becomes GUAC_CLIENT_STOPPING. */ guac_client_state state; /** * The time (in milliseconds) of receipt of the last sync message from * the client. */ guac_timestamp last_received_timestamp; /** * The time (in milliseconds) that the last sync message was sent to the * client. */ guac_timestamp last_sent_timestamp; /** * Information structure containing properties exposed by the remote * client during the initial handshake process. */ guac_client_info info; /** * Arbitrary reference to proxy client-specific data. Implementors of a * Guacamole proxy client can store any data they want here, which can then * be retrieved as necessary in the message handlers. */ void* data; /** * Handler for server messages. If set, this function will be called * occasionally by the Guacamole proxy to give the client a chance to * handle messages from whichever server it is connected to. * * Example: * @code * int handle_messages(guac_client* client); * * int guac_client_init(guac_client* client, int argc, char** argv) { * client->handle_messages = handle_messages; * } * @endcode */ guac_client_handle_messages* handle_messages; /** * Handler for mouse events sent by the Gaucamole web-client. * * The handler takes the integer mouse X and Y coordinates, as well as * a button mask containing the bitwise OR of all button values currently * being pressed. Those values are: * * * * * * * * *
Button Value
Left 1
Middle 2
Right 4
Scrollwheel Up 8
Scrollwheel Down16
* Example: * @code * int mouse_handler(guac_client* client, int x, int y, int button_mask); * * int guac_client_init(guac_client* client, int argc, char** argv) { * client->mouse_handler = mouse_handler; * } * @endcode */ guac_client_mouse_handler* mouse_handler; /** * Handler for key events sent by the Guacamole web-client. * * The handler takes the integer X11 keysym associated with the key * being pressed/released, and an integer representing whether the key * is being pressed (1) or released (0). * * Example: * @code * int key_handler(guac_client* client, int keysym, int pressed); * * int guac_client_init(guac_client* client, int argc, char** argv) { * client->key_handler = key_handler; * } * @endcode */ guac_client_key_handler* key_handler; /** * Handler for clipboard events sent by the Guacamole web-client. This * handler will be called whenever the web-client sets the data of the * clipboard. * * The handler takes a guac_stream, which contains the stream index and * will persist through the duration of the transfer, and the mimetype * of the data being transferred. * * Example: * @code * int clipboard_handler(guac_client* client, guac_stream* stream, * char* mimetype); * * int guac_client_init(guac_client* client, int argc, char** argv) { * client->clipboard_handler = clipboard_handler; * } * @endcode */ guac_client_clipboard_handler* clipboard_handler; /** * Handler for size events sent by the Guacamole web-client. * * The handler takes an integer width and integer height, representing * the current visible screen area of the client. * * Example: * @code * int size_handler(guac_client* client, int width, int height); * * int guac_client_init(guac_client* client, int argc, char** argv) { * client->size_handler = size_handler; * } * @endcode */ guac_client_size_handler* size_handler; /** * Handler for file events sent by the Guacamole web-client. * * The handler takes a guac_stream which contains the stream index and * will persist through the duration of the transfer, the mimetype of * the file being transferred, and the filename. * * Example: * @code * int file_handler(guac_client* client, guac_stream* stream, * char* mimetype, char* filename); * * int guac_client_init(guac_client* client, int argc, char** argv) { * client->file_handler = file_handler; * } * @endcode */ guac_client_file_handler* file_handler; /** * Handler for pipe events sent by the Guacamole web-client. * * The handler takes a guac_stream which contains the stream index and * will persist through the duration of the transfer, the mimetype of * the data being transferred, and the pipe name. * * Example: * @code * int pipe_handler(guac_client* client, guac_stream* stream, * char* mimetype, char* name); * * int guac_client_init(guac_client* client, int argc, char** argv) { * client->pipe_handler = pipe_handler; * } * @endcode */ guac_client_pipe_handler* pipe_handler; /** * Handler for ack events sent by the Guacamole web-client. * * The handler takes a guac_stream which contains the stream index and * will persist through the duration of the transfer, a string containing * the error or status message, and a status code. * * Example: * @code * int ack_handler(guac_client* client, guac_stream* stream, * char* error, guac_protocol_status status); * * int guac_client_init(guac_client* client, int argc, char** argv) { * client->ack_handler = ack_handler; * } * @endcode */ guac_client_ack_handler* ack_handler; /** * Handler for blob events sent by the Guacamole web-client. * * The handler takes a guac_stream which contains the stream index and * will persist through the duration of the transfer, an arbitrary buffer * containing the blob, and the length of the blob. * * Example: * @code * int blob_handler(guac_client* client, guac_stream* stream, * void* data, int length); * * int guac_client_init(guac_client* client, int argc, char** argv) { * client->blob_handler = blob_handler; * } * @endcode */ guac_client_blob_handler* blob_handler; /** * Handler for stream end events sent by the Guacamole web-client. * * The handler takes only a guac_stream which contains the stream index. * This guac_stream will be disposed of immediately after this event is * finished. * * Example: * @code * int end_handler(guac_client* client, guac_stream* stream); * * int guac_client_init(guac_client* client, int argc, char** argv) { * client->end_handler = end_handler; * } * @endcode */ guac_client_end_handler* end_handler; /** * Handler for freeing data when the client is being unloaded. * * This handler will be called when the client needs to be unloaded * by the proxy, and any data allocated by the proxy client should be * freed. * * Note that this handler will NOT be called if the client's * guac_client_init() function fails. * * Implement this handler if you store data inside the client. * * Example: * @code * int free_handler(guac_client* client); * * int guac_client_init(guac_client* client, int argc, char** argv) { * client->free_handler = free_handler; * } * @endcode */ guac_client_free_handler* free_handler; /** * Logging handler. This handler will be called via guac_client_log() when * the client needs to log messages of any type. * * In general, only programs loading the client should implement this * handler, as those are the programs that would provide the logging * facilities. * * Client implementations should expect these handlers to already be * set. * * Example: * @code * void log_handler(guac_client* client, guac_client_log_level level, const char* format, va_list args); * * void function_of_daemon() { * * guac_client* client = [pass log_handler to guac_client_plugin_get_client()]; * * } * @endcode */ guac_client_log_handler* log_handler; /** * Handler for get events sent by the Guacamole web-client. * * The handler takes a guac_object, containing the object index which will * persist through the duration of the transfer, and the name of the stream * being requested. It is up to the get handler to create the required body * stream. * * Example: * @code * int get_handler(guac_client* client, guac_object* object, * char* name); * * int guac_client_init(guac_client* client, int argc, char** argv) { * client->get_handler = get_handler; * } * @endcode */ guac_client_get_handler* get_handler; /** * Handler for put events sent by the Guacamole web-client. * * The handler takes a guac_object and guac_stream, which each contain their * respective indices which will persist through the duration of the * transfer, the mimetype of the data being transferred, and the name of * the stream within the object being written to. * * Example: * @code * int put_handler(guac_client* client, guac_object* object, * guac_stream* stream, char* mimetype, char* name); * * int guac_client_init(guac_client* client, int argc, char** argv) { * client->put_handler = put_handler; * } * @endcode */ guac_client_put_handler* put_handler; /** * Pool of buffer indices. Buffers are simply layers with negative indices. * Note that because guac_pool always gives non-negative indices starting * at 0, the output of this guac_pool will be adjusted. */ guac_pool* __buffer_pool; /** * Pool of layer indices. Note that because guac_pool always gives * non-negative indices starting at 0, the output of this guac_pool will * be adjusted. */ guac_pool* __layer_pool; /** * Pool of stream indices. */ guac_pool* __stream_pool; /** * All available output streams (data going to connected client). */ guac_stream* __output_streams; /** * All available input streams (data coming from connected client). */ guac_stream* __input_streams; /** * Pool of object indices. */ guac_pool* __object_pool; /** * All available objects (arbitrary sets of named streams). */ guac_object* __objects; /** * The unique identifier allocated for the connection, which may * be used within the Guacamole protocol to refer to this connection. * This identifier is guaranteed to be unique from all existing * connections and will not collide with any available protocol * names. */ char* connection_id; }; /** * Returns a new, barebones guac_client. This new guac_client has no handlers * set, but is otherwise usable. * * @return A pointer to the new client. */ guac_client* guac_client_alloc(); /** * Free all resources associated with the given client. * * @param client The proxy client to free all reasources of. */ void guac_client_free(guac_client* client); /** * Call the appropriate handler defined by the given client for the given * instruction. A comparison is made between the instruction opcode and the * initial handler lookup table defined in client-handlers.c. The intial * handlers will in turn call the client's handler (if defined). * * @param client * The proxy client whose handlers should be called. * * @param instruction * The instruction to pass to the proxy client via the appropriate handler. * * @return * Non-negative if the instruction was handled successfully, or negative * if an error occurred. */ int guac_client_handle_instruction(guac_client* client, guac_instruction* instruction); /** * Writes a message in the log used by the given client. The logger used will * normally be defined by guacd (or whichever program loads the proxy client) * by setting the logging handlers of the client when it is loaded. * * @param client The proxy client logging this message. * @param level The level at which to log this message. * @param format A printf-style format string to log. * @param ... Arguments to use when filling the format string for printing. */ void guac_client_log(guac_client* client, guac_client_log_level level, const char* format, ...); /** * Writes a message in the log used by the given client. The logger used will * normally be defined by guacd (or whichever program loads the proxy client) * by setting the logging handlers of the client when it is loaded. * * @param client The proxy client logging this message. * @param level The level at which to log this message. * @param format A printf-style format string to log. * @param ap The va_list containing the arguments to be used when filling the * format string for printing. */ void vguac_client_log(guac_client* client, guac_client_log_level level, const char* format, va_list ap); /** * Signals the given client to stop gracefully. This is a completely * cooperative signal, and can be ignored by the client or the hosting * daemon. * * @param client The proxy client to signal to stop. */ void guac_client_stop(guac_client* client); /** * Signals the given client to stop gracefully, while also signalling via the * Guacamole protocol that an error has occurred. Note that this is a completely * cooperative signal, and can be ignored by the client or the hosting * daemon. The message given will be logged to the system logs. * * @param client The proxy client to signal to stop. * @param status The status to send over the Guacamole protocol. * @param format A printf-style format string to log. * @param ... Arguments to use when filling the format string for printing. */ void guac_client_abort(guac_client* client, guac_protocol_status status, const char* format, ...); /** * Signals the given client to stop gracefully, while also signalling via the * Guacamole protocol that an error has occurred. Note that this is a completely * cooperative signal, and can be ignored by the client or the hosting * daemon. The message given will be logged to the system logs. * * @param client The proxy client to signal to stop. * @param status The status to send over the Guacamole protocol. * @param format A printf-style format string to log. * @param ap The va_list containing the arguments to be used when filling the * format string for printing. */ void vguac_client_abort(guac_client* client, guac_protocol_status status, const char* format, va_list ap); /** * Allocates a new buffer (invisible layer). An arbitrary index is * automatically assigned if no existing buffer is available for use. * * @param client The proxy client to allocate the buffer for. * @return The next available buffer, or a newly allocated buffer. */ guac_layer* guac_client_alloc_buffer(guac_client* client); /** * Allocates a new layer. An arbitrary index is automatically assigned * if no existing layer is available for use. * * @param client The proxy client to allocate the layer buffer for. * @return The next available layer, or a newly allocated layer. */ guac_layer* guac_client_alloc_layer(guac_client* client); /** * Returns the given buffer to the pool of available buffers, such that it * can be reused by any subsequent call to guac_client_allow_buffer(). * * @param client The proxy client to return the buffer to. * @param layer The buffer to return to the pool of available buffers. */ void guac_client_free_buffer(guac_client* client, guac_layer* layer); /** * Returns the given layer to the pool of available layers, such that it * can be reused by any subsequent call to guac_client_allow_layer(). * * @param client The proxy client to return the layer to. * @param layer The buffer to return to the pool of available layer. */ void guac_client_free_layer(guac_client* client, guac_layer* layer); /** * Allocates a new stream. An arbitrary index is automatically assigned * if no previously-allocated stream is available for use. * * @param client The proxy client to allocate the layer buffer for. * @return The next available stream, or a newly allocated stream. */ guac_stream* guac_client_alloc_stream(guac_client* client); /** * Returns the given stream to the pool of available streams, such that it * can be reused by any subsequent call to guac_client_alloc_stream(). * * @param client The proxy client to return the buffer to. * @param stream The stream to return to the pool of available stream. */ void guac_client_free_stream(guac_client* client, guac_stream* stream); /** * Allocates a new object. An arbitrary index is automatically assigned * if no previously-allocated object is available for use. * * @param client * The proxy client to allocate the object for. * * @return * The next available object, or a newly allocated object. */ guac_object* guac_client_alloc_object(guac_client* client); /** * Returns the given object to the pool of available objects, such that it * can be reused by any subsequent call to guac_client_alloc_object(). * * @param client * The proxy client to return the object to. * * @param object * The object to return to the pool of available object. */ void guac_client_free_object(guac_client* client, guac_object* object); /** * Streams the image data of the given surface over an image stream ("img" * instruction) as PNG-encoded data. The image stream will be automatically * allocated and freed. * * @param client * The Guacamole client from which the image stream should be allocated. * * @param socket * The socket over which instructions associated with the image stream * should be sent. * * @param mode * The composite mode to use when rendering the image over the given layer. * * @param layer * The destination layer. * * @param x * The X coordinate of the upper-left corner of the destination rectangle * within the given layer. * * @param y * The Y coordinate of the upper-left corner of the destination rectangle * within the given layer. * * @param surface * A Cairo surface containing the image data to be streamed. */ void guac_client_stream_png(guac_client* client, guac_socket* socket, guac_composite_mode mode, const guac_layer* layer, int x, int y, cairo_surface_t* surface); /** * Streams the image data of the given surface over an image stream ("img" * instruction) as JPEG-encoded data at the given quality. The image stream * will be automatically allocated and freed. * * @param client * The Guacamole client from which the image stream should be allocated. * * @param socket * The socket over which instructions associated with the image stream * should be sent. * * @param mode * The composite mode to use when rendering the image over the given layer. * * @param layer * The destination layer. * * @param x * The X coordinate of the upper-left corner of the destination rectangle * within the given layer. * * @param y * The Y coordinate of the upper-left corner of the destination rectangle * within the given layer. * * @param surface * A Cairo surface containing the image data to be streamed. * * @param quality * The JPEG image quality, which must be an integer value between 0 and * 100 inclusive. */ void guac_client_stream_jpeg(guac_client* client, guac_socket* socket, guac_composite_mode mode, const guac_layer* layer, int x, int y, cairo_surface_t* surface, int quality); /** * Streams the image data of the given surface over an image stream ("img" * instruction) as WebP-encoded data at the given quality. The image stream * will be automatically allocated and freed. If the server does not support * WebP, this function has no effect, so be sure to check the result of * guac_client_supports_webp() prior to calling this function. * * @param client * The Guacamole client from which the image stream should be allocated. * * @param socket * The socket over which instructions associated with the image stream * should be sent. * * @param mode * The composite mode to use when rendering the image over the given layer. * * @param layer * The destination layer. * * @param x * The X coordinate of the upper-left corner of the destination rectangle * within the given layer. * * @param y * The Y coordinate of the upper-left corner of the destination rectangle * within the given layer. * * @param surface * A Cairo surface containing the image data to be streamed. * * @param quality * The WebP image quality, which must be an integer value between 0 and 100 * inclusive. For lossy images, larger values indicate improving quality at * the expense of larger file size. For lossless images, this dictates the * quality of compression, with larger values producing smaller files at * the expense of speed. * * @param lossless * Zero to encode a lossy image, non-zero to encode losslessly. */ void guac_client_stream_webp(guac_client* client, guac_socket* socket, guac_composite_mode mode, const guac_layer* layer, int x, int y, cairo_surface_t* surface, int quality, int lossless); /** * Returns whether the given client supports WebP. If the client does not * support WebP, or the server cannot encode WebP images, zero is returned. * * @param client * The Guacamole client to check for WebP support. * * @return * Non-zero if the given client claims to support WebP and the server has * been built with WebP support, zero otherwise. */ int guac_client_supports_webp(guac_client* client); /** * The default Guacamole client layer, layer 0. */ extern const guac_layer* GUAC_DEFAULT_LAYER; #endif guacamole-server-0.9.9/src/libguac/guacamole/plugin.h0000664000175100017510000000625312643542623017535 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_PLUGIN_H #define _GUAC_PLUGIN_H #include "client-types.h" #include "plugin-constants.h" #include "plugin-types.h" /** * Provides functions and structures required for handling a client plugin. * * @file plugin.h */ struct guac_client_plugin { /** * Reference to dlopen'd client plugin. */ void* __client_plugin_handle; /** * Reference to the init handler of this client plugin. This * function will be called when the client plugin is started. */ guac_client_init_handler* init_handler; /** * NULL-terminated array of all arguments accepted by this client * plugin, in order. The values of these arguments will be passed * to the init_handler if the client plugin is started. */ const char** args; }; /** * Open the plugin which provides support for the given protocol, if it * exists. * * @param protocol The name of the protocol to retrieve the client plugin * for. * @return The client plugin supporting the given protocol, or NULL if * an error occurs or no such plugin exists. */ guac_client_plugin* guac_client_plugin_open(const char* protocol); /** * Close the given plugin, releasing all associated resources. This function * must be called after use of a client plugin is finished. * * @param plugin The client plugin to close. * @return Zero on success, non-zero if an error occurred while releasing * the resources associated with the plugin. */ int guac_client_plugin_close(guac_client_plugin* plugin); /** * Initializes the given guac_client using the initialization routine provided * by the given guac_client_plugin. * * @param plugin The client plugin to use to initialize the new client. * @param client The guac_client to initialize. * @param argc The number of arguments being passed to the client. * @param argv All arguments to be passed to the client. * @return Zero if initialization was successful, non-zero otherwise. */ int guac_client_plugin_init_client(guac_client_plugin* plugin, guac_client* client, int argc, char** argv); #endif guacamole-server-0.9.9/src/libguac/guacamole/plugin-types.h0000664000175100017510000000301112643542623020664 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUAC_PLUGIN_TYPES_H #define _GUAC_PLUGIN_TYPES_H /** * Type definitions related to client plugins. * * @file plugin-types.h */ /** * A handle to a client plugin, containing enough information about the * plugin to complete the initial protocol handshake and instantiate a new * client supporting the protocol provided by the client plugin. */ typedef struct guac_client_plugin guac_client_plugin; #endif guacamole-server-0.9.9/src/libguac/guacamole/plugin-constants.h0000664000175100017510000000471612536405624021551 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUAC_PLUGIN_CONSTANTS_H #define _GUAC_PLUGIN_CONSTANTS_H /** * Constants related to client plugins. * * @file plugin-constants.h */ /** * String prefix which begins the library filename of all client plugins. */ #define GUAC_PROTOCOL_LIBRARY_PREFIX "libguac-client-" /** * String suffix which ends the library filename of all client plugins. */ #define GUAC_PROTOCOL_LIBRARY_SUFFIX ".so" /** * The maximum number of characters (COUNTING NULL TERMINATOR) to allow * for protocol names within the library filename of client plugins. */ #define GUAC_PROTOCOL_NAME_LIMIT 256 /** * The maximum number of characters (INCLUDING NULL TERMINATOR) that a * character array containing the concatenation of the library prefix, * protocol name, and suffix can contain, assuming the protocol name is * limited to GUAC_PROTOCOL_NAME_LIMIT characters. */ #define GUAC_PROTOCOL_LIBRARY_LIMIT ( \ \ sizeof(GUAC_PROTOCOL_LIBRARY_PREFIX) - 1 /* "libguac-client-" */ \ + GUAC_PROTOCOL_NAME_LIMIT - 1 /* [up to 256 chars] */ \ + sizeof(GUAC_PROTOCOL_LIBRARY_SUFFIX) - 1 /* ".so" */ \ + 1 /* NULL terminator */ \ \ ) #endif guacamole-server-0.9.9/src/libguac/guacamole/layer-types.h0000664000175100017510000000253712536405624020516 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUAC_LAYER_TYPES_H #define _GUAC_LAYER_TYPES_H /** * Type definitions related to Guacamole layers. * * @file layer-types.h */ /** * Represents a single layer within the Guacamole protocol. */ typedef struct guac_layer guac_layer; #endif guacamole-server-0.9.9/src/libguac/guacamole/audio-fntypes.h0000664000175100017510000000364512626724073021032 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 __GUAC_AUDIO_FNTYPES_H #define __GUAC_AUDIO_FNTYPES_H /** * Function type definitions related to simple streaming audio. * * @file audio-fntypes.h */ #include "audio-types.h" /** * Handler which is called when the audio stream is opened. */ typedef void guac_audio_encoder_begin_handler(guac_audio_stream* audio); /** * Handler which is called when the audio stream needs to be flushed. */ typedef void guac_audio_encoder_flush_handler(guac_audio_stream* audio); /** * Handler which is called when the audio stream is closed. */ typedef void guac_audio_encoder_end_handler(guac_audio_stream* audio); /** * Handler which is called when PCM data is written to the audio stream. */ typedef void guac_audio_encoder_write_handler(guac_audio_stream* audio, const unsigned char* pcm_data, int length); #endif guacamole-server-0.9.9/src/libguac/guacamole/audio-types.h0000664000175100017510000000313112626724073020474 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 __GUAC_AUDIO_TYPES_H #define __GUAC_AUDIO_TYPES_H /** * Type definitions related to simple streaming audio. * * @file audio-types.h */ /** * Basic audio stream. PCM data is added to the stream. When the stream is * flushed, a write handler receives PCM data packets and, presumably, streams * them to the guac_stream provided. */ typedef struct guac_audio_stream guac_audio_stream; /** * Arbitrary audio codec encoder. */ typedef struct guac_audio_encoder guac_audio_encoder; #endif guacamole-server-0.9.9/src/libguac/guacamole/client-fntypes.h0000664000175100017510000000776512643542623021214 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUAC_CLIENT_FNTYPES_H #define _GUAC_CLIENT_FNTYPES_H /** * Function type definitions related to the Guacamole client structure, * guac_client. * * @file client-fntypes.h */ #include "client-types.h" #include "object-types.h" #include "protocol-types.h" #include "stream-types.h" #include /** * Handler for server messages (where "server" refers to the server that * the proxy client is connected to). */ typedef int guac_client_handle_messages(guac_client* client); /** * Handler for Guacamole mouse events. */ typedef int guac_client_mouse_handler(guac_client* client, int x, int y, int button_mask); /** * Handler for Guacamole key events. */ typedef int guac_client_key_handler(guac_client* client, int keysym, int pressed); /** * Handler for Guacamole clipboard events. */ typedef int guac_client_clipboard_handler(guac_client* client, guac_stream* stream, char* mimetype); /** * Handler for Guacamole screen size events. */ typedef int guac_client_size_handler(guac_client* client, int width, int height); /** * Handler for Guacamole file transfer events. */ typedef int guac_client_file_handler(guac_client* client, guac_stream* stream, char* mimetype, char* filename); /** * Handler for Guacamole pipe events. */ typedef int guac_client_pipe_handler(guac_client* client, guac_stream* stream, char* mimetype, char* name); /** * Handler for Guacamole stream blob events. */ typedef int guac_client_blob_handler(guac_client* client, guac_stream* stream, void* data, int length); /** * Handler for Guacamole stream ack events. */ typedef int guac_client_ack_handler(guac_client* client, guac_stream* stream, char* error, guac_protocol_status status); /** * Handler for Guacamole stream end events. */ typedef int guac_client_end_handler(guac_client* client, guac_stream* stream); /** * Handler for Guacamole object get events. */ typedef int guac_client_get_handler(guac_client* client, guac_object* object, char* name); /** * Handler for Guacamole object put events. */ typedef int guac_client_put_handler(guac_client* client, guac_object* object, guac_stream* stream, char* mimetype, char* name); /** * Handler for Guacamole audio format events. */ typedef int guac_client_audio_handler(guac_client* client, char* mimetype); /** * Handler for Guacamole video format events. */ typedef int guac_client_video_handler(guac_client* client, char* mimetype); /** * Handler for freeing up any extra data allocated by the client * implementation. */ typedef int guac_client_free_handler(guac_client* client); /** * Handler for logging messages */ typedef void guac_client_log_handler(guac_client* client, guac_client_log_level level, const char* format, va_list args); /** * Handler which should initialize the given guac_client. */ typedef int guac_client_init_handler(guac_client* client, int argc, char** argv); #endif guacamole-server-0.9.9/src/libguac/guacamole/pool-types.h0000664000175100017510000000323612536405624020350 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUAC_POOL_TYPES_H #define _GUAC_POOL_TYPES_H /** * Type definitions related to the guac_pool pool of unique integers. * * @file pool-types.h */ /** * Represents a single integer within a larger pool of integers. */ typedef struct guac_pool_int guac_pool_int; /** * A pool of integers. Integers can be removed from and later free'd back * into the pool. New integers are returned when the pool is exhausted, * or when the pool has not met some minimum size. Old, free'd integers * are returned otherwise. */ typedef struct guac_pool guac_pool; #endif guacamole-server-0.9.9/src/libguac/guacamole/unicode.h0000664000175100017510000000612212536405625017661 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_UNICODE_H #define _GUAC_UNICODE_H /** * Provides functions for manipulating Unicode strings. * * @file unicode.h */ #include /** * Given the initial byte of a single UTF-8 character, returns the overall * byte size of the entire character. * * @param c The initial byte of the character to check. * @return The number of bytes in the given character overall. */ size_t guac_utf8_charsize(unsigned char c); /** * Given a UTF-8-encoded string, returns the length of the string in characters * (not bytes). * * @param str The UTF-8 string to calculate the length of. * @return The length in characters of the given UTF-8 string. */ size_t guac_utf8_strlen(const char* str); /** * Given destination buffer and its length, writes the given codepoint as UTF-8 * to the buffer, returning the number of bytes written. If there is not enough * space in the buffer to write the character, no bytes are written at all. * * @param codepoint The Unicode codepoint to write to the buffer. * @param utf8 The buffer to write to. * @param length The length of the buffer, in bytes. * @return The number of bytes written, which may be zero if there is not * enough space in the buffer to write the UTF-8 character. */ int guac_utf8_write(int codepoint, char* utf8, int length); /** * Given a buffer containing UTF-8 characters, reads the first codepoint in the * buffer, returning the length of the codepoint in bytes. If no codepoint * could be read, zero is returned. * * @param utf8 A buffer containing UTF-8 characters. * @param length The length of the buffer, in bytes. * @param codepoint A pointer to an integer which will contain the codepoint * read, if any. If no character can be read, the integer * will be left untouched. * @return The number of bytes read, which may be zero if there is not enough * space in the buffer to read a character. */ int guac_utf8_read(const char* utf8, int length, int* codepoint); #endif guacamole-server-0.9.9/src/libguac/guacamole/socket.h0000664000175100017510000003055012643542623017524 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_SOCKET_H #define _GUAC_SOCKET_H /** * Defines the guac_socket object and functionss for using and manipulating it. * * @file socket.h */ #include "socket-constants.h" #include "socket-fntypes.h" #include "socket-types.h" #include "timestamp-types.h" #include #include #include struct guac_socket { /** * Arbitrary socket-specific data. */ void* data; /** * Handler which will be called when data needs to be read from the socket. */ guac_socket_read_handler* read_handler; /** * Handler which will be called whenever data is written to this socket. * Note that because guac_socket automatically buffers written data, this * handler might only get called when the socket is flushed. */ guac_socket_write_handler* write_handler; /** * Handler which will be called whenever guac_socket_select is invoked * on this socket. */ guac_socket_select_handler* select_handler; /** * Handler which will be called when the socket is free'd (closed). */ guac_socket_free_handler* free_handler; /** * The current state of this guac_socket. */ guac_socket_state state; /** * The timestamp associated with the time the last block of data was * written to this guac_socket. */ guac_timestamp last_write_timestamp; /** * The number of bytes present in the base64 "ready" buffer. */ int __ready; /** * The base64 "ready" buffer. Once this buffer is filled, base64 data is * flushed to the main write buffer. */ int __ready_buf[3]; /** * The number of bytes currently in the main write buffer. */ int __written; /** * The main write buffer. Bytes written go here before being flushed * to the open file descriptor. */ char __out_buf[GUAC_SOCKET_OUTPUT_BUFFER_SIZE]; /** * Pointer to the first character of the current in-progress instruction * within the buffer. */ char* __instructionbuf_unparsed_start; /** * Pointer to the first unused section of the instruction buffer. */ char* __instructionbuf_unparsed_end; /** * The instruction buffer. This is essentially the input buffer, * provided as a convenience to be used to buffer instructions until * those instructions are complete and ready to be parsed. */ char __instructionbuf[32768]; /** * Whether instructions should be guaranteed atomic across threads using * locks. By default, thread safety is disabled on sockets. */ int __threadsafe_instructions; /** * Lock which is acquired when an instruction is being written, and * released when the instruction is finished being written. */ pthread_mutex_t __instruction_write_lock; /** * Lock which is acquired when the buffer is being modified or flushed. */ pthread_mutex_t __buffer_lock; /** * Whether automatic keep-alive is enabled. */ int __keep_alive_enabled; /** * The keep-alive thread. */ pthread_t __keep_alive_thread; }; /** * Allocates a new, completely blank guac_socket. This guac_socket will do * absolutely nothing when used unless its handlers are defined. * * @returns A newly-allocated guac_socket, or NULL if the guac_socket could * not be allocated. */ guac_socket* guac_socket_alloc(); /** * Frees the given guac_socket and all associated resources. * * @param socket The guac_socket to free. */ void guac_socket_free(guac_socket* socket); /** * Declares that the given socket must behave in a threadsafe way. Calling * this function on a socket guarantees that the socket will send instructions * atomically. Without automatic threadsafe sockets, multiple threads writing * to the same socket must ensure that instructions will not potentially * overlap. * * @param socket The guac_socket to declare as threadsafe. */ void guac_socket_require_threadsafe(guac_socket* socket); /** * Declares that the given socket must automatically send a keep-alive ping * to ensure neither side of the socket times out while the socket is open. * This ping will take the form of a "nop" instruction. Enabling keep-alive * automatically enables threadsafety. * * @param socket The guac_socket to declare as requiring an automatic * keep-alive ping. */ void guac_socket_require_keep_alive(guac_socket* socket); /** * Marks the beginning of a Guacamole protocol instruction. If threadsafety * is enabled on the socket, other instructions will be blocked from sending * until this instruction is complete. * * @param socket The guac_socket beginning an instruction. */ void guac_socket_instruction_begin(guac_socket* socket); /** * Marks the end of a Guacamole protocol instruction. If threadsafety * is enabled on the socket, other instructions will be allowed to send. * * @param socket The guac_socket ending an instruction. */ void guac_socket_instruction_end(guac_socket* socket); /** * Marks the beginning of a socket's buffer modification. If threadsafety is * enabled on the socket, other functions which modify the buffer will be * blocked until this modification is complete. * * @param socket The guac_socket whose buffer is being updated. */ void guac_socket_update_buffer_begin(guac_socket* socket); /** * Marks the end of a socket's buffer modification. If threadsafety is enabled * on the socket, other functions which modify the buffer will now be allowed * to continue. * * @param socket The guac_socket whose buffer is done being updated. */ void guac_socket_update_buffer_end(guac_socket* socket); /** * Allocates and initializes a new guac_socket object with the given open * file descriptor. * * If an error occurs while allocating the guac_socket object, NULL is returned, * and guac_error is set appropriately. * * @param fd An open file descriptor that this guac_socket object should manage. * @return A newly allocated guac_socket object associated with the given * file descriptor, or NULL if an error occurs while allocating * the guac_socket object. */ guac_socket* guac_socket_open(int fd); /** * Allocates and initializes a new guac_socket which writes all data via * nest instructions to the given existing, open guac_socket. * * If an error occurs while allocating the guac_socket object, NULL is returned, * and guac_error is set appropriately. * * @param parent The guac_socket this new guac_socket should write nest * instructions to. * @param index The stream index to use for the written nest instructions. * @return A newly allocated guac_socket object associated with the given * guac_socket and stream index, or NULL if an error occurs while * allocating the guac_socket object. */ guac_socket* guac_socket_nest(guac_socket* parent, int index); /** * Writes the given unsigned int to the given guac_socket object. The data * written may be buffered until the buffer is flushed automatically or * manually. * * If an error occurs while writing, a non-zero value is returned, and * guac_error is set appropriately. * * @param socket The guac_socket object to write to. * @param i The unsigned int to write. * @return Zero on success, or non-zero if an error occurs while writing. */ ssize_t guac_socket_write_int(guac_socket* socket, int64_t i); /** * Writes the given string to the given guac_socket object. The data * written may be buffered until the buffer is flushed automatically or * manually. Note that if the string can contain characters used * internally by the Guacamole protocol (commas, semicolons, or * backslashes) it will need to be escaped. * * If an error occurs while writing, a non-zero value is returned, and * guac_error is set appropriately. * * @param socket The guac_socket object to write to. * @param str The string to write. * @return Zero on success, or non-zero if an error occurs while writing. */ ssize_t guac_socket_write_string(guac_socket* socket, const char* str); /** * Writes the given binary data to the given guac_socket object as base64- * encoded data. The data written may be buffered until the buffer is flushed * automatically or manually. Beware that because base64 data is buffered * on top of the write buffer already used, a call to guac_socket_flush_base64() * must be made before non-base64 writes (or writes of an independent block of * base64 data) can be made. * * If an error occurs while writing, a non-zero value is returned, and * guac_error is set appropriately. * * @param socket The guac_socket object to write to. * @param buf A buffer containing the data to write. * @param count The number of bytes to write. * @return Zero on success, or non-zero if an error occurs while writing. */ ssize_t guac_socket_write_base64(guac_socket* socket, const void* buf, size_t count); /** * Writes the given data to the specified socket. The data written is not * buffered, and will be sent immediately. * * If an error occurs while writing, a non-zero value is returned, and * guac_error is set appropriately. * * @param socket The guac_socket object to write to. * @param buf A buffer containing the data to write. * @param count The number of bytes to write. * @return Zero on success, or non-zero if an error occurs while writing. */ ssize_t guac_socket_write(guac_socket* socket, const void* buf, size_t count); /** * Attempts to read data from the socket, filling up to the specified number * of bytes in the given buffer. * * If an error occurs while writing, a non-zero value is returned, and * guac_error is set appropriately. * * @param socket The guac_socket to read from. * @param buf The buffer to read bytes into. * @param count The maximum number of bytes to read. * @return The number of bytes read, or non-zero if an error occurs while * reading. */ ssize_t guac_socket_read(guac_socket* socket, void* buf, size_t count); /** * Flushes the base64 buffer, writing padding characters as necessary. * * If an error occurs while writing, a non-zero value is returned, and * guac_error is set appropriately. * * @param socket The guac_socket object to flush * @return Zero on success, or non-zero if an error occurs during flush. */ ssize_t guac_socket_flush_base64(guac_socket* socket); /** * Flushes the write buffer. * * If an error occurs while writing, a non-zero value is returned, and * guac_error is set appropriately. * * @param socket The guac_socket object to flush * @return Zero on success, or non-zero if an error occurs during flush. */ ssize_t guac_socket_flush(guac_socket* socket); /** * Waits for input to be available on the given guac_socket object until the * specified timeout elapses. * * If an error occurs while waiting, a negative value is returned, and * guac_error is set appropriately. * * If a timeout occurs while waiting, zero value is returned, and * guac_error is set to GUAC_STATUS_INPUT_TIMEOUT. * * @param socket The guac_socket object to wait for. * @param usec_timeout The maximum number of microseconds to wait for data, or * -1 to potentially wait forever. * @return Positive on success, zero if the timeout elapsed and no data is * available, negative on error. */ int guac_socket_select(guac_socket* socket, int usec_timeout); #endif guacamole-server-0.9.9/src/libguac/guacamole/client-types.h0000664000175100017510000000552012643542623020653 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUAC_CLIENT_TYPES_H #define _GUAC_CLIENT_TYPES_H /** * Type definitions related to the Guacamole client structure, guac_client. * * @file client-types.h */ /** * Guacamole proxy client. * * Represents a Guacamole proxy client (the client which communicates to * a server on behalf of Guacamole, on behalf of the web-client). */ typedef struct guac_client guac_client; /** * Possible current states of the Guacamole client. Currently, the only * two states are GUAC_CLIENT_RUNNING and GUAC_CLIENT_STOPPING. */ typedef enum guac_client_state { /** * The state of the client from when it has been allocated by the main * daemon until it is killed or disconnected. */ GUAC_CLIENT_RUNNING, /** * The state of the client when a stop has been requested, signalling the * I/O threads to shutdown. */ GUAC_CLIENT_STOPPING } guac_client_state; /** * All supported log levels used by the logging subsystem of each Guacamole * client. These log levels correspond to a subset of the log levels defined by * RFC 5424. */ typedef enum guac_client_log_level { /** * Fatal errors. */ GUAC_LOG_ERROR = 3, /** * Non-fatal conditions that indicate problems. */ GUAC_LOG_WARNING = 4, /** * Informational messages of general interest to users or administrators. */ GUAC_LOG_INFO = 6, /** * Informational messages which can be useful for debugging, but are * otherwise not useful to users or administrators. */ GUAC_LOG_DEBUG = 7 } guac_client_log_level; /** * Information exposed by the remote client during the connection handshake * which can be used by a client plugin. */ typedef struct guac_client_info guac_client_info; #endif guacamole-server-0.9.9/src/libguac/encode-png.c0000664000175100017510000002665012626133327016315 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "config.h" #include "encode-png.h" #include "error.h" #include "palette.h" #include "protocol.h" #include "stream.h" #include #include #ifdef HAVE_PNGSTRUCT_H #include #endif #include #include #include #include #include /** * Data describing the current write state of PNG data. */ typedef struct guac_png_write_state { /** * The socket over which all PNG blobs will be written. */ guac_socket* socket; /** * The Guacamole stream to associate with each PNG blob. */ guac_stream* stream; /** * Buffer of pending PNG data. */ char buffer[6048]; /** * The number of bytes currently stored in the buffer. */ int buffer_size; } guac_png_write_state; /** * Writes the contents of the PNG write state as a blob to its associated * socket. * * @param write_state * The write state to flush. */ static void guac_png_flush_data(guac_png_write_state* write_state) { /* Send blob */ guac_protocol_send_blob(write_state->socket, write_state->stream, write_state->buffer, write_state->buffer_size); /* Clear buffer */ write_state->buffer_size = 0; } /** * Appends the given PNG data to the internal buffer of the given write state, * automatically flushing the write state as necessary. * socket. * * @param write_state * The write state to append the given data to. * * @param data * The PNG data to append. * * @param length * The size of the given PNG data, in bytes. */ static void guac_png_write_data(guac_png_write_state* write_state, const void* data, int length) { const unsigned char* current = data; /* Append all data given */ while (length > 0) { /* Calculate space remaining */ int remaining = sizeof(write_state->buffer) - write_state->buffer_size; /* If no space remains, flush buffer to make room */ if (remaining == 0) { guac_png_flush_data(write_state); remaining = sizeof(write_state->buffer); } /* Calculate size of next block of data to append */ int block_size = remaining; if (block_size > length) block_size = length; /* Append block */ memcpy(write_state->buffer + write_state->buffer_size, current, block_size); /* Next block */ current += block_size; write_state->buffer_size += block_size; length -= block_size; } } /** * Writes the given buffer of PNG data to the buffer of the given write state, * flushing that buffer to blob instructions if necessary. This handler is * called by Cairo when writing PNG data via * cairo_surface_write_to_png_stream(). * * @param closure * Pointer to arbitrary data passed to cairo_surface_write_to_png_stream(). * In the case of this handler, this data will be the guac_png_write_state. * * @param data * The buffer of PNG data to write. * * @param length * The size of the given buffer, in bytes. * * @return * A Cairo status code indicating whether the write operation succeeded. * In the case of this handler, this will always be CAIRO_STATUS_SUCCESS. */ static cairo_status_t guac_png_cairo_write_handler(void* closure, const unsigned char* data, unsigned int length) { guac_png_write_state* write_state = (guac_png_write_state*) closure; /* Append data to buffer, writing as necessary */ guac_png_write_data(write_state, data, length); return CAIRO_STATUS_SUCCESS; } /** * Implementation of guac_png_write() which uses Cairo's own PNG encoder to * write PNG data, rather than using libpng directly. * * @param socket * The socket to send PNG blobs over. * * @param stream * The stream to associate with each blob. * * @param surface * The Cairo surface to write to the given stream and socket as PNG blobs. * * @return * Zero if the encoding operation is successful, non-zero otherwise. */ static int guac_png_cairo_write(guac_socket* socket, guac_stream* stream, cairo_surface_t* surface) { guac_png_write_state write_state; /* Init write state */ write_state.socket = socket; write_state.stream = stream; write_state.buffer_size = 0; /* Write surface as PNG */ if (cairo_surface_write_to_png_stream(surface, guac_png_cairo_write_handler, &write_state) != CAIRO_STATUS_SUCCESS) { guac_error = GUAC_STATUS_INTERNAL_ERROR; guac_error_message = "Cairo PNG backend failed"; return -1; } /* Flush remaining PNG data */ guac_png_flush_data(&write_state); return 0; } /** * Writes the given buffer of PNG data to the buffer of the given write state, * flushing that buffer to blob instructions if necessary. This handler is * called by libpng when writing PNG data via png_write_png(). * * @param png * The PNG compression state structure associated with the write operation. * The pointer to arbitrary data will have been set to the * guac_png_write_state by png_set_write_fn(), and will be accessible via * png->io_ptr or png_get_io_ptr(png), depending on the version of libpng. * * @param data * The buffer of PNG data to write. * * @param length * The size of the given buffer, in bytes. */ static void guac_png_write_handler(png_structp png, png_bytep data, png_size_t length) { /* Get png buffer structure */ guac_png_write_state* write_state; #ifdef HAVE_PNG_GET_IO_PTR write_state = (guac_png_write_state*) png_get_io_ptr(png); #else write_state = (guac_png_write_state*) png->io_ptr; #endif /* Append data to buffer, writing as necessary */ guac_png_write_data(write_state, data, length); } /** * Flushes any PNG data within the buffer of the given write state as a blob * instruction. If no data is within the buffer, this function has no effect. * This handler is called by libpng when it has finished writing PNG data via * png_write_png(). * * @param png * The PNG compression state structure associated with the write operation. * The pointer to arbitrary data will have been set to the * guac_png_write_state by png_set_write_fn(), and will be accessible via * png->io_ptr or png_get_io_ptr(png), depending on the version of libpng. */ static void guac_png_flush_handler(png_structp png) { /* Get png buffer structure */ guac_png_write_state* write_state; #ifdef HAVE_PNG_GET_IO_PTR write_state = (guac_png_write_state*) png_get_io_ptr(png); #else write_state = (guac_png_write_state*) png->io_ptr; #endif /* Flush buffer */ guac_png_flush_data(write_state); } int guac_png_write(guac_socket* socket, guac_stream* stream, cairo_surface_t* surface) { png_structp png; png_infop png_info; png_byte** png_rows; int bpp; int x, y; guac_png_write_state write_state; /* Get image surface properties and data */ cairo_format_t format = cairo_image_surface_get_format(surface); int width = cairo_image_surface_get_width(surface); int height = cairo_image_surface_get_height(surface); int stride = cairo_image_surface_get_stride(surface); unsigned char* data = cairo_image_surface_get_data(surface); /* If not RGB24, use Cairo PNG writer */ if (format != CAIRO_FORMAT_RGB24 || data == NULL) return guac_png_cairo_write(socket, stream, surface); /* Flush pending operations to surface */ cairo_surface_flush(surface); /* Attempt to build palette */ guac_palette* palette = guac_palette_alloc(surface); /* If not possible, resort to Cairo PNG writer */ if (palette == NULL) return guac_png_cairo_write(socket, stream, surface); /* Calculate BPP from palette size */ if (palette->size <= 2) bpp = 1; else if (palette->size <= 4) bpp = 2; else if (palette->size <= 16) bpp = 4; else bpp = 8; /* Set up PNG writer */ png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png) { guac_error = GUAC_STATUS_INTERNAL_ERROR; guac_error_message = "libpng failed to create write structure"; return -1; } png_info = png_create_info_struct(png); if (!png_info) { png_destroy_write_struct(&png, NULL); guac_error = GUAC_STATUS_INTERNAL_ERROR; guac_error_message = "libpng failed to create info structure"; return -1; } /* Set error handler */ if (setjmp(png_jmpbuf(png))) { png_destroy_write_struct(&png, &png_info); guac_error = GUAC_STATUS_IO_ERROR; guac_error_message = "libpng output error"; return -1; } /* Init write state */ write_state.socket = socket; write_state.stream = stream; write_state.buffer_size = 0; /* Set up writer */ png_set_write_fn(png, &write_state, guac_png_write_handler, guac_png_flush_handler); /* Copy data from surface into PNG data */ png_rows = (png_byte**) malloc(sizeof(png_byte*) * height); for (y=0; ycolors, palette->size); /* Write image */ png_set_rows(png, png_info, png_rows); png_write_png(png, png_info, PNG_TRANSFORM_PACKING, NULL); /* Finish write */ png_destroy_write_struct(&png, &png_info); /* Free palette */ guac_palette_free(palette); /* Free PNG data */ for (y=0; y #include #include #include #include #ifdef __MINGW32__ #include #else #include #endif typedef struct __guac_socket_fd_data { int fd; } __guac_socket_fd_data; ssize_t __guac_socket_fd_read_handler(guac_socket* socket, void* buf, size_t count) { __guac_socket_fd_data* data = (__guac_socket_fd_data*) socket->data; /* Read from socket */ int retval = read(data->fd, buf, count); /* Record errors in guac_error */ if (retval < 0) { guac_error = GUAC_STATUS_SEE_ERRNO; guac_error_message = "Error reading data from socket"; } return retval; } ssize_t __guac_socket_fd_write_handler(guac_socket* socket, const void* buf, size_t count) { __guac_socket_fd_data* data = (__guac_socket_fd_data*) socket->data; int retval; #ifdef __MINGW32__ /* MINGW32 WINSOCK only works with send() */ retval = send(data->fd, buf, count, 0); #else /* Use write() for all other platforms */ retval = write(data->fd, buf, count); #endif /* Record errors in guac_error */ if (retval < 0) { guac_error = GUAC_STATUS_SEE_ERRNO; guac_error_message = "Error writing data to socket"; } return retval; } int __guac_socket_fd_select_handler(guac_socket* socket, int usec_timeout) { __guac_socket_fd_data* data = (__guac_socket_fd_data*) socket->data; fd_set fds; struct timeval timeout; int retval; /* No timeout if usec_timeout is negative */ if (usec_timeout < 0) retval = select(data->fd + 1, &fds, NULL, NULL, NULL); /* Handle timeout if specified */ else { timeout.tv_sec = usec_timeout/1000000; timeout.tv_usec = usec_timeout%1000000; FD_ZERO(&fds); FD_SET(data->fd, &fds); retval = select(data->fd + 1, &fds, NULL, NULL, &timeout); } /* Properly set guac_error */ if (retval < 0) { guac_error = GUAC_STATUS_SEE_ERRNO; guac_error_message = "Error while waiting for data on socket"; } if (retval == 0) { guac_error = GUAC_STATUS_TIMEOUT; guac_error_message = "Timeout while waiting for data on socket"; } return retval; } guac_socket* guac_socket_open(int fd) { /* Allocate socket and associated data */ guac_socket* socket = guac_socket_alloc(); __guac_socket_fd_data* data = malloc(sizeof(__guac_socket_fd_data)); /* Store file descriptor as socket data */ data->fd = fd; socket->data = data; /* Set read/write handlers */ socket->read_handler = __guac_socket_fd_read_handler; socket->write_handler = __guac_socket_fd_write_handler; socket->select_handler = __guac_socket_fd_select_handler; return socket; } guacamole-server-0.9.9/src/libguac/encode-jpeg.h0000664000175100017510000000351712626133327016460 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 GUAC_ENCODE_JPEG_H #define GUAC_ENCODE_JPEG_H #include "config.h" #include "socket.h" #include "stream.h" #include /** * Encodes the given surface as a JPEG, and sends the resulting data over the * given stream and socket as blobs. * * @param socket * The socket to send JPEG blobs over. * * @param stream * The stream to associate with each blob. * * @param surface * The Cairo surface to write to the given stream and socket as JPEG blobs. * * @param quality * JPEG image quality. * * @return * Zero if the encoding operation is successful, non-zero otherwise. */ int guac_jpeg_write(guac_socket* socket, guac_stream* stream, cairo_surface_t* surface, int quality); #endif guacamole-server-0.9.9/src/libguac/palette.h0000664000175100017510000000311012536405625015726 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_PALETTE_H #define __GUAC_PALETTE_H #include #include typedef struct guac_palette_entry { int index; int color; } guac_palette_entry; typedef struct guac_palette { guac_palette_entry entries[0x1000]; png_color colors[256]; int size; } guac_palette; guac_palette* guac_palette_alloc(cairo_surface_t* surface); int guac_palette_find(guac_palette* palette, int color); void guac_palette_free(guac_palette* palette); #endif guacamole-server-0.9.9/src/libguac/unicode.c0000664000175100017510000001047212536405625015722 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "unicode.h" #include size_t guac_utf8_charsize(unsigned char c) { /* Determine size in bytes of character */ if ((c | 0x7F) == 0x7F) return 1; if ((c | 0x1F) == 0xDF) return 2; if ((c | 0x0F) == 0xEF) return 3; if ((c | 0x07) == 0xF7) return 4; /* Default to one character */ return 1; } size_t guac_utf8_strlen(const char* str) { /* The current length of the string */ int length = 0; /* Number of characters before start of next character */ int skip = 0; while (*str != 0) { /* If skipping, then skip */ if (skip > 0) skip--; /* Otherwise, determine next skip value, and increment length */ else { /* Get next character */ unsigned char c = (unsigned char) *str; /* Determine skip value (size in bytes of rest of character) */ skip = guac_utf8_charsize(c) - 1; length++; } str++; } return length; } int guac_utf8_write(int codepoint, char* utf8, int length) { int i; int mask, bytes; /* If not even one byte, cannot write */ if (length <= 0) return 0; /* Determine size and initial byte mask */ if (codepoint <= 0x007F) { mask = 0x00; bytes = 1; } else if (codepoint <= 0x7FF) { mask = 0xC0; bytes = 2; } else if (codepoint <= 0xFFFF) { mask = 0xE0; bytes = 3; } else if (codepoint <= 0x1FFFFF) { mask = 0xF0; bytes = 4; } /* Otherwise, invalid codepoint */ else { *(utf8++) = '?'; return 1; } /* If not enough room, don't write anything */ if (bytes > length) return 0; /* Offset buffer by size */ utf8 += bytes - 1; /* Add trailing bytes, if any */ for (i=1; i>= 6; } /* Set initial byte */ *utf8 = mask | codepoint; /* Done */ return bytes; } int guac_utf8_read(const char* utf8, int length, int* codepoint) { unsigned char initial; int bytes; int result; int i; /* If not even one byte, cannot read */ if (length <= 0) return 0; /* Read initial byte */ initial = (unsigned char) *(utf8++); /* 0xxxxxxx */ if ((initial | 0x7F) == 0x7F) { result = initial; bytes = 1; } /* 110xxxxx 10xxxxxx */ else if ((initial | 0x1F) == 0xDF) { result = initial & 0x1F; bytes = 2; } /* 1110xxxx 10xxxxxx 10xxxxxx */ else if ((initial | 0x0F) == 0xEF) { result = initial & 0x0F; bytes = 3; } /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ else if ((initial | 0x07) == 0xF7) { result = initial & 0x07; bytes = 4; } /* Otherwise, invalid codepoint */ else { *codepoint = 0xFFFD; /* Replacement character */ return 1; } /* If not enough room, don't read anything */ if (bytes > length) return 0; /* Read trailing bytes, if any */ for (i=1; i #include #include /* Guacamole instruction handler map */ __guac_instruction_handler_mapping __guac_instruction_handler_map[] = { {"sync", __guac_handle_sync}, {"mouse", __guac_handle_mouse}, {"key", __guac_handle_key}, {"clipboard", __guac_handle_clipboard}, {"disconnect", __guac_handle_disconnect}, {"size", __guac_handle_size}, {"file", __guac_handle_file}, {"pipe", __guac_handle_pipe}, {"ack", __guac_handle_ack}, {"blob", __guac_handle_blob}, {"end", __guac_handle_end}, {"get", __guac_handle_get}, {"put", __guac_handle_put}, {NULL, NULL} }; int64_t __guac_parse_int(const char* str) { int sign = 1; int64_t num = 0; for (; *str != '\0'; str++) { if (*str == '-') sign = -sign; else num = num * 10 + (*str - '0'); } return num * sign; } /* Guacamole instruction handlers */ int __guac_handle_sync(guac_client* client, guac_instruction* instruction) { guac_timestamp timestamp = __guac_parse_int(instruction->argv[0]); /* Error if timestamp is in future */ if (timestamp > client->last_sent_timestamp) return -1; client->last_received_timestamp = timestamp; return 0; } int __guac_handle_mouse(guac_client* client, guac_instruction* instruction) { if (client->mouse_handler) return client->mouse_handler( client, atoi(instruction->argv[0]), /* x */ atoi(instruction->argv[1]), /* y */ atoi(instruction->argv[2]) /* mask */ ); return 0; } int __guac_handle_key(guac_client* client, guac_instruction* instruction) { if (client->key_handler) return client->key_handler( client, atoi(instruction->argv[0]), /* keysym */ atoi(instruction->argv[1]) /* pressed */ ); return 0; } static guac_stream* __get_input_stream(guac_client* client, int stream_index) { /* Validate stream index */ if (stream_index < 0 || stream_index >= GUAC_CLIENT_MAX_STREAMS) { guac_stream dummy_stream; dummy_stream.index = stream_index; guac_protocol_send_ack(client->socket, &dummy_stream, "Invalid stream index", GUAC_PROTOCOL_STATUS_CLIENT_BAD_REQUEST); return NULL; } return &(client->__input_streams[stream_index]); } static guac_stream* __get_open_input_stream(guac_client* client, int stream_index) { guac_stream* stream = __get_input_stream(client, stream_index); /* Fail if no such stream */ if (stream == NULL) return NULL; /* Validate initialization of stream */ if (stream->index == GUAC_CLIENT_CLOSED_STREAM_INDEX) { guac_stream dummy_stream; dummy_stream.index = stream_index; guac_protocol_send_ack(client->socket, &dummy_stream, "Invalid stream index", GUAC_PROTOCOL_STATUS_CLIENT_BAD_REQUEST); return NULL; } return stream; } static guac_stream* __init_input_stream(guac_client* client, int stream_index) { guac_stream* stream = __get_input_stream(client, stream_index); /* Fail if no such stream */ if (stream == NULL) return NULL; /* Initialize stream */ stream->index = stream_index; stream->data = NULL; stream->ack_handler = NULL; stream->blob_handler = NULL; stream->end_handler = NULL; return stream; } int __guac_handle_clipboard(guac_client* client, guac_instruction* instruction) { /* Pull corresponding stream */ int stream_index = atoi(instruction->argv[0]); guac_stream* stream = __init_input_stream(client, stream_index); if (stream == NULL) return 0; /* If supported, call handler */ if (client->clipboard_handler) return client->clipboard_handler( client, stream, instruction->argv[1] /* mimetype */ ); /* Otherwise, abort */ guac_protocol_send_ack(client->socket, stream, "Clipboard unsupported", GUAC_PROTOCOL_STATUS_UNSUPPORTED); return 0; } int __guac_handle_size(guac_client* client, guac_instruction* instruction) { if (client->size_handler) return client->size_handler( client, atoi(instruction->argv[0]), /* width */ atoi(instruction->argv[1]) /* height */ ); return 0; } int __guac_handle_file(guac_client* client, guac_instruction* instruction) { /* Pull corresponding stream */ int stream_index = atoi(instruction->argv[0]); guac_stream* stream = __init_input_stream(client, stream_index); if (stream == NULL) return 0; /* If supported, call handler */ if (client->file_handler) return client->file_handler( client, stream, instruction->argv[1], /* mimetype */ instruction->argv[2] /* filename */ ); /* Otherwise, abort */ guac_protocol_send_ack(client->socket, stream, "File transfer unsupported", GUAC_PROTOCOL_STATUS_UNSUPPORTED); return 0; } int __guac_handle_pipe(guac_client* client, guac_instruction* instruction) { /* Pull corresponding stream */ int stream_index = atoi(instruction->argv[0]); guac_stream* stream = __init_input_stream(client, stream_index); if (stream == NULL) return 0; /* If supported, call handler */ if (client->pipe_handler) return client->pipe_handler( client, stream, instruction->argv[1], /* mimetype */ instruction->argv[2] /* name */ ); /* Otherwise, abort */ guac_protocol_send_ack(client->socket, stream, "Named pipes unsupported", GUAC_PROTOCOL_STATUS_UNSUPPORTED); return 0; } int __guac_handle_ack(guac_client* client, guac_instruction* instruction) { guac_stream* stream; /* Validate stream index */ int stream_index = atoi(instruction->argv[0]); if (stream_index < 0 || stream_index >= GUAC_CLIENT_MAX_STREAMS) return 0; stream = &(client->__output_streams[stream_index]); /* Validate initialization of stream */ if (stream->index == GUAC_CLIENT_CLOSED_STREAM_INDEX) return 0; /* Call stream handler if defined */ if (stream->ack_handler) return stream->ack_handler(client, stream, instruction->argv[1], atoi(instruction->argv[2])); /* Fall back to global handler if defined */ if (client->ack_handler) return client->ack_handler(client, stream, instruction->argv[1], atoi(instruction->argv[2])); return 0; } int __guac_handle_blob(guac_client* client, guac_instruction* instruction) { int stream_index = atoi(instruction->argv[0]); guac_stream* stream = __get_open_input_stream(client, stream_index); /* Fail if no such stream */ if (stream == NULL) return 0; /* Call stream handler if defined */ if (stream->blob_handler) { int length = guac_protocol_decode_base64(instruction->argv[1]); return stream->blob_handler(client, stream, instruction->argv[1], length); } /* Fall back to global handler if defined */ if (client->blob_handler) { int length = guac_protocol_decode_base64(instruction->argv[1]); return client->blob_handler(client, stream, instruction->argv[1], length); } guac_protocol_send_ack(client->socket, stream, "File transfer unsupported", GUAC_PROTOCOL_STATUS_UNSUPPORTED); return 0; } int __guac_handle_end(guac_client* client, guac_instruction* instruction) { int result = 0; int stream_index = atoi(instruction->argv[0]); guac_stream* stream = __get_open_input_stream(client, stream_index); /* Fail if no such stream */ if (stream == NULL) return 0; /* Call stream handler if defined */ if (stream->end_handler) result = stream->end_handler(client, stream); /* Fall back to global handler if defined */ if (client->end_handler) result = client->end_handler(client, stream); /* Mark stream as closed */ stream->index = GUAC_CLIENT_CLOSED_STREAM_INDEX; return result; } int __guac_handle_get(guac_client* client, guac_instruction* instruction) { guac_object* object; /* Validate object index */ int object_index = atoi(instruction->argv[0]); if (object_index < 0 || object_index >= GUAC_CLIENT_MAX_OBJECTS) return 0; object = &(client->__objects[object_index]); /* Validate initialization of object */ if (object->index == GUAC_CLIENT_UNDEFINED_OBJECT_INDEX) return 0; /* Call object handler if defined */ if (object->get_handler) return object->get_handler(client, object, instruction->argv[1] /* name */ ); /* Fall back to global handler if defined */ if (client->get_handler) return client->get_handler(client, object, instruction->argv[1] /* name */ ); return 0; } int __guac_handle_put(guac_client* client, guac_instruction* instruction) { guac_object* object; /* Validate object index */ int object_index = atoi(instruction->argv[0]); if (object_index < 0 || object_index >= GUAC_CLIENT_MAX_OBJECTS) return 0; object = &(client->__objects[object_index]); /* Validate initialization of object */ if (object->index == GUAC_CLIENT_UNDEFINED_OBJECT_INDEX) return 0; /* Pull corresponding stream */ int stream_index = atoi(instruction->argv[1]); guac_stream* stream = __init_input_stream(client, stream_index); if (stream == NULL) return 0; /* Call object handler if defined */ if (object->put_handler) return object->put_handler(client, object, stream, instruction->argv[2], /* mimetype */ instruction->argv[3] /* name */ ); /* Fall back to global handler if defined */ if (client->put_handler) return client->put_handler(client, object, stream, instruction->argv[2], /* mimetype */ instruction->argv[3] /* name */ ); /* Otherwise, abort */ guac_protocol_send_ack(client->socket, stream, "Object write unsupported", GUAC_PROTOCOL_STATUS_UNSUPPORTED); return 0; } int __guac_handle_disconnect(guac_client* client, guac_instruction* instruction) { guac_client_stop(client); return 0; } guacamole-server-0.9.9/src/libguac/client.c0000664000175100017510000003107212643542623015550 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "client-handlers.h" #include "encode-jpeg.h" #include "encode-png.h" #include "error.h" #include "instruction.h" #include "layer.h" #include "object.h" #include "pool.h" #include "protocol.h" #include "socket.h" #include "stream.h" #include "timestamp.h" #ifdef ENABLE_WEBP #include "encode-webp.h" #endif #ifdef HAVE_OSSP_UUID_H #include #else #include #endif #include #include #include #include guac_layer __GUAC_DEFAULT_LAYER = { .index = 0 }; const guac_layer* GUAC_DEFAULT_LAYER = &__GUAC_DEFAULT_LAYER; guac_layer* guac_client_alloc_layer(guac_client* client) { /* Init new layer */ guac_layer* allocd_layer = malloc(sizeof(guac_layer)); allocd_layer->index = guac_pool_next_int(client->__layer_pool)+1; return allocd_layer; } guac_layer* guac_client_alloc_buffer(guac_client* client) { /* Init new layer */ guac_layer* allocd_layer = malloc(sizeof(guac_layer)); allocd_layer->index = -guac_pool_next_int(client->__buffer_pool) - 1; return allocd_layer; } void guac_client_free_buffer(guac_client* client, guac_layer* layer) { /* Release index to pool */ guac_pool_free_int(client->__buffer_pool, -layer->index - 1); /* Free layer */ free(layer); } void guac_client_free_layer(guac_client* client, guac_layer* layer) { /* Release index to pool */ guac_pool_free_int(client->__layer_pool, layer->index); /* Free layer */ free(layer); } guac_stream* guac_client_alloc_stream(guac_client* client) { guac_stream* allocd_stream; int stream_index; /* Refuse to allocate beyond maximum */ if (client->__stream_pool->active == GUAC_CLIENT_MAX_STREAMS) return NULL; /* Allocate stream */ stream_index = guac_pool_next_int(client->__stream_pool); /* Initialize stream */ allocd_stream = &(client->__output_streams[stream_index]); allocd_stream->index = stream_index; allocd_stream->data = NULL; allocd_stream->ack_handler = NULL; allocd_stream->blob_handler = NULL; allocd_stream->end_handler = NULL; return allocd_stream; } void guac_client_free_stream(guac_client* client, guac_stream* stream) { /* Release index to pool */ guac_pool_free_int(client->__stream_pool, stream->index); /* Mark stream as closed */ stream->index = GUAC_CLIENT_CLOSED_STREAM_INDEX; } guac_object* guac_client_alloc_object(guac_client* client) { guac_object* allocd_object; int object_index; /* Refuse to allocate beyond maximum */ if (client->__object_pool->active == GUAC_CLIENT_MAX_OBJECTS) return NULL; /* Allocate object */ object_index = guac_pool_next_int(client->__object_pool); /* Initialize object */ allocd_object = &(client->__objects[object_index]); allocd_object->index = object_index; allocd_object->data = NULL; allocd_object->get_handler = NULL; allocd_object->put_handler = NULL; return allocd_object; } void guac_client_free_object(guac_client* client, guac_object* object) { /* Release index to pool */ guac_pool_free_int(client->__object_pool, object->index); /* Mark object as undefined */ object->index = GUAC_CLIENT_UNDEFINED_OBJECT_INDEX; } /** * Returns a newly allocated string containing a guaranteed-unique connection * identifier string which is 37 characters long and begins with a '$' * character. If an error occurs, NULL is returned, and no memory is * allocated. */ static char* __guac_generate_connection_id() { char* buffer; char* identifier; size_t identifier_length; uuid_t* uuid; /* Attempt to create UUID object */ if (uuid_create(&uuid) != UUID_RC_OK) { guac_error = GUAC_STATUS_NO_MEMORY; guac_error_message = "Could not allocate memory for UUID"; return NULL; } /* Generate random UUID */ if (uuid_make(uuid, UUID_MAKE_V4) != UUID_RC_OK) { uuid_destroy(uuid); guac_error = GUAC_STATUS_NO_MEMORY; guac_error_message = "UUID generation failed"; return NULL; } /* Allocate buffer for future formatted ID */ buffer = malloc(UUID_LEN_STR + 2); if (buffer == NULL) { uuid_destroy(uuid); guac_error = GUAC_STATUS_NO_MEMORY; guac_error_message = "Could not allocate memory for connection ID"; return NULL; } identifier = &(buffer[1]); identifier_length = UUID_LEN_STR + 1; /* Build connection ID from UUID */ if (uuid_export(uuid, UUID_FMT_STR, &identifier, &identifier_length) != UUID_RC_OK) { free(buffer); uuid_destroy(uuid); guac_error = GUAC_STATUS_INTERNAL_ERROR; guac_error_message = "Conversion of UUID to connection ID failed"; return NULL; } uuid_destroy(uuid); buffer[0] = '$'; buffer[UUID_LEN_STR + 1] = '\0'; return buffer; } guac_client* guac_client_alloc() { int i; /* Allocate new client */ guac_client* client = malloc(sizeof(guac_client)); if (client == NULL) { guac_error = GUAC_STATUS_NO_MEMORY; guac_error_message = "Could not allocate memory for client"; return NULL; } /* Init new client */ memset(client, 0, sizeof(guac_client)); client->last_received_timestamp = client->last_sent_timestamp = guac_timestamp_current(); client->state = GUAC_CLIENT_RUNNING; /* Generate ID */ client->connection_id = __guac_generate_connection_id(); if (client->connection_id == NULL) { free(client); return NULL; } /* Allocate buffer and layer pools */ client->__buffer_pool = guac_pool_alloc(GUAC_BUFFER_POOL_INITIAL_SIZE); client->__layer_pool = guac_pool_alloc(GUAC_BUFFER_POOL_INITIAL_SIZE); /* Allocate stream pool */ client->__stream_pool = guac_pool_alloc(0); /* Initialize streams */ client->__input_streams = malloc(sizeof(guac_stream) * GUAC_CLIENT_MAX_STREAMS); client->__output_streams = malloc(sizeof(guac_stream) * GUAC_CLIENT_MAX_STREAMS); for (i=0; i__input_streams[i].index = GUAC_CLIENT_CLOSED_STREAM_INDEX; client->__output_streams[i].index = GUAC_CLIENT_CLOSED_STREAM_INDEX; } /* Allocate object pool */ client->__object_pool = guac_pool_alloc(0); /* Initialize objects */ client->__objects = malloc(sizeof(guac_object) * GUAC_CLIENT_MAX_OBJECTS); for (i=0; i__objects[i].index = GUAC_CLIENT_UNDEFINED_OBJECT_INDEX; return client; } void guac_client_free(guac_client* client) { if (client->free_handler) { /* FIXME: Errors currently ignored... */ client->free_handler(client); } /* Free layer pools */ guac_pool_free(client->__buffer_pool); guac_pool_free(client->__layer_pool); /* Free streams */ free(client->__input_streams); free(client->__output_streams); /* Free stream pool */ guac_pool_free(client->__stream_pool); /* Free objects */ free(client->__objects); /* Free object pool */ guac_pool_free(client->__object_pool); free(client); } int guac_client_handle_instruction(guac_client* client, guac_instruction* instruction) { /* For each defined instruction */ __guac_instruction_handler_mapping* current = __guac_instruction_handler_map; while (current->opcode != NULL) { /* If recognized, call handler */ if (strcmp(instruction->opcode, current->opcode) == 0) return current->handler(client, instruction); current++; } /* If unrecognized, ignore */ return 0; } void vguac_client_log(guac_client* client, guac_client_log_level level, const char* format, va_list ap) { /* Call handler if defined */ if (client->log_handler != NULL) client->log_handler(client, level, format, ap); } void guac_client_log(guac_client* client, guac_client_log_level level, const char* format, ...) { va_list args; va_start(args, format); vguac_client_log(client, level, format, args); va_end(args); } void guac_client_stop(guac_client* client) { client->state = GUAC_CLIENT_STOPPING; } void vguac_client_abort(guac_client* client, guac_protocol_status status, const char* format, va_list ap) { /* Only relevant if client is running */ if (client->state == GUAC_CLIENT_RUNNING) { /* Log detail of error */ vguac_client_log(client, GUAC_LOG_ERROR, format, ap); /* Send error immediately, limit information given */ guac_protocol_send_error(client->socket, "Aborted. See logs.", status); guac_socket_flush(client->socket); /* Stop client */ guac_client_stop(client); } } void guac_client_abort(guac_client* client, guac_protocol_status status, const char* format, ...) { va_list args; va_start(args, format); vguac_client_abort(client, status, format, args); va_end(args); } void guac_client_stream_png(guac_client* client, guac_socket* socket, guac_composite_mode mode, const guac_layer* layer, int x, int y, cairo_surface_t* surface) { /* Allocate new stream for image */ guac_stream* stream = guac_client_alloc_stream(client); /* Declare stream as containing image data */ guac_protocol_send_img(socket, stream, mode, layer, "image/png", x, y); /* Write PNG data */ guac_png_write(socket, stream, surface); /* Terminate stream */ guac_protocol_send_end(socket, stream); /* Free allocated stream */ guac_client_free_stream(client, stream); } void guac_client_stream_jpeg(guac_client* client, guac_socket* socket, guac_composite_mode mode, const guac_layer* layer, int x, int y, cairo_surface_t* surface, int quality) { /* Allocate new stream for image */ guac_stream* stream = guac_client_alloc_stream(client); /* Declare stream as containing image data */ guac_protocol_send_img(socket, stream, mode, layer, "image/jpeg", x, y); /* Write JPEG data */ guac_jpeg_write(socket, stream, surface, quality); /* Terminate stream */ guac_protocol_send_end(socket, stream); /* Free allocated stream */ guac_client_free_stream(client, stream); } void guac_client_stream_webp(guac_client* client, guac_socket* socket, guac_composite_mode mode, const guac_layer* layer, int x, int y, cairo_surface_t* surface, int quality, int lossless) { #ifdef ENABLE_WEBP /* Allocate new stream for image */ guac_stream* stream = guac_client_alloc_stream(client); /* Declare stream as containing image data */ guac_protocol_send_img(socket, stream, mode, layer, "image/webp", x, y); /* Write WebP data */ guac_webp_write(socket, stream, surface, quality, lossless); /* Terminate stream */ guac_protocol_send_end(socket, stream); /* Free allocated stream */ guac_client_free_stream(client, stream); #else /* Do nothing if WebP support is not built in */ #endif } int guac_client_supports_webp(guac_client* client) { #ifdef ENABLE_WEBP char** mimetype = client->info.image_mimetypes; /* Search for WebP mimetype in list of supported image mimetypes */ while (*mimetype != NULL) { /* If WebP mimetype found, no need to search further */ if (strcmp(*mimetype, "image/webp") == 0) return 1; /* Next mimetype */ mimetype++; } /* Client does not support WebP */ return 0; #else /* Support for WebP is completely absent */ return 0; #endif } guacamole-server-0.9.9/src/libguac/raw_encoder.h0000664000175100017510000000436712626724073016600 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 GUAC_RAW_ENCODER_H #define GUAC_RAW_ENCODER_H #include "config.h" #include "audio.h" /** * The number of bytes to send in each audio blob. */ #define GUAC_RAW_ENCODER_BLOB_SIZE 6048 /** * The size of the raw encoder output PCM buffer, in milliseconds. The * equivalent size in bytes will vary by PCM rate, number of channels, and bits * per sample. */ #define GUAC_RAW_ENCODER_BUFFER_SIZE 250 /** * The current state of the raw encoder. The raw encoder performs very minimal * processing, buffering provided PCM data only as necessary to ensure audio * packet sizes are reasonable. */ typedef struct raw_encoder_state { /** * Buffer of not-yet-written raw PCM data. */ unsigned char* buffer; /** * Size of the PCM buffer, in bytes. */ int length; /** * The current number of bytes stored within the PCM buffer. */ int written; } raw_encoder_state; /** * Audio encoder which writes 8-bit raw PCM (one byte per sample). */ extern guac_audio_encoder* raw8_encoder; /** * Audio encoder which writes 16-bit raw PCM (two bytes per sample). */ extern guac_audio_encoder* raw16_encoder; #endif guacamole-server-0.9.9/src/libguac/encode-png.h0000664000175100017510000000341312626133327016312 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 GUAC_ENCODE_PNG_H #define GUAC_ENCODE_PNG_H #include "config.h" #include "socket.h" #include "stream.h" #include /** * Encodes the given surface as a PNG, and sends the resulting data over the * given stream and socket as blobs. * * @param socket * The socket to send PNG blobs over. * * @param stream * The stream to associate with each blob. * * @param surface * The Cairo surface to write to the given stream and socket as PNG blobs. * * @return * Zero if the encoding operation is successful, non-zero otherwise. */ int guac_png_write(guac_socket* socket, guac_stream* stream, cairo_surface_t* surface); #endif guacamole-server-0.9.9/src/libguac/error.c0000664000175100017510000002067212612226234015420 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "error.h" #include #include #include #ifdef HAVE_LIBPTHREAD #include #endif /* * Error strings */ const char* __GUAC_STATUS_SUCCESS_STR = "Success"; const char* __GUAC_STATUS_NO_MEMORY_STR = "Insufficient memory"; const char* __GUAC_STATUS_CLOSED_STR = "Closed"; const char* __GUAC_STATUS_TIMEOUT_STR = "Timed out"; const char* __GUAC_STATUS_IO_ERROR_STR = "Input/output error"; const char* __GUAC_STATUS_INVALID_ARGUMENT_STR = "Invalid argument"; const char* __GUAC_STATUS_INTERNAL_ERROR_STR = "Internal error"; const char* __GUAC_STATUS_UNKNOWN_STATUS_STR = "UNKNOWN STATUS CODE"; const char* __GUAC_STATUS_NO_SPACE_STR = "Insufficient space"; const char* __GUAC_STATUS_INPUT_TOO_LARGE_STR = "Input too large"; const char* __GUAC_STATUS_RESULT_TOO_LARGE_STR = "Result too large"; const char* __GUAC_STATUS_PERMISSION_DENIED_STR = "Permission denied"; const char* __GUAC_STATUS_BUSY_STR = "Resource busy"; const char* __GUAC_STATUS_NOT_AVAILABLE_STR = "Resource not available"; const char* __GUAC_STATUS_NOT_SUPPORTED_STR = "Not supported"; const char* __GUAC_STATUS_NOT_INPLEMENTED_STR = "Not implemented"; const char* __GUAC_STATUS_TRY_AGAIN_STR = "Temporary failure"; const char* __GUAC_STATUS_PROTOCOL_ERROR_STR = "Protocol violation"; const char* __GUAC_STATUS_NOT_FOUND_STR = "Not found"; const char* __GUAC_STATUS_CANCELED_STR = "Canceled"; const char* __GUAC_STATUS_OUT_OF_RANGE_STR = "Value out of range"; const char* __GUAC_STATUS_REFUSED_STR = "Operation refused"; const char* __GUAC_STATUS_TOO_MANY_STR = "Insufficient resources"; const char* __GUAC_STATUS_WOULD_BLOCK_STR = "Operation would block"; const char* guac_status_string(guac_status status) { switch (status) { /* No error */ case GUAC_STATUS_SUCCESS: return __GUAC_STATUS_SUCCESS_STR; /* Out of memory */ case GUAC_STATUS_NO_MEMORY: return __GUAC_STATUS_NO_MEMORY_STR; /* End of stream */ case GUAC_STATUS_CLOSED: return __GUAC_STATUS_CLOSED_STR; /* Timeout */ case GUAC_STATUS_TIMEOUT: return __GUAC_STATUS_TIMEOUT_STR; /* Further information in errno */ case GUAC_STATUS_SEE_ERRNO: return strerror(errno); /* Input/output error */ case GUAC_STATUS_IO_ERROR: return __GUAC_STATUS_IO_ERROR_STR; /* Invalid argument */ case GUAC_STATUS_INVALID_ARGUMENT: return __GUAC_STATUS_INVALID_ARGUMENT_STR; /* Internal error */ case GUAC_STATUS_INTERNAL_ERROR: return __GUAC_STATUS_INTERNAL_ERROR_STR; /* Out of space */ case GUAC_STATUS_NO_SPACE: return __GUAC_STATUS_NO_SPACE_STR; /* Input too large */ case GUAC_STATUS_INPUT_TOO_LARGE: return __GUAC_STATUS_INPUT_TOO_LARGE_STR; /* Result too large */ case GUAC_STATUS_RESULT_TOO_LARGE: return __GUAC_STATUS_RESULT_TOO_LARGE_STR; /* Permission denied */ case GUAC_STATUS_PERMISSION_DENIED: return __GUAC_STATUS_PERMISSION_DENIED_STR; /* Resource is busy */ case GUAC_STATUS_BUSY: return __GUAC_STATUS_BUSY_STR; /* Resource not available */ case GUAC_STATUS_NOT_AVAILABLE: return __GUAC_STATUS_NOT_AVAILABLE_STR; /* Not supported */ case GUAC_STATUS_NOT_SUPPORTED: return __GUAC_STATUS_NOT_SUPPORTED_STR; /* Not implemented */ case GUAC_STATUS_NOT_INPLEMENTED: return __GUAC_STATUS_NOT_INPLEMENTED_STR; /* Temporary failure */ case GUAC_STATUS_TRY_AGAIN: return __GUAC_STATUS_TRY_AGAIN_STR; /* Guacamole protocol error */ case GUAC_STATUS_PROTOCOL_ERROR: return __GUAC_STATUS_PROTOCOL_ERROR_STR; /* Resource not found */ case GUAC_STATUS_NOT_FOUND: return __GUAC_STATUS_NOT_FOUND_STR; /* Operation canceled */ case GUAC_STATUS_CANCELED: return __GUAC_STATUS_CANCELED_STR; /* Value out of range */ case GUAC_STATUS_OUT_OF_RANGE: return __GUAC_STATUS_OUT_OF_RANGE_STR; /* Operation refused */ case GUAC_STATUS_REFUSED: return __GUAC_STATUS_REFUSED_STR; /* Too many resource in use */ case GUAC_STATUS_TOO_MANY: return __GUAC_STATUS_TOO_MANY_STR; /* Operation would block */ case GUAC_STATUS_WOULD_BLOCK: return __GUAC_STATUS_WOULD_BLOCK_STR; /* Unknown status code */ default: return __GUAC_STATUS_UNKNOWN_STATUS_STR; } } #ifdef HAVE_LIBPTHREAD /* PThread implementation of __guac_error */ static pthread_key_t __guac_error_key; static pthread_once_t __guac_error_key_init = PTHREAD_ONCE_INIT; static pthread_key_t __guac_error_message_key; static pthread_once_t __guac_error_message_key_init = PTHREAD_ONCE_INIT; static void __guac_free_pointer(void* pointer) { /* Free memory allocated to status variable */ free(pointer); } static void __guac_alloc_error_key() { /* Create key, destroy any allocated variable on thread exit */ pthread_key_create(&__guac_error_key, __guac_free_pointer); } static void __guac_alloc_error_message_key() { /* Create key, destroy any allocated variable on thread exit */ pthread_key_create(&__guac_error_message_key, __guac_free_pointer); } guac_status* __guac_error() { /* Pointer for thread-local data */ guac_status* status; /* Init error key, if not already initialized */ pthread_once(&__guac_error_key_init, __guac_alloc_error_key); /* Retrieve thread-local status variable */ status = (guac_status*) pthread_getspecific(__guac_error_key); /* Allocate thread-local status variable if not already allocated */ if (status == NULL) { status = malloc(sizeof(guac_status)); pthread_setspecific(__guac_error_key, status); } return status; } const char** __guac_error_message() { /* Pointer for thread-local data */ const char** message; /* Init error message key, if not already initialized */ pthread_once( &__guac_error_message_key_init, __guac_alloc_error_message_key ); /* Retrieve thread-local message variable */ message = (const char**) pthread_getspecific(__guac_error_message_key); /* Allocate thread-local message variable if not already allocated */ if (message == NULL) { message = malloc(sizeof(const char*)); pthread_setspecific(__guac_error_message_key, message); } return message; } #else /* Default (not-threadsafe) implementation */ static guac_status __guac_error_unsafe_storage; static const char** __guac_error_message_unsafe_storage; guac_status* __guac_error() { return &__guac_error_unsafe_storage; } const char** __guac_error_message() { return &__guac_error_message_unsafe_storage; } /* Warn about threadsafety */ #warn No threadsafe implementation of __guac_error exists for your platform, so a default non-threadsafe implementation has been used instead. This may lead to incorrect status codes being reported for failures. Please consider adding support for your platform, or filing a bug report with the Guacamole project. #endif guacamole-server-0.9.9/src/libguac/encode-webp.h0000664000175100017510000000425012626724073016467 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 GUAC_ENCODE_WEBP_H #define GUAC_ENCODE_WEBP_H #include "config.h" #include "socket.h" #include "stream.h" #include /** * Encodes the given surface as a WebP, and sends the resulting data over the * given stream and socket as blobs. * * @param socket * The socket to send WebP blobs over. * * @param stream * The stream to associate with each blob. * * @param surface * The Cairo surface to write to the given stream and socket as PNG blobs. * * @param quality * The WebP image quality to use. For lossy images, larger values indicate * improving quality at the expense of larger file size. For lossless * images, this dictates the quality of compression, with larger values * producing smaller files at the expense of speed. * * @param lossless * Zero for a lossy image, non-zero for lossless. * * @return * Zero if the encoding operation is successful, non-zero otherwise. */ int guac_webp_write(guac_socket* socket, guac_stream* stream, cairo_surface_t* surface, int quality, int lossless); #endif guacamole-server-0.9.9/src/libguac/Makefile.am0000664000175100017510000000704212643542623016162 00000000000000# # Copyright (C) 2015 Glyptodon LLC # # 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. # AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 lib_LTLIBRARIES = libguac.la libguacincdir = $(includedir)/guacamole libguacinc_HEADERS = \ guacamole/audio.h \ guacamole/audio-fntypes.h \ guacamole/audio-types.h \ guacamole/client-constants.h \ guacamole/client.h \ guacamole/client-fntypes.h \ guacamole/client-types.h \ guacamole/error.h \ guacamole/error-types.h \ guacamole/hash.h \ guacamole/instruction-constants.h \ guacamole/instruction.h \ guacamole/instruction-types.h \ guacamole/layer.h \ guacamole/layer-types.h \ guacamole/object.h \ guacamole/object-types.h \ guacamole/plugin-constants.h \ guacamole/plugin.h \ guacamole/plugin-types.h \ guacamole/pool.h \ guacamole/pool-types.h \ guacamole/protocol.h \ guacamole/protocol-types.h \ guacamole/socket-constants.h \ guacamole/socket.h \ guacamole/socket-fntypes.h \ guacamole/socket-types.h \ guacamole/stream.h \ guacamole/stream-types.h \ guacamole/timestamp.h \ guacamole/timestamp-types.h \ guacamole/unicode.h noinst_HEADERS = \ client-handlers.h \ encode-jpeg.h \ encode-png.h \ palette.h \ raw_encoder.h libguac_la_SOURCES = \ audio.c \ client.c \ client-handlers.c \ encode-jpeg.c \ encode-png.c \ error.c \ hash.c \ instruction.c \ palette.c \ plugin.c \ pool.c \ protocol.c \ raw_encoder.c \ socket.c \ socket-fd.c \ socket-nest.c \ timestamp.c \ unicode.c # Compile WebP support if available if ENABLE_WEBP libguac_la_SOURCES += encode-webp.c noinst_HEADERS += encode-webp.h endif libguac_la_CFLAGS = \ -Werror -Wall -pedantic -Iguacamole libguac_la_LDFLAGS = \ -version-info 11:0:0 \ @CAIRO_LIBS@ \ @JPEG_LIBS@ \ @PNG_LIBS@ \ @PTHREAD_LIBS@ \ @UUID_LIBS@ \ @VORBIS_LIBS@ \ @WEBP_LIBS@ libguac_la_LIBADD = \ @LIBADD_DLOPEN@ guacamole-server-0.9.9/src/common/0000775000175100017510000000000012645400336014061 500000000000000guacamole-server-0.9.9/src/common/guac_string.h0000664000175100017510000000363512536405624016472 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_COMMON_STRING_H #define __GUAC_COMMON_STRING_H #include "config.h" /** * Counts the number of occurrences of a given character in a string. * * @param string The string to count occurrences within. * @param c The character to count occurrences of. * @return The number of occurrences. */ int guac_count_occurrences(const char* string, char c); /** * Splits a string into a newly-allocated array of strings. The array itself * and each string within the array will eventually need to be freed. The array * is NULL-terminated. * * @param string The string to split. * @param delim The character which separates individual substrings within the * given string. * @return A newly-allocated, NULL-terminated array of strings. */ char** guac_split(const char* string, char delim); #endif guacamole-server-0.9.9/src/common/guac_string.c0000664000175100017510000000461112536405624016460 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "guac_string.h" #include #include int guac_count_occurrences(const char* string, char c) { int count = 0; while (*string != 0) { /* Count each occurrence */ if (*string == c) count++; /* Next character */ string++; } return count; } char** guac_split(const char* string, char delim) { int i = 0; int token_count = guac_count_occurrences(string, delim) + 1; const char* token_start = string; /* Allocate space for tokens */ char** tokens = malloc(sizeof(char*) * (token_count+1)); do { int length; char* token; /* Find end of token */ while (*string != 0 && *string != delim) string++; /* Calculate token length */ length = string - token_start; /* Allocate space for token and NULL terminator */ tokens[i++] = token = malloc(length + 1); /* Copy token, store null */ memcpy(token, token_start, length); token[length] = 0; /* Stop at end of string */ if (*string == 0) break; /* Next token */ token_start = ++string; } while (i < token_count); /* NULL terminator */ tokens[i] = NULL; return tokens; } guacamole-server-0.9.9/src/common/guac_rect.c0000664000175100017510000001764312626133327016116 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 "config.h" #include "guac_rect.h" void guac_common_rect_init(guac_common_rect* rect, int x, int y, int width, int height) { rect->x = x; rect->y = y; rect->width = width; rect->height = height; } void guac_common_rect_extend(guac_common_rect* rect, const guac_common_rect* min) { /* Calculate extents of existing dirty rect */ int left = rect->x; int top = rect->y; int right = left + rect->width; int bottom = top + rect->height; /* Calculate missing extents of given new rect */ int min_left = min->x; int min_top = min->y; int min_right = min_left + min->width; int min_bottom = min_top + min->height; /* Update minimums */ if (min_left < left) left = min_left; if (min_top < top) top = min_top; if (min_right > right) right = min_right; if (min_bottom > bottom) bottom = min_bottom; /* Commit rect */ guac_common_rect_init(rect, left, top, right - left, bottom - top); } void guac_common_rect_constrain(guac_common_rect* rect, const guac_common_rect* max) { /* Calculate extents of existing dirty rect */ int left = rect->x; int top = rect->y; int right = left + rect->width; int bottom = top + rect->height; /* Calculate missing extents of given new rect */ int max_left = max->x; int max_top = max->y; int max_right = max_left + max->width; int max_bottom = max_top + max->height; /* Update maximums */ if (max_left > left) left = max_left; if (max_top > top) top = max_top; if (max_right < right) right = max_right; if (max_bottom < bottom) bottom = max_bottom; /* Commit rect */ guac_common_rect_init(rect, left, top, right - left, bottom - top); } int guac_common_rect_expand_to_grid(int cell_size, guac_common_rect* rect, const guac_common_rect* max_rect) { /* Invalid cell_size received */ if (cell_size <= 0) return -1; /* Nothing to do */ if (cell_size == 1) return 0; /* Calculate how much the rectangle must be adjusted to fit within the * given cell size. */ int dw = cell_size - rect->width % cell_size; int dh = cell_size - rect->height % cell_size; int dx = dw / 2; int dy = dh / 2; /* Set initial extents of adjusted rectangle. */ int top = rect->y - dy; int left = rect->x - dx; int bottom = top + rect->height + dh; int right = left + rect->width + dw; /* The max rectangle */ int max_left = max_rect->x; int max_top = max_rect->y; int max_right = max_left + max_rect->width; int max_bottom = max_top + max_rect->height; /* If the adjusted rectangle has sides beyond the max rectangle, or is larger * in any direction; shift or adjust the rectangle while trying to fit in * the grid */ /* Adjust left/right */ if (right > max_right) { /* shift to left */ dw = right - max_right; right -= dw; left -= dw; /* clamp left if too far */ if (left < max_left) { left = max_left; } } else if (left < max_left) { /* shift to right */ dw = max_left - left; left += dw; right += dw; /* clamp right if too far */ if (right > max_right) { right = max_right; } } /* Adjust top/bottom */ if (bottom > max_bottom) { /* shift up */ dh = bottom - max_bottom; bottom -= dh; top -= dh; /* clamp top if too far */ if (top < max_top) { top = max_top; } } else if (top < max_top) { /* shift down */ dh = max_top - top; top += dh; bottom += dh; /* clamp bottom if too far */ if (bottom > max_bottom) { bottom = max_bottom; } } /* Commit rect */ guac_common_rect_init(rect, left, top, right - left, bottom - top); return 0; } int guac_common_rect_intersects(const guac_common_rect* rect, const guac_common_rect* other) { /* Empty (no intersection) */ if (other->x + other->width < rect->x || rect->x + rect->width < other->x || other->y + other->height < rect->y || rect->y + rect->height < other->y) { return 0; } /* Complete */ else if (other->x <= rect->x && (other->x + other->width) >= (rect->x + rect->width) && other->y <= rect->y && (other->y + other->height) >= (rect->y + rect->height)) { return 2; } /* Partial intersection */ return 1; } int guac_common_rect_clip_and_split(guac_common_rect* rect, const guac_common_rect* hole, guac_common_rect* split_rect) { /* Only continue if the rectangles intersects */ if (!guac_common_rect_intersects(rect, hole)) return 0; int top, left, bottom, right; /* Clip and split top */ if (rect->y < hole->y) { top = rect->y; left = rect->x; bottom = hole->y; right = rect->x + rect->width; guac_common_rect_init(split_rect, left, top, right - left, bottom - top); /* Re-initialize original rect */ top = hole->y; bottom = rect->y + rect->height; guac_common_rect_init(rect, left, top, right - left, bottom - top); return 1; } /* Clip and split left */ else if (rect->x < hole->x) { top = rect->y; left = rect->x; bottom = rect->y + rect->height; right = hole->x; guac_common_rect_init(split_rect, left, top, right - left, bottom - top); /* Re-initialize original rect */ left = hole->x; right = rect->x + rect->width; guac_common_rect_init(rect, left, top, right - left, bottom - top); return 1; } /* Clip and split bottom */ else if (rect->y + rect->height > hole->y + hole->height) { top = hole->y + hole->height; left = rect->x; bottom = rect->y + rect->height; right = rect->x + rect->width; guac_common_rect_init(split_rect, left, top, right - left, bottom - top); /* Re-initialize original rect */ top = rect->y; bottom = hole->y + hole->height; guac_common_rect_init(rect, left, top, right - left, bottom - top); return 1; } /* Clip and split right */ else if (rect->x + rect->width > hole->x + hole->width) { top = rect->y; left = hole->x + hole->width; bottom = rect->y + rect->height; right = rect->x + rect->width; guac_common_rect_init(split_rect, left, top, right - left, bottom - top); /* Re-initialize original rect */ left = rect->x; right = hole->x + hole->width; guac_common_rect_init(rect, left, top, right - left, bottom - top); return 1; } return 0; } guacamole-server-0.9.9/src/common/guac_clipboard.h0000664000175100017510000000637212536405624017124 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 __GUAC_CLIPBOARD_H #define __GUAC_CLIPBOARD_H #include "config.h" #include /** * The maximum number of bytes to send in an individual blob when * transmitting the clipboard contents to a connected client. */ #define GUAC_COMMON_CLIPBOARD_BLOCK_SIZE 4096 /** * Generic clipboard structure. */ typedef struct guac_common_clipboard { /** * The mimetype of the contained clipboard data. */ char mimetype[256]; /** * Arbitrary clipboard data. */ char* buffer; /** * The number of bytes currently stored in the clipboard buffer. */ int length; /** * The total number of bytes available in the clipboard buffer. */ int available; } guac_common_clipboard; /** * Creates a new clipboard having the given initial size. * * @param size The maximum number of bytes to allow within the clipboard. * @return A newly-allocated clipboard. */ guac_common_clipboard* guac_common_clipboard_alloc(int size); /** * Frees the given clipboard. * * @param clipboard The clipboard to free. */ void guac_common_clipboard_free(guac_common_clipboard* clipboard); /** * Sends the contents of the clipboard along the given client, splitting * the contents as necessary. * * @param clipboard The clipboard whose contents should be sent. * @param client The client to send the clipboard contents on. */ void guac_common_clipboard_send(guac_common_clipboard* clipboard, guac_client* client); /** * Clears the clipboard contents and assigns a new mimetype for future data. * * @param clipboard The clipboard to reset. * @param mimetype The mimetype of future data. */ void guac_common_clipboard_reset(guac_common_clipboard* clipboard, const char* mimetype); /** * Appends the given data to the current clipboard contents. The data must * match the mimetype chosen for the clipboard data by * guac_common_clipboard_reset(). * * @param clipboard The clipboard to append data to. * @param data The data to append. * @param length The number of bytes to append from the data given. */ void guac_common_clipboard_append(guac_common_clipboard* clipboard, const char* data, int length); #endif guacamole-server-0.9.9/src/common/guac_pointer_cursor.h0000664000175100017510000000377712643542623020250 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_COMMON_POINTER_CURSOR_H #define _GUAC_COMMON_POINTER_CURSOR_H #include "config.h" #include #include /** * Width of the embedded mouse cursor graphic. */ extern const int guac_common_pointer_cursor_width; /** * Height of the embedded mouse cursor graphic. */ extern const int guac_common_pointer_cursor_height; /** * Number of bytes in each row of the embedded mouse cursor graphic. */ extern const int guac_common_pointer_cursor_stride; /** * The Cairo grapic format of the mouse cursor graphic. */ extern const cairo_format_t guac_common_pointer_cursor_format; /** * Embedded mouse cursor graphic. */ extern unsigned char guac_common_pointer_cursor[]; /** * Set the cursor of the remote display to the embedded cursor graphic. * * @param client The guac_client to send the cursor to. */ void guac_common_set_pointer_cursor(guac_client* client); #endif guacamole-server-0.9.9/src/common/guac_io.h0000664000175100017510000000377212536405624015575 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_COMMON_IO_H #define __GUAC_COMMON_IO_H #include "config.h" /** * Writes absolutely all bytes from within the given buffer, returning an error * only if the required writes fail. * * @param fd The file descriptor to write to. * @param buffer The buffer containing the data to write. * @param length The number of bytes to write. * @return The number of bytes written, or a value less than zero if an error * occurs. */ int guac_common_write(int fd, void* buffer, int length); /** * Reads enough bytes to fill the given buffer, returning an error only if the * required reads fail. * * @param fd The file descriptor to read from. * @param buffer The buffer to read data into. * @param length The number of bytes to read. * @return The number of bytes read, or a value less than zero if an error * occurs. */ int guac_common_read(int fd, void* buffer, int length); #endif guacamole-server-0.9.9/src/common/Makefile.in0000664000175100017510000010113012645400275016044 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Copyright (C) 2015 Glyptodon LLC # # 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. # VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/common DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libguac_common_la_DEPENDENCIES = am_libguac_common_la_OBJECTS = libguac_common_la-guac_io.lo \ libguac_common_la-guac_clipboard.lo \ libguac_common_la-guac_dot_cursor.lo \ libguac_common_la-guac_iconv.lo libguac_common_la-guac_json.lo \ libguac_common_la-guac_list.lo \ libguac_common_la-guac_pointer_cursor.lo \ libguac_common_la-guac_rect.lo \ libguac_common_la-guac_string.lo \ libguac_common_la-guac_surface.lo libguac_common_la_OBJECTS = $(am_libguac_common_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libguac_common_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libguac_common_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libguac_common_la_SOURCES) DIST_SOURCES = $(libguac_common_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COMMON_INCLUDE = @COMMON_INCLUDE@ COMMON_LTLIB = @COMMON_LTLIB@ COMMON_SSH_INCLUDE = @COMMON_SSH_INCLUDE@ COMMON_SSH_LTLIB = @COMMON_SSH_LTLIB@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CUNIT_LIBS = @CUNIT_LIBS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBADD_DLOPEN = @LIBADD_DLOPEN@ LIBGUAC_INCLUDE = @LIBGUAC_INCLUDE@ LIBGUAC_LTLIB = @LIBGUAC_LTLIB@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MATH_LIBS = @MATH_LIBS@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@ PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@ PANGO_CFLAGS = @PANGO_CFLAGS@ PANGO_LIBS = @PANGO_LIBS@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_LIBS = @PNG_LIBS@ PTHREAD_LIBS = @PTHREAD_LIBS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ RDP_LIBS = @RDP_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSH_LIBS = @SSH_LIBS@ SSL_LIBS = @SSL_LIBS@ STRIP = @STRIP@ TELNET_LIBS = @TELNET_LIBS@ TERMINAL_INCLUDE = @TERMINAL_INCLUDE@ TERMINAL_LTLIB = @TERMINAL_LTLIB@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VNC_LIBS = @VNC_LIBS@ VORBIS_LIBS = @VORBIS_LIBS@ WEBP_LIBS = @WEBP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ init_dir = @init_dir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 noinst_LTLIBRARIES = libguac_common.la noinst_HEADERS = \ guac_io.h \ guac_clipboard.h \ guac_dot_cursor.h \ guac_iconv.h \ guac_json.h \ guac_list.h \ guac_pointer_cursor.h \ guac_rect.h \ guac_string.h \ guac_surface.h libguac_common_la_SOURCES = \ guac_io.c \ guac_clipboard.c \ guac_dot_cursor.c \ guac_iconv.c \ guac_json.c \ guac_list.c \ guac_pointer_cursor.c \ guac_rect.c \ guac_string.c \ guac_surface.c libguac_common_la_CFLAGS = \ -Werror -Wall -pedantic \ @LIBGUAC_INCLUDE@ libguac_common_la_LIBADD = \ @LIBGUAC_LTLIB@ all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/common/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/common/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libguac_common.la: $(libguac_common_la_OBJECTS) $(libguac_common_la_DEPENDENCIES) $(EXTRA_libguac_common_la_DEPENDENCIES) $(AM_V_CCLD)$(libguac_common_la_LINK) $(libguac_common_la_OBJECTS) $(libguac_common_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_common_la-guac_clipboard.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_common_la-guac_dot_cursor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_common_la-guac_iconv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_common_la-guac_io.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_common_la-guac_json.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_common_la-guac_list.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_common_la-guac_pointer_cursor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_common_la-guac_rect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_common_la-guac_string.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_common_la-guac_surface.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libguac_common_la-guac_io.lo: guac_io.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -MT libguac_common_la-guac_io.lo -MD -MP -MF $(DEPDIR)/libguac_common_la-guac_io.Tpo -c -o libguac_common_la-guac_io.lo `test -f 'guac_io.c' || echo '$(srcdir)/'`guac_io.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_common_la-guac_io.Tpo $(DEPDIR)/libguac_common_la-guac_io.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_io.c' object='libguac_common_la-guac_io.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -c -o libguac_common_la-guac_io.lo `test -f 'guac_io.c' || echo '$(srcdir)/'`guac_io.c libguac_common_la-guac_clipboard.lo: guac_clipboard.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -MT libguac_common_la-guac_clipboard.lo -MD -MP -MF $(DEPDIR)/libguac_common_la-guac_clipboard.Tpo -c -o libguac_common_la-guac_clipboard.lo `test -f 'guac_clipboard.c' || echo '$(srcdir)/'`guac_clipboard.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_common_la-guac_clipboard.Tpo $(DEPDIR)/libguac_common_la-guac_clipboard.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_clipboard.c' object='libguac_common_la-guac_clipboard.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -c -o libguac_common_la-guac_clipboard.lo `test -f 'guac_clipboard.c' || echo '$(srcdir)/'`guac_clipboard.c libguac_common_la-guac_dot_cursor.lo: guac_dot_cursor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -MT libguac_common_la-guac_dot_cursor.lo -MD -MP -MF $(DEPDIR)/libguac_common_la-guac_dot_cursor.Tpo -c -o libguac_common_la-guac_dot_cursor.lo `test -f 'guac_dot_cursor.c' || echo '$(srcdir)/'`guac_dot_cursor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_common_la-guac_dot_cursor.Tpo $(DEPDIR)/libguac_common_la-guac_dot_cursor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_dot_cursor.c' object='libguac_common_la-guac_dot_cursor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -c -o libguac_common_la-guac_dot_cursor.lo `test -f 'guac_dot_cursor.c' || echo '$(srcdir)/'`guac_dot_cursor.c libguac_common_la-guac_iconv.lo: guac_iconv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -MT libguac_common_la-guac_iconv.lo -MD -MP -MF $(DEPDIR)/libguac_common_la-guac_iconv.Tpo -c -o libguac_common_la-guac_iconv.lo `test -f 'guac_iconv.c' || echo '$(srcdir)/'`guac_iconv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_common_la-guac_iconv.Tpo $(DEPDIR)/libguac_common_la-guac_iconv.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_iconv.c' object='libguac_common_la-guac_iconv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -c -o libguac_common_la-guac_iconv.lo `test -f 'guac_iconv.c' || echo '$(srcdir)/'`guac_iconv.c libguac_common_la-guac_json.lo: guac_json.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -MT libguac_common_la-guac_json.lo -MD -MP -MF $(DEPDIR)/libguac_common_la-guac_json.Tpo -c -o libguac_common_la-guac_json.lo `test -f 'guac_json.c' || echo '$(srcdir)/'`guac_json.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_common_la-guac_json.Tpo $(DEPDIR)/libguac_common_la-guac_json.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_json.c' object='libguac_common_la-guac_json.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -c -o libguac_common_la-guac_json.lo `test -f 'guac_json.c' || echo '$(srcdir)/'`guac_json.c libguac_common_la-guac_list.lo: guac_list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -MT libguac_common_la-guac_list.lo -MD -MP -MF $(DEPDIR)/libguac_common_la-guac_list.Tpo -c -o libguac_common_la-guac_list.lo `test -f 'guac_list.c' || echo '$(srcdir)/'`guac_list.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_common_la-guac_list.Tpo $(DEPDIR)/libguac_common_la-guac_list.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_list.c' object='libguac_common_la-guac_list.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -c -o libguac_common_la-guac_list.lo `test -f 'guac_list.c' || echo '$(srcdir)/'`guac_list.c libguac_common_la-guac_pointer_cursor.lo: guac_pointer_cursor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -MT libguac_common_la-guac_pointer_cursor.lo -MD -MP -MF $(DEPDIR)/libguac_common_la-guac_pointer_cursor.Tpo -c -o libguac_common_la-guac_pointer_cursor.lo `test -f 'guac_pointer_cursor.c' || echo '$(srcdir)/'`guac_pointer_cursor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_common_la-guac_pointer_cursor.Tpo $(DEPDIR)/libguac_common_la-guac_pointer_cursor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_pointer_cursor.c' object='libguac_common_la-guac_pointer_cursor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -c -o libguac_common_la-guac_pointer_cursor.lo `test -f 'guac_pointer_cursor.c' || echo '$(srcdir)/'`guac_pointer_cursor.c libguac_common_la-guac_rect.lo: guac_rect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -MT libguac_common_la-guac_rect.lo -MD -MP -MF $(DEPDIR)/libguac_common_la-guac_rect.Tpo -c -o libguac_common_la-guac_rect.lo `test -f 'guac_rect.c' || echo '$(srcdir)/'`guac_rect.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_common_la-guac_rect.Tpo $(DEPDIR)/libguac_common_la-guac_rect.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_rect.c' object='libguac_common_la-guac_rect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -c -o libguac_common_la-guac_rect.lo `test -f 'guac_rect.c' || echo '$(srcdir)/'`guac_rect.c libguac_common_la-guac_string.lo: guac_string.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -MT libguac_common_la-guac_string.lo -MD -MP -MF $(DEPDIR)/libguac_common_la-guac_string.Tpo -c -o libguac_common_la-guac_string.lo `test -f 'guac_string.c' || echo '$(srcdir)/'`guac_string.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_common_la-guac_string.Tpo $(DEPDIR)/libguac_common_la-guac_string.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_string.c' object='libguac_common_la-guac_string.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -c -o libguac_common_la-guac_string.lo `test -f 'guac_string.c' || echo '$(srcdir)/'`guac_string.c libguac_common_la-guac_surface.lo: guac_surface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -MT libguac_common_la-guac_surface.lo -MD -MP -MF $(DEPDIR)/libguac_common_la-guac_surface.Tpo -c -o libguac_common_la-guac_surface.lo `test -f 'guac_surface.c' || echo '$(srcdir)/'`guac_surface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_common_la-guac_surface.Tpo $(DEPDIR)/libguac_common_la-guac_surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_surface.c' object='libguac_common_la-guac_surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_la_CFLAGS) $(CFLAGS) -c -o libguac_common_la-guac_surface.lo `test -f 'guac_surface.c' || echo '$(srcdir)/'`guac_surface.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: guacamole-server-0.9.9/src/common/guac_clipboard.c0000664000175100017510000000714712643542623017120 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 "config.h" #include "guac_clipboard.h" #include #include #include #include #include guac_common_clipboard* guac_common_clipboard_alloc(int size) { guac_common_clipboard* clipboard = malloc(sizeof(guac_common_clipboard)); /* Init clipboard */ clipboard->mimetype[0] = '\0'; clipboard->buffer = malloc(size); clipboard->length = 0; clipboard->available = size; return clipboard; } void guac_common_clipboard_free(guac_common_clipboard* clipboard) { free(clipboard->buffer); free(clipboard); } void guac_common_clipboard_send(guac_common_clipboard* clipboard, guac_client* client) { char* current = clipboard->buffer; int remaining = clipboard->length; /* Begin stream */ guac_stream* stream = guac_client_alloc_stream(client); guac_protocol_send_clipboard(client->socket, stream, clipboard->mimetype); guac_client_log(client, GUAC_LOG_DEBUG, "Created stream %i for %s clipboard data.", stream->index, clipboard->mimetype); /* Split clipboard into chunks */ while (remaining > 0) { /* Calculate size of next block */ int block_size = GUAC_COMMON_CLIPBOARD_BLOCK_SIZE; if (remaining < block_size) block_size = remaining; /* Send block */ guac_protocol_send_blob(client->socket, stream, current, block_size); guac_client_log(client, GUAC_LOG_DEBUG, "Sent %i bytes of clipboard data on stream %i.", block_size, stream->index); /* Next block */ remaining -= block_size; current += block_size; } guac_client_log(client, GUAC_LOG_DEBUG, "Clipboard stream %i complete.", stream->index); /* End stream */ guac_protocol_send_end(client->socket, stream); guac_client_free_stream(client, stream); } void guac_common_clipboard_reset(guac_common_clipboard* clipboard, const char* mimetype) { clipboard->length = 0; strncpy(clipboard->mimetype, mimetype, sizeof(clipboard->mimetype)-1); } void guac_common_clipboard_append(guac_common_clipboard* clipboard, const char* data, int length) { /* Truncate data to available length */ int remaining = clipboard->available - clipboard->length; if (remaining < length) length = remaining; /* Append to buffer */ memcpy(clipboard->buffer + clipboard->length, data, length); /* Update length */ clipboard->length += length; } guacamole-server-0.9.9/src/common/guac_surface.c0000664000175100017510000013705212645370663016615 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 "config.h" #include "guac_rect.h" #include "guac_surface.h" #include #include #include #include #include #include #include #include #include /** * The width of an update which should be considered negible and thus * trivial overhead compared ot the cost of two updates. */ #define GUAC_SURFACE_NEGLIGIBLE_WIDTH 64 /** * The height of an update which should be considered negible and thus * trivial overhead compared ot the cost of two updates. */ #define GUAC_SURFACE_NEGLIGIBLE_HEIGHT 64 /** * The proportional increase in cost contributed by transfer and processing of * image data, compared to processing an equivalent amount of client-side * data. */ #define GUAC_SURFACE_DATA_FACTOR 16 /** * The base cost of every update. Each update should be considered to have * this starting cost, plus any additional cost estimated from its * content. */ #define GUAC_SURFACE_BASE_COST 4096 /** * An increase in cost is negligible if it is less than * 1/GUAC_SURFACE_NEGLIGIBLE_INCREASE of the old cost. */ #define GUAC_SURFACE_NEGLIGIBLE_INCREASE 4 /** * If combining an update because it appears to be follow a fill pattern, * the combined cost must not exceed * GUAC_SURFACE_FILL_PATTERN_FACTOR * (total uncombined cost). */ #define GUAC_SURFACE_FILL_PATTERN_FACTOR 3 /* Define cairo_format_stride_for_width() if missing */ #ifndef HAVE_CAIRO_FORMAT_STRIDE_FOR_WIDTH #define cairo_format_stride_for_width(format, width) (width*4) #endif /** * The JPEG image quality ('quantization') setting to use. Range 0-100 where * 100 is the highest quality/largest file size, and 0 is the lowest * quality/smallest file size. */ #define GUAC_SURFACE_JPEG_IMAGE_QUALITY 90 /** * The framerate which, if exceeded, indicates that JPEG is preferred. */ #define GUAC_COMMON_SURFACE_JPEG_FRAMERATE 3 /** * Minimum JPEG bitmap size (area). If the bitmap is smaller than this threshold, * it should be compressed as a PNG image to avoid the JPEG compression tax. */ #define GUAC_SURFACE_JPEG_MIN_BITMAP_SIZE 4096 /** * The WebP image quality ('quantization') setting to use. Range 0-100 where * 100 is the highest quality/largest file size, and 0 is the lowest * quality/smallest file size. */ #define GUAC_SURFACE_WEBP_IMAGE_QUALITY 90 /** * The JPEG compression min block size. This defines the optimal rectangle block * size factor for JPEG compression. Usually 8x8 would suffice, but use 16 to * reduce the occurrence of ringing artifacts further. */ #define GUAC_SURFACE_JPEG_BLOCK_SIZE 16 /** * The WebP compression min block size. This defines the optimal rectangle block * size factor for WebP compression. WebP does utilize variable block size, but * ensuring a block size factor reduces any noise on the image edges. */ #define GUAC_SURFACE_WEBP_BLOCK_SIZE 8 /** * Updates the coordinates of the given rectangle to be within the bounds of * the given surface. * * @param surface The surface to use for clipping. * @param rect The rectangle to clip. * @param sx The X coordinate of the source rectangle, if any. * @param sy The Y coordinate of the source rectangle, if any. */ static void __guac_common_bound_rect(guac_common_surface* surface, guac_common_rect* rect, int* sx, int* sy) { guac_common_rect bounds_rect = { .x = 0, .y = 0, .width = surface->width, .height = surface->height }; int orig_x = rect->x; int orig_y = rect->y; guac_common_rect_constrain(rect, &bounds_rect); /* Update source X/Y if given */ if (sx != NULL) *sx += rect->x - orig_x; if (sy != NULL) *sy += rect->y - orig_y; } /** * Updates the coordinates of the given rectangle to be within the clipping * rectangle of the given surface, which must always be within the bounding * rectangle of the given surface. * * @param surface The surface to use for clipping. * @param rect The rectangle to clip. * @param sx The X coordinate of the source rectangle, if any. * @param sy The Y coordinate of the source rectangle, if any. */ static void __guac_common_clip_rect(guac_common_surface* surface, guac_common_rect* rect, int* sx, int* sy) { int orig_x = rect->x; int orig_y = rect->y; /* Just bound within surface if no clipping rectangle applied */ if (!surface->clipped) { __guac_common_bound_rect(surface, rect, sx, sy); return; } guac_common_rect_constrain(rect, &surface->clip_rect); /* Update source X/Y if given */ if (sx != NULL) *sx += rect->x - orig_x; if (sy != NULL) *sy += rect->y - orig_y; } /** * Returns whether the given rectangle should be combined into the existing * dirty rectangle, to be eventually flushed as a "png" instruction. * * @param surface The surface to be queried. * @param rect The update rectangle. * @param rect_only Non-zero if this update, by its nature, contains only * metainformation about the update's rectangle, zero if * the update also contains image data. * @return Non-zero if the update should be combined with any existing update, * zero otherwise. */ static int __guac_common_should_combine(guac_common_surface* surface, const guac_common_rect* rect, int rect_only) { if (surface->dirty) { int combined_cost, dirty_cost, update_cost; /* Simulate combination */ guac_common_rect combined = surface->dirty_rect; guac_common_rect_extend(&combined, rect); /* Combine if result is still small */ if (combined.width <= GUAC_SURFACE_NEGLIGIBLE_WIDTH && combined.height <= GUAC_SURFACE_NEGLIGIBLE_HEIGHT) return 1; /* Estimate costs of the existing update, new update, and both combined */ combined_cost = GUAC_SURFACE_BASE_COST + combined.width * combined.height; dirty_cost = GUAC_SURFACE_BASE_COST + surface->dirty_rect.width * surface->dirty_rect.height; update_cost = GUAC_SURFACE_BASE_COST + rect->width * rect->height; /* Reduce cost if no image data */ if (rect_only) update_cost /= GUAC_SURFACE_DATA_FACTOR; /* Combine if cost estimate shows benefit */ if (combined_cost <= update_cost + dirty_cost) return 1; /* Combine if increase in cost is negligible */ if (combined_cost - dirty_cost <= dirty_cost / GUAC_SURFACE_NEGLIGIBLE_INCREASE) return 1; if (combined_cost - update_cost <= update_cost / GUAC_SURFACE_NEGLIGIBLE_INCREASE) return 1; /* Combine if we anticipate further updates, as this update follows a common fill pattern */ if (rect->x == surface->dirty_rect.x && rect->y == surface->dirty_rect.y + surface->dirty_rect.height) { if (combined_cost <= (dirty_cost + update_cost) * GUAC_SURFACE_FILL_PATTERN_FACTOR) return 1; } } /* Otherwise, do not combine */ return 0; } /** * Expands the dirty rect of the given surface to contain the rect described by the given * coordinates. * * @param surface The surface to mark as dirty. * @param rect The rectangle of the update which is dirtying the surface. */ static void __guac_common_mark_dirty(guac_common_surface* surface, const guac_common_rect* rect) { /* Ignore empty rects */ if (rect->width <= 0 || rect->height <= 0) return; /* If already dirty, update existing rect */ if (surface->dirty) guac_common_rect_extend(&surface->dirty_rect, rect); /* Otherwise init dirty rect */ else { surface->dirty_rect = *rect; surface->dirty = 1; } } /** * Calculate the current average framerate for a given area on the surface. * * @param surface * The surface on which the framerate will be calculated. * * @param rect * The rect containing the area for which the average framerate will be * calculated. * * @return * The average framerate of the given area, in frames per second. */ static unsigned int __guac_common_surface_calculate_framerate( guac_common_surface* surface, const guac_common_rect* rect) { int x, y; /* Calculate heat map dimensions */ int heat_width = GUAC_COMMON_SURFACE_HEAT_DIMENSION(surface->width); /* Calculate minimum X/Y coordinates intersecting given rect */ int min_x = rect->x / GUAC_COMMON_SURFACE_HEAT_CELL_SIZE; int min_y = rect->y / GUAC_COMMON_SURFACE_HEAT_CELL_SIZE; /* Calculate maximum X/Y coordinates intersecting given rect */ int max_x = min_x + (rect->width - 1) / GUAC_COMMON_SURFACE_HEAT_CELL_SIZE; int max_y = min_y + (rect->height - 1) / GUAC_COMMON_SURFACE_HEAT_CELL_SIZE; unsigned int sum_framerate = 0; unsigned int count = 0; /* Get start of buffer at given coordinates */ const guac_common_surface_heat_cell* heat_row = surface->heat_map + min_y * heat_width + min_x; /* Iterate over all the heat map cells for the area * and calculate the average framerate */ for (y = min_y; y < max_y; y++) { /* Get current row of heat map */ const guac_common_surface_heat_cell* heat_cell = heat_row; /* For each cell in subset of row */ for (x = min_x; x < max_x; x++) { /* Calculate indicies for latest and oldest history entries */ int oldest_entry = heat_cell->oldest_entry; int latest_entry = oldest_entry - 1; if (latest_entry < 0) latest_entry = GUAC_COMMON_SURFACE_HEAT_CELL_HISTORY_SIZE - 1; /* Calculate elapsed time covering entire history for this cell */ int elapsed_time = heat_cell->history[latest_entry] - heat_cell->history[oldest_entry]; /* Calculate and add framerate */ if (elapsed_time) sum_framerate += GUAC_COMMON_SURFACE_HEAT_CELL_HISTORY_SIZE * 1000 / elapsed_time; /* Next heat map cell */ heat_cell++; count++; } /* Next heat map row */ heat_row += heat_width; } /* Calculate the average framerate over entire rect */ if (count) return sum_framerate / count; return 0; } /** * Guesses whether a rectangle within a particular surface would be better * compressed as PNG or using a lossy format like JPEG. Positive values * indicate PNG is likely to be superior, while negative values indicate the * opposite. * * @param surface * The surface containing the image data to check. * * @param rect * The rect to check within the given surface. * * @return * Positive values if PNG compression is likely to perform better than * lossy alternatives, or negative values if PNG is likely to perform * worse. */ static int __guac_common_surface_png_optimality(guac_common_surface* surface, const guac_common_rect* rect) { int x, y; int num_same = 0; int num_different = 1; /* Get image/buffer metrics */ int width = rect->width; int height = rect->height; int stride = surface->stride; /* Get buffer from surface */ unsigned char* buffer = surface->buffer + rect->y * stride + rect->x * 4; /* Image must be at least 1x1 */ if (width < 1 || height < 1) return 0; /* For each row */ for (y = 0; y < height; y++) { uint32_t* row = (uint32_t*) buffer; uint32_t last_pixel = *(row++) | 0xFF000000; /* For each pixel in current row */ for (x = 1; x < width; x++) { /* Get next pixel */ uint32_t current_pixel = *(row++) | 0xFF000000; /* Update same/different counts according to pixel value */ if (current_pixel == last_pixel) num_same++; else num_different++; last_pixel = current_pixel; } /* Advance to next row */ buffer += stride; } /* Return rough approximation of optimality for PNG compression */ return 0x100 * num_same / num_different - 0x400; } /** * Returns whether the given rectangle would be optimally encoded as JPEG * rather than PNG. * * @param surface * The surface to be queried. * * @param rect * The rectangle to check. * * @return * Non-zero if the rectangle would be optimally encoded as JPEG, zero * otherwise. */ static int __guac_common_surface_should_use_jpeg(guac_common_surface* surface, const guac_common_rect* rect) { /* Calculate the average framerate for the given rect */ int framerate = __guac_common_surface_calculate_framerate(surface, rect); int rect_size = rect->width * rect->height; /* JPEG is preferred if: * - frame rate is high enough * - image size is large enough * - PNG is not more optimal based on image contents */ return framerate >= GUAC_COMMON_SURFACE_JPEG_FRAMERATE && rect_size > GUAC_SURFACE_JPEG_MIN_BITMAP_SIZE && __guac_common_surface_png_optimality(surface, rect) < 0; } /** * Returns whether the given rectangle would be optimally encoded as WebP * rather than PNG. * * @param surface * The surface to be queried. * * @param rect * The rectangle to check. * * @return * Non-zero if the rectangle would be optimally encoded as WebP, zero * otherwise. */ static int __guac_common_surface_should_use_webp(guac_common_surface* surface, const guac_common_rect* rect) { /* Do not use WebP if not supported */ if (!guac_client_supports_webp(surface->client)) return 0; /* Calculate the average framerate for the given rect */ int framerate = __guac_common_surface_calculate_framerate(surface, rect); /* WebP is preferred if: * - frame rate is high enough * - PNG is not more optimal based on image contents */ return framerate >= GUAC_COMMON_SURFACE_JPEG_FRAMERATE && __guac_common_surface_png_optimality(surface, rect) < 0; } /** * Updates the heat map cells which intersect the given rectangle using the * given timestamp. This timestamp, along with timestamps from past updates, * is used to calculate the framerate of each heat cell. * * @param surface * The surface containing the heat map cells to be updated. * * @param rect * The rectangle containing the heat map cells to be updated. * * @param time * The timestamp to use when updating the heat map cells which intersect * the given rectangle. */ static void __guac_common_surface_touch_rect(guac_common_surface* surface, guac_common_rect* rect, guac_timestamp time) { int x, y; /* Calculate heat map dimensions */ int heat_width = GUAC_COMMON_SURFACE_HEAT_DIMENSION(surface->width); /* Calculate minimum X/Y coordinates intersecting given rect */ int min_x = rect->x / GUAC_COMMON_SURFACE_HEAT_CELL_SIZE; int min_y = rect->y / GUAC_COMMON_SURFACE_HEAT_CELL_SIZE; /* Calculate maximum X/Y coordinates intersecting given rect */ int max_x = min_x + (rect->width - 1) / GUAC_COMMON_SURFACE_HEAT_CELL_SIZE; int max_y = min_y + (rect->height - 1) / GUAC_COMMON_SURFACE_HEAT_CELL_SIZE; /* Get start of buffer at given coordinates */ guac_common_surface_heat_cell* heat_row = surface->heat_map + min_y * heat_width + min_x; /* Update all heat map cells which intersect with rectangle */ for (y = min_y; y <= max_y; y++) { /* Get current row of heat map */ guac_common_surface_heat_cell* heat_cell = heat_row; /* For each cell in subset of row */ for (x = min_x; x <= max_x; x++) { /* Replace oldest entry with new timestamp */ heat_cell->history[heat_cell->oldest_entry] = time; /* Update to next oldest entry */ heat_cell->oldest_entry++; if (heat_cell->oldest_entry >= GUAC_COMMON_SURFACE_HEAT_CELL_HISTORY_SIZE) heat_cell->oldest_entry = 0; /* Advance to next heat map cell */ heat_cell++; } /* Next heat map row */ heat_row += heat_width; } } /** * Flushes the bitmap update currently described by the dirty rectangle within the * given surface to that surface's bitmap queue. There MUST be space within the * queue. * * @param surface The surface to flush. */ static void __guac_common_surface_flush_to_queue(guac_common_surface* surface) { guac_common_surface_bitmap_rect* rect; /* Do not flush if not dirty */ if (!surface->dirty) return; /* Add new rect to queue */ rect = &(surface->bitmap_queue[surface->bitmap_queue_length++]); rect->rect = surface->dirty_rect; rect->flushed = 0; /* Surface now flushed */ surface->dirty = 0; } void guac_common_surface_flush_deferred(guac_common_surface* surface) { /* Do not flush if not dirty */ if (!surface->dirty) return; /* Flush if queue size has reached maximum (space is reserved for the final dirty rect, * as guac_common_surface_flush() MAY add an additional rect to the queue */ if (surface->bitmap_queue_length == GUAC_COMMON_SURFACE_QUEUE_SIZE-1) guac_common_surface_flush(surface); /* Append dirty rect to queue */ __guac_common_surface_flush_to_queue(surface); } /** * Transfers a single uint32_t using the given transfer function. * * @param op The transfer function to use. * @param src The source of the uint32_t value. * @param dst THe destination which will hold the result of the transfer. * @return Non-zero if the destination value was changed, zero otherwise. */ static int __guac_common_surface_transfer_int(guac_transfer_function op, uint32_t* src, uint32_t* dst) { uint32_t orig = *dst; switch (op) { case GUAC_TRANSFER_BINARY_BLACK: *dst = 0xFF000000; break; case GUAC_TRANSFER_BINARY_WHITE: *dst = 0xFFFFFFFF; break; case GUAC_TRANSFER_BINARY_SRC: *dst = *src; break; case GUAC_TRANSFER_BINARY_DEST: /* NOP */ break; case GUAC_TRANSFER_BINARY_NSRC: *dst = ~(*src); break; case GUAC_TRANSFER_BINARY_NDEST: *dst = ~(*dst); break; case GUAC_TRANSFER_BINARY_AND: *dst = (*dst) & (*src); break; case GUAC_TRANSFER_BINARY_NAND: *dst = ~((*dst) & (*src)); break; case GUAC_TRANSFER_BINARY_OR: *dst = (*dst) | (*src); break; case GUAC_TRANSFER_BINARY_NOR: *dst = ~((*dst) | (*src)); break; case GUAC_TRANSFER_BINARY_XOR: *dst = (*dst) ^ (*src); break; case GUAC_TRANSFER_BINARY_XNOR: *dst = ~((*dst) ^ (*src)); break; case GUAC_TRANSFER_BINARY_NSRC_AND: *dst = (*dst) & ~(*src); break; case GUAC_TRANSFER_BINARY_NSRC_NAND: *dst = ~((*dst) & ~(*src)); break; case GUAC_TRANSFER_BINARY_NSRC_OR: *dst = (*dst) | ~(*src); break; case GUAC_TRANSFER_BINARY_NSRC_NOR: *dst = ~((*dst) | ~(*src)); break; } return *dst != orig; } /** * Draws a rectangle of solid color within the backing surface of the * given destination surface. * * @param dst The destination surface. * @param rect The rectangle to draw. * @param red The red component of the color of the rectangle. * @param green The green component of the color of the rectangle. * @param blue The blue component of the color of the rectangle. */ static void __guac_common_surface_rect(guac_common_surface* dst, guac_common_rect* rect, int red, int green, int blue) { int x, y; int dst_stride; unsigned char* dst_buffer; uint32_t color = 0xFF000000 | (red << 16) | (green << 8) | blue; int min_x = rect->width - 1; int min_y = rect->height - 1; int max_x = 0; int max_y = 0; dst_stride = dst->stride; dst_buffer = dst->buffer + (dst_stride * rect->y) + (4 * rect->x); /* For each row */ for (y=0; y < rect->height; y++) { uint32_t* dst_current = (uint32_t*) dst_buffer; /* Set row */ for (x=0; x < rect->width; x++) { uint32_t old_color = *dst_current; if (old_color != color) { if (x < min_x) min_x = x; if (y < min_y) min_y = y; if (x > max_x) max_x = x; if (y > max_y) max_y = y; *dst_current = color; } dst_current++; } /* Next row */ dst_buffer += dst_stride; } /* Restrict destination rect to only updated pixels */ if (max_x >= min_x && max_y >= min_y) { rect->x += min_x; rect->y += min_y; rect->width = max_x - min_x + 1; rect->height = max_y - min_y + 1; } else { rect->width = 0; rect->height = 0; } } /** * Copies data from the given buffer to the surface at the given coordinates. * The dimensions and location of the destination rectangle will be altered * to remove as many unchanged pixels as possible. * * @param src_buffer The buffer to copy. * @param src_stride The number of bytes in each row of the source buffer. * @param sx The X coordinate of the source rectangle. * @param sy The Y coordinate of the source rectangle. * @param dst The destination surface. * @param rect The destination rectangle. * @param opaque Non-zero if the source surface is opaque (its alpha channel * should be ignored), zero otherwise. */ static void __guac_common_surface_put(unsigned char* src_buffer, int src_stride, int* sx, int* sy, guac_common_surface* dst, guac_common_rect* rect, int opaque) { unsigned char* dst_buffer = dst->buffer; int dst_stride = dst->stride; int x, y; int min_x = rect->width; int min_y = rect->height; int max_x = 0; int max_y = 0; int orig_x = rect->x; int orig_y = rect->y; src_buffer += src_stride * (*sy) + 4 * (*sx); dst_buffer += (dst_stride * rect->y) + (4 * rect->x); /* For each row */ for (y=0; y < rect->height; y++) { uint32_t* src_current = (uint32_t*) src_buffer; uint32_t* dst_current = (uint32_t*) dst_buffer; /* Copy row */ for (x=0; x < rect->width; x++) { if (opaque || (*src_current & 0xFF000000)) { uint32_t new_color = *src_current | 0xFF000000; uint32_t old_color = *dst_current; if (old_color != new_color) { if (x < min_x) min_x = x; if (y < min_y) min_y = y; if (x > max_x) max_x = x; if (y > max_y) max_y = y; *dst_current = new_color; } } src_current++; dst_current++; } /* Next row */ src_buffer += src_stride; dst_buffer += dst_stride; } /* Restrict destination rect to only updated pixels */ if (max_x >= min_x && max_y >= min_y) { rect->x += min_x; rect->y += min_y; rect->width = max_x - min_x + 1; rect->height = max_y - min_y + 1; } else { rect->width = 0; rect->height = 0; } /* Update source X/Y */ *sx += rect->x - orig_x; *sy += rect->y - orig_y; } /** * Fills the given surface with color, using the given buffer as a mask. Color * will be added to the given surface iff the corresponding pixel within the * buffer is opaque. * * @param src_buffer The buffer to use as a mask. * @param src_stride The number of bytes in each row of the source buffer. * @param sx The X coordinate of the source rectangle. * @param sy The Y coordinate of the source rectangle. * @param dst The destination surface. * @param rect The destination rectangle. * @param red The red component of the color of the fill. * @param green The green component of the color of the fill. * @param blue The blue component of the color of the fill. */ static void __guac_common_surface_fill_mask(unsigned char* src_buffer, int src_stride, int sx, int sy, guac_common_surface* dst, guac_common_rect* rect, int red, int green, int blue) { unsigned char* dst_buffer = dst->buffer; int dst_stride = dst->stride; uint32_t color = 0xFF000000 | (red << 16) | (green << 8) | blue; int x, y; src_buffer += src_stride*sy + 4*sx; dst_buffer += (dst_stride * rect->y) + (4 * rect->x); /* For each row */ for (y=0; y < rect->height; y++) { uint32_t* src_current = (uint32_t*) src_buffer; uint32_t* dst_current = (uint32_t*) dst_buffer; /* Stencil row */ for (x=0; x < rect->width; x++) { /* Fill with color if opaque */ if (*src_current & 0xFF000000) *dst_current = color; src_current++; dst_current++; } /* Next row */ src_buffer += src_stride; dst_buffer += dst_stride; } } /** * Copies data from the given surface to the given destination surface using * the specified transfer function. * * @param src_buffer The buffer to copy. * @param src_stride The number of bytes in each row of the source buffer. * @param sx The X coordinate of the source rectangle. * @param sy The Y coordinate of the source rectangle. * @param op The transfer function to use. * @param dst The destination surface. * @param rect The destination rectangle. */ static void __guac_common_surface_transfer(guac_common_surface* src, int* sx, int* sy, guac_transfer_function op, guac_common_surface* dst, guac_common_rect* rect) { unsigned char* src_buffer = src->buffer; unsigned char* dst_buffer = dst->buffer; int x, y; int src_stride, dst_stride; int step = 1; int min_x = rect->width - 1; int min_y = rect->height - 1; int max_x = 0; int max_y = 0; int orig_x = rect->x; int orig_y = rect->y; /* Copy forwards only if destination is in a different surface or is before source */ if (src != dst || rect->y < *sy || (rect->y == *sy && rect->x < *sx)) { src_buffer += src->stride * (*sy) + 4 * (*sx); dst_buffer += (dst->stride * rect->y) + (4 * rect->x); src_stride = src->stride; dst_stride = dst->stride; step = 1; } /* Otherwise, copy backwards */ else { src_buffer += src->stride * (*sy + rect->height - 1) + 4 * (*sx + rect->width - 1); dst_buffer += dst->stride * (rect->y + rect->height - 1) + 4 * (rect->x + rect->width - 1); src_stride = -src->stride; dst_stride = -dst->stride; step = -1; } /* For each row */ for (y=0; y < rect->height; y++) { uint32_t* src_current = (uint32_t*) src_buffer; uint32_t* dst_current = (uint32_t*) dst_buffer; /* Transfer each pixel in row */ for (x=0; x < rect->width; x++) { if (__guac_common_surface_transfer_int(op, src_current, dst_current)) { if (x < min_x) min_x = x; if (y < min_y) min_y = y; if (x > max_x) max_x = x; if (y > max_y) max_y = y; } src_current += step; dst_current += step; } /* Next row */ src_buffer += src_stride; dst_buffer += dst_stride; } /* Translate X coordinate space of moving backwards */ if (step < 0) { int old_max_x = max_x; max_x = rect->width - 1 - min_x; min_x = rect->width - 1 - old_max_x; } /* Translate Y coordinate space of moving backwards */ if (dst_stride < 0) { int old_max_y = max_y; max_y = rect->height - 1 - min_y; min_y = rect->height - 1 - old_max_y; } /* Restrict destination rect to only updated pixels */ if (max_x >= min_x && max_y >= min_y) { rect->x += min_x; rect->y += min_y; rect->width = max_x - min_x + 1; rect->height = max_y - min_y + 1; } else { rect->width = 0; rect->height = 0; } /* Update source X/Y */ *sx += rect->x - orig_x; *sy += rect->y - orig_y; } guac_common_surface* guac_common_surface_alloc(guac_client* client, guac_socket* socket, const guac_layer* layer, int w, int h) { /* Calculate heat map dimensions */ int heat_width = GUAC_COMMON_SURFACE_HEAT_DIMENSION(w); int heat_height = GUAC_COMMON_SURFACE_HEAT_DIMENSION(h); /* Init surface */ guac_common_surface* surface = calloc(1, sizeof(guac_common_surface)); surface->client = client; surface->socket = socket; surface->layer = layer; surface->width = w; surface->height = h; /* Create corresponding Cairo surface */ surface->stride = cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, w); surface->buffer = calloc(h, surface->stride); /* Create corresponding heat map */ surface->heat_map = calloc(heat_width * heat_height, sizeof(guac_common_surface_heat_cell)); /* Reset clipping rect */ guac_common_surface_reset_clip(surface); /* Layers must initially exist */ if (layer->index >= 0) { guac_protocol_send_size(socket, layer, w, h); surface->realized = 1; } /* Defer creation of buffers */ else surface->realized = 0; return surface; } void guac_common_surface_free(guac_common_surface* surface) { /* Only dispose of surface if it exists */ if (surface->realized) guac_protocol_send_dispose(surface->socket, surface->layer); free(surface->heat_map); free(surface->buffer); free(surface); } void guac_common_surface_resize(guac_common_surface* surface, int w, int h) { guac_socket* socket = surface->socket; const guac_layer* layer = surface->layer; unsigned char* old_buffer; int old_stride; guac_common_rect old_rect; int sx = 0; int sy = 0; /* Calculate heat map dimensions */ int heat_width = GUAC_COMMON_SURFACE_HEAT_DIMENSION(w); int heat_height = GUAC_COMMON_SURFACE_HEAT_DIMENSION(h); /* Copy old surface data */ old_buffer = surface->buffer; old_stride = surface->stride; guac_common_rect_init(&old_rect, 0, 0, surface->width, surface->height); /* Re-initialize at new size */ surface->width = w; surface->height = h; surface->stride = cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, w); surface->buffer = calloc(h, surface->stride); __guac_common_bound_rect(surface, &surface->clip_rect, NULL, NULL); /* Copy relevant old data */ __guac_common_bound_rect(surface, &old_rect, NULL, NULL); __guac_common_surface_put(old_buffer, old_stride, &sx, &sy, surface, &old_rect, 1); /* Free old data */ free(old_buffer); /* Allocate completely new heat map (can safely discard old stats) */ free(surface->heat_map); surface->heat_map = calloc(heat_width * heat_height, sizeof(guac_common_surface_heat_cell)); /* Resize dirty rect to fit new surface dimensions */ if (surface->dirty) { __guac_common_bound_rect(surface, &surface->dirty_rect, NULL, NULL); if (surface->dirty_rect.width <= 0 || surface->dirty_rect.height <= 0) surface->dirty = 0; } /* Update Guacamole layer */ if (surface->realized) guac_protocol_send_size(socket, layer, w, h); } void guac_common_surface_draw(guac_common_surface* surface, int x, int y, cairo_surface_t* src) { unsigned char* buffer = cairo_image_surface_get_data(src); cairo_format_t format = cairo_image_surface_get_format(src); int stride = cairo_image_surface_get_stride(src); int w = cairo_image_surface_get_width(src); int h = cairo_image_surface_get_height(src); int sx = 0; int sy = 0; guac_common_rect rect; guac_common_rect_init(&rect, x, y, w, h); /* Clip operation */ __guac_common_clip_rect(surface, &rect, &sx, &sy); if (rect.width <= 0 || rect.height <= 0) return; /* Update backing surface */ __guac_common_surface_put(buffer, stride, &sx, &sy, surface, &rect, format != CAIRO_FORMAT_ARGB32); if (rect.width <= 0 || rect.height <= 0) return; /* Update the heat map for the update rectangle. */ guac_timestamp time = guac_timestamp_current(); __guac_common_surface_touch_rect(surface, &rect, time); /* Flush if not combining */ if (!__guac_common_should_combine(surface, &rect, 0)) guac_common_surface_flush_deferred(surface); /* Always defer draws */ __guac_common_mark_dirty(surface, &rect); } void guac_common_surface_paint(guac_common_surface* surface, int x, int y, cairo_surface_t* src, int red, int green, int blue) { unsigned char* buffer = cairo_image_surface_get_data(src); int stride = cairo_image_surface_get_stride(src); int w = cairo_image_surface_get_width(src); int h = cairo_image_surface_get_height(src); int sx = 0; int sy = 0; guac_common_rect rect; guac_common_rect_init(&rect, x, y, w, h); /* Clip operation */ __guac_common_clip_rect(surface, &rect, &sx, &sy); if (rect.width <= 0 || rect.height <= 0) return; /* Update backing surface */ __guac_common_surface_fill_mask(buffer, stride, sx, sy, surface, &rect, red, green, blue); /* Flush if not combining */ if (!__guac_common_should_combine(surface, &rect, 0)) guac_common_surface_flush_deferred(surface); /* Always defer draws */ __guac_common_mark_dirty(surface, &rect); } void guac_common_surface_copy(guac_common_surface* src, int sx, int sy, int w, int h, guac_common_surface* dst, int dx, int dy) { guac_socket* socket = dst->socket; const guac_layer* src_layer = src->layer; const guac_layer* dst_layer = dst->layer; guac_common_rect rect; guac_common_rect_init(&rect, dx, dy, w, h); /* Clip operation */ __guac_common_clip_rect(dst, &rect, &sx, &sy); if (rect.width <= 0 || rect.height <= 0) return; /* Update backing surface first only if destination rect cannot intersect source rect */ if (src != dst) { __guac_common_surface_transfer(src, &sx, &sy, GUAC_TRANSFER_BINARY_SRC, dst, &rect); if (rect.width <= 0 || rect.height <= 0) return; } /* Defer if combining */ if (__guac_common_should_combine(dst, &rect, 1)) __guac_common_mark_dirty(dst, &rect); /* Otherwise, flush and draw immediately */ else { guac_common_surface_flush(dst); guac_common_surface_flush(src); guac_protocol_send_copy(socket, src_layer, sx, sy, rect.width, rect.height, GUAC_COMP_OVER, dst_layer, rect.x, rect.y); dst->realized = 1; } /* Update backing surface last if destination rect can intersect source rect */ if (src == dst) __guac_common_surface_transfer(src, &sx, &sy, GUAC_TRANSFER_BINARY_SRC, dst, &rect); } void guac_common_surface_transfer(guac_common_surface* src, int sx, int sy, int w, int h, guac_transfer_function op, guac_common_surface* dst, int dx, int dy) { guac_socket* socket = dst->socket; const guac_layer* src_layer = src->layer; const guac_layer* dst_layer = dst->layer; guac_common_rect rect; guac_common_rect_init(&rect, dx, dy, w, h); /* Clip operation */ __guac_common_clip_rect(dst, &rect, &sx, &sy); if (rect.width <= 0 || rect.height <= 0) return; /* Update backing surface first only if destination rect cannot intersect source rect */ if (src != dst) { __guac_common_surface_transfer(src, &sx, &sy, op, dst, &rect); if (rect.width <= 0 || rect.height <= 0) return; } /* Defer if combining */ if (__guac_common_should_combine(dst, &rect, 1)) __guac_common_mark_dirty(dst, &rect); /* Otherwise, flush and draw immediately */ else { guac_common_surface_flush(dst); guac_common_surface_flush(src); guac_protocol_send_transfer(socket, src_layer, sx, sy, rect.width, rect.height, op, dst_layer, rect.x, rect.y); dst->realized = 1; } /* Update backing surface last if destination rect can intersect source rect */ if (src == dst) __guac_common_surface_transfer(src, &sx, &sy, op, dst, &rect); } void guac_common_surface_rect(guac_common_surface* surface, int x, int y, int w, int h, int red, int green, int blue) { guac_socket* socket = surface->socket; const guac_layer* layer = surface->layer; guac_common_rect rect; guac_common_rect_init(&rect, x, y, w, h); /* Clip operation */ __guac_common_clip_rect(surface, &rect, NULL, NULL); if (rect.width <= 0 || rect.height <= 0) return; /* Update backing surface */ __guac_common_surface_rect(surface, &rect, red, green, blue); if (rect.width <= 0 || rect.height <= 0) return; /* Defer if combining */ if (__guac_common_should_combine(surface, &rect, 1)) __guac_common_mark_dirty(surface, &rect); /* Otherwise, flush and draw immediately */ else { guac_common_surface_flush(surface); guac_protocol_send_rect(socket, layer, rect.x, rect.y, rect.width, rect.height); guac_protocol_send_cfill(socket, GUAC_COMP_OVER, layer, red, green, blue, 0xFF); surface->realized = 1; } } void guac_common_surface_clip(guac_common_surface* surface, int x, int y, int w, int h) { guac_common_rect clip; /* Init clipping rectangle if clipping not already applied */ if (!surface->clipped) { guac_common_rect_init(&surface->clip_rect, 0, 0, surface->width, surface->height); surface->clipped = 1; } guac_common_rect_init(&clip, x, y, w, h); guac_common_rect_constrain(&surface->clip_rect, &clip); } void guac_common_surface_reset_clip(guac_common_surface* surface) { surface->clipped = 0; } /** * Flushes the bitmap update currently described by the dirty rectangle within * the given surface directly via an "img" instruction as PNG data. The * resulting instructions will be sent over the socket associated with the * given surface. * * @param surface * The surface to flush. */ static void __guac_common_surface_flush_to_png(guac_common_surface* surface) { if (surface->dirty) { guac_socket* socket = surface->socket; const guac_layer* layer = surface->layer; /* Get Cairo surface for specified rect */ unsigned char* buffer = surface->buffer + surface->dirty_rect.y * surface->stride + surface->dirty_rect.x * 4; cairo_surface_t* rect = cairo_image_surface_create_for_data(buffer, CAIRO_FORMAT_RGB24, surface->dirty_rect.width, surface->dirty_rect.height, surface->stride); /* Send PNG for rect */ guac_client_stream_png(surface->client, socket, GUAC_COMP_OVER, layer, surface->dirty_rect.x, surface->dirty_rect.y, rect); cairo_surface_destroy(rect); surface->realized = 1; /* Surface is no longer dirty */ surface->dirty = 0; } } /** * Flushes the bitmap update currently described by the dirty rectangle within * the given surface directly via an "img" instruction as JPEG data. The * resulting instructions will be sent over the socket associated with the * given surface. * * @param surface * The surface to flush. */ static void __guac_common_surface_flush_to_jpeg(guac_common_surface* surface) { if (surface->dirty) { guac_socket* socket = surface->socket; const guac_layer* layer = surface->layer; guac_common_rect max; guac_common_rect_init(&max, 0, 0, surface->width, surface->height); /* Expand the dirty rect size to fit in a grid with cells equal to the * minimum JPEG block size */ guac_common_rect_expand_to_grid(GUAC_SURFACE_JPEG_BLOCK_SIZE, &surface->dirty_rect, &max); /* Get Cairo surface for specified rect */ unsigned char* buffer = surface->buffer + surface->dirty_rect.y * surface->stride + surface->dirty_rect.x * 4; cairo_surface_t* rect = cairo_image_surface_create_for_data(buffer, CAIRO_FORMAT_RGB24, surface->dirty_rect.width, surface->dirty_rect.height, surface->stride); /* Send JPEG for rect */ guac_client_stream_jpeg(surface->client, socket, GUAC_COMP_OVER, layer, surface->dirty_rect.x, surface->dirty_rect.y, rect, GUAC_SURFACE_JPEG_IMAGE_QUALITY); cairo_surface_destroy(rect); surface->realized = 1; /* Surface is no longer dirty */ surface->dirty = 0; } } /** * Flushes the bitmap update currently described by the dirty rectangle within * the given surface directly via an "img" instruction as WebP data. The * resulting instructions will be sent over the socket associated with the * given surface. * * @param surface * The surface to flush. */ static void __guac_common_surface_flush_to_webp(guac_common_surface* surface) { if (surface->dirty) { guac_socket* socket = surface->socket; const guac_layer* layer = surface->layer; guac_common_rect max; guac_common_rect_init(&max, 0, 0, surface->width, surface->height); /* Expand the dirty rect size to fit in a grid with cells equal to the * minimum WebP block size */ guac_common_rect_expand_to_grid(GUAC_SURFACE_WEBP_BLOCK_SIZE, &surface->dirty_rect, &max); /* Get Cairo surface for specified rect */ unsigned char* buffer = surface->buffer + surface->dirty_rect.y * surface->stride + surface->dirty_rect.x * 4; cairo_surface_t* rect = cairo_image_surface_create_for_data(buffer, CAIRO_FORMAT_RGB24, surface->dirty_rect.width, surface->dirty_rect.height, surface->stride); /* Send WebP for rect */ guac_client_stream_webp(surface->client, socket, GUAC_COMP_OVER, layer, surface->dirty_rect.x, surface->dirty_rect.y, rect, GUAC_SURFACE_WEBP_IMAGE_QUALITY, 0); cairo_surface_destroy(rect); surface->realized = 1; /* Surface is no longer dirty */ surface->dirty = 0; } } /** * Comparator for instances of guac_common_surface_bitmap_rect, the elements * which make up a surface's bitmap buffer. * * @see qsort */ static int __guac_common_surface_bitmap_rect_compare(const void* a, const void* b) { guac_common_surface_bitmap_rect* ra = (guac_common_surface_bitmap_rect*) a; guac_common_surface_bitmap_rect* rb = (guac_common_surface_bitmap_rect*) b; /* Order roughly top to bottom, left to right */ if (ra->rect.y != rb->rect.y) return ra->rect.y - rb->rect.y; if (ra->rect.x != rb->rect.x) return ra->rect.x - rb->rect.x; /* Wider updates should come first (more likely to intersect later) */ if (ra->rect.width != rb->rect.width) return rb->rect.width - ra->rect.width; /* Shorter updates should come first (less likely to increase cost) */ return ra->rect.height - rb->rect.height; } void guac_common_surface_flush(guac_common_surface* surface) { /* Flush final dirty rectangle to queue. */ __guac_common_surface_flush_to_queue(surface); guac_common_surface_bitmap_rect* current = surface->bitmap_queue; int i, j; int original_queue_length; int flushed = 0; original_queue_length = surface->bitmap_queue_length; /* Sort updates to make combination less costly */ qsort(surface->bitmap_queue, surface->bitmap_queue_length, sizeof(guac_common_surface_bitmap_rect), __guac_common_surface_bitmap_rect_compare); /* Flush all rects in queue */ for (i=0; i < surface->bitmap_queue_length; i++) { /* Get next unflushed candidate */ guac_common_surface_bitmap_rect* candidate = current; if (!candidate->flushed) { int combined = 0; /* Build up rect as much as possible */ for (j=i; j < surface->bitmap_queue_length; j++) { if (!candidate->flushed) { /* Clip candidate within current bounds */ __guac_common_bound_rect(surface, &candidate->rect, NULL, NULL); if (candidate->rect.width <= 0 || candidate->rect.height <= 0) candidate->flushed = 1; /* Combine if reasonable */ else if (__guac_common_should_combine(surface, &candidate->rect, 0) || !surface->dirty) { __guac_common_mark_dirty(surface, &candidate->rect); candidate->flushed = 1; combined++; } } candidate++; } /* Re-add to queue if there's room and this update was modified or we expect others might be */ if ((combined > 1 || i < original_queue_length) && surface->bitmap_queue_length < GUAC_COMMON_SURFACE_QUEUE_SIZE) __guac_common_surface_flush_to_queue(surface); /* Flush as bitmap otherwise */ else if (surface->dirty) { flushed++; /* Prefer WebP when reasonable */ if (__guac_common_surface_should_use_webp(surface, &surface->dirty_rect)) __guac_common_surface_flush_to_webp(surface); /* If not WebP, JPEG is the next best (lossy) choice */ else if (__guac_common_surface_should_use_jpeg(surface, &surface->dirty_rect)) __guac_common_surface_flush_to_jpeg(surface); /* Use PNG if no lossy formats are appropriate */ else __guac_common_surface_flush_to_png(surface); } } current++; } /* Flush complete */ surface->bitmap_queue_length = 0; } guacamole-server-0.9.9/src/common/guac_json.c0000664000175100017510000001270212626133327016121 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "config.h" #include "guac_json.h" #include #include #include #include #include #include #include void guac_common_json_flush(guac_client* client, guac_stream* stream, guac_common_json_state* json_state) { /* If JSON buffer is non-empty, write contents to blob and reset */ if (json_state->size > 0) { guac_protocol_send_blob(client->socket, stream, json_state->buffer, json_state->size); /* Reset JSON buffer size */ json_state->size = 0; } } int guac_common_json_write(guac_client* client, guac_stream* stream, guac_common_json_state* json_state, const char* buffer, int length) { int blob_written = 0; /* * Append to and flush the JSON buffer as necessary to write the given * data */ while (length > 0) { /* Ensure provided data does not exceed size of buffer */ int blob_length = length; if (blob_length > sizeof(json_state->buffer)) blob_length = sizeof(json_state->buffer); /* Flush if more room is needed */ if (json_state->size + blob_length > sizeof(json_state->buffer)) { guac_common_json_flush(client, stream, json_state); blob_written = 1; } /* Append data to JSON buffer */ memcpy(json_state->buffer + json_state->size, buffer, blob_length); json_state->size += blob_length; /* Advance to next blob of data */ buffer += blob_length; length -= blob_length; } return blob_written; } int guac_common_json_write_string(guac_client* client, guac_stream* stream, guac_common_json_state* json_state, const char* str) { int blob_written = 0; /* Write starting quote */ blob_written |= guac_common_json_write(client, stream, json_state, "\"", 1); /* Write given string, escaping as necessary */ const char* current = str; for (; *current != '\0'; current++) { /* Escape all quotes */ if (*current == '"') { /* Write any string content up to current character */ if (current != str) blob_written |= guac_common_json_write(client, stream, json_state, str, current - str); /* Escape the quote that was just read */ blob_written |= guac_common_json_write(client, stream, json_state, "\\", 1); /* Reset string */ str = current; } } /* Write any remaining string content */ if (current != str) blob_written |= guac_common_json_write(client, stream, json_state, str, current - str); /* Write ending quote */ blob_written |= guac_common_json_write(client, stream, json_state, "\"", 1); return blob_written; } int guac_common_json_write_property(guac_client* client, guac_stream* stream, guac_common_json_state* json_state, const char* name, const char* value) { int blob_written = 0; /* Write leading comma if not first property */ if (json_state->properties_written != 0) blob_written |= guac_common_json_write(client, stream, json_state, ",", 1); /* Write property name */ blob_written |= guac_common_json_write_string(client, stream, json_state, name); /* Separate name from value with colon */ blob_written |= guac_common_json_write(client, stream, json_state, ":", 1); /* Write property value */ blob_written |= guac_common_json_write_string(client, stream, json_state, value); json_state->properties_written++; return blob_written; } void guac_common_json_begin_object(guac_client* client, guac_stream* stream, guac_common_json_state* json_state) { /* Init JSON state */ json_state->size = 0; json_state->properties_written = 0; /* Write leading brace - no blob can possibly be written by this */ assert(!guac_common_json_write(client, stream, json_state, "{", 1)); } int guac_common_json_end_object(guac_client* client, guac_stream* stream, guac_common_json_state* json_state) { /* Write final brace of JSON object */ return guac_common_json_write(client, stream, json_state, "}", 1); } guacamole-server-0.9.9/src/common/guac_iconv.c0000664000175100017510000001164412536405624016274 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "guac_iconv.h" #include #include /** * Lookup table for Unicode code points, indexed by CP-1252 codepoint. */ const static int __GUAC_RDP_CP1252_CODEPOINT[32] = { 0x20AC, /* 0x80 */ 0xFFFD, /* 0x81 */ 0x201A, /* 0x82 */ 0x0192, /* 0x83 */ 0x201E, /* 0x84 */ 0x2026, /* 0x85 */ 0x2020, /* 0x86 */ 0x2021, /* 0x87 */ 0x02C6, /* 0x88 */ 0x2030, /* 0x89 */ 0x0160, /* 0x8A */ 0x2039, /* 0x8B */ 0x0152, /* 0x8C */ 0xFFFD, /* 0x8D */ 0x017D, /* 0x8E */ 0xFFFD, /* 0x8F */ 0xFFFD, /* 0x90 */ 0x2018, /* 0x91 */ 0x2019, /* 0x92 */ 0x201C, /* 0x93 */ 0x201D, /* 0x94 */ 0x2022, /* 0x95 */ 0x2013, /* 0x96 */ 0x2014, /* 0x97 */ 0x02DC, /* 0x98 */ 0x2122, /* 0x99 */ 0x0161, /* 0x9A */ 0x203A, /* 0x9B */ 0x0153, /* 0x9C */ 0xFFFD, /* 0x9D */ 0x017E, /* 0x9E */ 0x0178, /* 0x9F */ }; int guac_iconv(guac_iconv_read* reader, const char** input, int in_remaining, guac_iconv_write* writer, char** output, int out_remaining) { while (in_remaining > 0 && out_remaining > 0) { int value; const char* read_start; char* write_start; /* Read character */ read_start = *input; value = reader(input, in_remaining); in_remaining -= *input - read_start; /* Write character */ write_start = *output; writer(output, out_remaining, value); out_remaining -= *output - write_start; /* Stop if null terminator reached */ if (value == 0) return 1; } /* Null terminator not reached */ return 0; } int GUAC_READ_UTF8(const char** input, int remaining) { int value; *input += guac_utf8_read(*input, remaining, &value); return value; } int GUAC_READ_UTF16(const char** input, int remaining) { int value; /* Bail if not enough data */ if (remaining < 2) return 0; /* Read two bytes as integer */ value = *((uint16_t*) *input); *input += 2; return value; } int GUAC_READ_CP1252(const char** input, int remaining) { int value = *((unsigned char*) *input); /* Replace value with exception if not identical to ISO-8859-1 */ if (value >= 0x80 && value <= 0x9F) value = __GUAC_RDP_CP1252_CODEPOINT[value - 0x80]; (*input)++; return value; } int GUAC_READ_ISO8859_1(const char** input, int remaining) { int value = *((unsigned char*) *input); (*input)++; return value; } void GUAC_WRITE_UTF8(char** output, int remaining, int value) { *output += guac_utf8_write(value, *output, remaining); } void GUAC_WRITE_UTF16(char** output, int remaining, int value) { /* Bail if not enough data */ if (remaining < 2) return; /* Write two bytes as integer */ *((uint16_t*) *output) = value; *output += 2; } void GUAC_WRITE_CP1252(char** output, int remaining, int value) { /* If not in ISO-8859-1 part of CP1252, check lookup table */ if ((value >= 0x80 && value <= 0x9F) || value > 0xFF) { int i; int replacement_value = '?'; const int* codepoint = __GUAC_RDP_CP1252_CODEPOINT; /* Search lookup table for value */ for (i=0x80; i<=0x9F; i++, codepoint++) { if (*codepoint == value) { replacement_value = i; break; } } /* Replace value with discovered value (or question mark) */ value = replacement_value; } *((unsigned char*) *output) = (unsigned char) value; (*output)++; } void GUAC_WRITE_ISO8859_1(char** output, int remaining, int value) { /* Translate to question mark if out of range */ if (value > 0xFF) value = '?'; *((unsigned char*) *output) = (unsigned char) value; (*output)++; } guacamole-server-0.9.9/src/common/guac_io.c0000664000175100017510000000375012536405624015564 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "guac_io.h" #include int guac_common_write(int fd, void* buffer, int length) { unsigned char* bytes = (unsigned char*) buffer; while (length > 0) { /* Attempt write */ int bytes_written = write(fd, bytes, length); if (bytes_written < 0) return bytes_written; /* Update buffer */ length -= bytes_written; bytes += bytes_written; } /* Success */ return length; } int guac_common_read(int fd, void* buffer, int length) { unsigned char* bytes = (unsigned char*) buffer; while (length > 0) { /* Attempt read */ int bytes_read = read(fd, bytes, length); if (bytes_read < 0) return bytes_read; /* Update buffer */ length -= bytes_read; bytes += bytes_read; } /* Success */ return length; } guacamole-server-0.9.9/src/common/guac_dot_cursor.c0000664000175100017510000000535312643542623017341 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include #include #include #include #include /* Macros for prettying up the embedded image. */ #define X 0x00,0x00,0x00,0xFF #define O 0xFF,0xFF,0xFF,0xFF #define _ 0x00,0x00,0x00,0x00 /* Dimensions */ const int guac_common_dot_cursor_width = 5; const int guac_common_dot_cursor_height = 5; /* Format */ const cairo_format_t guac_common_dot_cursor_format = CAIRO_FORMAT_ARGB32; const int guac_common_dot_cursor_stride = 20; /* Embedded pointer graphic */ unsigned char guac_common_dot_cursor[] = { _,O,O,O,_, O,X,X,X,O, O,X,X,X,O, O,X,X,X,O, _,O,O,O,_ }; void guac_common_set_dot_cursor(guac_client* client) { guac_socket* socket = client->socket; /* Draw to buffer */ guac_layer* cursor = guac_client_alloc_buffer(client); cairo_surface_t* graphic = cairo_image_surface_create_for_data( guac_common_dot_cursor, guac_common_dot_cursor_format, guac_common_dot_cursor_width, guac_common_dot_cursor_height, guac_common_dot_cursor_stride); guac_client_stream_png(client, socket, GUAC_COMP_SRC, cursor, 0, 0, graphic); cairo_surface_destroy(graphic); /* Set cursor */ guac_protocol_send_cursor(socket, 2, 2, cursor, 0, 0, guac_common_dot_cursor_width, guac_common_dot_cursor_height); /* Free buffer */ guac_client_free_buffer(client, cursor); guac_client_log(client, GUAC_LOG_DEBUG, "Client cursor image set to generic built-in dot."); } guacamole-server-0.9.9/src/common/guac_dot_cursor.h0000664000175100017510000000373712643542623017352 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUAC_COMMON_DOT_CURSOR_H #define _GUAC_COMMON_DOT_CURSOR_H #include "config.h" #include #include /** * Width of the embedded mouse cursor graphic. */ extern const int guac_common_dot_cursor_width; /** * Height of the embedded mouse cursor graphic. */ extern const int guac_common_dot_cursor_height; /** * Number of bytes in each row of the embedded mouse cursor graphic. */ extern const int guac_common_dot_cursor_stride; /** * The Cairo grapic format of the mouse cursor graphic. */ extern const cairo_format_t guac_common_dot_cursor_format; /** * Embedded mouse cursor graphic. */ extern unsigned char guac_common_dot_cursor[]; /** * Set the cursor of the remote display to the embedded cursor graphic. * * @param client The guac_client to send the cursor to. */ void guac_common_set_dot_cursor(guac_client* client); #endif guacamole-server-0.9.9/src/common/guac_list.h0000664000175100017510000000655312536405624016141 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_LIST_H #define __GUAC_LIST_H #include "config.h" #include /** * Generic linked list element. */ typedef struct guac_common_list_element guac_common_list_element; struct guac_common_list_element { /** * The next element in the list, or NULL if none. */ guac_common_list_element* next; /** * Generic data. */ void* data; /** * The pointer which points to this element, whether another element's * next pointer, or the entire list's head pointer. */ guac_common_list_element** _ptr; }; /** * Generic linked list. */ typedef struct guac_common_list { /** * The first element in the list. */ guac_common_list_element* head; /** * Mutex which is locked when exclusive access to the list is required. * Possession of the lock is not enforced outside the * guac_common_list_lock() function. */ pthread_mutex_t _lock; } guac_common_list; /** * Creates a new list. * * @return A newly-allocated list. */ guac_common_list* guac_common_list_alloc(); /** * Frees the given list. * * @param list The list to free. */ void guac_common_list_free(guac_common_list* list); /** * Adds the given data to the list as a new element, returning the created * element. * * @param list The list to add an element to. * @param data The data to associate with the newly-created element. * @param The newly-created element. */ guac_common_list_element* guac_common_list_add(guac_common_list* list, void* data); /** * Removes the given element from the list. * * @param list The list to remove the element from. * @param element The element to remove. */ void guac_common_list_remove(guac_common_list* list, guac_common_list_element* element); /** * Acquires exclusive access to the list. No list functions implicitly lock or * unlock the list, so any list access which must be threadsafe must use * guac_common_list_lock() and guac_common_list_unlock() manually. * * @param list The list to acquire exclusive access to. */ void guac_common_list_lock(guac_common_list* list); /** * Releases exclusive access to the list. * * @param list The list to release from exclusive access. */ void guac_common_list_unlock(guac_common_list* list); #endif guacamole-server-0.9.9/src/common/guac_pointer_cursor.c0000664000175100017510000000626612643542623020237 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include #include #include #include #include /* Macros for prettying up the embedded image. */ #define X 0x00,0x00,0x00,0xFF #define O 0xFF,0xFF,0xFF,0xFF #define _ 0x00,0x00,0x00,0x00 /* Dimensions */ const int guac_common_pointer_cursor_width = 11; const int guac_common_pointer_cursor_height = 16; /* Format */ const cairo_format_t guac_common_pointer_cursor_format = CAIRO_FORMAT_ARGB32; const int guac_common_pointer_cursor_stride = 44; /* Embedded pointer graphic */ unsigned char guac_common_pointer_cursor[] = { O,_,_,_,_,_,_,_,_,_,_, O,O,_,_,_,_,_,_,_,_,_, O,X,O,_,_,_,_,_,_,_,_, O,X,X,O,_,_,_,_,_,_,_, O,X,X,X,O,_,_,_,_,_,_, O,X,X,X,X,O,_,_,_,_,_, O,X,X,X,X,X,O,_,_,_,_, O,X,X,X,X,X,X,O,_,_,_, O,X,X,X,X,X,X,X,O,_,_, O,X,X,X,X,X,X,X,X,O,_, O,X,X,X,X,X,O,O,O,O,O, O,X,X,O,X,X,O,_,_,_,_, O,X,O,_,O,X,X,O,_,_,_, O,O,_,_,O,X,X,O,_,_,_, O,_,_,_,_,O,X,X,O,_,_, _,_,_,_,_,O,O,O,O,_,_ }; void guac_common_set_pointer_cursor(guac_client* client) { guac_socket* socket = client->socket; /* Draw to buffer */ guac_layer* cursor = guac_client_alloc_buffer(client); cairo_surface_t* graphic = cairo_image_surface_create_for_data( guac_common_pointer_cursor, guac_common_pointer_cursor_format, guac_common_pointer_cursor_width, guac_common_pointer_cursor_height, guac_common_pointer_cursor_stride); guac_client_stream_png(client, socket, GUAC_COMP_SRC, cursor, 0, 0, graphic); cairo_surface_destroy(graphic); /* Set cursor */ guac_protocol_send_cursor(socket, 0, 0, cursor, 0, 0, guac_common_pointer_cursor_width, guac_common_pointer_cursor_height); /* Free buffer */ guac_client_free_buffer(client, cursor); guac_client_log(client, GUAC_LOG_DEBUG, "Client cursor image set to generic built-in pointer."); } guacamole-server-0.9.9/src/common/guac_surface.h0000664000175100017510000002510512645370455016614 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 __GUAC_COMMON_SURFACE_H #define __GUAC_COMMON_SURFACE_H #include "config.h" #include "guac_rect.h" #include #include #include #include #include /** * The maximum number of updates to allow within the bitmap queue. */ #define GUAC_COMMON_SURFACE_QUEUE_SIZE 256 /** * Heat map cell size in pixels. Each side of each heat map cell will consist * of this many pixels. */ #define GUAC_COMMON_SURFACE_HEAT_CELL_SIZE 64 /** * The width or height of the heat map (in cells) given the width or height of * the image (in pixels). */ #define GUAC_COMMON_SURFACE_HEAT_DIMENSION(x) ( \ (x + GUAC_COMMON_SURFACE_HEAT_CELL_SIZE - 1) \ / GUAC_COMMON_SURFACE_HEAT_CELL_SIZE \ ) /** * The number of entries to collect within each heat map cell. Collected * history entries are used to determine the framerate of the region associated * with that cell. */ #define GUAC_COMMON_SURFACE_HEAT_CELL_HISTORY_SIZE 5 /** * Representation of a cell in the refresh heat map. This cell is used to keep * track of how often an area on a surface is refreshed. */ typedef struct guac_common_surface_heat_cell { /** * Timestamps of each of the last N updates covering the location * associated with this heat map cell. This is used to calculate the * framerate. This array is structured as a ring buffer containing history * entries in chronologically-ascending order, starting at the entry * pointed to by oldest_entry and proceeding through all other entries, * wrapping around if the end of the array is reached. */ guac_timestamp history[GUAC_COMMON_SURFACE_HEAT_CELL_HISTORY_SIZE]; /** * Index of the oldest entry within the history. */ int oldest_entry; } guac_common_surface_heat_cell; /** * Representation of a bitmap update, having a rectangle of image data (stored * elsewhere) and a flushed/not-flushed state. */ typedef struct guac_common_surface_bitmap_rect { /** * Whether this rectangle has been flushed. */ int flushed; /** * The rectangle containing the bitmap update. */ guac_common_rect rect; } guac_common_surface_bitmap_rect; /** * Surface which backs a Guacamole buffer or layer, automatically * combining updates when possible. */ typedef struct guac_common_surface { /** * The layer this surface will draw to. */ const guac_layer* layer; /** * The client associated with this surface. */ guac_client* client; /** * The socket to send instructions on when flushing. */ guac_socket* socket; /** * The width of this layer, in pixels. */ int width; /** * The height of this layer, in pixels. */ int height; /** * The size of each image row, in bytes. */ int stride; /** * The underlying buffer of the Cairo surface. */ unsigned char* buffer; /** * Non-zero if this surface is dirty and needs to be flushed, 0 otherwise. */ int dirty; /** * The dirty rectangle. */ guac_common_rect dirty_rect; /** * Whether the surface actually exists on the client. */ int realized; /** * Whether drawing operations are currently clipped by the clipping * rectangle. */ int clipped; /** * The clipping rectangle. */ guac_common_rect clip_rect; /** * The number of updates in the bitmap queue. */ int bitmap_queue_length; /** * All queued bitmap updates. */ guac_common_surface_bitmap_rect bitmap_queue[GUAC_COMMON_SURFACE_QUEUE_SIZE]; /** * A heat map keeping track of the refresh frequency of * the areas of the screen. */ guac_common_surface_heat_cell* heat_map; } guac_common_surface; /** * Allocates a new guac_common_surface, assigning it to the given layer. * * @param client * The client associated with the given layer. * * @param socket * The socket to send instructions on when flushing. * * @param layer * The layer to associate with the new surface. * * @param w * The width of the surface. * * @param h * The height of the surface. * * @return * A newly-allocated guac_common_surface. */ guac_common_surface* guac_common_surface_alloc(guac_client* client, guac_socket* socket, const guac_layer* layer, int w, int h); /** * Frees the given guac_common_surface. Beware that this will NOT free any * associated layers, which must be freed manually. * * @param surface The surface to free. */ void guac_common_surface_free(guac_common_surface* surface); /** * Resizes the given surface to the given size. * * @param surface The surface to resize. * @param w The width of the surface. * @param h The height of the surface. */ void guac_common_surface_resize(guac_common_surface* surface, int w, int h); /** * Draws the given data to the given guac_common_surface. * * @param surface The surface to draw to. * @param x The X coordinate of the draw location. * @param y The Y coordinate of the draw location. * @param src The Cairo surface to retrieve data from. */ void guac_common_surface_draw(guac_common_surface* surface, int x, int y, cairo_surface_t* src); /** * Paints to the given guac_common_surface using the given data as a stencil, * filling opaque regions with the specified color, and leaving transparent * regions untouched. * * @param surface The surface to draw to. * @param x The X coordinate of the draw location. * @param y The Y coordinate of the draw location. * @param src The Cairo surface to retrieve data from. * @param red The red component of the fill color. * @param green The green component of the fill color. * @param blue The blue component of the fill color. */ void guac_common_surface_paint(guac_common_surface* surface, int x, int y, cairo_surface_t* src, int red, int green, int blue); /** * Copies a rectangle of data between two surfaces. * * @param src The source surface. * @param sx The X coordinate of the upper-left corner of the source rect. * @param sy The Y coordinate of the upper-left corner of the source rect. * @param w The width of the source rect. * @param h The height of the source rect. * @param dst The destination surface. * @param dx The X coordinate of the upper-left corner of the destination rect. * @param dy The Y coordinate of the upper-left corner of the destination rect. */ void guac_common_surface_copy(guac_common_surface* src, int sx, int sy, int w, int h, guac_common_surface* dst, int dx, int dy); /** * Transfers a rectangle of data between two surfaces. * * @param src The source surface. * @param sx The X coordinate of the upper-left corner of the source rect. * @param sy The Y coordinate of the upper-left corner of the source rect. * @param w The width of the source rect. * @param h The height of the source rect. * @param op The transfer function. * @param dst The destination surface. * @param dx The X coordinate of the upper-left corner of the destination rect. * @param dy The Y coordinate of the upper-left corner of the destination rect. */ void guac_common_surface_transfer(guac_common_surface* src, int sx, int sy, int w, int h, guac_transfer_function op, guac_common_surface* dst, int dx, int dy); /** * Draws a solid color rectangle at the given coordinates on the given surface. * * @param surface The surface to draw upon. * @param x The X coordinate of the upper-left corner of the rectangle. * @param y The Y coordinate of the upper-left corner of the rectangle. * @param w The width of the rectangle. * @param h The height of the rectangle. * @param red The red component of the color of the rectangle. * @param green The green component of the color of the rectangle. * @param blue The blue component of the color of the rectangle. */ void guac_common_surface_rect(guac_common_surface* surface, int x, int y, int w, int h, int red, int green, int blue); /** * Given the coordinates and dimensions of a rectangle, clips all future * operations within that rectangle. * * @param surface The surface whose clipping rectangle should be changed. * @param x The X coordinate of the upper-left corner of the bounding rectangle. * @param y The Y coordinate of the upper-left corner of the bounding rectangle. * @param w The width of the bounding rectangle. * @param h The height of the bounding rectangle. */ void guac_common_surface_clip(guac_common_surface* surface, int x, int y, int w, int h); /** * Resets the clipping rectangle, allowing drawing operations throughout the * entire surface. * * @param surface The surface whose clipping rectangle should be reset. */ void guac_common_surface_reset_clip(guac_common_surface* surface); /** * Flushes the given surface, drawing any pending operations on the remote * display. * * @param surface The surface to flush. */ void guac_common_surface_flush(guac_common_surface* surface); /** * Schedules a deferred flush of the given surface. This will not immediately * flush the surface to the client. Instead, the result of the flush is * added to a queue which is reinspected and combined (if possible) with other * deferred flushes during the call to guac_common_surface_flush(). * * @param surface The surface to flush. */ void guac_common_surface_flush_deferred(guac_common_surface* surface); #endif guacamole-server-0.9.9/src/common/guac_iconv.h0000664000175100017510000000650312575132140016270 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUAC_COMMON_ICONV_H #define __GUAC_COMMON_ICONV_H #include "config.h" /** * Function which reads a character from the given string data, returning * the Unicode codepoint read, updating the string pointer to point to the * byte immediately after the character read. */ typedef int guac_iconv_read(const char** input, int remaining); /** * Function writes the character having the given Unicode codepoint value to * the given string data, updating the string pointer to point to the byte * immediately after the character written. */ typedef void guac_iconv_write(char** output, int remaining, int value); /** * Converts characters within a given string from one encoding to another, * as defined by the reader/writer functions specified. The input and output * string pointers will be updated based on the number of bytes read or * written. * * @param reader The reader function to use when reading the input string. * @param input Pointer to the beginning of the input string. * @param in_remaining The number of bytes remaining after the pointer to the * input string. * @param writer The writer function to use when writing the output string. * @param output Pointer to the beginning of the output string. * @param out_remaining The number of bytes remaining after the pointer to the * output string. * @return Non-zero if the NULL terminator of the input string was read and * copied into the destination string, zero otherwise. */ int guac_iconv(guac_iconv_read* reader, const char** input, int in_remaining, guac_iconv_write* writer, char** output, int out_remaining); /** * Read function for UTF8. */ guac_iconv_read GUAC_READ_UTF8; /** * Read function for UTF16. */ guac_iconv_read GUAC_READ_UTF16; /** * Read function for CP-1252. */ guac_iconv_read GUAC_READ_CP1252; /** * Read function for ISO-8859-1 */ guac_iconv_read GUAC_READ_ISO8859_1; /** * Write function for UTF8. */ guac_iconv_write GUAC_WRITE_UTF8; /** * Write function for UTF16. */ guac_iconv_write GUAC_WRITE_UTF16; /** * Write function for CP-1252. */ guac_iconv_write GUAC_WRITE_CP1252; /** * Write function for ISO-8859-1 */ guac_iconv_write GUAC_WRITE_ISO8859_1; #endif guacamole-server-0.9.9/src/common/guac_json.h0000664000175100017510000001514012626133327016125 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 GUAC_COMMON_JSON_H #define GUAC_COMMON_JSON_H #include "config.h" #include #include /** * The current streaming state of an arbitrary JSON object, consisting of * any number of property name/value pairs. */ typedef struct guac_common_json_state { /** * Buffer of partial JSON data. The individual blobs which make up the JSON * body of the object being sent over the Guacamole protocol will be * built here. */ char buffer[4096]; /** * The number of bytes currently used within the JSON buffer. */ int size; /** * The number of property name/value pairs written to the JSON object thus * far. */ int properties_written; } guac_common_json_state; /** * Given a stream, the client to which it belongs, and the current stream state * of a JSON object, flushes the contents of the JSON buffer to a blob * instruction. Note that this will flush the JSON buffer only, and will not * necessarily flush the underlying guac_socket of the client. * * @param client * The client to which the data will be flushed. * * @param stream * The stream through which the flushed data should be sent as a blob. * * @param json_state * The state object whose buffer should be flushed. */ void guac_common_json_flush(guac_client* client, guac_stream* stream, guac_common_json_state* json_state); /** * Given a stream, the client to which it belongs, and the current stream state * of a JSON object, writes the contents of the given buffer to the JSON buffer * of the stream state, flushing as necessary. * * @param client * The client to which the data will be flushed as necessary. * * @param stream * The stream through which the flushed data should be sent as a blob, if * data must be flushed at all. * * @param json_state * The state object containing the JSON buffer to which the given buffer * should be written. * * @param buffer * The buffer to write. * * @param length * The number of bytes in the buffer. * * @return * Non-zero if at least one blob was written, zero otherwise. */ int guac_common_json_write(guac_client* client, guac_stream* stream, guac_common_json_state* json_state, const char* buffer, int length); /** * Given a stream, the client to which it belongs, and the current stream state * of a JSON object state, writes the given string as a proper JSON string, * including starting and ending quotes. The contents of the string will be * escaped as necessary. * * @param client * The client to which the data will be flushed as necessary. * * @param stream * The stream through which the flushed data should be sent as a blob, if * data must be flushed at all. * * @param json_state * The state object containing the JSON buffer to which the given string * should be written as a JSON name/value pair. * * @param str * The string to write. * * @return * Non-zero if at least one blob was written, zero otherwise. */ int guac_common_json_write_string(guac_client* client, guac_stream* stream, guac_common_json_state* json_state, const char* str); /** * Given a stream, the client to which it belongs, and the current stream state * of a JSON object, writes the given JSON property name/value pair. The * name and value will be written as proper JSON strings separated by a colon. * * @param client * The client to which the data will be flushed as necessary. * * @param stream * The stream through which the flushed data should be sent as a blob, if * data must be flushed at all. * * @param json_state * The state object containing the JSON buffer to which the given strings * should be written as a JSON name/value pair. * * @param name * The name of the property to write. * * @param value * The value of the property to write. * * @return * Non-zero if at least one blob was written, zero otherwise. */ int guac_common_json_write_property(guac_client* client, guac_stream* stream, guac_common_json_state* json_state, const char* name, const char* value); /** * Given a stream, the client to which it belongs, and the current stream state * of a JSON object, initializes the state for writing a new JSON object. Note * that although the client and stream must be provided, no instruction or * blobs will be written due to any call to this function. * * @param client * The client associated with the given stream. * * @param stream * The stream associated with the JSON object being written. * * @param json_state * The state object to initialize. */ void guac_common_json_begin_object(guac_client* client, guac_stream* stream, guac_common_json_state* json_state); /** * Given a stream, the client to which it belongs, and the current stream state * of a JSON object, completes writing that JSON object by writing the final * terminating brace. This function must only be called following a * corresponding call to guac_common_json_begin_object(). * * @param client * The client associated with the given stream. * * @param stream * The stream associated with the JSON object being written. * * @param json_state * The state object whose in-progress JSON object should be terminated. * * @return * Non-zero if at least one blob was written, zero otherwise. */ int guac_common_json_end_object(guac_client* client, guac_stream* stream, guac_common_json_state* json_state); #endif guacamole-server-0.9.9/src/common/guac_rect.h0000664000175100017510000001047212626133327016114 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 __GUAC_COMMON_RECT_H #define __GUAC_COMMON_RECT_H #include "config.h" /** * Simple representation of a rectangle, having a defined corner and dimensions. */ typedef struct guac_common_rect { /** * The X coordinate of the upper-left corner of this rectangle. */ int x; /** * The Y coordinate of the upper-left corner of this rectangle. */ int y; /** * The width of this rectangle. */ int width; /** * The height of this rectangle. */ int height; } guac_common_rect; /** * Initialize the given rect with the given coordinates and dimensions. * * @param rect The rect to initialize. * @param x The X coordinate of the upper-left corner of the rect. * @param y The Y coordinate of the upper-left corner of the rect. * @param width The width of the rect. * @param height The height of the rect. */ void guac_common_rect_init(guac_common_rect* rect, int x, int y, int width, int height); /** * Expand the rectangle to fit an NxN grid. * * The rectangle will be shifted to the left and up, expanded and adjusted to * fit within the max bounding rect. * * @param cell_size * The (NxN) grid cell size. * * @param rect * The rectangle to adjust. * * @param max_rect * The bounding area in which the given rect can exist. * * @return * Zero on success, non-zero on error. */ int guac_common_rect_expand_to_grid(int cell_size, guac_common_rect* rect, const guac_common_rect* max_rect); /** * Extend the given rect such that it contains at least the specified minimum * rect. * * @param rect The rect to extend. * @param min The minimum area which must be contained within the given rect. */ void guac_common_rect_extend(guac_common_rect* rect, const guac_common_rect* min); /** * Collapse the given rect such that it exists only within the given maximum * rect. * * @param rect The rect to extend. * @param max The maximum area in which the given rect can exist. */ void guac_common_rect_constrain(guac_common_rect* rect, const guac_common_rect* max); /** * Check whether a rectangle intersects another. * * @param rect * Rectangle to check for intersection. * * @param other * The other rectangle. * * @return * Zero if no intersection, 1 if partial intersection, * 2 if first rect is completely inside the other. */ int guac_common_rect_intersects(const guac_common_rect* rect, const guac_common_rect* other); /** * Clip and split a rectangle into rectangles which are not covered by the * hole rectangle. * * This function will clip and split single edges when executed and must be * invoked until it returns zero. The edges are handled counter-clockwise * starting at the top edge. * * @param rect * The rectangle to be split. This rectangle will be clipped by the * split_rect. * * @param hole * The rectangle which represents the hole. * * @param split_rect * Resulting split rectangle. * * @return * Zero when no splits were done, non-zero when the rectangle was split. */ int guac_common_rect_clip_and_split(guac_common_rect* rect, const guac_common_rect* hole, guac_common_rect* split_rect); #endif guacamole-server-0.9.9/src/common/Makefile.am0000664000175100017510000000362712643542623016051 00000000000000# # Copyright (C) 2015 Glyptodon LLC # # 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. # AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 noinst_LTLIBRARIES = libguac_common.la noinst_HEADERS = \ guac_io.h \ guac_clipboard.h \ guac_dot_cursor.h \ guac_iconv.h \ guac_json.h \ guac_list.h \ guac_pointer_cursor.h \ guac_rect.h \ guac_string.h \ guac_surface.h libguac_common_la_SOURCES = \ guac_io.c \ guac_clipboard.c \ guac_dot_cursor.c \ guac_iconv.c \ guac_json.c \ guac_list.c \ guac_pointer_cursor.c \ guac_rect.c \ guac_string.c \ guac_surface.c libguac_common_la_CFLAGS = \ -Werror -Wall -pedantic \ @LIBGUAC_INCLUDE@ libguac_common_la_LIBADD = \ @LIBGUAC_LTLIB@ guacamole-server-0.9.9/src/common/guac_list.c0000664000175100017510000000467012536405624016132 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "guac_list.h" #include #include guac_common_list* guac_common_list_alloc() { guac_common_list* list = malloc(sizeof(guac_common_list)); pthread_mutex_init(&list->_lock, NULL); list->head = NULL; return list; } void guac_common_list_free(guac_common_list* list) { free(list); } guac_common_list_element* guac_common_list_add(guac_common_list* list, void* data) { /* Allocate element, initialize as new head */ guac_common_list_element* element = malloc(sizeof(guac_common_list_element)); element->data = data; element->next = list->head; element->_ptr = &(list->head); /* If head already existed, point it at this element */ if (list->head != NULL) list->head->_ptr = &(element->next); /* Set as new head */ list->head = element; return element; } void guac_common_list_remove(guac_common_list* list, guac_common_list_element* element) { /* Point previous (or head) to next */ *(element->_ptr) = element->next; if (element->next != NULL) element->next->_ptr = element->_ptr; free(element); } void guac_common_list_lock(guac_common_list* list) { pthread_mutex_lock(&list->_lock); } void guac_common_list_unlock(guac_common_list* list) { pthread_mutex_unlock(&list->_lock); } guacamole-server-0.9.9/src/common-ssh/0000775000175100017510000000000012645400336014654 500000000000000guacamole-server-0.9.9/src/common-ssh/guac_ssh_user.c0000664000175100017510000000523712626133327017603 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "guac_ssh_key.h" #include "guac_ssh_user.h" #include #include guac_common_ssh_user* guac_common_ssh_create_user(const char* username) { guac_common_ssh_user* user = malloc(sizeof(guac_common_ssh_user)); /* Init user */ user->username = strdup(username); user->password = NULL; user->private_key = NULL; return user; } void guac_common_ssh_destroy_user(guac_common_ssh_user* user) { /* Free private key, if present */ if (user->private_key != NULL) guac_common_ssh_key_free(user->private_key); /* Free all other data */ free(user->password); free(user->username); free(user); } void guac_common_ssh_user_set_password(guac_common_ssh_user* user, const char* password) { /* Replace current password with given value */ free(user->password); user->password = strdup(password); } int guac_common_ssh_user_import_key(guac_common_ssh_user* user, char* private_key, char* passphrase) { /* Free existing private key, if present */ if (user->private_key != NULL) guac_common_ssh_key_free(user->private_key); /* Attempt to read key without passphrase if none given */ if (passphrase == NULL) user->private_key = guac_common_ssh_key_alloc(private_key, strlen(private_key), ""); /* Otherwise, use provided passphrase */ else user->private_key = guac_common_ssh_key_alloc(private_key, strlen(private_key), passphrase); /* Fail if key could not be read */ return user->private_key == NULL; } guacamole-server-0.9.9/src/common-ssh/guac_sftp.c0000664000175100017510000005777512626133327016742 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "guac_sftp.h" #include "guac_ssh.h" #include #include #include #include #include #include #include #include #include /** * Translates the last error message received by the SFTP layer of an SSH * session into a Guacamole protocol status code. * * @param filesystem * The Guacamole protocol object defining the filesystem associated with * the SFTP and SSH sessions. * * @return * The Guacamole protocol status code corresponding to the last reported * error of the SFTP layer, if nay, or GUAC_PROTOCOL_STATUS_SUCCESS if no * error has occurred. */ static guac_protocol_status guac_sftp_get_status(guac_object* filesystem) { guac_common_ssh_sftp_data* sftp_data = (guac_common_ssh_sftp_data*) filesystem->data; /* Get libssh2 objects */ LIBSSH2_SFTP* sftp = sftp_data->sftp_session; LIBSSH2_SESSION* session = sftp_data->ssh_session->session; /* Return success code if no error occurred */ if (libssh2_session_last_errno(session) != LIBSSH2_ERROR_SFTP_PROTOCOL) return GUAC_PROTOCOL_STATUS_SUCCESS; /* Translate SFTP error codes defined by * https://tools.ietf.org/html/draft-ietf-secsh-filexfer-02 (the most * commonly-implemented standard) */ switch (libssh2_sftp_last_error(sftp)) { /* SSH_FX_OK (not an error) */ case 0: return GUAC_PROTOCOL_STATUS_SUCCESS; /* SSH_FX_EOF (technically not an error) */ case 1: return GUAC_PROTOCOL_STATUS_SUCCESS; /* SSH_FX_NO_SUCH_FILE */ case 2: return GUAC_PROTOCOL_STATUS_RESOURCE_NOT_FOUND; /* SSH_FX_PERMISSION_DENIED */ case 3: return GUAC_PROTOCOL_STATUS_CLIENT_FORBIDDEN; /* SSH_FX_FAILURE */ case 4: return GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR; /* SSH_FX_BAD_MESSAGE */ case 5: return GUAC_PROTOCOL_STATUS_SERVER_ERROR; /* SSH_FX_NO_CONNECTION / SSH_FX_CONNECTION_LOST */ case 6: case 7: return GUAC_PROTOCOL_STATUS_UPSTREAM_TIMEOUT; /* SSH_FX_OP_UNSUPPORTED */ case 8: return GUAC_PROTOCOL_STATUS_UNSUPPORTED; /* Return generic error if cause unknown */ default: return GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR; } } /** * Concatenates the given filename with the given path, separating the two * with a single forward slash. The full result must be no more than * GUAC_COMMON_SSH_SFTP_MAX_PATH bytes long, counting null terminator. * * @param fullpath * The buffer to store the result within. This buffer must be at least * GUAC_COMMON_SSH_SFTP_MAX_PATH bytes long. * * @param path * The path to append the filename to. * * @param filename * The filename to append to the path. * * @return * Non-zero if the filename is valid and was successfully appended to the * path, zero otherwise. */ static int guac_ssh_append_filename(char* fullpath, const char* path, const char* filename) { int i; /* Disallow "." as a filename */ if (strcmp(filename, ".") == 0) return 0; /* Disallow ".." as a filename */ if (strcmp(filename, "..") == 0) return 0; /* Copy path, append trailing slash */ for (i=0; i 0 && path[i-1] != '/') fullpath[i++] = '/'; break; } /* Copy character if not end of string */ fullpath[i] = c; } /* Append filename */ for (; idata; /* Attempt write */ if (libssh2_sftp_write(file, data, length) == length) { guac_client_log(client, GUAC_LOG_DEBUG, "%i bytes written", length); guac_protocol_send_ack(client->socket, stream, "SFTP: OK", GUAC_PROTOCOL_STATUS_SUCCESS); guac_socket_flush(client->socket); } /* Inform of any errors */ else { guac_client_log(client, GUAC_LOG_INFO, "Unable to write to file"); guac_protocol_send_ack(client->socket, stream, "SFTP: Write failed", GUAC_PROTOCOL_STATUS_SERVER_ERROR); guac_socket_flush(client->socket); } return 0; } /** * Handler for end messages which terminate an inbound SFTP data transfer * (upload). The data associated with the given stream is expected to be a * pointer to an open LIBSSH2_SFTP_HANDLE for the file to which the data * has been written and which should now be closed. * * @param client * The client receiving the end message. * * @param stream * The Guacamole protocol stream associated with the received end message. * * @return * Zero if the file is closed successfully, or non-zero on error. */ static int guac_common_ssh_sftp_end_handler(guac_client* client, guac_stream* stream) { /* Pull file from stream */ LIBSSH2_SFTP_HANDLE* file = (LIBSSH2_SFTP_HANDLE*) stream->data; /* Attempt to close file */ if (libssh2_sftp_close(file) == 0) { guac_client_log(client, GUAC_LOG_DEBUG, "File closed"); guac_protocol_send_ack(client->socket, stream, "SFTP: OK", GUAC_PROTOCOL_STATUS_SUCCESS); guac_socket_flush(client->socket); } else { guac_client_log(client, GUAC_LOG_INFO, "Unable to close file"); guac_protocol_send_ack(client->socket, stream, "SFTP: Close failed", GUAC_PROTOCOL_STATUS_SERVER_ERROR); guac_socket_flush(client->socket); } return 0; } int guac_common_ssh_sftp_handle_file_stream(guac_object* filesystem, guac_stream* stream, char* mimetype, char* filename) { guac_common_ssh_sftp_data* sftp_data = (guac_common_ssh_sftp_data*) filesystem->data; guac_client* client = sftp_data->ssh_session->client; char fullpath[GUAC_COMMON_SSH_SFTP_MAX_PATH]; LIBSSH2_SFTP_HANDLE* file; /* Concatenate filename with path */ if (!guac_ssh_append_filename(fullpath, sftp_data->upload_path, filename)) { guac_client_log(client, GUAC_LOG_DEBUG, "Filename \"%s\" is invalid or resulting path is too long", filename); /* Abort transfer - invalid filename */ guac_protocol_send_ack(client->socket, stream, "SFTP: Illegal filename", GUAC_PROTOCOL_STATUS_CLIENT_BAD_REQUEST); guac_socket_flush(client->socket); return 0; } /* Open file via SFTP */ file = libssh2_sftp_open(sftp_data->sftp_session, fullpath, LIBSSH2_FXF_WRITE | LIBSSH2_FXF_CREAT | LIBSSH2_FXF_TRUNC, S_IRUSR | S_IWUSR); /* Inform of status */ if (file != NULL) { guac_client_log(client, GUAC_LOG_DEBUG, "File \"%s\" opened", fullpath); guac_protocol_send_ack(client->socket, stream, "SFTP: File opened", GUAC_PROTOCOL_STATUS_SUCCESS); guac_socket_flush(client->socket); } else { guac_client_log(client, GUAC_LOG_INFO, "Unable to open file \"%s\"", fullpath); guac_protocol_send_ack(client->socket, stream, "SFTP: Open failed", guac_sftp_get_status(filesystem)); guac_socket_flush(client->socket); } /* Set handlers for file stream */ stream->blob_handler = guac_common_ssh_sftp_blob_handler; stream->end_handler = guac_common_ssh_sftp_end_handler; /* Store file within stream */ stream->data = file; return 0; } /** * Handler for ack messages which continue an outbound SFTP data transfer * (download), signalling the current status and requesting additional data. * The data associated with the given stream is expected to be a pointer to an * open LIBSSH2_SFTP_HANDLE for the file from which the data is to be read. * * @param client * The client receiving the ack message. * * @param stream * The Guacamole protocol stream associated with the received ack message. * * @param message * An arbitrary human-readable message describing the nature of the * success or failure denoted by the ack message. * * @param status * The status code associated with the ack message, which may indicate * success or an error. * * @return * Zero if the file is read from successfully, or non-zero on error. */ static int guac_common_ssh_sftp_ack_handler(guac_client* client, guac_stream* stream, char* message, guac_protocol_status status) { /* Pull file from stream */ LIBSSH2_SFTP_HANDLE* file = (LIBSSH2_SFTP_HANDLE*) stream->data; /* If successful, read data */ if (status == GUAC_PROTOCOL_STATUS_SUCCESS) { /* Attempt read into buffer */ char buffer[4096]; int bytes_read = libssh2_sftp_read(file, buffer, sizeof(buffer)); /* If bytes read, send as blob */ if (bytes_read > 0) { guac_protocol_send_blob(client->socket, stream, buffer, bytes_read); guac_client_log(client, GUAC_LOG_DEBUG, "%i bytes sent to client", bytes_read); } /* If EOF, send end */ else if (bytes_read == 0) { guac_client_log(client, GUAC_LOG_DEBUG, "File sent"); guac_protocol_send_end(client->socket, stream); guac_client_free_stream(client, stream); } /* Otherwise, fail stream */ else { guac_client_log(client, GUAC_LOG_INFO, "Error reading file"); guac_protocol_send_end(client->socket, stream); guac_client_free_stream(client, stream); } guac_socket_flush(client->socket); } /* Otherwise, return stream to client */ else guac_client_free_stream(client, stream); return 0; } guac_stream* guac_common_ssh_sftp_download_file(guac_object* filesystem, char* filename) { guac_common_ssh_sftp_data* sftp_data = (guac_common_ssh_sftp_data*) filesystem->data; guac_client* client = sftp_data->ssh_session->client; guac_stream* stream; LIBSSH2_SFTP_HANDLE* file; /* Attempt to open file for reading */ file = libssh2_sftp_open(sftp_data->sftp_session, filename, LIBSSH2_FXF_READ, 0); if (file == NULL) { guac_client_log(client, GUAC_LOG_INFO, "Unable to read file \"%s\"", filename); return NULL; } /* Allocate stream */ stream = guac_client_alloc_stream(client); stream->ack_handler = guac_common_ssh_sftp_ack_handler; stream->data = file; /* Send stream start, strip name */ filename = basename(filename); guac_protocol_send_file(client->socket, stream, "application/octet-stream", filename); guac_socket_flush(client->socket); guac_client_log(client, GUAC_LOG_DEBUG, "Sending file \"%s\"", filename); return stream; } void guac_common_ssh_sftp_set_upload_path(guac_object* filesystem, const char* path) { guac_common_ssh_sftp_data* sftp_data = (guac_common_ssh_sftp_data*) filesystem->data; guac_client* client = sftp_data->ssh_session->client; /* Ignore requests which exceed maximum-allowed path */ int length = strnlen(path, GUAC_COMMON_SSH_SFTP_MAX_PATH)+1; if (length > GUAC_COMMON_SSH_SFTP_MAX_PATH) { guac_client_log(client, GUAC_LOG_ERROR, "Submitted path exceeds limit of %i bytes", GUAC_COMMON_SSH_SFTP_MAX_PATH); return; } /* Copy path */ memcpy(sftp_data->upload_path, path, length); guac_client_log(client, GUAC_LOG_DEBUG, "Upload path set to \"%s\"", path); } /** * Handler for ack messages received due to receipt of a "body" or "blob" * instruction associated with a SFTP directory list operation. * * @param client * The client receiving the ack message. * * @param stream * The Guacamole protocol stream associated with the received ack message. * * @param message * An arbitrary human-readable message describing the nature of the * success or failure denoted by this ack message. * * @param status * The status code associated with this ack message, which may indicate * success or an error. * * @return * Zero on success, non-zero on error. */ static int guac_common_ssh_sftp_ls_ack_handler(guac_client* client, guac_stream* stream, char* message, guac_protocol_status status) { int bytes_read; int blob_written = 0; char filename[GUAC_COMMON_SSH_SFTP_MAX_PATH]; LIBSSH2_SFTP_ATTRIBUTES attributes; guac_common_ssh_sftp_ls_state* list_state = (guac_common_ssh_sftp_ls_state*) stream->data; guac_common_ssh_sftp_data* sftp_data = list_state->sftp_data; LIBSSH2_SFTP* sftp = sftp_data->sftp_session; /* If unsuccessful, free stream and abort */ if (status != GUAC_PROTOCOL_STATUS_SUCCESS) { libssh2_sftp_closedir(list_state->directory); guac_client_free_stream(client, stream); free(list_state); return 0; } /* While directory entries remain */ while ((bytes_read = libssh2_sftp_readdir(list_state->directory, filename, sizeof(filename), &attributes)) > 0 && !blob_written) { char absolute_path[GUAC_COMMON_SSH_SFTP_MAX_PATH]; /* Skip current and parent directory entries */ if (strcmp(filename, ".") == 0 || strcmp(filename, "..") == 0) continue; /* Concatenate into absolute path - skip if invalid */ if (!guac_ssh_append_filename(absolute_path, list_state->directory_name, filename)) { guac_client_log(client, GUAC_LOG_DEBUG, "Skipping filename \"%s\" - filename is invalid or " "resulting path is too long", filename); continue; } /* Stat explicitly if symbolic link (might point to directory) */ if (LIBSSH2_SFTP_S_ISLNK(attributes.permissions)) libssh2_sftp_stat(sftp, absolute_path, &attributes); /* Determine mimetype */ const char* mimetype; if (LIBSSH2_SFTP_S_ISDIR(attributes.permissions)) mimetype = GUAC_CLIENT_STREAM_INDEX_MIMETYPE; else mimetype = "application/octet-stream"; /* Write entry */ blob_written |= guac_common_json_write_property(client, stream, &list_state->json_state, absolute_path, mimetype); } /* Complete JSON and cleanup at end of directory */ if (bytes_read <= 0) { /* Complete JSON object */ guac_common_json_end_object(client, stream, &list_state->json_state); guac_common_json_flush(client, stream, &list_state->json_state); /* Clean up resources */ libssh2_sftp_closedir(list_state->directory); free(list_state); /* Signal of stream */ guac_protocol_send_end(client->socket, stream); guac_client_free_stream(client, stream); } guac_socket_flush(client->socket); return 0; } /** * Handler for get messages. In context of SFTP and the filesystem exposed via * the Guacamole protocol, get messages request the body of a file within the * filesystem. * * @param client * The client receiving the get message. * * @param object * The Guacamole protocol object associated with the get request itself. * * @param name * The name of the input stream (file) being requested. * * @return * Zero on success, non-zero on error. */ static int guac_common_ssh_sftp_get_handler(guac_client* client, guac_object* object, char* name) { guac_common_ssh_sftp_data* sftp_data = (guac_common_ssh_sftp_data*) object->data; LIBSSH2_SFTP* sftp = sftp_data->sftp_session; LIBSSH2_SFTP_ATTRIBUTES attributes; /* Attempt to read file information */ if (libssh2_sftp_stat(sftp, name, &attributes)) { guac_client_log(client, GUAC_LOG_INFO, "Unable to read file \"%s\"", name); return 0; } /* If directory, send contents of directory */ if (LIBSSH2_SFTP_S_ISDIR(attributes.permissions)) { /* Open as directory */ LIBSSH2_SFTP_HANDLE* dir = libssh2_sftp_opendir(sftp, name); if (dir == NULL) { guac_client_log(client, GUAC_LOG_INFO, "Unable to read directory \"%s\"", name); return 0; } /* Init directory listing state */ guac_common_ssh_sftp_ls_state* list_state = malloc(sizeof(guac_common_ssh_sftp_ls_state)); list_state->directory = dir; list_state->sftp_data = sftp_data; strncpy(list_state->directory_name, name, sizeof(list_state->directory_name) - 1); /* Allocate stream for body */ guac_stream* stream = guac_client_alloc_stream(client); stream->ack_handler = guac_common_ssh_sftp_ls_ack_handler; stream->data = list_state; /* Init JSON object state */ guac_common_json_begin_object(client, stream, &list_state->json_state); /* Associate new stream with get request */ guac_protocol_send_body(client->socket, object, stream, GUAC_CLIENT_STREAM_INDEX_MIMETYPE, name); } /* Otherwise, send file contents */ else { /* Open as normal file */ LIBSSH2_SFTP_HANDLE* file = libssh2_sftp_open(sftp, name, LIBSSH2_FXF_READ, 0); if (file == NULL) { guac_client_log(client, GUAC_LOG_INFO, "Unable to read file \"%s\"", name); return 0; } /* Allocate stream for body */ guac_stream* stream = guac_client_alloc_stream(client); stream->ack_handler = guac_common_ssh_sftp_ack_handler; stream->data = file; /* Associate new stream with get request */ guac_protocol_send_body(client->socket, object, stream, "application/octet-stream", name); } guac_socket_flush(client->socket); return 0; } /** * Handler for put messages. In context of SFTP and the filesystem exposed via * the Guacamole protocol, put messages request write access to a file within * the filesystem. * * @param client * The client receiving the put message. * * @param object * The Guacamole protocol object associated with the put request itself. * * @param stream * The Guacamole protocol stream along which the client will be sending * file data. * * @param mimetype * The mimetype of the data being send along the stream. * * @param name * The name of the input stream (file) being requested. * * @return * Zero on success, non-zero on error. */ static int guac_common_ssh_sftp_put_handler(guac_client* client, guac_object* object, guac_stream* stream, char* mimetype, char* name) { guac_common_ssh_sftp_data* sftp_data = (guac_common_ssh_sftp_data*) object->data; LIBSSH2_SFTP* sftp = sftp_data->sftp_session; /* Open file via SFTP */ LIBSSH2_SFTP_HANDLE* file = libssh2_sftp_open(sftp, name, LIBSSH2_FXF_WRITE | LIBSSH2_FXF_CREAT | LIBSSH2_FXF_TRUNC, S_IRUSR | S_IWUSR); /* Acknowledge stream if successful */ if (file != NULL) { guac_client_log(client, GUAC_LOG_DEBUG, "File \"%s\" opened", name); guac_protocol_send_ack(client->socket, stream, "SFTP: File opened", GUAC_PROTOCOL_STATUS_SUCCESS); } /* Abort on failure */ else { guac_client_log(client, GUAC_LOG_INFO, "Unable to open file \"%s\"", name); guac_protocol_send_ack(client->socket, stream, "SFTP: Open failed", guac_sftp_get_status(object)); } /* Set handlers for file stream */ stream->blob_handler = guac_common_ssh_sftp_blob_handler; stream->end_handler = guac_common_ssh_sftp_end_handler; /* Store file within stream */ stream->data = file; guac_socket_flush(client->socket); return 0; } guac_object* guac_common_ssh_create_sftp_filesystem( guac_common_ssh_session* session, const char* name) { guac_client* client = session->client; /* Request SFTP */ LIBSSH2_SFTP* sftp_session = libssh2_sftp_init(session->session); if (sftp_session == NULL) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR, "Unable to start SFTP session."); return NULL; } /* Allocate data for SFTP session */ guac_common_ssh_sftp_data* sftp_data = malloc(sizeof(guac_common_ssh_sftp_data)); /* Associate SSH session with SFTP data */ sftp_data->ssh_session = session; sftp_data->sftp_session = sftp_session; /* Initially upload files to current directory */ strcpy(sftp_data->upload_path, "."); /* Init filesystem */ guac_object* filesystem = guac_client_alloc_object(client); filesystem->get_handler = guac_common_ssh_sftp_get_handler; filesystem->put_handler = guac_common_ssh_sftp_put_handler; filesystem->data = sftp_data; /* Send filesystem to client */ guac_protocol_send_filesystem(client->socket, filesystem, "/"); guac_socket_flush(client->socket); /* Return allocated filesystem */ return filesystem; } void guac_common_ssh_destroy_sftp_filesystem(guac_object* filesystem) { guac_common_ssh_sftp_data* sftp_data = (guac_common_ssh_sftp_data*) filesystem->data; /* Shutdown SFTP session */ libssh2_sftp_shutdown(sftp_data->sftp_session); /* Clean up the SFTP filesystem object */ guac_client_free_object(sftp_data->ssh_session->client, filesystem); } guacamole-server-0.9.9/src/common-ssh/Makefile.in0000664000175100017510000006473412645400275016661 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Copyright (C) 2015 Glyptodon LLC # # 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. # VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/common-ssh DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libguac_common_ssh_la_DEPENDENCIES = am_libguac_common_ssh_la_OBJECTS = libguac_common_ssh_la-guac_sftp.lo \ libguac_common_ssh_la-guac_ssh.lo \ libguac_common_ssh_la-guac_ssh_buffer.lo \ libguac_common_ssh_la-guac_ssh_key.lo \ libguac_common_ssh_la-guac_ssh_user.lo libguac_common_ssh_la_OBJECTS = $(am_libguac_common_ssh_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libguac_common_ssh_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libguac_common_ssh_la_CFLAGS) $(CFLAGS) \ $(libguac_common_ssh_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libguac_common_ssh_la_SOURCES) DIST_SOURCES = $(libguac_common_ssh_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COMMON_INCLUDE = @COMMON_INCLUDE@ COMMON_LTLIB = @COMMON_LTLIB@ COMMON_SSH_INCLUDE = @COMMON_SSH_INCLUDE@ COMMON_SSH_LTLIB = @COMMON_SSH_LTLIB@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CUNIT_LIBS = @CUNIT_LIBS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBADD_DLOPEN = @LIBADD_DLOPEN@ LIBGUAC_INCLUDE = @LIBGUAC_INCLUDE@ LIBGUAC_LTLIB = @LIBGUAC_LTLIB@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MATH_LIBS = @MATH_LIBS@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@ PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@ PANGO_CFLAGS = @PANGO_CFLAGS@ PANGO_LIBS = @PANGO_LIBS@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_LIBS = @PNG_LIBS@ PTHREAD_LIBS = @PTHREAD_LIBS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ RDP_LIBS = @RDP_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSH_LIBS = @SSH_LIBS@ SSL_LIBS = @SSL_LIBS@ STRIP = @STRIP@ TELNET_LIBS = @TELNET_LIBS@ TERMINAL_INCLUDE = @TERMINAL_INCLUDE@ TERMINAL_LTLIB = @TERMINAL_LTLIB@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VNC_LIBS = @VNC_LIBS@ VORBIS_LIBS = @VORBIS_LIBS@ WEBP_LIBS = @WEBP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ init_dir = @init_dir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 noinst_LTLIBRARIES = libguac_common_ssh.la libguac_common_ssh_la_SOURCES = \ guac_sftp.c \ guac_ssh.c \ guac_ssh_buffer.c \ guac_ssh_key.c \ guac_ssh_user.c noinst_HEADERS = \ guac_sftp.h \ guac_ssh.h \ guac_ssh_buffer.h \ guac_ssh_key.h \ guac_ssh_user.h libguac_common_ssh_la_CFLAGS = \ -Werror -Wall -pedantic \ @COMMON_INCLUDE@ \ @LIBGUAC_INCLUDE@ libguac_common_ssh_la_LIBADD = \ @LIBGUAC_LTLIB@ libguac_common_ssh_la_LDFLAGS = \ @PTHREAD_LIBS@ \ @SSH_LIBS@ \ @SSL_LIBS@ all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/common-ssh/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/common-ssh/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libguac_common_ssh.la: $(libguac_common_ssh_la_OBJECTS) $(libguac_common_ssh_la_DEPENDENCIES) $(EXTRA_libguac_common_ssh_la_DEPENDENCIES) $(AM_V_CCLD)$(libguac_common_ssh_la_LINK) $(libguac_common_ssh_la_OBJECTS) $(libguac_common_ssh_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_common_ssh_la-guac_sftp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_common_ssh_la-guac_ssh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_common_ssh_la-guac_ssh_buffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_common_ssh_la-guac_ssh_key.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguac_common_ssh_la-guac_ssh_user.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libguac_common_ssh_la-guac_sftp.lo: guac_sftp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_ssh_la_CFLAGS) $(CFLAGS) -MT libguac_common_ssh_la-guac_sftp.lo -MD -MP -MF $(DEPDIR)/libguac_common_ssh_la-guac_sftp.Tpo -c -o libguac_common_ssh_la-guac_sftp.lo `test -f 'guac_sftp.c' || echo '$(srcdir)/'`guac_sftp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_common_ssh_la-guac_sftp.Tpo $(DEPDIR)/libguac_common_ssh_la-guac_sftp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_sftp.c' object='libguac_common_ssh_la-guac_sftp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_ssh_la_CFLAGS) $(CFLAGS) -c -o libguac_common_ssh_la-guac_sftp.lo `test -f 'guac_sftp.c' || echo '$(srcdir)/'`guac_sftp.c libguac_common_ssh_la-guac_ssh.lo: guac_ssh.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_ssh_la_CFLAGS) $(CFLAGS) -MT libguac_common_ssh_la-guac_ssh.lo -MD -MP -MF $(DEPDIR)/libguac_common_ssh_la-guac_ssh.Tpo -c -o libguac_common_ssh_la-guac_ssh.lo `test -f 'guac_ssh.c' || echo '$(srcdir)/'`guac_ssh.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_common_ssh_la-guac_ssh.Tpo $(DEPDIR)/libguac_common_ssh_la-guac_ssh.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_ssh.c' object='libguac_common_ssh_la-guac_ssh.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_ssh_la_CFLAGS) $(CFLAGS) -c -o libguac_common_ssh_la-guac_ssh.lo `test -f 'guac_ssh.c' || echo '$(srcdir)/'`guac_ssh.c libguac_common_ssh_la-guac_ssh_buffer.lo: guac_ssh_buffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_ssh_la_CFLAGS) $(CFLAGS) -MT libguac_common_ssh_la-guac_ssh_buffer.lo -MD -MP -MF $(DEPDIR)/libguac_common_ssh_la-guac_ssh_buffer.Tpo -c -o libguac_common_ssh_la-guac_ssh_buffer.lo `test -f 'guac_ssh_buffer.c' || echo '$(srcdir)/'`guac_ssh_buffer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_common_ssh_la-guac_ssh_buffer.Tpo $(DEPDIR)/libguac_common_ssh_la-guac_ssh_buffer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_ssh_buffer.c' object='libguac_common_ssh_la-guac_ssh_buffer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_ssh_la_CFLAGS) $(CFLAGS) -c -o libguac_common_ssh_la-guac_ssh_buffer.lo `test -f 'guac_ssh_buffer.c' || echo '$(srcdir)/'`guac_ssh_buffer.c libguac_common_ssh_la-guac_ssh_key.lo: guac_ssh_key.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_ssh_la_CFLAGS) $(CFLAGS) -MT libguac_common_ssh_la-guac_ssh_key.lo -MD -MP -MF $(DEPDIR)/libguac_common_ssh_la-guac_ssh_key.Tpo -c -o libguac_common_ssh_la-guac_ssh_key.lo `test -f 'guac_ssh_key.c' || echo '$(srcdir)/'`guac_ssh_key.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_common_ssh_la-guac_ssh_key.Tpo $(DEPDIR)/libguac_common_ssh_la-guac_ssh_key.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_ssh_key.c' object='libguac_common_ssh_la-guac_ssh_key.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_ssh_la_CFLAGS) $(CFLAGS) -c -o libguac_common_ssh_la-guac_ssh_key.lo `test -f 'guac_ssh_key.c' || echo '$(srcdir)/'`guac_ssh_key.c libguac_common_ssh_la-guac_ssh_user.lo: guac_ssh_user.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_ssh_la_CFLAGS) $(CFLAGS) -MT libguac_common_ssh_la-guac_ssh_user.lo -MD -MP -MF $(DEPDIR)/libguac_common_ssh_la-guac_ssh_user.Tpo -c -o libguac_common_ssh_la-guac_ssh_user.lo `test -f 'guac_ssh_user.c' || echo '$(srcdir)/'`guac_ssh_user.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libguac_common_ssh_la-guac_ssh_user.Tpo $(DEPDIR)/libguac_common_ssh_la-guac_ssh_user.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='guac_ssh_user.c' object='libguac_common_ssh_la-guac_ssh_user.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguac_common_ssh_la_CFLAGS) $(CFLAGS) -c -o libguac_common_ssh_la-guac_ssh_user.lo `test -f 'guac_ssh_user.c' || echo '$(srcdir)/'`guac_ssh_user.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: guacamole-server-0.9.9/src/common-ssh/guac_ssh.h0000664000175100017510000000724312626133327016551 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 GUAC_COMMON_SSH_H #define GUAC_COMMON_SSH_H #include "guac_ssh_user.h" #include #include /** * An SSH session, backed by libssh2 and associated with a particular * Guacamole client. */ typedef struct guac_common_ssh_session { /** * The Guacamole client using this SSH session. */ guac_client* client; /** * The user that will be authenticating via SSH. */ guac_common_ssh_user* user; /** * The underlying SSH session from libssh2. */ LIBSSH2_SESSION* session; /** * The file descriptor of the socket being used for the SSH connection. */ int fd; } guac_common_ssh_session; /** * Initializes the underlying SSH and encryption libraries used by Guacamole. * This function must be called before any other guac_common_ssh_*() functions * are called. * * @param client * The Guacamole client that will be using SSH. * * @return * Zero if initialization, or non-zero if an error occurs. */ int guac_common_ssh_init(guac_client* client); /** * Cleans up the underlying SSH and encryption libraries used by Guacamole. * This function must be called once no other guac_common_ssh_*() functions * will be used. */ void guac_common_ssh_uninit(); /** * Connects to the SSH server running at the given hostname and port, and * authenticates as the given user. If an error occurs while connecting or * authenticating, the Guacamole client will automatically and fatally abort. * The user object provided must eventually be explicitly destroyed, but should * not be destroyed until this session is destroyed, assuming the session is * successfully created. * * @param client * The Guacamole client that will be using SSH. * * @param hostname * The hostname of the SSH server to connect to. * * @param port * The port to connect to on the given hostname. * * @param user * The user to authenticate as, once connected. * * @return * A new SSH session if the connection and authentication succeed, or NULL * if the connection or authentication were not successful. */ guac_common_ssh_session* guac_common_ssh_create_session(guac_client* client, const char* hostname, const char* port, guac_common_ssh_user* user); /** * Disconnects and destroys the given SSH session, freeing all associated * resources. Any associated user must be explicitly destroyed, and will not * be destroyed automatically. * * @param session * The SSH session to destroy. */ void guac_common_ssh_destroy_session(guac_common_ssh_session* session); #endif guacamole-server-0.9.9/src/common-ssh/guac_ssh_buffer.c0000664000175100017510000000676712626133327020107 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "config.h" #include #include #include #include #include void guac_common_ssh_buffer_write_byte(char** buffer, uint8_t value) { uint8_t* data = (uint8_t*) *buffer; *data = value; (*buffer)++; } void guac_common_ssh_buffer_write_uint32(char** buffer, uint32_t value) { uint8_t* data = (uint8_t*) *buffer; data[0] = (value & 0xFF000000) >> 24; data[1] = (value & 0x00FF0000) >> 16; data[2] = (value & 0x0000FF00) >> 8; data[3] = value & 0x000000FF; *buffer += 4; } void guac_common_ssh_buffer_write_data(char** buffer, const char* data, int length) { memcpy(*buffer, data, length); *buffer += length; } void guac_common_ssh_buffer_write_bignum(char** buffer, BIGNUM* value) { unsigned char* bn_buffer; int length; /* If zero, just write zero length */ if (BN_is_zero(value)) { guac_common_ssh_buffer_write_uint32(buffer, 0); return; } /* Allocate output buffer, add padding byte */ length = BN_num_bytes(value); bn_buffer = malloc(length); /* Convert BIGNUM */ BN_bn2bin(value, bn_buffer); /* If first byte has high bit set, write padding byte */ if (bn_buffer[0] & 0x80) { guac_common_ssh_buffer_write_uint32(buffer, length+1); guac_common_ssh_buffer_write_byte(buffer, 0); } else guac_common_ssh_buffer_write_uint32(buffer, length); /* Write data */ memcpy(*buffer, bn_buffer, length); *buffer += length; free(bn_buffer); } void guac_common_ssh_buffer_write_string(char** buffer, const char* string, int length) { guac_common_ssh_buffer_write_uint32(buffer, length); guac_common_ssh_buffer_write_data(buffer, string, length); } uint8_t guac_common_ssh_buffer_read_byte(char** buffer) { uint8_t* data = (uint8_t*) *buffer; uint8_t value = *data; (*buffer)++; return value; } uint32_t guac_common_ssh_buffer_read_uint32(char** buffer) { uint8_t* data = (uint8_t*) *buffer; uint32_t value = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; *buffer += 4; return value; } char* guac_common_ssh_buffer_read_string(char** buffer, int* length) { char* value; *length = guac_common_ssh_buffer_read_uint32(buffer); value = *buffer; *buffer += *length; return value; } guacamole-server-0.9.9/src/common-ssh/guac_ssh_key.c0000664000175100017510000001433212626133327017411 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "config.h" #include "guac_ssh_buffer.h" #include "guac_ssh_key.h" #include #include #include #include #include #include #include #include #include #include guac_common_ssh_key* guac_common_ssh_key_alloc(char* data, int length, char* passphrase) { guac_common_ssh_key* key; BIO* key_bio; char* public_key; char* pos; /* Create BIO for reading key from memory */ key_bio = BIO_new_mem_buf(data, length); /* If RSA key, load RSA */ if (length > sizeof(SSH_RSA_KEY_HEADER)-1 && memcmp(SSH_RSA_KEY_HEADER, data, sizeof(SSH_RSA_KEY_HEADER)-1) == 0) { RSA* rsa_key; /* Read key */ rsa_key = PEM_read_bio_RSAPrivateKey(key_bio, NULL, NULL, passphrase); if (rsa_key == NULL) return NULL; /* Allocate key */ key = malloc(sizeof(guac_common_ssh_key)); key->rsa = rsa_key; /* Set type */ key->type = SSH_KEY_RSA; /* Allocate space for public key */ public_key = malloc(4096); pos = public_key; /* Derive public key */ guac_common_ssh_buffer_write_string(&pos, "ssh-rsa", sizeof("ssh-rsa")-1); guac_common_ssh_buffer_write_bignum(&pos, rsa_key->e); guac_common_ssh_buffer_write_bignum(&pos, rsa_key->n); /* Save public key to structure */ key->public_key = public_key; key->public_key_length = pos - public_key; } /* If DSA key, load DSA */ else if (length > sizeof(SSH_DSA_KEY_HEADER)-1 && memcmp(SSH_DSA_KEY_HEADER, data, sizeof(SSH_DSA_KEY_HEADER)-1) == 0) { DSA* dsa_key; /* Read key */ dsa_key = PEM_read_bio_DSAPrivateKey(key_bio, NULL, NULL, passphrase); if (dsa_key == NULL) return NULL; /* Allocate key */ key = malloc(sizeof(guac_common_ssh_key)); key->dsa = dsa_key; /* Set type */ key->type = SSH_KEY_DSA; /* Allocate space for public key */ public_key = malloc(4096); pos = public_key; /* Derive public key */ guac_common_ssh_buffer_write_string(&pos, "ssh-dss", sizeof("ssh-dss")-1); guac_common_ssh_buffer_write_bignum(&pos, dsa_key->p); guac_common_ssh_buffer_write_bignum(&pos, dsa_key->q); guac_common_ssh_buffer_write_bignum(&pos, dsa_key->g); guac_common_ssh_buffer_write_bignum(&pos, dsa_key->pub_key); /* Save public key to structure */ key->public_key = public_key; key->public_key_length = pos - public_key; } /* Otherwise, unsupported type */ else { BIO_free(key_bio); return NULL; } /* Copy private key to structure */ key->private_key_length = length; key->private_key = malloc(length); memcpy(key->private_key, data, length); BIO_free(key_bio); return key; } const char* guac_common_ssh_key_error() { /* Return static error string */ return ERR_reason_error_string(ERR_get_error()); } void guac_common_ssh_key_free(guac_common_ssh_key* key) { /* Free key-specific data */ if (key->type == SSH_KEY_RSA) RSA_free(key->rsa); else if (key->type == SSH_KEY_DSA) DSA_free(key->dsa); free(key->public_key); free(key); } int guac_common_ssh_key_sign(guac_common_ssh_key* key, const char* data, int length, unsigned char* sig) { const EVP_MD* md; EVP_MD_CTX md_ctx; unsigned char digest[EVP_MAX_MD_SIZE]; unsigned int dlen, len; /* Get SHA1 digest */ if ((md = EVP_get_digestbynid(NID_sha1)) == NULL) return -1; /* Digest data */ EVP_DigestInit(&md_ctx, md); EVP_DigestUpdate(&md_ctx, data, length); EVP_DigestFinal(&md_ctx, digest, &dlen); /* Sign with key */ switch (key->type) { case SSH_KEY_RSA: if (RSA_sign(NID_sha1, digest, dlen, sig, &len, key->rsa) == 1) return len; break; case SSH_KEY_DSA: { DSA_SIG* dsa_sig = DSA_do_sign(digest, dlen, key->dsa); if (dsa_sig != NULL) { /* Compute size of each half of signature */ int rlen = BN_num_bytes(dsa_sig->r); int slen = BN_num_bytes(dsa_sig->s); /* Ensure each number is within the required size */ if (rlen > DSA_SIG_NUMBER_SIZE || slen > DSA_SIG_NUMBER_SIZE) return -1; /* Init to all zeroes */ memset(sig, 0, DSA_SIG_SIZE); /* Add R at the end of the first block of the signature */ BN_bn2bin(dsa_sig->r, sig + DSA_SIG_SIZE - DSA_SIG_NUMBER_SIZE - rlen); /* Add S at the end of the second block of the signature */ BN_bn2bin(dsa_sig->s, sig + DSA_SIG_SIZE - slen); /* Done */ DSA_SIG_free(dsa_sig); return DSA_SIG_SIZE; } } } return -1; } guacamole-server-0.9.9/src/common-ssh/guac_ssh_buffer.h0000664000175100017510000000754112626133327020103 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 GUAC_COMMON_SSH_BUFFER_H #define GUAC_COMMON_SSH_BUFFER_H #include "config.h" #include #include /** * Writes the given byte to the given buffer, advancing the buffer pointer by * one byte. * * @param buffer * The buffer to write to. * * @param value * The value to write. */ void guac_common_ssh_buffer_write_byte(char** buffer, uint8_t value); /** * Writes the given integer to the given buffer, advancing the buffer pointer * four bytes. * * @param buffer * The buffer to write to. * * @param value * The value to write. */ void guac_common_ssh_buffer_write_uint32(char** buffer, uint32_t value); /** * Writes the given string and its length to the given buffer, advancing the * buffer pointer by the size of the length (four bytes) and the size of the * string. * * @param buffer * The buffer to write to. * * @param string * The string value to write. * * @param length * The length of the string to write, in bytes. */ void guac_common_ssh_buffer_write_string(char** buffer, const char* string, int length); /** * Writes the given BIGNUM the given buffer, advancing the buffer pointer by * the size of the length (four bytes) and the size of the BIGNUM. * * @param buffer * The buffer to write to. * * @param value * The value to write. */ void guac_common_ssh_buffer_write_bignum(char** buffer, BIGNUM* value); /** * Writes the given data the given buffer, advancing the buffer pointer by the * given length. * * @param data * The arbitrary data to write. * * @param length * The length of data to write, in bytes. */ void guac_common_ssh_buffer_write_data(char** buffer, const char* data, int length); /** * Reads a single byte from the given buffer, advancing the buffer by one byte. * * @param buffer * The buffer to read from. * * @return * The value read from the buffer. */ uint8_t guac_common_ssh_buffer_read_byte(char** buffer); /** * Reads an integer from the given buffer, advancing the buffer by four bytes. * * @param buffer * The buffer to read from. * * @return * The value read from the buffer. */ uint32_t guac_common_ssh_buffer_read_uint32(char** buffer); /** * Reads a string and its length from the given buffer, advancing the buffer * by the size of the length (four bytes) and the size of the string, and * returning a pointer to the buffer. The length of the string is stored in * the given int. * * @param buffer * The buffer to read from. * * @param length * A pointer to an integer into which the length of the read string will * be stored. * * @return * A pointer to the value within the buffer. */ char* guac_common_ssh_buffer_read_string(char** buffer, int* length); #endif guacamole-server-0.9.9/src/common-ssh/guac_ssh.c0000664000175100017510000003710512626133327016544 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 "guac_ssh.h" #include "guac_ssh_key.h" #include "guac_ssh_user.h" #include #include #ifdef LIBSSH2_USES_GCRYPT #include #endif #include #include #include #include #include #include #include #include #include #include #include #ifdef LIBSSH2_USES_GCRYPT GCRY_THREAD_OPTION_PTHREAD_IMPL; #endif /** * Array of mutexes, used by OpenSSL. */ static pthread_mutex_t* guac_common_ssh_openssl_locks; /** * Called by OpenSSL when locking or unlocking the Nth mutex. * * @param mode * A bitmask denoting the action to be taken on the Nth lock, such as * CRYPTO_LOCK or CRYPTO_UNLOCK. * * @param n * The index of the lock to lock or unlock. * * @param file * The filename of the function setting the lock, for debugging purposes. * * @param line * The line number of the function setting the lock, for debugging * purposes. */ static void guac_common_ssh_openssl_locking_callback(int mode, int n, const char* file, int line){ /* Lock given mutex upon request */ if (mode & CRYPTO_LOCK) pthread_mutex_lock(&(guac_common_ssh_openssl_locks[n])); /* Unlock given mutex upon request */ else if (mode & CRYPTO_UNLOCK) pthread_mutex_unlock(&(guac_common_ssh_openssl_locks[n])); } /** * Called by OpenSSL when determining the current thread ID. * * @return * An ID which uniquely identifies the current thread. */ static unsigned long guac_common_ssh_openssl_id_callback() { return (unsigned long) pthread_self(); } /** * Creates the given number of mutexes, such that OpenSSL will have at least * this number of mutexes at its disposal. * * @param count * The number of mutexes (locks) to create. */ static void guac_common_ssh_openssl_init_locks(int count) { int i; /* Allocate required number of locks */ guac_common_ssh_openssl_locks = malloc(sizeof(pthread_mutex_t) * CRYPTO_num_locks()); /* Initialize each lock */ for (i=0; i < count; i++) pthread_mutex_init(&(guac_common_ssh_openssl_locks[i]), NULL); } /** * Frees the given number of mutexes. * * @param count * The number of mutexes (locks) to free. */ static void guac_common_ssh_openssl_free_locks(int count) { int i; /* Free all locks */ for (i=0; i < count; i++) pthread_mutex_destroy(&(guac_common_ssh_openssl_locks[i])); } int guac_common_ssh_init(guac_client* client) { #ifdef LIBSSH2_USES_GCRYPT /* Init threadsafety in libgcrypt */ gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); if (!gcry_check_version(GCRYPT_VERSION)) { guac_client_log(client, GUAC_LOG_ERROR, "libgcrypt version mismatch."); return 1; } #endif /* Init threadsafety in OpenSSL */ guac_common_ssh_openssl_init_locks(CRYPTO_num_locks()); CRYPTO_set_id_callback(guac_common_ssh_openssl_id_callback); CRYPTO_set_locking_callback(guac_common_ssh_openssl_locking_callback); /* Init OpenSSL */ SSL_library_init(); ERR_load_crypto_strings(); /* Init libssh2 */ libssh2_init(0); /* Success */ return 0; } void guac_common_ssh_uninit() { guac_common_ssh_openssl_free_locks(CRYPTO_num_locks()); } /** * Callback invoked by libssh2 when libssh2_userauth_publickkey() is invoked. * This callback must sign the given data, returning the signature as newly- * allocated buffer space. * * @param session * The SSH session for which the signature is being generated. * * @param sig * A pointer to the buffer space containing the signature. This callback * MUST allocate and assign this space. * * @param sig_len * The length of the signature within the allocated buffer space, in bytes. * This value must be set to the size of the signature after the signing * operation completes. * * @param data * The arbitrary data that must be signed. * * @param data_len * The length of the arbitrary data to be signed, in bytes. * * @param abstract * The value of the abstract parameter provided with the corresponding call * to libssh2_userauth_publickey(). * * @return * Zero on success, non-zero if the signing operation failed. */ static int guac_common_ssh_sign_callback(LIBSSH2_SESSION* session, unsigned char** sig, size_t* sig_len, const unsigned char* data, size_t data_len, void **abstract) { guac_common_ssh_key* key = (guac_common_ssh_key*) abstract; int length; /* Allocate space for signature */ *sig = malloc(4096); /* Sign with key */ length = guac_common_ssh_key_sign(key, (const char*) data, data_len, *sig); if (length < 0) return 1; *sig_len = length; return 0; } /** * Callback for the keyboard-interactive authentication method. Currently * supports just one prompt for the password. This callback is invoked as * needed to fullfill a call to libssh2_userauth_keyboard_interactive(). * * @param name * An arbitrary name which should be printed to the terminal for the * benefit of the user. This is currently ignored. * * @param name_len * The length of the name string, in bytes. * * @param instruction * Arbitrary instructions which should be printed to the terminal for the * benefit of the user. This is currently ignored. * * @param instruction_len * The length of the instruction string, in bytes. * * @param num_prompts * The number of keyboard-interactive prompts for which responses are * requested. This callback currently only supports one prompt, and assumes * that this prompt is requesting the password. * * @param prompts * An array of all keyboard-interactive prompts for which responses are * requested. * * @param responses * A parallel array into which all prompt responses should be stored. Each * entry within this array corresponds to the entry in the prompts array * with the same index. * * @param abstract * The value of the abstract parameter provided when the SSH session was * created with libssh2_session_init_ex(). */ static void guac_common_ssh_kbd_callback(const char *name, int name_len, const char *instruction, int instruction_len, int num_prompts, const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, void **abstract) { guac_common_ssh_session* common_session = (guac_common_ssh_session*) *abstract; guac_client* client = common_session->client; /* Send password if only one prompt */ if (num_prompts == 1) { char* password = common_session->user->password; responses[0].text = strdup(password); responses[0].length = strlen(password); } /* If more than one prompt, a single password is not enough */ else guac_client_log(client, GUAC_LOG_WARNING, "Unsupported number of keyboard-interactive prompts: %i", num_prompts); } /** * Authenticates the user associated with the given session over SSH. All * required credentials must already be present within the user object * associated with the given session. * * @param session * The session associated with the user to be authenticated. * * @return * Zero if authentication succeeds, or non-zero if authentication has * failed. */ static int guac_common_ssh_authenticate(guac_common_ssh_session* common_session) { guac_client* client = common_session->client; guac_common_ssh_user* user = common_session->user; LIBSSH2_SESSION* session = common_session->session; /* Get user credentials */ char* username = user->username; char* password = user->password; guac_common_ssh_key* key = user->private_key; /* Validate username provided */ if (username == NULL) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_CLIENT_UNAUTHORIZED, "SSH authentication requires a username."); return 1; } /* Get list of supported authentication methods */ char* user_authlist = libssh2_userauth_list(session, username, strlen(username)); guac_client_log(client, GUAC_LOG_DEBUG, "Supported authentication methods: %s", user_authlist); /* Authenticate with private key, if provided */ if (key != NULL) { /* Check if public key auth is supported on the server */ if (strstr(user_authlist, "publickey") == NULL) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_CLIENT_UNAUTHORIZED, "Public key authentication is not supported by " "the SSH server"); return 1; } /* Attempt public key auth */ if (libssh2_userauth_publickey(session, username, (unsigned char*) key->public_key, key->public_key_length, guac_common_ssh_sign_callback, (void**) key)) { /* Abort on failure */ char* error_message; libssh2_session_last_error(session, &error_message, NULL, 0); guac_client_abort(client, GUAC_PROTOCOL_STATUS_CLIENT_UNAUTHORIZED, "Public key authentication failed: %s", error_message); return 1; } /* Private key authentication succeeded */ return 0; } /* Authenticate with password, if provided */ else if (password != NULL) { /* Authenticate with password */ if (strstr(user_authlist, "password") != NULL) { guac_client_log(client, GUAC_LOG_DEBUG, "Using password authentication method"); return libssh2_userauth_password(session, username, password); } /* Authenticate with password via keyboard-interactive auth */ if (strstr(user_authlist, "keyboard-interactive") != NULL) { guac_client_log(client, GUAC_LOG_DEBUG, "Using keyboard-interactive authentication method"); return libssh2_userauth_keyboard_interactive(session, username, &guac_common_ssh_kbd_callback); } /* No known authentication types available */ guac_client_abort(client, GUAC_PROTOCOL_STATUS_CLIENT_UNAUTHORIZED, "Password and keyboard-interactive authentication are not " "supported by the SSH server"); return 1; } /* No credentials provided */ guac_client_abort(client, GUAC_PROTOCOL_STATUS_CLIENT_UNAUTHORIZED, "SSH authentication requires either a private key or a password."); return 1; } guac_common_ssh_session* guac_common_ssh_create_session(guac_client* client, const char* hostname, const char* port, guac_common_ssh_user* user) { int retval; int fd; struct addrinfo* addresses; struct addrinfo* current_address; char connected_address[1024]; char connected_port[64]; struct addrinfo hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM, .ai_protocol = IPPROTO_TCP }; /* Get socket */ fd = socket(AF_INET, SOCK_STREAM, 0); if (fd < 0) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Unable to create socket: %s", strerror(errno)); return NULL; } /* Get addresses connection */ if ((retval = getaddrinfo(hostname, port, &hints, &addresses))) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Error parsing given address or port: %s", gai_strerror(retval)); close(fd); return NULL; } /* Attempt connection to each address until success */ current_address = addresses; while (current_address != NULL) { /* Resolve hostname */ if ((retval = getnameinfo(current_address->ai_addr, current_address->ai_addrlen, connected_address, sizeof(connected_address), connected_port, sizeof(connected_port), NI_NUMERICHOST | NI_NUMERICSERV))) guac_client_log(client, GUAC_LOG_DEBUG, "Unable to resolve host: %s", gai_strerror(retval)); /* Connect */ if (connect(fd, current_address->ai_addr, current_address->ai_addrlen) == 0) { guac_client_log(client, GUAC_LOG_DEBUG, "Successfully connected to host %s, port %s", connected_address, connected_port); /* Done if successful connect */ break; } /* Otherwise log information regarding bind failure */ else guac_client_log(client, GUAC_LOG_DEBUG, "Unable to connect to " "host %s, port %s: %s", connected_address, connected_port, strerror(errno)); current_address = current_address->ai_next; } /* If unable to connect to anything, fail */ if (current_address == NULL) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR, "Unable to connect to any addresses."); close(fd); return NULL; } /* Free addrinfo */ freeaddrinfo(addresses); /* Allocate new session */ guac_common_ssh_session* common_session = malloc(sizeof(guac_common_ssh_session)); /* Open SSH session */ LIBSSH2_SESSION* session = libssh2_session_init_ex(NULL, NULL, NULL, common_session); if (session == NULL) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Session allocation failed."); free(common_session); close(fd); return NULL; } /* Perform handshake */ if (libssh2_session_handshake(session, fd)) { guac_client_abort(client, GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR, "SSH handshake failed."); free(common_session); close(fd); return NULL; } /* Store basic session data */ common_session->client = client; common_session->user = user; common_session->session = session; common_session->fd = fd; /* Attempt authentication */ if (guac_common_ssh_authenticate(common_session)) { free(common_session); close(fd); return NULL; } /* Return created session */ return common_session; } void guac_common_ssh_destroy_session(guac_common_ssh_session* session) { /* Disconnect and clean up libssh2 */ libssh2_session_disconnect(session->session, "Bye"); libssh2_session_free(session->session); /* Free all other data */ free(session); } guacamole-server-0.9.9/src/common-ssh/Makefile.am0000664000175100017510000000343312626133327016635 00000000000000# # Copyright (C) 2015 Glyptodon LLC # # 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. # AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 noinst_LTLIBRARIES = libguac_common_ssh.la libguac_common_ssh_la_SOURCES = \ guac_sftp.c \ guac_ssh.c \ guac_ssh_buffer.c \ guac_ssh_key.c \ guac_ssh_user.c noinst_HEADERS = \ guac_sftp.h \ guac_ssh.h \ guac_ssh_buffer.h \ guac_ssh_key.h \ guac_ssh_user.h libguac_common_ssh_la_CFLAGS = \ -Werror -Wall -pedantic \ @COMMON_INCLUDE@ \ @LIBGUAC_INCLUDE@ libguac_common_ssh_la_LIBADD = \ @LIBGUAC_LTLIB@ libguac_common_ssh_la_LDFLAGS = \ @PTHREAD_LIBS@ \ @SSH_LIBS@ \ @SSL_LIBS@ guacamole-server-0.9.9/src/common-ssh/guac_sftp.h0000664000175100017510000001332112626133327016722 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 GUAC_COMMON_SSH_SFTP_H #define GUAC_COMMON_SSH_SFTP_H #include "guac_json.h" #include "guac_ssh.h" #include #include #include #include /** * Maximum number of bytes per path. */ #define GUAC_COMMON_SSH_SFTP_MAX_PATH 2048 /** * Data associated with an SFTP-driven filesystem object. */ typedef struct guac_common_ssh_sftp_data { /** * The distinct SSH session used for SFTP. */ guac_common_ssh_session* ssh_session; /** * SFTP session, used for file transfers. */ LIBSSH2_SFTP* sftp_session; /** * The path files will be sent to, if uploaded directly via a "file" * instruction. */ char upload_path[GUAC_COMMON_SSH_SFTP_MAX_PATH]; } guac_common_ssh_sftp_data; /** * The current state of a directory listing operation. */ typedef struct guac_common_ssh_sftp_ls_state { /** * Data associated with the current SFTP session. */ guac_common_ssh_sftp_data* sftp_data; /** * Reference to the directory currently being listed over SFTP. This * directory must already be open from a call to libssh2_sftp_opendir(). */ LIBSSH2_SFTP_HANDLE* directory; /** * The absolute path of the directory being listed. */ char directory_name[GUAC_COMMON_SSH_SFTP_MAX_PATH]; /** * The current state of the JSON directory object being written. */ guac_common_json_state json_state; } guac_common_ssh_sftp_ls_state; /** * Creates a new Guacamole filesystem object which provides access to files * and directories via SFTP using the given SSH session. When the filesystem * will no longer be used, it must be explicitly destroyed with * guac_common_ssh_destroy_sftp_filesystem(). * * @param session * The session to use to provide SFTP. This session will automatically be * destroyed when this filesystem is destroyed. * * @param name * The name to send as the name of the filesystem. * * @return * A new Guacamole filesystem object, already configured to use SFTP for * uploading and downloading files. */ guac_object* guac_common_ssh_create_sftp_filesystem( guac_common_ssh_session* session, const char* name); /** * Destroys the given filesystem object, disconnecting from SFTP and freeing * and associated resources. Any associated session or user objects must be * explicitly destroyed. * * @param object * The filesystem object to destroy. */ void guac_common_ssh_destroy_sftp_filesystem(guac_object* filesystem); /** * Initiates an SFTP file download to the user via the Guacamole "file" * instruction. The download will be automatically monitored and continued * after this function terminates in response to "ack" instructions received by * the client. * * @param filesystem * The filesystem containing the file to be downloaded. * * @param filename * The filename of the file to download, relative to the given filesystem. * * @return * The file stream created for the file download, already configured to * properly handle "ack" responses, etc. from the client. */ guac_stream* guac_common_ssh_sftp_download_file(guac_object* filesystem, char* filename); /** * Handles an incoming stream from a Guacamole "file" instruction, saving the * contents of that stream to the file having the given name within the * upload directory set by guac_common_ssh_sftp_set_upload_path(). * * @param filesystem * The filesystem that should receive the uploaded file. * * @param stream * The stream through which the uploaded file data will be received. * * @param mimetype * The mimetype of the data being received. * * @param filename * The filename of the file to write to. This filename will always be taken * relative to the upload path set by * guac_common_ssh_sftp_set_upload_path(). * * @return * Zero if the incoming stream has been handled successfully, non-zero on * failure. */ int guac_common_ssh_sftp_handle_file_stream(guac_object* filesystem, guac_stream* stream, char* mimetype, char* filename); /** * Set the destination directory for future uploads submitted via * guac_common_ssh_sftp_handle_file_stream(). This function has no bearing * on the destination directories of files uploaded with "put" instructions. * * @param filesystem * The filesystem to set the upload path of. * * @param path * The path to use for future uploads submitted via the * guac_common_ssh_sftp_handle_file_stream() function. */ void guac_common_ssh_sftp_set_upload_path(guac_object* filesystem, const char* path); #endif guacamole-server-0.9.9/src/common-ssh/guac_ssh_key.h0000664000175100017510000001052512626133327017416 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 GUAC_COMMON_SSH_KEY_H #define GUAC_COMMON_SSH_KEY_H #include "config.h" #include /** * The expected header of RSA private keys. */ #define SSH_RSA_KEY_HEADER "-----BEGIN RSA PRIVATE KEY-----" /** * The expected header of DSA private keys. */ #define SSH_DSA_KEY_HEADER "-----BEGIN DSA PRIVATE KEY-----" /** * The size of single number within a DSA signature, in bytes. */ #define DSA_SIG_NUMBER_SIZE 20 /** * The size of a DSA signature, in bytes. */ #define DSA_SIG_SIZE DSA_SIG_NUMBER_SIZE*2 /** * The type of an SSH key. */ typedef enum guac_common_ssh_key_type { /** * RSA key. */ SSH_KEY_RSA, /** * DSA key. */ SSH_KEY_DSA } guac_common_ssh_key_type; /** * Abstraction of a key used for SSH authentication. */ typedef struct guac_common_ssh_key { /** * The type of this key. */ guac_common_ssh_key_type type; /** * Underlying RSA private key, if any. */ RSA* rsa; /** * Underlying DSA private key, if any. */ DSA* dsa; /** * The associated public key, encoded as necessary for SSH. */ char* public_key; /** * The length of the public key, in bytes. */ int public_key_length; /** * The private key, encoded as necessary for SSH. */ char* private_key; /** * The length of the private key, in bytes. */ int private_key_length; } guac_common_ssh_key; /** * Allocates a new key containing the given private key data and specified * passphrase. If unable to read the key, NULL is returned. * * @param data * The base64-encoded data to decode when reading the key. * * @param length * The length of the provided data, in bytes. * * @param passphrase * The passphrase to use when decrypting the key, if any, or an empty * string or NULL if no passphrase is needed. * * @return * The decoded, decrypted private key, or NULL if the key could not be * decoded. */ guac_common_ssh_key* guac_common_ssh_key_alloc(char* data, int length, char* passphrase); /** * Returns a statically-allocated string describing the most recent SSH key * error. * * @return * A statically-allocated string describing the most recent SSH key error. */ const char* guac_common_ssh_key_error(); /** * Frees all memory associated with the given key. * * @param key * The key to free. */ void guac_common_ssh_key_free(guac_common_ssh_key* key); /** * Signs the given data using the given key, returning the length of the * signature in bytes, or a value less than zero on error. * * @param key * The key to use when signing the given data. * * @param data * The arbitrary data to sign. * * @param length * The length of the arbitrary data being signed, in bytes. * * @param sig * The buffer into which the signature should be written. The buffer must * be at least DSA_SIG_SIZE for DSA keys. For RSA keys, the signature size * is dependent only on key size, and is equal to the length of the * modulus, in bytes. * * @return * The number of bytes in the resulting signature. */ int guac_common_ssh_key_sign(guac_common_ssh_key* key, const char* data, int length, unsigned char* sig); #endif guacamole-server-0.9.9/src/common-ssh/guac_ssh_user.h0000664000175100017510000000704012626133327017602 00000000000000/* * Copyright (C) 2015 Glyptodon LLC * * 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 GUAC_COMMON_SSH_USER_H #define GUAC_COMMON_SSH_USER_H #include "guac_ssh_key.h" /** * Data describing an SSH user, including their credentials. */ typedef struct guac_common_ssh_user { /** * The username of this user. */ char* username; /** * The password which should be used to authenticate this user, if any, or * NULL if a private key will be used instead. */ char* password; /** * The private key which should be used to authenticate this user, if any, * or NULL if a password will be used instead. */ guac_common_ssh_key* private_key; } guac_common_ssh_user; /** * Creates a new SSH user with the given username. When additionally populated * with a password or private key, this user can then be used for * authentication. * * @param username * The username of the user being created. * * @return * A new SSH user having the given username, but no associated password * or private key. */ guac_common_ssh_user* guac_common_ssh_create_user(const char* username); /** * Destroys the given user object, releasing all associated resources. * * @param user * The user to destroy. */ void guac_common_ssh_destroy_user(guac_common_ssh_user* user); /** * Associates the given user with the given password, such that that password * is used for future authentication attempts. * * @param user * The user to associate with the given password. * * @param password * The password to associate with the given user. */ void guac_common_ssh_user_set_password(guac_common_ssh_user* user, const char* password); /** * Imports the given private key, associating that key with the given user. If * necessary to decrypt the key, a passphrase may be specified. The private key * must be provided in base64 form. If the private key is imported * successfully, it will be used for future authentication attempts. * * @param user * The user to associate with the given private key. * * @param private_key * The base64-encoded private key to import. * * @param passphrase * The passphrase to use to decrypt the given private key, or NULL if no * passphrase should be used. * * @return * Zero if the private key is successfully imported, or non-zero if the * private key could not be imported due to an error. */ int guac_common_ssh_user_import_key(guac_common_ssh_user* user, char* private_key, char* passphrase); #endif guacamole-server-0.9.9/src/guacd/0000775000175100017510000000000012645400336013654 500000000000000guacamole-server-0.9.9/src/guacd/daemon.c0000664000175100017510000005314112643542623015213 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "client-map.h" #include "conf-args.h" #include "conf-file.h" #include "log.h" #include #include #include #include #include #include #ifdef ENABLE_SSL #include #include "socket-ssl.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define GUACD_DEV_NULL "/dev/null" #define GUACD_ROOT "/" /** * Logs a reasonable explanatory message regarding handshake failure based on * the current value of guac_error. */ static void guacd_log_handshake_failure() { if (guac_error == GUAC_STATUS_CLOSED) guacd_log(GUAC_LOG_INFO, "Guacamole connection closed during handshake"); else if (guac_error == GUAC_STATUS_PROTOCOL_ERROR) guacd_log(GUAC_LOG_ERROR, "Guacamole protocol violation. Perhaps the version of " "guacamole-client is incompatible with this version of " "guacd?"); else guacd_log(GUAC_LOG_WARNING, "Guacamole handshake failed: %s", guac_status_string(guac_error)); } /** * Copies the given array of mimetypes (strings) into a newly-allocated NULL- * terminated array of strings. Both the array and the strings within the array * are newly-allocated and must be later freed via guacd_free_mimetypes(). * * @param mimetypes * The array of mimetypes to copy. * * @param count * The number of mimetypes in the given array. * * @return * A newly-allocated, NULL-terminated array containing newly-allocated * copies of each of the mimetypes provided in the original mimetypes * array. */ static char** guacd_copy_mimetypes(char** mimetypes, int count) { int i; /* Allocate sufficient space for NULL-terminated array of mimetypes */ char** mimetypes_copy = malloc(sizeof(char*) * (count+1)); /* Copy each provided mimetype */ for (i = 0; i < count; i++) mimetypes_copy[i] = strdup(mimetypes[i]); /* Terminate with NULL */ mimetypes_copy[count] = NULL; return mimetypes_copy; } /** * Frees the given array of mimetypes, including the space allocated to each * mimetype string within the array. The provided array of mimetypes MUST have * been allocated with guacd_copy_mimetypes(). * * @param mimetypes * The NULL-terminated array of mimetypes to free. This array MUST have * been previously allocated with guacd_copy_mimetypes(). */ static void guacd_free_mimetypes(char** mimetypes) { char** current_mimetype = mimetypes; /* Free all strings within NULL-terminated mimetype array */ while (*current_mimetype != NULL) { free(*current_mimetype); current_mimetype++; } /* Free the array itself, now that its contents have been freed */ free(mimetypes); } /** * Creates a new guac_client for the connection on the given socket, adding * it to the client map based on its ID. */ static void guacd_handle_connection(guacd_client_map* map, guac_socket* socket) { guac_client* client; guac_client_plugin* plugin; guac_instruction* select; guac_instruction* size; guac_instruction* audio; guac_instruction* video; guac_instruction* image; guac_instruction* connect; int init_result; /* Reset guac_error */ guac_error = GUAC_STATUS_SUCCESS; guac_error_message = NULL; /* Get protocol from select instruction */ select = guac_instruction_expect(socket, GUACD_USEC_TIMEOUT, "select"); if (select == NULL) { /* Log error */ guacd_log_handshake_failure(); guacd_log_guac_error(GUAC_LOG_DEBUG, "Error reading \"select\""); /* Free resources */ guac_socket_free(socket); return; } /* Validate args to select */ if (select->argc != 1) { /* Log error */ guacd_log_handshake_failure(); guacd_log(GUAC_LOG_ERROR, "Bad number of arguments to \"select\" (%i)", select->argc); /* Free resources */ guac_socket_free(socket); return; } guacd_log(GUAC_LOG_INFO, "Protocol \"%s\" selected", select->argv[0]); /* Get plugin from protocol in select */ plugin = guac_client_plugin_open(select->argv[0]); guac_instruction_free(select); if (plugin == NULL) { /* Log error */ if (guac_error == GUAC_STATUS_NOT_FOUND) guacd_log(GUAC_LOG_WARNING, "Support for selected protocol is not installed"); else guacd_log_guac_error(GUAC_LOG_ERROR, "Unable to load client plugin"); /* Free resources */ guac_socket_free(socket); return; } /* Send args response */ if (guac_protocol_send_args(socket, plugin->args) || guac_socket_flush(socket)) { /* Log error */ guacd_log_handshake_failure(); guacd_log_guac_error(GUAC_LOG_DEBUG, "Error sending \"args\""); if (guac_client_plugin_close(plugin)) guacd_log_guac_error(GUAC_LOG_WARNING, "Unable to close client plugin"); guac_socket_free(socket); return; } /* Get client */ client = guac_client_alloc(); if (client == NULL) { guacd_log_guac_error(GUAC_LOG_ERROR, "Unable to create client"); guac_socket_free(socket); return; } /* Get optimal screen size */ size = guac_instruction_expect( socket, GUACD_USEC_TIMEOUT, "size"); if (size == NULL) { /* Log error */ guacd_log_handshake_failure(); guacd_log_guac_error(GUAC_LOG_DEBUG, "Error reading \"size\""); /* Free resources */ guac_client_free(client); guac_socket_free(socket); return; } /* Parse optimal screen dimensions from size instruction */ client->info.optimal_width = atoi(size->argv[0]); client->info.optimal_height = atoi(size->argv[1]); /* If DPI given, set the client resolution */ if (size->argc >= 3) client->info.optimal_resolution = atoi(size->argv[2]); /* Otherwise, use a safe default for rough backwards compatibility */ else client->info.optimal_resolution = 96; guac_instruction_free(size); /* Get supported audio formats */ audio = guac_instruction_expect( socket, GUACD_USEC_TIMEOUT, "audio"); if (audio == NULL) { /* Log error */ guacd_log_handshake_failure(); guacd_log_guac_error(GUAC_LOG_DEBUG, "Error reading \"audio\""); /* Free resources */ guac_client_free(client); guac_socket_free(socket); return; } /* Store audio mimetypes */ client->info.audio_mimetypes = guacd_copy_mimetypes(audio->argv, audio->argc); guac_instruction_free(audio); /* Get supported video formats */ video = guac_instruction_expect( socket, GUACD_USEC_TIMEOUT, "video"); if (video == NULL) { /* Log error */ guacd_log_handshake_failure(); guacd_log_guac_error(GUAC_LOG_DEBUG, "Error reading \"video\""); /* Free resources */ guac_client_free(client); guac_socket_free(socket); return; } /* Store video mimetypes */ client->info.video_mimetypes = guacd_copy_mimetypes(video->argv, video->argc); guac_instruction_free(video); /* Get supported image formats */ image = guac_instruction_expect( socket, GUACD_USEC_TIMEOUT, "image"); if (image == NULL) { /* Log error */ guacd_log_handshake_failure(); guacd_log_guac_error(GUAC_LOG_DEBUG, "Error reading \"image\""); /* Free resources */ guac_client_free(client); guac_socket_free(socket); return; } /* Store image mimetypes */ client->info.image_mimetypes = guacd_copy_mimetypes(image->argv, image->argc); guac_instruction_free(image); /* Get args from connect instruction */ connect = guac_instruction_expect( socket, GUACD_USEC_TIMEOUT, "connect"); if (connect == NULL) { /* Log error */ guacd_log_handshake_failure(); guacd_log_guac_error(GUAC_LOG_DEBUG, "Error reading \"connect\""); if (guac_client_plugin_close(plugin)) guacd_log_guac_error(GUAC_LOG_WARNING, "Unable to close client plugin"); guac_client_free(client); guac_socket_free(socket); return; } client->socket = socket; client->log_handler = guacd_client_log; /* Store client */ if (guacd_client_map_add(map, client)) guacd_log(GUAC_LOG_ERROR, "Unable to add client. Internal client storage has failed"); /* Send connection ID */ guacd_log(GUAC_LOG_INFO, "Connection ID is \"%s\"", client->connection_id); guac_protocol_send_ready(socket, client->connection_id); /* Init client */ init_result = guac_client_plugin_init_client(plugin, client, connect->argc, connect->argv); guac_instruction_free(connect); /* If client could not be started, free everything and fail */ if (init_result) { guac_client_free(client); guacd_log_guac_error(GUAC_LOG_INFO, "Connection did not succeed"); if (guac_client_plugin_close(plugin)) guacd_log_guac_error(GUAC_LOG_WARNING, "Unable to close client plugin"); guac_socket_free(socket); return; } /* Start client threads */ guacd_log(GUAC_LOG_INFO, "Starting client"); if (guacd_client_start(client)) guacd_log(GUAC_LOG_WARNING, "Client finished abnormally"); else guacd_log(GUAC_LOG_INFO, "Client disconnected"); /* Remove client */ if (guacd_client_map_remove(map, client->connection_id) == NULL) guacd_log(GUAC_LOG_ERROR, "Unable to remove client. Internal client storage has failed"); /* Free mimetype lists */ guacd_free_mimetypes(client->info.audio_mimetypes); guacd_free_mimetypes(client->info.video_mimetypes); guacd_free_mimetypes(client->info.image_mimetypes); /* Clean up */ guac_client_free(client); if (guac_client_plugin_close(plugin)) guacd_log_guac_error(GUAC_LOG_WARNING, "Unable to close client plugin"); /* Close socket */ guac_socket_free(socket); } int redirect_fd(int fd, int flags) { /* Attempt to open bit bucket */ int new_fd = open(GUACD_DEV_NULL, flags); if (new_fd < 0) return 1; /* If descriptor is different, redirect old to new and close new */ if (new_fd != fd) { dup2(new_fd, fd); close(new_fd); } return 0; } int daemonize() { pid_t pid; /* Fork once to ensure we aren't the process group leader */ pid = fork(); if (pid < 0) { guacd_log(GUAC_LOG_ERROR, "Could not fork() parent: %s", strerror(errno)); return 1; } /* Exit if we are the parent */ if (pid > 0) { guacd_log(GUAC_LOG_DEBUG, "Exiting and passing control to PID %i", pid); _exit(0); } /* Start a new session (if not already group leader) */ setsid(); /* Fork again so the session group leader exits */ pid = fork(); if (pid < 0) { guacd_log(GUAC_LOG_ERROR, "Could not fork() group leader: %s", strerror(errno)); return 1; } /* Exit if we are the parent */ if (pid > 0) { guacd_log(GUAC_LOG_DEBUG, "Exiting and passing control to PID %i", pid); _exit(0); } /* Change to root directory */ if (chdir(GUACD_ROOT) < 0) { guacd_log(GUAC_LOG_ERROR, "Unable to change working directory to " GUACD_ROOT); return 1; } /* Reopen the 3 stdxxx to /dev/null */ if (redirect_fd(STDIN_FILENO, O_RDONLY) || redirect_fd(STDOUT_FILENO, O_WRONLY) || redirect_fd(STDERR_FILENO, O_WRONLY)) { guacd_log(GUAC_LOG_ERROR, "Unable to redirect standard file descriptors to " GUACD_DEV_NULL); return 1; } /* Success */ return 0; } int main(int argc, char* argv[]) { /* Server */ int socket_fd; struct addrinfo* addresses; struct addrinfo* current_address; char bound_address[1024]; char bound_port[64]; int opt_on = 1; struct addrinfo hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM, .ai_protocol = IPPROTO_TCP }; /* Client */ struct sockaddr_in client_addr; socklen_t client_addr_len; int connected_socket_fd; #ifdef ENABLE_SSL SSL_CTX* ssl_context = NULL; #endif guacd_client_map* map = guacd_client_map_alloc(); /* General */ int retval; /* Load configuration */ guacd_config* config = guacd_conf_load(); if (config == NULL || guacd_conf_parse_args(config, argc, argv)) exit(EXIT_FAILURE); /* Init logging as early as possible */ guacd_log_level = config->max_log_level; openlog(GUACD_LOG_NAME, LOG_PID, LOG_DAEMON); /* Log start */ guacd_log(GUAC_LOG_INFO, "Guacamole proxy daemon (guacd) version " VERSION " started"); /* Get addresses for binding */ if ((retval = getaddrinfo(config->bind_host, config->bind_port, &hints, &addresses))) { guacd_log(GUAC_LOG_ERROR, "Error parsing given address or port: %s", gai_strerror(retval)); exit(EXIT_FAILURE); } /* Get socket */ socket_fd = socket(AF_INET, SOCK_STREAM, 0); if (socket_fd < 0) { guacd_log(GUAC_LOG_ERROR, "Error opening socket: %s", strerror(errno)); exit(EXIT_FAILURE); } /* Allow socket reuse */ if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, (void*) &opt_on, sizeof(opt_on))) { guacd_log(GUAC_LOG_WARNING, "Unable to set socket options for reuse: %s", strerror(errno)); } /* Attempt binding of each address until success */ current_address = addresses; while (current_address != NULL) { int retval; /* Resolve hostname */ if ((retval = getnameinfo(current_address->ai_addr, current_address->ai_addrlen, bound_address, sizeof(bound_address), bound_port, sizeof(bound_port), NI_NUMERICHOST | NI_NUMERICSERV))) guacd_log(GUAC_LOG_ERROR, "Unable to resolve host: %s", gai_strerror(retval)); /* Attempt to bind socket to address */ if (bind(socket_fd, current_address->ai_addr, current_address->ai_addrlen) == 0) { guacd_log(GUAC_LOG_DEBUG, "Successfully bound socket to " "host %s, port %s", bound_address, bound_port); /* Done if successful bind */ break; } /* Otherwise log information regarding bind failure */ else guacd_log(GUAC_LOG_DEBUG, "Unable to bind socket to " "host %s, port %s: %s", bound_address, bound_port, strerror(errno)); current_address = current_address->ai_next; } /* If unable to bind to anything, fail */ if (current_address == NULL) { guacd_log(GUAC_LOG_ERROR, "Unable to bind socket to any addresses."); exit(EXIT_FAILURE); } #ifdef ENABLE_SSL /* Init SSL if enabled */ if (config->key_file != NULL || config->cert_file != NULL) { /* Init SSL */ guacd_log(GUAC_LOG_INFO, "Communication will require SSL/TLS."); SSL_library_init(); SSL_load_error_strings(); ssl_context = SSL_CTX_new(SSLv23_server_method()); /* Load key */ if (config->key_file != NULL) { guacd_log(GUAC_LOG_INFO, "Using PEM keyfile %s", config->key_file); if (!SSL_CTX_use_PrivateKey_file(ssl_context, config->key_file, SSL_FILETYPE_PEM)) { guacd_log(GUAC_LOG_ERROR, "Unable to load keyfile."); exit(EXIT_FAILURE); } } else guacd_log(GUAC_LOG_WARNING, "No PEM keyfile given - SSL/TLS may not work."); /* Load cert file if specified */ if (config->cert_file != NULL) { guacd_log(GUAC_LOG_INFO, "Using certificate file %s", config->cert_file); if (!SSL_CTX_use_certificate_chain_file(ssl_context, config->cert_file)) { guacd_log(GUAC_LOG_ERROR, "Unable to load certificate."); exit(EXIT_FAILURE); } } else guacd_log(GUAC_LOG_WARNING, "No certificate file given - SSL/TLS may not work."); } #endif /* Daemonize if requested */ if (!config->foreground) { /* Attempt to daemonize process */ if (daemonize()) { guacd_log(GUAC_LOG_ERROR, "Could not become a daemon."); exit(EXIT_FAILURE); } } /* Write PID file if requested */ if (config->pidfile != NULL) { /* Attempt to open pidfile and write PID */ FILE* pidf = fopen(config->pidfile, "w"); if (pidf) { fprintf(pidf, "%d\n", getpid()); fclose(pidf); } /* Fail if could not write PID file*/ else { guacd_log(GUAC_LOG_ERROR, "Could not write PID file: %s", strerror(errno)); exit(EXIT_FAILURE); } } /* Ignore SIGPIPE */ if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { guacd_log(GUAC_LOG_INFO, "Could not set handler for SIGPIPE to ignore. " "SIGPIPE may cause termination of the daemon."); } /* Ignore SIGCHLD (force automatic removal of children) */ if (signal(SIGCHLD, SIG_IGN) == SIG_ERR) { guacd_log(GUAC_LOG_INFO, "Could not set handler for SIGCHLD to ignore. " "Child processes may pile up in the process table."); } /* Log listening status */ guacd_log(GUAC_LOG_INFO, "Listening on host %s, port %s", bound_address, bound_port); /* Free addresses */ freeaddrinfo(addresses); /* Listen for connections */ if (listen(socket_fd, 5) < 0) { guacd_log(GUAC_LOG_ERROR, "Could not listen on socket: %s", strerror(errno)); return 3; } /* Daemon loop */ for (;;) { pid_t child_pid; /* Accept connection */ client_addr_len = sizeof(client_addr); connected_socket_fd = accept(socket_fd, (struct sockaddr*) &client_addr, &client_addr_len); if (connected_socket_fd < 0) { guacd_log(GUAC_LOG_ERROR, "Could not accept client connection: %s", strerror(errno)); return 3; } /* * Once connection is accepted, send child into background. * * Note that we prefer fork() over threads for connection-handling * processes as they give each connection its own memory area, and * isolate the main daemon and other connections from errors in any * particular client plugin. */ child_pid = fork(); /* If error, log */ if (child_pid == -1) guacd_log(GUAC_LOG_ERROR, "Error forking child process: %s", strerror(errno)); /* If child, start client, and exit when finished */ else if (child_pid == 0) { guac_socket* socket; #ifdef ENABLE_SSL /* If SSL chosen, use it */ if (ssl_context != NULL) { socket = guac_socket_open_secure(ssl_context, connected_socket_fd); if (socket == NULL) { guacd_log_guac_error(GUAC_LOG_ERROR, "Unable to set up SSL/TLS"); return 0; } } else socket = guac_socket_open(connected_socket_fd); #else /* Open guac_socket */ socket = guac_socket_open(connected_socket_fd); #endif guacd_handle_connection(map, socket); close(connected_socket_fd); return 0; } /* If parent, close reference to child's descriptor */ else if (close(connected_socket_fd) < 0) { guacd_log(GUAC_LOG_ERROR, "Error closing daemon reference to " "child descriptor: %s", strerror(errno)); } } /* Close socket */ if (close(socket_fd) < 0) { guacd_log(GUAC_LOG_ERROR, "Could not close socket: %s", strerror(errno)); return 3; } return 0; } guacamole-server-0.9.9/src/guacd/conf-args.h0000664000175100017510000000266012536405624015634 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUACD_CONF_ARGS_H #define _GUACD_CONF_ARGS_H #include "config.h" #include "conf-file.h" /** * Parses the given arguments into the given configuration. Zero is returned on * success, and non-zero is returned if arguments cannot be parsed. */ int guacd_conf_parse_args(guacd_config* config, int argc, char** argv); #endif guacamole-server-0.9.9/src/guacd/conf-parse.h0000664000175100017510000000520512612226234016001 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUACD_CONF_PARSE_H #define _GUACD_CONF_PARSE_H /** * The maximum length of a name, in characters. */ #define GUACD_CONF_MAX_NAME_LENGTH 255 /** * The maximum length of a value, in characters. */ #define GUACD_CONF_MAX_VALUE_LENGTH 8191 /** * A callback function which is provided to guacd_parse_conf() and is called * for each parameter/value pair set. The current section is always given. This * function will not be called for parameters outside of sections, which are * illegal. */ typedef int guacd_param_callback(const char* section, const char* param, const char* value, void* data); /** * Parses an arbitrary buffer of configuration file data, calling the given * callback for each valid parameter/value pair. Upon success, the number of * characters parsed is returned. On failure, a negative value is returned, and * guacd_conf_parse_error and guacd_conf_parse_error_location are set. The * provided data will be passed to the callback for each invocation. */ int guacd_parse_conf(guacd_param_callback* callback, char* buffer, int length, void* data); /** * Parses the given level name, returning the corresponding log level, or -1 if * no such log level exists. */ int guacd_parse_log_level(const char* name); /** * Human-readable description of the current error, if any. */ extern char* guacd_conf_parse_error; /** * The location of the most recent parse error. This will be a pointer to the * location of the error within the buffer passed to guacd_parse_conf(). */ extern char* guacd_conf_parse_error_location; #endif guacamole-server-0.9.9/src/guacd/conf-args.c0000664000175100017510000000677012612226234015626 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 "config.h" #include "conf-args.h" #include "conf-file.h" #include "conf-parse.h" #include #include #include #include int guacd_conf_parse_args(guacd_config* config, int argc, char** argv) { /* Parse arguments */ int opt; while ((opt = getopt(argc, argv, "l:b:p:L:C:K:f")) != -1) { /* -l: Bind port */ if (opt == 'l') { free(config->bind_port); config->bind_port = strdup(optarg); } /* -b: Bind host */ else if (opt == 'b') { free(config->bind_host); config->bind_host = strdup(optarg); } /* -f: Run in foreground */ else if (opt == 'f') { config->foreground = 1; } /* -p: PID file */ else if (opt == 'p') { free(config->pidfile); config->pidfile = strdup(optarg); } /* -L: Log level */ else if (opt == 'L') { /* Validate and parse log level */ int level = guacd_parse_log_level(optarg); if (level == -1) { fprintf(stderr, "Invalid log level. Valid levels are: \"debug\", \"info\", \"warning\", and \"error\".\n"); return 1; } config->max_log_level = level; } #ifdef ENABLE_SSL /* -C SSL certificate */ else if (opt == 'C') { free(config->cert_file); config->cert_file = strdup(optarg); } /* -K SSL key */ else if (opt == 'K') { free(config->key_file); config->key_file = strdup(optarg); } #else else if (opt == 'C' || opt == 'K') { fprintf(stderr, "This guacd does not have SSL/TLS support compiled in.\n\n" "If you wish to enable support for the -%c option, please install libssl and\n" "recompile guacd.\n", opt); return 1; } #endif else { fprintf(stderr, "USAGE: %s" " [-l LISTENPORT]" " [-b LISTENADDRESS]" " [-p PIDFILE]" " [-L LEVEL]" #ifdef ENABLE_SSL " [-C CERTIFICATE_FILE]" " [-K PEM_FILE]" #endif " [-f]\n", argv[0]); return 1; } } /* Success */ return 0; } guacamole-server-0.9.9/src/guacd/Makefile.in0000664000175100017510000012562312645400275015654 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Copyright (C) 2015 Glyptodon LLC # # 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. # VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ sbin_PROGRAMS = guacd$(EXEEXT) # SSL support @ENABLE_SSL_TRUE@am__append_1 = socket-ssl.h @ENABLE_SSL_TRUE@am__append_2 = socket-ssl.c subdir = src/guacd DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(am__noinst_HEADERS_DIST) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(initdir)" \ "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)" PROGRAMS = $(sbin_PROGRAMS) am__guacd_SOURCES_DIST = daemon.c client.c client-map.c conf-args.c \ conf-file.c conf-parse.c log.c socket-ssl.c @ENABLE_SSL_TRUE@am__objects_1 = guacd-socket-ssl.$(OBJEXT) am_guacd_OBJECTS = guacd-daemon.$(OBJEXT) guacd-client.$(OBJEXT) \ guacd-client-map.$(OBJEXT) guacd-conf-args.$(OBJEXT) \ guacd-conf-file.$(OBJEXT) guacd-conf-parse.$(OBJEXT) \ guacd-log.$(OBJEXT) $(am__objects_1) guacd_OBJECTS = $(am_guacd_OBJECTS) guacd_DEPENDENCIES = AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = guacd_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(guacd_CFLAGS) $(CFLAGS) \ $(guacd_LDFLAGS) $(LDFLAGS) -o $@ am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } SCRIPTS = $(init_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(guacd_SOURCES) DIST_SOURCES = $(am__guacd_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac man5dir = $(mandir)/man5 man8dir = $(mandir)/man8 NROFF = nroff MANS = $(man_MANS) am__noinst_HEADERS_DIST = client.h client-map.h conf-args.h \ conf-file.h conf-parse.h log.h socket-ssl.h HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COMMON_INCLUDE = @COMMON_INCLUDE@ COMMON_LTLIB = @COMMON_LTLIB@ COMMON_SSH_INCLUDE = @COMMON_SSH_INCLUDE@ COMMON_SSH_LTLIB = @COMMON_SSH_LTLIB@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CUNIT_LIBS = @CUNIT_LIBS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBADD_DLOPEN = @LIBADD_DLOPEN@ LIBGUAC_INCLUDE = @LIBGUAC_INCLUDE@ LIBGUAC_LTLIB = @LIBGUAC_LTLIB@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MATH_LIBS = @MATH_LIBS@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@ PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@ PANGO_CFLAGS = @PANGO_CFLAGS@ PANGO_LIBS = @PANGO_LIBS@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_LIBS = @PNG_LIBS@ PTHREAD_LIBS = @PTHREAD_LIBS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ RDP_LIBS = @RDP_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSH_LIBS = @SSH_LIBS@ SSL_LIBS = @SSL_LIBS@ STRIP = @STRIP@ TELNET_LIBS = @TELNET_LIBS@ TERMINAL_INCLUDE = @TERMINAL_INCLUDE@ TERMINAL_LTLIB = @TERMINAL_LTLIB@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VNC_LIBS = @VNC_LIBS@ VORBIS_LIBS = @VORBIS_LIBS@ WEBP_LIBS = @WEBP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ init_dir = @init_dir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign man_MANS = \ man/guacd.8 \ man/guacd.conf.5 noinst_HEADERS = client.h client-map.h conf-args.h conf-file.h \ conf-parse.h log.h $(am__append_1) guacd_SOURCES = daemon.c client.c client-map.c conf-args.c conf-file.c \ conf-parse.c log.c $(am__append_2) guacd_CFLAGS = \ -Werror -Wall -pedantic \ @COMMON_INCLUDE@ \ @LIBGUAC_INCLUDE@ guacd_LDADD = \ @COMMON_LTLIB@ \ @LIBGUAC_LTLIB@ guacd_LDFLAGS = \ @PTHREAD_LIBS@ \ @SSL_LIBS@ EXTRA_DIST = \ init.d/guacd.in \ man/guacd.8 \ man/guacd.conf.5 CLEANFILES = $(init_SCRIPTS) # Init script @ENABLE_INIT_TRUE@initdir = @init_dir@ @ENABLE_INIT_TRUE@init_SCRIPTS = init.d/guacd all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/guacd/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/guacd/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-sbinPROGRAMS: $(sbin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ } \ ; done uninstall-sbinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(sbindir)" && rm -f $$files clean-sbinPROGRAMS: @list='$(sbin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list guacd$(EXEEXT): $(guacd_OBJECTS) $(guacd_DEPENDENCIES) $(EXTRA_guacd_DEPENDENCIES) @rm -f guacd$(EXEEXT) $(AM_V_CCLD)$(guacd_LINK) $(guacd_OBJECTS) $(guacd_LDADD) $(LIBS) install-initSCRIPTS: $(init_SCRIPTS) @$(NORMAL_INSTALL) @list='$(init_SCRIPTS)'; test -n "$(initdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(initdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(initdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(initdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(initdir)$$dir" || exit $$?; \ } \ ; done uninstall-initSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(init_SCRIPTS)'; test -n "$(initdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(initdir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guacd-client-map.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guacd-client.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guacd-conf-args.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guacd-conf-file.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guacd-conf-parse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guacd-daemon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guacd-log.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guacd-socket-ssl.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< guacd-daemon.o: daemon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -MT guacd-daemon.o -MD -MP -MF $(DEPDIR)/guacd-daemon.Tpo -c -o guacd-daemon.o `test -f 'daemon.c' || echo '$(srcdir)/'`daemon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacd-daemon.Tpo $(DEPDIR)/guacd-daemon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon.c' object='guacd-daemon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -c -o guacd-daemon.o `test -f 'daemon.c' || echo '$(srcdir)/'`daemon.c guacd-daemon.obj: daemon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -MT guacd-daemon.obj -MD -MP -MF $(DEPDIR)/guacd-daemon.Tpo -c -o guacd-daemon.obj `if test -f 'daemon.c'; then $(CYGPATH_W) 'daemon.c'; else $(CYGPATH_W) '$(srcdir)/daemon.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacd-daemon.Tpo $(DEPDIR)/guacd-daemon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon.c' object='guacd-daemon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -c -o guacd-daemon.obj `if test -f 'daemon.c'; then $(CYGPATH_W) 'daemon.c'; else $(CYGPATH_W) '$(srcdir)/daemon.c'; fi` guacd-client.o: client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -MT guacd-client.o -MD -MP -MF $(DEPDIR)/guacd-client.Tpo -c -o guacd-client.o `test -f 'client.c' || echo '$(srcdir)/'`client.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacd-client.Tpo $(DEPDIR)/guacd-client.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client.c' object='guacd-client.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -c -o guacd-client.o `test -f 'client.c' || echo '$(srcdir)/'`client.c guacd-client.obj: client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -MT guacd-client.obj -MD -MP -MF $(DEPDIR)/guacd-client.Tpo -c -o guacd-client.obj `if test -f 'client.c'; then $(CYGPATH_W) 'client.c'; else $(CYGPATH_W) '$(srcdir)/client.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacd-client.Tpo $(DEPDIR)/guacd-client.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client.c' object='guacd-client.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -c -o guacd-client.obj `if test -f 'client.c'; then $(CYGPATH_W) 'client.c'; else $(CYGPATH_W) '$(srcdir)/client.c'; fi` guacd-client-map.o: client-map.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -MT guacd-client-map.o -MD -MP -MF $(DEPDIR)/guacd-client-map.Tpo -c -o guacd-client-map.o `test -f 'client-map.c' || echo '$(srcdir)/'`client-map.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacd-client-map.Tpo $(DEPDIR)/guacd-client-map.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client-map.c' object='guacd-client-map.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -c -o guacd-client-map.o `test -f 'client-map.c' || echo '$(srcdir)/'`client-map.c guacd-client-map.obj: client-map.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -MT guacd-client-map.obj -MD -MP -MF $(DEPDIR)/guacd-client-map.Tpo -c -o guacd-client-map.obj `if test -f 'client-map.c'; then $(CYGPATH_W) 'client-map.c'; else $(CYGPATH_W) '$(srcdir)/client-map.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacd-client-map.Tpo $(DEPDIR)/guacd-client-map.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client-map.c' object='guacd-client-map.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -c -o guacd-client-map.obj `if test -f 'client-map.c'; then $(CYGPATH_W) 'client-map.c'; else $(CYGPATH_W) '$(srcdir)/client-map.c'; fi` guacd-conf-args.o: conf-args.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -MT guacd-conf-args.o -MD -MP -MF $(DEPDIR)/guacd-conf-args.Tpo -c -o guacd-conf-args.o `test -f 'conf-args.c' || echo '$(srcdir)/'`conf-args.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacd-conf-args.Tpo $(DEPDIR)/guacd-conf-args.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='conf-args.c' object='guacd-conf-args.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -c -o guacd-conf-args.o `test -f 'conf-args.c' || echo '$(srcdir)/'`conf-args.c guacd-conf-args.obj: conf-args.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -MT guacd-conf-args.obj -MD -MP -MF $(DEPDIR)/guacd-conf-args.Tpo -c -o guacd-conf-args.obj `if test -f 'conf-args.c'; then $(CYGPATH_W) 'conf-args.c'; else $(CYGPATH_W) '$(srcdir)/conf-args.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacd-conf-args.Tpo $(DEPDIR)/guacd-conf-args.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='conf-args.c' object='guacd-conf-args.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -c -o guacd-conf-args.obj `if test -f 'conf-args.c'; then $(CYGPATH_W) 'conf-args.c'; else $(CYGPATH_W) '$(srcdir)/conf-args.c'; fi` guacd-conf-file.o: conf-file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -MT guacd-conf-file.o -MD -MP -MF $(DEPDIR)/guacd-conf-file.Tpo -c -o guacd-conf-file.o `test -f 'conf-file.c' || echo '$(srcdir)/'`conf-file.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacd-conf-file.Tpo $(DEPDIR)/guacd-conf-file.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='conf-file.c' object='guacd-conf-file.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -c -o guacd-conf-file.o `test -f 'conf-file.c' || echo '$(srcdir)/'`conf-file.c guacd-conf-file.obj: conf-file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -MT guacd-conf-file.obj -MD -MP -MF $(DEPDIR)/guacd-conf-file.Tpo -c -o guacd-conf-file.obj `if test -f 'conf-file.c'; then $(CYGPATH_W) 'conf-file.c'; else $(CYGPATH_W) '$(srcdir)/conf-file.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacd-conf-file.Tpo $(DEPDIR)/guacd-conf-file.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='conf-file.c' object='guacd-conf-file.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -c -o guacd-conf-file.obj `if test -f 'conf-file.c'; then $(CYGPATH_W) 'conf-file.c'; else $(CYGPATH_W) '$(srcdir)/conf-file.c'; fi` guacd-conf-parse.o: conf-parse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -MT guacd-conf-parse.o -MD -MP -MF $(DEPDIR)/guacd-conf-parse.Tpo -c -o guacd-conf-parse.o `test -f 'conf-parse.c' || echo '$(srcdir)/'`conf-parse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacd-conf-parse.Tpo $(DEPDIR)/guacd-conf-parse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='conf-parse.c' object='guacd-conf-parse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -c -o guacd-conf-parse.o `test -f 'conf-parse.c' || echo '$(srcdir)/'`conf-parse.c guacd-conf-parse.obj: conf-parse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -MT guacd-conf-parse.obj -MD -MP -MF $(DEPDIR)/guacd-conf-parse.Tpo -c -o guacd-conf-parse.obj `if test -f 'conf-parse.c'; then $(CYGPATH_W) 'conf-parse.c'; else $(CYGPATH_W) '$(srcdir)/conf-parse.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacd-conf-parse.Tpo $(DEPDIR)/guacd-conf-parse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='conf-parse.c' object='guacd-conf-parse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -c -o guacd-conf-parse.obj `if test -f 'conf-parse.c'; then $(CYGPATH_W) 'conf-parse.c'; else $(CYGPATH_W) '$(srcdir)/conf-parse.c'; fi` guacd-log.o: log.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -MT guacd-log.o -MD -MP -MF $(DEPDIR)/guacd-log.Tpo -c -o guacd-log.o `test -f 'log.c' || echo '$(srcdir)/'`log.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacd-log.Tpo $(DEPDIR)/guacd-log.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log.c' object='guacd-log.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -c -o guacd-log.o `test -f 'log.c' || echo '$(srcdir)/'`log.c guacd-log.obj: log.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -MT guacd-log.obj -MD -MP -MF $(DEPDIR)/guacd-log.Tpo -c -o guacd-log.obj `if test -f 'log.c'; then $(CYGPATH_W) 'log.c'; else $(CYGPATH_W) '$(srcdir)/log.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacd-log.Tpo $(DEPDIR)/guacd-log.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log.c' object='guacd-log.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -c -o guacd-log.obj `if test -f 'log.c'; then $(CYGPATH_W) 'log.c'; else $(CYGPATH_W) '$(srcdir)/log.c'; fi` guacd-socket-ssl.o: socket-ssl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -MT guacd-socket-ssl.o -MD -MP -MF $(DEPDIR)/guacd-socket-ssl.Tpo -c -o guacd-socket-ssl.o `test -f 'socket-ssl.c' || echo '$(srcdir)/'`socket-ssl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacd-socket-ssl.Tpo $(DEPDIR)/guacd-socket-ssl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='socket-ssl.c' object='guacd-socket-ssl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -c -o guacd-socket-ssl.o `test -f 'socket-ssl.c' || echo '$(srcdir)/'`socket-ssl.c guacd-socket-ssl.obj: socket-ssl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -MT guacd-socket-ssl.obj -MD -MP -MF $(DEPDIR)/guacd-socket-ssl.Tpo -c -o guacd-socket-ssl.obj `if test -f 'socket-ssl.c'; then $(CYGPATH_W) 'socket-ssl.c'; else $(CYGPATH_W) '$(srcdir)/socket-ssl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/guacd-socket-ssl.Tpo $(DEPDIR)/guacd-socket-ssl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='socket-ssl.c' object='guacd-socket-ssl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(guacd_CFLAGS) $(CFLAGS) -c -o guacd-socket-ssl.obj `if test -f 'socket-ssl.c'; then $(CYGPATH_W) 'socket-ssl.c'; else $(CYGPATH_W) '$(srcdir)/socket-ssl.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man5: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man5dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man5dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.5[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \ done; } uninstall-man5: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man5dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.5[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man5dir)'; $(am__uninstall_files_from_dir) install-man8: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man8dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man8dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.8[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man8dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \ done; } uninstall-man8: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man8dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.8[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(MANS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(initdir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-sbinPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-initSCRIPTS install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-sbinPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man5 install-man8 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-initSCRIPTS uninstall-man \ uninstall-sbinPROGRAMS uninstall-man: uninstall-man5 uninstall-man8 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-sbinPROGRAMS cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-initSCRIPTS install-man install-man5 \ install-man8 install-pdf install-pdf-am install-ps \ install-ps-am install-sbinPROGRAMS install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-initSCRIPTS \ uninstall-man uninstall-man5 uninstall-man8 \ uninstall-sbinPROGRAMS @ENABLE_INIT_TRUE@init.d/guacd: init.d/guacd.in @ENABLE_INIT_TRUE@ sed -e 's,[@]sbindir[@],$(sbindir),g' < init.d/guacd.in > init.d/guacd @ENABLE_INIT_TRUE@ chmod +x init.d/guacd # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: guacamole-server-0.9.9/src/guacd/socket-ssl.c0000664000175100017510000001057112643542623016037 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "socket-ssl.h" #include #include #include #include #include static ssize_t __guac_socket_ssl_read_handler(guac_socket* socket, void* buf, size_t count) { /* Read from socket */ guac_socket_ssl_data* data = (guac_socket_ssl_data*) socket->data; int retval; retval = SSL_read(data->ssl, buf, count); /* Record errors in guac_error */ if (retval <= 0) { guac_error = GUAC_STATUS_SEE_ERRNO; guac_error_message = "Error reading data from secure socket"; } return retval; } static ssize_t __guac_socket_ssl_write_handler(guac_socket* socket, const void* buf, size_t count) { /* Write data to socket */ guac_socket_ssl_data* data = (guac_socket_ssl_data*) socket->data; int retval; retval = SSL_write(data->ssl, buf, count); /* Record errors in guac_error */ if (retval <= 0) { guac_error = GUAC_STATUS_SEE_ERRNO; guac_error_message = "Error writing data to secure socket"; } return retval; } static int __guac_socket_ssl_select_handler(guac_socket* socket, int usec_timeout) { guac_socket_ssl_data* data = (guac_socket_ssl_data*) socket->data; fd_set fds; struct timeval timeout; int retval; /* No timeout if usec_timeout is negative */ if (usec_timeout < 0) retval = select(data->fd + 1, &fds, NULL, NULL, NULL); /* Handle timeout if specified */ else { timeout.tv_sec = usec_timeout/1000000; timeout.tv_usec = usec_timeout%1000000; FD_ZERO(&fds); FD_SET(data->fd, &fds); retval = select(data->fd + 1, &fds, NULL, NULL, &timeout); } /* Properly set guac_error */ if (retval < 0) { guac_error = GUAC_STATUS_SEE_ERRNO; guac_error_message = "Error while waiting for data on secure socket"; } if (retval == 0) { guac_error = GUAC_STATUS_TIMEOUT; guac_error_message = "Timeout while waiting for data on secure socket"; } return retval; } static int __guac_socket_ssl_free_handler(guac_socket* socket) { /* Shutdown SSL */ guac_socket_ssl_data* data = (guac_socket_ssl_data*) socket->data; SSL_shutdown(data->ssl); free(data); return 0; } guac_socket* guac_socket_open_secure(SSL_CTX* context, int fd) { /* Allocate socket and associated data */ guac_socket* socket = guac_socket_alloc(); guac_socket_ssl_data* data = malloc(sizeof(guac_socket_ssl_data)); /* Init SSL */ data->context = context; data->ssl = SSL_new(context); SSL_set_fd(data->ssl, fd); /* Accept SSL connection, handle errors */ if (SSL_accept(data->ssl) <= 0) { guac_error = GUAC_STATUS_INTERNAL_ERROR; guac_error_message = "SSL accept failed"; free(data); guac_socket_free(socket); return NULL; } /* Store file descriptor as socket data */ data->fd = fd; socket->data = data; /* Set read/write handlers */ socket->read_handler = __guac_socket_ssl_read_handler; socket->write_handler = __guac_socket_ssl_write_handler; socket->select_handler = __guac_socket_ssl_select_handler; socket->free_handler = __guac_socket_ssl_free_handler; return socket; } guacamole-server-0.9.9/src/guacd/man/0000775000175100017510000000000012645400336014427 500000000000000guacamole-server-0.9.9/src/guacd/man/guacd.conf.50000664000175100017510000001063712637656315016466 00000000000000.TH guacd.conf 5 "15 Dec 2015" "version 0.9.9" "Guacamole" . .SH NAME /etc/guacamole/guacd.conf \- Configuration file for guacd . .SH DESCRIPTION .B /etc/guacamole/guacd.conf is the configuration file for the Guacamole proxy daemon used by the Guacamole web application and framework, .B guacd. Use of this file is entirely optional, and all of its options can be specified from the command line when running .B guacd. If you provide both the .B guacd.conf file and command line options, the command line options will take precedence. . .SH SYNTAX .B guacd.conf is made up of sections, where each section contains a set of parameter/value pairs. The parameters available are dictated by the section in use, and parameters may only be specified within a section. .P The beginning of each section is denoted with a section name in brackets, and each section ends implicitly with the beginning of a new section, or at the end of the file. .TP \fB[server]\fR Contains parameters which control how .B guacd behaves as a server, from a network perspective. .TP \fB[daemon]\fR Parameters which configure how .B guacd behaves as a daemon, such as what file should contain the PID, if any. .TP \fB[ssl]\fR Parameters which control the SSL support of .B guacd, such as the certificate and private key used for encryption of the Guacamole protocol. This section and its parameters are only valid if .B guacd was built with SSL support. .P Parameters within sections are written as a parameter name, followed by an equals sign, followed by the parameter value, all on one line. Comments may be placed anywhere, and consist of arbitrary text following a .B # symbol until end-of-line: .TP \fIname\fR \fB=\fR \fIvalue\fR \fB#\fR \fISome arbitrary comment text\fR .P Beware that it is the combination of the section name with the parameter name that makes up the fully qualified name of a parameter. Each parameter absolutely .I must be placed only within its proper section, or .B guacd.conf will fail to be parsed, and .B guacd will not start. .P If special characters need to be placed within a parameter value, such as whitespace, \fB#\fR, \fB"\fR, or \fB\\\fR, the entire value must be enclosed in double quotes, and each occurrence of \fB"\fR or \fB\\\fR within the value must be escaped with backslashes: .TP \fIname\fR \fB=\fR \fB"\fR\fIquoted # value \\\\ with \\" special characters\fR\fB"\fR . .SH SERVER PARAMETERS .TP \fBbind_host\fR \fB=\fR \fIHOSTNAME\fR Requires .B guacd to bind to a specific host when listening for connections. By default, .B guacd will bind to localhost only. .TP \fBbind_port\fR \fB=\fR \fIPORT\fR Requires .B guacd to bind to a specific port when listening for connections. By default, .B guacd will bind to port 4822. . .SH DAEMON PARAMETERS .TP \fBlog_level\fR \fB=\fR \fILEVEL\fR Sets the maximum level at which .B guacd will log messages to syslog and, if running in the foreground, the console. Legal values are .B debug, .B info, .B warning, and .B error. The default value is .B info. .TP \fBpid_file\fR \fB=\fR \fIFILE\fR Causes .B guacd to write its PID to the specified file upon startup. Note that .B guacd must have sufficient privileges to create or write this file, or it will fail to start. This parameter is typically needed for startup scripts, such that the script can report on the status of .B guacd and kill it if necessary. . .SH SSL PARAMETERS If .B guacd was built with SSL support, then connections between the web application and .B guacd can be encrypted if an SSL certificate and key file are given. .P When using a chain of certificates, you must append the additional certificates to your server certificate. This can be done easily with the standard .B cat command. Beware that the certificate for .B guacd .I must be the first certificate in the file. .TP \fBserver_certificate\fR \fB=\fR \fICERTIFICATE FILE\fR Enables SSL/TLS using the given cerficiate file. Future connections to .B guacd will require SSL/TLS enabled in the client (the web application). .TP \fBserver_key\fR \fB=\fR \fIKEY FILE\fR Enables SSL/TLS using the given private key file. Future connections to .B guacd will require SSL/TLS enabled in the client (the web application). . .SH EXAMPLE .nf .RS # # guacd.conf example # [daemon] pid_file = /var/run/guacd.pid [server] bind_host = localhost bind_port = 4822 [ssl] server_certificate = /etc/ssl/certs/guacd.crt server_key = /etc/ssl/private/guacd.key .RE .fi . .SH AUTHOR Written by Michael Jumper guacamole-server-0.9.9/src/guacd/man/guacd.80000664000175100017510000000505112637656315015537 00000000000000.TH guacd 8 "15 Dec 2015" "version 0.9.9" "Guacamole" . .SH NAME guacd \- Guacamole proxy daemon . .SH SYNOPSIS .B guacd [\fB-b\fR \fIHOST\fR] [\fB-l\fR \fIPORT\fR] [\fB-p\fR \fIPID FILE\fR] [\fB-L\fR \fILOG LEVEL\fR] [\fB-C\fR \fICERTIFICATE FILE\fR] [\fB-K\fR \fIKEY FILE\fR] [\fB-f\fR] . .SH DESCRIPTION .B guacd is the Guacamole proxy daemon used by the Guacamole web application and framework. As JavaScript cannot handle binary protocols (like VNC and remote desktop) efficiently, a new text-based protocol was developed which would contain a common superset of the operations needed for efficient remote desktop access, but would be easy for JavaScript programs to process. .B guacd is the proxy which translates between arbitrary protocols and the Guacamole protocol. . .SH OPTIONS .TP \fB\-b\fR \fIHOST\fR Changes the host or address that .B guacd listens on. .TP \fB\-l\fR \fIPORT\fR Changes the port that .B guacd listens on (the default is port 4822). .TP \fB\-p\fR \fIFILE\fR Causes .B guacd to write the PID of the daemon process to the specified file. This is useful for init scripts and is used by the provided init script. .TP \fB\-L\fR \fILEVEL\fR Sets the maximum level at which .B guacd will log messages to syslog and, if running in the foreground, the console. Legal values are .B debug, .B info, .B warning, and .B error. The default value is .B info. .TP \fB\-f\fR Causes .B guacd to run in the foreground, rather than automatically forking into the background. . .SH SSL/TLS OPTIONS If libssl was present at the time .B guacd was compiled, it will contain SSL/TLS support, and connections between the web application and .B guacd can be encrypted if a certificate file is given. .P When using a chain of certificates, you must append the additional certificates to your server certificate. This can be done easily with the standard .B cat command. Beware that the certificate for .B guacd .I must be the first certificate in the file. .TP \fB-C\fR \fICERTIFICATE FILE\fR Enables SSL/TLS using the given cerficiate file. Future connections to this instance of .B guacd will require SSL/TLS enabled in the client (the web application). If this option is not given, communication with guacd must be unencrypted. .TP \fB-K\fR \fIKEY FILE\fR Enables SSL/TLS using the given private key file. Future connections to this instance of .B guacd will require SSL/TLS enabled in the client (the web application). If this option is not given, communication with guacd must be unencrypted. . .SH SEE ALSO .BR guacd.conf (5) . .SH AUTHOR Written by Michael Jumper guacamole-server-0.9.9/src/guacd/log.c0000664000175100017510000001046412643542623014532 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "log.h" #include #include #include #include #include #include int guacd_log_level = GUAC_LOG_INFO; void vguacd_log(guac_client_log_level level, const char* format, va_list args) { const char* priority_name; int priority; char message[2048]; /* Don't bother if the log level is too high */ if (level > guacd_log_level) return; /* Copy log message into buffer */ vsnprintf(message, sizeof(message), format, args); /* Convert log level to syslog priority */ switch (level) { /* Error log level */ case GUAC_LOG_ERROR: priority = LOG_ERR; priority_name = "ERROR"; break; /* Warning log level */ case GUAC_LOG_WARNING: priority = LOG_WARNING; priority_name = "WARNING"; break; /* Informational log level */ case GUAC_LOG_INFO: priority = LOG_INFO; priority_name = "INFO"; break; /* Debug log level */ case GUAC_LOG_DEBUG: priority = LOG_DEBUG; priority_name = "DEBUG"; break; /* Any unknown/undefined log level */ default: priority = LOG_INFO; priority_name = "UNKNOWN"; break; } /* Log to syslog */ syslog(priority, "%s", message); /* Log to STDERR */ fprintf(stderr, GUACD_LOG_NAME "[%i]: %s:\t%s\n", getpid(), priority_name, message); } void guacd_log(guac_client_log_level level, const char* format, ...) { va_list args; va_start(args, format); vguacd_log(level, format, args); va_end(args); } void guacd_client_log(guac_client* client, guac_client_log_level level, const char* format, va_list args) { vguacd_log(level, format, args); } void guacd_log_guac_error(guac_client_log_level level, const char* message) { if (guac_error != GUAC_STATUS_SUCCESS) { /* If error message provided, include in log */ if (guac_error_message != NULL) guacd_log(level, "%s: %s", message, guac_error_message); /* Otherwise just log with standard status string */ else guacd_log(level, "%s: %s", message, guac_status_string(guac_error)); } /* Just log message if no status code */ else guacd_log(level, "%s", message); } void guacd_client_log_guac_error(guac_client* client, guac_client_log_level level, const char* message) { if (guac_error != GUAC_STATUS_SUCCESS) { /* If error message provided, include in log */ if (guac_error_message != NULL) guac_client_log(client, level, "%s: %s", message, guac_error_message); /* Otherwise just log with standard status string */ else guac_client_log(client, level, "%s: %s", message, guac_status_string(guac_error)); } /* Just log message if no status code */ else guac_client_log(client, level, "%s", message); } guacamole-server-0.9.9/src/guacd/log.h0000664000175100017510000000511012643542623014527 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUACD_LOG_H #define __GUACD_LOG_H #include "config.h" #include /** * The maximum level at which to log messages. All other messages will be * dropped. */ extern int guacd_log_level; /** * The string to prepend to all log messages. */ #define GUACD_LOG_NAME "guacd" /** * Writes a message to guacd's logs. This function takes a format and va_list, * similar to vprintf. */ void vguacd_log(guac_client_log_level level, const char* format, va_list args); /** * Writes a message to guacd's logs. This function accepts parameters * identically to printf. */ void guacd_log(guac_client_log_level level, const char* format, ...); /** * Writes a message using the logging facilities of the given client. This * function accepts parameters identically to printf. */ void guacd_client_log(guac_client* client, guac_client_log_level level, const char* format, va_list args); /** * Prints an error message to guacd's logs, automatically including any * information present in guac_error. This function accepts parameters * identically to printf. */ void guacd_log_guac_error(guac_client_log_level level, const char* message); /** * Prints an error message using the logging facilities of the given client, * automatically including any information present in guac_error. This function * accepts parameters identically to printf. */ void guacd_client_log_guac_error(guac_client* client, guac_client_log_level level, const char* message); #endif guacamole-server-0.9.9/src/guacd/client-map.h0000664000175100017510000000464712643542623016015 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUACD_CLIENT_MAP_H #define _GUACD_CLIENT_MAP_H #include "config.h" #include "client.h" #include "guac_list.h" #include #define GUACD_CLIENT_MAP_BUCKETS GUACD_CLIENT_MAX_CONNECTIONS*2 /** * Set of all active connections to guacd, indexed by connection ID. */ typedef struct guacd_client_map { /** * Internal hash buckets. Each bucket is a linked list containing all * guac_client instances which hash to this bucket location. */ guac_common_list* __buckets[GUACD_CLIENT_MAP_BUCKETS]; } guacd_client_map; /** * Allocates a new client map, which persists for the life of guacd. */ guacd_client_map* guacd_client_map_alloc(); /** * Adds the given client to the given client map. On success, zero is returned. * If adding the client fails (due to lack of space, or duplicate ID), a * non-zero value is returned instead. */ int guacd_client_map_add(guacd_client_map* map, guac_client* client); /** * Retrieves the client having the given ID, or NULL if no such client * is stored. */ guac_client* guacd_client_map_retrieve(guacd_client_map* map, const char* id); /** * Removes the client having the given ID, returning the corresponding client. * If no such client exists, NULL is returned. */ guac_client* guacd_client_map_remove(guacd_client_map* map, const char* id); #endif guacamole-server-0.9.9/src/guacd/conf-file.h0000664000175100017510000000450112612226234015604 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 _GUACD_CONF_FILE_H #define _GUACD_CONF_FILE_H #include "config.h" #include /** * The contents of a guacd configuration file. */ typedef struct guacd_config { /** * The host to bind on. */ char* bind_host; /** * The port to bind on. */ char* bind_port; /** * The file to write the PID in, if any. */ char* pidfile; /** * Whether guacd should run in the foreground. */ int foreground; #ifdef ENABLE_SSL /** * SSL certificate file. */ char* cert_file; /** * SSL private key file. */ char* key_file; #endif /** * The maximum log level to be logged by guacd. */ guac_client_log_level max_log_level; } guacd_config; /** * Reads the given file descriptor, parsing its contents into the guacd_config. * On success, zero is returned. If parsing fails, non-zero is returned, and an * error message is printed to stderr. */ int guacd_conf_parse_file(guacd_config* conf, int fd); /** * Loads the configuration from any of several default locations, if found. If * parsing fails, NULL is returned, and an error message is printed to stderr. */ guacd_config* guacd_conf_load(); #endif guacamole-server-0.9.9/src/guacd/init.d/0000775000175100017510000000000012645400336015041 500000000000000guacamole-server-0.9.9/src/guacd/init.d/guacd.in0000664000175100017510000000632312536405624016404 00000000000000#!/bin/sh # # Copyright (C) 2013 Glyptodon LLC # # 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. # # guacd # # chkconfig: 2345 20 80 # description: Guacamole proxy daemon ### BEGIN INIT INFO # Provides: guacd # Required-Start: $network $syslog # Required-Stop: $network $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Guacamole proxy daemon # Description: The Guacamole proxy daemon, required to translate remote desktop protocols into the text-based Guacamole protocol used by the JavaScript application. ### END INIT INFO prog="guacd" exec="@sbindir@/$prog" pidfile="/var/run/$prog.pid" # Returns PID of currently running process, if any getpid() { if [ -f "$pidfile" ] then read PID < "$pidfile" # If pidfile contains PID and PID is valid if [ -n "$PID" ] && ps "$PID" > /dev/null 2>&1 then echo "$PID" return 0 fi fi # pidfile/pid not found, or process is dead return 1 } start() { [ -x $exec ] || exit 5 echo -n "Starting $prog: " getpid > /dev/null || $exec -p "$pidfile" retval=$? case "$retval" in 0) echo "SUCCESS" ;; *) echo "FAIL" ;; esac return $retval } stop() { echo -n "Stopping $prog: " PID=`getpid` retval=$? case "$retval" in 0) if kill $PID > /dev/null 2>&1 then echo "SUCCESS" return 0 fi echo "FAIL" return 1 ;; *) echo "SUCCESS (not running)" return 0 ;; esac } restart() { stop && start } force_reload() { restart } status() { PID=`getpid` retval=$? case "$retval" in 0) echo "$prog is running with PID=$PID." ;; *) echo "$prog is not running." ;; esac return $retval } case "$1" in start|stop|status|restart|force-reload) $1 ;; try-restart) status && restart ;; *) echo "Usage: $0 {start|stop|status|restart|try-restart|force-reload}" exit 2 esac exit $? guacamole-server-0.9.9/src/guacd/socket-ssl.h0000664000175100017510000000341612643542623016044 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 __GUACD_SOCKET_SSL_H #define __GUACD_SOCKET_SSL_H #include "config.h" #include #include /** * SSL socket-specific data. */ typedef struct guac_socket_ssl_data { /** * The file descriptor that SSL communication will take place * over. */ int fd; /** * The current SSL context. */ SSL_CTX* context; /** * The SSL connection, created automatically via * guac_socket_open_secure(). */ SSL* ssl; } guac_socket_ssl_data; /** * Creates a new guac_socket which will use SSL for all communication. */ guac_socket* guac_socket_open_secure(SSL_CTX* context, int fd); #endif guacamole-server-0.9.9/src/guacd/conf-file.c0000664000175100017510000001316612612226234015606 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 "config.h" #include "conf-file.h" #include "conf-parse.h" #include #include #include #include #include #include #include #include #include /** * Updates the configuration with the given parameter/value pair, flagging * errors as necessary. */ static int guacd_conf_callback(const char* section, const char* param, const char* value, void* data) { guacd_config* config = (guacd_config*) data; /* Network server options */ if (strcmp(section, "server") == 0) { /* Bind host */ if (strcmp(param, "bind_host") == 0) { free(config->bind_host); config->bind_host = strdup(value); return 0; } /* Bind port */ else if (strcmp(param, "bind_port") == 0) { free(config->bind_port); config->bind_port = strdup(value); return 0; } } /* Options related to daemon startup */ else if (strcmp(section, "daemon") == 0) { /* PID file */ if (strcmp(param, "pid_file") == 0) { free(config->pidfile); config->pidfile = strdup(value); return 0; } /* Max log level */ else if (strcmp(param, "log_level") == 0) { int level = guacd_parse_log_level(value); /* Invalid log level */ if (level < 0) { guacd_conf_parse_error = "Invalid log level. Valid levels are: \"debug\", \"info\", \"warning\", and \"error\"."; return 1; } /* Valid log level */ config->max_log_level = level; return 0; } } /* SSL-specific options */ else if (strcmp(section, "ssl") == 0) { #ifdef ENABLE_SSL /* SSL certificate */ if (strcmp(param, "server_certificate") == 0) { free(config->cert_file); config->cert_file = strdup(value); return 0; } /* SSL key */ else if (strcmp(param, "server_key") == 0) { free(config->key_file); config->key_file = strdup(value); return 0; } #else guacd_conf_parse_error = "SSL support not compiled in"; return 1; #endif } /* If still unhandled, the parameter/section is invalid */ guacd_conf_parse_error = "Invalid parameter or section name"; return 1; } int guacd_conf_parse_file(guacd_config* conf, int fd) { int chars_read; char buffer[8192]; int length = 0; int line = 1; char* line_start = buffer; int parsed = 0; /* Attempt to fill remaining space in buffer */ while ((chars_read = read(fd, buffer + length, sizeof(buffer) - length)) > 0) { length += chars_read; line_start = buffer; /* Attempt to parse entire buffer */ while ((parsed = guacd_parse_conf(guacd_conf_callback, line_start, length, conf)) > 0) { line_start += parsed; length -= parsed; line++; } /* Shift contents to front */ memmove(buffer, line_start, length); } /* Handle parse errors */ if (parsed < 0) { int column = guacd_conf_parse_error_location - line_start + 1; fprintf(stderr, "Parse error at line %i, column %i: %s.\n", line, column, guacd_conf_parse_error); return 1; } /* Check for error conditions */ if (chars_read < 0) { fprintf(stderr, "Error reading configuration: %s\n", strerror(errno)); return 1; } /* Read successfully */ return 0; } guacd_config* guacd_conf_load() { guacd_config* conf = malloc(sizeof(guacd_config)); if (conf == NULL) return NULL; /* Load defaults */ conf->bind_host = NULL; conf->bind_port = strdup("4822"); conf->pidfile = NULL; conf->foreground = 0; conf->max_log_level = GUAC_LOG_INFO; #ifdef ENABLE_SSL conf->cert_file = NULL; conf->key_file = NULL; #endif /* Read configuration from file */ int fd = open(GUACD_CONF_FILE, O_RDONLY); if (fd > 0) { int retval = guacd_conf_parse_file(conf, fd); close(fd); if (retval != 0) { fprintf(stderr, "Unable to parse \"" GUACD_CONF_FILE "\".\n"); return NULL; } } /* Notify of errors preventing reading */ else if (errno != ENOENT) { fprintf(stderr, "Unable to open \"" GUACD_CONF_FILE "\": %s\n", strerror(errno)); return NULL; } return conf; } guacamole-server-0.9.9/src/guacd/conf-parse.c0000664000175100017510000003417312612226234016002 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 "config.h" #include "conf-parse.h" #include #include #include /* * Simple recursive descent parser for an INI-like conf file grammar. The * grammar is, roughly: * * ::= * ::= * ::= | | "" * ::= "[" "]" * ::= "=" * * Where: * is any number of tabs or spaces. * is a # character followed by any length of text without an EOL. * is an alpha-numeric string consisting of: [A-Za-z0-9_-]. * is any length of text without an EOL or # character, or a double-quoted string (backslash escapes legal). * is a carriage return or line feed character. */ /** * The current section. Note that this means the parser is NOT threadsafe. */ char __guacd_current_section[GUACD_CONF_MAX_NAME_LENGTH + 1] = ""; char* guacd_conf_parse_error = NULL; char* guacd_conf_parse_error_location = NULL; /** * Reads through all whitespace at the beginning of the buffer, returning the * number of characters read. This is in the grammar above. As * the whitespace is zero or more whitespace characters, this function cannot * fail, but it may read zero chars overall. */ static int guacd_parse_whitespace(char* buffer, int length) { int chars_read = 0; /* Read through all whitespace */ while (chars_read < length) { /* Read character */ char c = *buffer; /* Stop at non-whitespace */ if (c != ' ' && c != '\t') break; chars_read++; buffer++; } return chars_read; } /** * Parses the name of a parameter, section, etc. A section/parameter name can * consist only of alphanumeric characters and underscores. The resulting name * will be stored in the name string, which must have at least 256 bytes * available. */ static int guacd_parse_name(char* buffer, int length, char* name) { char* name_start = buffer; int chars_read = 0; /* Read through all valid name chars */ while (chars_read < length) { /* Read character */ char c = *buffer; /* Stop at non-name characters */ if (!isalnum(c) && c != '_') break; chars_read++; buffer++; /* Ensure name does not exceed maximum length */ if (chars_read > GUACD_CONF_MAX_NAME_LENGTH) { guacd_conf_parse_error = "Names can be no more than 255 characters long"; guacd_conf_parse_error_location = buffer; return -1; } } /* Names must contain at least one character */ if (chars_read == 0) return 0; /* Copy name from buffer */ memcpy(name, name_start, chars_read); name[chars_read] = '\0'; return chars_read; } /** * Parses the value of a parameter. A value can consist of any character except * '#', whitespace, or EOL. The resulting value will be stored in the value * string, which must have at least 256 bytes available. */ static int guacd_parse_value(char* buffer, int length, char* value) { char* value_start = buffer; int chars_read = 0; /* Read through all valid value chars */ while (chars_read < length) { /* Read character */ char c = *buffer; /* Stop at invalid character */ if (c == '#' || c == '"' || c == '\r' || c == '\n' || c == ' ' || c == '\t') break; chars_read++; buffer++; /* Ensure value does not exceed maximum length */ if (chars_read > GUACD_CONF_MAX_VALUE_LENGTH) { guacd_conf_parse_error = "Values can be no more than 8191 characters long"; guacd_conf_parse_error_location = buffer; return -1; } } /* Values must contain at least one character */ if (chars_read == 0) { guacd_conf_parse_error = "Unquoted values must contain at least one character"; guacd_conf_parse_error_location = buffer; return -1; } /* Copy value from buffer */ memcpy(value, value_start, chars_read); value[chars_read] = '\0'; return chars_read; } /** * Parses the quoted value of a parameter. Quoted values may contain any * character except double quotes or backslashes, which must be * backslash-escaped. */ static int guacd_parse_quoted_value(char* buffer, int length, char* value) { int escaped = 0; /* Assert first character is '"' */ if (length == 0 || *buffer != '"') return 0; int chars_read = 1; buffer++; length--; /* Read until end of quoted value */ while (chars_read < length) { /* Read character */ char c = *buffer; /* Handle special characters if not escaped */ if (!escaped) { /* Stop at quote or invalid character */ if (c == '"' || c == '\r' || c == '\n') break; /* Backslash escaping */ else if (c == '\\') escaped = 1; else *(value++) = c; } /* Reset escape flag */ else { escaped = 0; *(value++) = c; } chars_read++; buffer++; /* Ensure value does not exceed maximum length */ if (chars_read > GUACD_CONF_MAX_VALUE_LENGTH) { guacd_conf_parse_error = "Values can be no more than 8191 characters long"; guacd_conf_parse_error_location = buffer; return -1; } } /* Assert value ends with '"' */ if (length == 0 || *buffer != '"') { guacd_conf_parse_error = "'\"' expected"; guacd_conf_parse_error_location = buffer; return -1; } chars_read++; /* Terminate read value */ *value = '\0'; return chars_read; } /** * Reads a parameter/value pair, separated by an '=' character. If the * parameter/value pair is invalid for any reason, a negative value is * returned. */ static int guacd_parse_parameter(guacd_param_callback* callback, char* buffer, int length, void* data) { char param_name[GUACD_CONF_MAX_NAME_LENGTH + 1]; char param_value[GUACD_CONF_MAX_VALUE_LENGTH + 1]; int retval; int chars_read = 0; char* param_start = buffer; retval = guacd_parse_name(buffer, length, param_name); if (retval < 0) return -1; /* If no name found, no parameter/value pair */ if (retval == 0) return 0; /* Validate presence of section header */ if (__guacd_current_section[0] == '\0') { guacd_conf_parse_error = "Parameters must have a corresponding section"; guacd_conf_parse_error_location = buffer; return -1; } chars_read += retval; buffer += retval; length -= retval; /* Optional whitespace before '=' */ retval = guacd_parse_whitespace(buffer, length); chars_read += retval; buffer += retval; length -= retval; /* Required '=' */ if (length == 0 || *buffer != '=') { guacd_conf_parse_error = "'=' expected"; guacd_conf_parse_error_location = buffer; return -1; } chars_read++; buffer++; length--; /* Optional whitespace before value */ retval = guacd_parse_whitespace(buffer, length); chars_read += retval; buffer += retval; length -= retval; /* Quoted parameter value */ retval = guacd_parse_quoted_value(buffer, length, param_value); if (retval < 0) return -1; /* Non-quoted parameter value (required if no quoted value given) */ if (retval == 0) retval = guacd_parse_value(buffer, length, param_value); if (retval < 0) return -1; chars_read += retval; /* Call callback, handling error code */ if (callback(__guacd_current_section, param_name, param_value, data)) { guacd_conf_parse_error_location = param_start; return -1; } return chars_read; } /** * Reads a section name from the beginning of the given buffer. This section * name must conform to the grammar definition. If the section name does not * match, a negative value is returned. */ static int guacd_parse_section(char* buffer, int length) { int retval; /* Assert first character is '[' */ if (length == 0 || *buffer != '[') return 0; int chars_read = 1; buffer++; length--; retval = guacd_parse_name(buffer, length, __guacd_current_section); if (retval < 0) return -1; /* If no name found, invalid section */ if (retval == 0) { guacd_conf_parse_error = "Section names must contain at least one character"; guacd_conf_parse_error_location = buffer; return -1; } chars_read += retval; buffer += retval; length -= retval; /* Name must end with ']' */ if (length == 0 || *buffer != ']') { guacd_conf_parse_error = "']' expected"; guacd_conf_parse_error_location = buffer; return -1; } chars_read++; return chars_read; } /** * Parses a declaration, which may be either a section name or a * parameter/value pair. The empty string is acceptable, as well, as a * "null declaration". */ static int guacd_parse_declaration(guacd_param_callback* callback, char* buffer, int length, void* data) { int retval; /* Look for section name */ retval = guacd_parse_section(buffer, length); if (retval != 0) return retval; /* Lacking a section name, read parameter/value pair */ retval = guacd_parse_parameter(callback, buffer, length, data); if (retval != 0) return retval; /* Null declaration (default) */ return 0; } /** * Parses a comment, which must start with a '#' character, and terminate with * an end-of-line character. If no EOL is found, or the first character is not * a '#', a negative value is returned. Otherwise, the number of characters * parsed is returned. If no comment is present, zero is returned. */ static int guacd_parse_comment(char* buffer, int length) { /* Need at least one character */ if (length == 0) return 0; /* Assert first character is '#' */ if (*(buffer++) != '#') return 0; int chars_read = 1; /* Advance to first non-space character */ while (chars_read < length) { /* Read character */ char c = *buffer; /* End of comment found at end of line */ if (c == '\n' || c == '\r') return chars_read; chars_read++; buffer++; } /* No end of line in comment */ guacd_conf_parse_error = "expected end-of-line"; guacd_conf_parse_error_location = buffer; return -1; } /** * Parses the end of a line, which may contain a comment. If a parse error * occurs, a negative value is returned. Otherwise, the number of characters * parsed is returned. */ static int guacd_parse_line_end(char* buffer, int length) { int chars_read = 0; int retval; /* Initial optional whitespace */ retval = guacd_parse_whitespace(buffer, length); chars_read += retval; buffer += retval; length -= retval; /* Optional comment */ retval = guacd_parse_comment(buffer, length); if (retval < 0) return -1; chars_read += retval; buffer += retval; length -= retval; /* Assert EOL */ if (length == 0 || (*buffer != '\r' && *buffer != '\n')) { guacd_conf_parse_error = "expected end-of-line"; guacd_conf_parse_error_location = buffer; return -1; } chars_read++; /* Line is valid */ return chars_read; } /** * Parses an entire line - declaration, comment, and all. If a parse error * occurs, a negative value is returned. Otherwise, the number of characters * parsed is returned. */ static int guacd_parse_line(guacd_param_callback* callback, char* buffer, int length, void* data) { int chars_read = 0; int retval; /* Initial optional whitespace */ retval = guacd_parse_whitespace(buffer, length); chars_read += retval; buffer += retval; length -= retval; /* Declaration (which may be the empty string) */ retval = guacd_parse_declaration(callback, buffer, length, data); if (retval < 0) return retval; chars_read += retval; buffer += retval; length -= retval; /* End of line */ retval = guacd_parse_line_end(buffer, length); if (retval < 0) return retval; chars_read += retval; return chars_read; } int guacd_parse_conf(guacd_param_callback* callback, char* buffer, int length, void* data) { /* Empty buffers are valid */ if (length == 0) return 0; return guacd_parse_line(callback, buffer, length, data); } int guacd_parse_log_level(const char* name) { /* Translate log level name */ if (strcmp(name, "info") == 0) return GUAC_LOG_INFO; if (strcmp(name, "error") == 0) return GUAC_LOG_ERROR; if (strcmp(name, "warning") == 0) return GUAC_LOG_WARNING; if (strcmp(name, "debug") == 0) return GUAC_LOG_DEBUG; /* No such log level */ return -1; } guacamole-server-0.9.9/src/guacd/client-map.c0000664000175100017510000001122512643542623015776 00000000000000/* * Copyright (C) 2014 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "client-map.h" #include "guac_list.h" #include #include #include /** * Returns a hash code based on the connection ID of the given client. */ static unsigned int __guacd_client_hash(const char* str) { unsigned int hash_value = 0; int c; /* Apply each character in string to the hash code */ while ((c = *(str++))) hash_value = hash_value * 65599 + c; return hash_value; } /** * Locates the bucket corresponding to the hash code indicated by the give id. * Each bucket is an instance of guac_common_list. */ static guac_common_list* __guacd_client_find_bucket(guacd_client_map* map, const char* id) { const int index = __guacd_client_hash(id) % GUACD_CLIENT_MAP_BUCKETS; return map->__buckets[index]; } /** * Given a list of guac_client instances, returns the guac_client having the * given ID, or NULL if no such client is stored. */ static guac_common_list_element* __guacd_client_find(guac_common_list* bucket, const char* id) { guac_common_list_element* current = bucket->head; /* Search for matching element within bucket */ while (current != NULL) { /* Check connection ID */ guac_client* client = (guac_client*) current->data; if (strcmp(client->connection_id, id) == 0) break; current = current->next; } return current; } guacd_client_map* guacd_client_map_alloc() { guacd_client_map* map = malloc(sizeof(guacd_client_map)); guac_common_list** current; int i; /* Init all buckets */ current = map->__buckets; for (i=0; iconnection_id); guac_common_list_element* found; /* Retrieve corresponding element, if any */ guac_common_list_lock(bucket); found = __guacd_client_find(bucket, client->connection_id); /* If no such element, we can add the new client successfully */ if (found == NULL) { guac_common_list_add(bucket, client); guac_common_list_unlock(bucket); return 0; } /* Otherwise, fail - already exists */ guac_common_list_unlock(bucket); return 1; } guac_client* guacd_client_map_retrieve(guacd_client_map* map, const char* id) { guac_client* client; guac_common_list* bucket = __guacd_client_find_bucket(map, id); guac_common_list_element* found; /* Retrieve corresponding element, if any */ guac_common_list_lock(bucket); found = __guacd_client_find(bucket, id); /* If no such element, fail */ if (found == NULL) { guac_common_list_unlock(bucket); return NULL; } client = (guac_client*) found->data; guac_common_list_unlock(bucket); return client; } guac_client* guacd_client_map_remove(guacd_client_map* map, const char* id) { guac_client* client; guac_common_list* bucket = __guacd_client_find_bucket(map, id); guac_common_list_element* found; /* Retrieve corresponding element, if any */ guac_common_list_lock(bucket); found = __guacd_client_find(bucket, id); /* If no such element, fail */ if (found == NULL) { guac_common_list_unlock(bucket); return NULL; } client = (guac_client*) found->data; guac_common_list_remove(bucket, found); guac_common_list_unlock(bucket); return client; } guacamole-server-0.9.9/src/guacd/client.h0000664000175100017510000000545712643542623015242 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 _GUACD_CLIENT_H #define _GUACD_CLIENT_H #include "config.h" #include /** * The time to allow between sync responses in milliseconds. If a sync * instruction is sent to the client and no response is received within this * timeframe, server messages will not be handled until a sync instruction is * received from the client. */ #define GUACD_SYNC_THRESHOLD 500 /** * The time to allow between server sync messages in milliseconds. A sync * message from the server will be sent every GUACD_SYNC_FREQUENCY milliseconds. * As this will induce a response from a client that is not malfunctioning, * this is used to detect when a client has died. This must be set to a * reasonable value to avoid clients being disconnected unnecessarily due * to timeout. */ #define GUACD_SYNC_FREQUENCY 5000 /** * The amount of time to wait after handling server messages. If a client * plugin has a message handler, and sends instructions when server messages * are being handled, there will be a pause of this many milliseconds before * the next call to the message handler. */ #define GUACD_MESSAGE_HANDLE_FREQUENCY 50 /** * The number of milliseconds to wait for messages in any phase before * timing out and closing the connection with an error. */ #define GUACD_TIMEOUT 15000 /** * The number of microseconds to wait for messages in any phase before * timing out and closing the conncetion with an error. This is always * equal to GUACD_TIMEOUT * 1000. */ #define GUACD_USEC_TIMEOUT (GUACD_TIMEOUT*1000) /** * The maximum number of concurrent connections to a single instance * of guacd. */ #define GUACD_CLIENT_MAX_CONNECTIONS 65536 int guacd_client_start(guac_client* client); #endif guacamole-server-0.9.9/src/guacd/client.c0000664000175100017510000001457112643542623015232 00000000000000/* * Copyright (C) 2013 Glyptodon LLC * * 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 "config.h" #include "client.h" #include "log.h" #include #include #include #include #include #include #include #include #include /** * Sleep for the given number of milliseconds. * * @param millis The number of milliseconds to sleep. */ void __guacdd_sleep(int millis) { struct timespec sleep_period; sleep_period.tv_sec = millis / 1000; sleep_period.tv_nsec = (millis % 1000) * 1000000L; nanosleep(&sleep_period, NULL); } void* __guacd_client_output_thread(void* data) { guac_client* client = (guac_client*) data; guac_socket* socket = client->socket; guac_client_log(client, GUAC_LOG_DEBUG, "Starting output thread."); /* Guacamole client output loop */ while (client->state == GUAC_CLIENT_RUNNING) { /* Handle server messages */ if (client->handle_messages) { /* Only handle messages if synced within threshold */ if (client->last_sent_timestamp - client->last_received_timestamp < GUACD_SYNC_THRESHOLD) { int retval = client->handle_messages(client); if (retval) { guacd_client_log_guac_error(client, GUAC_LOG_DEBUG, "Error handling server messages"); guac_client_stop(client); return NULL; } /* Send sync instruction */ client->last_sent_timestamp = guac_timestamp_current(); if (guac_protocol_send_sync(socket, client->last_sent_timestamp)) { guacd_client_log_guac_error(client, GUAC_LOG_DEBUG, "Error sending \"sync\" instruction"); guac_client_stop(client); return NULL; } /* Flush */ if (guac_socket_flush(socket)) { guacd_client_log_guac_error(client, GUAC_LOG_DEBUG, "Error flushing output"); guac_client_stop(client); return NULL; } } /* Do not spin while waiting for old sync */ else __guacdd_sleep(GUACD_MESSAGE_HANDLE_FREQUENCY); } /* If no message handler, just sleep until next sync ping */ else __guacdd_sleep(GUACD_SYNC_FREQUENCY); } /* End of output loop */ guac_client_log(client, GUAC_LOG_DEBUG, "Output thread terminated."); guac_client_stop(client); return NULL; } void* __guacd_client_input_thread(void* data) { guac_client* client = (guac_client*) data; guac_socket* socket = client->socket; guac_client_log(client, GUAC_LOG_DEBUG, "Starting input thread."); /* Guacamole client input loop */ while (client->state == GUAC_CLIENT_RUNNING) { /* Read instruction */ guac_instruction* instruction = guac_instruction_read(socket, GUACD_USEC_TIMEOUT); /* Stop on error */ if (instruction == NULL) { if (guac_error == GUAC_STATUS_TIMEOUT) guac_client_abort(client, GUAC_PROTOCOL_STATUS_CLIENT_TIMEOUT, "Client is not responding."); else { if (guac_error != GUAC_STATUS_CLOSED) guacd_client_log_guac_error(client, GUAC_LOG_WARNING, "Guacamole connection failure"); guac_client_stop(client); } return NULL; } /* Reset guac_error and guac_error_message (client handlers are not * guaranteed to set these) */ guac_error = GUAC_STATUS_SUCCESS; guac_error_message = NULL; /* Call handler, stop on error */ if (guac_client_handle_instruction(client, instruction) < 0) { /* Log error */ guacd_client_log_guac_error(client, GUAC_LOG_WARNING, "Connection aborted"); /* Log handler details */ guac_client_log(client, GUAC_LOG_DEBUG, "Failing instruction handler in client was \"%s\"", instruction->opcode); guac_instruction_free(instruction); guac_client_stop(client); return NULL; } /* Free allocated instruction */ guac_instruction_free(instruction); } guac_client_log(client, GUAC_LOG_DEBUG, "Input thread terminated."); return NULL; } int guacd_client_start(guac_client* client) { pthread_t input_thread, output_thread; if (pthread_create(&output_thread, NULL, __guacd_client_output_thread, (void*) client)) { guac_client_log(client, GUAC_LOG_ERROR, "Unable to start output thread"); return -1; } if (pthread_create(&input_thread, NULL, __guacd_client_input_thread, (void*) client)) { guac_client_log(client, GUAC_LOG_ERROR, "Unable to start input thread"); guac_client_stop(client); pthread_join(output_thread, NULL); return -1; } /* Wait for I/O threads */ pthread_join(input_thread, NULL); pthread_join(output_thread, NULL); /* Done */ return 0; } guacamole-server-0.9.9/src/guacd/Makefile.am0000664000175100017510000000416412643542623015641 00000000000000# # Copyright (C) 2015 Glyptodon LLC # # 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. # AUTOMAKE_OPTIONS = foreign sbin_PROGRAMS = guacd man_MANS = \ man/guacd.8 \ man/guacd.conf.5 noinst_HEADERS = \ client.h \ client-map.h \ conf-args.h \ conf-file.h \ conf-parse.h \ log.h guacd_SOURCES = \ daemon.c \ client.c \ client-map.c \ conf-args.c \ conf-file.c \ conf-parse.c \ log.c guacd_CFLAGS = \ -Werror -Wall -pedantic \ @COMMON_INCLUDE@ \ @LIBGUAC_INCLUDE@ guacd_LDADD = \ @COMMON_LTLIB@ \ @LIBGUAC_LTLIB@ guacd_LDFLAGS = \ @PTHREAD_LIBS@ \ @SSL_LIBS@ EXTRA_DIST = \ init.d/guacd.in \ man/guacd.8 \ man/guacd.conf.5 CLEANFILES = $(init_SCRIPTS) # SSL support if ENABLE_SSL noinst_HEADERS += socket-ssl.h guacd_SOURCES += socket-ssl.c endif # Init script if ENABLE_INIT initdir = @init_dir@ init_SCRIPTS = init.d/guacd init.d/guacd: init.d/guacd.in sed -e 's,[@]sbindir[@],$(sbindir),g' < init.d/guacd.in > init.d/guacd chmod +x init.d/guacd endif guacamole-server-0.9.9/Makefile.in0000664000175100017510000006625112645400275014003 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Copyright (C) 2015 Glyptodon LLC # # 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. # VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @ENABLE_COMMON_SSH_TRUE@am__append_1 = src/common-ssh @ENABLE_TERMINAL_TRUE@am__append_2 = src/terminal @ENABLE_RDP_TRUE@am__append_3 = src/protocols/rdp @ENABLE_SSH_TRUE@am__append_4 = src/protocols/ssh @ENABLE_TELNET_TRUE@am__append_5 = src/protocols/telnet @ENABLE_VNC_TRUE@am__append_6 = src/protocols/vnc subdir = . DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in AUTHORS ChangeLog README compile \ config.guess config.sub depcomp install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COMMON_INCLUDE = @COMMON_INCLUDE@ COMMON_LTLIB = @COMMON_LTLIB@ COMMON_SSH_INCLUDE = @COMMON_SSH_INCLUDE@ COMMON_SSH_LTLIB = @COMMON_SSH_LTLIB@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CUNIT_LIBS = @CUNIT_LIBS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBADD_DLOPEN = @LIBADD_DLOPEN@ LIBGUAC_INCLUDE = @LIBGUAC_INCLUDE@ LIBGUAC_LTLIB = @LIBGUAC_LTLIB@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MATH_LIBS = @MATH_LIBS@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@ PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@ PANGO_CFLAGS = @PANGO_CFLAGS@ PANGO_LIBS = @PANGO_LIBS@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_LIBS = @PNG_LIBS@ PTHREAD_LIBS = @PTHREAD_LIBS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ RDP_LIBS = @RDP_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSH_LIBS = @SSH_LIBS@ SSL_LIBS = @SSL_LIBS@ STRIP = @STRIP@ TELNET_LIBS = @TELNET_LIBS@ TERMINAL_INCLUDE = @TERMINAL_INCLUDE@ TERMINAL_LTLIB = @TERMINAL_LTLIB@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VNC_LIBS = @VNC_LIBS@ VORBIS_LIBS = @VORBIS_LIBS@ WEBP_LIBS = @WEBP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ init_dir = @init_dir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I m4 # Subprojects DIST_SUBDIRS = \ src/libguac \ src/common \ src/common-ssh \ src/terminal \ src/guacd \ src/protocols/rdp \ src/protocols/ssh \ src/protocols/telnet \ src/protocols/vnc \ tests SUBDIRS = src/libguac src/common src/guacd tests $(am__append_1) \ $(am__append_2) $(am__append_3) $(am__append_4) \ $(am__append_5) $(am__append_6) EXTRA_DIST = \ LICENSE \ bin/guacctl \ doc/Doxyfile all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile config.h installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) all install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ clean-libtool cscope cscopelist-am ctags ctags-am dist \ dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ dist-xz dist-zip distcheck distclean distclean-generic \ distclean-hdr distclean-libtool distclean-tags distcleancheck \ distdir distuninstallcheck dvi dvi-am html html-am info \ info-am install install-am install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: guacamole-server-0.9.9/bin/0000775000175100017510000000000012645400336012552 500000000000000guacamole-server-0.9.9/bin/guacctl0000775000175100017510000000721712645364210014051 00000000000000#!/bin/sh # # Copyright (C) 2013 Glyptodon LLC # # 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. # # # guacctl # ------- # # Utility for sending Guacamole-specific console codes for controlling the SSH # session, such as: # # * Downloading files # * Setting the destination directory for uploads # # This script may also be run as "guacget", in which case the script accepts # no options and assumes anything given on the commandline is a file to be # downloaded. # # Given the name of a file, which may be a relative path, produce the full, # real, non-relative path for that same file. fullpath() { FILENAME="$1" DIR=`dirname "$FILENAME"` FILE=`basename "$FILENAME"` (cd "$DIR" && echo "$PWD/$FILE") } # Sends the Guacamole-specific console code for initiating a download. send_download_file() { FILENAME="$1" printf "\033]482200;%s\007" "$FILENAME" } # Sends the Guacamole-specific console code for setting the upload directory. send_set_directory() { FILENAME="$1" printf "\033]482201;%s\007" "$FILENAME" } # Prints the given error text to STDERR. error() { echo "$NAME:" "$@" >&2 } # Prints usage documentation for this script. usage() { cat >&2 <@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) guacamole-server-0.9.9/m4/lt~obsolete.m40000644000175100017510000001375612645400272015067 00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) guacamole-server-0.9.9/m4/ltsugar.m40000644000175100017510000001042412645400272014163 00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) guacamole-server-0.9.9/m4/libtool.m40000644000175100017510000105756412645400272014167 00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS guacamole-server-0.9.9/config.sub0000755000175100017510000010576212645400275013720 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-07-28' # This file 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 3 of the License, 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: guacamole-server-0.9.9/config.guess0000755000175100017510000012355012645400275014250 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-03-23' # This file 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 3 of the License, 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: guacamole-server-0.9.9/missing0000755000175100017510000001533012645400275013323 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: guacamole-server-0.9.9/config.h.in0000664000175100017510000002101112645400274013741 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Type compatibility */ #undef CHANNEL_ENTRY_POINTS_FREERDP /* Whether support for the common SSH core is enabled */ #undef ENABLE_COMMON_SSH /* Whether support for Ogg Vorbis is enabled */ #undef ENABLE_OGG /* Whether PulseAudio support is enabled */ #undef ENABLE_PULSE /* Whether agent forwarding support for SSH is enabled */ #undef ENABLE_SSH_AGENT /* Whether SSL-related support is enabled */ #undef ENABLE_SSL /* Whether support for listen-mode VNC connections is enabled. */ #undef ENABLE_VNC_LISTEN /* Whether support for VNC repeaters is enabled. */ #undef ENABLE_VNC_REPEATER /* Whether WebP support is enabled */ #undef ENABLE_WEBP /* Whether library support for WinPR types was found */ #undef ENABLE_WINPR /* Whether this version of FreeRDP requires _aligned_malloc() for bitmap data */ #undef FREERDP_BITMAP_REQUIRES_ALIGNED_MALLOC /* The full path to the guacd config file */ #undef GUACD_CONF_FILE /* Define to 1 if you have the header file. */ #undef HAVE_CAIRO_CAIRO_H /* Whether cairo_format_stride_for_width() is defined */ #undef HAVE_CAIRO_FORMAT_STRIDE_FOR_WIDTH /* Define to 1 if you have the `clock_gettime' function. */ #undef HAVE_CLOCK_GETTIME /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_FREERDP_ADDIN_H /* Whether freerdp_channels_global_init() is defined */ #undef HAVE_FREERDP_CHANNELS_GLOBAL_INIT /* Define to 1 if you have the header file. */ #undef HAVE_FREERDP_CLIENT_CHANNELS_H /* Define to 1 if you have the header file. */ #undef HAVE_FREERDP_CLIENT_CLIPRDR_H /* Define to 1 if you have the header file. */ #undef HAVE_FREERDP_CLIENT_DISP_H /* Whether freerdp_color_convert_drawing_order_color_to_gdi_color() is defined */ #undef HAVE_FREERDP_COLOR_CONVERT_DRAWING_ORDER_COLOR_TO_GDI_COLOR /* Define to 1 if `ContextSize' is a member of `freerdp'. */ #undef HAVE_FREERDP_CONTEXTSIZE /* Define to 1 if `context_size' is a member of `freerdp'. */ #undef HAVE_FREERDP_CONTEXT_SIZE /* Whether freerdp_convert_gdi_order_color() is defined */ #undef HAVE_FREERDP_CONVERT_GDI_ORDER_COLOR /* Whether FreeRDP supports the display update channel */ #undef HAVE_FREERDP_DISPLAY_UPDATE_SUPPORT /* Whether this version of FreeRDP provides the PubSub event system */ #undef HAVE_FREERDP_EVENT_PUBSUB /* Define to 1 if you have the header file. */ #undef HAVE_FREERDP_KBD_LAYOUTS_H /* Define to 1 if you have the header file. */ #undef HAVE_FREERDP_LOCALE_KEYBOARD_H /* Define to 1 if you have the header file. */ #undef HAVE_FREERDP_PLUGINS_CLIPRDR_H /* Whether freerdp_register_addin_provider() is defined */ #undef HAVE_FREERDP_REGISTER_ADDIN_PROVIDER /* Define to 1 if you have the header file. */ #undef HAVE_FREERDP_VERSION_H /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Whether libpthread was found */ #undef HAVE_LIBPTHREAD /* Define to 1 if you have the `wsock32' library (-lwsock32). */ #undef HAVE_LIBWSOCK32 /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the `nanosleep' function. */ #undef HAVE_NANOSLEEP /* Define to 1 if you have the header file. */ #undef HAVE_OSSP_UUID_H /* Define to 1 if you have the header file. */ #undef HAVE_PNGSTRUCT_H /* Whether png_get_io_ptr() is defined */ #undef HAVE_PNG_GET_IO_PTR /* Define to 1 if `codecs' is a member of `rdpContext'. */ #undef HAVE_RDPCONTEXT_CODECS /* Define to 1 if `SetDefault' is a member of `rdpPointer'. */ #undef HAVE_RDPPOINTER_SETDEFAULT /* Define to 1 if `SetNull' is a member of `rdpPointer'. */ #undef HAVE_RDPPOINTER_SETNULL /* Whether the rdpSettings structure has AudioPlayback settings */ #undef HAVE_RDPSETTINGS_AUDIOPLAYBACK /* Define to 1 if `audio_playback' is a member of `rdpSettings'. */ #undef HAVE_RDPSETTINGS_AUDIO_PLAYBACK /* Whether the rdpSettings structure has DeviceRedirection settings */ #undef HAVE_RDPSETTINGS_DEVICEREDIRECTION /* Define to 1 if `device_redirection' is a member of `rdpSettings'. */ #undef HAVE_RDPSETTINGS_DEVICE_REDIRECTION /* Define to 1 if `FastPathInput' is a member of `rdpSettings'. */ #undef HAVE_RDPSETTINGS_FASTPATHINPUT /* Define to 1 if `FastPathOutput' is a member of `rdpSettings'. */ #undef HAVE_RDPSETTINGS_FASTPATHOUTPUT /* Define to 1 if `height' is a member of `rdpSettings'. */ #undef HAVE_RDPSETTINGS_HEIGHT /* Define to 1 if `OrderSupport' is a member of `rdpSettings'. */ #undef HAVE_RDPSETTINGS_ORDERSUPPORT /* Define to 1 if `order_support' is a member of `rdpSettings'. */ #undef HAVE_RDPSETTINGS_ORDER_SUPPORT /* Define to 1 if `SendPreconnectionPdu' is a member of `rdpSettings'. */ #undef HAVE_RDPSETTINGS_SENDPRECONNECTIONPDU /* Define to 1 if `SupportDisplayControl' is a member of `rdpSettings'. */ #undef HAVE_RDPSETTINGS_SUPPORTDISPLAYCONTROL /* Define to 1 if `width' is a member of `rdpSettings'. */ #undef HAVE_RDPSETTINGS_WIDTH /* Define to 1 if `interval_ms' is a member of `rdpSvcPlugin'. */ #undef HAVE_RDPSVCPLUGIN_INTERVAL_MS /* Define to 1 if `event_class' is a member of `RDP_EVENT'. */ #undef HAVE_RDP_EVENT_EVENT_CLASS /* Define to 1 if `destHost' is a member of `rfbClient'. */ #undef HAVE_RFBCLIENT_DESTHOST /* Define to 1 if `destPort' is a member of `rfbClient'. */ #undef HAVE_RFBCLIENT_DESTPORT /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYSLOG_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if `id' is a member of `wMessage'. */ #undef HAVE_WMESSAGE_ID /* Whether interleaved_decompress() accepts an additional palette parameter */ #undef INTERLEAVED_DECOMPRESS_TAKES_PALETTE /* Whether the legacy RDP_EVENT API was found */ #undef LEGACY_EVENT /* Whether the older version of the FreeRDP API was found */ #undef LEGACY_FREERDP /* Whether the legacy rdpBitmap API was found */ #undef LEGACY_RDPBITMAP /* Whether the legacy rdpPalette API was found */ #undef LEGACY_RDPPALETTE /* Whether the legacy version of the rdpSettings API was found */ #undef LEGACY_RDPSETTINGS /* Whether libssh2 was built against libgcrypt */ #undef LIBSSH2_USES_GCRYPT /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Whether planar_decompress() can flip */ #undef PLANAR_DECOMPRESS_CAN_FLIP /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Uses X/Open and POSIX APIs */ #undef _XOPEN_SOURCE /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to `int' if does not define. */ #undef ssize_t guacamole-server-0.9.9/ChangeLog0000664000175100017510000000105312536405624013477 000000000000002013-08-26 Michael Jumper * Experimental sound support for VNC (ticket #369) * Improved handling of frame flush (ticket #380) * SSL transport for guacd (ticket #371) * Fix segfault in RDP disconnect (ticket #385) * Add security options to RDP (ticket #190) 2013-07-02 Michael Jumper * Optional threadsafety in guac_socket * Printing support in for RDP (ticket #110) * Fix ENABLE_OGG bug (ticket #355) 2013-06-06 Michael Jumper * Created new repository layout guacamole-server-0.9.9/aclocal.m40000664000175100017510000014333212645400273013570 00000000000000# generated automatically by aclocal 1.14.1 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # 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 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # PKG_INSTALLDIR(DIRECTORY) # ------------------------- # Substitutes the variable pkgconfigdir as the location where a module # should install pkg-config .pc files. By default the directory is # $libdir/pkgconfig, but the default can be changed by passing # DIRECTORY. The user can override through the --with-pkgconfigdir # parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ]) dnl PKG_INSTALLDIR # PKG_NOARCH_INSTALLDIR(DIRECTORY) # ------------------------- # Substitutes the variable noarch_pkgconfigdir as the location where a # module should install arch-independent pkg-config .pc files. By # default the directory is $datadir/pkgconfig, but the default can be # changed by passing DIRECTORY. The user can override through the # --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ]) dnl PKG_NOARCH_INSTALLDIR # PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # ------------------------------------------- # Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])# PKG_CHECK_VAR # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.14.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_COND_IF -*- Autoconf -*- # Copyright (C) 2008-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_COND_IF # _AM_COND_ELSE # _AM_COND_ENDIF # -------------- # These macros are only used for tracing. m4_define([_AM_COND_IF]) m4_define([_AM_COND_ELSE]) m4_define([_AM_COND_ENDIF]) # AM_COND_IF(COND, [IF-TRUE], [IF-FALSE]) # --------------------------------------- # If the shell condition COND is true, execute IF-TRUE, otherwise execute # IF-FALSE. Allow automake to learn about conditional instantiating macros # (the AC_CONFIG_FOOS). AC_DEFUN([AM_COND_IF], [m4_ifndef([_AM_COND_VALUE_$1], [m4_fatal([$0: no such condition "$1"])])dnl _AM_COND_IF([$1])dnl if test -z "$$1_TRUE"; then : m4_n([$2])[]dnl m4_ifval([$3], [_AM_COND_ELSE([$1])dnl else $3 ])dnl _AM_COND_ENDIF([$1])dnl fi[]dnl ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) guacamole-server-0.9.9/configure.ac0000664000175100017510000007767712643542623014244 00000000000000# # Copyright (C) 2015 Glyptodon LLC # # 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. # AC_PREREQ([2.61]) AC_INIT([guacamole-server], [0.9.9]) AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects]) AM_SILENT_RULES([yes]) LT_PREREQ([2.2]) LT_INIT([dlopen]) AC_CONFIG_HEADER([config.h]) AC_CONFIG_MACRO_DIR([m4]) # Programs AC_PROG_CC AC_PROG_CC_C99 AC_PROG_LIBTOOL # Headers AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/socket.h time.h sys/time.h syslog.h unistd.h cairo/cairo.h pngstruct.h]) # Source characteristics AC_DEFINE([_XOPEN_SOURCE], [700], [Uses X/Open and POSIX APIs]) # Check for whether math library is required AC_CHECK_LIB([m], [cos], [MATH_LIBS=-lm], [AC_CHECK_DECL([cos],, AC_MSG_ERROR("Complex math functions are missing and no libm was found") [#include ])]) # libpng AC_CHECK_LIB([png], [png_write_png], [PNG_LIBS=-lpng], AC_MSG_ERROR("libpng is required for writing png messages")) # libjpeg AC_CHECK_LIB([jpeg], [jpeg_start_compress], [JPEG_LIBS=-ljpeg], AC_MSG_ERROR("libjpeg is required for writing jpeg messages")) # Cairo AC_CHECK_LIB([cairo], [cairo_create], [CAIRO_LIBS=-lcairo], AC_MSG_ERROR("Cairo is required for drawing instructions")) # libpthread AC_CHECK_LIB([pthread], [pthread_create], [PTHREAD_LIBS=-lpthread AC_DEFINE([HAVE_LIBPTHREAD],, [Whether libpthread was found])]) # OSSP UUID AC_CHECK_LIB([ossp-uuid], [uuid_make], [UUID_LIBS=-lossp-uuid], AC_CHECK_LIB([uuid], [uuid_make], [UUID_LIBS=-luuid], AC_MSG_ERROR("The OSSP UUID library is required"))) # Check for and validate OSSP uuid.h header AC_CHECK_HEADERS([ossp/uuid.h]) AC_CHECK_DECL([uuid_make],, AC_MSG_ERROR("No OSSP uuid.h found in include path"), [#ifdef HAVE_OSSP_UUID_H #include #else #include #endif ]) # cunit AC_CHECK_LIB([cunit], [CU_run_test], [CUNIT_LIBS=-lcunit]) # WinSock AC_CHECK_LIB([wsock32], [main]) AC_SUBST(LIBADD_DLOPEN) AC_SUBST(MATH_LIBS) AC_SUBST(PNG_LIBS) AC_SUBST(JPEG_LIBS) AC_SUBST(CAIRO_LIBS) AC_SUBST(PTHREAD_LIBS) AC_SUBST(UUID_LIBS) AC_SUBST(CUNIT_LIBS) # Library functions AC_CHECK_FUNCS([clock_gettime gettimeofday memmove memset select strdup nanosleep]) AC_CHECK_DECL([png_get_io_ptr], [AC_DEFINE([HAVE_PNG_GET_IO_PTR],, [Whether png_get_io_ptr() is defined])],, [#include ]) AC_CHECK_DECL([cairo_format_stride_for_width], [AC_DEFINE([HAVE_CAIRO_FORMAT_STRIDE_FOR_WIDTH],, [Whether cairo_format_stride_for_width() is defined])],, [#include ]) # Typedefs AC_TYPE_SIZE_T AC_TYPE_SSIZE_T # Bundled libguac AC_SUBST([LIBGUAC_LTLIB], '$(top_builddir)/src/libguac/libguac.la') AC_SUBST([LIBGUAC_INCLUDE], '-I$(top_srcdir)/src/libguac') # Common non-libguac utility library AC_SUBST([COMMON_LTLIB], '$(top_builddir)/src/common/libguac_common.la') AC_SUBST([COMMON_INCLUDE], '-I$(top_srcdir)/src/common') # Common base SSH client AC_SUBST([COMMON_SSH_LTLIB], '$(top_builddir)/src/common-ssh/libguac_common_ssh.la') AC_SUBST([COMMON_SSH_INCLUDE], '-I$(top_srcdir)/src/common-ssh') # Terminal emulator AC_SUBST([TERMINAL_LTLIB], '$(top_builddir)/src/terminal/libguac_terminal.la') AC_SUBST([TERMINAL_INCLUDE], '-I$(top_srcdir)/src/terminal $(PANGO_CFLAGS) $(PANGOCAIRO_CFLAGS) $(COMMON_INCLUDE)') # Init directory AC_ARG_WITH(init_dir, [AS_HELP_STRING([--with-init-dir=], [install init scripts to the given directory]) ],init_dir=$withval) AM_CONDITIONAL([ENABLE_INIT], [test "x${init_dir}" != "x"]) AC_SUBST(init_dir) # guacd config file AC_ARG_WITH(guacd_conf, [AS_HELP_STRING([--with-guacd-conf=], [the full path to the guacd config file @<:@default=/etc/guacamole/guacd.conf@:>@])], [guacd_conf=$withval], [guacd_conf=/etc/guacamole/guacd.conf]) AC_DEFINE_UNQUOTED([GUACD_CONF_FILE], ["$guacd_conf"], [The full path to the guacd config file]) # # libssl # have_ssl=disabled SSL_LIBS= AC_ARG_WITH([ssl], [AS_HELP_STRING([--with-ssl], [support SSL encryption @<:@default=check@:>@])], [], [with_ssl=check]) if test "x$with_ssl" != "xno" then have_ssl=yes AC_CHECK_HEADER(openssl/ssl.h,, [have_ssl=no]) AC_CHECK_LIB([ssl], [SSL_CTX_new], [SSL_LIBS="$SSL_LIBS -lssl"], [have_ssl=no]) if test "x${have_ssl}" = "xno" then AC_MSG_WARN([ -------------------------------------------- Unable to find libssl. guacd will not support SSL connections. --------------------------------------------]) else AC_DEFINE([ENABLE_SSL],, [Whether SSL-related support is enabled]) fi fi AM_CONDITIONAL([ENABLE_SSL], [test "x${have_ssl}" = "xyes"]) AC_SUBST(SSL_LIBS) # # Ogg Vorbis # have_vorbis=disabled VORBIS_LIBS= AC_ARG_WITH([vorbis], [AS_HELP_STRING([--with-vorbis], [support Ogg Vorbis @<:@default=check@:>@])], [], [with_vorbis=check]) if test "x$with_vorbis" != "xno" then have_vorbis=yes AC_CHECK_HEADER(vorbis/vorbisenc.h,, [have_vorbis=no]) AC_CHECK_LIB([ogg], [ogg_stream_init], [VORBIS_LIBS="$VORBIS_LIBS -logg"], [have_vorbis=no]) AC_CHECK_LIB([vorbis], [vorbis_block_init], [VORBIS_LIBS="$VORBIS_LIBS -lvorbis"], [have_vorbis=no]) AC_CHECK_LIB([vorbisenc], [vorbis_encode_init], [VORBIS_LIBS="$VORBIS_LIBS -lvorbisenc"], [have_vorbis=no]) if test "x${have_vorbis}" = "xno" then AC_MSG_WARN([ -------------------------------------------- Unable to find libogg / libvorbis / libvorbisenc. Sound will not be encoded with Ogg Vorbis. --------------------------------------------]) else AC_DEFINE([ENABLE_OGG],, [Whether support for Ogg Vorbis is enabled]) fi fi AM_CONDITIONAL([ENABLE_OGG], [test "x${have_vorbis}" = "xyes"]) AC_SUBST(VORBIS_LIBS) # # PulseAudio # have_pulse=disabled PULSE_LIBS= AC_ARG_WITH([pulse], [AS_HELP_STRING([--with-pulse], [support PulseAudio @<:@default=check@:>@])], [], [with_pulse=check]) if test "x$with_pulse" != "xno" then have_pulse=yes AC_CHECK_LIB([pulse], [pa_context_new], [PULSE_LIBS="$PULSE_LIBS -lpulse"], [have_pulse=no]) if test "x${have_pulse}" = "xno" then AC_MSG_WARN([ -------------------------------------------- Unable to find libpulse Sound support for VNC will be disabled --------------------------------------------]) else AC_DEFINE([ENABLE_PULSE],, [Whether PulseAudio support is enabled]) fi fi AM_CONDITIONAL([ENABLE_PULSE], [test "x${have_pulse}" = "xyes"]) AC_SUBST(PULSE_LIBS) # # PANGO # have_pango=disabled AC_ARG_WITH([pango], [AS_HELP_STRING([--with-pango], [support Pango text layout @<:@default=check@:>@])], [], [with_pango=check]) if test "x$with_pango" != "xno" then have_pango=yes PKG_CHECK_MODULES([PANGO], [pango],, [have_pango=no]); PKG_CHECK_MODULES([PANGOCAIRO], [pangocairo],, [have_pango=no]); fi # # Terminal emulator # have_terminal=disabled AC_ARG_WITH([terminal], [AS_HELP_STRING([--with-terminal], [support text-based protocols @<:@default=check@:>@])], [], [with_terminal=check]) if test "x$with_terminal" != "xno" then have_terminal=yes if test "x${have_pango}" = "xno" then have_terminal=no fi fi AM_CONDITIONAL([ENABLE_TERMINAL], [test "x${have_terminal}" = "xyes"]) # # libVNCServer # have_libvncserver=disabled VNC_LIBS= AC_ARG_WITH([vnc], [AS_HELP_STRING([--with-vnc], [support VNC @<:@default=check@:>@])], [], [with_vnc=check]) if test "x$with_vnc" != "xno" then have_libvncserver=yes AC_CHECK_LIB([vncclient], [rfbInitClient], [VNC_LIBS="$VNC_LIBS -lvncclient"], [have_libvncserver=no]) fi AM_CONDITIONAL([ENABLE_VNC], [test "x${have_libvncserver}" = "xyes"]) AC_SUBST(VNC_LIBS) # # Repeater support within libVNCServer # if test "x${have_libvncserver}" = "xyes" then have_vnc_repeater=yes AC_CHECK_MEMBERS([rfbClient.destHost, rfbClient.destPort], [], [have_vnc_repeater=no], [[#include ]]) if test "x${have_vnc_repeater}" = "xno" then AC_MSG_WARN([ -------------------------------------------- No repeater support found in libvncclient. Support for VNC repeaters will not be built. --------------------------------------------]) else AC_DEFINE([ENABLE_VNC_REPEATER],, [Whether support for VNC repeaters is enabled.]) fi fi # # Listening support within libVNCServer # if test "x${have_libvncserver}" = "xyes" then have_vnc_listen=yes AC_CHECK_DECL([listenForIncomingConnectionsNoFork], [], [have_vnc_listen=no], [[#include ]]) if test "x${have_vnc_listen}" = "xno" then AC_MSG_WARN([ -------------------------------------------- No listening support found in libvncclient. Support for listen-mode connections will not be built. --------------------------------------------]) else AC_DEFINE([ENABLE_VNC_LISTEN],, [Whether support for listen-mode VNC connections is enabled.]) fi fi # # FreeRDP # have_freerdp=disabled RDP_LIBS= AC_ARG_WITH([rdp], [AS_HELP_STRING([--with-rdp], [support RDP @<:@default=check@:>@])], [], [with_rdp=check]) if test "x$with_rdp" != "xno" then have_winpr=yes have_freerdp=yes have_disp=yes legacy_freerdp_extensions=no rdpsettings_interface=unknown rdpsettings_audioplayback=yes rdpsettings_deviceredirection=yes freerdp_interface=unknown event_interface=unknown # libfreerdp-core / libfreerdp AC_CHECK_LIB([freerdp-core], [freerdp_new], [RDP_LIBS="$RDP_LIBS -lfreerdp-core"], [AC_CHECK_LIB([freerdp], [freerdp_new], [RDP_LIBS="$RDP_LIBS -lfreerdp -lfreerdp-client"], [AC_MSG_WARN([ -------------------------------------------- Unable to find libfreerdp-core / libfreerdp RDP will be disabled. --------------------------------------------]) have_freerdp=no])]) fi # libfreerdp-cache if test "x${have_freerdp}" = "xyes" then AC_CHECK_LIB([freerdp-cache], [glyph_cache_register_callbacks], [RDP_LIBS="$RDP_LIBS -lfreerdp-cache"]) fi # libfreerdp-channels (1.0) / libfreerdp-client + libfreerdp-core (1.1) if test "x${have_freerdp}" = "xyes" then AC_CHECK_LIB([freerdp-client], [freerdp_channels_new], [RDP_LIBS="$RDP_LIBS -lfreerdp-client"], [AC_CHECK_LIB([freerdp-channels], [freerdp_channels_new], [RDP_LIBS="$RDP_LIBS -lfreerdp-channels" legacy_freerdp_extensions=yes])], [-lfreerdp-core]) fi # libfreerdp-utils if test "x${have_freerdp}" = "xyes" then AC_CHECK_LIB([freerdp-utils], [svc_plugin_init], [RDP_LIBS="$RDP_LIBS -lfreerdp-utils"]) fi # libfreerdp-codec if test "x${have_freerdp}" = "xyes" then AC_CHECK_LIB([freerdp-codec], [freerdp_image_convert], [RDP_LIBS="$RDP_LIBS -lfreerdp-codec"]) fi # Available color conversion functions if test "x${have_freerdp}" = "xyes" then AC_CHECK_DECL([freerdp_convert_gdi_order_color], [AC_DEFINE([HAVE_FREERDP_CONVERT_GDI_ORDER_COLOR],, [Whether freerdp_convert_gdi_order_color() is defined])],, [#include ]) AC_CHECK_DECL([freerdp_color_convert_drawing_order_color_to_gdi_color], [AC_DEFINE([HAVE_FREERDP_COLOR_CONVERT_DRAWING_ORDER_COLOR_TO_GDI_COLOR],, [Whether freerdp_color_convert_drawing_order_color_to_gdi_color() is defined])],, [#include ]) fi # Check for interval polling in plugins if test "x${have_freerdp}" = "xyes" then AC_CHECK_MEMBERS([rdpSvcPlugin.interval_ms],,, [[#include ]]) fi # Keyboard layout header if test "x${have_freerdp}" = "xyes" then AC_CHECK_HEADERS([freerdp/locale/keyboard.h],, [AC_CHECK_HEADERS([freerdp/kbd/layouts.h],, [AC_MSG_WARN([ -------------------------------------------- Unable to find keyboard layout headers RDP will be disabled. --------------------------------------------]) have_freerdp=no])]) fi # New headers defining addins if test "x${have_freerdp}" = "xyes" then AC_CHECK_HEADERS([freerdp/addin.h freerdp/client/channels.h]) fi # Header defining cliprdr if test "x${have_freerdp}" = "xyes" then AC_CHECK_HEADERS([freerdp/client/cliprdr.h],, [AC_CHECK_HEADERS([freerdp/plugins/cliprdr.h],, [AC_MSG_WARN([ -------------------------------------------- Unable to find cliprdr headers RDP will be disabled. --------------------------------------------]) have_freerdp=no], [#include ])], [#include #include ]) fi # Header defining display update channel if test "x${have_freerdp}" = "xyes" then AC_CHECK_HEADERS([freerdp/client/disp.h], [AC_DEFINE([HAVE_FREERDP_DISPLAY_UPDATE_SUPPORT],, [Whether FreeRDP supports the display update channel])] [AC_CHECK_MEMBERS([rdpSettings.SupportDisplayControl],,, [[#include ]])], have_disp=no, [#include #include ]) fi # Support for "PubSub" event system if test "x${have_freerdp}" = "xyes" then AC_CHECK_DECL([PubSub_SubscribeChannelConnected], [AC_DEFINE([HAVE_FREERDP_EVENT_PUBSUB],, [Whether this version of FreeRDP provides the PubSub event system])],, [#include ]) fi # Addin registration variations if test "x${have_freerdp}" = "xyes" then AC_CHECK_DECL([freerdp_register_addin_provider], [AC_DEFINE([HAVE_FREERDP_REGISTER_ADDIN_PROVIDER],, [Whether freerdp_register_addin_provider() is defined])],, [#include ]) AC_CHECK_DECL([freerdp_channels_global_init], [AC_DEFINE([HAVE_FREERDP_CHANNELS_GLOBAL_INIT],, [Whether freerdp_channels_global_init() is defined])],, [#include ]) fi # # FreeRDP: WinPR # # Check for stream support via WinPR if test "x${have_freerdp}" = "xyes" then AC_CHECK_HEADER(winpr/stream.h,, [have_winpr=no, AC_CHECK_DECL([stream_write_uint8],, [AC_MSG_WARN([ -------------------------------------------- Unable to find stream support RDP will be disabled. --------------------------------------------]) have_freerdp=no], [#include ])]) fi # Check for types in WinPR if test "x${have_freerdp}" = "xyes" then AC_CHECK_HEADER(winpr/wtypes.h,, [have_winpr=no, AC_CHECK_HEADER(freerdp/types.h,, [AC_MSG_WARN([ -------------------------------------------- Unable to find type definitions RDP will be disabled. --------------------------------------------]) have_freerdp=no])]) fi if test "x${have_freerdp}" = "xyes" -a "x${have_winpr}" = "xyes" then AC_DEFINE([ENABLE_WINPR],, [Whether library support for WinPR types was found]) fi # # FreeRDP: freerdp # if test "x${have_freerdp}" = "xyes" then # Check for current (as of 1.1) freerdp interface AC_CHECK_MEMBERS([freerdp.ContextSize], [freerdp_interface=stable],, [[#include ]]) # If not current, check for legacy interface if test "x${freerdp_interface}" = "xunknown" then AC_CHECK_MEMBERS([freerdp.context_size], [freerdp_interface=legacy],, [[#include ]]) fi # Set defines based on interface type, warn if unknown if test "x${freerdp_interface}" = "xlegacy"; then AC_DEFINE([LEGACY_FREERDP],, [Whether the older version of the FreeRDP API was found]) elif test "x${freerdp_interface}" = "xunknown"; then AC_MSG_WARN([ -------------------------------------------- Unknown FreeRDP interface RDP will be disabled. --------------------------------------------]) have_freerdp=no fi fi # # FreeRDP: rdpSettings # if test "x${have_freerdp}" = "xyes" then # Check for current (as of 1.1) rdpSettings interface AC_CHECK_MEMBERS([rdpSettings.Width, rdpSettings.Height, rdpSettings.FastPathInput, rdpSettings.FastPathOutput, rdpSettings.SendPreconnectionPdu, rdpSettings.OrderSupport], [rdpsettings_interface=stable],, [[#include ]]) # If not current, check for legacy interface if test "x${rdpsettings_interface}" = "xunknown" then AC_CHECK_MEMBERS([rdpSettings.width, rdpSettings.height, rdpSettings.order_support], [rdpsettings_interface=legacy],, [[#include ]]) fi # Set defines based on interface type, warn if unknown if test "x${rdpsettings_interface}" = "xlegacy"; then AC_DEFINE([LEGACY_RDPSETTINGS],, [Whether the legacy version of the rdpSettings API was found]) # Legacy interface may not have AudioPlayback settings AC_CHECK_MEMBERS([rdpSettings.audio_playback],, [rdpsettings_audioplayback=no], [[#include ]]) # Legacy interface may not have DeviceRedirection settings AC_CHECK_MEMBERS([rdpSettings.device_redirection],, [rdpsettings_deviceredirection=no], [[#include ]]) elif test "x${rdpsettings_interface}" = "xunknown"; then AC_MSG_WARN([ -------------------------------------------- Unknown rdpSettings interface RDP will be disabled. --------------------------------------------]) have_freerdp=no fi fi # Activate audio playback settings if present if test "x${have_freerdp}" = "xyes" -a "x${rdpsettings_audioplayback}" = "xyes"; then AC_DEFINE([HAVE_RDPSETTINGS_AUDIOPLAYBACK],, [Whether the rdpSettings structure has AudioPlayback settings]) fi # Activate device redirection settings if present if test "x${have_freerdp}" = "xyes" -a "x${rdpsettings_deviceredirection}" = "xyes"; then AC_DEFINE([HAVE_RDPSETTINGS_DEVICEREDIRECTION],, [Whether the rdpSettings structure has DeviceRedirection settings]) fi # Check if the type CHANNEL_ENTRY_POINTS_FREERDP exists, if not define it to CHANNEL_ENTRY_POINTS_EX if test "x${have_freerdp}" = "xyes" then AC_CHECK_TYPE([CHANNEL_ENTRY_POINTS_FREERDP],, AC_DEFINE([CHANNEL_ENTRY_POINTS_FREERDP],[CHANNEL_ENTRY_POINTS_EX], [Type compatibility]), [[#include ]]) fi # Check if the freerdp version header exists if test "x${have_freerdp}" = "xyes" then AC_CHECK_HEADERS([freerdp/version.h]) fi # # FreeRDP: rdpBitmap # if test "x${have_freerdp}" = "xyes" then AC_MSG_CHECKING([whether rdpBitmap.Decompress() requires the codec_id]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include #include void __decompress(rdpContext* context, rdpBitmap* bitmap, UINT8* data, int width, int height, int bpp, int length, BOOL compressed, int codec_id); rdpBitmap b = { .Decompress = __decompress };]])], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_DEFINE([LEGACY_RDPBITMAP],, [Whether the legacy rdpBitmap API was found])]) fi # # FreeRDP: Decompression function variants # # Check whether interleaved_decompress() can handle the palette if test "x${have_freerdp}" = "xyes" then AC_MSG_CHECKING([whether interleaved_decompress() accepts an additional palette parameter]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include int main() { BYTE* palette = NULL; interleaved_decompress(NULL, NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, palette); }]])], [AC_MSG_RESULT([yes]) AC_DEFINE([INTERLEAVED_DECOMPRESS_TAKES_PALETTE],, [Whether interleaved_decompress() accepts an additional palette parameter])], [AC_MSG_RESULT([no])]) fi # Check whether planar_decompress() will handle flipping if test "x${have_freerdp}" = "xyes" then AC_MSG_CHECKING([whether planar_decompress() can flip]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include int main() { BOOL* flip = TRUE; planar_decompress(NULL, NULL, 0, NULL, 0, 0, 0, 0, 0, 0, flip); }]])], [AC_MSG_RESULT([yes]) AC_DEFINE([PLANAR_DECOMPRESS_CAN_FLIP],, [Whether planar_decompress() can flip])], [AC_MSG_RESULT([no])]) fi # # FreeRDP: rdpContext # # Check for rdpContext.codecs if test "x${have_freerdp}" = "xyes" then AC_CHECK_MEMBERS([rdpContext.codecs], [AC_DEFINE([FREERDP_BITMAP_REQUIRES_ALIGNED_MALLOC],, [Whether this version of FreeRDP requires _aligned_malloc() for bitmap data])],, [[#include ]]) fi # # FreeRDP: rdpPalette # if test "x${have_freerdp}" = "xyes" then AC_MSG_CHECKING([whether rdpPalette.entries is static]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include rdpPalette p; PALETTE_ENTRY* foo = p.entries;]])], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_DEFINE([LEGACY_RDPPALETTE],, [Whether the legacy rdpPalette API was found])]) fi # # FreeRDP: rdpPointer # # Check for SetDefault and SetNull members of rdpPointer if test "x${have_freerdp}" = "xyes" then AC_CHECK_MEMBERS([rdpPointer.SetDefault, rdpPointer.SetNull], ,, [[#include ]]) fi # # FreeRDP: wMessage / RDP_EVENT # # Check for current (as of 1.1) wMessage interface if test "x${have_freerdp}" = "xyes" then AC_CHECK_MEMBERS([wMessage.id], [event_interface=stable],, [[#include ]]) # If not current, check for legacy (RDP_EVENT) interface if test "x${event_interface}" = "xunknown" then AC_CHECK_MEMBERS([RDP_EVENT.event_class], [event_interface=legacy],, [[#include ]]) fi # Set defines based on interface type, warn if unknown if test "x${event_interface}" = "xlegacy"; then AC_DEFINE([LEGACY_EVENT],, [Whether the legacy RDP_EVENT API was found]) elif test "x${event_interface}" = "xunknown"; then AC_MSG_WARN([ -------------------------------------------- Unknown event interface RDP will be disabled. --------------------------------------------]) have_freerdp=no fi fi AM_CONDITIONAL([LEGACY_FREERDP_EXTENSIONS], [test "x${legacy_freerdp_extensions}" = "xyes"]) AM_CONDITIONAL([ENABLE_DISPLAY_UPDATE], [test "x${have_disp}" = "xyes"]) AM_CONDITIONAL([ENABLE_WINPR], [test "x${have_winpr}" = "xyes"]) AM_CONDITIONAL([ENABLE_RDP], [test "x${have_freerdp}" = "xyes"]) AC_SUBST(RDP_LIBS) # # libssh2 # have_libssh2=disabled SSH_LIBS= AC_ARG_WITH([ssh], [AS_HELP_STRING([--with-ssh], [support SSH @<:@default=check@:>@])], [], [with_ssh=check]) AC_ARG_ENABLE(ssh_agent, [AS_HELP_STRING([--enable-ssh-agent], [enable built-in ssh-agent]) ],enable_ssh_agent=yes) if test "x$with_ssh" != "xno" then have_libssh2=yes AC_CHECK_LIB([ssh2], [libssh2_session_init_ex], [SSH_LIBS="$SSH_LIBS -lssh2"], [have_libssh2=no]) fi AM_CONDITIONAL([ENABLE_COMMON_SSH], [test "x${have_libssh2}" = "xyes" \ -a "x${have_ssl}" = "xyes"]) AM_COND_IF([ENABLE_COMMON_SSH], [AC_DEFINE([ENABLE_COMMON_SSH],, [Whether support for the common SSH core is enabled])]) AM_CONDITIONAL([ENABLE_SSH], [test "x${have_libssh2}" = "xyes" \ -a "x${have_terminal}" = "xyes" \ -a "x${have_ssl}" = "xyes"]) AC_SUBST(SSH_LIBS) # # Underlying crypto library usage of libssh2 # if test "x${have_libssh2}" = "xyes" then # Whether libssh2 was built against libgcrypt AC_CHECK_LIB([ssh2], [gcry_control], [AC_CHECK_HEADER(gcrypt.h, [AC_DEFINE([LIBSSH2_USES_GCRYPT],, [Whether libssh2 was built against libgcrypt])], [AC_MSG_WARN([ -------------------------------------------- libssh2 appears to be built against libgcrypt, but the libgcrypt headers could not be found. SSH will be disabled. --------------------------------------------]) have_libssh2=no])]) fi # # Agent forwarding support within libssh2 # have_ssh_agent=no if test "x${have_libssh2}" = "xyes" -a "x${enable_ssh_agent}" = "xyes" then AC_CHECK_DECL([libssh2_channel_request_auth_agent], [have_ssh_agent=yes], [], [[#include ]]) if test "x${have_ssh_agent}" = "xno" then AC_MSG_ERROR([ -------------------------------------------- Agent forwarding support was requested but no such support was found in libssh2. --------------------------------------------]) else AC_DEFINE([ENABLE_SSH_AGENT],, [Whether agent forwarding support for SSH is enabled]) fi fi AM_CONDITIONAL([ENABLE_SSH_AGENT], [test "x${have_ssh_agent}" = "xyes" \ -a "x${enable_ssh_agent}" = "xyes"]) # # libtelnet # have_libtelnet=disabled TELNET_LIBS= AC_ARG_WITH([telnet], [AS_HELP_STRING([--with-telnet], [support Telnet @<:@default=check@:>@])], [], [with_telnet=check]) if test "x$with_telnet" != "xno" then have_libtelnet=yes AC_CHECK_LIB([telnet], [telnet_init], [TELNET_LIBS="$TELNET_LIBS -ltelnet"], [have_libtelnet=no]) fi AM_CONDITIONAL([ENABLE_TELNET], [test "x${have_libtelnet}" = "xyes" \ -a "x${have_terminal}" = "xyes"]) AC_SUBST(TELNET_LIBS) # # libwebp # have_webp=disabled WEBP_LIBS= AC_ARG_WITH([webp], [AS_HELP_STRING([--with-webp], [support WebP image encoding @<:@default=check@:>@])], [], [with_webp=check]) if test "x$with_webp" != "xno" then have_webp=yes AC_CHECK_HEADER(webp/encode.h,, [have_webp=no]) AC_CHECK_LIB([webp], [WebPEncode], [WEBP_LIBS="$WEBP_LIBS -lwebp"], [have_webp=no]) if test "x${have_webp}" = "xno" then AC_MSG_WARN([ -------------------------------------------- Unable to find libwebp. Images will not be encoded using WebP. --------------------------------------------]) else AC_DEFINE([ENABLE_WEBP],, [Whether WebP support is enabled]) fi fi AM_CONDITIONAL([ENABLE_WEBP], [test "x${have_webp}" = "xyes"]) AC_SUBST(WEBP_LIBS) AC_CONFIG_FILES([Makefile tests/Makefile src/common/Makefile src/common-ssh/Makefile src/terminal/Makefile src/libguac/Makefile src/guacd/Makefile src/protocols/rdp/Makefile src/protocols/ssh/Makefile src/protocols/telnet/Makefile src/protocols/vnc/Makefile]) AC_OUTPUT AM_COND_IF([ENABLE_RDP], [build_rdp=yes], [build_rdp=no]) AM_COND_IF([ENABLE_SSH], [build_ssh=yes], [build_ssh=no]) AM_COND_IF([ENABLE_TELNET], [build_telnet=yes], [build_telnet=no]) AM_COND_IF([ENABLE_VNC], [build_vnc=yes], [build_vnc=no]) AM_COND_IF([ENABLE_INIT], [build_init="${init_dir}"], [build_init=no]) echo " ------------------------------------------------ $PACKAGE_NAME version $PACKAGE_VERSION ------------------------------------------------ Library status: freerdp ............. ${have_freerdp} pango ............... ${have_pango} libssh2 ............. ${have_libssh2} libssl .............. ${have_ssl} libtelnet ........... ${have_libtelnet} libVNCServer ........ ${have_libvncserver} libvorbis ........... ${have_vorbis} libpulse ............ ${have_pulse} libwebp ............. ${have_webp} Protocol support: RDP ....... ${build_rdp} SSH ....... ${build_ssh} Telnet .... ${build_telnet} VNC ....... ${build_vnc} Init scripts: ${build_init} Type \"make\" to compile $PACKAGE_NAME. " guacamole-server-0.9.9/LICENSE0000664000175100017510000000204112536405624012730 00000000000000Copyright (C) 2013 Glyptodon LLC 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. guacamole-server-0.9.9/ltmain.sh0000644000175100017510000105152212645400272013545 00000000000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.2 TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 guacamole-server-0.9.9/AUTHORS0000664000175100017510000000102312626133327012770 00000000000000Michael Jumper James Muehlner Matt Hortman Jocelyn Delalande David Lechevalier Alexandre Devely Laurent Meunier Saul Gio Perez Tom Sealy Felipe Weckx Ruggero Vecchio Denis Bernacci Frode Langelo Daryl Borth guacamole-server-0.9.9/compile0000755000175100017510000001624512645400275013310 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # Written by Tom Tromey . # # 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: guacamole-server-0.9.9/Makefile.am0000664000175100017510000000353512626133327013766 00000000000000# # Copyright (C) 2015 Glyptodon LLC # # 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. # ACLOCAL_AMFLAGS = -I m4 # Subprojects DIST_SUBDIRS = \ src/libguac \ src/common \ src/common-ssh \ src/terminal \ src/guacd \ src/protocols/rdp \ src/protocols/ssh \ src/protocols/telnet \ src/protocols/vnc \ tests SUBDIRS = \ src/libguac \ src/common \ src/guacd \ tests if ENABLE_COMMON_SSH SUBDIRS += src/common-ssh endif if ENABLE_TERMINAL SUBDIRS += src/terminal endif if ENABLE_RDP SUBDIRS += src/protocols/rdp endif if ENABLE_SSH SUBDIRS += src/protocols/ssh endif if ENABLE_TELNET SUBDIRS += src/protocols/telnet endif if ENABLE_VNC SUBDIRS += src/protocols/vnc endif EXTRA_DIST = \ LICENSE \ bin/guacctl \ doc/Doxyfile guacamole-server-0.9.9/install-sh0000755000175100017510000003325512645400275013736 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # 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 # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: guacamole-server-0.9.9/configure0000775000175100017510000201101612645400274013633 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for guacamole-server 0.9.9. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='guacamole-server' PACKAGE_TARNAME='guacamole-server' PACKAGE_VERSION='0.9.9' PACKAGE_STRING='guacamole-server 0.9.9' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS WEBP_LIBS ENABLE_WEBP_FALSE ENABLE_WEBP_TRUE TELNET_LIBS ENABLE_TELNET_FALSE ENABLE_TELNET_TRUE ENABLE_SSH_AGENT_FALSE ENABLE_SSH_AGENT_TRUE SSH_LIBS ENABLE_SSH_FALSE ENABLE_SSH_TRUE ENABLE_COMMON_SSH_FALSE ENABLE_COMMON_SSH_TRUE RDP_LIBS ENABLE_RDP_FALSE ENABLE_RDP_TRUE ENABLE_WINPR_FALSE ENABLE_WINPR_TRUE ENABLE_DISPLAY_UPDATE_FALSE ENABLE_DISPLAY_UPDATE_TRUE LEGACY_FREERDP_EXTENSIONS_FALSE LEGACY_FREERDP_EXTENSIONS_TRUE VNC_LIBS ENABLE_VNC_FALSE ENABLE_VNC_TRUE ENABLE_TERMINAL_FALSE ENABLE_TERMINAL_TRUE PANGOCAIRO_LIBS PANGOCAIRO_CFLAGS PANGO_LIBS PANGO_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG PULSE_LIBS ENABLE_PULSE_FALSE ENABLE_PULSE_TRUE VORBIS_LIBS ENABLE_OGG_FALSE ENABLE_OGG_TRUE SSL_LIBS ENABLE_SSL_FALSE ENABLE_SSL_TRUE init_dir ENABLE_INIT_FALSE ENABLE_INIT_TRUE TERMINAL_INCLUDE TERMINAL_LTLIB COMMON_SSH_INCLUDE COMMON_SSH_LTLIB COMMON_INCLUDE COMMON_LTLIB LIBGUAC_INCLUDE LIBGUAC_LTLIB CUNIT_LIBS UUID_LIBS PTHREAD_LIBS CAIRO_LIBS JPEG_LIBS PNG_LIBS MATH_LIBS LIBADD_DLOPEN CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_shared enable_static with_pic enable_fast_install enable_dependency_tracking with_gnu_ld with_sysroot enable_libtool_lock with_init_dir with_guacd_conf with_ssl with_vorbis with_pulse with_pango with_terminal with_vnc with_rdp with_ssh enable_ssh_agent with_telnet with_webp ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR PANGO_CFLAGS PANGO_LIBS PANGOCAIRO_CFLAGS PANGOCAIRO_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures guacamole-server 0.9.9 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/guacamole-server] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of guacamole-server 0.9.9:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-libtool-lock avoid locking (might break parallel builds) --enable-ssh-agent enable built-in ssh-agent Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-init-dir= install init scripts to the given directory --with-guacd-conf= the full path to the guacd config file [default=/etc/guacamole/guacd.conf] --with-ssl support SSL encryption [default=check] --with-vorbis support Ogg Vorbis [default=check] --with-pulse support PulseAudio [default=check] --with-pango support Pango text layout [default=check] --with-terminal support text-based protocols [default=check] --with-vnc support VNC [default=check] --with-rdp support RDP [default=check] --with-ssh support SSH [default=check] --with-telnet support Telnet [default=check] --with-webp support WebP image encoding [default=check] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path PANGO_CFLAGS C compiler flags for PANGO, overriding pkg-config PANGO_LIBS linker flags for PANGO, overriding pkg-config PANGOCAIRO_CFLAGS C compiler flags for PANGOCAIRO, overriding pkg-config PANGOCAIRO_LIBS linker flags for PANGOCAIRO, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF guacamole-server configure 0.9.9 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES # --------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by guacamole-server $as_me 0.9.9, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.14' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='guacamole-server' VERSION='0.9.9' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_dlopen=yes enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ac_config_commands="$ac_config_commands libtool" # Only expand once: ac_config_headers="$ac_config_headers config.h" # Programs ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 $as_echo_n "checking for $CC option to accept ISO C99... " >&6; } if ${ac_cv_prog_cc_c99+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include // Check varargs macros. These examples are taken from C99 6.10.3.5. #define debug(...) fprintf (stderr, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK your preprocessor is broken; #endif #if BIG_OK #else your preprocessor is broken; #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\0'; ++i) continue; return 0; } // Check varargs and va_copy. static void test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str; int number; float fnumber; while (*format) { switch (*format++) { case 's': // string str = va_arg (args_copy, const char *); break; case 'd': // int number = va_arg (args_copy, int); break; case 'f': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); } int main () { // Check bool. _Bool success = false; // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. test_varargs ("s, d' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' || dynamic_array[ni.number - 1] != 543); ; return 0; } _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c99" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c99" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 $as_echo "$ac_cv_prog_cc_c99" >&6; } ;; esac if test "x$ac_cv_prog_cc_c99" != xno; then : fi # Headers for ac_header in fcntl.h stdlib.h string.h sys/socket.h time.h sys/time.h syslog.h unistd.h cairo/cairo.h pngstruct.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Source characteristics $as_echo "#define _XOPEN_SOURCE 700" >>confdefs.h # Check for whether math library is required { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } if ${ac_cv_lib_m_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cos (); int main () { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes else ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = xyes; then : MATH_LIBS=-lm else ac_fn_c_check_decl "$LINENO" "cos" "ac_cv_have_decl_cos" "$ac_includes_default" if test "x$ac_cv_have_decl_cos" = xyes; then : else as_fn_error $? "\"Complex math functions are missing and no libm was found\"" "$LINENO" 5 #include fi fi # libpng { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_write_png in -lpng" >&5 $as_echo_n "checking for png_write_png in -lpng... " >&6; } if ${ac_cv_lib_png_png_write_png+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpng $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char png_write_png (); int main () { return png_write_png (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_png_png_write_png=yes else ac_cv_lib_png_png_write_png=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_write_png" >&5 $as_echo "$ac_cv_lib_png_png_write_png" >&6; } if test "x$ac_cv_lib_png_png_write_png" = xyes; then : PNG_LIBS=-lpng else as_fn_error $? "\"libpng is required for writing png messages\"" "$LINENO" 5 fi # libjpeg { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_start_compress in -ljpeg" >&5 $as_echo_n "checking for jpeg_start_compress in -ljpeg... " >&6; } if ${ac_cv_lib_jpeg_jpeg_start_compress+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljpeg $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jpeg_start_compress (); int main () { return jpeg_start_compress (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_jpeg_jpeg_start_compress=yes else ac_cv_lib_jpeg_jpeg_start_compress=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_start_compress" >&5 $as_echo "$ac_cv_lib_jpeg_jpeg_start_compress" >&6; } if test "x$ac_cv_lib_jpeg_jpeg_start_compress" = xyes; then : JPEG_LIBS=-ljpeg else as_fn_error $? "\"libjpeg is required for writing jpeg messages\"" "$LINENO" 5 fi # Cairo { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo_create in -lcairo" >&5 $as_echo_n "checking for cairo_create in -lcairo... " >&6; } if ${ac_cv_lib_cairo_cairo_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcairo $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cairo_create (); int main () { return cairo_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cairo_cairo_create=yes else ac_cv_lib_cairo_cairo_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cairo_cairo_create" >&5 $as_echo "$ac_cv_lib_cairo_cairo_create" >&6; } if test "x$ac_cv_lib_cairo_cairo_create" = xyes; then : CAIRO_LIBS=-lcairo else as_fn_error $? "\"Cairo is required for drawing instructions\"" "$LINENO" 5 fi # libpthread { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 $as_echo_n "checking for pthread_create in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_create=yes else ac_cv_lib_pthread_pthread_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 $as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : PTHREAD_LIBS=-lpthread $as_echo "#define HAVE_LIBPTHREAD /**/" >>confdefs.h fi # OSSP UUID { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uuid_make in -lossp-uuid" >&5 $as_echo_n "checking for uuid_make in -lossp-uuid... " >&6; } if ${ac_cv_lib_ossp_uuid_uuid_make+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lossp-uuid $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char uuid_make (); int main () { return uuid_make (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ossp_uuid_uuid_make=yes else ac_cv_lib_ossp_uuid_uuid_make=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ossp_uuid_uuid_make" >&5 $as_echo "$ac_cv_lib_ossp_uuid_uuid_make" >&6; } if test "x$ac_cv_lib_ossp_uuid_uuid_make" = xyes; then : UUID_LIBS=-lossp-uuid else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uuid_make in -luuid" >&5 $as_echo_n "checking for uuid_make in -luuid... " >&6; } if ${ac_cv_lib_uuid_uuid_make+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-luuid $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char uuid_make (); int main () { return uuid_make (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_uuid_uuid_make=yes else ac_cv_lib_uuid_uuid_make=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_uuid_uuid_make" >&5 $as_echo "$ac_cv_lib_uuid_uuid_make" >&6; } if test "x$ac_cv_lib_uuid_uuid_make" = xyes; then : UUID_LIBS=-luuid else as_fn_error $? "\"The OSSP UUID library is required\"" "$LINENO" 5 fi fi # Check for and validate OSSP uuid.h header for ac_header in ossp/uuid.h do : ac_fn_c_check_header_mongrel "$LINENO" "ossp/uuid.h" "ac_cv_header_ossp_uuid_h" "$ac_includes_default" if test "x$ac_cv_header_ossp_uuid_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_OSSP_UUID_H 1 _ACEOF fi done ac_fn_c_check_decl "$LINENO" "uuid_make" "ac_cv_have_decl_uuid_make" "#ifdef HAVE_OSSP_UUID_H #include #else #include #endif " if test "x$ac_cv_have_decl_uuid_make" = xyes; then : else as_fn_error $? "\"No OSSP uuid.h found in include path\"" "$LINENO" 5 fi # cunit { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CU_run_test in -lcunit" >&5 $as_echo_n "checking for CU_run_test in -lcunit... " >&6; } if ${ac_cv_lib_cunit_CU_run_test+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcunit $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char CU_run_test (); int main () { return CU_run_test (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cunit_CU_run_test=yes else ac_cv_lib_cunit_CU_run_test=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cunit_CU_run_test" >&5 $as_echo "$ac_cv_lib_cunit_CU_run_test" >&6; } if test "x$ac_cv_lib_cunit_CU_run_test" = xyes; then : CUNIT_LIBS=-lcunit fi # WinSock { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lwsock32" >&5 $as_echo_n "checking for main in -lwsock32... " >&6; } if ${ac_cv_lib_wsock32_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lwsock32 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_wsock32_main=yes else ac_cv_lib_wsock32_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_wsock32_main" >&5 $as_echo "$ac_cv_lib_wsock32_main" >&6; } if test "x$ac_cv_lib_wsock32_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBWSOCK32 1 _ACEOF LIBS="-lwsock32 $LIBS" fi # Library functions for ac_func in clock_gettime gettimeofday memmove memset select strdup nanosleep do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_decl "$LINENO" "png_get_io_ptr" "ac_cv_have_decl_png_get_io_ptr" "#include " if test "x$ac_cv_have_decl_png_get_io_ptr" = xyes; then : $as_echo "#define HAVE_PNG_GET_IO_PTR /**/" >>confdefs.h fi ac_fn_c_check_decl "$LINENO" "cairo_format_stride_for_width" "ac_cv_have_decl_cairo_format_stride_for_width" "#include " if test "x$ac_cv_have_decl_cairo_format_stride_for_width" = xyes; then : $as_echo "#define HAVE_CAIRO_FORMAT_STRIDE_FOR_WIDTH /**/" >>confdefs.h fi # Typedefs ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" if test "x$ac_cv_type_ssize_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define ssize_t int _ACEOF fi # Bundled libguac LIBGUAC_LTLIB='$(top_builddir)/src/libguac/libguac.la' LIBGUAC_INCLUDE='-I$(top_srcdir)/src/libguac' # Common non-libguac utility library COMMON_LTLIB='$(top_builddir)/src/common/libguac_common.la' COMMON_INCLUDE='-I$(top_srcdir)/src/common' # Common base SSH client COMMON_SSH_LTLIB='$(top_builddir)/src/common-ssh/libguac_common_ssh.la' COMMON_SSH_INCLUDE='-I$(top_srcdir)/src/common-ssh' # Terminal emulator TERMINAL_LTLIB='$(top_builddir)/src/terminal/libguac_terminal.la' TERMINAL_INCLUDE='-I$(top_srcdir)/src/terminal $(PANGO_CFLAGS) $(PANGOCAIRO_CFLAGS) $(COMMON_INCLUDE)' # Init directory # Check whether --with-init_dir was given. if test "${with_init_dir+set}" = set; then : withval=$with_init_dir; init_dir=$withval fi if test "x${init_dir}" != "x"; then ENABLE_INIT_TRUE= ENABLE_INIT_FALSE='#' else ENABLE_INIT_TRUE='#' ENABLE_INIT_FALSE= fi # guacd config file # Check whether --with-guacd_conf was given. if test "${with_guacd_conf+set}" = set; then : withval=$with_guacd_conf; guacd_conf=$withval else guacd_conf=/etc/guacamole/guacd.conf fi cat >>confdefs.h <<_ACEOF #define GUACD_CONF_FILE "$guacd_conf" _ACEOF # # libssl # have_ssl=disabled SSL_LIBS= # Check whether --with-ssl was given. if test "${with_ssl+set}" = set; then : withval=$with_ssl; else with_ssl=check fi if test "x$with_ssl" != "xno" then have_ssl=yes ac_fn_c_check_header_mongrel "$LINENO" "openssl/ssl.h" "ac_cv_header_openssl_ssl_h" "$ac_includes_default" if test "x$ac_cv_header_openssl_ssl_h" = xyes; then : else have_ssl=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_CTX_new in -lssl" >&5 $as_echo_n "checking for SSL_CTX_new in -lssl... " >&6; } if ${ac_cv_lib_ssl_SSL_CTX_new+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lssl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char SSL_CTX_new (); int main () { return SSL_CTX_new (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ssl_SSL_CTX_new=yes else ac_cv_lib_ssl_SSL_CTX_new=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ssl_SSL_CTX_new" >&5 $as_echo "$ac_cv_lib_ssl_SSL_CTX_new" >&6; } if test "x$ac_cv_lib_ssl_SSL_CTX_new" = xyes; then : SSL_LIBS="$SSL_LIBS -lssl" else have_ssl=no fi if test "x${have_ssl}" = "xno" then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -------------------------------------------- Unable to find libssl. guacd will not support SSL connections. --------------------------------------------" >&5 $as_echo "$as_me: WARNING: -------------------------------------------- Unable to find libssl. guacd will not support SSL connections. --------------------------------------------" >&2;} else $as_echo "#define ENABLE_SSL /**/" >>confdefs.h fi fi if test "x${have_ssl}" = "xyes"; then ENABLE_SSL_TRUE= ENABLE_SSL_FALSE='#' else ENABLE_SSL_TRUE='#' ENABLE_SSL_FALSE= fi # # Ogg Vorbis # have_vorbis=disabled VORBIS_LIBS= # Check whether --with-vorbis was given. if test "${with_vorbis+set}" = set; then : withval=$with_vorbis; else with_vorbis=check fi if test "x$with_vorbis" != "xno" then have_vorbis=yes ac_fn_c_check_header_mongrel "$LINENO" "vorbis/vorbisenc.h" "ac_cv_header_vorbis_vorbisenc_h" "$ac_includes_default" if test "x$ac_cv_header_vorbis_vorbisenc_h" = xyes; then : else have_vorbis=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ogg_stream_init in -logg" >&5 $as_echo_n "checking for ogg_stream_init in -logg... " >&6; } if ${ac_cv_lib_ogg_ogg_stream_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-logg $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ogg_stream_init (); int main () { return ogg_stream_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ogg_ogg_stream_init=yes else ac_cv_lib_ogg_ogg_stream_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ogg_ogg_stream_init" >&5 $as_echo "$ac_cv_lib_ogg_ogg_stream_init" >&6; } if test "x$ac_cv_lib_ogg_ogg_stream_init" = xyes; then : VORBIS_LIBS="$VORBIS_LIBS -logg" else have_vorbis=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vorbis_block_init in -lvorbis" >&5 $as_echo_n "checking for vorbis_block_init in -lvorbis... " >&6; } if ${ac_cv_lib_vorbis_vorbis_block_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lvorbis $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char vorbis_block_init (); int main () { return vorbis_block_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_vorbis_vorbis_block_init=yes else ac_cv_lib_vorbis_vorbis_block_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_vorbis_vorbis_block_init" >&5 $as_echo "$ac_cv_lib_vorbis_vorbis_block_init" >&6; } if test "x$ac_cv_lib_vorbis_vorbis_block_init" = xyes; then : VORBIS_LIBS="$VORBIS_LIBS -lvorbis" else have_vorbis=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vorbis_encode_init in -lvorbisenc" >&5 $as_echo_n "checking for vorbis_encode_init in -lvorbisenc... " >&6; } if ${ac_cv_lib_vorbisenc_vorbis_encode_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lvorbisenc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char vorbis_encode_init (); int main () { return vorbis_encode_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_vorbisenc_vorbis_encode_init=yes else ac_cv_lib_vorbisenc_vorbis_encode_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_vorbisenc_vorbis_encode_init" >&5 $as_echo "$ac_cv_lib_vorbisenc_vorbis_encode_init" >&6; } if test "x$ac_cv_lib_vorbisenc_vorbis_encode_init" = xyes; then : VORBIS_LIBS="$VORBIS_LIBS -lvorbisenc" else have_vorbis=no fi if test "x${have_vorbis}" = "xno" then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -------------------------------------------- Unable to find libogg / libvorbis / libvorbisenc. Sound will not be encoded with Ogg Vorbis. --------------------------------------------" >&5 $as_echo "$as_me: WARNING: -------------------------------------------- Unable to find libogg / libvorbis / libvorbisenc. Sound will not be encoded with Ogg Vorbis. --------------------------------------------" >&2;} else $as_echo "#define ENABLE_OGG /**/" >>confdefs.h fi fi if test "x${have_vorbis}" = "xyes"; then ENABLE_OGG_TRUE= ENABLE_OGG_FALSE='#' else ENABLE_OGG_TRUE='#' ENABLE_OGG_FALSE= fi # # PulseAudio # have_pulse=disabled PULSE_LIBS= # Check whether --with-pulse was given. if test "${with_pulse+set}" = set; then : withval=$with_pulse; else with_pulse=check fi if test "x$with_pulse" != "xno" then have_pulse=yes { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pa_context_new in -lpulse" >&5 $as_echo_n "checking for pa_context_new in -lpulse... " >&6; } if ${ac_cv_lib_pulse_pa_context_new+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpulse $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pa_context_new (); int main () { return pa_context_new (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pulse_pa_context_new=yes else ac_cv_lib_pulse_pa_context_new=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pulse_pa_context_new" >&5 $as_echo "$ac_cv_lib_pulse_pa_context_new" >&6; } if test "x$ac_cv_lib_pulse_pa_context_new" = xyes; then : PULSE_LIBS="$PULSE_LIBS -lpulse" else have_pulse=no fi if test "x${have_pulse}" = "xno" then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -------------------------------------------- Unable to find libpulse Sound support for VNC will be disabled --------------------------------------------" >&5 $as_echo "$as_me: WARNING: -------------------------------------------- Unable to find libpulse Sound support for VNC will be disabled --------------------------------------------" >&2;} else $as_echo "#define ENABLE_PULSE /**/" >>confdefs.h fi fi if test "x${have_pulse}" = "xyes"; then ENABLE_PULSE_TRUE= ENABLE_PULSE_FALSE='#' else ENABLE_PULSE_TRUE='#' ENABLE_PULSE_FALSE= fi # # PANGO # have_pango=disabled # Check whether --with-pango was given. if test "${with_pango+set}" = set; then : withval=$with_pango; else with_pango=check fi if test "x$with_pango" != "xno" then have_pango=yes if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PANGO" >&5 $as_echo_n "checking for PANGO... " >&6; } if test -n "$PANGO_CFLAGS"; then pkg_cv_PANGO_CFLAGS="$PANGO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"pango\""; } >&5 ($PKG_CONFIG --exists --print-errors "pango") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PANGO_CFLAGS=`$PKG_CONFIG --cflags "pango" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PANGO_LIBS"; then pkg_cv_PANGO_LIBS="$PANGO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"pango\""; } >&5 ($PKG_CONFIG --exists --print-errors "pango") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PANGO_LIBS=`$PKG_CONFIG --libs "pango" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PANGO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "pango" 2>&1` else PANGO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "pango" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PANGO_PKG_ERRORS" >&5 have_pango=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } have_pango=no else PANGO_CFLAGS=$pkg_cv_PANGO_CFLAGS PANGO_LIBS=$pkg_cv_PANGO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi; pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PANGOCAIRO" >&5 $as_echo_n "checking for PANGOCAIRO... " >&6; } if test -n "$PANGOCAIRO_CFLAGS"; then pkg_cv_PANGOCAIRO_CFLAGS="$PANGOCAIRO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"pangocairo\""; } >&5 ($PKG_CONFIG --exists --print-errors "pangocairo") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PANGOCAIRO_CFLAGS=`$PKG_CONFIG --cflags "pangocairo" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PANGOCAIRO_LIBS"; then pkg_cv_PANGOCAIRO_LIBS="$PANGOCAIRO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"pangocairo\""; } >&5 ($PKG_CONFIG --exists --print-errors "pangocairo") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PANGOCAIRO_LIBS=`$PKG_CONFIG --libs "pangocairo" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PANGOCAIRO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "pangocairo" 2>&1` else PANGOCAIRO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "pangocairo" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PANGOCAIRO_PKG_ERRORS" >&5 have_pango=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } have_pango=no else PANGOCAIRO_CFLAGS=$pkg_cv_PANGOCAIRO_CFLAGS PANGOCAIRO_LIBS=$pkg_cv_PANGOCAIRO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi; fi # # Terminal emulator # have_terminal=disabled # Check whether --with-terminal was given. if test "${with_terminal+set}" = set; then : withval=$with_terminal; else with_terminal=check fi if test "x$with_terminal" != "xno" then have_terminal=yes if test "x${have_pango}" = "xno" then have_terminal=no fi fi if test "x${have_terminal}" = "xyes"; then ENABLE_TERMINAL_TRUE= ENABLE_TERMINAL_FALSE='#' else ENABLE_TERMINAL_TRUE='#' ENABLE_TERMINAL_FALSE= fi # # libVNCServer # have_libvncserver=disabled VNC_LIBS= # Check whether --with-vnc was given. if test "${with_vnc+set}" = set; then : withval=$with_vnc; else with_vnc=check fi if test "x$with_vnc" != "xno" then have_libvncserver=yes { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rfbInitClient in -lvncclient" >&5 $as_echo_n "checking for rfbInitClient in -lvncclient... " >&6; } if ${ac_cv_lib_vncclient_rfbInitClient+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lvncclient $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char rfbInitClient (); int main () { return rfbInitClient (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_vncclient_rfbInitClient=yes else ac_cv_lib_vncclient_rfbInitClient=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_vncclient_rfbInitClient" >&5 $as_echo "$ac_cv_lib_vncclient_rfbInitClient" >&6; } if test "x$ac_cv_lib_vncclient_rfbInitClient" = xyes; then : VNC_LIBS="$VNC_LIBS -lvncclient" else have_libvncserver=no fi fi if test "x${have_libvncserver}" = "xyes"; then ENABLE_VNC_TRUE= ENABLE_VNC_FALSE='#' else ENABLE_VNC_TRUE='#' ENABLE_VNC_FALSE= fi # # Repeater support within libVNCServer # if test "x${have_libvncserver}" = "xyes" then have_vnc_repeater=yes ac_fn_c_check_member "$LINENO" "rfbClient" "destHost" "ac_cv_member_rfbClient_destHost" "#include " if test "x$ac_cv_member_rfbClient_destHost" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RFBCLIENT_DESTHOST 1 _ACEOF else have_vnc_repeater=no fi ac_fn_c_check_member "$LINENO" "rfbClient" "destPort" "ac_cv_member_rfbClient_destPort" "#include " if test "x$ac_cv_member_rfbClient_destPort" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RFBCLIENT_DESTPORT 1 _ACEOF else have_vnc_repeater=no fi if test "x${have_vnc_repeater}" = "xno" then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -------------------------------------------- No repeater support found in libvncclient. Support for VNC repeaters will not be built. --------------------------------------------" >&5 $as_echo "$as_me: WARNING: -------------------------------------------- No repeater support found in libvncclient. Support for VNC repeaters will not be built. --------------------------------------------" >&2;} else $as_echo "#define ENABLE_VNC_REPEATER /**/" >>confdefs.h fi fi # # Listening support within libVNCServer # if test "x${have_libvncserver}" = "xyes" then have_vnc_listen=yes ac_fn_c_check_decl "$LINENO" "listenForIncomingConnectionsNoFork" "ac_cv_have_decl_listenForIncomingConnectionsNoFork" "#include " if test "x$ac_cv_have_decl_listenForIncomingConnectionsNoFork" = xyes; then : else have_vnc_listen=no fi if test "x${have_vnc_listen}" = "xno" then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -------------------------------------------- No listening support found in libvncclient. Support for listen-mode connections will not be built. --------------------------------------------" >&5 $as_echo "$as_me: WARNING: -------------------------------------------- No listening support found in libvncclient. Support for listen-mode connections will not be built. --------------------------------------------" >&2;} else $as_echo "#define ENABLE_VNC_LISTEN /**/" >>confdefs.h fi fi # # FreeRDP # have_freerdp=disabled RDP_LIBS= # Check whether --with-rdp was given. if test "${with_rdp+set}" = set; then : withval=$with_rdp; else with_rdp=check fi if test "x$with_rdp" != "xno" then have_winpr=yes have_freerdp=yes have_disp=yes legacy_freerdp_extensions=no rdpsettings_interface=unknown rdpsettings_audioplayback=yes rdpsettings_deviceredirection=yes freerdp_interface=unknown event_interface=unknown # libfreerdp-core / libfreerdp { $as_echo "$as_me:${as_lineno-$LINENO}: checking for freerdp_new in -lfreerdp-core" >&5 $as_echo_n "checking for freerdp_new in -lfreerdp-core... " >&6; } if ${ac_cv_lib_freerdp_core_freerdp_new+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfreerdp-core $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char freerdp_new (); int main () { return freerdp_new (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_freerdp_core_freerdp_new=yes else ac_cv_lib_freerdp_core_freerdp_new=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_freerdp_core_freerdp_new" >&5 $as_echo "$ac_cv_lib_freerdp_core_freerdp_new" >&6; } if test "x$ac_cv_lib_freerdp_core_freerdp_new" = xyes; then : RDP_LIBS="$RDP_LIBS -lfreerdp-core" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for freerdp_new in -lfreerdp" >&5 $as_echo_n "checking for freerdp_new in -lfreerdp... " >&6; } if ${ac_cv_lib_freerdp_freerdp_new+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfreerdp $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char freerdp_new (); int main () { return freerdp_new (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_freerdp_freerdp_new=yes else ac_cv_lib_freerdp_freerdp_new=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_freerdp_freerdp_new" >&5 $as_echo "$ac_cv_lib_freerdp_freerdp_new" >&6; } if test "x$ac_cv_lib_freerdp_freerdp_new" = xyes; then : RDP_LIBS="$RDP_LIBS -lfreerdp -lfreerdp-client" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -------------------------------------------- Unable to find libfreerdp-core / libfreerdp RDP will be disabled. --------------------------------------------" >&5 $as_echo "$as_me: WARNING: -------------------------------------------- Unable to find libfreerdp-core / libfreerdp RDP will be disabled. --------------------------------------------" >&2;} have_freerdp=no fi fi fi # libfreerdp-cache if test "x${have_freerdp}" = "xyes" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glyph_cache_register_callbacks in -lfreerdp-cache" >&5 $as_echo_n "checking for glyph_cache_register_callbacks in -lfreerdp-cache... " >&6; } if ${ac_cv_lib_freerdp_cache_glyph_cache_register_callbacks+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfreerdp-cache $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char glyph_cache_register_callbacks (); int main () { return glyph_cache_register_callbacks (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_freerdp_cache_glyph_cache_register_callbacks=yes else ac_cv_lib_freerdp_cache_glyph_cache_register_callbacks=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_freerdp_cache_glyph_cache_register_callbacks" >&5 $as_echo "$ac_cv_lib_freerdp_cache_glyph_cache_register_callbacks" >&6; } if test "x$ac_cv_lib_freerdp_cache_glyph_cache_register_callbacks" = xyes; then : RDP_LIBS="$RDP_LIBS -lfreerdp-cache" fi fi # libfreerdp-channels (1.0) / libfreerdp-client + libfreerdp-core (1.1) if test "x${have_freerdp}" = "xyes" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for freerdp_channels_new in -lfreerdp-client" >&5 $as_echo_n "checking for freerdp_channels_new in -lfreerdp-client... " >&6; } if ${ac_cv_lib_freerdp_client_freerdp_channels_new+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfreerdp-client -lfreerdp-core $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char freerdp_channels_new (); int main () { return freerdp_channels_new (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_freerdp_client_freerdp_channels_new=yes else ac_cv_lib_freerdp_client_freerdp_channels_new=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_freerdp_client_freerdp_channels_new" >&5 $as_echo "$ac_cv_lib_freerdp_client_freerdp_channels_new" >&6; } if test "x$ac_cv_lib_freerdp_client_freerdp_channels_new" = xyes; then : RDP_LIBS="$RDP_LIBS -lfreerdp-client" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for freerdp_channels_new in -lfreerdp-channels" >&5 $as_echo_n "checking for freerdp_channels_new in -lfreerdp-channels... " >&6; } if ${ac_cv_lib_freerdp_channels_freerdp_channels_new+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfreerdp-channels $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char freerdp_channels_new (); int main () { return freerdp_channels_new (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_freerdp_channels_freerdp_channels_new=yes else ac_cv_lib_freerdp_channels_freerdp_channels_new=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_freerdp_channels_freerdp_channels_new" >&5 $as_echo "$ac_cv_lib_freerdp_channels_freerdp_channels_new" >&6; } if test "x$ac_cv_lib_freerdp_channels_freerdp_channels_new" = xyes; then : RDP_LIBS="$RDP_LIBS -lfreerdp-channels" legacy_freerdp_extensions=yes fi fi fi # libfreerdp-utils if test "x${have_freerdp}" = "xyes" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for svc_plugin_init in -lfreerdp-utils" >&5 $as_echo_n "checking for svc_plugin_init in -lfreerdp-utils... " >&6; } if ${ac_cv_lib_freerdp_utils_svc_plugin_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfreerdp-utils $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char svc_plugin_init (); int main () { return svc_plugin_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_freerdp_utils_svc_plugin_init=yes else ac_cv_lib_freerdp_utils_svc_plugin_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_freerdp_utils_svc_plugin_init" >&5 $as_echo "$ac_cv_lib_freerdp_utils_svc_plugin_init" >&6; } if test "x$ac_cv_lib_freerdp_utils_svc_plugin_init" = xyes; then : RDP_LIBS="$RDP_LIBS -lfreerdp-utils" fi fi # libfreerdp-codec if test "x${have_freerdp}" = "xyes" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for freerdp_image_convert in -lfreerdp-codec" >&5 $as_echo_n "checking for freerdp_image_convert in -lfreerdp-codec... " >&6; } if ${ac_cv_lib_freerdp_codec_freerdp_image_convert+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfreerdp-codec $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char freerdp_image_convert (); int main () { return freerdp_image_convert (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_freerdp_codec_freerdp_image_convert=yes else ac_cv_lib_freerdp_codec_freerdp_image_convert=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_freerdp_codec_freerdp_image_convert" >&5 $as_echo "$ac_cv_lib_freerdp_codec_freerdp_image_convert" >&6; } if test "x$ac_cv_lib_freerdp_codec_freerdp_image_convert" = xyes; then : RDP_LIBS="$RDP_LIBS -lfreerdp-codec" fi fi # Available color conversion functions if test "x${have_freerdp}" = "xyes" then ac_fn_c_check_decl "$LINENO" "freerdp_convert_gdi_order_color" "ac_cv_have_decl_freerdp_convert_gdi_order_color" "#include " if test "x$ac_cv_have_decl_freerdp_convert_gdi_order_color" = xyes; then : $as_echo "#define HAVE_FREERDP_CONVERT_GDI_ORDER_COLOR /**/" >>confdefs.h fi ac_fn_c_check_decl "$LINENO" "freerdp_color_convert_drawing_order_color_to_gdi_color" "ac_cv_have_decl_freerdp_color_convert_drawing_order_color_to_gdi_color" "#include " if test "x$ac_cv_have_decl_freerdp_color_convert_drawing_order_color_to_gdi_color" = xyes; then : $as_echo "#define HAVE_FREERDP_COLOR_CONVERT_DRAWING_ORDER_COLOR_TO_GDI_COLOR /**/" >>confdefs.h fi fi # Check for interval polling in plugins if test "x${have_freerdp}" = "xyes" then ac_fn_c_check_member "$LINENO" "rdpSvcPlugin" "interval_ms" "ac_cv_member_rdpSvcPlugin_interval_ms" "#include " if test "x$ac_cv_member_rdpSvcPlugin_interval_ms" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RDPSVCPLUGIN_INTERVAL_MS 1 _ACEOF fi fi # Keyboard layout header if test "x${have_freerdp}" = "xyes" then for ac_header in freerdp/locale/keyboard.h do : ac_fn_c_check_header_mongrel "$LINENO" "freerdp/locale/keyboard.h" "ac_cv_header_freerdp_locale_keyboard_h" "$ac_includes_default" if test "x$ac_cv_header_freerdp_locale_keyboard_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FREERDP_LOCALE_KEYBOARD_H 1 _ACEOF else for ac_header in freerdp/kbd/layouts.h do : ac_fn_c_check_header_mongrel "$LINENO" "freerdp/kbd/layouts.h" "ac_cv_header_freerdp_kbd_layouts_h" "$ac_includes_default" if test "x$ac_cv_header_freerdp_kbd_layouts_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FREERDP_KBD_LAYOUTS_H 1 _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -------------------------------------------- Unable to find keyboard layout headers RDP will be disabled. --------------------------------------------" >&5 $as_echo "$as_me: WARNING: -------------------------------------------- Unable to find keyboard layout headers RDP will be disabled. --------------------------------------------" >&2;} have_freerdp=no fi done fi done fi # New headers defining addins if test "x${have_freerdp}" = "xyes" then for ac_header in freerdp/addin.h freerdp/client/channels.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done fi # Header defining cliprdr if test "x${have_freerdp}" = "xyes" then for ac_header in freerdp/client/cliprdr.h do : ac_fn_c_check_header_compile "$LINENO" "freerdp/client/cliprdr.h" "ac_cv_header_freerdp_client_cliprdr_h" "#include #include " if test "x$ac_cv_header_freerdp_client_cliprdr_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FREERDP_CLIENT_CLIPRDR_H 1 _ACEOF else for ac_header in freerdp/plugins/cliprdr.h do : ac_fn_c_check_header_compile "$LINENO" "freerdp/plugins/cliprdr.h" "ac_cv_header_freerdp_plugins_cliprdr_h" "#include " if test "x$ac_cv_header_freerdp_plugins_cliprdr_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FREERDP_PLUGINS_CLIPRDR_H 1 _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -------------------------------------------- Unable to find cliprdr headers RDP will be disabled. --------------------------------------------" >&5 $as_echo "$as_me: WARNING: -------------------------------------------- Unable to find cliprdr headers RDP will be disabled. --------------------------------------------" >&2;} have_freerdp=no fi done fi done fi # Header defining display update channel if test "x${have_freerdp}" = "xyes" then for ac_header in freerdp/client/disp.h do : ac_fn_c_check_header_compile "$LINENO" "freerdp/client/disp.h" "ac_cv_header_freerdp_client_disp_h" "#include #include " if test "x$ac_cv_header_freerdp_client_disp_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FREERDP_CLIENT_DISP_H 1 _ACEOF $as_echo "#define HAVE_FREERDP_DISPLAY_UPDATE_SUPPORT /**/" >>confdefs.h ac_fn_c_check_member "$LINENO" "rdpSettings" "SupportDisplayControl" "ac_cv_member_rdpSettings_SupportDisplayControl" "#include " if test "x$ac_cv_member_rdpSettings_SupportDisplayControl" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RDPSETTINGS_SUPPORTDISPLAYCONTROL 1 _ACEOF fi else have_disp=no fi done fi # Support for "PubSub" event system if test "x${have_freerdp}" = "xyes" then ac_fn_c_check_decl "$LINENO" "PubSub_SubscribeChannelConnected" "ac_cv_have_decl_PubSub_SubscribeChannelConnected" "#include " if test "x$ac_cv_have_decl_PubSub_SubscribeChannelConnected" = xyes; then : $as_echo "#define HAVE_FREERDP_EVENT_PUBSUB /**/" >>confdefs.h fi fi # Addin registration variations if test "x${have_freerdp}" = "xyes" then ac_fn_c_check_decl "$LINENO" "freerdp_register_addin_provider" "ac_cv_have_decl_freerdp_register_addin_provider" "#include " if test "x$ac_cv_have_decl_freerdp_register_addin_provider" = xyes; then : $as_echo "#define HAVE_FREERDP_REGISTER_ADDIN_PROVIDER /**/" >>confdefs.h fi ac_fn_c_check_decl "$LINENO" "freerdp_channels_global_init" "ac_cv_have_decl_freerdp_channels_global_init" "#include " if test "x$ac_cv_have_decl_freerdp_channels_global_init" = xyes; then : $as_echo "#define HAVE_FREERDP_CHANNELS_GLOBAL_INIT /**/" >>confdefs.h fi fi # # FreeRDP: WinPR # # Check for stream support via WinPR if test "x${have_freerdp}" = "xyes" then ac_fn_c_check_header_mongrel "$LINENO" "winpr/stream.h" "ac_cv_header_winpr_stream_h" "$ac_includes_default" if test "x$ac_cv_header_winpr_stream_h" = xyes; then : else have_winpr=no, ac_fn_c_check_decl "$LINENO" "stream_write_uint8" "ac_cv_have_decl_stream_write_uint8" "#include " if test "x$ac_cv_have_decl_stream_write_uint8" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -------------------------------------------- Unable to find stream support RDP will be disabled. --------------------------------------------" >&5 $as_echo "$as_me: WARNING: -------------------------------------------- Unable to find stream support RDP will be disabled. --------------------------------------------" >&2;} have_freerdp=no fi fi fi # Check for types in WinPR if test "x${have_freerdp}" = "xyes" then ac_fn_c_check_header_mongrel "$LINENO" "winpr/wtypes.h" "ac_cv_header_winpr_wtypes_h" "$ac_includes_default" if test "x$ac_cv_header_winpr_wtypes_h" = xyes; then : else have_winpr=no, ac_fn_c_check_header_mongrel "$LINENO" "freerdp/types.h" "ac_cv_header_freerdp_types_h" "$ac_includes_default" if test "x$ac_cv_header_freerdp_types_h" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -------------------------------------------- Unable to find type definitions RDP will be disabled. --------------------------------------------" >&5 $as_echo "$as_me: WARNING: -------------------------------------------- Unable to find type definitions RDP will be disabled. --------------------------------------------" >&2;} have_freerdp=no fi fi fi if test "x${have_freerdp}" = "xyes" -a "x${have_winpr}" = "xyes" then $as_echo "#define ENABLE_WINPR /**/" >>confdefs.h fi # # FreeRDP: freerdp # if test "x${have_freerdp}" = "xyes" then # Check for current (as of 1.1) freerdp interface ac_fn_c_check_member "$LINENO" "freerdp" "ContextSize" "ac_cv_member_freerdp_ContextSize" "#include " if test "x$ac_cv_member_freerdp_ContextSize" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FREERDP_CONTEXTSIZE 1 _ACEOF freerdp_interface=stable fi # If not current, check for legacy interface if test "x${freerdp_interface}" = "xunknown" then ac_fn_c_check_member "$LINENO" "freerdp" "context_size" "ac_cv_member_freerdp_context_size" "#include " if test "x$ac_cv_member_freerdp_context_size" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FREERDP_CONTEXT_SIZE 1 _ACEOF freerdp_interface=legacy fi fi # Set defines based on interface type, warn if unknown if test "x${freerdp_interface}" = "xlegacy"; then $as_echo "#define LEGACY_FREERDP /**/" >>confdefs.h elif test "x${freerdp_interface}" = "xunknown"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -------------------------------------------- Unknown FreeRDP interface RDP will be disabled. --------------------------------------------" >&5 $as_echo "$as_me: WARNING: -------------------------------------------- Unknown FreeRDP interface RDP will be disabled. --------------------------------------------" >&2;} have_freerdp=no fi fi # # FreeRDP: rdpSettings # if test "x${have_freerdp}" = "xyes" then # Check for current (as of 1.1) rdpSettings interface ac_fn_c_check_member "$LINENO" "rdpSettings" "Width" "ac_cv_member_rdpSettings_Width" "#include " if test "x$ac_cv_member_rdpSettings_Width" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RDPSETTINGS_WIDTH 1 _ACEOF rdpsettings_interface=stable fi ac_fn_c_check_member "$LINENO" "rdpSettings" "Height" "ac_cv_member_rdpSettings_Height" "#include " if test "x$ac_cv_member_rdpSettings_Height" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RDPSETTINGS_HEIGHT 1 _ACEOF rdpsettings_interface=stable fi ac_fn_c_check_member "$LINENO" "rdpSettings" "FastPathInput" "ac_cv_member_rdpSettings_FastPathInput" "#include " if test "x$ac_cv_member_rdpSettings_FastPathInput" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RDPSETTINGS_FASTPATHINPUT 1 _ACEOF rdpsettings_interface=stable fi ac_fn_c_check_member "$LINENO" "rdpSettings" "FastPathOutput" "ac_cv_member_rdpSettings_FastPathOutput" "#include " if test "x$ac_cv_member_rdpSettings_FastPathOutput" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RDPSETTINGS_FASTPATHOUTPUT 1 _ACEOF rdpsettings_interface=stable fi ac_fn_c_check_member "$LINENO" "rdpSettings" "SendPreconnectionPdu" "ac_cv_member_rdpSettings_SendPreconnectionPdu" "#include " if test "x$ac_cv_member_rdpSettings_SendPreconnectionPdu" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RDPSETTINGS_SENDPRECONNECTIONPDU 1 _ACEOF rdpsettings_interface=stable fi ac_fn_c_check_member "$LINENO" "rdpSettings" "OrderSupport" "ac_cv_member_rdpSettings_OrderSupport" "#include " if test "x$ac_cv_member_rdpSettings_OrderSupport" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RDPSETTINGS_ORDERSUPPORT 1 _ACEOF rdpsettings_interface=stable fi # If not current, check for legacy interface if test "x${rdpsettings_interface}" = "xunknown" then ac_fn_c_check_member "$LINENO" "rdpSettings" "width" "ac_cv_member_rdpSettings_width" "#include " if test "x$ac_cv_member_rdpSettings_width" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RDPSETTINGS_WIDTH 1 _ACEOF rdpsettings_interface=legacy fi ac_fn_c_check_member "$LINENO" "rdpSettings" "height" "ac_cv_member_rdpSettings_height" "#include " if test "x$ac_cv_member_rdpSettings_height" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RDPSETTINGS_HEIGHT 1 _ACEOF rdpsettings_interface=legacy fi ac_fn_c_check_member "$LINENO" "rdpSettings" "order_support" "ac_cv_member_rdpSettings_order_support" "#include " if test "x$ac_cv_member_rdpSettings_order_support" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RDPSETTINGS_ORDER_SUPPORT 1 _ACEOF rdpsettings_interface=legacy fi fi # Set defines based on interface type, warn if unknown if test "x${rdpsettings_interface}" = "xlegacy"; then $as_echo "#define LEGACY_RDPSETTINGS /**/" >>confdefs.h # Legacy interface may not have AudioPlayback settings ac_fn_c_check_member "$LINENO" "rdpSettings" "audio_playback" "ac_cv_member_rdpSettings_audio_playback" "#include " if test "x$ac_cv_member_rdpSettings_audio_playback" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RDPSETTINGS_AUDIO_PLAYBACK 1 _ACEOF else rdpsettings_audioplayback=no fi # Legacy interface may not have DeviceRedirection settings ac_fn_c_check_member "$LINENO" "rdpSettings" "device_redirection" "ac_cv_member_rdpSettings_device_redirection" "#include " if test "x$ac_cv_member_rdpSettings_device_redirection" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RDPSETTINGS_DEVICE_REDIRECTION 1 _ACEOF else rdpsettings_deviceredirection=no fi elif test "x${rdpsettings_interface}" = "xunknown"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -------------------------------------------- Unknown rdpSettings interface RDP will be disabled. --------------------------------------------" >&5 $as_echo "$as_me: WARNING: -------------------------------------------- Unknown rdpSettings interface RDP will be disabled. --------------------------------------------" >&2;} have_freerdp=no fi fi # Activate audio playback settings if present if test "x${have_freerdp}" = "xyes" -a "x${rdpsettings_audioplayback}" = "xyes"; then $as_echo "#define HAVE_RDPSETTINGS_AUDIOPLAYBACK /**/" >>confdefs.h fi # Activate device redirection settings if present if test "x${have_freerdp}" = "xyes" -a "x${rdpsettings_deviceredirection}" = "xyes"; then $as_echo "#define HAVE_RDPSETTINGS_DEVICEREDIRECTION /**/" >>confdefs.h fi # Check if the type CHANNEL_ENTRY_POINTS_FREERDP exists, if not define it to CHANNEL_ENTRY_POINTS_EX if test "x${have_freerdp}" = "xyes" then ac_fn_c_check_type "$LINENO" "CHANNEL_ENTRY_POINTS_FREERDP" "ac_cv_type_CHANNEL_ENTRY_POINTS_FREERDP" "#include " if test "x$ac_cv_type_CHANNEL_ENTRY_POINTS_FREERDP" = xyes; then : else $as_echo "#define CHANNEL_ENTRY_POINTS_FREERDP CHANNEL_ENTRY_POINTS_EX" >>confdefs.h fi fi # Check if the freerdp version header exists if test "x${have_freerdp}" = "xyes" then for ac_header in freerdp/version.h do : ac_fn_c_check_header_mongrel "$LINENO" "freerdp/version.h" "ac_cv_header_freerdp_version_h" "$ac_includes_default" if test "x$ac_cv_header_freerdp_version_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FREERDP_VERSION_H 1 _ACEOF fi done fi # # FreeRDP: rdpBitmap # if test "x${have_freerdp}" = "xyes" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether rdpBitmap.Decompress() requires the codec_id" >&5 $as_echo_n "checking whether rdpBitmap.Decompress() requires the codec_id... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include void __decompress(rdpContext* context, rdpBitmap* bitmap, UINT8* data, int width, int height, int bpp, int length, BOOL compressed, int codec_id); rdpBitmap b = { .Decompress = __decompress }; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "#define LEGACY_RDPBITMAP /**/" >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi # # FreeRDP: Decompression function variants # # Check whether interleaved_decompress() can handle the palette if test "x${have_freerdp}" = "xyes" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether interleaved_decompress() accepts an additional palette parameter" >&5 $as_echo_n "checking whether interleaved_decompress() accepts an additional palette parameter... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main() { BYTE* palette = NULL; interleaved_decompress(NULL, NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, palette); } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define INTERLEAVED_DECOMPRESS_TAKES_PALETTE /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi # Check whether planar_decompress() will handle flipping if test "x${have_freerdp}" = "xyes" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether planar_decompress() can flip" >&5 $as_echo_n "checking whether planar_decompress() can flip... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main() { BOOL* flip = TRUE; planar_decompress(NULL, NULL, 0, NULL, 0, 0, 0, 0, 0, 0, flip); } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define PLANAR_DECOMPRESS_CAN_FLIP /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi # # FreeRDP: rdpContext # # Check for rdpContext.codecs if test "x${have_freerdp}" = "xyes" then ac_fn_c_check_member "$LINENO" "rdpContext" "codecs" "ac_cv_member_rdpContext_codecs" "#include " if test "x$ac_cv_member_rdpContext_codecs" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RDPCONTEXT_CODECS 1 _ACEOF $as_echo "#define FREERDP_BITMAP_REQUIRES_ALIGNED_MALLOC /**/" >>confdefs.h fi fi # # FreeRDP: rdpPalette # if test "x${have_freerdp}" = "xyes" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether rdpPalette.entries is static" >&5 $as_echo_n "checking whether rdpPalette.entries is static... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include rdpPalette p; PALETTE_ENTRY* foo = p.entries; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "#define LEGACY_RDPPALETTE /**/" >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi # # FreeRDP: rdpPointer # # Check for SetDefault and SetNull members of rdpPointer if test "x${have_freerdp}" = "xyes" then ac_fn_c_check_member "$LINENO" "rdpPointer" "SetDefault" "ac_cv_member_rdpPointer_SetDefault" "#include " if test "x$ac_cv_member_rdpPointer_SetDefault" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RDPPOINTER_SETDEFAULT 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "rdpPointer" "SetNull" "ac_cv_member_rdpPointer_SetNull" "#include " if test "x$ac_cv_member_rdpPointer_SetNull" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RDPPOINTER_SETNULL 1 _ACEOF fi fi # # FreeRDP: wMessage / RDP_EVENT # # Check for current (as of 1.1) wMessage interface if test "x${have_freerdp}" = "xyes" then ac_fn_c_check_member "$LINENO" "wMessage" "id" "ac_cv_member_wMessage_id" "#include " if test "x$ac_cv_member_wMessage_id" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WMESSAGE_ID 1 _ACEOF event_interface=stable fi # If not current, check for legacy (RDP_EVENT) interface if test "x${event_interface}" = "xunknown" then ac_fn_c_check_member "$LINENO" "RDP_EVENT" "event_class" "ac_cv_member_RDP_EVENT_event_class" "#include " if test "x$ac_cv_member_RDP_EVENT_event_class" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RDP_EVENT_EVENT_CLASS 1 _ACEOF event_interface=legacy fi fi # Set defines based on interface type, warn if unknown if test "x${event_interface}" = "xlegacy"; then $as_echo "#define LEGACY_EVENT /**/" >>confdefs.h elif test "x${event_interface}" = "xunknown"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -------------------------------------------- Unknown event interface RDP will be disabled. --------------------------------------------" >&5 $as_echo "$as_me: WARNING: -------------------------------------------- Unknown event interface RDP will be disabled. --------------------------------------------" >&2;} have_freerdp=no fi fi if test "x${legacy_freerdp_extensions}" = "xyes"; then LEGACY_FREERDP_EXTENSIONS_TRUE= LEGACY_FREERDP_EXTENSIONS_FALSE='#' else LEGACY_FREERDP_EXTENSIONS_TRUE='#' LEGACY_FREERDP_EXTENSIONS_FALSE= fi if test "x${have_disp}" = "xyes"; then ENABLE_DISPLAY_UPDATE_TRUE= ENABLE_DISPLAY_UPDATE_FALSE='#' else ENABLE_DISPLAY_UPDATE_TRUE='#' ENABLE_DISPLAY_UPDATE_FALSE= fi if test "x${have_winpr}" = "xyes"; then ENABLE_WINPR_TRUE= ENABLE_WINPR_FALSE='#' else ENABLE_WINPR_TRUE='#' ENABLE_WINPR_FALSE= fi if test "x${have_freerdp}" = "xyes"; then ENABLE_RDP_TRUE= ENABLE_RDP_FALSE='#' else ENABLE_RDP_TRUE='#' ENABLE_RDP_FALSE= fi # # libssh2 # have_libssh2=disabled SSH_LIBS= # Check whether --with-ssh was given. if test "${with_ssh+set}" = set; then : withval=$with_ssh; else with_ssh=check fi # Check whether --enable-ssh_agent was given. if test "${enable_ssh_agent+set}" = set; then : enableval=$enable_ssh_agent; enable_ssh_agent=yes fi if test "x$with_ssh" != "xno" then have_libssh2=yes { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libssh2_session_init_ex in -lssh2" >&5 $as_echo_n "checking for libssh2_session_init_ex in -lssh2... " >&6; } if ${ac_cv_lib_ssh2_libssh2_session_init_ex+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lssh2 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char libssh2_session_init_ex (); int main () { return libssh2_session_init_ex (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ssh2_libssh2_session_init_ex=yes else ac_cv_lib_ssh2_libssh2_session_init_ex=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ssh2_libssh2_session_init_ex" >&5 $as_echo "$ac_cv_lib_ssh2_libssh2_session_init_ex" >&6; } if test "x$ac_cv_lib_ssh2_libssh2_session_init_ex" = xyes; then : SSH_LIBS="$SSH_LIBS -lssh2" else have_libssh2=no fi fi if test "x${have_libssh2}" = "xyes" \ -a "x${have_ssl}" = "xyes"; then ENABLE_COMMON_SSH_TRUE= ENABLE_COMMON_SSH_FALSE='#' else ENABLE_COMMON_SSH_TRUE='#' ENABLE_COMMON_SSH_FALSE= fi if test -z "$ENABLE_COMMON_SSH_TRUE"; then : $as_echo "#define ENABLE_COMMON_SSH /**/" >>confdefs.h fi if test "x${have_libssh2}" = "xyes" \ -a "x${have_terminal}" = "xyes" \ -a "x${have_ssl}" = "xyes"; then ENABLE_SSH_TRUE= ENABLE_SSH_FALSE='#' else ENABLE_SSH_TRUE='#' ENABLE_SSH_FALSE= fi # # Underlying crypto library usage of libssh2 # if test "x${have_libssh2}" = "xyes" then # Whether libssh2 was built against libgcrypt { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcry_control in -lssh2" >&5 $as_echo_n "checking for gcry_control in -lssh2... " >&6; } if ${ac_cv_lib_ssh2_gcry_control+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lssh2 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gcry_control (); int main () { return gcry_control (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ssh2_gcry_control=yes else ac_cv_lib_ssh2_gcry_control=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ssh2_gcry_control" >&5 $as_echo "$ac_cv_lib_ssh2_gcry_control" >&6; } if test "x$ac_cv_lib_ssh2_gcry_control" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "gcrypt.h" "ac_cv_header_gcrypt_h" "$ac_includes_default" if test "x$ac_cv_header_gcrypt_h" = xyes; then : $as_echo "#define LIBSSH2_USES_GCRYPT /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -------------------------------------------- libssh2 appears to be built against libgcrypt, but the libgcrypt headers could not be found. SSH will be disabled. --------------------------------------------" >&5 $as_echo "$as_me: WARNING: -------------------------------------------- libssh2 appears to be built against libgcrypt, but the libgcrypt headers could not be found. SSH will be disabled. --------------------------------------------" >&2;} have_libssh2=no fi fi fi # # Agent forwarding support within libssh2 # have_ssh_agent=no if test "x${have_libssh2}" = "xyes" -a "x${enable_ssh_agent}" = "xyes" then ac_fn_c_check_decl "$LINENO" "libssh2_channel_request_auth_agent" "ac_cv_have_decl_libssh2_channel_request_auth_agent" "#include " if test "x$ac_cv_have_decl_libssh2_channel_request_auth_agent" = xyes; then : have_ssh_agent=yes fi if test "x${have_ssh_agent}" = "xno" then as_fn_error $? " -------------------------------------------- Agent forwarding support was requested but no such support was found in libssh2. --------------------------------------------" "$LINENO" 5 else $as_echo "#define ENABLE_SSH_AGENT /**/" >>confdefs.h fi fi if test "x${have_ssh_agent}" = "xyes" \ -a "x${enable_ssh_agent}" = "xyes"; then ENABLE_SSH_AGENT_TRUE= ENABLE_SSH_AGENT_FALSE='#' else ENABLE_SSH_AGENT_TRUE='#' ENABLE_SSH_AGENT_FALSE= fi # # libtelnet # have_libtelnet=disabled TELNET_LIBS= # Check whether --with-telnet was given. if test "${with_telnet+set}" = set; then : withval=$with_telnet; else with_telnet=check fi if test "x$with_telnet" != "xno" then have_libtelnet=yes { $as_echo "$as_me:${as_lineno-$LINENO}: checking for telnet_init in -ltelnet" >&5 $as_echo_n "checking for telnet_init in -ltelnet... " >&6; } if ${ac_cv_lib_telnet_telnet_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ltelnet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char telnet_init (); int main () { return telnet_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_telnet_telnet_init=yes else ac_cv_lib_telnet_telnet_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_telnet_telnet_init" >&5 $as_echo "$ac_cv_lib_telnet_telnet_init" >&6; } if test "x$ac_cv_lib_telnet_telnet_init" = xyes; then : TELNET_LIBS="$TELNET_LIBS -ltelnet" else have_libtelnet=no fi fi if test "x${have_libtelnet}" = "xyes" \ -a "x${have_terminal}" = "xyes"; then ENABLE_TELNET_TRUE= ENABLE_TELNET_FALSE='#' else ENABLE_TELNET_TRUE='#' ENABLE_TELNET_FALSE= fi # # libwebp # have_webp=disabled WEBP_LIBS= # Check whether --with-webp was given. if test "${with_webp+set}" = set; then : withval=$with_webp; else with_webp=check fi if test "x$with_webp" != "xno" then have_webp=yes ac_fn_c_check_header_mongrel "$LINENO" "webp/encode.h" "ac_cv_header_webp_encode_h" "$ac_includes_default" if test "x$ac_cv_header_webp_encode_h" = xyes; then : else have_webp=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for WebPEncode in -lwebp" >&5 $as_echo_n "checking for WebPEncode in -lwebp... " >&6; } if ${ac_cv_lib_webp_WebPEncode+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lwebp $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char WebPEncode (); int main () { return WebPEncode (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_webp_WebPEncode=yes else ac_cv_lib_webp_WebPEncode=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_webp_WebPEncode" >&5 $as_echo "$ac_cv_lib_webp_WebPEncode" >&6; } if test "x$ac_cv_lib_webp_WebPEncode" = xyes; then : WEBP_LIBS="$WEBP_LIBS -lwebp" else have_webp=no fi if test "x${have_webp}" = "xno" then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -------------------------------------------- Unable to find libwebp. Images will not be encoded using WebP. --------------------------------------------" >&5 $as_echo "$as_me: WARNING: -------------------------------------------- Unable to find libwebp. Images will not be encoded using WebP. --------------------------------------------" >&2;} else $as_echo "#define ENABLE_WEBP /**/" >>confdefs.h fi fi if test "x${have_webp}" = "xyes"; then ENABLE_WEBP_TRUE= ENABLE_WEBP_FALSE='#' else ENABLE_WEBP_TRUE='#' ENABLE_WEBP_FALSE= fi ac_config_files="$ac_config_files Makefile tests/Makefile src/common/Makefile src/common-ssh/Makefile src/terminal/Makefile src/libguac/Makefile src/guacd/Makefile src/protocols/rdp/Makefile src/protocols/ssh/Makefile src/protocols/telnet/Makefile src/protocols/vnc/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_INIT_TRUE}" && test -z "${ENABLE_INIT_FALSE}"; then as_fn_error $? "conditional \"ENABLE_INIT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SSL_TRUE}" && test -z "${ENABLE_SSL_FALSE}"; then as_fn_error $? "conditional \"ENABLE_SSL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_OGG_TRUE}" && test -z "${ENABLE_OGG_FALSE}"; then as_fn_error $? "conditional \"ENABLE_OGG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_PULSE_TRUE}" && test -z "${ENABLE_PULSE_FALSE}"; then as_fn_error $? "conditional \"ENABLE_PULSE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_TERMINAL_TRUE}" && test -z "${ENABLE_TERMINAL_FALSE}"; then as_fn_error $? "conditional \"ENABLE_TERMINAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_VNC_TRUE}" && test -z "${ENABLE_VNC_FALSE}"; then as_fn_error $? "conditional \"ENABLE_VNC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LEGACY_FREERDP_EXTENSIONS_TRUE}" && test -z "${LEGACY_FREERDP_EXTENSIONS_FALSE}"; then as_fn_error $? "conditional \"LEGACY_FREERDP_EXTENSIONS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_DISPLAY_UPDATE_TRUE}" && test -z "${ENABLE_DISPLAY_UPDATE_FALSE}"; then as_fn_error $? "conditional \"ENABLE_DISPLAY_UPDATE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_WINPR_TRUE}" && test -z "${ENABLE_WINPR_FALSE}"; then as_fn_error $? "conditional \"ENABLE_WINPR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_RDP_TRUE}" && test -z "${ENABLE_RDP_FALSE}"; then as_fn_error $? "conditional \"ENABLE_RDP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_COMMON_SSH_TRUE}" && test -z "${ENABLE_COMMON_SSH_FALSE}"; then as_fn_error $? "conditional \"ENABLE_COMMON_SSH\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SSH_TRUE}" && test -z "${ENABLE_SSH_FALSE}"; then as_fn_error $? "conditional \"ENABLE_SSH\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SSH_AGENT_TRUE}" && test -z "${ENABLE_SSH_AGENT_FALSE}"; then as_fn_error $? "conditional \"ENABLE_SSH_AGENT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_TELNET_TRUE}" && test -z "${ENABLE_TELNET_FALSE}"; then as_fn_error $? "conditional \"ENABLE_TELNET\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_WEBP_TRUE}" && test -z "${ENABLE_WEBP_FALSE}"; then as_fn_error $? "conditional \"ENABLE_WEBP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by guacamole-server $as_me 0.9.9, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ guacamole-server config.status 0.9.9 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "src/common/Makefile") CONFIG_FILES="$CONFIG_FILES src/common/Makefile" ;; "src/common-ssh/Makefile") CONFIG_FILES="$CONFIG_FILES src/common-ssh/Makefile" ;; "src/terminal/Makefile") CONFIG_FILES="$CONFIG_FILES src/terminal/Makefile" ;; "src/libguac/Makefile") CONFIG_FILES="$CONFIG_FILES src/libguac/Makefile" ;; "src/guacd/Makefile") CONFIG_FILES="$CONFIG_FILES src/guacd/Makefile" ;; "src/protocols/rdp/Makefile") CONFIG_FILES="$CONFIG_FILES src/protocols/rdp/Makefile" ;; "src/protocols/ssh/Makefile") CONFIG_FILES="$CONFIG_FILES src/protocols/ssh/Makefile" ;; "src/protocols/telnet/Makefile") CONFIG_FILES="$CONFIG_FILES src/protocols/telnet/Makefile" ;; "src/protocols/vnc/Makefile") CONFIG_FILES="$CONFIG_FILES src/protocols/vnc/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="" # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi if test -z "$ENABLE_RDP_TRUE"; then : build_rdp=yes else build_rdp=no fi if test -z "$ENABLE_SSH_TRUE"; then : build_ssh=yes else build_ssh=no fi if test -z "$ENABLE_TELNET_TRUE"; then : build_telnet=yes else build_telnet=no fi if test -z "$ENABLE_VNC_TRUE"; then : build_vnc=yes else build_vnc=no fi if test -z "$ENABLE_INIT_TRUE"; then : build_init="${init_dir}" else build_init=no fi echo " ------------------------------------------------ $PACKAGE_NAME version $PACKAGE_VERSION ------------------------------------------------ Library status: freerdp ............. ${have_freerdp} pango ............... ${have_pango} libssh2 ............. ${have_libssh2} libssl .............. ${have_ssl} libtelnet ........... ${have_libtelnet} libVNCServer ........ ${have_libvncserver} libvorbis ........... ${have_vorbis} libpulse ............ ${have_pulse} libwebp ............. ${have_webp} Protocol support: RDP ....... ${build_rdp} SSH ....... ${build_ssh} Telnet .... ${build_telnet} VNC ....... ${build_vnc} Init scripts: ${build_init} Type \"make\" to compile $PACKAGE_NAME. "