FreeRDP
Loading...
Searching...
No Matches
Proxy Configuration

Data Structures

struct  proxyConfig
 

Functions

WINPR_ATTR_NODISCARD FREERDP_API BOOL pf_server_config_dump (const char *file)
 pf_server_config_dump Dumps a default INI configuration file
 
FREERDP_API void pf_server_config_free (proxyConfig *config)
 pf_server_config_free Releases all resources associated with proxyConfig
 
WINPR_ATTR_NODISCARD FREERDP_API proxyConfig * server_config_load_ini (wIniFile *ini)
 server_config_load_ini Create a proxyConfig from a already loaded INI file.
 
WINPR_ATTR_NODISCARD FREERDP_API proxyConfig * pf_server_config_load_file (const char *path)
 pf_server_config_load_file Create a proxyConfig from a INI file found at path.
 
WINPR_ATTR_NODISCARD FREERDP_API proxyConfig * pf_server_config_load_buffer (const char *buffer)
 pf_server_config_load_buffer Create a proxyConfig from a memory string buffer in INI file format
 
FREERDP_API void pf_server_config_print (const proxyConfig *config)
 pf_server_config_print Print the configuration to stdout
 
WINPR_ATTR_NODISCARD FREERDP_API size_t pf_config_required_plugins_count (const proxyConfig *config)
 pf_config_required_plugins_count
 
WINPR_ATTR_NODISCARD FREERDP_API const char * pf_config_required_plugin (const proxyConfig *config, size_t index)
 pf_config_required_plugin
 
WINPR_ATTR_NODISCARD FREERDP_API size_t pf_config_modules_count (const proxyConfig *config)
 pf_config_modules_count
 
WINPR_ATTR_NODISCARD FREERDP_API const char ** pf_config_modules (const proxyConfig *config)
 pf_config_modules
 
WINPR_ATTR_NODISCARD FREERDP_API BOOL pf_config_clone (proxyConfig **dst, const proxyConfig *config)
 pf_config_clone Create a copy of the configuration
 
WINPR_ATTR_NODISCARD FREERDP_API BOOL pf_config_plugin (proxyPluginsManager *plugins_manager, void *userdata)
 pf_config_plugin Register a proxy plugin handling event filtering defined in the configuration.
 
WINPR_ATTR_NODISCARD FREERDP_API const char * pf_config_get (const proxyConfig *config, const char *section, const char *key)
 pf_config_get get a value for a section/key
 

Detailed Description

FreeRDP: A Remote Desktop Protocol Implementation FreeRDP Proxy Server

Copyright 2021-2023 Armin Novak armin.nosp@m..nov.nosp@m.ak@th.nosp@m.inca.nosp@m.st.co.nosp@m.m Copyright 2021-2023 Thincast Technologies GmbH

Licensed 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.

Function Documentation

◆ pf_config_clone()

WINPR_ATTR_NODISCARD FREERDP_API BOOL pf_config_clone ( proxyConfig **  dst,
const proxyConfig *  config 
)

pf_config_clone Create a copy of the configuration

Parameters
dstA pointer that receives the newly allocated copy
configThe source configuration to copy
Returns
TRUE for success, FALSE otherwise

Definition at line 983 of file pf_config.c.

