#!/usr/bin/env perl # # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # # # generate-entry-wrappers.pl # # Generates C source which defines wrapper functions for FreeRDP plugin entry # points, allowing multiple instances of the same plugin to be loaded despite # otherwise always having the same entry point. # # The resulting source is stored within "_generated_channel_entry_wrappers.c". # use strict; ## ## The maximum number of static channels supported by Guacamole's RDP support. ## my $GUAC_RDP_MAX_CHANNELS; # Extract value of GUAC_RDP_MAX_CHANNELS macro from provided source while (<>) { if ((my $value) = m/^\s*#define\s+GUAC_RDP_MAX_CHANNELS\s+(\d+)\s*$/) { $GUAC_RDP_MAX_CHANNELS = $value; } } open OUTPUT, ">", "_generated_channel_entry_wrappers.c"; # Generate required headers print OUTPUT <<"EOF"; #include "plugins/channels.h" #include #include EOF # Generate wrapper definitions for PVIRTUALCHANNELENTRYEX entry point variant print OUTPUT <<"EOF" for (1..$GUAC_RDP_MAX_CHANNELS); static BOOL guac_rdp_plugin_entry_ex_wrapper$_(PCHANNEL_ENTRY_POINTS_EX entry_points_ex, PVOID init_handle) { return guac_rdp_wrapped_entry_ex[$_ - 1](entry_points_ex, init_handle); } EOF # Generate wrapper definitions for PVIRTUALCHANNELENTRY entry point variant print OUTPUT <<"EOF" for (1..$GUAC_RDP_MAX_CHANNELS); static BOOL guac_rdp_plugin_entry_wrapper$_(PCHANNEL_ENTRY_POINTS entry_points) { return guac_rdp_wrapped_entry[$_ - 1](entry_points); } EOF # Populate lookup table of PVIRTUALCHANNELENTRYEX wrapper functions print OUTPUT "PVIRTUALCHANNELENTRYEX guac_rdp_entry_ex_wrappers[$GUAC_RDP_MAX_CHANNELS] = {\n"; print OUTPUT " guac_rdp_plugin_entry_ex_wrapper$_,\n" for (1..$GUAC_RDP_MAX_CHANNELS); print OUTPUT "};\n"; # Populate lookup table of PVIRTUALCHANNELENTRY wrapper functions print OUTPUT "PVIRTUALCHANNELENTRY guac_rdp_entry_wrappers[$GUAC_RDP_MAX_CHANNELS] = {\n"; print OUTPUT " guac_rdp_plugin_entry_wrapper$_,\n" for (1..$GUAC_RDP_MAX_CHANNELS); print OUTPUT "};\n";