984{
985 proxyConfig* tmp = calloc(1, sizeof(proxyConfig));
986
987 WINPR_ASSERT(dst);
988 WINPR_ASSERT(config);
989
990 if (!tmp)
991 return FALSE;
992
993 *tmp = *config;
994
995 if (!pf_config_copy_string(&tmp->Host, config->Host))
996 goto fail;
997 if (!pf_config_copy_string(&tmp->TargetHost, config->TargetHost))
998 goto fail;
999 if (!pf_config_copy_string(&tmp->TargetUser, config->TargetUser))
1000 goto fail;
1001 if (!pf_config_copy_string(&tmp->TargetDomain, config->TargetDomain))
1002 goto fail;
1003 if (!pf_config_copy_string(&tmp->TargetPassword, config->TargetPassword))
1004 goto fail;
1005 if (!pf_config_copy_string_list(&tmp->Passthrough, &tmp->PassthroughCount, config->Passthrough,
1006 config->PassthroughCount))
1007 goto fail;
1008 if (!pf_config_copy_string_list(&tmp->Intercept, &tmp->InterceptCount, config->Intercept,
1009 config->InterceptCount))
1010 goto fail;
1011 if (!pf_config_copy_string_list(&tmp->Modules, &tmp->ModulesCount, config->Modules,
1012 config->ModulesCount))
1013 goto fail;
1014 if (!pf_config_copy_string_list(&tmp->RequiredPlugins, &tmp->RequiredPluginsCount,
1015 config->RequiredPlugins, config->RequiredPluginsCount))
1016 goto fail;
1017 if (!pf_config_copy_string(&tmp->CertificateFile, config->CertificateFile))
1018 goto fail;
1019 if (!pf_config_copy_string(&tmp->CertificateContent, config->CertificateContent))
1020 goto fail;
1021 if (!pf_config_copy_string_n(&tmp->CertificatePEM, config->CertificatePEM,
1022 config->CertificatePEMLength))
1023 goto fail;
1024 if (!pf_config_copy_string(&tmp->PrivateKeyFile, config->PrivateKeyFile))
1025 goto fail;
1026 if (!pf_config_copy_string(&tmp->PrivateKeyContent, config->PrivateKeyContent))
1027 goto fail;
1028 if (!pf_config_copy_string_n(&tmp->PrivateKeyPEM, config->PrivateKeyPEM,
1029 config->PrivateKeyPEMLength))
1030 goto fail;
1031
1032 tmp->ini = IniFile_Clone(config->ini);
1033 if (!tmp->ini)
1034 goto fail;
1035
1036 *dst = tmp;
1037 return TRUE;
1038
1039fail:
1040 WINPR_PRAGMA_DIAG_PUSH
1041 WINPR_PRAGMA_DIAG_IGNORED_MISMATCHED_DEALLOC
1043 WINPR_PRAGMA_DIAG_POP
1044 return FALSE;
1045}
void pf_server_config_free(proxyConfig *config)
pf_server_config_free Releases all resources associated with proxyConfig
Definition pf_config.c:874

References pf_server_config_free().

Here is the call graph for this function:

◆ pf_config_get()

WINPR_ATTR_NODISCARD FREERDP_API const char * pf_config_get ( const proxyConfig *  config,
const char *  section,
const char *  key 
)

pf_config_get get a value for a section/key

Parameters
configA pointer to the proxyConfig. Must NOT be nullptr.
sectionThe name of the section the key is in, must not be nullptr
keyThe name of the key to look for. Must not be nullptr
Returns
A pointer to the value for section/key or nullptr if not found

Definition at line 1355 of file pf_config.c.

1356{
1357 WINPR_ASSERT(config);
1358 WINPR_ASSERT(config->ini);
1359 WINPR_ASSERT(section);
1360 WINPR_ASSERT(key);
1361
1362 return IniFile_GetKeyValueString(config->ini, section, key);
1363}

◆ pf_config_modules()

WINPR_ATTR_NODISCARD FREERDP_API const char ** pf_config_modules ( const proxyConfig *  config)

pf_config_modules

Parameters
configA pointer to the proxyConfig. Must NOT be nullptr.
Returns
An array of strings of size pf_config_modules_count with the module names.

Definition at line 921 of file pf_config.c.

922{
923 union
924 {
925 char** ppc;
926 const char** cppc;
927 } cnv;
928
929 WINPR_ASSERT(config);
930
931 cnv.ppc = config->Modules;
932 return cnv.cppc;
933}

◆ pf_config_modules_count()

WINPR_ATTR_NODISCARD FREERDP_API size_t pf_config_modules_count ( const proxyConfig *  config)

pf_config_modules_count

Parameters
configA pointer to the proxyConfig. Must NOT be nullptr.
Returns
The number of proxy modules configured.

Definition at line 915 of file pf_config.c.

916{
917 WINPR_ASSERT(config);
918 return config->ModulesCount;
919}

◆ pf_config_plugin()

WINPR_ATTR_NODISCARD FREERDP_API BOOL pf_config_plugin ( proxyPluginsManager *  plugins_manager,
void *  userdata 
)

pf_config_plugin Register a proxy plugin handling event filtering defined in the configuration.

Parameters
plugins_managerThe plugin manager
userdataA proxyConfig* to use as reference
Returns
TRUE for success, FALSE for failure

Definition at line 1323 of file pf_config.c.

1324{
1325 struct config_plugin_data* custom = nullptr;
1326 proxyPlugin plugin = WINPR_C_ARRAY_INIT;
1327
1328 plugin.name = config_plugin_name;
1329 plugin.description = config_plugin_desc;
1330 plugin.PluginUnload = config_plugin_unload;
1331
1332 plugin.KeyboardEvent = config_plugin_keyboard_event;
1333 plugin.UnicodeEvent = config_plugin_unicode_event;
1334 plugin.MouseEvent = config_plugin_mouse_event;
1335 plugin.MouseExEvent = config_plugin_mouse_ex_event;
1336 plugin.ClientChannelData = config_plugin_client_channel_data;
1337 plugin.ServerChannelData = config_plugin_server_channel_data;
1338 plugin.ChannelCreate = config_plugin_channel_create;
1339 plugin.DynamicChannelCreate = config_plugin_dynamic_channel_create;
1340 plugin.userdata = userdata;
1341
1342 custom = calloc(1, sizeof(struct config_plugin_data));
1343 if (!custom)
1344 return FALSE;
1345
1346 custom->mgr = plugins_manager;
1347 custom->config = userdata;
1348
1349 plugin.custom = custom;
1350 plugin.userdata = userdata;
1351
1352 return plugins_manager->RegisterPlugin(plugins_manager, &plugin);
1353}

◆ pf_config_required_plugin()

WINPR_ATTR_NODISCARD FREERDP_API const char * pf_config_required_plugin ( const proxyConfig *  config,
size_t  index 
)

pf_config_required_plugin

Parameters
configA pointer to the proxyConfig. Must NOT be nullptr.
indexThe index of the plugin to return
Returns
The name of the plugin or nullptr.

Definition at line 906 of file pf_config.c.

907{
908 WINPR_ASSERT(config);
909 if (index >= config->RequiredPluginsCount)
910 return nullptr;
911
912 return config->RequiredPlugins[index];
913}

◆ pf_config_required_plugins_count()

WINPR_ATTR_NODISCARD FREERDP_API size_t pf_config_required_plugins_count ( const proxyConfig *  config)

pf_config_required_plugins_count

Parameters
configA pointer to the proxyConfig. Must NOT be nullptr.
Returns
The number of required plugins configured.

Definition at line 900 of file pf_config.c.

901{
902 WINPR_ASSERT(config);
903 return config->RequiredPluginsCount;
904}

◆ pf_server_config_dump()

WINPR_ATTR_NODISCARD FREERDP_API BOOL pf_server_config_dump ( const char *  file)

pf_server_config_dump Dumps a default INI configuration file

Parameters
fileThe file to write to. Existing files are truncated.
Returns
TRUE for success, FALSE if the file could not be written.

Definition at line 609 of file pf_config.c.

610{
611 BOOL rc = FALSE;
612 wIniFile* ini = IniFile_New();
613 if (!ini)
614 return FALSE;
615
616 /* Proxy server configuration */
617 if (IniFile_SetKeyValueString(ini, section_server, key_host, "0.0.0.0") < 0)
618 goto fail;
619 if (IniFile_SetKeyValueInt(ini, section_server, key_port, 3389) < 0)
620 goto fail;
621
622 /* Target configuration */
623 if (IniFile_SetKeyValueString(ini, section_target, key_host, "somehost.example.com") < 0)
624 goto fail;
625 if (IniFile_SetKeyValueInt(ini, section_target, key_port, 3389) < 0)
626 goto fail;
627 if (IniFile_SetKeyValueString(ini, section_target, key_target_fixed, bool_str_true) < 0)
628 goto fail;
629 if (IniFile_SetKeyValueInt(ini, section_target, key_target_tls_seclevel, 1) < 0)
630 goto fail;
631
632 /* Channel configuration */
633 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_gfx, bool_str_true) < 0)
634 goto fail;
635 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_disp, bool_str_true) < 0)
636 goto fail;
637 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_clip, bool_str_true) < 0)
638 goto fail;
639 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_mic, bool_str_true) < 0)
640 goto fail;
641 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_sound, bool_str_true) < 0)
642 goto fail;
643 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_rdpdr, bool_str_true) < 0)
644 goto fail;
645 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_video, bool_str_true) < 0)
646 goto fail;
647 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_camera, bool_str_true) < 0)
648 goto fail;
649 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_rails, bool_str_false) < 0)
650 goto fail;
651
652 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_blacklist, bool_str_true) < 0)
653 goto fail;
654 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_pass, "") < 0)
655 goto fail;
656 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_intercept, "") < 0)
657 goto fail;
658
659 /* Input configuration */
660 if (IniFile_SetKeyValueString(ini, section_input, key_input_kbd, bool_str_true) < 0)
661 goto fail;
662 if (IniFile_SetKeyValueString(ini, section_input, key_input_mouse, bool_str_true) < 0)
663 goto fail;
664 if (IniFile_SetKeyValueString(ini, section_input, key_input_multitouch, bool_str_true) < 0)
665 goto fail;
666
667 /* Security settings */
668 if (IniFile_SetKeyValueString(ini, section_security, key_security_server_tls, bool_str_true) <
669 0)
670 goto fail;
671 if (IniFile_SetKeyValueString(ini, section_security, key_security_server_nla, bool_str_false) <
672 0)
673 goto fail;
674 if (IniFile_SetKeyValueString(ini, section_security, key_security_server_rdp, bool_str_true) <
675 0)
676 goto fail;
677
678 if (IniFile_SetKeyValueString(ini, section_security, key_security_client_tls, bool_str_true) <
679 0)
680 goto fail;
681 if (IniFile_SetKeyValueString(ini, section_security, key_security_client_nla, bool_str_true) <
682 0)
683 goto fail;
684 if (IniFile_SetKeyValueString(ini, section_security, key_security_client_rdp, bool_str_true) <
685 0)
686 goto fail;
687 if (IniFile_SetKeyValueString(ini, section_security, key_security_client_fallback,
688 bool_str_true) < 0)
689 goto fail;
690
691 /* Module configuration */
692 if (IniFile_SetKeyValueString(ini, section_plugins, key_plugins_modules,
693 "module1,module2,...") < 0)
694 goto fail;
695 if (IniFile_SetKeyValueString(ini, section_plugins, key_plugins_required,
696 "module1,module2,...") < 0)
697 goto fail;
698
699 /* Certificate configuration */
700 if (IniFile_SetKeyValueString(ini, section_certificates, key_cert_file,
701 "<absolute path to some certificate file> OR") < 0)
702 goto fail;
703 if (IniFile_SetKeyValueString(ini, section_certificates, key_cert_content,
704 "<Contents of some certificate file in PEM format>") < 0)
705 goto fail;
706
707 if (IniFile_SetKeyValueString(ini, section_certificates, key_private_key_file,
708 "<absolute path to some private key file> OR") < 0)
709 goto fail;
710 if (IniFile_SetKeyValueString(ini, section_certificates, key_private_key_content,
711 "<Contents of some private key file in PEM format>") < 0)
712 goto fail;
713
714 /* store configuration */
715 if (IniFile_WriteFile(ini, file) < 0)
716 goto fail;
717
718 rc = TRUE;
719
720fail:
721 IniFile_Free(ini);
722 return rc;
723}

◆ pf_server_config_free()

FREERDP_API void pf_server_config_free ( proxyConfig *  config)

pf_server_config_free Releases all resources associated with proxyConfig

Parameters
configA pointer to the proxyConfig to clean up. Might be nullptr.

Definition at line 874 of file pf_config.c.

875{
876 if (config == nullptr)
877 return;
878
879 free(config->Host);
880 free(config->TargetHost);
881 free(config->TargetUser);
882 free(config->TargetDomain);
883 free(config->TargetPassword);
884
885 CommandLineParserFree(config->Passthrough);
886 CommandLineParserFree(config->Intercept);
887 CommandLineParserFree(config->Modules);
888 CommandLineParserFree(config->RequiredPlugins);
889
890 free(config->CertificateFile);
891 zfree(config->CertificateContent);
892 znfree(config->CertificatePEM, config->CertificatePEMLength);
893 free(config->PrivateKeyFile);
894 zfree(config->PrivateKeyContent);
895 znfree(config->PrivateKeyPEM, config->PrivateKeyPEMLength);
896 IniFile_Free(config->ini);
897 free(config);
898}

Referenced by pf_config_clone(), and server_config_load_ini().

Here is the caller graph for this function:

◆ pf_server_config_load_buffer()

WINPR_ATTR_NODISCARD FREERDP_API proxyConfig * pf_server_config_load_buffer ( const char *  buffer)

pf_server_config_load_buffer Create a proxyConfig from a memory string buffer in INI file format

Parameters
bufferA pointer to the '\0' terminated INI string.
Returns
A proxyConfig or nullptr in case of failure.

Definition at line 725 of file pf_config.c.

726{
727 proxyConfig* config = nullptr;
728 wIniFile* ini = nullptr;
729
730 ini = IniFile_New();
731
732 if (!ini)
733 {
734 WLog_ERR(TAG, "IniFile_New() failed!");
735 return nullptr;
736 }
737
738 if (IniFile_ReadBuffer(ini, buffer) < 0)
739 {
740 WLog_ERR(TAG, "failed to parse ini: '%s'", buffer);
741 goto out;
742 }
743
744 config = server_config_load_ini(ini);
745out:
746 IniFile_Free(ini);
747 return config;
748}
proxyConfig * server_config_load_ini(wIniFile *ini)
server_config_load_ini Create a proxyConfig from a already loaded INI file.
Definition pf_config.c:562

References server_config_load_ini().

Here is the call graph for this function:

◆ pf_server_config_load_file()

WINPR_ATTR_NODISCARD FREERDP_API proxyConfig * pf_server_config_load_file ( const char *  path)

pf_server_config_load_file Create a proxyConfig from a INI file found at path.

Parameters
pathThe path of the INI file
Returns
A proxyConfig or nullptr in case of failure.

Definition at line 750 of file pf_config.c.

751{
752 proxyConfig* config = nullptr;
753 wIniFile* ini = IniFile_New();
754
755 if (!ini)
756 {
757 WLog_ERR(TAG, "IniFile_New() failed!");
758 return nullptr;
759 }
760
761 if (IniFile_ReadFile(ini, path) < 0)
762 {
763 WLog_ERR(TAG, "failed to parse ini file: '%s'", path);
764 goto out;
765 }
766
767 config = server_config_load_ini(ini);
768out:
769 IniFile_Free(ini);
770 return config;
771}

References server_config_load_ini().

Here is the call graph for this function:

◆ pf_server_config_print()

FREERDP_API void pf_server_config_print ( const proxyConfig *  config)

pf_server_config_print Print the configuration to stdout

Parameters
configA pointer to the configuration to print. Must NOT be nullptr.

Definition at line 780 of file pf_config.c.

781{
782 WINPR_ASSERT(config);
783 WLog_INFO(TAG, "Proxy configuration:");
784
785 CONFIG_PRINT_SECTION(section_server);
786 CONFIG_PRINT_STR(config, Host);
787 CONFIG_PRINT_UINT16(config, Port);
788
789 if (config->FixedTarget)
790 {
791 CONFIG_PRINT_SECTION(section_target);
792 CONFIG_PRINT_STR(config, TargetHost);
793 CONFIG_PRINT_UINT16(config, TargetPort);
794 CONFIG_PRINT_UINT32(config, TargetTlsSecLevel);
795
796 if (config->TargetUser)
797 CONFIG_PRINT_STR(config, TargetUser);
798 if (config->TargetDomain)
799 CONFIG_PRINT_STR(config, TargetDomain);
800 }
801
802 CONFIG_PRINT_SECTION(section_input);
803 CONFIG_PRINT_BOOL(config, Keyboard);
804 CONFIG_PRINT_BOOL(config, Mouse);
805 CONFIG_PRINT_BOOL(config, Multitouch);
806
807 CONFIG_PRINT_SECTION(section_security);
808 CONFIG_PRINT_BOOL(config, ServerNlaSecurity);
809 CONFIG_PRINT_BOOL(config, ServerTlsSecurity);
810 CONFIG_PRINT_BOOL(config, ServerRdpSecurity);
811 CONFIG_PRINT_BOOL(config, ClientNlaSecurity);
812 CONFIG_PRINT_BOOL(config, ClientTlsSecurity);
813 CONFIG_PRINT_BOOL(config, ClientRdpSecurity);
814 CONFIG_PRINT_BOOL(config, ClientAllowFallbackToTls);
815
816 CONFIG_PRINT_SECTION(section_channels);
817 CONFIG_PRINT_BOOL(config, GFX);
818 CONFIG_PRINT_BOOL(config, DisplayControl);
819 CONFIG_PRINT_BOOL(config, Clipboard);
820 CONFIG_PRINT_BOOL(config, AudioOutput);
821 CONFIG_PRINT_BOOL(config, AudioInput);
822 CONFIG_PRINT_BOOL(config, DeviceRedirection);
823 CONFIG_PRINT_BOOL(config, VideoRedirection);
824 CONFIG_PRINT_BOOL(config, CameraRedirection);
825 CONFIG_PRINT_BOOL(config, RemoteApp);
826 CONFIG_PRINT_BOOL(config, PassthroughIsBlacklist);
827
828 if (config->PassthroughCount)
829 {
830 WLog_INFO(TAG, "\tStatic Channels Proxy:");
831 pf_server_config_print_list(config->Passthrough, config->PassthroughCount);
832 }
833
834 if (config->InterceptCount)
835 {
836 WLog_INFO(TAG, "\tStatic Channels Proxy-Intercept:");
837 pf_server_config_print_list(config->Intercept, config->InterceptCount);
838 }
839
840 /* modules */
841 CONFIG_PRINT_SECTION_KEY(section_plugins, key_plugins_modules);
842 for (size_t x = 0; x < config->ModulesCount; x++)
843 CONFIG_PRINT_STR(config, Modules[x]);
844
845 /* Required plugins */
846 CONFIG_PRINT_SECTION_KEY(section_plugins, key_plugins_required);
847 for (size_t x = 0; x < config->RequiredPluginsCount; x++)
848 CONFIG_PRINT_STR(config, RequiredPlugins[x]);
849
850 CONFIG_PRINT_SECTION(section_certificates);
851 CONFIG_PRINT_STR(config, CertificateFile);
852 CONFIG_PRINT_STR_CONTENT(config, CertificateContent);
853 CONFIG_PRINT_STR(config, PrivateKeyFile);
854 CONFIG_PRINT_STR_CONTENT(config, PrivateKeyContent);
855}

◆ server_config_load_ini()

WINPR_ATTR_NODISCARD FREERDP_API proxyConfig * server_config_load_ini ( wIniFile *  ini)

server_config_load_ini Create a proxyConfig from a already loaded INI file.

Parameters
iniA pointer to the parsed INI file. Must NOT be nullptr.
Returns
A proxyConfig or nullptr in case of failure.

Definition at line 562 of file pf_config.c.

563{
564 proxyConfig* config = nullptr;
565
566 WINPR_ASSERT(ini);
567
568 config = calloc(1, sizeof(proxyConfig));
569 if (config)
570 {
571 /* Set default values != 0 */
572 config->TargetTlsSecLevel = 1;
573
574 /* Load from ini */
575 if (!pf_config_load_server(ini, config))
576 goto out;
577
578 if (!pf_config_load_target(ini, config))
579 goto out;
580
581 if (!pf_config_load_channels(ini, config))
582 goto out;
583
584 if (!pf_config_load_input(ini, config))
585 goto out;
586
587 if (!pf_config_load_security(ini, config))
588 goto out;
589
590 if (!pf_config_load_modules(ini, config))
591 goto out;
592
593 if (!pf_config_load_certificates(ini, config))
594 goto out;
595 config->ini = IniFile_Clone(ini);
596 if (!config->ini)
597 goto out;
598 }
599 return config;
600out:
601 WINPR_PRAGMA_DIAG_PUSH
602 WINPR_PRAGMA_DIAG_IGNORED_MISMATCHED_DEALLOC
603 pf_server_config_free(config);
604 WINPR_PRAGMA_DIAG_POP
605
606 return nullptr;
607}

References pf_server_config_free().

Referenced by pf_server_config_load_buffer(), and pf_server_config_load_file().

Here is the call graph for this function:
Here is the caller graph for this function: