From d1c654a7e17a138c3a4d63f98590206f56c91310 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Mon, 8 Apr 2013 19:12:54 +1000 Subject: [PATCH 01/53] Initiate new directory structure and moved some code in deps --- Makefile.in | 115 + src/Makefile.win32 => Makefile.win32 | 0 src/acinclude.m4 => acinclude.m4 | 0 src/eldap/ELDAPv3.asn => asn1/ELDAPv3.asn1 | 0 {src => asn1}/XmppAddr.asn1 | 0 {src => c_src}/expat_erl.c | 0 {src/tls => c_src}/sha_drv.c | 0 {src => c_src}/xml.c | 2 + src/config.guess => config.guess | 0 src/config.sub => config.sub | 0 src/configure => configure | 1416 ++++--- src/configure.ac => configure.ac | 53 +- src/configure.bat => configure.bat | 0 .../prepare-translation.sh | 8 +- ...abberd.cfg.example => ejabberd.cfg.example | 0 ...rd.init.template => ejabberd.init.template | 0 ...ctl.cfg.example => ejabberdctl.cfg.example | 0 ...abberdctl.template => ejabberdctl.template | 0 {src => include}/adhoc.hrl | 0 {src/web => include}/bosh.hrl | 0 {src => include}/ejabberd.hrl | 24 - {src => include}/ejabberd_c2s.hrl | 0 {src => include}/ejabberd_commands.hrl | 0 {src => include}/ejabberd_config.hrl | 0 {src => include}/ejabberd_ctl.hrl | 0 {src/web => include}/ejabberd_http.hrl | 0 {src/web => include}/ejabberd_web_admin.hrl | 0 {src/eldap => include}/eldap.hrl | 0 {src/web => include}/http_bind.hrl | 0 {src => include}/jlib.hrl | 0 {src => include}/licence.hrl | 0 {src/mod_muc => include}/mod_muc_room.hrl | 0 {src => include}/mod_privacy.hrl | 0 {src/mod_proxy65 => include}/mod_proxy65.hrl | 0 {src => include}/mod_roster.hrl | 0 {src/mod_pubsub => include}/pubsub.hrl | 0 src/inetrc => inetrc | 0 src/install-sh => install-sh | 0 .../Makefile.in | 0 .../Makefile.win32 | 0 .../exmpp_pubsub.erl | 0 .../mod_pubsub_dev.erl | 0 .../node_flat_dev.erl | 1 + .../pubsub_api.hrl | 0 .../pubsub_broadcast.erl | 0 .../pubsub_core.erl | 0 .../pubsub_db.erl | 1 + .../pubsub_db_mnesia.erl | 0 .../pubsub_dev.hrl | 0 .../pubsub_disco.erl | 0 .../pubsub_groups.erl | 0 .../pubsub_hooks.erl | 0 .../pubsub_index_dev.erl | 0 .../pubsub_options.erl | 0 .../pubsub_parser.erl | 0 .../pubsub_tools.erl | 0 .../xmpp_xdata.erl | 0 {src => priv}/msgs/ca.msg | 0 {src => priv}/msgs/ca.po | 0 {src => priv}/msgs/cs.msg | 0 {src => priv}/msgs/cs.po | 0 {src => priv}/msgs/de.msg | 0 {src => priv}/msgs/de.po | 0 {src => priv}/msgs/ejabberd.pot | 0 {src => priv}/msgs/el.msg | 0 {src => priv}/msgs/el.po | 0 {src => priv}/msgs/eo.msg | 0 {src => priv}/msgs/eo.po | 0 {src => priv}/msgs/es.msg | 0 {src => priv}/msgs/es.po | 0 {src => priv}/msgs/fr.msg | 0 {src => priv}/msgs/fr.po | 0 {src => priv}/msgs/gl.msg | 0 {src => priv}/msgs/gl.po | 0 {src => priv}/msgs/id.msg | 0 {src => priv}/msgs/id.po | 0 {src => priv}/msgs/it.msg | 0 {src => priv}/msgs/it.po | 0 {src => priv}/msgs/ja.msg | 0 {src => priv}/msgs/ja.po | 0 {src => priv}/msgs/nl.msg | 0 {src => priv}/msgs/nl.po | 0 {src => priv}/msgs/no.msg | 0 {src => priv}/msgs/no.po | 0 {src => priv}/msgs/pl.msg | 0 {src => priv}/msgs/pl.po | 0 {src => priv}/msgs/pt-br.msg | 0 {src => priv}/msgs/pt-br.po | 0 {src => priv}/msgs/pt.msg | 0 {src => priv}/msgs/pt.po | 0 {src => priv}/msgs/ru.msg | 0 {src => priv}/msgs/ru.po | 0 {src => priv}/msgs/sk.msg | 0 {src => priv}/msgs/sk.po | 0 {src => priv}/msgs/sv.msg | 0 {src => priv}/msgs/sv.po | 0 {src => priv}/msgs/th.msg | 0 {src => priv}/msgs/th.po | 0 {src => priv}/msgs/tr.msg | 0 {src => priv}/msgs/tr.po | 0 {src => priv}/msgs/uk.msg | 0 {src => priv}/msgs/uk.po | 0 {src => priv}/msgs/vi.msg | 0 {src => priv}/msgs/vi.po | 0 {src => priv}/msgs/wa.msg | 0 {src => priv}/msgs/wa.po | 0 {src => priv}/msgs/zh.msg | 0 {src => priv}/msgs/zh.po | 0 rebar.config.in | 25 + {src/odbc => sql}/mssql2000.sql | 0 {src/odbc => sql}/mssql2005.sql | 0 {src/odbc => sql}/mysql.sql | 0 {src/odbc => sql}/pg.sql | 0 src/Makefile.in | 323 -- src/acl.erl | 1 + src/adhoc.erl | 1 + src/cache_tab.erl | 1 + src/configure.erl | 1 + src/cyrsasl.erl | 1 + src/cyrsasl_digest.erl | 1 + src/cyrsasl_scram.erl | 1 + src/dynamic_compile.erl | 268 -- src/ejabberd.app | 156 - src/ejabberd.app.src | 37 + src/ejabberd_admin.erl | 1 + src/ejabberd_app.erl | 1 + src/ejabberd_auth.erl | 1 + src/ejabberd_auth_anonymous.erl | 1 + src/ejabberd_auth_external.erl | 1 + src/ejabberd_auth_internal.erl | 1 + src/ejabberd_auth_ldap.erl | 3 +- src/ejabberd_auth_odbc.erl | 1 + src/ejabberd_auth_riak.erl | 1 + src/{web => }/ejabberd_bosh.erl | 1 + src/ejabberd_c2s.erl | 1 + src/ejabberd_captcha.erl | 3 +- src/ejabberd_check.erl | 1 + src/ejabberd_cluster.erl | 1 + src/ejabberd_commands.erl | 1 + src/ejabberd_config.erl | 1 + src/ejabberd_ctl.erl | 1 + src/ejabberd_hooks.erl | 1 + src/{web => }/ejabberd_http.erl | 1 + src/{web => }/ejabberd_http_bind.erl | 1 + src/{web => }/ejabberd_http_bindjson.erl | 1 + src/{web => }/ejabberd_http_poll.erl | 1 + src/{web => }/ejabberd_http_ws.erl | 1 + src/{web => }/ejabberd_http_wsjson.erl | 1 + src/ejabberd_listener.erl | 1 + src/ejabberd_local.erl | 1 + src/ejabberd_logger.erl | 35 - src/ejabberd_logger_h.erl | 236 -- src/ejabberd_loglevel.erl | 194 - src/{odbc => }/ejabberd_odbc.erl | 1 + src/{odbc => }/ejabberd_odbc_sup.erl | 1 + src/ejabberd_piefxis.erl | 1 + src/ejabberd_rdbms.erl | 1 + src/ejabberd_receiver.erl | 1 + src/ejabberd_riak.erl | 1 + src/ejabberd_riak_sup.erl | 1 + src/ejabberd_router.erl | 1 + src/ejabberd_router_multicast.erl | 1 + src/ejabberd_s2s.erl | 1 + src/ejabberd_s2s_in.erl | 1 + src/ejabberd_s2s_out.erl | 1 + src/ejabberd_service.erl | 1 + src/ejabberd_sm.erl | 1 + src/ejabberd_sm_handler.erl | 1 + src/ejabberd_socket.erl | 1 + src/ejabberd_system_monitor.erl | 1 + src/ejabberd_update.erl | 1 + src/{web => }/ejabberd_web.erl | 1 + src/{web => }/ejabberd_web_admin.erl | 1 + src/{web => }/ejabberd_websocket.erl | 1 + src/{web => }/ejabberd_ws.erl | 0 src/ejabberd_xmlrpc.erl | 1 + src/ejabberd_zlib/Makefile.in | 63 - src/ejabberd_zlib/Makefile.win32 | 36 - src/ejabberd_zlib/ejabberd_zlib.erl | 208 -- src/ejabberd_zlib/ejabberd_zlib_drv.c | 219 -- src/{eldap => }/eldap.erl | 1 + src/eldap/Makefile.in | 59 - src/eldap/Makefile.win32 | 44 - src/{eldap => }/eldap_filter.erl | 0 src/{eldap => }/eldap_filter_yecc.yrl | 0 src/{eldap => }/eldap_pool.erl | 1 + src/{eldap => }/eldap_utils.erl | 1 + src/extauth.erl | 1 + src/gen_iq_handler.erl | 1 + src/gen_mod.erl | 1 + src/{mod_pubsub => }/gen_pubsub_node.erl | 0 src/{mod_pubsub => }/gen_pubsub_nodetree.erl | 0 src/jd2ejd.erl | 1 + src/log.hrl | 38 - src/mod_ack.erl | 1 + src/mod_adhoc.erl | 1 + src/mod_admin_p1.erl | 1 + src/mod_announce.erl | 1 + src/mod_applepush.erl | 1 + src/mod_applepush_service.erl | 1 + src/mod_blocking.erl | 1 + src/{web => }/mod_bosh.erl | 1 + src/mod_c2s_debug.erl | 1 + src/mod_caps.erl | 1 + src/mod_carboncopy.erl | 1 + src/mod_configure.erl | 1 + src/mod_configure2.erl | 1 + src/mod_disco.erl | 1 + src/mod_echo.erl | 1 + src/{web => }/mod_http_bind.erl | 1 + src/{web => }/mod_http_bindjson.erl | 1 + src/{web => }/mod_http_fileserver.erl | 1 + src/{web => }/mod_http_fileserver_log.erl | 1 + src/mod_ip_blacklist.erl | 1 + src/{mod_irc => }/mod_irc.erl | 1 + src/mod_irc/Makefile.in | 60 - src/mod_irc/Makefile.win32 | 42 - src/mod_irc/iconv.erl | 82 - src/mod_irc/iconv_erl.c | 177 - src/{mod_irc => }/mod_irc_connection.erl | 1 + src/mod_last.erl | 1 + src/mod_mnesia_mngt.erl | 1 + src/{mod_muc => }/mod_muc.erl | 1 + src/mod_muc/Makefile.in | 42 - src/mod_muc/Makefile.win32 | 21 - src/{mod_muc => }/mod_muc_log.erl | 1 + src/{mod_muc => }/mod_muc_room.erl | 1 + src/mod_multicast.erl | 1 + src/mod_offline.erl | 5 +- src/mod_ping.erl | 1 + src/mod_pres_counter.erl | 1 + src/mod_privacy.erl | 1 + src/mod_private.erl | 1 + src/{mod_proxy65 => }/mod_proxy65.erl | 0 src/mod_proxy65/Makefile.in | 38 - src/mod_proxy65/Makefile.win32 | 27 - src/{mod_proxy65 => }/mod_proxy65_lib.erl | 0 src/{mod_proxy65 => }/mod_proxy65_service.erl | 1 + src/{mod_proxy65 => }/mod_proxy65_sm.erl | 0 src/{mod_proxy65 => }/mod_proxy65_stream.erl | 1 + src/{mod_pubsub => }/mod_pubsub.erl | 1 + src/mod_pubsub/Makefile.in | 46 - src/mod_pubsub/Makefile.win32 | 87 - src/{mod_pubsub => }/mod_pubsub_odbc.erl | 1 + src/mod_register.erl | 1 + src/{web => }/mod_register_web.erl | 1 + src/mod_roster.erl | 5 +- src/mod_service_log.erl | 1 + src/mod_shared_roster.erl | 5 +- src/mod_shared_roster_ldap.erl | 3 +- src/mod_sic.erl | 1 + src/mod_stats.erl | 1 + src/mod_time.erl | 1 + src/mod_vcard.erl | 1 + src/mod_vcard_ldap.erl | 3 +- src/mod_vcard_xupdate.erl | 1 + src/mod_version.erl | 1 + src/{mod_pubsub => }/node.template | 0 src/{mod_pubsub => }/node_buddy.erl | 0 src/{mod_pubsub => }/node_club.erl | 0 src/{mod_pubsub => }/node_dag.erl | 0 src/{mod_pubsub => }/node_dispatch.erl | 0 src/{mod_pubsub => }/node_flat.erl | 0 src/{mod_pubsub => }/node_flat_odbc.erl | 0 src/{mod_pubsub => }/node_hometree.erl | 0 src/{mod_pubsub => }/node_hometree_odbc.erl | 0 src/{mod_pubsub => }/node_mb.erl | 1 + src/{mod_pubsub => }/node_pep.erl | 1 + src/{mod_pubsub => }/node_pep_odbc.erl | 1 + src/{mod_pubsub => }/node_private.erl | 0 src/{mod_pubsub => }/node_public.erl | 0 src/{mod_pubsub => }/nodetree_dag.erl | 1 + src/{mod_pubsub => }/nodetree_tree.erl | 0 src/{mod_pubsub => }/nodetree_tree_odbc.erl | 0 src/{mod_pubsub => }/nodetree_virtual.erl | 0 src/odbc/Makefile.in | 38 - src/odbc/Makefile.win32 | 22 - src/{odbc => }/odbc_queries.erl | 1 + src/pam/Makefile.in | 47 - src/pam/epam.c | 273 -- src/pam/epam.erl | 142 - src/{web => }/pshb_http.erl | 3 +- src/{mod_pubsub => }/pubsub_db_odbc.erl | 0 src/{mod_pubsub => }/pubsub_debug.erl | 0 src/{mod_pubsub => }/pubsub_index.erl | 0 src/{mod_pubsub => }/pubsub_odbc.patch | 0 src/{mod_pubsub => }/pubsub_subscription.erl | 0 .../pubsub_subscription_odbc.erl | 0 src/sha.erl | 1 + src/shaper.erl | 1 + src/{web => }/simple_ws_check.erl | 1 + src/stringprep/Makefile.in | 60 - src/stringprep/Makefile.win32 | 40 - src/stringprep/stringprep.erl | 108 - src/stringprep/stringprep_drv.c | 432 --- src/stringprep/stringprep_sup.erl | 45 - src/stringprep/uni_data.c | 1257 ------- src/stringprep/uni_norm.c | 3264 ----------------- src/stringprep/uni_parse.tcl | 437 --- src/stringprep/uni_parse2.tcl | 702 ---- src/stun/Makefile.in | 38 - src/stun/Makefile.win32 | 18 - src/stun/ejabberd_stun.erl | 230 -- src/stun/stun.hrl | 59 - src/stun/stun_codec.erl | 293 -- src/tls/Makefile.in | 70 - src/tls/Makefile.win32 | 38 - src/tls/stdint.h | 232 -- src/tls/tls.erl | 385 -- src/tls/tls_drv.c | 655 ---- src/translate.erl | 1 + src/web/Makefile.in | 38 - src/web/Makefile.win32 | 33 - src/{web => }/websocket_test.erl | 0 src/win32_dns.erl | 1 + src/xml.erl | 1 + src/xmlrpc.app | 9 - src/xmlrpc.app.src | 8 - src/xmlrpc.erl | 272 -- src/xmlrpc.hrl | 41 - src/xmlrpc_decode.erl | 224 -- src/xmlrpc_encode.erl | 145 - src/xmlrpc_http.erl | 230 -- src/xmlrpc_util.erl | 37 - src/{web => }/xmpp_json.erl | 0 {src/win32 => win32}/CheckReqs.ini | 0 {src/win32 => win32}/CheckReqs1.ini | 0 {src/win32 => win32}/CheckReqs1H.ini | 0 {src/win32 => win32}/CheckService.ini | 0 {src/win32 => win32}/CheckUser.ini | 0 {src/win32 => win32}/CheckUserH.ini | 0 {src/win32 => win32}/ejabberd.cfg | 0 {src/win32 => win32}/ejabberd.ico | Bin {src/win32 => win32}/ejabberd.nsi | 0 {src/win32 => win32}/ejabberd_header.bmp | Bin {src/win32 => win32}/ejabberd_intro.bmp | Bin {src/win32 => win32}/inetrc | 0 337 files changed, 999 insertions(+), 13252 deletions(-) create mode 100644 Makefile.in rename src/Makefile.win32 => Makefile.win32 (100%) rename src/acinclude.m4 => acinclude.m4 (100%) rename src/eldap/ELDAPv3.asn => asn1/ELDAPv3.asn1 (100%) rename {src => asn1}/XmppAddr.asn1 (100%) rename {src => c_src}/expat_erl.c (100%) rename {src/tls => c_src}/sha_drv.c (100%) rename {src => c_src}/xml.c (99%) rename src/config.guess => config.guess (100%) rename src/config.sub => config.sub (100%) rename src/configure => configure (90%) rename src/configure.ac => configure.ac (84%) rename src/configure.bat => configure.bat (100%) rename src/ejabberd.cfg.example => ejabberd.cfg.example (100%) rename src/ejabberd.init.template => ejabberd.init.template (100%) rename src/ejabberdctl.cfg.example => ejabberdctl.cfg.example (100%) rename src/ejabberdctl.template => ejabberdctl.template (100%) rename {src => include}/adhoc.hrl (100%) rename {src/web => include}/bosh.hrl (100%) rename {src => include}/ejabberd.hrl (73%) rename {src => include}/ejabberd_c2s.hrl (100%) rename {src => include}/ejabberd_commands.hrl (100%) rename {src => include}/ejabberd_config.hrl (100%) rename {src => include}/ejabberd_ctl.hrl (100%) rename {src/web => include}/ejabberd_http.hrl (100%) rename {src/web => include}/ejabberd_web_admin.hrl (100%) rename {src/eldap => include}/eldap.hrl (100%) rename {src/web => include}/http_bind.hrl (100%) rename {src => include}/jlib.hrl (100%) rename {src => include}/licence.hrl (100%) rename {src/mod_muc => include}/mod_muc_room.hrl (100%) rename {src => include}/mod_privacy.hrl (100%) rename {src/mod_proxy65 => include}/mod_proxy65.hrl (100%) rename {src => include}/mod_roster.hrl (100%) rename {src/mod_pubsub => include}/pubsub.hrl (100%) rename src/inetrc => inetrc (100%) rename src/install-sh => install-sh (100%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/Makefile.in (100%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/Makefile.win32 (100%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/exmpp_pubsub.erl (100%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/mod_pubsub_dev.erl (100%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/node_flat_dev.erl (99%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/pubsub_api.hrl (100%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/pubsub_broadcast.erl (100%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/pubsub_core.erl (100%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/pubsub_db.erl (99%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/pubsub_db_mnesia.erl (100%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/pubsub_dev.hrl (100%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/pubsub_disco.erl (100%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/pubsub_groups.erl (100%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/pubsub_hooks.erl (100%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/pubsub_index_dev.erl (100%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/pubsub_options.erl (100%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/pubsub_parser.erl (100%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/pubsub_tools.erl (100%) rename {src/mod_pubsub_ng => mod_pubsub_ng}/xmpp_xdata.erl (100%) rename {src => priv}/msgs/ca.msg (100%) rename {src => priv}/msgs/ca.po (100%) rename {src => priv}/msgs/cs.msg (100%) rename {src => priv}/msgs/cs.po (100%) rename {src => priv}/msgs/de.msg (100%) rename {src => priv}/msgs/de.po (100%) rename {src => priv}/msgs/ejabberd.pot (100%) rename {src => priv}/msgs/el.msg (100%) rename {src => priv}/msgs/el.po (100%) rename {src => priv}/msgs/eo.msg (100%) rename {src => priv}/msgs/eo.po (100%) rename {src => priv}/msgs/es.msg (100%) rename {src => priv}/msgs/es.po (100%) rename {src => priv}/msgs/fr.msg (100%) rename {src => priv}/msgs/fr.po (100%) rename {src => priv}/msgs/gl.msg (100%) rename {src => priv}/msgs/gl.po (100%) rename {src => priv}/msgs/id.msg (100%) rename {src => priv}/msgs/id.po (100%) rename {src => priv}/msgs/it.msg (100%) rename {src => priv}/msgs/it.po (100%) rename {src => priv}/msgs/ja.msg (100%) rename {src => priv}/msgs/ja.po (100%) rename {src => priv}/msgs/nl.msg (100%) rename {src => priv}/msgs/nl.po (100%) rename {src => priv}/msgs/no.msg (100%) rename {src => priv}/msgs/no.po (100%) rename {src => priv}/msgs/pl.msg (100%) rename {src => priv}/msgs/pl.po (100%) rename {src => priv}/msgs/pt-br.msg (100%) rename {src => priv}/msgs/pt-br.po (100%) rename {src => priv}/msgs/pt.msg (100%) rename {src => priv}/msgs/pt.po (100%) rename {src => priv}/msgs/ru.msg (100%) rename {src => priv}/msgs/ru.po (100%) rename {src => priv}/msgs/sk.msg (100%) rename {src => priv}/msgs/sk.po (100%) rename {src => priv}/msgs/sv.msg (100%) rename {src => priv}/msgs/sv.po (100%) rename {src => priv}/msgs/th.msg (100%) rename {src => priv}/msgs/th.po (100%) rename {src => priv}/msgs/tr.msg (100%) rename {src => priv}/msgs/tr.po (100%) rename {src => priv}/msgs/uk.msg (100%) rename {src => priv}/msgs/uk.po (100%) rename {src => priv}/msgs/vi.msg (100%) rename {src => priv}/msgs/vi.po (100%) rename {src => priv}/msgs/wa.msg (100%) rename {src => priv}/msgs/wa.po (100%) rename {src => priv}/msgs/zh.msg (100%) rename {src => priv}/msgs/zh.po (100%) create mode 100644 rebar.config.in rename {src/odbc => sql}/mssql2000.sql (100%) rename {src/odbc => sql}/mssql2005.sql (100%) rename {src/odbc => sql}/mysql.sql (100%) rename {src/odbc => sql}/pg.sql (100%) delete mode 100644 src/Makefile.in delete mode 100644 src/dynamic_compile.erl delete mode 100644 src/ejabberd.app create mode 100644 src/ejabberd.app.src rename src/{web => }/ejabberd_bosh.erl (99%) rename src/{web => }/ejabberd_http.erl (99%) rename src/{web => }/ejabberd_http_bind.erl (99%) rename src/{web => }/ejabberd_http_bindjson.erl (99%) rename src/{web => }/ejabberd_http_poll.erl (99%) rename src/{web => }/ejabberd_http_ws.erl (99%) rename src/{web => }/ejabberd_http_wsjson.erl (99%) delete mode 100644 src/ejabberd_logger.erl delete mode 100644 src/ejabberd_logger_h.erl delete mode 100644 src/ejabberd_loglevel.erl rename src/{odbc => }/ejabberd_odbc.erl (99%) rename src/{odbc => }/ejabberd_odbc_sup.erl (99%) rename src/{web => }/ejabberd_web.erl (99%) rename src/{web => }/ejabberd_web_admin.erl (99%) rename src/{web => }/ejabberd_websocket.erl (99%) rename src/{web => }/ejabberd_ws.erl (100%) delete mode 100644 src/ejabberd_zlib/Makefile.in delete mode 100644 src/ejabberd_zlib/Makefile.win32 delete mode 100644 src/ejabberd_zlib/ejabberd_zlib.erl delete mode 100644 src/ejabberd_zlib/ejabberd_zlib_drv.c rename src/{eldap => }/eldap.erl (99%) delete mode 100644 src/eldap/Makefile.in delete mode 100644 src/eldap/Makefile.win32 rename src/{eldap => }/eldap_filter.erl (100%) rename src/{eldap => }/eldap_filter_yecc.yrl (100%) rename src/{eldap => }/eldap_pool.erl (99%) rename src/{eldap => }/eldap_utils.erl (99%) rename src/{mod_pubsub => }/gen_pubsub_node.erl (100%) rename src/{mod_pubsub => }/gen_pubsub_nodetree.erl (100%) delete mode 100644 src/log.hrl rename src/{web => }/mod_bosh.erl (99%) rename src/{web => }/mod_http_bind.erl (99%) rename src/{web => }/mod_http_bindjson.erl (99%) rename src/{web => }/mod_http_fileserver.erl (99%) rename src/{web => }/mod_http_fileserver_log.erl (99%) rename src/{mod_irc => }/mod_irc.erl (99%) delete mode 100644 src/mod_irc/Makefile.in delete mode 100644 src/mod_irc/Makefile.win32 delete mode 100644 src/mod_irc/iconv.erl delete mode 100644 src/mod_irc/iconv_erl.c rename src/{mod_irc => }/mod_irc_connection.erl (99%) rename src/{mod_muc => }/mod_muc.erl (99%) delete mode 100644 src/mod_muc/Makefile.in delete mode 100644 src/mod_muc/Makefile.win32 rename src/{mod_muc => }/mod_muc_log.erl (99%) rename src/{mod_muc => }/mod_muc_room.erl (99%) rename src/{mod_proxy65 => }/mod_proxy65.erl (100%) delete mode 100644 src/mod_proxy65/Makefile.in delete mode 100644 src/mod_proxy65/Makefile.win32 rename src/{mod_proxy65 => }/mod_proxy65_lib.erl (100%) rename src/{mod_proxy65 => }/mod_proxy65_service.erl (99%) rename src/{mod_proxy65 => }/mod_proxy65_sm.erl (100%) rename src/{mod_proxy65 => }/mod_proxy65_stream.erl (99%) rename src/{mod_pubsub => }/mod_pubsub.erl (99%) delete mode 100644 src/mod_pubsub/Makefile.in delete mode 100644 src/mod_pubsub/Makefile.win32 rename src/{mod_pubsub => }/mod_pubsub_odbc.erl (99%) rename src/{web => }/mod_register_web.erl (99%) rename src/{mod_pubsub => }/node.template (100%) rename src/{mod_pubsub => }/node_buddy.erl (100%) rename src/{mod_pubsub => }/node_club.erl (100%) rename src/{mod_pubsub => }/node_dag.erl (100%) rename src/{mod_pubsub => }/node_dispatch.erl (100%) rename src/{mod_pubsub => }/node_flat.erl (100%) rename src/{mod_pubsub => }/node_flat_odbc.erl (100%) rename src/{mod_pubsub => }/node_hometree.erl (100%) rename src/{mod_pubsub => }/node_hometree_odbc.erl (100%) rename src/{mod_pubsub => }/node_mb.erl (99%) rename src/{mod_pubsub => }/node_pep.erl (99%) rename src/{mod_pubsub => }/node_pep_odbc.erl (99%) rename src/{mod_pubsub => }/node_private.erl (100%) rename src/{mod_pubsub => }/node_public.erl (100%) rename src/{mod_pubsub => }/nodetree_dag.erl (99%) rename src/{mod_pubsub => }/nodetree_tree.erl (100%) rename src/{mod_pubsub => }/nodetree_tree_odbc.erl (100%) rename src/{mod_pubsub => }/nodetree_virtual.erl (100%) delete mode 100644 src/odbc/Makefile.in delete mode 100644 src/odbc/Makefile.win32 rename src/{odbc => }/odbc_queries.erl (99%) delete mode 100644 src/pam/Makefile.in delete mode 100644 src/pam/epam.c delete mode 100644 src/pam/epam.erl rename src/{web => }/pshb_http.erl (99%) rename src/{mod_pubsub => }/pubsub_db_odbc.erl (100%) rename src/{mod_pubsub => }/pubsub_debug.erl (100%) rename src/{mod_pubsub => }/pubsub_index.erl (100%) rename src/{mod_pubsub => }/pubsub_odbc.patch (100%) rename src/{mod_pubsub => }/pubsub_subscription.erl (100%) rename src/{mod_pubsub => }/pubsub_subscription_odbc.erl (100%) rename src/{web => }/simple_ws_check.erl (96%) delete mode 100644 src/stringprep/Makefile.in delete mode 100644 src/stringprep/Makefile.win32 delete mode 100644 src/stringprep/stringprep.erl delete mode 100644 src/stringprep/stringprep_drv.c delete mode 100644 src/stringprep/stringprep_sup.erl delete mode 100644 src/stringprep/uni_data.c delete mode 100644 src/stringprep/uni_norm.c delete mode 100644 src/stringprep/uni_parse.tcl delete mode 100644 src/stringprep/uni_parse2.tcl delete mode 100644 src/stun/Makefile.in delete mode 100644 src/stun/Makefile.win32 delete mode 100644 src/stun/ejabberd_stun.erl delete mode 100644 src/stun/stun.hrl delete mode 100644 src/stun/stun_codec.erl delete mode 100644 src/tls/Makefile.in delete mode 100644 src/tls/Makefile.win32 delete mode 100755 src/tls/stdint.h delete mode 100644 src/tls/tls.erl delete mode 100644 src/tls/tls_drv.c delete mode 100644 src/web/Makefile.in delete mode 100644 src/web/Makefile.win32 rename src/{web => }/websocket_test.erl (100%) delete mode 100644 src/xmlrpc.app delete mode 100644 src/xmlrpc.app.src delete mode 100644 src/xmlrpc.erl delete mode 100644 src/xmlrpc.hrl delete mode 100644 src/xmlrpc_decode.erl delete mode 100644 src/xmlrpc_encode.erl delete mode 100644 src/xmlrpc_http.erl delete mode 100644 src/xmlrpc_util.erl rename src/{web => }/xmpp_json.erl (100%) rename {src/win32 => win32}/CheckReqs.ini (100%) rename {src/win32 => win32}/CheckReqs1.ini (100%) rename {src/win32 => win32}/CheckReqs1H.ini (100%) rename {src/win32 => win32}/CheckService.ini (100%) rename {src/win32 => win32}/CheckUser.ini (100%) rename {src/win32 => win32}/CheckUserH.ini (100%) rename {src/win32 => win32}/ejabberd.cfg (100%) rename {src/win32 => win32}/ejabberd.ico (100%) rename {src/win32 => win32}/ejabberd.nsi (100%) rename {src/win32 => win32}/ejabberd_header.bmp (100%) rename {src/win32 => win32}/ejabberd_intro.bmp (100%) rename {src/win32 => win32}/inetrc (100%) diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 000000000..0977e93a8 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,115 @@ +REBAR = @REBAR@ +INSTALL = @INSTALL@ +SED = @SED@ +ERL = @ERL@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +DESTDIR = + +# /etc/ejabberd/ +ETCDIR = $(DESTDIR)@sysconfdir@/ejabberd + +# /sbin/ +SBINDIR = $(DESTDIR)@sbindir@ + +# /lib/ejabberd/ +EJABBERDDIR = $(DESTDIR)@libdir@/ejabberd + +# /share/doc/ejabberd +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +datarootdir = @datarootdir@ +DOCDIR = $(DESTDIR)@docdir@ + +# /usr/lib/ejabberd/ebin/ +BEAMDIR = $(EJABBERDDIR)/ebin + +# /usr/lib/ejabberd/include/ +INCLUDEDIR = $(EJABBERDDIR)/include + +# /usr/lib/ejabberd/priv/ +PRIVDIR = $(EJABBERDDIR)/priv + +# /usr/lib/ejabberd/priv/bin +PBINDIR = $(PRIVDIR)/bin + +# /usr/lib/ejabberd/priv/lib +SODIR = $(PRIVDIR)/lib + +# /usr/lib/ejabberd/priv/msgs +MSGSDIR = $(PRIVDIR)/msgs + +# /var/lib/ejabberd/ +SPOOLDIR = $(DESTDIR)@localstatedir@/lib/ejabberd + +# /var/lock/ejabberdctl +CTLLOCKDIR = $(DESTDIR)@localstatedir@/lock/ejabberdctl + +# /var/lib/ejabberd/.erlang.cookie +COOKIEFILE = $(SPOOLDIR)/.erlang.cookie + +# /var/log/ejabberd/ +LOGDIR = $(DESTDIR)@localstatedir@/log/ejabberd + +INSTALLUSER=@INSTALLUSER@ +# if no user was enabled, don't set privileges or ownership +ifeq ($(INSTALLUSER),) + O_USER= + G_USER= + CHOWN_COMMAND=echo + CHOWN_OUTPUT=/dev/null + INIT_USER=root +else + O_USER=-o $(INSTALLUSER) + G_USER=-g $(INSTALLUSER) + CHOWN_COMMAND=chown + CHOWN_OUTPUT=&1 + INIT_USER=$(INSTALLUSER) +endif + +all: deps/% src + +deps/%: + $(REBAR) get-deps + +src: + $(REBAR) compile + +translations: + contrib/extract_translations/prepare-translation.sh -updateall + +doc: + @subdirs="$(SUBDIRS)"; for subdir in $$subdirs; do \ + echo making $$target in $$subdir; \ + (cd $$subdir && $(MAKE) $$target) || exit 1; \ + done + +doc: + echo making $$target in doc; \ + (cd doc && $(MAKE) $$target) || exit 1 + +edoc: + $(ERL) -noinput +B -eval \ + 'case edoc:application(ejabberd, ".", []) of ok -> halt(0); error -> halt(1) end.' + +clean: + rebar clean + +distclean: clean + rm -f config.status + rm -f config.log + rm -f rebar.config + rm -rf deps/* + rm -f Makefile + [ ! -f ../ChangeLog ] || rm -f ../ChangeLog + +TAGS: + etags *.erl + +Makefile: Makefile.in + +dialyzer: $(BEAMS) + @dialyzer -c . + +.PHONY: src doc edoc dialyzer Makefile TAGS clean distclean diff --git a/src/Makefile.win32 b/Makefile.win32 similarity index 100% rename from src/Makefile.win32 rename to Makefile.win32 diff --git a/src/acinclude.m4 b/acinclude.m4 similarity index 100% rename from src/acinclude.m4 rename to acinclude.m4 diff --git a/src/eldap/ELDAPv3.asn b/asn1/ELDAPv3.asn1 similarity index 100% rename from src/eldap/ELDAPv3.asn rename to asn1/ELDAPv3.asn1 diff --git a/src/XmppAddr.asn1 b/asn1/XmppAddr.asn1 similarity index 100% rename from src/XmppAddr.asn1 rename to asn1/XmppAddr.asn1 diff --git a/src/expat_erl.c b/c_src/expat_erl.c similarity index 100% rename from src/expat_erl.c rename to c_src/expat_erl.c diff --git a/src/tls/sha_drv.c b/c_src/sha_drv.c similarity index 100% rename from src/tls/sha_drv.c rename to c_src/sha_drv.c diff --git a/src/xml.c b/c_src/xml.c similarity index 99% rename from src/xml.c rename to c_src/xml.c index 0a600e9f0..053694514 100644 --- a/src/xml.c +++ b/c_src/xml.c @@ -2,6 +2,8 @@ #include #include +#define SSL40 + #ifdef SSL40 #define ENIF_ALLOC(SIZE) enif_alloc(SIZE) #define ENIF_FREE(PTR) enif_free(PTR) diff --git a/src/config.guess b/config.guess similarity index 100% rename from src/config.guess rename to config.guess diff --git a/src/config.sub b/config.sub similarity index 100% rename from src/config.sub rename to config.sub diff --git a/src/configure b/configure similarity index 90% rename from src/configure rename to configure index e10c21b7b..245fadd68 100755 --- a/src/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68 for ejabberd 3.0.0. +# Generated by GNU Autoconf 2.67 for ejabberd 3.0.0. # # Report bugs to . # @@ -91,7 +91,6 @@ fi 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 @@ -217,18 +216,11 @@ IFS=$as_save_IFS # 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 export CONFIG_SHELL - 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+"$@"} + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : @@ -603,7 +595,6 @@ ac_includes_default="\ ac_default_prefix=/ ac_subst_vars='LTLIBOBJS -ERLCFLAGS target_os target_vendor target_cpu @@ -633,26 +624,6 @@ make_pam pam ZLIB_LIBS ZLIB_CFLAGS -make_ejabberd_zlib -ejabberd_zlib -make_web -web -make_tls -tls -make_odbc -odbc -make_eldap -eldap -make_mod_pubsub_ng -mod_pubsub_ng -make_mod_pubsub -mod_pubsub -make_mod_proxy65 -mod_proxy65 -make_mod_muc -mod_muc -make_mod_irc -mod_irc LIBOBJS EXPAT_LIBS EXPAT_CFLAGS @@ -660,11 +631,17 @@ EGREP GREP CPP LIBICONV -ERLANG_SSLVER -ERLANG_LIBS -ERLANG_CFLAGS -ERL +MAKE +REBAR +ERLANG_LIB_DIR +ERLANG_ROOT_DIR +ERLCFLAGS ERLC +ERL +SED +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM SET_MAKE OBJEXT EXEEXT @@ -714,19 +691,8 @@ SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking -with_erlang with_libiconv_prefix with_expat -enable_mod_irc -enable_mod_muc -enable_mod_proxy65 -enable_mod_pubsub -enable_mod_pubsub_ng -enable_eldap -enable_odbc -enable_tls -enable_web -enable_ejabberd_zlib with_zlib enable_pam with_pam @@ -748,9 +714,10 @@ CFLAGS LDFLAGS LIBS CPPFLAGS -CPP +ERL ERLC -ERLCFLAGS' +ERLCFLAGS +CPP' # Initialize some variables set by options. @@ -1155,7 +1122,7 @@ Try \`$0 --help' for more information" $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}" + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac @@ -1367,16 +1334,6 @@ 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-mod_irc enable mod_irc (default: yes) - --enable-mod_muc enable mod_muc (default: yes) - --enable-mod_proxy65 enable mod_proxy65 (default: yes) - --enable-mod_pubsub enable mod_pubsub (default: yes) - --enable-mod_pubsub_ng enable mod_pubsub_ng (default: yes) - --enable-eldap enable eldap (default: yes) - --enable-odbc enable odbc (default: no) - --enable-tls enable tls (default: yes) - --enable-web enable web (default: yes) - --enable-ejabberd_zlib enable ejabberd_zlib (default: yes) --enable-pam enable pam (default: no) --enable-hipe compile natively with HiPE, not recommended (default: no) @@ -1400,7 +1357,6 @@ Optional Features: Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-erlang=PREFIX path to erlc and erl --with-libiconv-prefix=PREFIX prefix where libiconv is installed --with-expat=PREFIX prefix where EXPAT is installed @@ -1416,9 +1372,10 @@ Some influential environment variables: 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 + ERL Erlang/OTP interpreter command [autodetected] ERLC Erlang/OTP compiler command [autodetected] ERLCFLAGS Erlang/OTP compiler flags [none] + CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -1487,7 +1444,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF ejabberd configure 3.0.0 -generated by GNU Autoconf 2.68 +generated by GNU Autoconf 2.67 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation @@ -1533,11 +1490,53 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_compile +# ac_fn_erl_try_run LINENO +# ------------------------ +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_erl_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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_erl_try_run + # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. @@ -1579,7 +1578,7 @@ fi # 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 + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_link @@ -1616,7 +1615,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_cpp @@ -1629,10 +1628,10 @@ fi 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 : + if eval "test \"\${$3+set}\"" = set; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 @@ -1699,7 +1698,7 @@ $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 : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" @@ -1708,7 +1707,7 @@ 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 + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_mongrel @@ -1749,7 +1748,7 @@ 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 + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_run @@ -1763,7 +1762,7 @@ 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 : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -1781,57 +1780,15 @@ 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 + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_compile - -# ac_fn_erl_try_run LINENO -# ------------------------ -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_erl_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_erl_try_run 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 ejabberd $as_me 3.0.0, which was -generated by GNU Autoconf 2.68. Invocation command line was +generated by GNU Autoconf 2.67. Invocation command line was $ $0 $@ @@ -2089,7 +2046,7 @@ $as_echo "$as_me: loading site script $ac_site_file" >&6;} || { { $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; } +See \`config.log' for more details" "$LINENO" 5 ; } fi done @@ -2190,7 +2147,7 @@ if test -n "$ac_tool_prefix"; then 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 : +if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -2230,7 +2187,7 @@ if test -z "$ac_cv_prog_CC"; then 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 : +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -2283,7 +2240,7 @@ if test -z "$CC"; then 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 : +if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -2323,7 +2280,7 @@ if test -z "$CC"; then 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 : +if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -2382,7 +2339,7 @@ if test -z "$CC"; then 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 : +if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -2426,7 +2383,7 @@ do 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 : +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -2481,7 +2438,7 @@ 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; } +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 @@ -2596,7 +2553,7 @@ 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; } +See \`config.log' for more details" "$LINENO" 5 ; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } @@ -2639,7 +2596,7 @@ 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; } +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 @@ -2698,7 +2655,7 @@ $as_echo "$ac_try_echo"; } >&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; } +See \`config.log' for more details" "$LINENO" 5 ; } fi fi fi @@ -2709,7 +2666,7 @@ 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 : +if test "${ac_cv_objext+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -2750,7 +2707,7 @@ 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; } +See \`config.log' for more details" "$LINENO" 5 ; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi @@ -2760,7 +2717,7 @@ 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 : +if test "${ac_cv_c_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -2797,7 +2754,7 @@ 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 : +if test "${ac_cv_prog_cc_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag @@ -2875,7 +2832,7 @@ else 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 : +if test "${ac_cv_prog_cc_c89+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no @@ -2974,7 +2931,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu $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 : +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF @@ -3001,125 +2958,215 @@ $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi +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 test "${ac_cv_path_install+set}" = set; 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 { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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 for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if test "${ac_cv_path_SED+set}" = set; 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" + { test -f "$ac_path_SED" && $as_test_x "$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 + if test "x$GCC" = "xyes"; then CFLAGS="$CFLAGS -Wall" fi -#locating erlang - -# Check whether --with-erlang was given. -if test "${with_erlang+set}" = set; then : - withval=$with_erlang; -fi - - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}erlc", so it can be a program name with args. -set dummy ${ac_tool_prefix}erlc; 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_ERLC+:} false; then : - $as_echo_n "(cached) " >&6 +# Checks Erlang runtime and compiler +if test -n "$ERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for erl" >&5 +$as_echo_n "checking for erl... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERL" >&5 +$as_echo "$ERL" >&6; } else - case $ERLC in - [\\/]* | ?:[\\/]*) - ac_cv_path_ERLC="$ERLC" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_dummy="$with_erlang:$with_erlang/bin:$PATH" -for as_dir in $as_dummy -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_ERLC="$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 -ERLC=$ac_cv_path_ERLC -if test -n "$ERLC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERLC" >&5 -$as_echo "$ERLC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_ERLC"; then - ac_pt_ERLC=$ERLC - # Extract the first word of "erlc", so it can be a program name with args. -set dummy erlc; 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_ERLC+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_ERLC in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_ERLC="$ac_pt_ERLC" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_dummy="$with_erlang:$with_erlang/bin:$PATH" -for as_dir in $as_dummy -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_ac_pt_ERLC="$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_ERLC=$ac_cv_path_ac_pt_ERLC -if test -n "$ac_pt_ERLC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_ERLC" >&5 -$as_echo "$ac_pt_ERLC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_ERLC" = x; then - ERLC="" - 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 - ERLC=$ac_pt_ERLC - fi -else - ERLC="$ac_cv_path_ERLC" -fi - - if test -n "$ac_tool_prefix"; then + if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}erl", so it can be a program name with args. set dummy ${ac_tool_prefix}erl; 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_ERL+:} false; then : +if test "${ac_cv_path_ERL+set}" = set; then : $as_echo_n "(cached) " >&6 else case $ERL in @@ -3128,8 +3175,7 @@ else ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_dummy="$with_erlang:$with_erlang/bin:$PATH" -for as_dir in $as_dummy +for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. @@ -3163,7 +3209,7 @@ if test -z "$ac_cv_path_ERL"; then set dummy erl; 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_ERL+:} false; then : +if test "${ac_cv_path_ac_pt_ERL+set}" = set; then : $as_echo_n "(cached) " >&6 else case $ac_pt_ERL in @@ -3172,8 +3218,7 @@ else ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_dummy="$with_erlang:$with_erlang/bin:$PATH" -for as_dir in $as_dummy +for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. @@ -3200,7 +3245,7 @@ $as_echo "no" >&6; } fi if test "x$ac_pt_ERL" = x; then - ERL="" + ERL="not found" else case $cross_compiling:$ac_tool_warned in yes:) @@ -3213,95 +3258,317 @@ esac else ERL="$ac_cv_path_ERL" fi +fi + +if test "$ERL" = "not found"; then + as_fn_error $? "Erlang/OTP interpreter (erl) not found but required" "$LINENO" 5 +fi + +if test -n "$ERLC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for erlc" >&5 +$as_echo_n "checking for erlc... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERLC" >&5 +$as_echo "$ERLC" >&6; } +else + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}erlc", so it can be a program name with args. +set dummy ${ac_tool_prefix}erlc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_ERLC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $ERLC in + [\\/]* | ?:[\\/]*) + ac_cv_path_ERLC="$ERLC" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ERLC="$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 +ERLC=$ac_cv_path_ERLC +if test -n "$ERLC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERLC" >&5 +$as_echo "$ERLC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi - if test "z$ERLC" = "z" || test "z$ERL" = "z"; then - as_fn_error $? "erlang not found" "$LINENO" 5 - fi +fi +if test -z "$ac_cv_path_ERLC"; then + ac_pt_ERLC=$ERLC + # Extract the first word of "erlc", so it can be a program name with args. +set dummy erlc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_ac_pt_ERLC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_ERLC in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_ERLC="$ac_pt_ERLC" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ac_pt_ERLC="$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_ERLC=$ac_cv_path_ac_pt_ERLC +if test -n "$ac_pt_ERLC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_ERLC" >&5 +$as_echo "$ac_pt_ERLC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_ERLC" = x; then + ERLC="not found" + 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 + ERLC=$ac_pt_ERLC + fi +else + ERLC="$ac_cv_path_ERLC" +fi + +fi + +if test "$ERLC" = "not found"; then + as_fn_error $? "Erlang/OTP compiler (erlc) not found but required" "$LINENO" 5 +fi - cat >>conftest.erl <<_EOF +# Checks and sets ERLANG_ROOT_DIR and ERLANG_LIB_DIR variable +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP root directory" >&5 +$as_echo_n "checking for Erlang/OTP root directory... " >&6; } +if test "${ac_cv_erlang_root_dir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=erl +ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' +ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' + if test "$cross_compiling" = yes; then : + { { $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 test program while cross compiling +See \`config.log' for more details" "$LINENO" 5 ; } +else + cat > conftest.$ac_ext <<_ACEOF -module(conftest). --author('alexey@sevcom.net'). - -export([start/0]). start() -> - EIDirS = code:lib_dir("erl_interface") ++ "\n", - EILibS = libpath("erl_interface") ++ "\n", - RootDirS = code:root_dir() ++ "\n", - file:write_file("conftest.out", list_to_binary(EIDirS ++ EILibS ++ ssldef() ++ RootDirS)), - halt(). + RootDir = code:root_dir(), + file:write_file("conftest.out", RootDir), + ReturnValue = 0, + halt(ReturnValue) +. -ssldef() -> - OTP = (catch erlang:system_info(otp_release)), - if - OTP >= "R14" -> "-DSSL40\n"; - OTP >= "R12" -> "-DSSL39\n"; - true -> "\n" - end. +_ACEOF +if ac_fn_erl_try_run "$LINENO"; then : + ac_cv_erlang_root_dir=`cat conftest.out` + rm -f conftest.out +else + rm -f conftest.out + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "test Erlang program execution failed +See \`config.log' for more details" "$LINENO" 5 ; } +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi -%% return physical architecture based on OS/Processor -archname() -> - ArchStr = erlang:system_info(system_architecture), - case os:type() of - {win32, _} -> "windows"; - {unix,UnixName} -> - Specs = string:tokens(ArchStr,"-"), - Cpu = case lists:nth(2,Specs) of - "pc" -> "x86"; - _ -> hd(Specs) - end, - atom_to_list(UnixName) ++ "-" ++ Cpu; - _ -> "generic" - end. + 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 -%% Return arch-based library path or a default value if this directory -%% does not exist -libpath(App) -> - PrivDir = code:priv_dir(App), - ArchDir = archname(), - LibArchDir = filename:join([PrivDir,"lib",ArchDir]), - case file:list_dir(LibArchDir) of - %% Arch lib dir exists: We use it - {ok, _List} -> LibArchDir; - %% Arch lib dir does not exist: Return the default value - %% ({error, enoent}): - _Error -> code:lib_dir("erl_interface") ++ "/lib" - end. +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_root_dir" >&5 +$as_echo "$ac_cv_erlang_root_dir" >&6; } +ERLANG_ROOT_DIR=$ac_cv_erlang_root_dir -_EOF - if ! $ERLC conftest.erl; then - as_fn_error $? "could not compile sample program" "$LINENO" 5 - fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP library base directory" >&5 +$as_echo_n "checking for Erlang/OTP library base directory... " >&6; } +if test "${ac_cv_erlang_lib_dir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=erl +ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' +ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' + if test "$cross_compiling" = yes; then : + { { $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 test program while cross compiling +See \`config.log' for more details" "$LINENO" 5 ; } +else + cat > conftest.$ac_ext <<_ACEOF +-module(conftest). +-export([start/0]). - if ! $ERL -s conftest -noshell; then - as_fn_error $? "could not run sample program" "$LINENO" 5 - fi +start() -> + LibDir = code:lib_dir(), + file:write_file("conftest.out", LibDir), + ReturnValue = 0, + halt(ReturnValue) +. - if ! test -f conftest.out; then - as_fn_error $? "erlang program was not properly executed, (conftest.out was not produced)" "$LINENO" 5 - fi +_ACEOF +if ac_fn_erl_try_run "$LINENO"; then : + ac_cv_erlang_lib_dir=`cat conftest.out` + rm -f conftest.out +else + rm -f conftest.out + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "test Erlang program execution failed +See \`config.log' for more details" "$LINENO" 5 ; } +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi - # First line - ERLANG_EI_DIR=`cat conftest.out | head -n 1` - # Second line - ERLANG_EI_LIB=`cat conftest.out | head -n 2 | tail -n 1` - # Third line - ERLANG_SSLVER=`cat conftest.out | head -n 3 | tail -n 1` - # End line - ERLANG_DIR=`cat conftest.out | tail -n 1` + 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 - ERLANG_CFLAGS="-I$ERLANG_EI_DIR/include -I$ERLANG_DIR/usr/include" - ERLANG_LIBS="-L$ERLANG_EI_LIB -lerl_interface -lei" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_dir" >&5 +$as_echo "$ac_cv_erlang_lib_dir" >&6; } +ERLANG_LIB_DIR=$ac_cv_erlang_lib_dir +#locating rebar +# Extract the first word of "rebar", so it can be a program name with args. +set dummy rebar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_REBAR+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $REBAR in + [\\/]* | ?:[\\/]*) + ac_cv_path_REBAR="$REBAR" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_REBAR="$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 +REBAR=$ac_cv_path_REBAR +if test -n "$REBAR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $REBAR" >&5 +$as_echo "$REBAR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +#locating make +# Extract the first word of "make", so it can be a program name with args. +set dummy make; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_MAKE+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MAKE"; then + ac_cv_prog_MAKE="$MAKE" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_MAKE="make" + $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 +MAKE=$ac_cv_prog_MAKE +if test -n "$MAKE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAKE" >&5 +$as_echo "$MAKE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +if test "x$REBAR" = "x"; then + as_fn_error $? "'rebar' was not found" "$LINENO" 5 +fi + +if test "x$MAKE" = "x"; then + as_fn_error $? "'make' was not found" "$LINENO" 5 +fi #locating iconv @@ -3321,7 +3588,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } -if ${am_cv_func_iconv+:} false; then : +if test "${am_cv_func_iconv+set}" = set; then : $as_echo_n "(cached) " >&6 else @@ -3415,7 +3682,7 @@ $as_echo "#define HAVE_ICONV 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 $as_echo_n "checking for iconv declaration... " >&6; } - if ${am_cv_proto_iconv+:} false; then : + if test "${am_cv_proto_iconv+set}" = set; then : $as_echo_n "(cached) " >&6 else @@ -3481,7 +3748,7 @@ if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : + if test "${ac_cv_prog_CPP+set}" = set; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded @@ -3597,7 +3864,7 @@ 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; } +See \`config.log' for more details" "$LINENO" 5 ; } fi ac_ext=c @@ -3609,7 +3876,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu { $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 : +if test "${ac_cv_path_GREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then @@ -3672,7 +3939,7 @@ $as_echo "$ac_cv_path_GREP" >&6; } { $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 : +if test "${ac_cv_path_EGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 @@ -3739,7 +4006,7 @@ $as_echo "$ac_cv_path_EGREP" >&6; } { $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 : +if test "${ac_cv_header_stdc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -3882,7 +4149,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML_ParserCreate in -lexpat" >&5 $as_echo_n "checking for XML_ParserCreate in -lexpat... " >&6; } -if ${ac_cv_lib_expat_XML_ParserCreate+:} false; then : +if test "${ac_cv_lib_expat_XML_ParserCreate+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -3916,7 +4183,7 @@ LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_expat_XML_ParserCreate" >&5 $as_echo "$ac_cv_lib_expat_XML_ParserCreate" >&6; } -if test "x$ac_cv_lib_expat_XML_ParserCreate" = xyes; then : +if test "x$ac_cv_lib_expat_XML_ParserCreate" = x""yes; then : EXPAT_LIBS="$EXPAT_LIBS -lexpat" expat_found=yes else @@ -3933,7 +4200,7 @@ fi for ac_header in expat.h do : ac_fn_c_check_header_mongrel "$LINENO" "expat.h" "ac_cv_header_expat_h" "$ac_includes_default" -if test "x$ac_cv_header_expat_h" = xyes; then : +if test "x$ac_cv_header_expat_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_EXPAT_H 1 _ACEOF @@ -3957,7 +4224,7 @@ done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if ${ac_cv_c_const+:} false; then : +if test "${ac_cv_c_const+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -4046,7 +4313,7 @@ fi for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" -if test "x$ac_cv_header_stdlib_h" = xyes; then : +if test "x$ac_cv_header_stdlib_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF @@ -4057,7 +4324,7 @@ done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } -if ${ac_cv_func_malloc_0_nonnull+:} false; then : +if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -4112,7 +4379,7 @@ fi { $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 : +if test "${ac_cv_header_stdc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -4223,227 +4490,6 @@ $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi - -mod_irc= -make_mod_irc= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build mod_irc" >&5 -$as_echo_n "checking whether build mod_irc... " >&6; } -# Check whether --enable-mod_irc was given. -if test "${enable_mod_irc+set}" = set; then : - enableval=$enable_mod_irc; mr_enable_mod_irc="$enableval" -else - mr_enable_mod_irc=yes -fi - -if test "$mr_enable_mod_irc" = "yes"; then -mod_irc=mod_irc -make_mod_irc=mod_irc/Makefile -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_mod_irc" >&5 -$as_echo "$mr_enable_mod_irc" >&6; } - - - - - -mod_muc= -make_mod_muc= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build mod_muc" >&5 -$as_echo_n "checking whether build mod_muc... " >&6; } -# Check whether --enable-mod_muc was given. -if test "${enable_mod_muc+set}" = set; then : - enableval=$enable_mod_muc; mr_enable_mod_muc="$enableval" -else - mr_enable_mod_muc=yes -fi - -if test "$mr_enable_mod_muc" = "yes"; then -mod_muc=mod_muc -make_mod_muc=mod_muc/Makefile -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_mod_muc" >&5 -$as_echo "$mr_enable_mod_muc" >&6; } - - - - - -mod_proxy65= -make_mod_proxy65= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build mod_proxy65" >&5 -$as_echo_n "checking whether build mod_proxy65... " >&6; } -# Check whether --enable-mod_proxy65 was given. -if test "${enable_mod_proxy65+set}" = set; then : - enableval=$enable_mod_proxy65; mr_enable_mod_proxy65="$enableval" -else - mr_enable_mod_proxy65=yes -fi - -if test "$mr_enable_mod_proxy65" = "yes"; then -mod_proxy65=mod_proxy65 -make_mod_proxy65=mod_proxy65/Makefile -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_mod_proxy65" >&5 -$as_echo "$mr_enable_mod_proxy65" >&6; } - - - - - -mod_pubsub= -make_mod_pubsub= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build mod_pubsub" >&5 -$as_echo_n "checking whether build mod_pubsub... " >&6; } -# Check whether --enable-mod_pubsub was given. -if test "${enable_mod_pubsub+set}" = set; then : - enableval=$enable_mod_pubsub; mr_enable_mod_pubsub="$enableval" -else - mr_enable_mod_pubsub=yes -fi - -if test "$mr_enable_mod_pubsub" = "yes"; then -mod_pubsub=mod_pubsub -make_mod_pubsub=mod_pubsub/Makefile -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_mod_pubsub" >&5 -$as_echo "$mr_enable_mod_pubsub" >&6; } - - - - - -mod_pubsub_ng= -make_mod_pubsub_ng= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build mod_pubsub_ng" >&5 -$as_echo_n "checking whether build mod_pubsub_ng... " >&6; } -# Check whether --enable-mod_pubsub_ng was given. -if test "${enable_mod_pubsub_ng+set}" = set; then : - enableval=$enable_mod_pubsub_ng; mr_enable_mod_pubsub_ng="$enableval" -else - mr_enable_mod_pubsub_ng=yes -fi - -if test "$mr_enable_mod_pubsub_ng" = "yes"; then -mod_pubsub_ng=mod_pubsub_ng -make_mod_pubsub_ng=mod_pubsub_ng/Makefile -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_mod_pubsub_ng" >&5 -$as_echo "$mr_enable_mod_pubsub_ng" >&6; } - - - - - -eldap= -make_eldap= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build eldap" >&5 -$as_echo_n "checking whether build eldap... " >&6; } -# Check whether --enable-eldap was given. -if test "${enable_eldap+set}" = set; then : - enableval=$enable_eldap; mr_enable_eldap="$enableval" -else - mr_enable_eldap=yes -fi - -if test "$mr_enable_eldap" = "yes"; then -eldap=eldap -make_eldap=eldap/Makefile -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_eldap" >&5 -$as_echo "$mr_enable_eldap" >&6; } - - - - - -odbc= -make_odbc= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build odbc" >&5 -$as_echo_n "checking whether build odbc... " >&6; } -# Check whether --enable-odbc was given. -if test "${enable_odbc+set}" = set; then : - enableval=$enable_odbc; mr_enable_odbc="$enableval" -else - mr_enable_odbc=no -fi - -if test "$mr_enable_odbc" = "yes"; then -odbc=odbc -make_odbc=odbc/Makefile -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_odbc" >&5 -$as_echo "$mr_enable_odbc" >&6; } - - - - - -tls= -make_tls= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build tls" >&5 -$as_echo_n "checking whether build tls... " >&6; } -# Check whether --enable-tls was given. -if test "${enable_tls+set}" = set; then : - enableval=$enable_tls; mr_enable_tls="$enableval" -else - mr_enable_tls=yes -fi - -if test "$mr_enable_tls" = "yes"; then -tls=tls -make_tls=tls/Makefile -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_tls" >&5 -$as_echo "$mr_enable_tls" >&6; } - - - - - -web= -make_web= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build web" >&5 -$as_echo_n "checking whether build web... " >&6; } -# Check whether --enable-web was given. -if test "${enable_web+set}" = set; then : - enableval=$enable_web; mr_enable_web="$enableval" -else - mr_enable_web=yes -fi - -if test "$mr_enable_web" = "yes"; then -web=web -make_web=web/Makefile -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_web" >&5 -$as_echo "$mr_enable_web" >&6; } - - - - - - -ejabberd_zlib= -make_ejabberd_zlib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build ejabberd_zlib" >&5 -$as_echo_n "checking whether build ejabberd_zlib... " >&6; } -# Check whether --enable-ejabberd_zlib was given. -if test "${enable_ejabberd_zlib+set}" = set; then : - enableval=$enable_ejabberd_zlib; mr_enable_ejabberd_zlib="$enableval" -else - mr_enable_ejabberd_zlib=yes -fi - -if test "$mr_enable_ejabberd_zlib" = "yes"; then -ejabberd_zlib=ejabberd_zlib -make_ejabberd_zlib=ejabberd_zlib/Makefile -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_ejabberd_zlib" >&5 -$as_echo "$mr_enable_ejabberd_zlib" >&6; } - - - - #locating zlib # Check whether --with-zlib was given. @@ -4462,7 +4508,7 @@ if test x"$ejabberd_zlib" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzgets in -lz" >&5 $as_echo_n "checking for gzgets in -lz... " >&6; } -if ${ac_cv_lib_z_gzgets+:} false; then : +if test "${ac_cv_lib_z_gzgets+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -4496,7 +4542,7 @@ LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzgets" >&5 $as_echo "$ac_cv_lib_z_gzgets" >&6; } -if test "x$ac_cv_lib_z_gzgets" = xyes; then : +if test "x$ac_cv_lib_z_gzgets" = x""yes; then : ZLIB_LIBS="$ZLIB_LIBS -lz" zlib_found=yes else @@ -4513,7 +4559,7 @@ fi for ac_header in zlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" -if test "x$ac_cv_header_zlib_h" = xyes; then : +if test "x$ac_cv_header_zlib_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ZLIB_H 1 _ACEOF @@ -4574,7 +4620,7 @@ if test x"$pam" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pam_start in -lpam" >&5 $as_echo_n "checking for pam_start in -lpam... " >&6; } -if ${ac_cv_lib_pam_pam_start+:} false; then : +if test "${ac_cv_lib_pam_pam_start+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -4608,7 +4654,7 @@ LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pam_pam_start" >&5 $as_echo "$ac_cv_lib_pam_pam_start" >&6; } -if test "x$ac_cv_lib_pam_pam_start" = xyes; then : +if test "x$ac_cv_lib_pam_pam_start" = x""yes; then : PAM_LIBS="$PAM_LIBS -lpam" pam_found=yes else @@ -4625,7 +4671,7 @@ fi for ac_header in security/pam_appl.h do : ac_fn_c_check_header_mongrel "$LINENO" "security/pam_appl.h" "ac_cv_header_security_pam_appl_h" "$ac_includes_default" -if test "x$ac_cv_header_security_pam_appl_h" = xyes; then : +if test "x$ac_cv_header_security_pam_appl_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SECURITY_PAM_APPL_H 1 _ACEOF @@ -4652,7 +4698,7 @@ if test "${enable_hipe+set}" = set; then : enableval=$enable_hipe; case "${enableval}" in yes) hipe=true ;; no) hipe=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-hipe" "$LINENO" 5 ;; + *) as_fn_error $? "bad value ${enableval} for --enable-hipe" "$LINENO" 5 ;; esac else hipe=false @@ -4665,7 +4711,7 @@ if test "${enable_roster_gateway_workaround+set}" = set; then : enableval=$enable_roster_gateway_workaround; case "${enableval}" in yes) roster_gateway_workaround=true ;; no) roster_gateway_workaround=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-roster-gateway-workaround" "$LINENO" 5 ;; + *) as_fn_error $? "bad value ${enableval} for --enable-roster-gateway-workaround" "$LINENO" 5 ;; esac else roster_gateway_workaround=false @@ -4678,7 +4724,7 @@ if test "${enable_flash_hack+set}" = set; then : enableval=$enable_flash_hack; case "${enableval}" in yes) flash_hack=true ;; no) flash_hack=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-flash-hack" "$LINENO" 5 ;; + *) as_fn_error $? "bad value ${enableval} for --enable-flash-hack" "$LINENO" 5 ;; esac else flash_hack=false @@ -4691,7 +4737,7 @@ if test "${enable_mssql+set}" = set; then : enableval=$enable_mssql; case "${enableval}" in yes) db_type=mssql ;; no) db_type=generic ;; - *) as_fn_error $? "bad value ${enableval} for --enable-mssql" "$LINENO" 5 ;; + *) as_fn_error $? "bad value ${enableval} for --enable-mssql" "$LINENO" 5 ;; esac else db_type=generic @@ -4704,7 +4750,7 @@ if test "${enable_transient_supervisors+set}" = set; then : enableval=$enable_transient_supervisors; case "${enableval}" in yes) transient_supervisors=true ;; no) transient_supervisors=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-transient_supervisors" "$LINENO" 5 ;; + *) as_fn_error $? "bad value ${enableval} for --enable-transient_supervisors" "$LINENO" 5 ;; esac else transient_supervisors=true @@ -4717,7 +4763,7 @@ if test "${enable_full_xml+set}" = set; then : enableval=$enable_full_xml; case "${enableval}" in yes) full_xml=true ;; no) full_xml=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-full-xml" "$LINENO" 5 ;; + *) as_fn_error $? "bad value ${enableval} for --enable-full-xml" "$LINENO" 5 ;; esac else full_xml=false @@ -4730,7 +4776,7 @@ if test "${enable_nif+set}" = set; then : enableval=$enable_nif; case "${enableval}" in yes) nif=true ;; no) nif=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-nif" "$LINENO" 5 ;; + *) as_fn_error $? "bad value ${enableval} for --enable-nif" "$LINENO" 5 ;; esac else nif=false @@ -4738,7 +4784,8 @@ fi -ac_config_files="$ac_config_files Makefile $make_mod_irc $make_mod_muc $make_mod_pubsub $make_mod_pubsub_ng $make_mod_proxy65 $make_eldap $make_pam $make_web stringprep/Makefile stun/Makefile $make_tls $make_odbc $make_ejabberd_zlib" +ac_config_files="$ac_config_files Makefile rebar.config" + #openssl @@ -4757,7 +4804,7 @@ if test x"$tls" != x; then SSL_LIBS="-L$ssl_prefix/lib -lcrypto" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_new in -lssl" >&5 $as_echo_n "checking for SSL_new in -lssl... " >&6; } -if ${ac_cv_lib_ssl_SSL_new+:} false; then : +if test "${ac_cv_lib_ssl_SSL_new+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -4791,7 +4838,7 @@ LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ssl_SSL_new" >&5 $as_echo "$ac_cv_lib_ssl_SSL_new" >&6; } -if test "x$ac_cv_lib_ssl_SSL_new" = xyes; then : +if test "x$ac_cv_lib_ssl_SSL_new" = x""yes; then : have_openssl=yes else have_openssl=no @@ -4803,7 +4850,7 @@ fi for ac_header in openssl/ssl.h do : 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 : +if test "x$ac_cv_header_openssl_ssl_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_OPENSSL_SSL_H 1 _ACEOF @@ -4849,7 +4896,7 @@ else done fi ac_fn_c_check_header_mongrel "$LINENO" "krb5.h" "ac_cv_header_krb5_h" "$ac_includes_default" -if test "x$ac_cv_header_krb5_h" = xyes; then : +if test "x$ac_cv_header_krb5_h" = x""yes; then : fi @@ -4872,7 +4919,7 @@ if test "$ENABLEUSER" != ""; then fi ac_fn_c_check_header_mongrel "$LINENO" "openssl/md2.h" "ac_cv_header_openssl_md2_h" "$ac_includes_default" -if test "x$ac_cv_header_openssl_md2_h" = xyes; then : +if test "x$ac_cv_header_openssl_md2_h" = x""yes; then : md2=true else md2=false @@ -4881,42 +4928,13 @@ fi -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. - - # 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 : +if test "${ac_cv_build+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias @@ -4932,7 +4950,7 @@ fi $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5 ;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' @@ -4950,7 +4968,7 @@ 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 : +if test "${ac_cv_host+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then @@ -4965,7 +4983,7 @@ fi $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5 ;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' @@ -4983,7 +5001,7 @@ case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } -if ${ac_cv_target+:} false; then : +if test "${ac_cv_target+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then @@ -4998,7 +5016,7 @@ fi $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; -*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; +*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5 ;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' @@ -5032,118 +5050,11 @@ case "$target_os" in ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' - if test -n "$ERLC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for erlc" >&5 -$as_echo_n "checking for erlc... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERLC" >&5 -$as_echo "$ERLC" >&6; } -else - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}erlc", so it can be a program name with args. -set dummy ${ac_tool_prefix}erlc; 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_ERLC+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ERLC in - [\\/]* | ?:[\\/]*) - ac_cv_path_ERLC="$ERLC" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_ERLC="$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 -ERLC=$ac_cv_path_ERLC -if test -n "$ERLC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERLC" >&5 -$as_echo "$ERLC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_ERLC"; then - ac_pt_ERLC=$ERLC - # Extract the first word of "erlc", so it can be a program name with args. -set dummy erlc; 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_ERLC+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_ERLC in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_ERLC="$ac_pt_ERLC" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_ac_pt_ERLC="$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_ERLC=$ac_cv_path_ac_pt_ERLC -if test -n "$ac_pt_ERLC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_ERLC" >&5 -$as_echo "$ac_pt_ERLC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_ERLC" = x; then - ERLC="" - 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 - ERLC=$ac_pt_ERLC - fi -else - ERLC="$ac_cv_path_ERLC" -fi - -fi - - -if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes; then : { { $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 test program while cross compiling -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else cat > conftest.$ac_ext <<_ACEOF -module(conftest). @@ -5242,21 +5153,10 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&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 + test "x$cache_file" != "x/dev/null" && { $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 + cat confcache >$cache_file 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;} @@ -5324,7 +5224,7 @@ LTLIBOBJS=$ac_ltlibobjs -: "${CONFIG_STATUS=./config.status}" +: ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" @@ -5425,7 +5325,6 @@ fi 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 @@ -5733,7 +5632,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # values after options handling. ac_log=" This file was extended by ejabberd $as_me 3.0.0, which was -generated by GNU Autoconf 2.68. Invocation command line was +generated by GNU Autoconf 2.67. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -5786,7 +5685,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ ejabberd config.status 3.0.0 -configured by $0, generated by GNU Autoconf 2.68, +configured by $0, generated by GNU Autoconf 2.67, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. @@ -5795,6 +5694,7 @@ gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' +INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF @@ -5896,21 +5796,9 @@ for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "$make_mod_irc") CONFIG_FILES="$CONFIG_FILES $make_mod_irc" ;; - "$make_mod_muc") CONFIG_FILES="$CONFIG_FILES $make_mod_muc" ;; - "$make_mod_pubsub") CONFIG_FILES="$CONFIG_FILES $make_mod_pubsub" ;; - "$make_mod_pubsub_ng") CONFIG_FILES="$CONFIG_FILES $make_mod_pubsub_ng" ;; - "$make_mod_proxy65") CONFIG_FILES="$CONFIG_FILES $make_mod_proxy65" ;; - "$make_eldap") CONFIG_FILES="$CONFIG_FILES $make_eldap" ;; - "$make_pam") CONFIG_FILES="$CONFIG_FILES $make_pam" ;; - "$make_web") CONFIG_FILES="$CONFIG_FILES $make_web" ;; - "stringprep/Makefile") CONFIG_FILES="$CONFIG_FILES stringprep/Makefile" ;; - "stun/Makefile") CONFIG_FILES="$CONFIG_FILES stun/Makefile" ;; - "$make_tls") CONFIG_FILES="$CONFIG_FILES $make_tls" ;; - "$make_odbc") CONFIG_FILES="$CONFIG_FILES $make_odbc" ;; - "$make_ejabberd_zlib") CONFIG_FILES="$CONFIG_FILES $make_ejabberd_zlib" ;; + "rebar.config") CONFIG_FILES="$CONFIG_FILES rebar.config" ;; - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; esac done @@ -5931,10 +5819,9 @@ fi # after its creation but before its name has been assigned to `$tmp'. $debug || { - tmp= ac_tmp= + tmp= trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } @@ -5942,13 +5829,12 @@ $debug || { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" + test -n "$tmp" && 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. @@ -5970,7 +5856,7 @@ else ac_cs_awk_cr=$ac_cr fi -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF @@ -5998,7 +5884,7 @@ done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h @@ -6046,7 +5932,7 @@ t delim rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && +cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" @@ -6078,7 +5964,7 @@ 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" \ +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF @@ -6118,7 +6004,7 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -6137,7 +6023,7 @@ do for ac_f do case $ac_f in - -) ac_f="$ac_tmp/stdin";; + -) ac_f="$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 `:'. @@ -6146,7 +6032,7 @@ do [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + 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'" @@ -6172,8 +6058,8 @@ $as_echo "$as_me: creating $ac_file" >&6;} esac case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + *:-:* | *:-) cat >"$tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac @@ -6243,6 +6129,10 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix # CONFIG_FILE # + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 @@ -6296,24 +6186,24 @@ 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 $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 +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$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"; } && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$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" + rm -f "$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";; + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; diff --git a/src/configure.ac b/configure.ac similarity index 84% rename from src/configure.ac rename to configure.ac index 029af27ad..5b6e1de05 100644 --- a/src/configure.ac +++ b/configure.ac @@ -2,18 +2,39 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.53) -AC_INIT(ejabberd, m4_esyscmd([grep -o -E "\{vsn,.\".*\"\}" ejabberd.app | cut -d \" -f 2 | tr -d '\n']), [ejabberd@process-one.net], [ejabberd]) +AC_INIT(ejabberd, m4_esyscmd([grep -o -E "\{vsn,.\".*\"\}" src/ejabberd.app.src | cut -d \" -f 2 | tr -d '\n']), [ejabberd@process-one.net], [ejabberd]) # Checks for programs. AC_PROG_CC AC_PROG_MAKE_SET +AC_PROG_INSTALL +AC_PROG_SED if test "x$GCC" = "xyes"; then CFLAGS="$CFLAGS -Wall" fi -#locating erlang -AM_WITH_ERLANG +# Checks Erlang runtime and compiler +AC_ERLANG_NEED_ERL +AC_ERLANG_NEED_ERLC + +# Checks and sets ERLANG_ROOT_DIR and ERLANG_LIB_DIR variable +AC_ERLANG_SUBST_ROOT_DIR +AC_ERLANG_SUBST_LIB_DIR + +#locating rebar +AC_PATH_PROG([REBAR], [rebar], []) +#locating make +AC_CHECK_PROG([MAKE], [make], [make], []) + +if test "x$REBAR" = "x"; then + AC_MSG_ERROR(['rebar' was not found]) +fi + +if test "x$MAKE" = "x"; then + AC_MSG_ERROR(['make' was not found]) +fi + #locating iconv AM_ICONV #locating libexpat @@ -32,17 +53,6 @@ AC_PREFIX_DEFAULT(/) AC_FUNC_MALLOC AC_HEADER_STDC -AC_MOD_ENABLE(mod_irc, yes) -AC_MOD_ENABLE(mod_muc, yes) -AC_MOD_ENABLE(mod_proxy65, yes) -AC_MOD_ENABLE(mod_pubsub, yes) -AC_MOD_ENABLE(mod_pubsub_ng, yes) -AC_MOD_ENABLE(eldap, yes) -AC_MOD_ENABLE(odbc, no) -AC_MOD_ENABLE(tls, yes) -AC_MOD_ENABLE(web, yes) - -AC_MOD_ENABLE(ejabberd_zlib, yes) #locating zlib AM_WITH_ZLIB @@ -114,19 +124,8 @@ esac],[nif=false]) AC_SUBST(nif) AC_CONFIG_FILES([Makefile - $make_mod_irc - $make_mod_muc - $make_mod_pubsub - $make_mod_pubsub_ng - $make_mod_proxy65 - $make_eldap - $make_pam - $make_web - stringprep/Makefile - stun/Makefile - $make_tls - $make_odbc - $make_ejabberd_zlib]) + rebar.config]) + #openssl AM_WITH_OPENSSL # If ssl is kerberized it need krb5.h diff --git a/src/configure.bat b/configure.bat similarity index 100% rename from src/configure.bat rename to configure.bat diff --git a/contrib/extract_translations/prepare-translation.sh b/contrib/extract_translations/prepare-translation.sh index 9f2d54ad6..0f16eeeb8 100755 --- a/contrib/extract_translations/prepare-translation.sh +++ b/contrib/extract_translations/prepare-translation.sh @@ -15,13 +15,13 @@ prepare_dirs () ERL=`which erl` EJA_SRC_DIR=$EJA_DIR/src/ - EJA_MSGS_DIR=$EJA_SRC_DIR/msgs/ + EJA_MSGS_DIR=$EJA_DIR/priv/msgs/ EXTRACT_DIR=$EJA_DIR/contrib/extract_translations/ EXTRACT_ERL=$EXTRACT_DIR/extract_translations.erl EXTRACT_BEAM=$EXTRACT_DIR/extract_translations.beam SRC_DIR=$RUN_DIR/src - MSGS_DIR=$SRC_DIR/msgs + MSGS_DIR=$EJA_DIR/priv/msgs if !([[ -n $EJA_DIR ]]) then @@ -288,8 +288,8 @@ translation_instructions () echo " $MSGS_PATH" } -EJA_DIR=`pwd`/.. -RUN_DIR=`pwd`/.. +EJA_DIR=`pwd` +RUN_DIR=`pwd` PROJECT=ejabberd while [ $# -ne 0 ] ; do diff --git a/src/ejabberd.cfg.example b/ejabberd.cfg.example similarity index 100% rename from src/ejabberd.cfg.example rename to ejabberd.cfg.example diff --git a/src/ejabberd.init.template b/ejabberd.init.template similarity index 100% rename from src/ejabberd.init.template rename to ejabberd.init.template diff --git a/src/ejabberdctl.cfg.example b/ejabberdctl.cfg.example similarity index 100% rename from src/ejabberdctl.cfg.example rename to ejabberdctl.cfg.example diff --git a/src/ejabberdctl.template b/ejabberdctl.template similarity index 100% rename from src/ejabberdctl.template rename to ejabberdctl.template diff --git a/src/adhoc.hrl b/include/adhoc.hrl similarity index 100% rename from src/adhoc.hrl rename to include/adhoc.hrl diff --git a/src/web/bosh.hrl b/include/bosh.hrl similarity index 100% rename from src/web/bosh.hrl rename to include/bosh.hrl diff --git a/src/ejabberd.hrl b/include/ejabberd.hrl similarity index 73% rename from src/ejabberd.hrl rename to include/ejabberd.hrl index 912ea2ce0..e36139a0c 100644 --- a/src/ejabberd.hrl +++ b/include/ejabberd.hrl @@ -59,27 +59,3 @@ -type scram() :: #scram{}. -define(SCRAM_DEFAULT_ITERATION_COUNT, 4096). - -%% --------------------------------- -%% Logging mechanism - --define(PRINT(Format, Args), io:format(Format, Args)). - --define(DEBUG(Format, Args), - ejabberd_logger:debug_msg(?MODULE, ?LINE, Format, - Args)). - --define(INFO_MSG(Format, Args), - ejabberd_logger:info_msg(?MODULE, ?LINE, Format, Args)). - --define(WARNING_MSG(Format, Args), - ejabberd_logger:warning_msg(?MODULE, ?LINE, Format, - Args)). - --define(ERROR_MSG(Format, Args), - ejabberd_logger:error_msg(?MODULE, ?LINE, Format, - Args)). - --define(CRITICAL_MSG(Format, Args), - ejabberd_logger:critical_msg(?MODULE, ?LINE, Format, - Args)). diff --git a/src/ejabberd_c2s.hrl b/include/ejabberd_c2s.hrl similarity index 100% rename from src/ejabberd_c2s.hrl rename to include/ejabberd_c2s.hrl diff --git a/src/ejabberd_commands.hrl b/include/ejabberd_commands.hrl similarity index 100% rename from src/ejabberd_commands.hrl rename to include/ejabberd_commands.hrl diff --git a/src/ejabberd_config.hrl b/include/ejabberd_config.hrl similarity index 100% rename from src/ejabberd_config.hrl rename to include/ejabberd_config.hrl diff --git a/src/ejabberd_ctl.hrl b/include/ejabberd_ctl.hrl similarity index 100% rename from src/ejabberd_ctl.hrl rename to include/ejabberd_ctl.hrl diff --git a/src/web/ejabberd_http.hrl b/include/ejabberd_http.hrl similarity index 100% rename from src/web/ejabberd_http.hrl rename to include/ejabberd_http.hrl diff --git a/src/web/ejabberd_web_admin.hrl b/include/ejabberd_web_admin.hrl similarity index 100% rename from src/web/ejabberd_web_admin.hrl rename to include/ejabberd_web_admin.hrl diff --git a/src/eldap/eldap.hrl b/include/eldap.hrl similarity index 100% rename from src/eldap/eldap.hrl rename to include/eldap.hrl diff --git a/src/web/http_bind.hrl b/include/http_bind.hrl similarity index 100% rename from src/web/http_bind.hrl rename to include/http_bind.hrl diff --git a/src/jlib.hrl b/include/jlib.hrl similarity index 100% rename from src/jlib.hrl rename to include/jlib.hrl diff --git a/src/licence.hrl b/include/licence.hrl similarity index 100% rename from src/licence.hrl rename to include/licence.hrl diff --git a/src/mod_muc/mod_muc_room.hrl b/include/mod_muc_room.hrl similarity index 100% rename from src/mod_muc/mod_muc_room.hrl rename to include/mod_muc_room.hrl diff --git a/src/mod_privacy.hrl b/include/mod_privacy.hrl similarity index 100% rename from src/mod_privacy.hrl rename to include/mod_privacy.hrl diff --git a/src/mod_proxy65/mod_proxy65.hrl b/include/mod_proxy65.hrl similarity index 100% rename from src/mod_proxy65/mod_proxy65.hrl rename to include/mod_proxy65.hrl diff --git a/src/mod_roster.hrl b/include/mod_roster.hrl similarity index 100% rename from src/mod_roster.hrl rename to include/mod_roster.hrl diff --git a/src/mod_pubsub/pubsub.hrl b/include/pubsub.hrl similarity index 100% rename from src/mod_pubsub/pubsub.hrl rename to include/pubsub.hrl diff --git a/src/inetrc b/inetrc similarity index 100% rename from src/inetrc rename to inetrc diff --git a/src/install-sh b/install-sh similarity index 100% rename from src/install-sh rename to install-sh diff --git a/src/mod_pubsub_ng/Makefile.in b/mod_pubsub_ng/Makefile.in similarity index 100% rename from src/mod_pubsub_ng/Makefile.in rename to mod_pubsub_ng/Makefile.in diff --git a/src/mod_pubsub_ng/Makefile.win32 b/mod_pubsub_ng/Makefile.win32 similarity index 100% rename from src/mod_pubsub_ng/Makefile.win32 rename to mod_pubsub_ng/Makefile.win32 diff --git a/src/mod_pubsub_ng/exmpp_pubsub.erl b/mod_pubsub_ng/exmpp_pubsub.erl similarity index 100% rename from src/mod_pubsub_ng/exmpp_pubsub.erl rename to mod_pubsub_ng/exmpp_pubsub.erl diff --git a/src/mod_pubsub_ng/mod_pubsub_dev.erl b/mod_pubsub_ng/mod_pubsub_dev.erl similarity index 100% rename from src/mod_pubsub_ng/mod_pubsub_dev.erl rename to mod_pubsub_ng/mod_pubsub_dev.erl diff --git a/src/mod_pubsub_ng/node_flat_dev.erl b/mod_pubsub_ng/node_flat_dev.erl similarity index 99% rename from src/mod_pubsub_ng/node_flat_dev.erl rename to mod_pubsub_ng/node_flat_dev.erl index 27c02c109..f8cdcb5ea 100644 --- a/src/mod_pubsub_ng/node_flat_dev.erl +++ b/mod_pubsub_ng/node_flat_dev.erl @@ -29,6 +29,7 @@ -include("pubsub_dev.hrl"). -include("pubsub_api.hrl"). +-include("logger.hrl"). -compile(export_all). diff --git a/src/mod_pubsub_ng/pubsub_api.hrl b/mod_pubsub_ng/pubsub_api.hrl similarity index 100% rename from src/mod_pubsub_ng/pubsub_api.hrl rename to mod_pubsub_ng/pubsub_api.hrl diff --git a/src/mod_pubsub_ng/pubsub_broadcast.erl b/mod_pubsub_ng/pubsub_broadcast.erl similarity index 100% rename from src/mod_pubsub_ng/pubsub_broadcast.erl rename to mod_pubsub_ng/pubsub_broadcast.erl diff --git a/src/mod_pubsub_ng/pubsub_core.erl b/mod_pubsub_ng/pubsub_core.erl similarity index 100% rename from src/mod_pubsub_ng/pubsub_core.erl rename to mod_pubsub_ng/pubsub_core.erl diff --git a/src/mod_pubsub_ng/pubsub_db.erl b/mod_pubsub_ng/pubsub_db.erl similarity index 99% rename from src/mod_pubsub_ng/pubsub_db.erl rename to mod_pubsub_ng/pubsub_db.erl index 37e8e4473..1a9ea53de 100644 --- a/src/mod_pubsub_ng/pubsub_db.erl +++ b/mod_pubsub_ng/pubsub_db.erl @@ -31,6 +31,7 @@ -include("pubsub_dev.hrl"). -include("pubsub_api.hrl"). +-include("logger.hrl"). -import(pubsub_tools, diff --git a/src/mod_pubsub_ng/pubsub_db_mnesia.erl b/mod_pubsub_ng/pubsub_db_mnesia.erl similarity index 100% rename from src/mod_pubsub_ng/pubsub_db_mnesia.erl rename to mod_pubsub_ng/pubsub_db_mnesia.erl diff --git a/src/mod_pubsub_ng/pubsub_dev.hrl b/mod_pubsub_ng/pubsub_dev.hrl similarity index 100% rename from src/mod_pubsub_ng/pubsub_dev.hrl rename to mod_pubsub_ng/pubsub_dev.hrl diff --git a/src/mod_pubsub_ng/pubsub_disco.erl b/mod_pubsub_ng/pubsub_disco.erl similarity index 100% rename from src/mod_pubsub_ng/pubsub_disco.erl rename to mod_pubsub_ng/pubsub_disco.erl diff --git a/src/mod_pubsub_ng/pubsub_groups.erl b/mod_pubsub_ng/pubsub_groups.erl similarity index 100% rename from src/mod_pubsub_ng/pubsub_groups.erl rename to mod_pubsub_ng/pubsub_groups.erl diff --git a/src/mod_pubsub_ng/pubsub_hooks.erl b/mod_pubsub_ng/pubsub_hooks.erl similarity index 100% rename from src/mod_pubsub_ng/pubsub_hooks.erl rename to mod_pubsub_ng/pubsub_hooks.erl diff --git a/src/mod_pubsub_ng/pubsub_index_dev.erl b/mod_pubsub_ng/pubsub_index_dev.erl similarity index 100% rename from src/mod_pubsub_ng/pubsub_index_dev.erl rename to mod_pubsub_ng/pubsub_index_dev.erl diff --git a/src/mod_pubsub_ng/pubsub_options.erl b/mod_pubsub_ng/pubsub_options.erl similarity index 100% rename from src/mod_pubsub_ng/pubsub_options.erl rename to mod_pubsub_ng/pubsub_options.erl diff --git a/src/mod_pubsub_ng/pubsub_parser.erl b/mod_pubsub_ng/pubsub_parser.erl similarity index 100% rename from src/mod_pubsub_ng/pubsub_parser.erl rename to mod_pubsub_ng/pubsub_parser.erl diff --git a/src/mod_pubsub_ng/pubsub_tools.erl b/mod_pubsub_ng/pubsub_tools.erl similarity index 100% rename from src/mod_pubsub_ng/pubsub_tools.erl rename to mod_pubsub_ng/pubsub_tools.erl diff --git a/src/mod_pubsub_ng/xmpp_xdata.erl b/mod_pubsub_ng/xmpp_xdata.erl similarity index 100% rename from src/mod_pubsub_ng/xmpp_xdata.erl rename to mod_pubsub_ng/xmpp_xdata.erl diff --git a/src/msgs/ca.msg b/priv/msgs/ca.msg similarity index 100% rename from src/msgs/ca.msg rename to priv/msgs/ca.msg diff --git a/src/msgs/ca.po b/priv/msgs/ca.po similarity index 100% rename from src/msgs/ca.po rename to priv/msgs/ca.po diff --git a/src/msgs/cs.msg b/priv/msgs/cs.msg similarity index 100% rename from src/msgs/cs.msg rename to priv/msgs/cs.msg diff --git a/src/msgs/cs.po b/priv/msgs/cs.po similarity index 100% rename from src/msgs/cs.po rename to priv/msgs/cs.po diff --git a/src/msgs/de.msg b/priv/msgs/de.msg similarity index 100% rename from src/msgs/de.msg rename to priv/msgs/de.msg diff --git a/src/msgs/de.po b/priv/msgs/de.po similarity index 100% rename from src/msgs/de.po rename to priv/msgs/de.po diff --git a/src/msgs/ejabberd.pot b/priv/msgs/ejabberd.pot similarity index 100% rename from src/msgs/ejabberd.pot rename to priv/msgs/ejabberd.pot diff --git a/src/msgs/el.msg b/priv/msgs/el.msg similarity index 100% rename from src/msgs/el.msg rename to priv/msgs/el.msg diff --git a/src/msgs/el.po b/priv/msgs/el.po similarity index 100% rename from src/msgs/el.po rename to priv/msgs/el.po diff --git a/src/msgs/eo.msg b/priv/msgs/eo.msg similarity index 100% rename from src/msgs/eo.msg rename to priv/msgs/eo.msg diff --git a/src/msgs/eo.po b/priv/msgs/eo.po similarity index 100% rename from src/msgs/eo.po rename to priv/msgs/eo.po diff --git a/src/msgs/es.msg b/priv/msgs/es.msg similarity index 100% rename from src/msgs/es.msg rename to priv/msgs/es.msg diff --git a/src/msgs/es.po b/priv/msgs/es.po similarity index 100% rename from src/msgs/es.po rename to priv/msgs/es.po diff --git a/src/msgs/fr.msg b/priv/msgs/fr.msg similarity index 100% rename from src/msgs/fr.msg rename to priv/msgs/fr.msg diff --git a/src/msgs/fr.po b/priv/msgs/fr.po similarity index 100% rename from src/msgs/fr.po rename to priv/msgs/fr.po diff --git a/src/msgs/gl.msg b/priv/msgs/gl.msg similarity index 100% rename from src/msgs/gl.msg rename to priv/msgs/gl.msg diff --git a/src/msgs/gl.po b/priv/msgs/gl.po similarity index 100% rename from src/msgs/gl.po rename to priv/msgs/gl.po diff --git a/src/msgs/id.msg b/priv/msgs/id.msg similarity index 100% rename from src/msgs/id.msg rename to priv/msgs/id.msg diff --git a/src/msgs/id.po b/priv/msgs/id.po similarity index 100% rename from src/msgs/id.po rename to priv/msgs/id.po diff --git a/src/msgs/it.msg b/priv/msgs/it.msg similarity index 100% rename from src/msgs/it.msg rename to priv/msgs/it.msg diff --git a/src/msgs/it.po b/priv/msgs/it.po similarity index 100% rename from src/msgs/it.po rename to priv/msgs/it.po diff --git a/src/msgs/ja.msg b/priv/msgs/ja.msg similarity index 100% rename from src/msgs/ja.msg rename to priv/msgs/ja.msg diff --git a/src/msgs/ja.po b/priv/msgs/ja.po similarity index 100% rename from src/msgs/ja.po rename to priv/msgs/ja.po diff --git a/src/msgs/nl.msg b/priv/msgs/nl.msg similarity index 100% rename from src/msgs/nl.msg rename to priv/msgs/nl.msg diff --git a/src/msgs/nl.po b/priv/msgs/nl.po similarity index 100% rename from src/msgs/nl.po rename to priv/msgs/nl.po diff --git a/src/msgs/no.msg b/priv/msgs/no.msg similarity index 100% rename from src/msgs/no.msg rename to priv/msgs/no.msg diff --git a/src/msgs/no.po b/priv/msgs/no.po similarity index 100% rename from src/msgs/no.po rename to priv/msgs/no.po diff --git a/src/msgs/pl.msg b/priv/msgs/pl.msg similarity index 100% rename from src/msgs/pl.msg rename to priv/msgs/pl.msg diff --git a/src/msgs/pl.po b/priv/msgs/pl.po similarity index 100% rename from src/msgs/pl.po rename to priv/msgs/pl.po diff --git a/src/msgs/pt-br.msg b/priv/msgs/pt-br.msg similarity index 100% rename from src/msgs/pt-br.msg rename to priv/msgs/pt-br.msg diff --git a/src/msgs/pt-br.po b/priv/msgs/pt-br.po similarity index 100% rename from src/msgs/pt-br.po rename to priv/msgs/pt-br.po diff --git a/src/msgs/pt.msg b/priv/msgs/pt.msg similarity index 100% rename from src/msgs/pt.msg rename to priv/msgs/pt.msg diff --git a/src/msgs/pt.po b/priv/msgs/pt.po similarity index 100% rename from src/msgs/pt.po rename to priv/msgs/pt.po diff --git a/src/msgs/ru.msg b/priv/msgs/ru.msg similarity index 100% rename from src/msgs/ru.msg rename to priv/msgs/ru.msg diff --git a/src/msgs/ru.po b/priv/msgs/ru.po similarity index 100% rename from src/msgs/ru.po rename to priv/msgs/ru.po diff --git a/src/msgs/sk.msg b/priv/msgs/sk.msg similarity index 100% rename from src/msgs/sk.msg rename to priv/msgs/sk.msg diff --git a/src/msgs/sk.po b/priv/msgs/sk.po similarity index 100% rename from src/msgs/sk.po rename to priv/msgs/sk.po diff --git a/src/msgs/sv.msg b/priv/msgs/sv.msg similarity index 100% rename from src/msgs/sv.msg rename to priv/msgs/sv.msg diff --git a/src/msgs/sv.po b/priv/msgs/sv.po similarity index 100% rename from src/msgs/sv.po rename to priv/msgs/sv.po diff --git a/src/msgs/th.msg b/priv/msgs/th.msg similarity index 100% rename from src/msgs/th.msg rename to priv/msgs/th.msg diff --git a/src/msgs/th.po b/priv/msgs/th.po similarity index 100% rename from src/msgs/th.po rename to priv/msgs/th.po diff --git a/src/msgs/tr.msg b/priv/msgs/tr.msg similarity index 100% rename from src/msgs/tr.msg rename to priv/msgs/tr.msg diff --git a/src/msgs/tr.po b/priv/msgs/tr.po similarity index 100% rename from src/msgs/tr.po rename to priv/msgs/tr.po diff --git a/src/msgs/uk.msg b/priv/msgs/uk.msg similarity index 100% rename from src/msgs/uk.msg rename to priv/msgs/uk.msg diff --git a/src/msgs/uk.po b/priv/msgs/uk.po similarity index 100% rename from src/msgs/uk.po rename to priv/msgs/uk.po diff --git a/src/msgs/vi.msg b/priv/msgs/vi.msg similarity index 100% rename from src/msgs/vi.msg rename to priv/msgs/vi.msg diff --git a/src/msgs/vi.po b/priv/msgs/vi.po similarity index 100% rename from src/msgs/vi.po rename to priv/msgs/vi.po diff --git a/src/msgs/wa.msg b/priv/msgs/wa.msg similarity index 100% rename from src/msgs/wa.msg rename to priv/msgs/wa.msg diff --git a/src/msgs/wa.po b/priv/msgs/wa.po similarity index 100% rename from src/msgs/wa.po rename to priv/msgs/wa.po diff --git a/src/msgs/zh.msg b/priv/msgs/zh.msg similarity index 100% rename from src/msgs/zh.msg rename to priv/msgs/zh.msg diff --git a/src/msgs/zh.po b/priv/msgs/zh.po similarity index 100% rename from src/msgs/zh.po rename to priv/msgs/zh.po diff --git a/rebar.config.in b/rebar.config.in new file mode 100644 index 000000000..7b64741ca --- /dev/null +++ b/rebar.config.in @@ -0,0 +1,25 @@ +{erl_opts, [debug_info, {i, "include"}, {i, "deps/logger/include"}]}. + +%%{src_dirs, [asn1, src, mod_pubsub_ng]}. +{src_dirs, [asn1, src]}. + +{deps, [{mysql, ".*", {git, "git://github.com/processone/mysql"}}, + {pgsql, ".*", {git, "git://github.com/processone/pgsql"}}, + {iconv, ".*", {git, "git://github.com/processone/eiconv"}}, + {epam, ".*", {git, "git://github.com/processone/epam"}}, + {logger, ".*", {git, "git://github.com/processone/p1_logger"}}, + {tls, ".*", {git, "git://github.com/processone/tls"}}, + {ezlib, ".*", {git, "git://github.com/processone/zlib"}}, + {stun, ".*", {git, "git://github.com/processone/stun"}}, + {xmlrpc, ".*", {git, "git://github.com/etnt/xmlrpc"}}]}. + +{port_env, [{"CFLAGS", "-g -O2 -Wall"}]}. + +{port_specs, [{"priv/lib/sha_drv.so", ["c_src/sha_drv.c"]}, + {"priv/lib/expat_erl.so", ["c_src/expat_erl.c"]}, + {"priv/lib/xml.so", ["c_src/xml.c"]}]}. + +%% Local Variables: +%% mode: erlang +%% End: +%% vim: set filetype=erlang tabstop=8: diff --git a/src/odbc/mssql2000.sql b/sql/mssql2000.sql similarity index 100% rename from src/odbc/mssql2000.sql rename to sql/mssql2000.sql diff --git a/src/odbc/mssql2005.sql b/sql/mssql2005.sql similarity index 100% rename from src/odbc/mssql2005.sql rename to sql/mssql2005.sql diff --git a/src/odbc/mysql.sql b/sql/mysql.sql similarity index 100% rename from src/odbc/mysql.sql rename to sql/mysql.sql diff --git a/src/odbc/pg.sql b/sql/pg.sql similarity index 100% rename from src/odbc/pg.sql rename to sql/pg.sql diff --git a/src/Makefile.in b/src/Makefile.in deleted file mode 100644 index 6db5543c3..000000000 --- a/src/Makefile.in +++ /dev/null @@ -1,323 +0,0 @@ -# $Id$ - -CC = @CC@ -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ - -EXPAT_CFLAGS = @EXPAT_CFLAGS@ -ERLANG_CFLAGS= @ERLANG_CFLAGS@ - -EXPAT_LIBS = @EXPAT_LIBS@ -ERLANG_LIBS = @ERLANG_LIBS@ - -ASN_FLAGS = -bber_bin +der +compact_bit_string +optimize +noobj - -INSTALLUSER=@INSTALLUSER@ -# if no user was enabled, don't set privileges or ownership -ifeq ($(INSTALLUSER),) - O_USER= - G_USER= - CHOWN_COMMAND=echo - CHOWN_OUTPUT=/dev/null - INIT_USER=root -else - O_USER=-o $(INSTALLUSER) - G_USER=-g $(INSTALLUSER) - CHOWN_COMMAND=chown - CHOWN_OUTPUT=&1 - INIT_USER=$(INSTALLUSER) -endif - -EFLAGS += @ERLANG_SSLVER@ -pa . -ERLANG_CFLAGS += @ERLANG_SSLVER@ - -# make debug=true to compile Erlang module with debug informations. -ifdef debug - EFLAGS+=+debug_info -endif - -DEBUGTOOLS = p1_prof.erl -ifdef debugtools - SOURCES+=$(DEBUGTOOLS) -endif - -ifeq (@hipe@, true) - EFLAGS+=+native -endif - -ifeq (@roster_gateway_workaround@, true) - EFLAGS+=-DROSTER_GATEWAY_WORKAROUND -endif - -ifeq (@full_xml@, true) - EFLAGS+=-DFULL_XML_SUPPORT -endif - -ifeq (@nif@, true) - EFLAGS+=-DNIF - ERLSHLIBS=xml.so -endif - -ifeq (@transient_supervisors@, false) - EFLAGS+=-DNO_TRANSIENT_SUPERVISORS -endif - -ifeq (@md2@, true) - EFLAGS+=-DHAVE_MD2 - ERLANG_CFLAGS += -DHAVE_MD2 -endif - -INSTALL_EPAM= -ifeq (@pam@, pam) - INSTALL_EPAM=install -m 750 $(O_USER) epam $(PBINDIR) -endif - -ifeq (@flash_hack@, true) - ERLC_FLAGS+=-DENABLE_FLASH_HACK - CPPFLAGS+=-DENABLE_FLASH_HACK -endif - -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -SUBDIRS = @mod_irc@ @mod_pubsub@ @mod_muc@ @mod_proxy65@ @eldap@ @pam@ @web@ stringprep stun @tls@ @odbc@ @ejabberd_zlib@ -ERLSHLIBS += expat_erl.so -ERLBEHAVS = cyrsasl.erl gen_mod.erl p1_fsm.erl ejabberd_auth.erl -SOURCES_ALL = $(wildcard *.erl) -SOURCES_MISC = $(ERLBEHAVS) $(DEBUGTOOLS) -SOURCES += $(filter-out $(SOURCES_MISC),$(SOURCES_ALL)) -ERLBEHAVBEAMS = $(ERLBEHAVS:.erl=.beam) -BEAMS = $(SOURCES:.erl=.beam) - -DESTDIR = - -# /etc/ejabberd/ -ETCDIR = $(DESTDIR)@sysconfdir@/ejabberd - -# /sbin/ -SBINDIR = $(DESTDIR)@sbindir@ - -# /lib/ejabberd/ -EJABBERDDIR = $(DESTDIR)@libdir@/ejabberd - -# /share/doc/ejabberd -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -datarootdir = @datarootdir@ -DOCDIR = $(DESTDIR)@docdir@ - -# /usr/lib/ejabberd/ebin/ -BEAMDIR = $(EJABBERDDIR)/ebin - -# /usr/lib/ejabberd/include/ -INCLUDEDIR = $(EJABBERDDIR)/include - -# /usr/lib/ejabberd/priv/ -PRIVDIR = $(EJABBERDDIR)/priv - -# /usr/lib/ejabberd/priv/bin -PBINDIR = $(PRIVDIR)/bin - -# /usr/lib/ejabberd/priv/lib -SODIR = $(PRIVDIR)/lib - -# /usr/lib/ejabberd/priv/msgs -MSGSDIR = $(PRIVDIR)/msgs - -# /var/lib/ejabberd/ -SPOOLDIR = $(DESTDIR)@localstatedir@/lib/ejabberd - -# /var/lock/ejabberdctl -CTLLOCKDIR = $(DESTDIR)@localstatedir@/lock/ejabberdctl - -# /var/lib/ejabberd/.erlang.cookie -COOKIEFILE = $(SPOOLDIR)/.erlang.cookie - -# /var/log/ejabberd/ -LOGDIR = $(DESTDIR)@localstatedir@/log/ejabberd - -# Assume Linux-style dynamic library flags -DYNAMIC_LIB_CFLAGS = -fpic -shared -ifeq ($(shell uname),Darwin) - DYNAMIC_LIB_CFLAGS = -fPIC -bundle -flat_namespace -undefined suppress -endif -ifeq ($(shell uname),SunOs) - DYNAMIC_LIB_CFLAGS = -KPIC -G -z text -endif - -all: $(ERLSHLIBS) compile-beam all-recursive - -compile-beam: XmppAddr.hrl $(ERLBEHAVBEAMS) $(BEAMS) - -$(BEAMS): $(ERLBEHAVBEAMS) - -all-recursive: $(ERLBEHAVBEAMS) - -%.beam: %.erl - @ERLC@ -W $(EFLAGS) $< - - -all-recursive install-recursive uninstall-recursive \ -clean-recursive distclean-recursive \ -mostlyclean-recursive maintainer-clean-recursive: - @subdirs="$(SUBDIRS)"; for subdir in $$subdirs; do \ - target=`echo $@|sed 's,-recursive,,'`; \ - echo making $$target in $$subdir; \ - (cd $$subdir && $(MAKE) $$target) || exit 1; \ - done - - -%.hrl: %.asn1 - @ERLC@ $(ASN_FLAGS) $< - @ERLC@ -W $(EFLAGS) $*.erl - -$(ERLSHLIBS): %.so: %.c - $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(LIBS) \ - $(subst ../,,$(subst .so,.c,$@)) \ - $(EXPAT_LIBS) \ - $(EXPAT_CFLAGS) \ - $(ERLANG_LIBS) \ - $(ERLANG_CFLAGS) \ - -o $@ \ - $(DYNAMIC_LIB_CFLAGS) - -translations: - ../contrib/extract_translations/prepare-translation.sh -updateall - -install: all - # - # Configuration files - install -d -m 750 $(G_USER) $(ETCDIR) - [ -f $(ETCDIR)/ejabberd.cfg ] \ - && install -b -m 640 $(G_USER) ejabberd.cfg.example $(ETCDIR)/ejabberd.cfg-new \ - || install -b -m 640 $(G_USER) ejabberd.cfg.example $(ETCDIR)/ejabberd.cfg - sed -e "s*@rootdir@*@prefix@*" \ - -e "s*@installuser@*@INSTALLUSER@*" \ - -e "s*@LIBDIR@*@libdir@*" \ - -e "s*@SYSCONFDIR@*@sysconfdir@*" \ - -e "s*@LOCALSTATEDIR@*@localstatedir@*" \ - -e "s*@DOCDIR@*@docdir@*" \ - -e "s*@erl@*@ERL@*" ejabberdctl.template \ - > ejabberdctl.example - [ -f $(ETCDIR)/ejabberdctl.cfg ] \ - && install -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg-new \ - || install -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg - install -b -m 644 $(G_USER) inetrc $(ETCDIR)/inetrc - # - # Administration script - [ -d $(SBINDIR) ] || install -d -m 755 $(SBINDIR) - install -m 550 $(G_USER) ejabberdctl.example $(SBINDIR)/ejabberdctl - # - # Init script - sed -e "s*@ctlscriptpath@*$(SBINDIR)*" \ - -e "s*@installuser@*$(INIT_USER)*" ejabberd.init.template \ - > ejabberd.init - chmod 755 ejabberd.init - # - # Binary Erlang files - install -d $(BEAMDIR) - install -m 644 *.app $(BEAMDIR) - install -m 644 *.beam $(BEAMDIR) - rm -f $(BEAMDIR)/configure.beam - # - # ejabberd header files - install -d $(INCLUDEDIR) - install -m 644 *.hrl $(INCLUDEDIR) - install -d $(INCLUDEDIR)/eldap/ - install -m 644 eldap/*.hrl $(INCLUDEDIR)/eldap/ - install -d $(INCLUDEDIR)/mod_muc/ - install -m 644 mod_muc/*.hrl $(INCLUDEDIR)/mod_muc/ - install -d $(INCLUDEDIR)/mod_proxy65/ - install -m 644 mod_proxy65/*.hrl $(INCLUDEDIR)/mod_proxy65/ - install -d $(INCLUDEDIR)/mod_pubsub/ - install -m 644 mod_pubsub/*.hrl $(INCLUDEDIR)/mod_pubsub/ - install -d $(INCLUDEDIR)/mod_pubsub_ng/ - install -m 644 mod_pubsub_ng/*.hrl $(INCLUDEDIR)/mod_pubsub_ng/ - install -d $(INCLUDEDIR)/web/ - install -m 644 web/*.hrl $(INCLUDEDIR)/web/ - # - # Binary C programs - install -d $(PBINDIR) - install -m 750 $(O_USER) ../tools/captcha.sh $(PBINDIR) - $(INSTALL_EPAM) - # - # Binary system libraries - install -d $(SODIR) - install -m 644 *.so $(SODIR) - # - # Translated strings - install -d $(MSGSDIR) - install -m 644 msgs/*.msg $(MSGSDIR) - # - # Spool directory - install -d -m 750 $(O_USER) $(SPOOLDIR) - $(CHOWN_COMMAND) -R @INSTALLUSER@ $(SPOOLDIR) >$(CHOWN_OUTPUT) - chmod -R 750 $(SPOOLDIR) - [ ! -f $(COOKIEFILE) ] || { $(CHOWN_COMMAND) @INSTALLUSER@ $(COOKIEFILE) >$(CHOWN_OUTPUT) ; chmod 400 $(COOKIEFILE) ; } - # - # ejabberdctl lock directory - install -d -m 750 $(O_USER) $(CTLLOCKDIR) - $(CHOWN_COMMAND) -R @INSTALLUSER@ $(CTLLOCKDIR) >$(CHOWN_OUTPUT) - chmod -R 750 $(CTLLOCKDIR) - # - # Log directory - install -d -m 750 $(O_USER) $(LOGDIR) - $(CHOWN_COMMAND) -R @INSTALLUSER@ $(LOGDIR) >$(CHOWN_OUTPUT) - chmod -R 750 $(LOGDIR) - # - # Documentation - install -d $(DOCDIR) - install -m 644 ../doc/dev.html $(DOCDIR) - install -m 644 ../doc/guide.html $(DOCDIR) - install -m 644 ../doc/*.png $(DOCDIR) - install -m 644 ../doc/*.txt $(DOCDIR) - [ -f ../doc/guide.pdf ] \ - && install -m 644 ../doc/guide.pdf $(DOCDIR) \ - || echo "No ../doc/guide.pdf was built" - install -m 644 ../COPYING $(DOCDIR) - -uninstall: uninstall-binary - -uninstall-binary: - rm -f $(SBINDIR)/ejabberdctl - rm -fr $(DOCDIR) - rm -f $(BEAMDIR)/*.beam - rm -f $(BEAMDIR)/*.app - rm -fr $(BEAMDIR) - rm -f $(INCLUDEDIR)/*.hrl - rm -fr $(INCLUDEDIR) - rm -fr $(PBINDIR) - rm -f $(SODIR)/*.so - rm -fr $(SODIR) - rm -f $(MSGSDIR)/*.msgs - rm -fr $(MSGSDIR) - rm -fr $(PRIVDIR) - rm -fr $(EJABBERDDIR) - -uninstall-all: uninstall-binary - rm -rf $(ETCDIR) - rm -rf $(EJABBERDDIR) - rm -rf $(SPOOLDIR) - rm -rf $(CTLLOCKDIR) - rm -rf $(LOGDIR) - -clean: clean-recursive clean-local - -clean-local: - rm -f *.beam $(ERLSHLIBS) epam ejabberdctl.example - rm -f XmppAddr.asn1db XmppAddr.erl XmppAddr.hrl - -distclean: distclean-recursive clean-local - rm -f config.status - rm -f config.log - rm -f Makefile - [ ! -f ../ChangeLog ] || rm -f ../ChangeLog - -TAGS: - etags *.erl - -Makefile: Makefile.in - -dialyzer: $(BEAMS) - @dialyzer -c . diff --git a/src/acl.erl b/src/acl.erl index 77c55e79d..88e6f6884 100644 --- a/src/acl.erl +++ b/src/acl.erl @@ -32,6 +32,7 @@ match_rule/3, match_acl/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). -record(acl, {aclname, aclspec}). diff --git a/src/adhoc.erl b/src/adhoc.erl index ef81978a5..60babebfb 100644 --- a/src/adhoc.erl +++ b/src/adhoc.erl @@ -35,6 +35,7 @@ ]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). -include("adhoc.hrl"). diff --git a/src/cache_tab.erl b/src/cache_tab.erl index 95343e4f5..e2d25579c 100644 --- a/src/cache_tab.erl +++ b/src/cache_tab.erl @@ -41,6 +41,7 @@ terminate/2, code_change/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -record(state, {tab = treap:empty(), name, diff --git a/src/configure.erl b/src/configure.erl index 87b7bc208..6f0b1dd4e 100644 --- a/src/configure.erl +++ b/src/configure.erl @@ -30,6 +30,7 @@ -export([start/0]). -include("ejabberd.hrl"). +-include("logger.hrl"). start() -> Static = case os:getenv("arg") of diff --git a/src/cyrsasl.erl b/src/cyrsasl.erl index 08f6ad7bd..cde5a4893 100644 --- a/src/cyrsasl.erl +++ b/src/cyrsasl.erl @@ -32,6 +32,7 @@ server_new/7, server_start/3, server_step/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). %% -export_type([ diff --git a/src/cyrsasl_digest.erl b/src/cyrsasl_digest.erl index 3633ee049..50990c5fc 100644 --- a/src/cyrsasl_digest.erl +++ b/src/cyrsasl_digest.erl @@ -31,6 +31,7 @@ -export([start/1, stop/0, mech_new/4, mech_step/2, parse/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -behaviour(cyrsasl). diff --git a/src/cyrsasl_scram.erl b/src/cyrsasl_scram.erl index 33d18cd1a..4a85ecbf2 100644 --- a/src/cyrsasl_scram.erl +++ b/src/cyrsasl_scram.erl @@ -31,6 +31,7 @@ -export([start/1, stop/0, mech_new/4, mech_step/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). -behaviour(cyrsasl). diff --git a/src/dynamic_compile.erl b/src/dynamic_compile.erl deleted file mode 100644 index 1fe2dcaad..000000000 --- a/src/dynamic_compile.erl +++ /dev/null @@ -1,268 +0,0 @@ -%% Copyright (c) 2007 -%% Mats Cronqvist -%% Chris Newcombe -%% Jacob Vorreuter -%% -%% Permission is hereby granted, free of charge, to any person -%% obtaining a copy of this software and associated documentation -%% files (the "Software"), to deal in the Software without -%% restriction, including without limitation the rights to use, -%% copy, modify, merge, publish, distribute, sublicense, and/or sell -%% copies of the Software, and to permit persons to whom the -%% Software is furnished to do so, subject to the following -%% conditions: -%% -%% The above copyright notice and this permission notice shall be -%% included in all copies or substantial portions of the Software. -%% -%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -%% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -%% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -%% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -%% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -%% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -%% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -%% OTHER DEALINGS IN THE SOFTWARE. - -%%%------------------------------------------------------------------- -%%% File : dynamic_compile.erl -%%% Description : -%%% Authors : Mats Cronqvist -%%% Chris Newcombe -%%% Jacob Vorreuter -%%% TODO : -%%% - add support for limit include-file depth (and prevent circular references) -%%% prevent circular macro expansion set FILE correctly when -module() is found -%%% -include_lib support $ENVVAR in include filenames -%%% substitute-stringize (??MACRO) -%%% -undef/-ifdef/-ifndef/-else/-endif -%%% -file(File, Line) -%%%------------------------------------------------------------------- --module(dynamic_compile). - -%% API --export([from_string/1, from_string/2]). - --import(lists, [reverse/1, keyreplace/4]). - -%%==================================================================== -%% API -%%==================================================================== -%%-------------------------------------------------------------------- -%% Function: -%% Description: -%% Returns a binary that can be used with -%% code:load_binary(Module, ModuleFilenameForInternalRecords, Binary). -%%-------------------------------------------------------------------- -from_string(CodeStr) -> - from_string(CodeStr, []). - -% takes Options as for compile:forms/2 -from_string(CodeStr, CompileFormsOptions) -> - %% Initialise the macro dictionary with the default predefined macros, - %% (adapted from epp.erl:predef_macros/1 - Filename = "compiled_from_string", - %%Machine = list_to_atom(erlang:system_info(machine)), - Ms0 = dict:new(), - % Ms1 = dict:store('FILE', {[], "compiled_from_string"}, Ms0), - % Ms2 = dict:store('LINE', {[], 1}, Ms1), % actually we might add special code for this - % Ms3 = dict:store('MODULE', {[], undefined}, Ms2), - % Ms4 = dict:store('MODULE_STRING', {[], undefined}, Ms3), - % Ms5 = dict:store('MACHINE', {[], Machine}, Ms4), - % InitMD = dict:store(Machine, {[], true}, Ms5), - InitMD = Ms0, - - %% From the docs for compile:forms: - %% When encountering an -include or -include_dir directive, the compiler searches for header files in the following directories: - %% 1. ".", the current working directory of the file server; - %% 2. the base name of the compiled file; - %% 3. the directories specified using the i option. The directory specified last is searched first. - %% In this case, #2 is meaningless. - IncludeSearchPath = ["." | reverse([Dir || {i, Dir} <- CompileFormsOptions])], - {RevForms, _OutMacroDict} = scan_and_parse(CodeStr, Filename, 1, [], InitMD, IncludeSearchPath), - Forms = reverse(RevForms), - - %% note: 'binary' is forced as an implicit option, whether it is provided or not. - case compile:forms(Forms, CompileFormsOptions) of - {ok, ModuleName, CompiledCodeBinary} when is_binary(CompiledCodeBinary) -> - {ModuleName, CompiledCodeBinary}; - {ok, ModuleName, CompiledCodeBinary, []} when is_binary(CompiledCodeBinary) -> % empty warnings list - {ModuleName, CompiledCodeBinary}; - {ok, _ModuleName, _CompiledCodeBinary, Warnings} -> - throw({?MODULE, warnings, Warnings}); - Other -> - throw({?MODULE, compile_forms, Other}) - end. - -%%==================================================================== -%% Internal functions -%%==================================================================== -%%% Code from Mats Cronqvist -%%% See http://www.erlang.org/pipermail/erlang-questions/2007-March/025507.html -%%%## 'scan_and_parse' -%%% -%%% basically we call the OTP scanner and parser (erl_scan and -%%% erl_parse) line-by-line, but check each scanned line for (or -%%% definitions of) macros before parsing. -%% returns {ReverseForms, FinalMacroDict} -scan_and_parse([], _CurrFilename, _CurrLine, RevForms, MacroDict, _IncludeSearchPath) -> - {RevForms, MacroDict}; - -scan_and_parse(RemainingText, CurrFilename, CurrLine, RevForms, MacroDict, IncludeSearchPath) -> - case scanner(RemainingText, CurrLine, MacroDict) of - {tokens, NLine, NRemainingText, Toks} -> - {ok, Form} = erl_parse:parse_form(Toks), - scan_and_parse(NRemainingText, CurrFilename, NLine, [Form | RevForms], MacroDict, IncludeSearchPath); - {macro, NLine, NRemainingText, NMacroDict} -> - scan_and_parse(NRemainingText, CurrFilename, NLine, RevForms,NMacroDict, IncludeSearchPath); - {include, NLine, NRemainingText, IncludeFilename} -> - IncludeFileRemainingTextents = read_include_file(IncludeFilename, IncludeSearchPath), - %%io:format("include file ~p contents: ~n~p~nRemainingText = ~p~n", [IncludeFilename,IncludeFileRemainingTextents, RemainingText]), - %% Modify the FILE macro to reflect the filename - %%IncludeMacroDict = dict:store('FILE', {[],IncludeFilename}, MacroDict), - IncludeMacroDict = MacroDict, - - %% Process the header file (inc. any nested header files) - {RevIncludeForms, IncludedMacroDict} = scan_and_parse(IncludeFileRemainingTextents, IncludeFilename, 1, [], IncludeMacroDict, IncludeSearchPath), - %io:format("include file results = ~p~n", [R]), - %% Restore the FILE macro in the NEW MacroDict (so we keep any macros defined in the header file) - %%NMacroDict = dict:store('FILE', {[],CurrFilename}, IncludedMacroDict), - NMacroDict = IncludedMacroDict, - - %% Continue with the original file - scan_and_parse(NRemainingText, CurrFilename, NLine, RevIncludeForms ++ RevForms, NMacroDict, IncludeSearchPath); - done -> - scan_and_parse([], CurrFilename, CurrLine, RevForms, MacroDict, IncludeSearchPath) - end. - -scanner(Text, Line, MacroDict) -> - case erl_scan:tokens([],Text,Line) of - {done, {ok,Toks,NLine}, LeftOverChars} -> - case pre_proc(Toks, MacroDict) of - {tokens, NToks} -> {tokens, NLine, LeftOverChars, NToks}; - {macro, NMacroDict} -> {macro, NLine, LeftOverChars, NMacroDict}; - {include, Filename} -> {include, NLine, LeftOverChars, Filename} - end; - {more, _Continuation} -> - %% This is supposed to mean "term is not yet complete" (i.e. a '.' has - %% not been reached yet). - %% However, for some bizarre reason we also get this if there is a comment after the final '.' in a file. - %% So we check to see if Text only consists of comments. - case is_only_comments(Text) of - true -> - done; - false -> - throw({incomplete_term, Text, Line}) - end - end. - -is_only_comments(Text) -> is_only_comments(Text, not_in_comment). - -is_only_comments([], _) -> true; -is_only_comments([$ |T], not_in_comment) -> is_only_comments(T, not_in_comment); % skipping whitspace outside of comment -is_only_comments([$\t |T], not_in_comment) -> is_only_comments(T, not_in_comment); % skipping whitspace outside of comment -is_only_comments([$\n |T], not_in_comment) -> is_only_comments(T, not_in_comment); % skipping whitspace outside of comment -is_only_comments([$% |T], not_in_comment) -> is_only_comments(T, in_comment); % found start of a comment -is_only_comments(_, not_in_comment) -> false; -% found any significant char NOT in a comment -is_only_comments([$\n |T], in_comment) -> is_only_comments(T, not_in_comment); % found end of a comment -is_only_comments([_ |T], in_comment) -> is_only_comments(T, in_comment). % skipping over in-comment chars - -%%%## 'pre-proc' -%%% -%%% have to implement a subset of the pre-processor, since epp insists -%%% on running on a file. -%%% only handles 2 cases; -%% -define(MACRO, something). -%% -define(MACRO(VAR1,VARN),{stuff,VAR1,more,stuff,VARN,extra,stuff}). -pre_proc([{'-',_},{atom,_,define},{'(',_},{_,_,Name}|DefToks],MacroDict) -> - false = dict:is_key(Name, MacroDict), - case DefToks of - [{',',_} | Macro] -> - {macro, dict:store(Name, {[], macro_body_def(Macro, [])}, MacroDict)}; - [{'(',_} | Macro] -> - {macro, dict:store(Name, macro_params_body_def(Macro, []), MacroDict)} - end; - -pre_proc([{'-',_}, {atom,_,include}, {'(',_}, {string,_,Filename}, {')',_}, {dot,_}], _MacroDict) -> - {include, Filename}; - -pre_proc(Toks,MacroDict) -> - {tokens, subst_macros(Toks, MacroDict)}. - -macro_params_body_def([{')',_},{',',_} | Toks], RevParams) -> - {reverse(RevParams), macro_body_def(Toks, [])}; -macro_params_body_def([{var,_,Param} | Toks], RevParams) -> - macro_params_body_def(Toks, [Param | RevParams]); -macro_params_body_def([{',',_}, {var,_,Param} | Toks], RevParams) -> - macro_params_body_def(Toks, [Param | RevParams]). - -macro_body_def([{')',_}, {dot,_}], RevMacroBodyToks) -> - reverse(RevMacroBodyToks); -macro_body_def([Tok|Toks], RevMacroBodyToks) -> - macro_body_def(Toks, [Tok | RevMacroBodyToks]). - -subst_macros(Toks, MacroDict) -> - reverse(subst_macros_rev(Toks, MacroDict, [])). - -%% returns a reversed list of tokes -subst_macros_rev([{'?',_}, {_,LineNum,'LINE'} | Toks], MacroDict, RevOutToks) -> - %% special-case for ?LINE, to avoid creating a new MacroDict for every line in the source file - subst_macros_rev(Toks, MacroDict, [{integer,LineNum,LineNum}] ++ RevOutToks); - -subst_macros_rev([{'?',_}, {_,_,Name}, {'(',_} = Paren | Toks], MacroDict, RevOutToks) -> - case dict:fetch(Name, MacroDict) of - {[], MacroValue} -> - %% This macro does not have any vars, so ignore the fact that the invocation is followed by "(...stuff" - %% Recursively expand any macro calls inside this macro's value - %% TODO: avoid infinite expansion due to circular references (even indirect ones) - RevExpandedOtherMacrosToks = subst_macros_rev(MacroValue, MacroDict, []), - subst_macros_rev([Paren|Toks], MacroDict, RevExpandedOtherMacrosToks ++ RevOutToks); - ParamsAndBody -> - %% This macro does have vars. - %% Collect all of the passe arguments, in an ordered list - {NToks, Arguments} = subst_macros_get_args(Toks, []), - %% Expand the varibles - ExpandedParamsToks = subst_macros_subst_args_for_vars(ParamsAndBody, Arguments), - %% Recursively expand any macro calls inside this macro's value - %% TODO: avoid infinite expansion due to circular references (even indirect ones) - RevExpandedOtherMacrosToks = subst_macros_rev(ExpandedParamsToks, MacroDict, []), - subst_macros_rev(NToks, MacroDict, RevExpandedOtherMacrosToks ++ RevOutToks) - end; - -subst_macros_rev([{'?',_}, {_,_,Name} | Toks], MacroDict, RevOutToks) -> - %% This macro invocation does not have arguments. - %% Therefore the definition should not have parameters - {[], MacroValue} = dict:fetch(Name, MacroDict), - - %% Recursively expand any macro calls inside this macro's value - %% TODO: avoid infinite expansion due to circular references (even indirect ones) - RevExpandedOtherMacrosToks = subst_macros_rev(MacroValue, MacroDict, []), - subst_macros_rev(Toks, MacroDict, RevExpandedOtherMacrosToks ++ RevOutToks); - -subst_macros_rev([Tok|Toks], MacroDict, RevOutToks) -> -subst_macros_rev(Toks, MacroDict, [Tok|RevOutToks]); -subst_macros_rev([], _MacroDict, RevOutToks) -> RevOutToks. - -subst_macros_get_args([{')',_} | Toks], RevArgs) -> - {Toks, reverse(RevArgs)}; -subst_macros_get_args([{',',_}, {var,_,ArgName} | Toks], RevArgs) -> - subst_macros_get_args(Toks, [ArgName| RevArgs]); -subst_macros_get_args([{var,_,ArgName} | Toks], RevArgs) -> - subst_macros_get_args(Toks, [ArgName | RevArgs]). - -subst_macros_subst_args_for_vars({[], BodyToks}, []) -> - BodyToks; -subst_macros_subst_args_for_vars({[Param | Params], BodyToks}, [Arg|Args]) -> - NBodyToks = keyreplace(Param, 3, BodyToks, {var,1,Arg}), - subst_macros_subst_args_for_vars({Params, NBodyToks}, Args). - -read_include_file(Filename, IncludeSearchPath) -> - case file:path_open(IncludeSearchPath, Filename, [read, raw, binary]) of - {ok, IoDevice, FullName} -> - {ok, Data} = file:read(IoDevice, filelib:file_size(FullName)), - file:close(IoDevice), - binary_to_list(Data); - {error, Reason} -> - throw({failed_to_read_include_file, Reason, Filename, IncludeSearchPath}) - end. \ No newline at end of file diff --git a/src/ejabberd.app b/src/ejabberd.app deleted file mode 100644 index 349b4ecb2..000000000 --- a/src/ejabberd.app +++ /dev/null @@ -1,156 +0,0 @@ -%% $Id$ - -{application, ejabberd, - [{description, "ejabberd"}, - {vsn, "3.0.0"}, - {modules, [acl, - adhoc, - configure, - cyrsasl_anonymous, - cyrsasl, - cyrsasl_digest, - cyrsasl_plain, - cyrsasl_scram, - ejabberd_admin, - ejabberd_app, - ejabberd_auth_anonymous, - ejabberd_auth, - ejabberd_auth_external, - ejabberd_auth_internal, - ejabberd_auth_ldap, - ejabberd_auth_odbc, - ejabberd_auth_pam, - ejabberd, - ejabberd_c2s, - ejabberd_c2s_config, - ejabberd_config, - ejabberd_ctl, - ejabberd_frontend_socket, - ejabberd_hooks, - ejabberd_http, - ejabberd_http_bind, - ejabberd_http_poll, - ejabberd_listener, - ejabberd_local, - ejabberd_logger_h, - ejabberd_loglevel, - ejabberd_node_groups, - ejabberd_rdbms, - ejabberd_receiver, - ejabberd_router, - ejabberd_router_multicast, - ejabberd_s2s, - ejabberd_s2s_in, - ejabberd_s2s_out, - ejabberd_service, - ejabberd_sm, - ejabberd_socket, - ejabberd_sup, - ejabberd_system_monitor, - ejabberd_tmp_sup, - ejabberd_update, - ejabberd_web_admin, - ejabberd_web, - ejabberd_zlib, - ejd2odbc, - eldap, - eldap_filter, - eldap_pool, - eldap_utils, - 'ELDAPv3', - extauth, - gen_iq_handler, - gen_mod, - gen_pubsub_node, - gen_pubsub_nodetree, - iconv, - idna, - jd2ejd, - jlib, - mod_adhoc, - mod_announce, - mod_caps, - mod_configure2, - mod_configure, - mod_disco, - mod_echo, - mod_http_bind, - mod_http_fileserver, - mod_irc, - mod_irc_connection, - mod_last, - mod_muc, - mod_muc_log, - mod_muc_room, - mod_offline, - mod_privacy, - mod_private, - mod_proxy65, - mod_proxy65_lib, - mod_proxy65_service, - mod_proxy65_sm, - mod_proxy65_stream, - mod_pubsub, - mod_register, - mod_roster, - mod_service_log, - mod_shared_roster, - mod_stats, - mod_time, - mod_vcard, - mod_vcard_ldap, - mod_version, - node_buddy, - node_club, - node_default, - node_dispatch, - node_pep, - node_private, - node_public, - nodetree_default, - nodetree_virtual, - p1_fsm, - p1_mnesia, - p1_prof, - randoms, - sha, - shaper, - stringprep, - stringprep_sup, - tls, - translate, - xml, - xml_stream, - 'XmppAddr' - ]}, - {registered, [ejabberd, - ejabberd_sup, - ejabberd_auth, - ejabberd_router, - ejabberd_router_multicast, - ejabberd_sm, - ejabberd_s2s, - ejabberd_local, - ejabberd_listeners, - ejabberd_iq_sup, - ejabberd_service_sup, - ejabberd_s2s_out_sup, - ejabberd_s2s_in_sup, - ejabberd_c2s_sup, - ejabberd_mod_roster, - ejabberd_mod_echo, - ejabberd_mod_pubsub, - ejabberd_mod_irc, - ejabberd_mod_muc, - ejabberd_offline, - random_generator - ]}, - {applications, [kernel, stdlib]}, - {env, []}, - {mod, {ejabberd_app, []}}]}. - - -%% Local Variables: -%% mode: erlang -%% End: -%% vim: set filetype=erlang tabstop=8: diff --git a/src/ejabberd.app.src b/src/ejabberd.app.src new file mode 100644 index 000000000..06077042c --- /dev/null +++ b/src/ejabberd.app.src @@ -0,0 +1,37 @@ +%% $Id$ + +{application, ejabberd, + [{description, "ejabberd"}, + {vsn, "3.0.0"}, + {modules, []}, + {registered, [ejabberd, + ejabberd_sup, + ejabberd_auth, + ejabberd_router, + ejabberd_router_multicast, + ejabberd_sm, + ejabberd_s2s, + ejabberd_local, + ejabberd_listeners, + ejabberd_iq_sup, + ejabberd_service_sup, + ejabberd_s2s_out_sup, + ejabberd_s2s_in_sup, + ejabberd_c2s_sup, + ejabberd_mod_roster, + ejabberd_mod_echo, + ejabberd_mod_pubsub, + ejabberd_mod_irc, + ejabberd_mod_muc, + ejabberd_offline, + random_generator + ]}, + {applications, [kernel, stdlib]}, + {env, []}, + {mod, {ejabberd_app, []}}]}. + + +%% Local Variables: +%% mode: erlang +%% End: +%% vim: set filetype=erlang tabstop=8: diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl index f0e4f4c66..b95afd7d2 100644 --- a/src/ejabberd_admin.erl +++ b/src/ejabberd_admin.erl @@ -55,6 +55,7 @@ ]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("ejabberd_commands.hrl"). start() -> diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl index a18af480b..167a9874c 100644 --- a/src/ejabberd_app.erl +++ b/src/ejabberd_app.erl @@ -32,6 +32,7 @@ -export([start_modules/0,start/2, get_log_path/0, prep_stop/1, stop/1, init/0]). -include("ejabberd.hrl"). +-include("logger.hrl"). %%% diff --git a/src/ejabberd_auth.erl b/src/ejabberd_auth.erl index 4cf0026aa..ce0eb4875 100644 --- a/src/ejabberd_auth.erl +++ b/src/ejabberd_auth.erl @@ -46,6 +46,7 @@ -export([auth_modules/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -type opts() :: [{prefix, binary()} | {from, integer()} | {to, integer()} | {limit, integer()} | diff --git a/src/ejabberd_auth_anonymous.erl b/src/ejabberd_auth_anonymous.erl index 80cc1b99b..2c98b87a9 100644 --- a/src/ejabberd_auth_anonymous.erl +++ b/src/ejabberd_auth_anonymous.erl @@ -48,6 +48,7 @@ plain_password_required/0]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/ejabberd_auth_external.erl b/src/ejabberd_auth_external.erl index 84551d0c2..ed0d159f1 100644 --- a/src/ejabberd_auth_external.erl +++ b/src/ejabberd_auth_external.erl @@ -42,6 +42,7 @@ plain_password_required/0]). -include("ejabberd.hrl"). +-include("logger.hrl"). start(Host) -> Cmd = ejabberd_config:get_local_option( diff --git a/src/ejabberd_auth_internal.erl b/src/ejabberd_auth_internal.erl index 16da2e472..a557d7087 100644 --- a/src/ejabberd_auth_internal.erl +++ b/src/ejabberd_auth_internal.erl @@ -42,6 +42,7 @@ plain_password_required/0]). -include("ejabberd.hrl"). +-include("logger.hrl"). -record(passwd, {us = {<<"">>, <<"">>} :: {binary(), binary()} | '$1', password = <<"">> :: binary() | scram() | '_'}). diff --git a/src/ejabberd_auth_ldap.erl b/src/ejabberd_auth_ldap.erl index c7046d45f..1913c49b9 100644 --- a/src/ejabberd_auth_ldap.erl +++ b/src/ejabberd_auth_ldap.erl @@ -47,8 +47,9 @@ plain_password_required/0]). -include("ejabberd.hrl"). +-include("logger.hrl"). --include("eldap/eldap.hrl"). +-include("eldap.hrl"). -record(state, {host = <<"">> :: binary(), diff --git a/src/ejabberd_auth_odbc.erl b/src/ejabberd_auth_odbc.erl index 709be3bc7..2419f4d28 100644 --- a/src/ejabberd_auth_odbc.erl +++ b/src/ejabberd_auth_odbc.erl @@ -42,6 +42,7 @@ plain_password_required/0]). -include("ejabberd.hrl"). +-include("logger.hrl"). start(_Host) -> ok. diff --git a/src/ejabberd_auth_riak.erl b/src/ejabberd_auth_riak.erl index c4f23488b..9d23d18de 100644 --- a/src/ejabberd_auth_riak.erl +++ b/src/ejabberd_auth_riak.erl @@ -42,6 +42,7 @@ plain_password_required/0]). -include("ejabberd.hrl"). +-include("logger.hrl"). -record(passwd, {us = {<<"">>, <<"">>} :: {binary(), binary()} | '$1', password = <<"">> :: binary() | scram() | '_'}). diff --git a/src/web/ejabberd_bosh.erl b/src/ejabberd_bosh.erl similarity index 99% rename from src/web/ejabberd_bosh.erl rename to src/ejabberd_bosh.erl index f53e60b9d..566d13b1d 100644 --- a/src/web/ejabberd_bosh.erl +++ b/src/ejabberd_bosh.erl @@ -45,6 +45,7 @@ code_change/4]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 7b5d326da..710c0a6d5 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -57,6 +57,7 @@ migrate_shutdown/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/ejabberd_captcha.erl b/src/ejabberd_captcha.erl index 3279335ff..8d04cdd60 100644 --- a/src/ejabberd_captcha.erl +++ b/src/ejabberd_captcha.erl @@ -43,8 +43,9 @@ -include("jlib.hrl"). -include("ejabberd.hrl"). +-include("logger.hrl"). --include("web/ejabberd_http.hrl"). +-include("ejabberd_http.hrl"). -define(VFIELD(Type, Var, Value), #xmlel{name = <<"field">>, diff --git a/src/ejabberd_check.erl b/src/ejabberd_check.erl index 352251806..5dde19186 100644 --- a/src/ejabberd_check.erl +++ b/src/ejabberd_check.erl @@ -29,6 +29,7 @@ -export([libs/0, config/0]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("ejabberd_config.hrl"). %% TODO: diff --git a/src/ejabberd_cluster.erl b/src/ejabberd_cluster.erl index 178842ae2..9279b8059 100644 --- a/src/ejabberd_cluster.erl +++ b/src/ejabberd_cluster.erl @@ -20,6 +20,7 @@ handle_info/2, terminate/2, code_change/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -define(HASHTBL, nodes_hash). diff --git a/src/ejabberd_commands.erl b/src/ejabberd_commands.erl index 98559a450..380743674 100644 --- a/src/ejabberd_commands.erl +++ b/src/ejabberd_commands.erl @@ -222,6 +222,7 @@ -include("ejabberd_commands.hrl"). -include("ejabberd.hrl"). +-include("logger.hrl"). init() -> diff --git a/src/ejabberd_config.erl b/src/ejabberd_config.erl index bd9291cd3..71f5fba0c 100644 --- a/src/ejabberd_config.erl +++ b/src/ejabberd_config.erl @@ -38,6 +38,7 @@ -export([convert_table_to_binary/5]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("ejabberd_config.hrl"). -include_lib("kernel/include/file.hrl"). diff --git a/src/ejabberd_ctl.erl b/src/ejabberd_ctl.erl index 49727d15e..a9a6f6725 100644 --- a/src/ejabberd_ctl.erl +++ b/src/ejabberd_ctl.erl @@ -57,6 +57,7 @@ -include("ejabberd_ctl.hrl"). -include("ejabberd_commands.hrl"). -include("ejabberd.hrl"). +-include("logger.hrl"). %%----------------------------- diff --git a/src/ejabberd_hooks.erl b/src/ejabberd_hooks.erl index e4f9f597b..3891fd9ff 100644 --- a/src/ejabberd_hooks.erl +++ b/src/ejabberd_hooks.erl @@ -55,6 +55,7 @@ terminate/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). %% Timeout of 5 seconds in calls to distributed hooks -define(TIMEOUT_DISTRIBUTED_HOOK, 5000). diff --git a/src/web/ejabberd_http.erl b/src/ejabberd_http.erl similarity index 99% rename from src/web/ejabberd_http.erl rename to src/ejabberd_http.erl index 7da79b3e8..eab2332bb 100644 --- a/src/web/ejabberd_http.erl +++ b/src/ejabberd_http.erl @@ -36,6 +36,7 @@ -export([init/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/web/ejabberd_http_bind.erl b/src/ejabberd_http_bind.erl similarity index 99% rename from src/web/ejabberd_http_bind.erl rename to src/ejabberd_http_bind.erl index 95fb14f8b..01de942b0 100644 --- a/src/web/ejabberd_http_bind.erl +++ b/src/ejabberd_http_bind.erl @@ -23,6 +23,7 @@ http_get/2, prepare_response/4, process_request/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/web/ejabberd_http_bindjson.erl b/src/ejabberd_http_bindjson.erl similarity index 99% rename from src/web/ejabberd_http_bindjson.erl rename to src/ejabberd_http_bindjson.erl index 245416142..75af8fdb4 100644 --- a/src/web/ejabberd_http_bindjson.erl +++ b/src/ejabberd_http_bindjson.erl @@ -22,6 +22,7 @@ http_get/2, prepare_response/4, process_request/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/web/ejabberd_http_poll.erl b/src/ejabberd_http_poll.erl similarity index 99% rename from src/web/ejabberd_http_poll.erl rename to src/ejabberd_http_poll.erl index ee3e42ac7..02bb7734a 100644 --- a/src/web/ejabberd_http_poll.erl +++ b/src/ejabberd_http_poll.erl @@ -37,6 +37,7 @@ controlling_process/2, close/1, process/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/web/ejabberd_http_ws.erl b/src/ejabberd_http_ws.erl similarity index 99% rename from src/web/ejabberd_http_ws.erl rename to src/ejabberd_http_ws.erl index 750c8a8be..ba830016a 100644 --- a/src/web/ejabberd_http_ws.erl +++ b/src/ejabberd_http_ws.erl @@ -37,6 +37,7 @@ socket_handoff/6]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/web/ejabberd_http_wsjson.erl b/src/ejabberd_http_wsjson.erl similarity index 99% rename from src/web/ejabberd_http_wsjson.erl rename to src/ejabberd_http_wsjson.erl index b7cae693e..53fca1871 100644 --- a/src/web/ejabberd_http_wsjson.erl +++ b/src/ejabberd_http_wsjson.erl @@ -38,6 +38,7 @@ close/1, socket_handoff/6]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/ejabberd_listener.erl b/src/ejabberd_listener.erl index 1226d9d5d..292a96dc6 100644 --- a/src/ejabberd_listener.erl +++ b/src/ejabberd_listener.erl @@ -41,6 +41,7 @@ ]). -include("ejabberd.hrl"). +-include("logger.hrl"). %% We do not block on send anymore. -define(TCP_SEND_TIMEOUT, 15000). diff --git a/src/ejabberd_local.erl b/src/ejabberd_local.erl index 3607356f0..b3fdeabc0 100644 --- a/src/ejabberd_local.erl +++ b/src/ejabberd_local.erl @@ -45,6 +45,7 @@ handle_info/2, terminate/2, code_change/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/ejabberd_logger.erl b/src/ejabberd_logger.erl deleted file mode 100644 index f036c1e72..000000000 --- a/src/ejabberd_logger.erl +++ /dev/null @@ -1,35 +0,0 @@ -%%%------------------------------------------------------------------- -%%% @author Evgeniy Khramtsov -%%% @copyright (C) 2012, Evgeniy Khramtsov -%%% @doc This module is needed to shut up Dialyzer -%%% @end -%%% Created : 10 Jul 2012 by Evgeniy Khramtsov -%%%------------------------------------------------------------------- --module(ejabberd_logger). - --compile({no_auto_import, [{get, 0}]}). - -%% API --export([debug_msg/4, info_msg/4, warning_msg/4, - error_msg/4, critical_msg/4, get/0]). - -%%%=================================================================== -%%% API -%%%=================================================================== --spec debug_msg(atom(), pos_integer(), string(), list()) -> ok. --spec info_msg(atom(), pos_integer(), string(), list()) -> ok. --spec warning_msg(atom(), pos_integer(), string(), list()) -> ok. --spec error_msg(atom(), pos_integer(), string(), list()) -> ok. --spec critical_msg(atom(), pos_integer(), string(), list()) -> ok. --spec get() -> {non_neg_integer(), [{atom(), non_neg_integer()}]}. - -debug_msg(_Mod, _Line, _Format, _Args) -> ok. -info_msg(_Mod, _Line, _Format, _Args) -> ok. -warning_msg(_Mod, _Line, _Format, _Args) -> ok. -error_msg(_Mod, _Line, _Format, _Args) -> ok. -critical_msg(_Mod, _Line, _Format, _Args) -> ok. -get() -> {0, [{foo, 0}]}. - -%%%=================================================================== -%%% Internal functions -%%%=================================================================== diff --git a/src/ejabberd_logger_h.erl b/src/ejabberd_logger_h.erl deleted file mode 100644 index 6f3e0a6d8..000000000 --- a/src/ejabberd_logger_h.erl +++ /dev/null @@ -1,236 +0,0 @@ -%%%---------------------------------------------------------------------- -%%% File : ejabberd_logger_h.erl -%%% Author : Alexey Shchepin -%%% Purpose : Manage Erlang logging. -%%% Created : 23 Oct 2003 by Alexey Shchepin -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2013 ProcessOne -%%% -%%% 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 -%%% -%%%---------------------------------------------------------------------- - --module(ejabberd_logger_h). --author('alexey@process-one.net'). - --behaviour(gen_event). - -%% gen_event callbacks --export([init/1, handle_event/2, handle_call/2, handle_info/2, terminate/2, - code_change/3, reopen_log/0, rotate_log/1]). - --record(state, {fd, file}). - -%%%---------------------------------------------------------------------- -%%% Callback functions from gen_event -%%%---------------------------------------------------------------------- - -%%---------------------------------------------------------------------- -%% Func: init/1 -%% Returns: {ok, State} | -%% Other -%%---------------------------------------------------------------------- -init(File) -> - case file:open(File, [append, raw]) of - {ok, Fd} -> - {ok, #state{fd = Fd, file = File}}; - Error -> - Error - end. - -%%---------------------------------------------------------------------- -%% Func: handle_event/2 -%% Returns: {ok, State} | -%% {swap_handler, Args1, State1, Mod2, Args2} | -%% remove_handler -%%---------------------------------------------------------------------- -handle_event(Event, State) -> - write_event(State#state.fd, {erlang:localtime(), Event}), - {ok, State}. - -%%---------------------------------------------------------------------- -%% Func: handle_call/2 -%% Returns: {ok, Reply, State} | -%% {swap_handler, Reply, Args1, State1, Mod2, Args2} | -%% {remove_handler, Reply} -%%---------------------------------------------------------------------- -handle_call(_Request, State) -> - Reply = ok, - {ok, Reply, State}. - -%%---------------------------------------------------------------------- -%% Func: handle_info/2 -%% Returns: {ok, State} | -%% {swap_handler, Args1, State1, Mod2, Args2} | -%% remove_handler -%%---------------------------------------------------------------------- -handle_info({'EXIT', _Fd, _Reason}, _State) -> - remove_handler; -handle_info({emulator, _GL, reopen}, State) -> - file:close(State#state.fd), - rotate_log(State#state.file), - case file:open(State#state.file, [append, raw]) of - {ok, Fd} -> - {ok, State#state{fd = Fd}}; - Error -> - Error - end; -handle_info({emulator, GL, Chars}, State) -> - write_event(State#state.fd, {erlang:localtime(), {emulator, GL, Chars}}), - {ok, State}; -handle_info(_Info, State) -> - {ok, State}. - -%%---------------------------------------------------------------------- -%% Func: terminate/2 -%% Purpose: Shutdown the server -%% Returns: any -%%---------------------------------------------------------------------- -terminate(_Reason, _State) -> - ok. - -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - -reopen_log() -> - error_logger ! {emulator, noproc, reopen}. - -%%%---------------------------------------------------------------------- -%%% Internal functions -%%%---------------------------------------------------------------------- - -% Copied from erlang_logger_file_h.erl -write_event(Fd, {Time, {error, _GL, {Pid, Format, Args}}}) -> - T = write_time(Time), - case catch io_lib:format(add_node(Format,Pid), Args) of - S when is_list(S) -> - file:write(Fd, io_lib:format(T ++ S, [])); - _ -> - F = add_node("ERROR: ~p - ~p~n", Pid), - file:write(Fd, io_lib:format(T ++ F, [Format,Args])) - end; -write_event(Fd, {Time, {emulator, _GL, Chars}}) -> - T = write_time(Time), - case catch io_lib:format(Chars, []) of - S when is_list(S) -> - file:write(Fd, io_lib:format(T ++ S, [])); - _ -> - file:write(Fd, io_lib:format(T ++ "ERROR: ~p ~n", [Chars])) - end; -write_event(Fd, {Time, {info, _GL, {Pid, Info, _}}}) -> - T = write_time(Time), - file:write(Fd, io_lib:format(T ++ add_node("~p~n",Pid), [Info])); -write_event(Fd, {Time, {error_report, _GL, {Pid, std_error, Rep}}}) -> - T = write_time(Time), - S = format_report(Rep), - file:write(Fd, io_lib:format(T ++ S ++ add_node("", Pid), [])); -write_event(Fd, {Time, {info_report, _GL, {Pid, std_info, Rep}}}) -> - T = write_time(Time, "INFO REPORT"), - S = format_report(Rep), - file:write(Fd, io_lib:format(T ++ S ++ add_node("", Pid), [])); -write_event(Fd, {Time, {info_msg, _GL, {Pid, Format, Args}}}) -> - T = write_time(Time, "INFO REPORT"), - case catch io_lib:format(add_node(Format,Pid), Args) of - S when is_list(S) -> - file:write(Fd, io_lib:format(T ++ S, [])); - _ -> - F = add_node("ERROR: ~p - ~p~n", Pid), - file:write(Fd, io_lib:format(T ++ F, [Format,Args])) - end; -write_event(Fd, {Time, {warning_report, _GL, {Pid, std_warning, Rep}}}) -> - T = write_time(Time, "WARNING REPORT"), - S = format_report(Rep), - file:write(Fd, io_lib:format(T ++ S ++ add_node("", Pid), [])); -write_event(Fd, {Time, {warning_msg, _GL, {Pid, Format, Args}}}) -> - T = write_time(Time, "WARNING REPORT"), - case catch io_lib:format(add_node(Format,Pid), Args) of - S when is_list(S) -> - file:write(Fd, io_lib:format(T ++ S, [])); - _ -> - F = add_node("ERROR: ~p - ~p~n", Pid), - file:write(Fd, io_lib:format(T ++ F, [Format,Args])) - end; -write_event(_, _) -> - ok. - -format_report(Rep) when is_list(Rep) -> - case string_p(Rep) of - true -> - io_lib:format("~s~n",[Rep]); - _ -> - format_rep(Rep) - end; -format_report(Rep) -> - io_lib:format("~p~n",[Rep]). - -format_rep([{Tag,Data}|Rep]) -> - io_lib:format(" ~p: ~p~n",[Tag,Data]) ++ format_rep(Rep); -format_rep([Other|Rep]) -> - io_lib:format(" ~p~n",[Other]) ++ format_rep(Rep); -format_rep(_) -> - []. - -add_node(X, Pid) when is_atom(X) -> - add_node(atom_to_list(X), Pid); -add_node(X, Pid) when node(Pid) /= node() -> - lists:concat([X,"** at node ",node(Pid)," **~n"]); -add_node(X, _) -> - X. - -string_p([]) -> - false; -string_p(Term) -> - string_p1(Term). - -string_p1([H|T]) when is_integer(H), H >= $\s, H < 255 -> - string_p1(T); -string_p1([$\n|T]) -> string_p1(T); -string_p1([$\r|T]) -> string_p1(T); -string_p1([$\t|T]) -> string_p1(T); -string_p1([$\v|T]) -> string_p1(T); -string_p1([$\b|T]) -> string_p1(T); -string_p1([$\f|T]) -> string_p1(T); -string_p1([$\e|T]) -> string_p1(T); -string_p1([H|T]) when is_list(H) -> - case string_p1(H) of - true -> string_p1(T); - _ -> false - end; -string_p1([]) -> true; -string_p1(_) -> false. - -write_time(Time) -> write_time(Time, "ERROR REPORT"). - -write_time({{Y,Mo,D},{H,Mi,S}}, Type) -> - io_lib:format("~n=~s==== ~w-~.2.0w-~.2.0w ~.2.0w:~.2.0w:~.2.0w ===~n", - [Type, Y, Mo, D, H, Mi, S]). - -%% @doc Rename the log file if exists, to "*-old.log". -%% This is needed in systems when the file must be closed before rotation (Windows). -%% On most Unix-like system, the file can be renamed from the command line and -%% the log can directly be reopened. -%% @spec (Filename::string()) -> ok -rotate_log(Filename) -> - case file:read_file_info(Filename) of - {ok, _FileInfo} -> - RotationName = filename:rootname(Filename), - file:rename(Filename, [RotationName, "-old.log"]), - ok; - {error, _Reason} -> - ok - end. - diff --git a/src/ejabberd_loglevel.erl b/src/ejabberd_loglevel.erl deleted file mode 100644 index 0306b0b88..000000000 --- a/src/ejabberd_loglevel.erl +++ /dev/null @@ -1,194 +0,0 @@ -%%%---------------------------------------------------------------------- -%%% File : ejabberd_loglevel.erl -%%% Author : Mickael Remond -%%% Purpose : Loglevel switcher. -%%% Be careful: you should not have any ejabberd_logger module -%%% as ejabberd_loglevel switcher is compiling and loading -%%% dynamically a "virtual" ejabberd_logger module (Described -%%% in a string at the end of this module). -%%% Created : 29 Nov 2006 by Mickael Remond -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2013 ProcessOne -%%% -%%% 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 -%%% -%%%---------------------------------------------------------------------- - --module(ejabberd_loglevel). --author('mickael.remond@process-one.net'). - --export([set/1, - get/0, - set_custom/2, - clear_custom/0, - clear_custom/1]). - --include("ejabberd.hrl"). - --define(LOGMODULE, "error_logger"). - -%% Error levels: --record(loglevel, {ordinal, - name, - description, - function = no_log, - event_type = no_log, - msg_prefix = no_log}). - --define(LOG_LEVELS, - [#loglevel{ordinal = 0, name = no_log, description = "No log"}, - #loglevel{ordinal = 1, name = critical, description = "Critical", - function = critical_msg, event_type = error, msg_prefix = "C"}, - #loglevel{ordinal = 2, name = error, description = "Error", - function = error_msg, event_type = error, msg_prefix = "E"}, - #loglevel{ordinal = 3, name = warning, description = "Warning", - function = warning_msg, event_type = warning_msg, msg_prefix = "W"}, - #loglevel{ordinal = 4, name = info, description = "Info", - function = info_msg, event_type = info_msg, msg_prefix = "I"}, - #loglevel{ordinal = 5, name = debug, description = "Debug", - function = debug_msg, event_type = info_msg, msg_prefix = "D"}]). - -%% @type level() = integer() | atom(). - -%% @spec () -> {DefaultLevelOrdinal::integer(), [{Module::atom(), LevelOrdinal::integer()}]} -%% @doc Get the default and all custom levels -get() -> - {DefaultLevel, _CustomLevels} = ejabberd_logger:get(), - case lists:keysearch(DefaultLevel, #loglevel.ordinal, ?LOG_LEVELS) of - {value, Result = #loglevel{}} -> - {Result#loglevel.ordinal, Result#loglevel.name, Result#loglevel.description}; - _ -> - erlang:error({no_such_loglevel, DefaultLevel}) - end. - -%% @spec (DefaultLevel::level() | {DefaultLevel::level(), [{Module::atom(), Level::level()}]}) -> -%% {module, ejabberd_logger} -%% @doc Set the default and all custom levels -set(DefaultLevel) when is_atom(DefaultLevel) orelse is_integer(DefaultLevel) -> - set({DefaultLevel, []}); -set({DefaultLevel, CustomLevels}) when is_list(CustomLevels) -> - DefaultInt = level_to_integer(DefaultLevel), - CustomInts = [level_to_integer(C) || C <- CustomLevels], - Loglevel = {DefaultInt, CustomInts}, - try - {Mod,Code} = dynamic_compile:from_string(ejabberd_logger_src(Loglevel)), - code:load_binary(Mod, ?LOGMODULE ++ ".erl", Code) - catch - Type:Error -> ?CRITICAL_MSG("Error compiling logger (~p): ~p~n", [Type, Error]) - end; -set(_) -> - exit("Invalid loglevel format"). - -%% @spec (Module::atom(), CustomLevel::level()) -> ok -%% @doc Set a custom level -set_custom(Module, Level) -> - {DefaultLevel, CustomLevels} = ejabberd_logger:get(), - case lists:keysearch(Module, 1, CustomLevels) of - {value, {Module, Level}} -> - ok; - {value, _} -> - set({DefaultLevel, lists:keyreplace(Module, 1, CustomLevels, {Module, Level})}); - _ -> - set({DefaultLevel, [{Module, Level} | CustomLevels]}) - end. - -%% @spec () -> ok -%% @doc Clear all custom levels -clear_custom() -> - {DefaultLevel, _CustomLevels} = ejabberd_logger:get(), - set({DefaultLevel, []}). - -%% @spec (Module::atom()) -> ok -%% @doc Clear a custom level -clear_custom(Module) -> - {DefaultLevel, CustomLevels} = ejabberd_logger:get(), - case lists:keysearch(Module, 1, CustomLevels) of - {value, _} -> - set({DefaultLevel, lists:keydelete(Module, 1, CustomLevels)}); - _ -> - ok - end. - -level_to_integer(Level) when is_integer(Level) -> - Level; -level_to_integer({Module, Level}) -> - {Module, level_to_integer(Level)}; -level_to_integer(Level) -> - case lists:keysearch(Level, #loglevel.name, ?LOG_LEVELS) of - {value, #loglevel{ordinal = Int}} -> Int; - _ -> erlang:error({no_such_loglevel, Level}) - end. - -%% -------------------------------------------------------------- -%% Code of the ejabberd logger, dynamically compiled and loaded -%% This allows to dynamically change log level while keeping a -%% very efficient code. -ejabberd_logger_src(Loglevel) -> - lists:flatten([header_src(), - get_src(Loglevel), - [log_src(Loglevel, LevelSpec) || LevelSpec <- ?LOG_LEVELS], - notify_src()]). - -header_src() -> - "-module(ejabberd_logger). - -author('mickael.remond@process-one.net'). - - -export([debug_msg/4, - info_msg/4, - warning_msg/4, - error_msg/4, - critical_msg/4, - get/0]). - ". - -get_src(Loglevel) -> - io_lib:format("get() -> ~w. - ", [Loglevel]). - -log_src(_Loglevel, #loglevel{function = no_log}) -> - []; -log_src({DefaultLevel, [{Module, Level} | Tail]}, Spec = #loglevel{ordinal = MinLevel}) - when Level < MinLevel andalso MinLevel =< DefaultLevel -> - [atom_to_list(Spec#loglevel.function), "(", atom_to_list(Module), ", _, _, _) -> ok; - ", log_src({DefaultLevel, Tail}, Spec)]; -log_src({DefaultLevel, [{Module, Level} | Tail]}, Spec = #loglevel{ordinal = MinLevel}) - when DefaultLevel < MinLevel andalso MinLevel =< Level -> - [atom_to_list(Spec#loglevel.function), "(", atom_to_list(Module), " = Module, Line, Format, Args) ->", - log_notify_src(Spec), "; - ", log_src({DefaultLevel, Tail}, Spec)]; -log_src({DefaultLevel, [_Head | Tail]}, Spec = #loglevel{}) -> - log_src({DefaultLevel, Tail}, Spec); -log_src({DefaultLevel, []}, Spec = #loglevel{ordinal = MinLevel}) - when DefaultLevel < MinLevel -> - [atom_to_list(Spec#loglevel.function), "(_, _, _, _) -> ok. - "]; -log_src({_DefaultLevel, []}, Spec = #loglevel{}) -> - [atom_to_list(Spec#loglevel.function), "(Module, Line, Format, Args) ->", - log_notify_src(Spec), ". - "]. - -log_notify_src(Spec = #loglevel{}) -> - ["notify(", atom_to_list(Spec#loglevel.event_type), ", - \"", Spec#loglevel.msg_prefix, "(~p:~p:~p) : \"++Format++\"~n\", - [self(), Module, Line | Args])"]. - -notify_src() -> - %% Distribute the message to the Erlang error logger - "notify(Type, Format, Args) -> - LoggerMsg = {Type, group_leader(), {self(), Format, Args}}, - gen_event:notify(error_logger, LoggerMsg). - ". diff --git a/src/odbc/ejabberd_odbc.erl b/src/ejabberd_odbc.erl similarity index 99% rename from src/odbc/ejabberd_odbc.erl rename to src/ejabberd_odbc.erl index c111fdf2d..194dd9eba 100644 --- a/src/odbc/ejabberd_odbc.erl +++ b/src/ejabberd_odbc.erl @@ -49,6 +49,7 @@ session_established/2, session_established/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -record(state, {db_ref = self() :: pid(), diff --git a/src/odbc/ejabberd_odbc_sup.erl b/src/ejabberd_odbc_sup.erl similarity index 99% rename from src/odbc/ejabberd_odbc_sup.erl rename to src/ejabberd_odbc_sup.erl index 0c748d147..2ddc751f8 100644 --- a/src/odbc/ejabberd_odbc_sup.erl +++ b/src/ejabberd_odbc_sup.erl @@ -33,6 +33,7 @@ get_pids/1, get_random_pid/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -define(DEFAULT_POOL_SIZE, 10). diff --git a/src/ejabberd_piefxis.erl b/src/ejabberd_piefxis.erl index b789c4c8a..205d60d54 100644 --- a/src/ejabberd_piefxis.erl +++ b/src/ejabberd_piefxis.erl @@ -14,6 +14,7 @@ -define(CHUNK_SIZE, 1024*20). %20k -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). -include("mod_privacy.hrl"). -include("mod_roster.hrl"). diff --git a/src/ejabberd_rdbms.erl b/src/ejabberd_rdbms.erl index d97d2b35e..be1531853 100644 --- a/src/ejabberd_rdbms.erl +++ b/src/ejabberd_rdbms.erl @@ -31,6 +31,7 @@ -export([start/0]). -include("ejabberd.hrl"). +-include("logger.hrl"). start() -> case catch ejabberd_odbc_sup:module_info() of diff --git a/src/ejabberd_receiver.erl b/src/ejabberd_receiver.erl index fb51ff8ce..2fc542b39 100644 --- a/src/ejabberd_receiver.erl +++ b/src/ejabberd_receiver.erl @@ -41,6 +41,7 @@ handle_info/2, terminate/2, code_change/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -record(state, {socket :: inet:socket() | tls:tls_socket() | ejabberd_zlib:zlib_socket(), diff --git a/src/ejabberd_riak.erl b/src/ejabberd_riak.erl index 204bfd95b..5d2267a05 100644 --- a/src/ejabberd_riak.erl +++ b/src/ejabberd_riak.erl @@ -42,6 +42,7 @@ terminate/2, code_change/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -record(state, {pid = self() :: pid()}). diff --git a/src/ejabberd_riak_sup.erl b/src/ejabberd_riak_sup.erl index d19b9fbe9..fbb4b5689 100644 --- a/src/ejabberd_riak_sup.erl +++ b/src/ejabberd_riak_sup.erl @@ -38,6 +38,7 @@ ]). -include("ejabberd.hrl"). +-include("logger.hrl"). -define(DEFAULT_POOL_SIZE, 10). -define(DEFAULT_RIAK_START_INTERVAL, 30). % 30 seconds diff --git a/src/ejabberd_router.erl b/src/ejabberd_router.erl index bd5a72e1a..b00a4f315 100644 --- a/src/ejabberd_router.erl +++ b/src/ejabberd_router.erl @@ -43,6 +43,7 @@ handle_info/2, terminate/2, code_change/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/ejabberd_router_multicast.erl b/src/ejabberd_router_multicast.erl index b497c47bf..bf7820fa1 100644 --- a/src/ejabberd_router_multicast.erl +++ b/src/ejabberd_router_multicast.erl @@ -26,6 +26,7 @@ terminate/2, code_change/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). -record(route_multicast, {domain, pid}). diff --git a/src/ejabberd_s2s.erl b/src/ejabberd_s2s.erl index 341c5d474..f2176b8dd 100644 --- a/src/ejabberd_s2s.erl +++ b/src/ejabberd_s2s.erl @@ -50,6 +50,7 @@ -export([get_info_s2s_connections/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/ejabberd_s2s_in.erl b/src/ejabberd_s2s_in.erl index 492d6fe4b..f34c61057 100644 --- a/src/ejabberd_s2s_in.erl +++ b/src/ejabberd_s2s_in.erl @@ -41,6 +41,7 @@ handle_info/3, print_state/1, terminate/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/ejabberd_s2s_out.erl b/src/ejabberd_s2s_out.erl index 50a9bcf53..3c1a4c80a 100644 --- a/src/ejabberd_s2s_out.erl +++ b/src/ejabberd_s2s_out.erl @@ -46,6 +46,7 @@ get_addr_port/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/ejabberd_service.erl b/src/ejabberd_service.erl index 239b18f4a..97905519e 100644 --- a/src/ejabberd_service.erl +++ b/src/ejabberd_service.erl @@ -43,6 +43,7 @@ handle_info/3, terminate/3, print_state/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl index ecd6ab5a2..c562a0e29 100644 --- a/src/ejabberd_sm.erl +++ b/src/ejabberd_sm.erl @@ -53,6 +53,7 @@ handle_info/2, terminate/2, code_change/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/ejabberd_sm_handler.erl b/src/ejabberd_sm_handler.erl index 6f0fcdac4..3902e51fd 100644 --- a/src/ejabberd_sm_handler.erl +++ b/src/ejabberd_sm_handler.erl @@ -40,6 +40,7 @@ terminate/2, code_change/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -record(state, {}). diff --git a/src/ejabberd_socket.erl b/src/ejabberd_socket.erl index 4e0d4c93a..1fe17aaa4 100644 --- a/src/ejabberd_socket.erl +++ b/src/ejabberd_socket.erl @@ -37,6 +37,7 @@ change_socket/2, sockname/1, peername/1, is_remote_receiver/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). -type sockmod() :: ejabberd_http_poll | ejabberd_bosh | diff --git a/src/ejabberd_system_monitor.erl b/src/ejabberd_system_monitor.erl index aaf5d068f..3d61d0c35 100644 --- a/src/ejabberd_system_monitor.erl +++ b/src/ejabberd_system_monitor.erl @@ -39,6 +39,7 @@ handle_info/2, terminate/2, code_change/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/ejabberd_update.erl b/src/ejabberd_update.erl index 4d2ea1d6f..574fad025 100644 --- a/src/ejabberd_update.erl +++ b/src/ejabberd_update.erl @@ -31,6 +31,7 @@ -export([update/0, update/1, update_info/0]). -include("ejabberd.hrl"). +-include("logger.hrl"). %%==================================================================== %% API diff --git a/src/web/ejabberd_web.erl b/src/ejabberd_web.erl similarity index 99% rename from src/web/ejabberd_web.erl rename to src/ejabberd_web.erl index a036447ac..3bceddd29 100644 --- a/src/web/ejabberd_web.erl +++ b/src/ejabberd_web.erl @@ -32,6 +32,7 @@ -export([make_xhtml/1, make_xhtml/2, error/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/web/ejabberd_web_admin.erl b/src/ejabberd_web_admin.erl similarity index 99% rename from src/web/ejabberd_web_admin.erl rename to src/ejabberd_web_admin.erl index 5989818ba..fa34b6cd1 100644 --- a/src/web/ejabberd_web_admin.erl +++ b/src/ejabberd_web_admin.erl @@ -36,6 +36,7 @@ term_to_id/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/web/ejabberd_websocket.erl b/src/ejabberd_websocket.erl similarity index 99% rename from src/web/ejabberd_websocket.erl rename to src/ejabberd_websocket.erl index ca70cf23d..f4c62212c 100644 --- a/src/web/ejabberd_websocket.erl +++ b/src/ejabberd_websocket.erl @@ -43,6 +43,7 @@ -export([connect/2, check/2, socket_handoff/7]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/web/ejabberd_ws.erl b/src/ejabberd_ws.erl similarity index 100% rename from src/web/ejabberd_ws.erl rename to src/ejabberd_ws.erl diff --git a/src/ejabberd_xmlrpc.erl b/src/ejabberd_xmlrpc.erl index 93c1d9781..0fc401646 100644 --- a/src/ejabberd_xmlrpc.erl +++ b/src/ejabberd_xmlrpc.erl @@ -20,6 +20,7 @@ -export([start/2, handler/2, socket_type/0]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("mod_roster.hrl"). diff --git a/src/ejabberd_zlib/Makefile.in b/src/ejabberd_zlib/Makefile.in deleted file mode 100644 index b572c1169..000000000 --- a/src/ejabberd_zlib/Makefile.in +++ /dev/null @@ -1,63 +0,0 @@ -# $Id$ - -CC = @CC@ -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ - -ZLIB_CFLAGS = @ZLIB_CFLAGS@ -ZLIB_LIBS = @ZLIB_LIBS@ - -ERLANG_CFLAGS = @ERLANG_CFLAGS@ -ERLANG_LIBS = @ERLANG_LIBS@ - -# Assume Linux-style dynamic library flags -DYNAMIC_LIB_CFLAGS = -fpic -shared -ifeq ($(shell uname),Darwin) - DYNAMIC_LIB_CFLAGS = -fPIC -bundle -flat_namespace -undefined suppress -endif -ifeq ($(shell uname),SunOs) - DYNAMIC_LIB_CFLAGS = -KPIC -G -z text -endif - -EFLAGS += -I .. -EFLAGS += -pz .. - -# make debug=true to compile Erlang module with debug informations. -ifdef debug - EFLAGS+=+debug_info -endif - -ERLSHLIBS = ../ejabberd_zlib_drv.so -OUTDIR = .. -SOURCES = $(wildcard *.erl) -BEAMS = $(addprefix $(OUTDIR)/,$(SOURCES:.erl=.beam)) - -all: $(BEAMS) $(ERLSHLIBS) - -$(OUTDIR)/%.beam: %.erl - @ERLC@ -W $(EFLAGS) -o $(OUTDIR) $< - -#all: $(ERLSHLIBS) -# erl -s make all report "{outdir, \"..\"}" -noinput -s erlang halt - -$(ERLSHLIBS): ../%.so: %.c - $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) \ - $(subst ../,,$(subst .so,.c,$@)) \ - $(LIBS) \ - $(ZLIB_LIBS) \ - $(ZLIB_CFLAGS) \ - $(ERLANG_LIBS) \ - $(ERLANG_CFLAGS) \ - -o $@ \ - $(DYNAMIC_LIB_CFLAGS) - -clean: - rm -f $(BEAMS) $(ERLSHLIBS) - -distclean: clean - rm -f Makefile - -TAGS: - etags *.erl diff --git a/src/ejabberd_zlib/Makefile.win32 b/src/ejabberd_zlib/Makefile.win32 deleted file mode 100644 index 0041df83c..000000000 --- a/src/ejabberd_zlib/Makefile.win32 +++ /dev/null @@ -1,36 +0,0 @@ - -include ..\Makefile.inc - -EFLAGS = -I .. -pz .. - -OUTDIR = .. -BEAMS = ..\ejabberd_zlib.beam - -SOURCE = ejabberd_zlib_drv.c -OBJECT = ejabberd_zlib_drv.o -DLL = $(OUTDIR)\ejabberd_zlib_drv.dll - -ALL : $(DLL) $(BEAMS) - -CLEAN : - -@erase $(DLL) - -@erase $(OUTDIR)\ejabberd_zlib_drv.exp - -@erase $(OUTDIR)\ejabberd_zlib_drv.lib - -@erase $(OBJECT) - -@erase $(BEAMS) - -$(OUTDIR)\ejabberd_zlib.beam : ejabberd_zlib.erl - erlc -W $(EFLAGS) -o $(OUTDIR) ejabberd_zlib.erl - -CC=cl.exe -CC_FLAGS=-nologo -D__WIN32__ -DWIN32 -DWINDOWS -D_WIN32 -DNT -MD -Ox -I"$(ERLANG_DIR)\usr\include" -I"$(EI_DIR)\include" -I"$(ZLIB_DIR)\include" - -LD=link.exe -LD_FLAGS=-release -nologo -incremental:no -dll "$(EI_DIR)\lib\ei_md.lib" "$(EI_DIR)\lib\erl_interface_md.lib" "$(ZLIB_LIB)" MSVCRT.LIB kernel32.lib advapi32.lib gdi32.lib user32.lib comctl32.lib comdlg32.lib shell32.lib - -$(DLL) : $(OBJECT) - $(LD) $(LD_FLAGS) -out:$@ $< - -$(OBJECT) : $(SOURCE) - $(CC) $(CC_FLAGS) -c -Fo$@ $< - diff --git a/src/ejabberd_zlib/ejabberd_zlib.erl b/src/ejabberd_zlib/ejabberd_zlib.erl deleted file mode 100644 index 3dee8d687..000000000 --- a/src/ejabberd_zlib/ejabberd_zlib.erl +++ /dev/null @@ -1,208 +0,0 @@ -%%%---------------------------------------------------------------------- -%%% File : ejabberd_zlib.erl -%%% Author : Alexey Shchepin -%%% Purpose : Interface to zlib -%%% Created : 19 Jan 2006 by Alexey Shchepin -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2013 ProcessOne -%%% -%%% 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 -%%% -%%%---------------------------------------------------------------------- - --module(ejabberd_zlib). - --author('alexey@process-one.net'). - --behaviour(gen_server). - --export([start/0, start_link/0, enable_zlib/2, - disable_zlib/1, send/2, recv/2, recv/3, recv_data/2, - setopts/2, sockname/1, peername/1, get_sockmod/1, - controlling_process/2, close/1]). - -%% Internal exports, call-back functions. --export([init/1, handle_call/3, handle_cast/2, - handle_info/2, code_change/3, terminate/2]). - --define(DEFLATE, 1). - --define(INFLATE, 2). - --record(zlibsock, {sockmod :: atom(), - socket :: inet:socket(), - zlibport :: port()}). - --type zlib_socket() :: #zlibsock{}. - --export_type([zlib_socket/0]). - -start() -> - gen_server:start({local, ?MODULE}, ?MODULE, [], []). - -start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], - []). - -init([]) -> - case erl_ddll:load_driver(ejabberd:get_so_path(), - ejabberd_zlib_drv) - of - ok -> ok; - {error, already_loaded} -> ok - end, - Port = open_port({spawn, "ejabberd_zlib_drv"}, - [binary]), - {ok, Port}. - -%%% -------------------------------------------------------- -%%% The call-back functions. -%%% -------------------------------------------------------- - -handle_call(_, _, State) -> {noreply, State}. - -handle_cast(_, State) -> {noreply, State}. - -handle_info({'EXIT', Port, Reason}, Port) -> - {stop, {port_died, Reason}, Port}; -handle_info({'EXIT', _Pid, _Reason}, Port) -> - {noreply, Port}; -handle_info(_, State) -> {noreply, State}. - -code_change(_OldVsn, State, _Extra) -> {ok, State}. - -terminate(_Reason, Port) -> Port ! {self, close}, ok. - --spec enable_zlib(atom(), inet:socket()) -> {ok, zlib_socket()}. - -enable_zlib(SockMod, Socket) -> - case erl_ddll:load_driver(ejabberd:get_so_path(), - ejabberd_zlib_drv) - of - ok -> ok; - {error, already_loaded} -> ok - end, - Port = open_port({spawn, "ejabberd_zlib_drv"}, - [binary]), - {ok, - #zlibsock{sockmod = SockMod, socket = Socket, - zlibport = Port}}. - --spec disable_zlib(zlib_socket()) -> {atom(), inet:socket()}. - -disable_zlib(#zlibsock{sockmod = SockMod, - socket = Socket, zlibport = Port}) -> - port_close(Port), {SockMod, Socket}. - --spec recv(zlib_socket(), number()) -> {ok, binary()} | {error, any()}. - -recv(Socket, Length) -> recv(Socket, Length, infinity). - --spec recv(zlib_socket(), number(), timeout()) -> {ok, binary()} | - {error, any()}. - -recv(#zlibsock{sockmod = SockMod, socket = Socket} = - ZlibSock, - Length, Timeout) -> - case SockMod:recv(Socket, Length, Timeout) of - {ok, Packet} -> recv_data(ZlibSock, Packet); - {error, _Reason} = Error -> Error - end. - --spec recv_data(zlib_socket(), iodata()) -> {ok, binary()} | {error, any()}. - -recv_data(#zlibsock{sockmod = SockMod, - socket = Socket} = - ZlibSock, - Packet) -> - case SockMod of - gen_tcp -> recv_data2(ZlibSock, Packet); - _ -> - case SockMod:recv_data(Socket, Packet) of - {ok, Packet2} -> recv_data2(ZlibSock, Packet2); - Error -> Error - end - end. - -recv_data2(ZlibSock, Packet) -> - case catch recv_data1(ZlibSock, Packet) of - {'EXIT', Reason} -> {error, Reason}; - Res -> Res - end. - -recv_data1(#zlibsock{zlibport = Port} = _ZlibSock, - Packet) -> - case port_control(Port, ?INFLATE, Packet) of - <<0, In/binary>> -> {ok, In}; - <<1, Error/binary>> -> {error, (Error)} - end. - --spec send(zlib_socket(), iodata()) -> ok | {error, binary() | inet:posix()}. - -send(#zlibsock{sockmod = SockMod, socket = Socket, - zlibport = Port}, - Packet) -> - case port_control(Port, ?DEFLATE, Packet) of - <<0, Out/binary>> -> SockMod:send(Socket, Out); - <<1, Error/binary>> -> {error, (Error)} - end. - --spec setopts(zlib_socket(), list()) -> ok | {error, inet:posix()}. - -setopts(#zlibsock{sockmod = SockMod, socket = Socket}, - Opts) -> - case SockMod of - gen_tcp -> inet:setopts(Socket, Opts); - _ -> SockMod:setopts(Socket, Opts) - end. - --spec sockname(zlib_socket()) -> {ok, {inet:ip_address(), inet:port_number()}} | - {error, inet:posix()}. - -sockname(#zlibsock{sockmod = SockMod, - socket = Socket}) -> - case SockMod of - gen_tcp -> inet:sockname(Socket); - _ -> SockMod:sockname(Socket) - end. - --spec get_sockmod(zlib_socket()) -> atom(). - -get_sockmod(#zlibsock{sockmod = SockMod}) -> SockMod. - --spec peername(zlib_socket()) -> {ok, {inet:ip_address(), inet:port_number()}} | - {error, inet:posix()}. - -peername(#zlibsock{sockmod = SockMod, - socket = Socket}) -> - case SockMod of - gen_tcp -> inet:peername(Socket); - _ -> SockMod:peername(Socket) - end. - --spec controlling_process(zlib_socket(), pid()) -> ok | {error, atom()}. - -controlling_process(#zlibsock{sockmod = SockMod, - socket = Socket}, - Pid) -> - SockMod:controlling_process(Socket, Pid). - --spec close(zlib_socket()) -> true. - -close(#zlibsock{sockmod = SockMod, socket = Socket, - zlibport = Port}) -> - SockMod:close(Socket), port_close(Port). diff --git a/src/ejabberd_zlib/ejabberd_zlib_drv.c b/src/ejabberd_zlib/ejabberd_zlib_drv.c deleted file mode 100644 index ea1cc74ca..000000000 --- a/src/ejabberd_zlib/ejabberd_zlib_drv.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - * ejabberd, Copyright (C) 2002-2013 ProcessOne - * - * 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 - * - */ - -#include -#include -#include -#include - -/* - * R15B changed several driver callbacks to use ErlDrvSizeT and - * ErlDrvSSizeT typedefs instead of int. - * This provides missing typedefs on older OTP versions. - */ -#if ERL_DRV_EXTENDED_MAJOR_VERSION < 2 -typedef int ErlDrvSizeT; -typedef int ErlDrvSSizeT; -#endif - -#define BUF_SIZE 1024 - -typedef struct { - ErlDrvPort port; - z_stream *d_stream; - z_stream *i_stream; -} ejabberd_zlib_data; - -static void* zlib_alloc(void* data, unsigned int items, unsigned int size) -{ - return (void*) driver_alloc(items*size); -} - -static void zlib_free(void* data, void* addr) -{ - driver_free(addr); -} - -static ErlDrvData ejabberd_zlib_drv_start(ErlDrvPort port, char *buff) -{ - ejabberd_zlib_data *d = - (ejabberd_zlib_data *)driver_alloc(sizeof(ejabberd_zlib_data)); - d->port = port; - - d->d_stream = (z_stream *)driver_alloc(sizeof(z_stream)); - - d->d_stream->zalloc = zlib_alloc; - d->d_stream->zfree = zlib_free; - d->d_stream->opaque = (voidpf)0; - - deflateInit(d->d_stream, Z_DEFAULT_COMPRESSION); - - d->i_stream = (z_stream *)driver_alloc(sizeof(z_stream)); - - d->i_stream->zalloc = zlib_alloc; - d->i_stream->zfree = zlib_free; - d->i_stream->opaque = (voidpf)0; - - inflateInit(d->i_stream); - - set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY); - - return (ErlDrvData)d; -} - -static void ejabberd_zlib_drv_stop(ErlDrvData handle) -{ - ejabberd_zlib_data *d = (ejabberd_zlib_data *)handle; - - deflateEnd(d->d_stream); - driver_free(d->d_stream); - - inflateEnd(d->i_stream); - driver_free(d->i_stream); - - driver_free((char *)handle); -} - - -#define DEFLATE 1 -#define INFLATE 2 - -#define die_unless(cond, errstr) \ - if (!(cond)) \ - { \ - rlen = strlen(errstr) + 1; \ - b = driver_realloc_binary(b, rlen); \ - b->orig_bytes[0] = 1; \ - strncpy(b->orig_bytes + 1, errstr, rlen - 1); \ - *rbuf = (char *)b; \ - return rlen; \ - } - - -static ErlDrvSSizeT ejabberd_zlib_drv_control(ErlDrvData handle, - unsigned int command, - char *buf, ErlDrvSizeT len, - char **rbuf, ErlDrvSizeT rlen) -{ - ejabberd_zlib_data *d = (ejabberd_zlib_data *)handle; - int err; - int size; - ErlDrvBinary *b; - - switch (command) - { - case DEFLATE: - size = BUF_SIZE + 1; - rlen = 1; - b = driver_alloc_binary(size); - b->orig_bytes[0] = 0; - - d->d_stream->next_in = (unsigned char *)buf; - d->d_stream->avail_in = len; - d->d_stream->avail_out = 0; - err = Z_OK; - - while (err == Z_OK && d->d_stream->avail_out == 0) - { - d->d_stream->next_out = (unsigned char *)b->orig_bytes + rlen; - d->d_stream->avail_out = BUF_SIZE; - - err = deflate(d->d_stream, Z_SYNC_FLUSH); - die_unless((err == Z_OK) || (err == Z_STREAM_END), - "Deflate error"); - - rlen += (BUF_SIZE - d->d_stream->avail_out); - size += (BUF_SIZE - d->d_stream->avail_out); - b = driver_realloc_binary(b, size); - } - b = driver_realloc_binary(b, rlen); - *rbuf = (char *)b; - return rlen; - case INFLATE: - size = BUF_SIZE + 1; - rlen = 1; - b = driver_alloc_binary(size); - b->orig_bytes[0] = 0; - - if (len > 0) { - d->i_stream->next_in = (unsigned char *)buf; - d->i_stream->avail_in = len; - d->i_stream->avail_out = 0; - err = Z_OK; - - while (err == Z_OK && d->i_stream->avail_out == 0) - { - d->i_stream->next_out = (unsigned char *)b->orig_bytes + rlen; - d->i_stream->avail_out = BUF_SIZE; - - err = inflate(d->i_stream, Z_SYNC_FLUSH); - die_unless((err == Z_OK) || (err == Z_STREAM_END), - "Inflate error"); - - rlen += (BUF_SIZE - d->i_stream->avail_out); - size += (BUF_SIZE - d->i_stream->avail_out); - b = driver_realloc_binary(b, size); - } - } - b = driver_realloc_binary(b, rlen); - *rbuf = (char *)b; - return rlen; - } - - b = driver_alloc_binary(1); - b->orig_bytes[0] = 0; - *rbuf = (char *)b; - return 1; -} - - -ErlDrvEntry ejabberd_zlib_driver_entry = { - NULL, /* F_PTR init, N/A */ - ejabberd_zlib_drv_start, /* L_PTR start, called when port is opened */ - ejabberd_zlib_drv_stop, /* F_PTR stop, called when port is closed */ - NULL, /* F_PTR output, called when erlang has sent */ - NULL, /* F_PTR ready_input, called when input descriptor ready */ - NULL, /* F_PTR ready_output, called when output descriptor ready */ - "ejabberd_zlib_drv", /* char *driver_name, the argument to open_port */ - NULL, /* F_PTR finish, called when unloaded */ - NULL, /* handle */ - ejabberd_zlib_drv_control, /* F_PTR control, port_command callback */ - NULL, /* F_PTR timeout, reserved */ - NULL, /* F_PTR outputv, reserved */ - /* Added in Erlang/OTP R15B: */ - NULL, /* ready_async */ - NULL, /* flush */ - NULL, /* call */ - NULL, /* event */ - ERL_DRV_EXTENDED_MARKER, /* extended_marker */ - ERL_DRV_EXTENDED_MAJOR_VERSION, /* major_version */ - ERL_DRV_EXTENDED_MINOR_VERSION, /* minor_version */ - 0, /* driver_flags */ - NULL, /* handle2 */ - NULL, /* process_exit */ - NULL /* stop_select */ -}; - -DRIVER_INIT(ejabberd_zlib_drv) /* must match name in driver_entry */ -{ - return &ejabberd_zlib_driver_entry; -} - - diff --git a/src/eldap/eldap.erl b/src/eldap.erl similarity index 99% rename from src/eldap/eldap.erl rename to src/eldap.erl index e1a18af3b..d894b55e1 100644 --- a/src/eldap/eldap.erl +++ b/src/eldap.erl @@ -66,6 +66,7 @@ -behaviour(gen_fsm). -include("ejabberd.hrl"). +-include("logger.hrl"). %% External exports -export([start_link/1, start_link/6]). diff --git a/src/eldap/Makefile.in b/src/eldap/Makefile.in deleted file mode 100644 index a44bee595..000000000 --- a/src/eldap/Makefile.in +++ /dev/null @@ -1,59 +0,0 @@ -# $Id: Makefile.in 2842 2009-12-29 19:10:52Z badlop $ - -CC = @CC@ -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ - -ASN_FLAGS = -bber_bin +optimize +binary_strings - -ERLANG_CFLAGS = @ERLANG_CFLAGS@ -ERLANG_LIBS = @ERLANG_LIBS@ - -EFLAGS += @ERLANG_SSLVER@ -EFLAGS += -I .. -EFLAGS += -pz .. - -# make debug=true to compile Erlang module with debug informations. -ifdef debug - EFLAGS+=+debug_info -endif - -OUTDIR = .. -SOURCES = $(wildcard *.erl) ELDAPv3.erl eldap_filter_yecc.erl -BEAMS = $(addprefix $(OUTDIR)/,$(SOURCES:.erl=.beam)) - - -all: $(BEAMS) ELDAPv3.beam eldap_filter_yecc.beam - -ELDAPv3.beam: ELDAPv3.erl - -ELDAPv3.erl: ELDAPv3.asn - @ERLC@ $(ASN_FLAGS) -W $(EFLAGS) $< - @ERL@ -noinput +B -eval \ - 'case file:read_file("ELDAPv3.erl") of {ok, Data} -> NewData = re:replace(Data, "\\?RT_BER:decode_octet_string", "eldap_utils:decode_octet_string", [global]), file:write_file("ELDAPv3.erl", NewData), halt(0); _Err -> halt(1) end' - -eldap_filter_yecc.beam: eldap_filter_yecc.erl - -eldap_filter_yecc.erl: eldap_filter_yecc.yrl - @ERLC@ -W $< - -$(OUTDIR)/%.beam: %.erl ELDAPv3.erl eldap_filter_yecc.erl - @ERLC@ -W $(EFLAGS) -o $(OUTDIR) $< - -clean: - rm -f ELDAPv3.asn1db - rm -f ELDAPv3.erl - rm -f ELDAPv3.hrl - rm -f ELDAPv3.beam - rm -f eldap_filter_yecc.erl - rm -f eldap_filter_yecc.beam - rm -f $(BEAMS) - -distclean: clean - rm -f Makefile - -TAGS: - etags *.erl - diff --git a/src/eldap/Makefile.win32 b/src/eldap/Makefile.win32 deleted file mode 100644 index 394055d41..000000000 --- a/src/eldap/Makefile.win32 +++ /dev/null @@ -1,44 +0,0 @@ - -include ..\Makefile.inc - -EFLAGS = -I .. -pz .. - -OUTDIR = .. -BEAMS = ..\eldap.beam ..\eldap_filter.beam ..\eldap_pool.beam ..\eldap_utils.beam ..\eldap_filter_yecc.beam - -ASN_FLAGS = -bber_bin +optimize - -ALL : $(BEAMS) - -Clean : - -@erase ELDAPv3.asn1db - -@erase ELDAPv3.erl - -@erase ELDAPv3.hrl - -@erase ELDAPv3.beam - -@erase eldap_filter_yecc.erl - -@erase eldap_filter_yecc.beam - -@erase $(BEAMS) - -ELDAPv3.erl : ELDAPv3.asn - erlc $(ASN_FLAGS) -W $(EFLAGS) ELDAPv3.asn - -eldap_filter_yecc.erl: eldap_filter_yecc.yrl - erlc -W eldap_filter_yecc.yrl - -$(OUTDIR)\eldap.beam : eldap.erl ELDAPv3.erl - erlc -W $(EFLAGS) -o $(OUTDIR) eldap.erl - -$(OUTDIR)\ELDAPv3.beam : ELDAPv3.erl - erlc -W $(EFLAGS) -o $(OUTDIR) ELDAPv3.erl - -$(OUTDIR)\eldap_filter.beam : eldap_filter.erl - erlc -W $(EFLAGS) -o $(OUTDIR) eldap_filter.erl - -$(OUTDIR)\eldap_utils.beam : eldap_utils.erl - erlc -W $(EFLAGS) -o $(OUTDIR) eldap_utils.erl - -$(OUTDIR)\eldap_pool.beam : eldap_pool.erl - erlc -W $(EFLAGS) -o $(OUTDIR) eldap_pool.erl - -$(OUTDIR)\eldap_filter_yecc.beam : eldap_filter_yecc.erl - erlc -W $(EFLAGS) -o $(OUTDIR) eldap_filter_yecc.erl diff --git a/src/eldap/eldap_filter.erl b/src/eldap_filter.erl similarity index 100% rename from src/eldap/eldap_filter.erl rename to src/eldap_filter.erl diff --git a/src/eldap/eldap_filter_yecc.yrl b/src/eldap_filter_yecc.yrl similarity index 100% rename from src/eldap/eldap_filter_yecc.yrl rename to src/eldap_filter_yecc.yrl diff --git a/src/eldap/eldap_pool.erl b/src/eldap_pool.erl similarity index 99% rename from src/eldap/eldap_pool.erl rename to src/eldap_pool.erl index c189fb1e8..361d473ab 100644 --- a/src/eldap/eldap_pool.erl +++ b/src/eldap_pool.erl @@ -33,6 +33,7 @@ modify_passwd/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). bind(PoolName, DN, Passwd) -> do_request(PoolName, {bind, [DN, Passwd]}). diff --git a/src/eldap/eldap_utils.erl b/src/eldap_utils.erl similarity index 99% rename from src/eldap/eldap_utils.erl rename to src/eldap_utils.erl index 9cae2c0a3..ec64b3aa4 100644 --- a/src/eldap/eldap_utils.erl +++ b/src/eldap_utils.erl @@ -41,6 +41,7 @@ uids_domain_subst/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("eldap.hrl"). %% Generate an 'or' LDAP query on one or several attributes diff --git a/src/extauth.erl b/src/extauth.erl index 6a7f8d7b9..0403b56b4 100644 --- a/src/extauth.erl +++ b/src/extauth.erl @@ -33,6 +33,7 @@ remove_user/3, is_user_exists/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). -define(INIT_TIMEOUT, 60000). diff --git a/src/gen_iq_handler.erl b/src/gen_iq_handler.erl index a2d33c2da..d1b107cb7 100644 --- a/src/gen_iq_handler.erl +++ b/src/gen_iq_handler.erl @@ -40,6 +40,7 @@ handle_info/2, terminate/2, code_change/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). -record(state, {host = <<"">> :: binary(), diff --git a/src/gen_mod.erl b/src/gen_mod.erl index ec8de6b09..5352533cd 100644 --- a/src/gen_mod.erl +++ b/src/gen_mod.erl @@ -38,6 +38,7 @@ %%-export([behaviour_info/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -record(ejabberd_module, {module_host = {undefined, <<"">>} :: {atom(), binary()}, diff --git a/src/mod_pubsub/gen_pubsub_node.erl b/src/gen_pubsub_node.erl similarity index 100% rename from src/mod_pubsub/gen_pubsub_node.erl rename to src/gen_pubsub_node.erl diff --git a/src/mod_pubsub/gen_pubsub_nodetree.erl b/src/gen_pubsub_nodetree.erl similarity index 100% rename from src/mod_pubsub/gen_pubsub_nodetree.erl rename to src/gen_pubsub_nodetree.erl diff --git a/src/jd2ejd.erl b/src/jd2ejd.erl index a5d2f9961..a60033998 100644 --- a/src/jd2ejd.erl +++ b/src/jd2ejd.erl @@ -32,6 +32,7 @@ -export([import_file/1, import_dir/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/log.hrl b/src/log.hrl deleted file mode 100644 index 0f025e570..000000000 --- a/src/log.hrl +++ /dev/null @@ -1,38 +0,0 @@ -%% Copyright (C) 2003 Joakim Grebenö . -%% All rights reserved. -%% -%% Redistribution and use in source and binary forms, with or without -%% modification, are permitted provided that the following conditions -%% are met: -%% -%% 1. Redistributions of source code must retain the above copyright -%% notice, this list of conditions and the following disclaimer. -%% 2. Redistributions in binary form must reproduce the above -%% copyright notice, this list of conditions and the following -%% disclaimer in the documentation and/or other materials provided -%% with the distribution. -%% -%% THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS -%% OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -%% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -%% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -%% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -%% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -%% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -%% WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -%% NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -%% SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --define(INFO_LOG(Reason), - error_logger:info_report({?MODULE, ?LINE, Reason})). - --define(ERROR_LOG(Reason), - error_logger:error_report({?MODULE, ?LINE, Reason})). - --ifdef(DEBUG). --define(DEBUG_LOG(Reason), - error_logger:info_report({debug, ?MODULE, ?LINE, Reason})). --else. --define(DEBUG_LOG(Reason), ok). --endif. diff --git a/src/mod_ack.erl b/src/mod_ack.erl index 24cc3f427..b0723bcfa 100644 --- a/src/mod_ack.erl +++ b/src/mod_ack.erl @@ -44,6 +44,7 @@ -include("jlib.hrl"). -include("ejabberd.hrl"). +-include("logger.hrl"). -define(PROCNAME, ejabberd_mod_ack). diff --git a/src/mod_adhoc.erl b/src/mod_adhoc.erl index 81329fd6a..929c216ff 100644 --- a/src/mod_adhoc.erl +++ b/src/mod_adhoc.erl @@ -37,6 +37,7 @@ ping_item/4, ping_command/4]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_admin_p1.erl b/src/mod_admin_p1.erl index 588e55d2a..69019a878 100644 --- a/src/mod_admin_p1.erl +++ b/src/mod_admin_p1.erl @@ -91,6 +91,7 @@ send_chat/3, send_message/4, send_stanza/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("ejabberd_commands.hrl"). diff --git a/src/mod_announce.erl b/src/mod_announce.erl index 293c73638..b4d3f989c 100644 --- a/src/mod_announce.erl +++ b/src/mod_announce.erl @@ -46,6 +46,7 @@ announce_items/4]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). -include("adhoc.hrl"). diff --git a/src/mod_applepush.erl b/src/mod_applepush.erl index 95f4b0a09..8134b9a55 100644 --- a/src/mod_applepush.erl +++ b/src/mod_applepush.erl @@ -35,6 +35,7 @@ -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). -include("mod_privacy.hrl"). diff --git a/src/mod_applepush_service.erl b/src/mod_applepush_service.erl index 86ec564a3..698f87c2b 100644 --- a/src/mod_applepush_service.erl +++ b/src/mod_applepush_service.erl @@ -22,6 +22,7 @@ -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). -include_lib("kernel/include/file.hrl"). diff --git a/src/mod_blocking.erl b/src/mod_blocking.erl index e52c29511..bb0341f37 100644 --- a/src/mod_blocking.erl +++ b/src/mod_blocking.erl @@ -32,6 +32,7 @@ process_iq_set/4, process_iq_get/5]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/web/mod_bosh.erl b/src/mod_bosh.erl similarity index 99% rename from src/web/mod_bosh.erl rename to src/mod_bosh.erl index be58e32d1..c173f2416 100644 --- a/src/web/mod_bosh.erl +++ b/src/mod_bosh.erl @@ -38,6 +38,7 @@ migrate/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_c2s_debug.erl b/src/mod_c2s_debug.erl index 9da40e7ab..4cfbf6440 100644 --- a/src/mod_c2s_debug.erl +++ b/src/mod_c2s_debug.erl @@ -26,6 +26,7 @@ handle_info/2, terminate/2, code_change/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_caps.erl b/src/mod_caps.erl index 3575ef597..23af4a0ea 100644 --- a/src/mod_caps.erl +++ b/src/mod_caps.erl @@ -50,6 +50,7 @@ c2s_presence_in/2, c2s_broadcast_recipients/6]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_carboncopy.erl b/src/mod_carboncopy.erl index c48ae4646..fd1598098 100644 --- a/src/mod_carboncopy.erl +++ b/src/mod_carboncopy.erl @@ -47,6 +47,7 @@ -define(NS_FORWARD, <<"urn:xmpp:forward:0">>). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). -define(PROCNAME, ?MODULE). -define(TABLE, carboncopy). diff --git a/src/mod_configure.erl b/src/mod_configure.erl index 74c56c02a..1a755c20b 100644 --- a/src/mod_configure.erl +++ b/src/mod_configure.erl @@ -40,6 +40,7 @@ adhoc_sm_items/4, adhoc_sm_commands/4]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_configure2.erl b/src/mod_configure2.erl index 366538632..c4d482d02 100644 --- a/src/mod_configure2.erl +++ b/src/mod_configure2.erl @@ -33,6 +33,7 @@ -export([start/2, stop/1, process_local_iq/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_disco.erl b/src/mod_disco.erl index c883e0782..d62251686 100644 --- a/src/mod_disco.erl +++ b/src/mod_disco.erl @@ -39,6 +39,7 @@ register_extra_domain/2, unregister_extra_domain/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_echo.erl b/src/mod_echo.erl index 14d99de4b..f10df45de 100644 --- a/src/mod_echo.erl +++ b/src/mod_echo.erl @@ -41,6 +41,7 @@ handle_info/2, terminate/2, code_change/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/web/mod_http_bind.erl b/src/mod_http_bind.erl similarity index 99% rename from src/web/mod_http_bind.erl rename to src/mod_http_bind.erl index 8ea8f6781..a302bf5a3 100644 --- a/src/web/mod_http_bind.erl +++ b/src/mod_http_bind.erl @@ -41,6 +41,7 @@ -export([start/2, stop/1, process/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/web/mod_http_bindjson.erl b/src/mod_http_bindjson.erl similarity index 99% rename from src/web/mod_http_bindjson.erl rename to src/mod_http_bindjson.erl index 8ff21d012..94bec7605 100644 --- a/src/web/mod_http_bindjson.erl +++ b/src/mod_http_bindjson.erl @@ -43,6 +43,7 @@ -export([start/2, stop/1, process/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/web/mod_http_fileserver.erl b/src/mod_http_fileserver.erl similarity index 99% rename from src/web/mod_http_fileserver.erl rename to src/mod_http_fileserver.erl index f0f8e0f0d..300bb26eb 100644 --- a/src/web/mod_http_fileserver.erl +++ b/src/mod_http_fileserver.erl @@ -39,6 +39,7 @@ -export([process/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/web/mod_http_fileserver_log.erl b/src/mod_http_fileserver_log.erl similarity index 99% rename from src/web/mod_http_fileserver_log.erl rename to src/mod_http_fileserver_log.erl index 8f634f487..6ceb37ef4 100644 --- a/src/web/mod_http_fileserver_log.erl +++ b/src/mod_http_fileserver_log.erl @@ -9,6 +9,7 @@ reopen_log/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_ip_blacklist.erl b/src/mod_ip_blacklist.erl index 0759db94a..9477451c0 100644 --- a/src/mod_ip_blacklist.erl +++ b/src/mod_ip_blacklist.erl @@ -41,6 +41,7 @@ -export([is_ip_in_c2s_blacklist/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). -define(PROCNAME, ?MODULE). diff --git a/src/mod_irc/mod_irc.erl b/src/mod_irc.erl similarity index 99% rename from src/mod_irc/mod_irc.erl rename to src/mod_irc.erl index a90302f6b..dbaeff9d0 100644 --- a/src/mod_irc/mod_irc.erl +++ b/src/mod_irc.erl @@ -41,6 +41,7 @@ handle_info/2, terminate/2, code_change/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_irc/Makefile.in b/src/mod_irc/Makefile.in deleted file mode 100644 index 9dcf9f182..000000000 --- a/src/mod_irc/Makefile.in +++ /dev/null @@ -1,60 +0,0 @@ -# $Id$ - -CC = @CC@ -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ @LIBICONV@ - -ERLANG_CFLAGS = @ERLANG_CFLAGS@ -ERLANG_LIBS = @ERLANG_LIBS@ - -# Assume Linux-style dynamic library flags -DYNAMIC_LIB_CFLAGS = -fpic -shared -ifeq ($(shell uname),Darwin) - DYNAMIC_LIB_CFLAGS = -fPIC -bundle -flat_namespace -undefined suppress -endif -ifeq ($(shell uname),SunOs) - DYNAMIC_LIB_CFLAGS = -KPIC -G -z text -endif - - -EFLAGS += -I .. -EFLAGS += -pz .. - -# make debug=true to compile Erlang module with debug informations. -ifdef debug - EFLAGS+=+debug_info -endif - -ERLSHLIBS = ../iconv_erl.so -OUTDIR = .. -SOURCES = $(wildcard *.erl) -BEAMS = $(addprefix $(OUTDIR)/,$(SOURCES:.erl=.beam)) - -all: $(BEAMS) $(ERLSHLIBS) - -$(OUTDIR)/%.beam: %.erl - @ERLC@ -W $(EFLAGS) -o $(OUTDIR) $< - -#all: $(ERLSHLIBS) -# erl -s make all report "{outdir, \"..\"}" -noinput -s erlang halt - -$(ERLSHLIBS): ../%.so: %.c - $(CC) $(INCLUDES) $(CFLAGS) $(LDFLAGS) \ - $(subst ../,,$(subst .so,.c,$@)) \ - $(LIBS) \ - $(ERLANG_CFLAGS) \ - $(ERLANG_LIBS) \ - -o $@ \ - $(DYNAMIC_LIB_CFLAGS) - -clean: - rm -f $(BEAMS) $(ERLSHLIBS) - -distclean: clean - rm -f Makefile - -TAGS: - etags *.erl - diff --git a/src/mod_irc/Makefile.win32 b/src/mod_irc/Makefile.win32 deleted file mode 100644 index fb0671104..000000000 --- a/src/mod_irc/Makefile.win32 +++ /dev/null @@ -1,42 +0,0 @@ - -include ..\Makefile.inc - -EFLAGS = -I .. -pz .. - -OUTDIR = .. -BEAMS = ..\iconv.beam ..\mod_irc.beam ..\mod_irc_connection.beam - -SOURCE = iconv_erl.c -OBJECT = iconv_erl.o -DLL = $(OUTDIR)\iconv_erl.dll - -ALL : $(DLL) $(BEAMS) - -CLEAN : - -@erase $(DLL) - -@erase $(OUTDIR)\iconv_erl.exp - -@erase $(OUTDIR)\iconv_erl.lib - -@erase $(OBJECT) - -@erase $(BEAMS) - -$(OUTDIR)\iconv.beam : iconv.erl - erlc -W $(EFLAGS) -o $(OUTDIR) iconv.erl - -$(OUTDIR)\mod_irc.beam : mod_irc.erl - erlc -W $(EFLAGS) -o $(OUTDIR) mod_irc.erl - -$(OUTDIR)\mod_irc_connection.beam : mod_irc_connection.erl - erlc -W $(EFLAGS) -o $(OUTDIR) mod_irc_connection.erl - -CC=cl.exe -CC_FLAGS=-nologo -D__WIN32__ -DWIN32 -DWINDOWS -D_WIN32 -DNT -MD -Ox -I"$(ERLANG_DIR)\usr\include" -I"$(EI_DIR)\include" -I"$(ICONV_DIR)\include" - -LD=link.exe -LD_FLAGS=-release -nologo -incremental:no -dll "$(EI_DIR)\lib\ei_md.lib" "$(EI_DIR)\lib\erl_interface_md.lib" "$(ICONV_LIB)" MSVCRT.LIB kernel32.lib advapi32.lib gdi32.lib user32.lib comctl32.lib comdlg32.lib shell32.lib - -$(DLL) : $(OBJECT) - $(LD) $(LD_FLAGS) -out:$@ $< - -$(OBJECT) : $(SOURCE) - $(CC) $(CC_FLAGS) -c -Fo$@ $< - diff --git a/src/mod_irc/iconv.erl b/src/mod_irc/iconv.erl deleted file mode 100644 index 511097c62..000000000 --- a/src/mod_irc/iconv.erl +++ /dev/null @@ -1,82 +0,0 @@ -%%%---------------------------------------------------------------------- -%%% File : iconv.erl -%%% Author : Alexey Shchepin -%%% Purpose : Interface to libiconv -%%% Created : 16 Feb 2003 by Alexey Shchepin -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2013 ProcessOne -%%% -%%% 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 -%%% -%%%---------------------------------------------------------------------- - --module(iconv). - --author('alexey@process-one.net'). - --behaviour(gen_server). - --export([start/0, start_link/0, convert/3]). - -%% Internal exports, call-back functions. --export([init/1, handle_call/3, handle_cast/2, - handle_info/2, code_change/3, terminate/2]). - -start() -> - gen_server:start({local, ?MODULE}, ?MODULE, [], []). - -start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], - []). - -init([]) -> - case erl_ddll:load_driver(ejabberd:get_so_path(), - iconv_erl) - of - ok -> ok; - {error, already_loaded} -> ok - end, - Port = open_port({spawn, "iconv_erl"}, []), - ets:new(iconv_table, [set, public, named_table]), - ets:insert(iconv_table, {port, Port}), - {ok, Port}. - -%%% -------------------------------------------------------- -%%% The call-back functions. -%%% -------------------------------------------------------- - -handle_call(_, _, State) -> {noreply, State}. - -handle_cast(_, State) -> {noreply, State}. - -handle_info({'EXIT', Port, Reason}, Port) -> - {stop, {port_died, Reason}, Port}; -handle_info({'EXIT', _Pid, _Reason}, Port) -> - {noreply, Port}; -handle_info(_, State) -> {noreply, State}. - -code_change(_OldVsn, State, _Extra) -> {ok, State}. - -terminate(_Reason, Port) -> Port ! {self, close}, ok. - --spec convert(binary(), binary(), binary()) -> binary(). - -convert(From, To, String) -> - [{port, Port} | _] = ets:lookup(iconv_table, port), - Bin = term_to_binary({binary_to_list(From), binary_to_list(To), binary_to_list(String)}), - BRes = port_control(Port, 1, Bin), - (BRes). diff --git a/src/mod_irc/iconv_erl.c b/src/mod_irc/iconv_erl.c deleted file mode 100644 index 20d9389a8..000000000 --- a/src/mod_irc/iconv_erl.c +++ /dev/null @@ -1,177 +0,0 @@ -/* - * ejabberd, Copyright (C) 2002-2013 ProcessOne - * - * 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 - * - */ - -#include -#include -#include -#include -#include - -/* - * R15B changed several driver callbacks to use ErlDrvSizeT and - * ErlDrvSSizeT typedefs instead of int. - * This provides missing typedefs on older OTP versions. - */ -#if ERL_DRV_EXTENDED_MAJOR_VERSION < 2 -typedef int ErlDrvSizeT; -typedef int ErlDrvSSizeT; -#endif - -typedef struct { - ErlDrvPort port; - iconv_t cd; -} iconv_data; - - -static ErlDrvData iconv_erl_start(ErlDrvPort port, char *buff) -{ - iconv_data* d = (iconv_data*)driver_alloc(sizeof(iconv_data)); - d->port = port; - d->cd = NULL; - - set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY); - - return (ErlDrvData)d; -} - -static void iconv_erl_stop(ErlDrvData handle) -{ - driver_free((char*)handle); -} - -static ErlDrvSSizeT iconv_erl_control(ErlDrvData drv_data, - unsigned int command, - char *buf, ErlDrvSizeT len, - char **rbuf, ErlDrvSizeT rlen) -{ - int i; - int size; - int index = 0; - int avail; - size_t inleft, outleft; - ErlDrvBinary *b; - char *from, *to, *string, *stmp, *rstring, *rtmp; - iconv_t cd; - int invalid_utf8_as_latin1 = 0; - - ei_decode_version(buf, &index, &i); - ei_decode_tuple_header(buf, &index, &i); - ei_get_type(buf, &index, &i, &size); - from = driver_alloc(size + 1); - ei_decode_string(buf, &index, from); - - ei_get_type(buf, &index, &i, &size); - to = driver_alloc(size + 1); - ei_decode_string(buf, &index, to); - - ei_get_type(buf, &index, &i, &size); - stmp = string = driver_alloc(size + 1); - ei_decode_string(buf, &index, string); - - /* Special mode: parse as UTF-8 if possible; otherwise assume it's - Latin-1. Makes no difference when encoding. */ - if (strcmp(from, "utf-8+latin-1") == 0) { - from[5] = '\0'; - invalid_utf8_as_latin1 = 1; - } - if (strcmp(to, "utf-8+latin-1") == 0) { - to[5] = '\0'; - } - cd = iconv_open(to, from); - - if (cd == (iconv_t) -1) { - cd = iconv_open("ascii", "ascii"); - if (cd == (iconv_t) -1) { - *rbuf = (char*)(b = driver_alloc_binary(size)); - memcpy(b->orig_bytes, string, size); - - driver_free(from); - driver_free(to); - driver_free(string); - - return size; - } - } - - outleft = avail = 4*size; - inleft = size; - rtmp = rstring = driver_alloc(avail); - while (inleft > 0) { - if (iconv(cd, &stmp, &inleft, &rtmp, &outleft) == (size_t) -1) { - if (invalid_utf8_as_latin1 && (*stmp & 0x80) && outleft >= 2) { - /* Encode one byte of (assumed) Latin-1 into two bytes of UTF-8 */ - *rtmp++ = 0xc0 | ((*stmp & 0xc0) >> 6); - *rtmp++ = 0x80 | (*stmp & 0x3f); - outleft -= 2; - } - stmp++; - inleft--; - } - } - - size = rtmp - rstring; - - *rbuf = (char*)(b = driver_alloc_binary(size)); - memcpy(b->orig_bytes, rstring, size); - - driver_free(from); - driver_free(to); - driver_free(string); - driver_free(rstring); - iconv_close(cd); - - return size; -} - - - -ErlDrvEntry iconv_driver_entry = { - NULL, /* F_PTR init, N/A */ - iconv_erl_start, /* L_PTR start, called when port is opened */ - iconv_erl_stop, /* F_PTR stop, called when port is closed */ - NULL, /* F_PTR output, called when erlang has sent */ - NULL, /* F_PTR ready_input, called when input descriptor ready */ - NULL, /* F_PTR ready_output, called when output descriptor ready */ - "iconv_erl", /* char *driver_name, the argument to open_port */ - NULL, /* F_PTR finish, called when unloaded */ - NULL, /* handle */ - iconv_erl_control, /* F_PTR control, port_command callback */ - NULL, /* F_PTR timeout, reserved */ - NULL, /* F_PTR outputv, reserved */ - /* Added in Erlang/OTP R15B: */ - NULL, /* ready_async */ - NULL, /* flush */ - NULL, /* call */ - NULL, /* event */ - ERL_DRV_EXTENDED_MARKER, /* extended_marker */ - ERL_DRV_EXTENDED_MAJOR_VERSION, /* major_version */ - ERL_DRV_EXTENDED_MINOR_VERSION, /* minor_version */ - 0, /* driver_flags */ - NULL, /* handle2 */ - NULL, /* process_exit */ - NULL /* stop_select */ -}; - -DRIVER_INIT(iconv_erl) /* must match name in driver_entry */ -{ - return &iconv_driver_entry; -} - - diff --git a/src/mod_irc/mod_irc_connection.erl b/src/mod_irc_connection.erl similarity index 99% rename from src/mod_irc/mod_irc_connection.erl rename to src/mod_irc_connection.erl index 324a9ee45..5b9d98b80 100644 --- a/src/mod_irc/mod_irc_connection.erl +++ b/src/mod_irc_connection.erl @@ -41,6 +41,7 @@ code_change/4]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_last.erl b/src/mod_last.erl index 06ed0ca03..15831e991 100644 --- a/src/mod_last.erl +++ b/src/mod_last.erl @@ -35,6 +35,7 @@ store_last_info/4, get_last_info/2, remove_user/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_mnesia_mngt.erl b/src/mod_mnesia_mngt.erl index f7aa962a6..c64e9004a 100644 --- a/src/mod_mnesia_mngt.erl +++ b/src/mod_mnesia_mngt.erl @@ -20,6 +20,7 @@ handle_info/2, terminate/2, code_change/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_muc/mod_muc.erl b/src/mod_muc.erl similarity index 99% rename from src/mod_muc/mod_muc.erl rename to src/mod_muc.erl index df83d6723..5521d5e93 100644 --- a/src/mod_muc/mod_muc.erl +++ b/src/mod_muc.erl @@ -46,6 +46,7 @@ handle_info/2, terminate/2, code_change/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_muc/Makefile.in b/src/mod_muc/Makefile.in deleted file mode 100644 index 5ede5e521..000000000 --- a/src/mod_muc/Makefile.in +++ /dev/null @@ -1,42 +0,0 @@ -# $Id$ - -CC = @CC@ -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ - -ERLANG_CFLAGS = @ERLANG_CFLAGS@ -ERLANG_LIBS = @ERLANG_LIBS@ - -EFLAGS += -I .. -EFLAGS += -pz .. - -# make debug=true to compile Erlang module with debug informations. -ifdef debug - EFLAGS+=+debug_info -endif - -ifeq (@transient_supervisors@, false) - EFLAGS+=-DNO_TRANSIENT_SUPERVISORS -endif - -OUTDIR = .. -SOURCES = $(wildcard *.erl) -BEAMS = $(addprefix $(OUTDIR)/,$(SOURCES:.erl=.beam)) - - -all: $(BEAMS) - -$(OUTDIR)/%.beam: %.erl - @ERLC@ -W $(EFLAGS) -o $(OUTDIR) $< - -clean: - rm -f $(BEAMS) - -distclean: clean - rm -f Makefile - -TAGS: - etags *.erl - diff --git a/src/mod_muc/Makefile.win32 b/src/mod_muc/Makefile.win32 deleted file mode 100644 index 5107b1069..000000000 --- a/src/mod_muc/Makefile.win32 +++ /dev/null @@ -1,21 +0,0 @@ - -include ..\Makefile.inc - -EFLAGS = -I .. -pz .. - -OUTDIR = .. -BEAMS = ..\mod_muc.beam ..\mod_muc_log.beam ..\mod_muc_room.beam - -ALL : $(BEAMS) - -CLEAN : - -@erase $(BEAMS) - -$(OUTDIR)\mod_muc.beam : mod_muc.erl - erlc -W $(EFLAGS) -o $(OUTDIR) mod_muc.erl - -$(OUTDIR)\mod_muc_log.beam : mod_muc_log.erl - erlc -W $(EFLAGS) -o $(OUTDIR) mod_muc_log.erl - -$(OUTDIR)\mod_muc_room.beam : mod_muc_room.erl - erlc -W $(EFLAGS) -o $(OUTDIR) mod_muc_room.erl diff --git a/src/mod_muc/mod_muc_log.erl b/src/mod_muc_log.erl similarity index 99% rename from src/mod_muc/mod_muc_log.erl rename to src/mod_muc_log.erl index 4640bbab4..3ef273802 100644 --- a/src/mod_muc/mod_muc_log.erl +++ b/src/mod_muc_log.erl @@ -41,6 +41,7 @@ handle_info/2, terminate/2, code_change/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc_room.erl similarity index 99% rename from src/mod_muc/mod_muc_room.erl rename to src/mod_muc_room.erl index afb773aa2..9621e29fb 100644 --- a/src/mod_muc/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -43,6 +43,7 @@ print_state/1, code_change/4]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_multicast.erl b/src/mod_multicast.erl index 566628feb..9aaa252f9 100644 --- a/src/mod_multicast.erl +++ b/src/mod_multicast.erl @@ -24,6 +24,7 @@ -export([purge_loop/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_offline.erl b/src/mod_offline.erl index 7028c5eff..a1aa81b7a 100644 --- a/src/mod_offline.erl +++ b/src/mod_offline.erl @@ -40,12 +40,13 @@ export/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). --include("web/ejabberd_http.hrl"). +-include("ejabberd_http.hrl"). --include("web/ejabberd_web_admin.hrl"). +-include("ejabberd_web_admin.hrl"). -record(offline_msg, {us = {<<"">>, <<"">>} :: {binary(), binary()}, diff --git a/src/mod_ping.erl b/src/mod_ping.erl index 1e8af5ecf..3501053d2 100644 --- a/src/mod_ping.erl +++ b/src/mod_ping.erl @@ -33,6 +33,7 @@ -behavior(gen_server). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_pres_counter.erl b/src/mod_pres_counter.erl index 9246f8d55..30f5308c0 100644 --- a/src/mod_pres_counter.erl +++ b/src/mod_pres_counter.erl @@ -31,6 +31,7 @@ -export([start/2, stop/1, check_packet/6]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_privacy.erl b/src/mod_privacy.erl index dc488ddab..7cf7f5d04 100644 --- a/src/mod_privacy.erl +++ b/src/mod_privacy.erl @@ -47,6 +47,7 @@ sql_set_privacy_list/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_private.erl b/src/mod_private.erl index 7d21d119d..13336c565 100644 --- a/src/mod_private.erl +++ b/src/mod_private.erl @@ -34,6 +34,7 @@ remove_user/2, get_data/2, export/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_proxy65/mod_proxy65.erl b/src/mod_proxy65.erl similarity index 100% rename from src/mod_proxy65/mod_proxy65.erl rename to src/mod_proxy65.erl diff --git a/src/mod_proxy65/Makefile.in b/src/mod_proxy65/Makefile.in deleted file mode 100644 index 3fc94c662..000000000 --- a/src/mod_proxy65/Makefile.in +++ /dev/null @@ -1,38 +0,0 @@ -# $Id$ - -CC = @CC@ -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ - -ERLANG_CFLAGS = @ERLANG_CFLAGS@ -ERLANG_LIBS = @ERLANG_LIBS@ - -EFLAGS += -I .. -EFLAGS += -pz .. - -# make debug=true to compile Erlang module with debug informations. -ifdef debug - EFLAGS+=+debug_info -endif - -OUTDIR = .. -SOURCES = $(wildcard *.erl) -BEAMS = $(addprefix $(OUTDIR)/,$(SOURCES:.erl=.beam)) - - -all: $(BEAMS) - -$(OUTDIR)/%.beam: %.erl - @ERLC@ -W $(EFLAGS) -o $(OUTDIR) $< - -clean: - rm -f $(BEAMS) - -distclean: clean - rm -f Makefile - -TAGS: - etags *.erl - diff --git a/src/mod_proxy65/Makefile.win32 b/src/mod_proxy65/Makefile.win32 deleted file mode 100644 index 7683097d3..000000000 --- a/src/mod_proxy65/Makefile.win32 +++ /dev/null @@ -1,27 +0,0 @@ - -include ..\Makefile.inc - -EFLAGS = -I .. -pz .. - -OUTDIR = .. -BEAMS = ..\mod_proxy65.beam ..\mod_proxy65_lib.beam ..\mod_proxy65_service.beam ..\mod_proxy65_sm.beam ..\mod_proxy65_stream.beam - -ALL : $(BEAMS) - -CLEAN : - -@erase $(BEAMS) - -$(OUTDIR)\mod_proxy65.beam : mod_proxy65.erl - erlc -W $(EFLAGS) -o $(OUTDIR) mod_proxy65.erl - -$(OUTDIR)\mod_proxy65_service.beam : mod_proxy65_service.erl - erlc -W $(EFLAGS) -o $(OUTDIR) mod_proxy65_service.erl - -$(OUTDIR)\mod_proxy65_sm.beam : mod_proxy65_sm.erl - erlc -W $(EFLAGS) -o $(OUTDIR) mod_proxy65_sm.erl - -$(OUTDIR)\mod_proxy65_stream.beam : mod_proxy65_stream.erl - erlc -W $(EFLAGS) -o $(OUTDIR) mod_proxy65_stream.erl - -$(OUTDIR)\mod_proxy65_lib.beam : mod_proxy65_lib.erl - erlc -W $(EFLAGS) -o $(OUTDIR) mod_proxy65_lib.erl diff --git a/src/mod_proxy65/mod_proxy65_lib.erl b/src/mod_proxy65_lib.erl similarity index 100% rename from src/mod_proxy65/mod_proxy65_lib.erl rename to src/mod_proxy65_lib.erl diff --git a/src/mod_proxy65/mod_proxy65_service.erl b/src/mod_proxy65_service.erl similarity index 99% rename from src/mod_proxy65/mod_proxy65_service.erl rename to src/mod_proxy65_service.erl index f7e047947..dde53d94e 100644 --- a/src/mod_proxy65/mod_proxy65_service.erl +++ b/src/mod_proxy65_service.erl @@ -39,6 +39,7 @@ delete_listener/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_proxy65/mod_proxy65_sm.erl b/src/mod_proxy65_sm.erl similarity index 100% rename from src/mod_proxy65/mod_proxy65_sm.erl rename to src/mod_proxy65_sm.erl diff --git a/src/mod_proxy65/mod_proxy65_stream.erl b/src/mod_proxy65_stream.erl similarity index 99% rename from src/mod_proxy65/mod_proxy65_stream.erl rename to src/mod_proxy65_stream.erl index 805317834..b2e03e709 100644 --- a/src/mod_proxy65/mod_proxy65_stream.erl +++ b/src/mod_proxy65_stream.erl @@ -45,6 +45,7 @@ -include("mod_proxy65.hrl"). -include("ejabberd.hrl"). +-include("logger.hrl"). -define(WAIT_TIMEOUT, 60000). diff --git a/src/mod_pubsub/mod_pubsub.erl b/src/mod_pubsub.erl similarity index 99% rename from src/mod_pubsub/mod_pubsub.erl rename to src/mod_pubsub.erl index dc798707e..c25cfac91 100644 --- a/src/mod_pubsub/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -52,6 +52,7 @@ -behaviour(gen_mod). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("adhoc.hrl"). diff --git a/src/mod_pubsub/Makefile.in b/src/mod_pubsub/Makefile.in deleted file mode 100644 index 88bf2ba0c..000000000 --- a/src/mod_pubsub/Makefile.in +++ /dev/null @@ -1,46 +0,0 @@ -# $Id$ - -CC = @CC@ -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ - -ERLANG_CFLAGS = @ERLANG_CFLAGS@ -ERLANG_LIBS = @ERLANG_LIBS@ - -EFLAGS += -I .. -EFLAGS += -pz .. - -# make debug=true to compile Erlang module with debug informations. -ifdef debug - EFLAGS+=+debug_info -endif - -OUTDIR = .. -ERLBEHAVS = gen_pubsub_node.erl gen_pubsub_nodetree.erl -SOURCES_ALL = $(wildcard *.erl) -SOURCES = $(filter-out $(ERLBEHAVS),$(SOURCES_ALL)) -ERLBEHAVBEAMS = $(addprefix $(OUTDIR)/,$(ERLBEHAVS:.erl=.beam)) -BEAMS = $(addprefix $(OUTDIR)/,$(SOURCES:.erl=.beam)) - - -all: mod_pubsub_odbc.erl $(ERLBEHAVBEAMS) $(BEAMS) - -$(BEAMS): $(ERLBEHAVBEAMS) - -$(OUTDIR)/%.beam: %.erl - @ERLC@ -W $(EFLAGS) -o $(OUTDIR) $< - -clean: - rm -f $(BEAMS) - -distclean: clean - rm -f Makefile - -mod_pubsub_odbc.erl: - patch -o mod_pubsub_odbc.erl mod_pubsub.erl pubsub_odbc.patch - -TAGS: - etags *.erl - diff --git a/src/mod_pubsub/Makefile.win32 b/src/mod_pubsub/Makefile.win32 deleted file mode 100644 index 8308f242a..000000000 --- a/src/mod_pubsub/Makefile.win32 +++ /dev/null @@ -1,87 +0,0 @@ - -include ..\Makefile.inc - -EFLAGS = -I .. -pz .. - -OUTDIR = .. -BEAMS = ..\gen_pubsub_node.beam ..\gen_pubsub_nodetree.beam ..\mod_pubsub.beam ..\mod_pubsub_odbc.beam ..\node_buddy.beam ..\node_club.beam ..\node_dag.beam ..\node_dispatch.beam ..\node_flat.beam ..\node_flat_odbc.beam ..\node_hometree.beam ..\node_hometree_odbc.beam ..\node_mb.beam ..\node_pep.beam ..\node_pep_odbc.beam ..\node_private.beam ..\node_public.beam ..\nodetree_dag.beam ..\nodetree_tree.beam ..\nodetree_tree_odbc.beam ..\nodetree_virtual.beam ..\pubsub_db_odbc.beam ..\pubsub_index.beam ..\pubsub_subscription.beam ..\pubsub_subscription_odbc.beam - -ALL : $(BEAMS) - -CLEAN : - -@erase $(BEAMS) - -$(OUTDIR)\gen_pubsub_node.beam : gen_pubsub_node.erl - erlc -W $(EFLAGS) -o $(OUTDIR) gen_pubsub_node.erl - -$(OUTDIR)\gen_pubsub_nodetree.beam : gen_pubsub_nodetree.erl - erlc -W $(EFLAGS) -o $(OUTDIR) gen_pubsub_nodetree.erl - -$(OUTDIR)\mod_pubsub.beam : mod_pubsub.erl - erlc -W $(EFLAGS) -o $(OUTDIR) mod_pubsub.erl - -$(OUTDIR)\mod_pubsub_odbc.beam : mod_pubsub_odbc.erl - erlc -W $(EFLAGS) -o $(OUTDIR) mod_pubsub_odbc.erl - -$(OUTDIR)\node_buddy.beam : node_buddy.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_buddy.erl - -$(OUTDIR)\node_club.beam : node_club.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_club.erl - -$(OUTDIR)\node_dag.beam : node_dag.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_dag.erl - -$(OUTDIR)\node_dispatch.beam : node_dispatch.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_dispatch.erl - -$(OUTDIR)\node_flat.beam : node_flat.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_flat.erl - -$(OUTDIR)\node_flat_odbc.beam : node_flat_odbc.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_flat_odbc.erl - -$(OUTDIR)\node_hometree.beam : node_hometree.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_hometree.erl - -$(OUTDIR)\node_hometree_odbc.beam : node_hometree_odbc.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_hometree_odbc.erl - -$(OUTDIR)\node_mb.beam : node_mb.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_mb.erl - -$(OUTDIR)\node_pep.beam : node_pep.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_pep.erl - -$(OUTDIR)\node_pep_odbc.beam : node_pep_odbc.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_pep_odbc.erl - -$(OUTDIR)\node_private.beam : node_private.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_private.erl - -$(OUTDIR)\node_public.beam : node_public.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_public.erl - -$(OUTDIR)\nodetree_dag.beam : nodetree_dag.erl - erlc -W $(EFLAGS) -o $(OUTDIR) nodetree_dag.erl - -$(OUTDIR)\nodetree_tree.beam : nodetree_tree.erl - erlc -W $(EFLAGS) -o $(OUTDIR) nodetree_tree.erl - -$(OUTDIR)\nodetree_tree_odbc.beam : nodetree_tree_odbc.erl - erlc -W $(EFLAGS) -o $(OUTDIR) nodetree_tree_odbc.erl - -$(OUTDIR)\nodetree_virtual.beam : nodetree_virtual.erl - erlc -W $(EFLAGS) -o $(OUTDIR) nodetree_virtual.erl - -$(OUTDIR)\pubsub_db_odbc.beam : pubsub_db_odbc.erl - erlc -W $(EFLAGS) -o $(OUTDIR) pubsub_db_odbc.erl - -$(OUTDIR)\pubsub_index.beam : pubsub_index.erl - erlc -W $(EFLAGS) -o $(OUTDIR) pubsub_index.erl - -$(OUTDIR)\pubsub_subscription.beam : pubsub_subscription.erl - erlc -W $(EFLAGS) -o $(OUTDIR) pubsub_subscription.erl - -$(OUTDIR)\pubsub_subscription_odbc.beam : pubsub_subscription_odbc.erl - erlc -W $(EFLAGS) -o $(OUTDIR) pubsub_subscription_odbc.erl diff --git a/src/mod_pubsub/mod_pubsub_odbc.erl b/src/mod_pubsub_odbc.erl similarity index 99% rename from src/mod_pubsub/mod_pubsub_odbc.erl rename to src/mod_pubsub_odbc.erl index 956272a90..2197606ef 100644 --- a/src/mod_pubsub/mod_pubsub_odbc.erl +++ b/src/mod_pubsub_odbc.erl @@ -52,6 +52,7 @@ -behaviour(gen_mod). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("adhoc.hrl"). diff --git a/src/mod_register.erl b/src/mod_register.erl index 55b2b2e82..ec5ebfa36 100644 --- a/src/mod_register.erl +++ b/src/mod_register.erl @@ -35,6 +35,7 @@ process_iq/3, send_registration_notifications/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/web/mod_register_web.erl b/src/mod_register_web.erl similarity index 99% rename from src/web/mod_register_web.erl rename to src/mod_register_web.erl index ad9473825..605ded360 100644 --- a/src/web/mod_register_web.erl +++ b/src/mod_register_web.erl @@ -59,6 +59,7 @@ -export([start/2, stop/1, process/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_roster.erl b/src/mod_roster.erl index 487dca58e..f72112009 100644 --- a/src/mod_roster.erl +++ b/src/mod_roster.erl @@ -50,14 +50,15 @@ record_to_string/1, groups_to_string/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). -include("mod_roster.hrl"). --include("web/ejabberd_http.hrl"). +-include("ejabberd_http.hrl"). --include("web/ejabberd_web_admin.hrl"). +-include("ejabberd_web_admin.hrl"). -export_type([subscription/0]). diff --git a/src/mod_service_log.erl b/src/mod_service_log.erl index 35e01cde5..b20e93bb1 100644 --- a/src/mod_service_log.erl +++ b/src/mod_service_log.erl @@ -34,6 +34,7 @@ log_user_receive/5]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl index 01f8cd8e3..021ad31d3 100644 --- a/src/mod_shared_roster.erl +++ b/src/mod_shared_roster.erl @@ -46,14 +46,15 @@ command_list_users/2, command_list_groups/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). -include("mod_roster.hrl"). --include("web/ejabberd_http.hrl"). +-include("ejabberd_http.hrl"). --include("web/ejabberd_web_admin.hrl"). +-include("ejabberd_web_admin.hrl"). -include("ejabberd_commands.hrl"). diff --git a/src/mod_shared_roster_ldap.erl b/src/mod_shared_roster_ldap.erl index c4b3c2f06..95b33fa91 100644 --- a/src/mod_shared_roster_ldap.erl +++ b/src/mod_shared_roster_ldap.erl @@ -43,10 +43,11 @@ out_subscription/4]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). -include("mod_roster.hrl"). --include("eldap/eldap.hrl"). +-include("eldap.hrl"). -define(CACHE_SIZE, 1000). diff --git a/src/mod_sic.erl b/src/mod_sic.erl index fbaa165e8..b1ae44d04 100644 --- a/src/mod_sic.erl +++ b/src/mod_sic.erl @@ -34,6 +34,7 @@ process_sm_iq/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_stats.erl b/src/mod_stats.erl index f988626fd..a35928975 100644 --- a/src/mod_stats.erl +++ b/src/mod_stats.erl @@ -33,6 +33,7 @@ -export([start/2, stop/1, process_local_iq/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). start(Host, Opts) -> diff --git a/src/mod_time.erl b/src/mod_time.erl index e97616a6e..0e18d7efe 100644 --- a/src/mod_time.erl +++ b/src/mod_time.erl @@ -36,6 +36,7 @@ % TODO: Remove once XEP-0090 is Obsolete -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_vcard.erl b/src/mod_vcard.erl index 78e9db2b9..877080bc3 100644 --- a/src/mod_vcard.erl +++ b/src/mod_vcard.erl @@ -35,6 +35,7 @@ remove_user/2, export/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_vcard_ldap.erl b/src/mod_vcard_ldap.erl index be9bc7c53..7711353d2 100644 --- a/src/mod_vcard_ldap.erl +++ b/src/mod_vcard_ldap.erl @@ -41,8 +41,9 @@ remove_user/1, route/4]). -include("ejabberd.hrl"). +-include("logger.hrl"). --include("eldap/eldap.hrl"). +-include("eldap.hrl"). -include("jlib.hrl"). diff --git a/src/mod_vcard_xupdate.erl b/src/mod_vcard_xupdate.erl index 3fbe23155..7d06a15a5 100644 --- a/src/mod_vcard_xupdate.erl +++ b/src/mod_vcard_xupdate.erl @@ -16,6 +16,7 @@ -export([update_presence/3, vcard_set/3, export/1]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_version.erl b/src/mod_version.erl index 088961a6b..a36f62889 100644 --- a/src/mod_version.erl +++ b/src/mod_version.erl @@ -33,6 +33,7 @@ -export([start/2, stop/1, process_local_iq/3]). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). diff --git a/src/mod_pubsub/node.template b/src/node.template similarity index 100% rename from src/mod_pubsub/node.template rename to src/node.template diff --git a/src/mod_pubsub/node_buddy.erl b/src/node_buddy.erl similarity index 100% rename from src/mod_pubsub/node_buddy.erl rename to src/node_buddy.erl diff --git a/src/mod_pubsub/node_club.erl b/src/node_club.erl similarity index 100% rename from src/mod_pubsub/node_club.erl rename to src/node_club.erl diff --git a/src/mod_pubsub/node_dag.erl b/src/node_dag.erl similarity index 100% rename from src/mod_pubsub/node_dag.erl rename to src/node_dag.erl diff --git a/src/mod_pubsub/node_dispatch.erl b/src/node_dispatch.erl similarity index 100% rename from src/mod_pubsub/node_dispatch.erl rename to src/node_dispatch.erl diff --git a/src/mod_pubsub/node_flat.erl b/src/node_flat.erl similarity index 100% rename from src/mod_pubsub/node_flat.erl rename to src/node_flat.erl diff --git a/src/mod_pubsub/node_flat_odbc.erl b/src/node_flat_odbc.erl similarity index 100% rename from src/mod_pubsub/node_flat_odbc.erl rename to src/node_flat_odbc.erl diff --git a/src/mod_pubsub/node_hometree.erl b/src/node_hometree.erl similarity index 100% rename from src/mod_pubsub/node_hometree.erl rename to src/node_hometree.erl diff --git a/src/mod_pubsub/node_hometree_odbc.erl b/src/node_hometree_odbc.erl similarity index 100% rename from src/mod_pubsub/node_hometree_odbc.erl rename to src/node_hometree_odbc.erl diff --git a/src/mod_pubsub/node_mb.erl b/src/node_mb.erl similarity index 99% rename from src/mod_pubsub/node_mb.erl rename to src/node_mb.erl index 528974b3d..8f74d9837 100644 --- a/src/mod_pubsub/node_mb.erl +++ b/src/node_mb.erl @@ -37,6 +37,7 @@ -author('eric@ohmforce.com'). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("pubsub.hrl"). diff --git a/src/mod_pubsub/node_pep.erl b/src/node_pep.erl similarity index 99% rename from src/mod_pubsub/node_pep.erl rename to src/node_pep.erl index d8e69d246..f347aa1b6 100644 --- a/src/mod_pubsub/node_pep.erl +++ b/src/node_pep.erl @@ -31,6 +31,7 @@ -author('christophe.romain@process-one.net'). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("pubsub.hrl"). diff --git a/src/mod_pubsub/node_pep_odbc.erl b/src/node_pep_odbc.erl similarity index 99% rename from src/mod_pubsub/node_pep_odbc.erl rename to src/node_pep_odbc.erl index 029635cc9..dcbaeae3d 100644 --- a/src/mod_pubsub/node_pep_odbc.erl +++ b/src/node_pep_odbc.erl @@ -31,6 +31,7 @@ -author('christophe.romain@process-one.net'). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("pubsub.hrl"). diff --git a/src/mod_pubsub/node_private.erl b/src/node_private.erl similarity index 100% rename from src/mod_pubsub/node_private.erl rename to src/node_private.erl diff --git a/src/mod_pubsub/node_public.erl b/src/node_public.erl similarity index 100% rename from src/mod_pubsub/node_public.erl rename to src/node_public.erl diff --git a/src/mod_pubsub/nodetree_dag.erl b/src/nodetree_dag.erl similarity index 99% rename from src/mod_pubsub/nodetree_dag.erl rename to src/nodetree_dag.erl index 7123df5c2..03dc71259 100644 --- a/src/mod_pubsub/nodetree_dag.erl +++ b/src/nodetree_dag.erl @@ -29,6 +29,7 @@ -include_lib("stdlib/include/qlc.hrl"). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("pubsub.hrl"). diff --git a/src/mod_pubsub/nodetree_tree.erl b/src/nodetree_tree.erl similarity index 100% rename from src/mod_pubsub/nodetree_tree.erl rename to src/nodetree_tree.erl diff --git a/src/mod_pubsub/nodetree_tree_odbc.erl b/src/nodetree_tree_odbc.erl similarity index 100% rename from src/mod_pubsub/nodetree_tree_odbc.erl rename to src/nodetree_tree_odbc.erl diff --git a/src/mod_pubsub/nodetree_virtual.erl b/src/nodetree_virtual.erl similarity index 100% rename from src/mod_pubsub/nodetree_virtual.erl rename to src/nodetree_virtual.erl diff --git a/src/odbc/Makefile.in b/src/odbc/Makefile.in deleted file mode 100644 index 3f4898d3a..000000000 --- a/src/odbc/Makefile.in +++ /dev/null @@ -1,38 +0,0 @@ -# $Id$ - -CC = @CC@ -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ - -ERLANG_CFLAGS = @ERLANG_CFLAGS@ -ERLANG_LIBS = @ERLANG_LIBS@ - -EFLAGS += -I .. -EFLAGS += -pz .. - -# make debug=true to compile Erlang module with debug informations. -ifdef debug - EFLAGS+=+debug_info -endif - -OUTDIR = .. -SOURCES = $(wildcard *.erl) -BEAMS = $(addprefix $(OUTDIR)/,$(SOURCES:.erl=.beam)) - - -all: $(BEAMS) - -$(OUTDIR)/%.beam: %.erl - @ERLC@ -W $(EFLAGS) -D@db_type@ -o $(OUTDIR) $< - -clean: - rm -f $(BEAMS) - -distclean: clean - rm -f Makefile - -TAGS: - etags *.erl - diff --git a/src/odbc/Makefile.win32 b/src/odbc/Makefile.win32 deleted file mode 100644 index 2775468b7..000000000 --- a/src/odbc/Makefile.win32 +++ /dev/null @@ -1,22 +0,0 @@ - -include ..\Makefile.inc - -EFLAGS = -I .. -pz .. - -OUTDIR = .. -BEAMS = ..\ejabberd_odbc.beam ..\ejabberd_odbc_sup.beam ..\odbc_queries.beam - -ALL : $(BEAMS) - -CLEAN : - -@erase $(BEAMS) - -$(OUTDIR)\ejabberd_odbc.beam : ejabberd_odbc.erl - erlc -W $(EFLAGS) -o $(OUTDIR) ejabberd_odbc.erl - -$(OUTDIR)\ejabberd_odbc_sup.beam : ejabberd_odbc_sup.erl - erlc -W $(EFLAGS) -o $(OUTDIR) ejabberd_odbc_sup.erl - -$(OUTDIR)\odbc_queries.beam : odbc_queries.erl - erlc -W $(EFLAGS) -o $(OUTDIR) -D$(DBTYPE) odbc_queries.erl - diff --git a/src/odbc/odbc_queries.erl b/src/odbc_queries.erl similarity index 99% rename from src/odbc/odbc_queries.erl rename to src/odbc_queries.erl index b29d054aa..7c92d9a0c 100644 --- a/src/odbc/odbc_queries.erl +++ b/src/odbc_queries.erl @@ -67,6 +67,7 @@ -endif. -include("ejabberd.hrl"). +-include("logger.hrl"). join([], _Sep) -> []; join([H | T], Sep) -> [H, [[Sep, X] || X <- T]]. diff --git a/src/pam/Makefile.in b/src/pam/Makefile.in deleted file mode 100644 index bde289402..000000000 --- a/src/pam/Makefile.in +++ /dev/null @@ -1,47 +0,0 @@ -# $Id: Makefile.in 775 2007-05-29 14:31:12Z mremond $ - -CC = @CC@ -CFLAGS = @CFLAGS@ @PAM_CFLAGS@ -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ @PAM_LIBS@ - -ERLANG_CFLAGS = @ERLANG_CFLAGS@ -ERLANG_LIBS = @ERLANG_LIBS@ - -EFLAGS += -I .. -EFLAGS += -pz .. - -# make debug=true to compile Erlang module with debug informations. -ifdef debug - EFLAGS+=+debug_info -endif - -ERLSHLIBS = ../epam -OUTDIR = .. -SOURCES = $(wildcard *.erl) -BEAMS = $(addprefix $(OUTDIR)/,$(SOURCES:.erl=.beam)) - - -all: $(BEAMS) $(ERLSHLIBS) - -$(OUTDIR)/%.beam: %.erl - @ERLC@ -W $(EFLAGS) -o $(OUTDIR) $< - -#all: $(ERLSHLIBS) -# erl -s make all report "{outdir, \"..\"}" -noinput -s erlang halt - -$(ERLSHLIBS): ../%: %.c - $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) \ - $(subst ../,,$(subst ,.c,$@)) $(LIBS) \ - $(ERLANG_LIBS) $(ERLANG_CFLAGS) \ - -o $@ -lpthread - -clean: - rm -f $(BEAMS) $(ERLSHLIBS) - -distclean: clean - rm -f Makefile - -TAGS: - etags *.erl diff --git a/src/pam/epam.c b/src/pam/epam.c deleted file mode 100644 index 505e308cf..000000000 --- a/src/pam/epam.c +++ /dev/null @@ -1,273 +0,0 @@ -/* - * ejabberd, Copyright (C) 2002-2013 ProcessOne - * - * 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 - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#define dec_int16(s) ((((unsigned char*) (s))[0] << 8) | \ - (((unsigned char*) (s))[1])) - -#define enc_int16(i, s) {((unsigned char*)(s))[0] = ((i) >> 8) & 0xff; \ - ((unsigned char*)(s))[1] = (i) & 0xff;} - -#define BUFSIZE (1 << 16) -#define CMD_AUTH 0 -#define CMD_ACCT 1 - -typedef unsigned char byte; - -#ifdef PAM_FAIL_DELAY -static void delay_fn(int retval, unsigned usec_delay, void *appdata_ptr) -{ - /* No delay. However, looks like some PAM modules ignore this */ -} -#endif - -static int misc_conv(int num_msg, - const struct pam_message **msg, - struct pam_response **resp, - void *password) -{ - int msg_style; - if (num_msg != 1) - return PAM_CONV_ERR; - msg_style = msg[0]->msg_style; - if ((msg_style != PAM_PROMPT_ECHO_OFF) && (msg_style != PAM_PROMPT_ECHO_ON)) - return PAM_CONV_ERR; - *resp = malloc(sizeof(struct pam_response)); - (*resp)[0].resp_retcode = 0; - (*resp)[0].resp = strdup(password); - return PAM_SUCCESS; -} - -static int auth(char *service, char *user, char *password) -{ - struct pam_conv conv = {misc_conv, password}; - int retval; - pam_handle_t *pamh = NULL; - retval = pam_start(service, user, &conv, &pamh); - if (retval == PAM_SUCCESS) - retval = pam_set_item(pamh, PAM_RUSER, user); -#ifdef PAM_FAIL_DELAY - if (retval == PAM_SUCCESS) - retval = pam_set_item(pamh, PAM_FAIL_DELAY, (void *)delay_fn); -#endif - if (retval == PAM_SUCCESS) - retval = pam_authenticate(pamh, 0); - if (retval == PAM_SUCCESS) - retval = pam_acct_mgmt(pamh, 0); - pam_end(pamh, retval); - return retval; -} - -static int acct_mgmt(char *service, char *user) -{ - struct pam_conv conv = {misc_conv, NULL}; - int retval; - pam_handle_t *pamh = NULL; - retval = pam_start(service, user, &conv, &pamh); - if (retval == PAM_SUCCESS) - retval = pam_set_item(pamh, PAM_RUSER, user); -#ifdef PAM_FAIL_DELAY - if (retval == PAM_SUCCESS) - retval = pam_set_item(pamh, PAM_FAIL_DELAY, (void *)delay_fn); -#endif - if (retval == PAM_SUCCESS) - retval = pam_acct_mgmt(pamh, 0); - pam_end(pamh, retval); - return retval; -} - -static int read_buf(int fd, byte *buf, int len) -{ - int i, got = 0; - do { - if ((i = read(fd, buf+got, len-got)) <= 0) { - if (i == 0) return got; - if (errno != EINTR) - return got; - i = 0; - } - got += i; - } while (got < len); - return (len); -} - -static int read_cmd(byte *buf) -{ - int len; - if (read_buf(0, buf, 2) != 2) - return 0; - len = dec_int16(buf); - if (read_buf(0, buf, len) != len) - return 0; - return 1; -} - -static int write_buf(int fd, char *buf, int len) -{ - int i, done = 0; - do { - if ((i = write(fd, buf+done, len-done)) < 0) { - if (errno != EINTR) - return (i); - i = 0; - } - done += i; - } while (done < len); - return (len); -} - -static int write_cmd(char *buf, int len) -{ - byte hd[2]; - enc_int16(len, hd); - if (write_buf(1, (char *)hd, 2) != 2) - return 0; - if (write_buf(1, buf, len) != len) - return 0; - return 1; -} - -static int process_reply(ETERM *pid, int cmd, int res) -{ - ETERM *result; - ETERM *errbin; - int len, retval; - const char *errtxt; - byte *buf; - if (res == PAM_SUCCESS) - result = erl_format("{~i, ~w, true}", cmd, pid); - else - { - errtxt = pam_strerror(NULL, res); - errbin = erl_mk_binary(errtxt, strlen(errtxt)); - result = erl_format("{~i, ~w, {false, ~w}}", cmd, pid, errbin); - erl_free_term(errbin); - } - len = erl_term_len(result); - buf = erl_malloc(len); - erl_encode(result, buf); - retval = write_cmd((char *)buf, len); - erl_free_term(result); - erl_free(buf); - return retval; -} - -static int process_acct(ETERM *pid, ETERM *data) -{ - int retval = 0; - ETERM *pattern, *srv, *user; - char *service, *username; - pattern = erl_format("{Srv, User}"); - if (erl_match(pattern, data)) - { - srv = erl_var_content(pattern, "Srv"); - service = erl_iolist_to_string(srv); - user = erl_var_content(pattern, "User"); - username = erl_iolist_to_string(user); - retval = process_reply(pid, CMD_ACCT, acct_mgmt(service, username)); - erl_free_term(srv); - erl_free_term(user); - erl_free(service); - erl_free(username); - } - erl_free_term(pattern); - return retval; -} - -static int process_auth(ETERM *pid, ETERM *data) -{ - int retval = 0; - ETERM *pattern, *srv, *user, *pass; - char *service, *username, *password; - pattern = erl_format("{Srv, User, Pass}"); - if (erl_match(pattern, data)) - { - srv = erl_var_content(pattern, "Srv"); - service = erl_iolist_to_string(srv); - user = erl_var_content(pattern, "User"); - username = erl_iolist_to_string(user); - pass = erl_var_content(pattern, "Pass"); - password = erl_iolist_to_string(pass); - retval = process_reply(pid, CMD_AUTH, auth(service, username, password)); - erl_free_term(srv); - erl_free_term(user); - erl_free_term(pass); - erl_free(service); - erl_free(username); - erl_free(password); - }; - erl_free_term(pattern); - return retval; -} - -static int process_command(byte *buf) -{ - int retval = 0; - ETERM *pattern, *tuple, *cmd, *port, *data; - pattern = erl_format("{Cmd, Port, Data}"); - tuple = erl_decode(buf); - if (erl_match(pattern, tuple)) - { - cmd = erl_var_content(pattern, "Cmd"); - port = erl_var_content(pattern, "Port"); - data = erl_var_content(pattern, "Data"); - switch (ERL_INT_VALUE(cmd)) - { - case CMD_AUTH: - retval = process_auth(port, data); - break; - case CMD_ACCT: - retval = process_acct(port, data); - break; - }; - erl_free_term(cmd); - erl_free_term(port); - erl_free_term(data); - } - erl_free_term(pattern); - erl_free_term(tuple); - return retval; -} - -static void loop(void) -{ - byte buf[BUFSIZE]; - int retval = 0; - do { - if (read_cmd(buf) > 0) - retval = process_command(buf); - else - retval = 0; - } while (retval); -} - -int main(int argc, char *argv[]) -{ - erl_init(NULL, 0); - loop(); - return 0; -} diff --git a/src/pam/epam.erl b/src/pam/epam.erl deleted file mode 100644 index 93b156b10..000000000 --- a/src/pam/epam.erl +++ /dev/null @@ -1,142 +0,0 @@ -%%%------------------------------------------------------------------- -%%% File : epam.erl -%%% Author : Evgeniy Khramtsov -%%% Purpose : PAM authentication and accounting management -%%% Created : 5 Jul 2007 by Evgeniy Khramtsov -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2013 ProcessOne -%%% -%%% 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 -%%% -%%%------------------------------------------------------------------- - --module(epam). - --author('xram@jabber.ru'). - --behaviour(gen_server). - --include_lib("kernel/include/file.hrl"). - --include("ejabberd.hrl"). - -%% API --export([start_link/0, start/0, stop/0]). - --export([authenticate/3, acct_mgmt/2]). - -%% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, - handle_info/2, terminate/2, code_change/3]). - --define(WARNING, - "File ~p is world-wide executable. This " - "is a possible security hole in your " - "system. This file must be setted root " - "on execution and only ejabberd must " - "be able to read/execute it. You have " - "been warned :)"). - --define(PROCNAME, ?MODULE). - --define(CMD_AUTH, 0). - --define(CMD_ACCT, 1). - --record(state, {port}). - -start() -> - ChildSpec = {?PROCNAME, {?MODULE, start_link, []}, - transient, 1000, worker, [?MODULE]}, - supervisor:start_child(ejabberd_sup, ChildSpec). - -stop() -> - gen_server:call(?PROCNAME, stop), - supervisor:terminate_child(ejabberd_sup, ?PROCNAME), - supervisor:delete_child(ejabberd_sup, ?PROCNAME). - -start_link() -> - gen_server:start_link({local, ?PROCNAME}, ?MODULE, [], - []). - -authenticate(Srv, User, Pass) - when is_binary(Srv), is_binary(User), is_binary(Pass) -> - gen_server:call(?PROCNAME, - {authenticate, Srv, User, Pass}). - -acct_mgmt(Srv, User) - when is_binary(Srv), is_binary(User) -> - gen_server:call(?PROCNAME, {acct_mgmt, Srv, User}). - -init([]) -> - FileName = filename:join(ejabberd:get_bin_path(), - "epam"), - case file:read_file_info(FileName) of - {ok, Info} -> - Mode = Info#file_info.mode band 2049, - if Mode == 2049 -> ?WARNING_MSG((?WARNING), [FileName]); - true -> ok - end, - Port = open_port({spawn, FileName}, - [{packet, 2}, binary, exit_status]), - {ok, #state{port = Port}}; - {error, Reason} -> - ?ERROR_MSG("Can't open file ~p: ~p", - [FileName, Reason]), - error - end. - -terminate(_Reason, #state{port = Port}) -> - catch port_close(Port), ok. - -handle_call({authenticate, Srv, User, Pass}, From, - State) -> - Port = State#state.port, - Data = term_to_binary({?CMD_AUTH, From, - {Srv, User, Pass}}), - port_command(Port, Data), - {noreply, State}; -handle_call({acct_mgmt, Srv, User}, From, State) -> - Port = State#state.port, - Data = term_to_binary({?CMD_ACCT, From, {Srv, User}}), - port_command(Port, Data), - {noreply, State}; -handle_call(stop, _From, State) -> - {stop, normal, ok, State}; -handle_call(_Request, _From, State) -> - {reply, bad_request, State}. - -handle_info({Port, {data, Data}}, - #state{port = Port} = State) -> - case binary_to_term(Data) of - {Cmd, To, Reply} - when Cmd == (?CMD_AUTH); Cmd == (?CMD_ACCT) -> - gen_server:reply(To, Reply); - Err -> - ?ERROR_MSG("Got invalid reply from ~p: ~p", [Port, Err]) - end, - {noreply, State}; -handle_info({Port, {exit_status, _}}, - #state{port = Port} = State) -> - {stop, port_died, State}; -handle_info(Msg, State) -> - ?WARNING_MSG("Got unexpected message: ~p", [Msg]), - {noreply, State}. - -handle_cast(_Msg, State) -> {noreply, State}. - -code_change(_OldVsn, State, _Extra) -> {ok, State}. diff --git a/src/web/pshb_http.erl b/src/pshb_http.erl similarity index 99% rename from src/web/pshb_http.erl rename to src/pshb_http.erl index 63f53e340..a3fab7fc2 100644 --- a/src/web/pshb_http.erl +++ b/src/pshb_http.erl @@ -41,12 +41,13 @@ -compile({no_auto_import, [{error, 1}]}). -include("ejabberd.hrl"). +-include("logger.hrl"). -include("jlib.hrl"). -include("ejabberd_http.hrl"). --include("mod_pubsub/pubsub.hrl"). +-include("pubsub.hrl"). -export([process/2]). diff --git a/src/mod_pubsub/pubsub_db_odbc.erl b/src/pubsub_db_odbc.erl similarity index 100% rename from src/mod_pubsub/pubsub_db_odbc.erl rename to src/pubsub_db_odbc.erl diff --git a/src/mod_pubsub/pubsub_debug.erl b/src/pubsub_debug.erl similarity index 100% rename from src/mod_pubsub/pubsub_debug.erl rename to src/pubsub_debug.erl diff --git a/src/mod_pubsub/pubsub_index.erl b/src/pubsub_index.erl similarity index 100% rename from src/mod_pubsub/pubsub_index.erl rename to src/pubsub_index.erl diff --git a/src/mod_pubsub/pubsub_odbc.patch b/src/pubsub_odbc.patch similarity index 100% rename from src/mod_pubsub/pubsub_odbc.patch rename to src/pubsub_odbc.patch diff --git a/src/mod_pubsub/pubsub_subscription.erl b/src/pubsub_subscription.erl similarity index 100% rename from src/mod_pubsub/pubsub_subscription.erl rename to src/pubsub_subscription.erl diff --git a/src/mod_pubsub/pubsub_subscription_odbc.erl b/src/pubsub_subscription_odbc.erl similarity index 100% rename from src/mod_pubsub/pubsub_subscription_odbc.erl rename to src/pubsub_subscription_odbc.erl diff --git a/src/sha.erl b/src/sha.erl index fd8391c25..ebe9cfce9 100644 --- a/src/sha.erl +++ b/src/sha.erl @@ -38,6 +38,7 @@ -endif. -include("ejabberd.hrl"). +-include("logger.hrl"). -define(DRIVER, sha_drv). diff --git a/src/shaper.erl b/src/shaper.erl index c86acd701..37c1a30c9 100644 --- a/src/shaper.erl +++ b/src/shaper.erl @@ -31,6 +31,7 @@ -export([new/1, new1/1, update/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). -record(maxrate, {maxrate = 0 :: integer(), lastrate = 0.0 :: float(), diff --git a/src/web/simple_ws_check.erl b/src/simple_ws_check.erl similarity index 96% rename from src/web/simple_ws_check.erl rename to src/simple_ws_check.erl index d897b1ecc..b06dbd5d7 100644 --- a/src/web/simple_ws_check.erl +++ b/src/simple_ws_check.erl @@ -3,6 +3,7 @@ -export([is_acceptable/6]). -include("ejabberd.hrl"). +-include("logger.hrl"). is_acceptable([<<"true">>] = Path, Q, Origin, Protocol, IP, Headers) -> diff --git a/src/stringprep/Makefile.in b/src/stringprep/Makefile.in deleted file mode 100644 index 7c4997d26..000000000 --- a/src/stringprep/Makefile.in +++ /dev/null @@ -1,60 +0,0 @@ -# $Id$ - -CC = @CC@ -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ - -ERLANG_CFLAGS = @ERLANG_CFLAGS@ -ERLANG_LIBS = @ERLANG_LIBS@ - -# Assume Linux-style dynamic library flags -DYNAMIC_LIB_CFLAGS = -fpic -shared -ifeq ($(shell uname),Darwin) - DYNAMIC_LIB_CFLAGS = -fPIC -bundle -flat_namespace -undefined suppress -endif -ifeq ($(shell uname),SunOs) - DYNAMIC_LIB_CFLAGS = -KPIC -G -z text -endif - - -EFLAGS += -I .. -EFLAGS += -pz .. - -# make debug=true to compile Erlang module with debug informations. -ifdef debug - EFLAGS+=+debug_info -endif - -ERLSHLIBS = ../stringprep_drv.so -OUTDIR = .. -SOURCES = $(wildcard *.erl) -BEAMS = $(addprefix $(OUTDIR)/,$(SOURCES:.erl=.beam)) - - -all: $(BEAMS) $(ERLSHLIBS) - -$(OUTDIR)/%.beam: %.erl - @ERLC@ -W $(EFLAGS) -o $(OUTDIR) $< - -#all: $(ERLSHLIBS) -# erl -s make all report "{outdir, \"..\"}" -noinput -s erlang halt - -$(ERLSHLIBS): ../%.so: %.c uni_data.c uni_norm.c - $(CC) $(CFLAGS) $(LDFLAGS) $(INCLUDES) \ - $(subst ../,,$(subst .so,.c,$@)) $(LIBS) \ - $(ERLANG_LIBS) \ - $(ERLANG_CFLAGS) \ - -o $@ \ - $(DYNAMIC_LIB_CFLAGS) - -clean: - rm -f $(BEAMS) $(ERLSHLIBS) - -distclean: clean - rm -f Makefile - -TAGS: - etags *.erl - diff --git a/src/stringprep/Makefile.win32 b/src/stringprep/Makefile.win32 deleted file mode 100644 index b044a105d..000000000 --- a/src/stringprep/Makefile.win32 +++ /dev/null @@ -1,40 +0,0 @@ - -include ..\Makefile.inc - -EFLAGS = -I .. -pz .. - -OUTDIR = .. -BEAMS = ..\stringprep.beam ..\stringprep_sup.beam - -SOURCE = stringprep_drv.c -AUXIL = uni_data.c uni_norm.c -OBJECT = stringprep_drv.o -DLL = $(OUTDIR)\stringprep_drv.dll - -ALL : $(DLL) $(BEAMS) - -CLEAN : - -@erase $(DLL) - -@erase $(OUTDIR)\stringprep_drv.exp - -@erase $(OUTDIR)\stringprep_drv.lib - -@erase $(OBJECT) - -@erase $(BEAMS) - -$(OUTDIR)\stringprep.beam : stringprep.erl - erlc -W $(EFLAGS) -o $(OUTDIR) stringprep.erl - -$(OUTDIR)\stringprep_sup.beam : stringprep_sup.erl - erlc -W $(EFLAGS) -o $(OUTDIR) stringprep_sup.erl - -CC=cl.exe -CC_FLAGS=-nologo -D__WIN32__ -DWIN32 -DWINDOWS -D_WIN32 -DNT -MD -Ox -I"$(ERLANG_DIR)\usr\include" -I"$(EI_DIR)\include" - -LD=link.exe -LD_FLAGS=-release -nologo -incremental:no -dll "$(EI_DIR)\lib\ei_md.lib" "$(EI_DIR)\lib\erl_interface_md.lib" MSVCRT.LIB kernel32.lib advapi32.lib gdi32.lib user32.lib comctl32.lib comdlg32.lib shell32.lib - -$(DLL) : $(OBJECT) - $(LD) $(LD_FLAGS) -out:$@ $< - -$(OBJECT) : $(SOURCE) $(AUXIL) - $(CC) $(CC_FLAGS) -c -Fo$@ $< - diff --git a/src/stringprep/stringprep.erl b/src/stringprep/stringprep.erl deleted file mode 100644 index f1ba20258..000000000 --- a/src/stringprep/stringprep.erl +++ /dev/null @@ -1,108 +0,0 @@ -%%%---------------------------------------------------------------------- -%%% File : stringprep.erl -%%% Author : Alexey Shchepin -%%% Purpose : Interface to stringprep_drv -%%% Created : 16 Feb 2003 by Alexey Shchepin -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2013 ProcessOne -%%% -%%% 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 -%%% -%%%---------------------------------------------------------------------- - --module(stringprep). - --author('alexey@process-one.net'). - --behaviour(gen_server). - --export([start/0, start_link/0, tolower/1, nameprep/1, - nodeprep/1, resourceprep/1]). - -%% Internal exports, call-back functions. --export([init/1, handle_call/3, handle_cast/2, - handle_info/2, code_change/3, terminate/2]). - --define(STRINGPREP_PORT, stringprep_port). - --define(NAMEPREP_COMMAND, 1). - --define(NODEPREP_COMMAND, 2). - --define(RESOURCEPREP_COMMAND, 3). - -start() -> - gen_server:start({local, ?MODULE}, ?MODULE, [], []). - -start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], - []). - -init([]) -> - case erl_ddll:load_driver(ejabberd:get_so_path(), - stringprep_drv) - of - ok -> ok; - {error, already_loaded} -> ok - end, - Port = open_port({spawn, "stringprep_drv"}, []), - register(?STRINGPREP_PORT, Port), - {ok, Port}. - -%%% -------------------------------------------------------- -%%% The call-back functions. -%%% -------------------------------------------------------- - -handle_call(_, _, State) -> {noreply, State}. - -handle_cast(_, State) -> {noreply, State}. - -handle_info({'EXIT', Port, Reason}, Port) -> - {stop, {port_died, Reason}, Port}; -handle_info({'EXIT', _Pid, _Reason}, Port) -> - {noreply, Port}; -handle_info(_, State) -> {noreply, State}. - -code_change(_OldVsn, State, _Extra) -> {ok, State}. - -terminate(_Reason, Port) -> Port ! {self, close}, ok. - --spec tolower(binary()) -> binary() | error. - -tolower(String) -> control(0, String). - --spec nameprep(binary()) -> binary() | error. - -nameprep(String) -> control(?NAMEPREP_COMMAND, String). - --spec nodeprep(binary()) -> binary() | error. - -nodeprep(String) -> control(?NODEPREP_COMMAND, String). - --spec resourceprep(binary()) -> binary() | error. - -resourceprep(String) -> - control(?RESOURCEPREP_COMMAND, String). - -control(Command, String) -> - case port_control(?STRINGPREP_PORT, Command, String) of - <<0, _/binary>> -> error; - <<1, Res/binary>> -> binary:copy(Res) - %% Result is usually a very small binary, that fit into a heap binary. - %% binary:copy() ensure that's the case, instead of keeping a subbinary or - %% refcount binary around - end. diff --git a/src/stringprep/stringprep_drv.c b/src/stringprep/stringprep_drv.c deleted file mode 100644 index cada92372..000000000 --- a/src/stringprep/stringprep_drv.c +++ /dev/null @@ -1,432 +0,0 @@ -/* - * ejabberd, Copyright (C) 2002-2013 ProcessOne - * - * 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 - * - */ - -#include -#include -#include -#include - -#include "uni_data.c" -#include "uni_norm.c" - -#define NAMEPREP_COMMAND 1 -#define NODEPREP_COMMAND 2 -#define RESOURCEPREP_COMMAND 3 - -/* - * R15B changed several driver callbacks to use ErlDrvSizeT and - * ErlDrvSSizeT typedefs instead of int. - * This provides missing typedefs on older OTP versions. - */ -#if ERL_DRV_EXTENDED_MAJOR_VERSION < 2 -typedef int ErlDrvSizeT; -typedef int ErlDrvSSizeT; -#endif - -typedef struct { - ErlDrvPort port; -} stringprep_data; - - -static ErlDrvData stringprep_erl_start(ErlDrvPort port, char *buff) -{ - stringprep_data* d = (stringprep_data*)driver_alloc(sizeof(stringprep_data)); - d->port = port; - - set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY); - - return (ErlDrvData)d; -} - -static void stringprep_erl_stop(ErlDrvData handle) -{ - driver_free((char*)handle); -} - - -/* Hangul constants */ -#define SBase 0xAC00 -#define LBase 0x1100 -#define VBase 0x1161 -#define TBase 0x11A7 -#define LCount 19 -#define VCount 21 -#define TCount 28 -#define NCount (VCount * TCount) -#define SCount (LCount * NCount) - -/* - * "canonical_ordering" and "compose" functions are based on nfkc.c from Gnome - * library - */ - -static void canonical_ordering(int *str, int len) -{ - int i, j, t; - int last, next; - - last = GetUniCharCClass(str[0]); - for (i = 0; i < len - 1; i++) - { - next = GetUniCharCClass(str[i + 1]); - if (next != 0 && last > next) - { - for (j = i; j >= 0; j--) - { - if (GetUniCharCClass(str[j]) <= next) - break; - t = str[j + 1]; - str[j + 1] = str[j]; - str[j] = t; - } - next = last; - } - last = next; - } -} - - -static int compose(int ch1, int ch2) -{ - int info1, info2; - - if (LBase <= ch1 && ch1 < LBase + LCount && - VBase <= ch2 && ch2 < VBase + VCount) { - return SBase + ((ch1 - LBase) * VCount + (ch2 - VBase)) * TCount; - } - - if (SBase <= ch1 && ch1 < SBase + SCount && ((ch1 - SBase) % TCount) == 0 && - TBase <= ch2 && ch2 < TBase + TCount) { - return ch1 + ch2 - TBase; - } - - info1 = GetUniCharCompInfo(ch1); - if (info1 != -1 && info1 & CompSingleMask) { - if (!(info1 & CompSecondMask) && - ch2 == compFirstList[info1 & CompMask][0]) { - return compFirstList[info1 & CompMask][1]; - } else - return 0; - } - - info2 = GetUniCharCompInfo(ch2); - if (info2 != -1 && info2 & CompSingleMask) { - if ((info2 & CompSecondMask) && - ch1 == compSecondList[info2 & CompMask][0]) { - return compSecondList[info2 & CompMask][1]; - } else - return 0; - } - - if (info1 != -1 && info2 != -1 && - !(info1 & CompSecondMask) && (info2 & CompSecondMask)) - return compBothList[info1][info2 & CompMask]; - else - return 0; -} - - -#define ADD_UCHAR(ruc) \ - if (ruc <= 0x7F) { \ - if (pos >= size) { \ - size = 2*size + 1; \ - rstring = driver_realloc_binary(rstring, size); \ - } \ - rstring->orig_bytes[pos] = (char) ruc; \ - pos++; \ - } else if (ruc <= 0x7FF) { \ - if (pos + 1 >= size) { \ - size = 2*size + 2; \ - rstring = driver_realloc_binary(rstring, size); \ - } \ - rstring->orig_bytes[pos] = (char) ((ruc >> 6) | 0xC0); \ - rstring->orig_bytes[pos+1] = (char) ((ruc | 0x80) & 0xBF); \ - pos += 2; \ - } else if (ruc <= 0xFFFF) { \ - if (pos + 2 >= size) { \ - size = 2*size + 3; \ - rstring = driver_realloc_binary(rstring, size); \ - } \ - rstring->orig_bytes[pos] = (char) ((ruc >> 12) | 0xE0); \ - rstring->orig_bytes[pos+1] = (char) (((ruc >> 6) | 0x80) & 0xBF); \ - rstring->orig_bytes[pos+2] = (char) ((ruc | 0x80) & 0xBF); \ - pos += 3; \ - } else if (ruc <= 0x1FFFFF) { \ - if (pos + 3 >= size) { \ - size = 2*size + 4; \ - rstring = driver_realloc_binary(rstring, size); \ - } \ - rstring->orig_bytes[pos] = (char) ((ruc >> 18) | 0xF0); \ - rstring->orig_bytes[pos+1] = (char) (((ruc >> 12) | 0x80) & 0xBF); \ - rstring->orig_bytes[pos+2] = (char) (((ruc >> 6) | 0x80) & 0xBF); \ - rstring->orig_bytes[pos+3] = (char) ((ruc | 0x80) & 0xBF); \ - pos += 4; \ - } - -#define ADD_UCHAR32(str, pos, len, ch) \ - if (pos >= len) { \ - len = 2*len + 1; \ - str = driver_realloc(str, len * sizeof(int)); \ - } \ - str[pos] = ch; \ - pos++; - - -#define ADD_DECOMP(ruc) \ - info = GetUniCharDecompInfo(ruc); \ - if (info >= 0) { \ - decomp_len = GetDecompLen(info); \ - decomp_shift = GetDecompShift(info); \ - for (j = 0; j < decomp_len; j++) { \ - ADD_UCHAR32(str32, str32pos, str32len, \ - decompList[decomp_shift + j]); \ - } \ - } else { \ - ADD_UCHAR32(str32, str32pos, str32len, ruc); \ - } - - - -static ErlDrvSSizeT stringprep_erl_control(ErlDrvData drv_data, - unsigned int command, - char *buf, ErlDrvSizeT len, - char **rbuf, ErlDrvSizeT rlen) -{ - int i, j, pos=1; - unsigned char c; - int bad = 0; - int uc = 0, ruc; - int size; - int info; - int prohibit = 0, tolower = 0; - ErlDrvBinary *rstring; - int *mc; - int *str32; - int str32len, str32pos = 0; - int decomp_len, decomp_shift; - int comp_pos, comp_starter_pos; - int cclass_prev, cclass2; - int ch1, ch2; - int first_ral, last_ral, have_ral, have_l; - - size = len + 1; - - rstring = driver_alloc_binary(size); - rstring->orig_bytes[0] = 0; - - str32len = len + 1; - - str32 = driver_alloc(str32len * sizeof(int)); - - switch (command) - { - case 0: - prohibit = ACMask; - tolower = 1; - break; - - case NAMEPREP_COMMAND: - prohibit = ACMask; - tolower = 1; - break; - - case NODEPREP_COMMAND: - prohibit = ACMask | C11Mask | C21Mask | XNPMask; - tolower = 1; - break; - - case RESOURCEPREP_COMMAND: - prohibit = ACMask | C21Mask; - tolower = 0; - break; - } - - for (i = 0; i < len; i++) - { - c = buf[i]; - if (c < 0x80) { - uc = c; - } else if (c < 0xC0) { - bad = 1; - } else if (c < 0xE0) { - if (i+1 < len && (buf[i+1] & 0xC0) == 0x80) { - uc = ((c & 0x1F) << 6) | (buf[i+1] & 0x3F); - i++; - } else { - bad = 1; - } - } else if (c < 0xF0) { - if (i+2 < len && (buf[i+1] & 0xC0) == 0x80 && - (buf[i+2] & 0xC0) == 0x80) { - uc = ((c & 0x0F) << 12) - | ((buf[i+1] & 0x3F) << 6) - | (buf[i+2] & 0x3F); - i += 2; - } else { - bad = 1; - } - } else if (c < 0xF8) { - if (i+3 < len && - (buf[i+1] & 0xC0) == 0x80 && - (buf[i+2] & 0xC0) == 0x80 && - (buf[i+3] & 0xC0) == 0x80) { - uc = ((c & 0x07) << 18) - | ((buf[i+1] & 0x3F) << 12) - | ((buf[i+2] & 0x3F) << 6) - | (buf[i+3] & 0x3F); - i += 3; - if (uc > 0x10FFFF) - bad = 1; - } else { - bad = 1; - } - } else { - bad = 1; - } - - if (bad) { - *rbuf = (char *)rstring; - driver_free(str32); - return 1; - } - - info = GetUniCharInfo(uc); - - if (!(info & B1Mask)) - { - if (tolower) { - if (!(info & MCMask)) - { - ruc = uc + GetDelta(info); - ADD_DECOMP(ruc); - } else { - mc = GetMC(info); - for (j = 1; j <= mc[0]; j++) { - ruc = mc[j]; - ADD_DECOMP(ruc); - } - } - } else { - ruc = uc; - ADD_DECOMP(ruc); - } - } - } - - if (str32pos == 0) { - rstring->orig_bytes[0] = 1; - *rbuf = (char *)rstring; - driver_free(str32); - return 1; - } - - canonical_ordering(str32, str32pos); - - comp_pos = 1; - comp_starter_pos = 0; - ch1 = str32[0]; - cclass_prev = GetUniCharCClass(ch1); - for (i = 1; i < str32pos; i++) - { - ch2 = str32[i]; - cclass2 = GetUniCharCClass(ch2); - if ((cclass_prev == 0 || cclass2 > cclass_prev) && - (ruc = compose(ch1, ch2))) { - ch1 = ruc; - } else { - if (cclass2 == 0) { - str32[comp_starter_pos] = ch1; - comp_starter_pos = comp_pos++; - ch1 = ch2; - cclass_prev = 0; - } else { - str32[comp_pos++] = ch2; - cclass_prev = cclass2; - } - } - } - str32[comp_starter_pos] = ch1; - str32pos = comp_pos; - - last_ral = have_ral = have_l = 0; - info = GetUniCharInfo(str32[0]); - first_ral = info & D1Mask; - for (i = 0; i < str32pos; i++) - { - ruc = str32[i]; - info = GetUniCharInfo(ruc); - if (info & prohibit) { - *rbuf = (char *)rstring; - driver_free(str32); - return 1; - } - last_ral = info & D1Mask; - have_ral = have_ral || last_ral; - have_l |= info & D2Mask; - ADD_UCHAR(ruc); - } - - if (have_ral && (!first_ral || !last_ral || have_l)) { - *rbuf = (char *)rstring; - driver_free(str32); - return 1; - } - - rstring->orig_bytes[0] = 1; - *rbuf = (char *)rstring; - driver_free(str32); - - return pos; -} - - - -ErlDrvEntry stringprep_driver_entry = { - NULL, /* F_PTR init, N/A */ - stringprep_erl_start, /* L_PTR start, called when port is opened */ - stringprep_erl_stop, /* F_PTR stop, called when port is closed */ - NULL, /* F_PTR output, called when erlang has sent */ - NULL, /* F_PTR ready_input, called when input descriptor ready */ - NULL, /* F_PTR ready_output, called when output descriptor ready */ - "stringprep_drv", /* char *driver_name, the argument to open_port */ - NULL, /* F_PTR finish, called when unloaded */ - NULL, /* handle */ - stringprep_erl_control, /* F_PTR control, port_command callback */ - NULL, /* F_PTR timeout, reserved */ - NULL, /* F_PTR outputv, reserved */ - /* Added in Erlang/OTP R15B: */ - NULL, /* ready_async */ - NULL, /* flush */ - NULL, /* call */ - NULL, /* event */ - ERL_DRV_EXTENDED_MARKER, /* extended_marker */ - ERL_DRV_EXTENDED_MAJOR_VERSION, /* major_version */ - ERL_DRV_EXTENDED_MINOR_VERSION, /* minor_version */ - 0, /* driver_flags */ - NULL, /* handle2 */ - NULL, /* process_exit */ - NULL /* stop_select */ -}; - -DRIVER_INIT(stringprep_erl) /* must match name in driver_entry */ -{ - return &stringprep_driver_entry; -} - diff --git a/src/stringprep/stringprep_sup.erl b/src/stringprep/stringprep_sup.erl deleted file mode 100644 index bd578fa5e..000000000 --- a/src/stringprep/stringprep_sup.erl +++ /dev/null @@ -1,45 +0,0 @@ -%%%------------------------------------------------------------------- -%%% File : stringprep_sup.erl -%%% Author : Mickael Remond -%%% Description : Supervisor for the Stringprep worker. -%%% Created : 29 Jun 2007 by Mickael Remond -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2013 ProcessOne -%%% -%%% 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 -%%% -%%%------------------------------------------------------------------- - --module(stringprep_sup). - --behaviour(supervisor). - -%% API --export([start_link/0]). - -%% Supervisor callbacks --export([init/1]). - --define(SERVER, ?MODULE). - -start_link() -> - supervisor:start_link({local, ?SERVER}, ?MODULE, []). - -init([]) -> - StringPrep = {stringprep, {stringprep, start_link, []}, - permanent, brutal_kill, worker, [stringprep]}, - {ok, {{one_for_all, 10, 1}, [StringPrep]}}. diff --git a/src/stringprep/uni_data.c b/src/stringprep/uni_data.c deleted file mode 100644 index 1c76ee811..000000000 --- a/src/stringprep/uni_data.c +++ /dev/null @@ -1,1257 +0,0 @@ -/* - * uni_data.c -- - * - * Declarations of Unicode character information tables. This file is - * automatically generated by the uni_parse.tcl script. Do not - * modify this file by hand. - * - * Copyright (c) 1998 by Scriptics Corporation. - * All rights reserved. - * - * Modified for ejabberd by Alexey Shchepin - * - * RCS: @(#) $Id$ - */ - -/* - * A 16-bit Unicode character is split into two parts in order to index - * into the following tables. The lower OFFSET_BITS comprise an offset - * into a page of characters. The upper bits comprise the page number. - */ - -#define OFFSET_BITS 8 - -/* - * The pageMap is indexed by page number and returns an alternate page number - * that identifies a unique page of characters. Many Unicode characters map - * to the same alternate page number. - */ - -static unsigned char pageMap[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 8, 8, 8, 8, 8, 25, 26, 27, 28, 29, 30, 31, 29, - 32, 33, 29, 29, 29, 8, 8, 8, 34, 35, 36, 37, 38, 39, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 40, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 41, 21, 21, 21, 21, 42, 8, 8, 8, 8, 8, 8, 8, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 21, 45, 46, 47, 48, 49, 50, 8, 8, 8, 51, 52, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 53, 54, 8, 8, 55, - 56, 57, 58, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 59, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 21, 21, 60, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 61, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 61 -}; - -/* - * The groupMap is indexed by combining the alternate page number with - * the page offset and returns a group number that identifies a unique - * set of character attributes. - */ - -static unsigned short int groupMap[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 2, 2, 3, 3, 2, 2, 2, 2, 2, 2, - 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, - 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 7, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, - 2, 2, 5, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 9, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, - 5, 5, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 11, 5, 10, 5, 10, 5, 10, 5, 5, - 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 12, 10, 5, - 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 13, 10, 5, 10, 5, 10, 5, 14, 5, 15, 10, 5, 10, 5, - 16, 10, 5, 17, 17, 10, 5, 5, 18, 19, 20, 10, 5, 17, 21, 5, 22, 23, - 10, 5, 5, 5, 22, 24, 5, 25, 10, 5, 10, 5, 10, 5, 26, 10, 5, 26, 5, - 5, 10, 5, 26, 10, 5, 27, 27, 10, 5, 10, 5, 28, 10, 5, 5, 5, 10, 5, - 5, 5, 5, 5, 5, 5, 29, 10, 5, 29, 10, 5, 29, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 5, 10, 5, 10, 5, 10, 5, 10, 5, - 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 30, 29, 10, 5, 10, 5, 31, 32, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 33, - 6, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, - 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 2, 2, 2, 34, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 2, 2, - 6, 6, 6, 6, 35, 6, 6, 6, 2, 6, 6, 6, 6, 6, 2, 2, 36, 2, 37, 37, 37, - 6, 38, 6, 39, 39, 40, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 41, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 6, 42, 43, 44, 45, 46, 47, 48, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 49, 50, - 51, 5, 52, 53, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, - 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 5, 2, 2, 2, - 2, 6, 2, 2, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, - 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 5, - 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 6, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 6, 6, 10, 5, 6, 6, 6, - 6, 6, 6, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 6, 6, 5, 5, 5, 5, 5, 5, - 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 56, 6, 5, 2, 6, - 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 6, 2, 2, 2, 57, 2, 57, 2, 2, 57, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 6, 6, 6, 6, 6, 57, 57, 57, - 57, 57, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 57, 6, 6, 6, - 57, 6, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 6, 6, 6, 6, 6, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 57, 57, 57, 2, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 2, 2, 2, 2, 2, 2, 2, 58, 2, 2, 2, 2, 2, 2, 2, 57, 57, 2, - 2, 2, 2, 2, 2, 2, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 57, 57, 57, 57, - 57, 6, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 6, 6, - 57, 2, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 6, 6, 6, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 57, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 5, 6, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 6, 6, 2, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 2, - 6, 6, 5, 2, 2, 2, 2, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 2, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 6, 6, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, - 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 6, 6, 5, 5, 5, 5, 6, 6, 2, 6, 5, 5, 5, - 2, 2, 2, 2, 6, 6, 5, 5, 6, 6, 5, 5, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, - 6, 6, 6, 6, 5, 5, 6, 5, 5, 5, 2, 2, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 2, 6, 6, 5, - 5, 5, 5, 5, 5, 6, 6, 6, 6, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, - 6, 5, 5, 6, 5, 5, 6, 6, 2, 6, 5, 5, 5, 2, 2, 6, 6, 6, 6, 2, 2, 6, 6, - 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 6, 5, 6, 6, 6, - 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 5, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, - 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 5, 5, 5, 5, 5, 6, 6, 2, 5, - 5, 5, 5, 2, 2, 2, 2, 2, 6, 2, 2, 5, 6, 5, 5, 2, 6, 6, 5, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 5, - 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, - 6, 5, 5, 6, 6, 5, 5, 5, 5, 6, 6, 2, 5, 5, 2, 5, 2, 2, 2, 6, 6, 6, 5, - 5, 6, 6, 5, 5, 2, 6, 6, 6, 6, 6, 6, 6, 6, 2, 5, 6, 6, 6, 6, 5, 5, 6, - 5, 5, 5, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 5, 6, 5, 5, 5, 5, 5, 5, 6, 6, - 6, 5, 5, 5, 6, 5, 5, 5, 5, 6, 6, 6, 5, 5, 6, 5, 6, 5, 5, 6, 6, 6, 5, - 5, 6, 6, 6, 5, 5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 6, - 6, 6, 6, 5, 5, 2, 5, 5, 6, 6, 6, 5, 5, 5, 6, 5, 5, 5, 2, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 6, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 6, 6, 6, 6, 2, 2, 2, 5, 5, 5, 5, - 6, 2, 2, 2, 6, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 2, 2, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 5, 5, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 6, 5, 5, 5, 5, 5, - 5, 5, 5, 6, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, - 5, 5, 6, 6, 6, 6, 5, 2, 5, 5, 5, 5, 5, 6, 2, 5, 5, 6, 5, 5, 2, 2, 6, - 6, 6, 6, 6, 6, 6, 5, 5, 6, 6, 6, 6, 6, 6, 6, 5, 6, 5, 5, 6, 6, 6, 6, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 6, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 5, 5, 5, 2, - 2, 2, 6, 6, 5, 5, 5, 6, 5, 5, 5, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, - 6, 6, 6, 6, 6, 6, 6, 5, 5, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 6, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 2, 6, - 6, 6, 6, 5, 5, 5, 2, 2, 2, 6, 2, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, - 2, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 6, - 5, 6, 6, 5, 5, 6, 5, 6, 6, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 6, 5, 5, - 5, 5, 5, 5, 5, 6, 5, 5, 5, 6, 5, 6, 5, 6, 6, 5, 5, 6, 5, 5, 5, 5, 2, - 5, 5, 2, 2, 2, 2, 2, 2, 6, 2, 2, 5, 6, 6, 5, 5, 5, 5, 5, 6, 5, 6, 2, - 2, 2, 2, 2, 2, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, 5, 2, 2, 2, - 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, - 2, 2, 2, 2, 5, 2, 2, 5, 5, 5, 5, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, - 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 5, 5, 5, 5, 5, 5, 5, 5, - 2, 5, 5, 5, 5, 5, 5, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 6, 5, 5, 5, 5, 5, 6, 5, 5, 6, 5, 2, 2, 2, 2, 5, 2, 6, 6, 6, 2, 2, 5, - 2, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, - 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, - 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 6, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 6, - 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, - 5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, - 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 6, 5, - 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, - 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 2, 2, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 6, 5, 5, 5, 5, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 5, 5, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 6, 5, 5, 5, 6, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, - 5, 2, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 2, - 5, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 7, 2, 2, 2, - 2, 7, 7, 7, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, - 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 10, 5, 10, 5, 10, 5, - 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 59, 60, 61, 62, 63, 64, 6, 6, 6, 6, 10, 5, 10, 5, - 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 5, 10, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 65, - 65, 65, 65, 65, 65, 65, 65, 5, 5, 5, 5, 5, 5, 6, 6, 65, 65, 65, 65, - 65, 65, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 65, 65, 65, 65, 65, 65, 65, 65, - 5, 5, 5, 5, 5, 5, 5, 5, 65, 65, 65, 65, 65, 65, 65, 65, 5, 5, 5, 5, - 5, 5, 6, 6, 65, 65, 65, 65, 65, 65, 6, 6, 66, 5, 67, 5, 68, 5, 69, - 5, 6, 65, 6, 65, 6, 65, 6, 65, 5, 5, 5, 5, 5, 5, 5, 5, 65, 65, 65, - 65, 65, 65, 65, 65, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 5, 5, 118, 119, 120, 6, 121, 122, 65, 65, 123, 123, 124, 2, 125, - 2, 2, 2, 126, 127, 128, 6, 129, 130, 131, 131, 131, 131, 132, 2, 2, - 2, 5, 5, 133, 134, 6, 6, 135, 136, 65, 65, 137, 137, 6, 2, 2, 2, 5, - 5, 138, 139, 140, 5, 141, 142, 65, 65, 143, 143, 144, 2, 2, 2, 6, 6, - 145, 146, 147, 6, 148, 149, 150, 150, 151, 151, 152, 2, 2, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 153, 153, 153, 154, 58, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, - 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 2, 6, 6, 6, - 6, 6, 6, 6, 6, 153, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, - 5, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 2, 2, 2, 2, 2, 2, 2, 2, 155, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 2, 2, 156, 157, 2, 2, 2, 158, 2, 159, 5, 160, 161, - 162, 5, 5, 163, 164, 165, 5, 2, 163, 166, 2, 2, 167, 167, 167, 168, - 169, 2, 2, 170, 171, 172, 2, 168, 2, 173, 2, 174, 2, 175, 176, 177, - 177, 2, 5, 178, 178, 2, 179, 5, 5, 5, 5, 5, 5, 2, 6, 6, 5, 180, 181, - 2, 2, 2, 2, 2, 182, 5, 5, 5, 5, 2, 2, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 183, 183, 183, 183, 183, 183, 183, 183, - 183, 183, 183, 183, 183, 183, 183, 183, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, - 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, - 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 2, 2, 2, 2, 6, 2, 2, 2, 2, 6, 6, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 6, 2, 2, 2, 2, 6, 6, 6, 2, 6, - 2, 2, 2, 2, 2, 2, 2, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 5, 5, 5, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 2, 2, - 5, 5, 5, 5, 5, 2, 2, 2, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 6, 6, 2, 2, 2, 2, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 6, 6, 6, 6, 6, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 185, 5, - 186, 5, 187, 5, 6, 6, 6, 6, 5, 5, 5, 5, 5, 188, 189, 190, 191, 192, - 193, 194, 195, 5, 5, 196, 197, 198, 5, 5, 5, 199, 200, 201, 202, 203, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 204, 205, - 206, 207, 5, 5, 5, 5, 5, 5, 5, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 5, 222, 5, 5, 5, 223, 224, 225, 5, 226, - 5, 227, 228, 5, 5, 5, 5, 5, 5, 5, 5, 229, 5, 230, 231, 5, 232, 233, - 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 234, 235, 236, 237, 238, 239, 240, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 241, 242, 243, 244, 245, 6, 6, 6, - 6, 6, 57, 2, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 6, 57, 57, 57, 57, 57, 6, 57, - 6, 57, 57, 6, 57, 57, 6, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 6, 6, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 6, 6, 6, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 6, 6, 6, 6, 57, 57, 57, 57, - 57, 6, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 6, 6, 153, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, - 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 5, 6, 6, - 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 6, 6, 6, 2, - 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, - 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 2, 2, 2, 2, 2, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 247, - 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, - 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 248, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 5, 5, 5, 5, - 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 249, - 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, - 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 250, - 6, 250, 250, 6, 6, 250, 6, 6, 250, 250, 6, 6, 250, 250, 250, 250, 6, - 250, 250, 250, 250, 250, 250, 250, 250, 5, 5, 5, 5, 6, 5, 6, 5, 5, - 5, 5, 6, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 252, 252, 6, 252, - 252, 252, 252, 6, 6, 252, 252, 252, 252, 252, 252, 252, 252, 6, 252, - 252, 252, 252, 252, 252, 252, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 253, 253, 6, 253, 253, 253, - 253, 6, 253, 253, 253, 253, 253, 6, 253, 6, 6, 6, 253, 253, 253, 253, - 253, 253, 253, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 256, 256, 256, 256, 256, 256, 256, 256, - 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, - 256, 256, 256, 256, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 258, 258, 258, 258, 258, 258, 258, 258, - 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, - 258, 258, 258, 258, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 259, 259, 259, 259, 259, 259, 259, 259, - 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, - 259, 259, 259, 259, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 260, 260, 260, 260, 260, - 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 261, 260, - 260, 260, 260, 260, 260, 260, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 262, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 264, 263, 263, 263, 263, 263, 263, 263, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 265, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 267, 266, 266, 266, 266, 266, 266, 266, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 268, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 270, 269, 269, 269, - 269, 269, 269, 269, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 271, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 273, 272, 272, 272, 272, 272, 272, 272, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 274, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 6, 6 -}; - -/* - * Each group represents a unique set of character attributes. The attributes - * are encoded into a 32-bit value as follows: - * - * Bit 0 A.1 | C.1.2 | C.2.2 | C.3 -- C.9 - * - * Bit 1 C.1.1 - * - * Bit 2 C.2.1 - * - * Bit 3 B.1 - * - * Bit 4 D.1 - * - * Bit 5 D.2 - * - * Bit 6 XNP - * - * Bit 7 Case maps to several characters - * - * Bits 8-10 Reserved for future use. - * - * Bits 11-31 Case delta: delta for case conversions. This should be the - * highest field so we can easily sign extend. - */ - -static int groups[] = { - 4, 2, 0, 64, 65568, 32, 1, 8, 1587232, 160, 2080, 2208, 4256, - -247776, -548832, 430112, 421920, 419872, 161824, 413728, 415776, - 423968, 432160, 428064, 436256, 438304, 446496, 444448, 448544, - 4128, 6304, -198624, -114656, -266208, 237568, 8352, 77856, 75808, - 131104, 129056, 10400, 12448, -61408, -51168, -26592, -12256, - -18400, -30688, -45024, -110560, -98272, -96224, -122848, -131040, - 163872, 98336, 14496, 16, 17, 16544, 18592, 20640, 22688, 24736, - -118752, -16352, 26784, 28832, 30880, 32928, 34976, 37024, 39072, - 41120, 43168, 45216, 47264, 49312, 51360, 53408, 55456, 57504, - 59552, 61600, 63648, 65696, 67744, 69792, 71840, 73888, 75936, - 77984, 80032, 82080, 84128, 86176, 88224, 90272, 92320, 94368, - 96416, 98464, 100512, 102560, 104608, 106656, 108704, 110752, - 112800, 114848, 116896, 118944, 120992, 123040, 125088, 127136, - 129184, 131232, 133280, 135328, 137376, 139424, 141472, -151520, - 143520, -14690272, 145568, 147616, 149664, 151712, 153760, -176096, - 155808, 157856, 159904, 161952, 164000, -204768, 166048, 168096, - 170144, 172192, 174240, -229344, -14304, 176288, 178336, 180384, - 182432, 184480, -262112, -258016, 186528, 9, 33, 188544, -17102816, - 190592, -16080864, 192640, -17111008, -17113056, -17115104, -17119200, - -17121248, -17117152, 194688, -17123296, -17125344, -17127392, - 196736, 198784, 200832, -15394784, -17133536, -17168352, -16920544, - -17190880, -17192928, -17182688, -15488992, -15464416, -17237984, - 32800, 53280, 202912, 204960, 207008, 209056, 211104, 213152, - 215200, 217248, 219296, 221344, 223392, 225440, 227488, 229536, - 231584, 233632, 235680, 237728, 239776, 241824, 243872, 245920, - 247968, 250016, 252064, 254112, 256160, 258208, 260256, 262304, - 264352, 266400, 268448, 270496, 272544, 274592, 276640, 278688, - 280736, 282784, 284832, 286880, 288928, 290976, 293024, 295072, - 297120, 299168, 301216, 303264, 305312, 307360, 309408, 311456, - 313504, 315552, 317600, 319648, 321696, 323744, 325792, 81952, - -245168096, -245274592, -245381088, -245487584, -245594080, -245700576, - -245807072, -245913568, -246020064, -246126560, -246233056, -246339552, - -246446048, -244824032, -244844512, -244875232, -244942816, -244963296, - -244994016, -245061600, -245082080, -245112800, -245180384, -245200864, - -245231584, -245299168, -245319648, -245350368 -}; - -/* - * Table for characters that lowercased to multiple ones - */ - -static int multiCaseTable[][4] = { - {2, 115, 115}, - {2, 105, 775}, - {2, 700, 110}, - {2, 106, 780}, - {2, 32, 953}, - {3, 953, 776, 769}, - {3, 965, 776, 769}, - {2, 1381, 1410}, - {2, 104, 817}, - {2, 116, 776}, - {2, 119, 778}, - {2, 121, 778}, - {2, 97, 702}, - {2, 965, 787}, - {3, 965, 787, 768}, - {3, 965, 787, 769}, - {3, 965, 787, 834}, - {2, 7936, 953}, - {2, 7937, 953}, - {2, 7938, 953}, - {2, 7939, 953}, - {2, 7940, 953}, - {2, 7941, 953}, - {2, 7942, 953}, - {2, 7943, 953}, - {2, 7936, 953}, - {2, 7937, 953}, - {2, 7938, 953}, - {2, 7939, 953}, - {2, 7940, 953}, - {2, 7941, 953}, - {2, 7942, 953}, - {2, 7943, 953}, - {2, 7968, 953}, - {2, 7969, 953}, - {2, 7970, 953}, - {2, 7971, 953}, - {2, 7972, 953}, - {2, 7973, 953}, - {2, 7974, 953}, - {2, 7975, 953}, - {2, 7968, 953}, - {2, 7969, 953}, - {2, 7970, 953}, - {2, 7971, 953}, - {2, 7972, 953}, - {2, 7973, 953}, - {2, 7974, 953}, - {2, 7975, 953}, - {2, 8032, 953}, - {2, 8033, 953}, - {2, 8034, 953}, - {2, 8035, 953}, - {2, 8036, 953}, - {2, 8037, 953}, - {2, 8038, 953}, - {2, 8039, 953}, - {2, 8032, 953}, - {2, 8033, 953}, - {2, 8034, 953}, - {2, 8035, 953}, - {2, 8036, 953}, - {2, 8037, 953}, - {2, 8038, 953}, - {2, 8039, 953}, - {2, 8048, 953}, - {2, 945, 953}, - {2, 940, 953}, - {2, 945, 834}, - {3, 945, 834, 953}, - {2, 945, 953}, - {2, 8052, 953}, - {2, 951, 953}, - {2, 942, 953}, - {2, 951, 834}, - {3, 951, 834, 953}, - {2, 951, 953}, - {3, 953, 776, 768}, - {3, 953, 776, 769}, - {2, 953, 834}, - {3, 953, 776, 834}, - {3, 965, 776, 768}, - {3, 965, 776, 769}, - {2, 961, 787}, - {2, 965, 834}, - {3, 965, 776, 834}, - {2, 8060, 953}, - {2, 969, 953}, - {2, 974, 953}, - {2, 969, 834}, - {3, 969, 834, 953}, - {2, 969, 953}, - {2, 114, 115}, - {2, 176, 99}, - {2, 176, 102}, - {2, 110, 111}, - {2, 115, 109}, - {3, 116, 101, 108}, - {2, 116, 109}, - {3, 104, 112, 97}, - {2, 97, 117}, - {2, 111, 118}, - {2, 112, 97}, - {2, 110, 97}, - {2, 956, 97}, - {2, 109, 97}, - {2, 107, 97}, - {2, 107, 98}, - {2, 109, 98}, - {2, 103, 98}, - {2, 112, 102}, - {2, 110, 102}, - {2, 956, 102}, - {2, 104, 122}, - {3, 107, 104, 122}, - {3, 109, 104, 122}, - {3, 103, 104, 122}, - {3, 116, 104, 122}, - {2, 112, 97}, - {3, 107, 112, 97}, - {3, 109, 112, 97}, - {3, 103, 112, 97}, - {2, 112, 118}, - {2, 110, 118}, - {2, 956, 118}, - {2, 109, 118}, - {2, 107, 118}, - {2, 109, 118}, - {2, 112, 119}, - {2, 110, 119}, - {2, 956, 119}, - {2, 109, 119}, - {2, 107, 119}, - {2, 109, 119}, - {2, 107, 969}, - {2, 109, 969}, - {2, 98, 113}, - {3, 99, 111, 46}, - {2, 100, 98}, - {2, 103, 121}, - {2, 104, 112}, - {2, 107, 107}, - {2, 107, 109}, - {2, 112, 104}, - {3, 112, 112, 109}, - {2, 112, 114}, - {2, 115, 118}, - {2, 119, 98}, - {2, 102, 102}, - {2, 102, 105}, - {2, 102, 108}, - {3, 102, 102, 105}, - {3, 102, 102, 108}, - {2, 115, 116}, - {2, 115, 116}, - {2, 1396, 1398}, - {2, 1396, 1381}, - {2, 1396, 1387}, - {2, 1406, 1398}, - {2, 1396, 1389} -}; - -/* - * The following constants are used to determine the category of a - * Unicode character. - */ - -#define ACMask (1 << 0) -#define C11Mask (1 << 1) -#define C21Mask (1 << 2) -#define B1Mask (1 << 3) -#define D1Mask (1 << 4) -#define D2Mask (1 << 5) -#define XNPMask (1 << 6) -#define MCMask (1 << 7) - -/* - * The following macros extract the fields of the character info. The - * GetDelta() macro is complicated because we can't rely on the C compiler - * to do sign extension on right shifts. - */ - -#define GetCaseType(info) (((info) & 0xE0) >> 5) -#define GetCategory(info) ((info) & 0x1F) -#define GetDelta(info) (((info) > 0) ? ((info) >> 11) : (~(~((info)) >> 11))) -#define GetMC(info) (multiCaseTable[GetDelta(info)]) - -/* - * This macro extracts the information about a character from the - * Unicode character tables. - */ - -#define GetUniCharInfo(ch) (groups[groupMap[(pageMap[(((int)(ch)) & 0x1fffff) >> OFFSET_BITS] << OFFSET_BITS) | ((ch) & ((1 << OFFSET_BITS)-1))]]) - diff --git a/src/stringprep/uni_norm.c b/src/stringprep/uni_norm.c deleted file mode 100644 index 7575f1405..000000000 --- a/src/stringprep/uni_norm.c +++ /dev/null @@ -1,3264 +0,0 @@ -/* - * uni_norm.c -- - * - * Declarations of Unicode character information tables. This file is - * automatically generated by the uni_parse2.tcl script. Do not - * modify this file by hand. - * - * Copyright (c) 1998 by Scriptics Corporation. - * All rights reserved. - * - * Modified for ejabberd by Alexey Shchepin - * - * RCS: @(#) $Id$ - */ - -/* - * A 16-bit Unicode character is split into two parts in order to index - * into the following tables. The lower CCLASS_OFFSET_BITS comprise an offset - * into a page of characters. The upper bits comprise the page number. - */ - -#define CCLASS_OFFSET_BITS 8 - -/* - * The pageMap is indexed by page number and returns an alternate page number - * that identifies a unique page of characters. Many Unicode characters map - * to the same alternate page number. - */ - -static unsigned char cclassPageMap[] = { - 0, 0, 0, 1, 2, 3, 4, 5, 0, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, - 0, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 18, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -/* - * The cclassGroupMap is indexed by combining the alternate page number with - * the page offset and returns a combining class number. - */ - -static unsigned char cclassGroupMap[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 232, 220, 220, 220, 220, - 232, 216, 220, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, 202, - 202, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 1, 1, 1, - 1, 1, 220, 220, 220, 220, 230, 230, 230, 230, 230, 230, 230, 230, 240, - 230, 220, 220, 220, 230, 230, 230, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 234, 233, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 230, 230, 230, 230, 220, 230, 230, - 230, 222, 220, 230, 230, 230, 230, 230, 230, 0, 220, 220, 220, 220, - 220, 230, 230, 220, 230, 230, 222, 228, 230, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 0, 20, 21, 22, 0, 23, 0, 24, 25, 0, 230, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, - 33, 34, 230, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, - 230, 230, 230, 230, 230, 230, 0, 0, 230, 230, 230, 230, 220, 230, 0, - 0, 230, 230, 0, 220, 230, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 230, 230, 220, 230, 230, 220, - 220, 220, 230, 220, 220, 230, 220, 230, 230, 230, 220, 230, 220, 230, - 220, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 230, 220, 230, - 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 84, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 103, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 118, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 122, 122, 122, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 220, 0, 220, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 132, - 0, 0, 0, 0, 0, 130, 130, 130, 130, 0, 0, 130, 0, 230, 230, 9, 0, 230, - 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 1, - 1, 230, 230, 230, 230, 1, 1, 1, 230, 230, 0, 0, 0, 0, 230, 0, 0, 0, - 1, 1, 230, 220, 230, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 218, 228, 232, 222, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 216, 1, 1, 1, 0, 0, 0, 226, 216, 216, - 216, 216, 216, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 220, 220, 220, - 220, 220, 0, 0, 230, 230, 230, 230, 230, 220, 220, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -#define GetUniCharCClass(ch) (cclassGroupMap[(cclassPageMap[(((int)(ch)) & 0x1fffff) >> CCLASS_OFFSET_BITS] << CCLASS_OFFSET_BITS) | ((ch) & ((1 << CCLASS_OFFSET_BITS)-1))]) - - -#define DECOMP_OFFSET_BITS 8 - -/* - * The pageMap is indexed by page number and returns an alternate page number - * that identifies a unique page of characters. Many Unicode characters map - * to the same alternate page number. - */ - -static unsigned char decompPageMap[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 16, 17, 18, 19, 20, 21, 22, 7, 7, 7, 7, - 7, 23, 7, 7, 7, 24, 25, 26, 27, 28, 29, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 30, 31, 32, 33, 34, 35, 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 37, 7, 7, 38, 39, 40, - 41, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 42, 43, 44, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 -}; - -/* - * The decompGroupMap is indexed by combining the alternate page number with - * the page offset and returns a group number that identifies a length and - * shift of decomposition sequence in decompList - */ - -static int decompGroupMap[] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 65536, -1, -1, -1, -1, -1, -1, -1, 131073, - -1, 65539, -1, -1, -1, -1, 131076, -1, -1, 65542, 65543, 131080, 65546, - -1, -1, 131083, 65549, 65550, -1, 196623, 196626, 196629, -1, 131096, - 131098, 131100, 131102, 131104, 131106, -1, 131108, 131110, 131112, - 131114, 131116, 131118, 131120, 131122, 131124, -1, 131126, 131128, - 131130, 131132, 131134, 131136, -1, -1, 131138, 131140, 131142, 131144, - 131146, -1, -1, 131148, 131150, 131152, 131154, 131156, 131158, -1, - 131160, 131162, 131164, 131166, 131168, 131170, 131172, 131174, 131176, - -1, 131178, 131180, 131182, 131184, 131186, 131188, -1, -1, 131190, - 131192, 131194, 131196, 131198, -1, 131200, 131202, 131204, 131206, - 131208, 131210, 131212, 131214, 131216, 131218, 131220, 131222, 131224, - 131226, 131228, 131230, 131232, -1, -1, 131234, 131236, 131238, 131240, - 131242, 131244, 131246, 131248, 131250, 131252, 131254, 131256, 131258, - 131260, 131262, 131264, 131266, 131268, 131270, 131272, -1, -1, 131274, - 131276, 131278, 131280, 131282, 131284, 131286, 131288, 131290, -1, - 131292, 131294, 131296, 131298, 131300, 131302, -1, 131304, 131306, - 131308, 131310, 131312, 131314, 131316, 131318, -1, -1, 131320, 131322, - 131324, 131326, 131328, 131330, 131332, -1, -1, 131334, 131336, 131338, - 131340, 131342, 131344, -1, -1, 131346, 131348, 131350, 131352, 131354, - 131356, 131358, 131360, 131362, 131364, 131366, 131368, 131370, 131372, - 131374, 131376, 131378, 131380, -1, -1, 131382, 131384, 131386, 131388, - 131390, 131392, 131394, 131396, 131398, 131400, 131402, 131404, 131406, - 131408, 131410, 131412, 131414, 131416, 131418, 131420, 131422, 131424, - 131426, 65892, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 131429, 131431, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 131433, 131435, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 196973, 196976, 196979, 131446, 131448, - 131450, 131452, 131454, 131456, 131458, 131460, 131462, 131464, 131466, - 131468, 131470, 131472, 197010, 197013, 197016, 197019, 197022, 197025, - 197028, 197031, -1, 197034, 197037, 197040, 197043, 131510, 131512, - -1, -1, 131514, 131516, 131518, 131520, 131522, 131524, 197062, 197065, - 131532, 131534, 131536, 131538, 131540, 131542, 131544, 131546, -1, - -1, 131548, 131550, 197088, 197091, 131558, 131560, 131562, 131564, - 131566, 131568, 131570, 131572, 131574, 131576, 131578, 131580, 131582, - 131584, 131586, 131588, 131590, 131592, 131594, 131596, 131598, 131600, - 131602, 131604, 131606, 131608, 131610, 131612, 131614, 131616, 131618, - 131620, -1, -1, 131622, 131624, -1, -1, -1, -1, -1, -1, 131626, 131628, - 131630, 131632, 197170, 197173, 197176, 197179, 131646, 131648, 197186, - 197189, 131656, 131658, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66124, 66125, 66126, 66127, - 66128, 66129, 66130, 66131, 66132, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 131669, 131671, 131673, 131675, 131677, 131679, - -1, -1, 66145, 66146, 65892, 66147, 66148, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 66149, 66150, -1, 66151, 131688, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 66154, -1, -1, -1, -1, -1, 131691, -1, -1, -1, 66157, - -1, -1, -1, -1, -1, 131080, 197230, 131697, 66163, 131700, 131702, - 131704, -1, 131706, -1, 131708, 131710, 197248, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 131715, 131717, 131719, 131721, 131723, 131725, 197263, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 131730, 131732, 131734, 131736, 131738, - -1, 66204, 66205, 66206, 131708, 131717, 66207, 66208, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 66209, 66210, 66211, -1, 66212, 66213, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 131750, 131752, -1, 131754, -1, -1, - -1, 131756, -1, -1, -1, -1, 131758, 131760, 131762, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 131764, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 131766, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131768, 131770, -1, - 131772, -1, -1, -1, 131774, -1, -1, -1, -1, 131776, 131778, 131780, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 131782, 131784, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131786, - 131788, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131790, - 131792, 131794, 131796, -1, -1, 131798, 131800, -1, -1, 131802, 131804, - 131806, 131808, 131810, 131812, -1, -1, 131814, 131816, 131818, 131820, - 131822, 131824, -1, -1, 131826, 131828, 131830, 131832, 131834, 131836, - 131838, 131840, 131842, 131844, 131846, 131848, -1, -1, 131850, 131852, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 131854, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 131856, 131858, 131860, 131862, 131864, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131866, 131868, 131870, 131872, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 131874, -1, 131876, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 131878, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131880, -1, -1, -1, -1, -1, - -1, -1, 131882, -1, -1, 131884, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 131886, 131888, 131890, 131892, - 131894, 131896, 131898, 131900, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131902, 131904, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131906, - 131908, -1, 131910, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 131912, -1, -1, 131914, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 131916, 131918, 131920, -1, -1, - 131922, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131924, -1, - -1, 131926, 131928, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 131930, 131932, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131934, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131936, 131938, - 131940, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 131942, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 131944, -1, -1, -1, -1, -1, -1, 131946, - 131948, -1, 131950, 197488, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131955, 131957, - 131959, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 131961, -1, 131963, 197501, 131968, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131970, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 131972, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131974, - 131976, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66442, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 131979, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131981, -1, -1, - -1, -1, 131983, -1, -1, -1, -1, 131985, -1, -1, -1, -1, 131987, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131989, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 131991, -1, 131993, 131995, 197533, 132000, 197538, - -1, -1, -1, -1, -1, -1, -1, 132005, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 132007, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 132009, -1, -1, -1, -1, 132011, -1, -1, -1, -1, 132013, - -1, -1, -1, -1, 132015, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 132017, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 132019, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 132021, 132023, 132025, 132027, 132029, - 132031, 132033, 132035, 197573, 197576, 132043, 132045, 132047, 132049, - 132051, 132053, 132055, 132057, 132059, 132061, 197599, 197602, 197605, - 197608, 132075, 132077, 132079, 132081, 197619, 197622, 132089, 132091, - 132093, 132095, 132097, 132099, 132101, 132103, 132105, 132107, 132109, - 132111, 132113, 132115, 132117, 132119, 197657, 197660, 132127, 132129, - 132131, 132133, 132135, 132137, 132139, 132141, 197679, 197682, 132149, - 132151, 132153, 132155, 132157, 132159, 132161, 132163, 132165, 132167, - 132169, 132171, 132173, 132175, 132177, 132179, 132181, 132183, 197721, - 197724, 197727, 197730, 197733, 197736, 197739, 197742, 132209, 132211, - 132213, 132215, 132217, 132219, 132221, 132223, 197761, 197764, 132231, - 132233, 132235, 132237, 132239, 132241, 197779, 197782, 197785, 197788, - 197791, 197794, 132261, 132263, 132265, 132267, 132269, 132271, 132273, - 132275, 132277, 132279, 132281, 132283, 132285, 132287, 197825, 197828, - 197831, 197834, 132301, 132303, 132305, 132307, 132309, 132311, 132313, - 132315, 132317, 132319, 132321, 132323, 132325, 132327, 132329, 132331, - 132333, 132335, 132337, 132339, 132341, 132343, 132345, 132347, 132349, - 132351, 132353, 132355, 132357, 132359, 132361, 132237, -1, -1, -1, - -1, 132363, 132365, 132367, 132369, 197907, 197910, 197913, 197916, - 197919, 197922, 197925, 197928, 197931, 197934, 197937, 197940, 197943, - 197946, 197949, 197952, 197955, 197958, 197961, 197964, 132431, 132433, - 132435, 132437, 132439, 132441, 197979, 197982, 197985, 197988, 197991, - 197994, 197997, 198000, 198003, 198006, 132473, 132475, 132477, 132479, - 132481, 132483, 132485, 132487, 198025, 198028, 198031, 198034, 198037, - 198040, 198043, 198046, 198049, 198052, 198055, 198058, 198061, 198064, - 198067, 198070, 198073, 198076, 198079, 198082, 132549, 132551, 132553, - 132555, 198093, 198096, 198099, 198102, 198105, 198108, 198111, 198114, - 198117, 198120, 132587, 132589, 132591, 132593, 132595, 132597, 132599, - 132601, -1, -1, -1, -1, -1, -1, 132603, 132605, 198143, 198146, 198149, - 198152, 198155, 198158, 132625, 132627, 198165, 198168, 198171, 198174, - 198177, 198180, 132647, 132649, 198187, 198190, 198193, 198196, -1, - -1, 132663, 132665, 198203, 198206, 198209, 198212, -1, -1, 132679, - 132681, 198219, 198222, 198225, 198228, 198231, 198234, 132701, 132703, - 198241, 198244, 198247, 198250, 198253, 198256, 132723, 132725, 198263, - 198266, 198269, 198272, 198275, 198278, 132745, 132747, 198285, 198288, - 198291, 198294, 198297, 198300, 132767, 132769, 198307, 198310, 198313, - 198316, -1, -1, 132783, 132785, 198323, 198326, 198329, 198332, -1, - -1, 132799, 132801, 198339, 198342, 198345, 198348, 198351, 198354, - -1, 132821, -1, 198359, -1, 198362, -1, 198365, 132832, 132834, 198372, - 198375, 198378, 198381, 198384, 198387, 132854, 132856, 198394, 198397, - 198400, 198403, 198406, 198409, 132876, 131719, 132878, 131721, 132880, - 131723, 132882, 131725, 132884, 131734, 132886, 131736, 132888, 131738, - -1, -1, 198426, 198429, 263968, 263972, 263976, 263980, 263984, 263988, - 198456, 198459, 263998, 264002, 264006, 264010, 264014, 264018, 198486, - 198489, 264028, 264032, 264036, 264040, 264044, 264048, 198516, 198519, - 264058, 264062, 264066, 264070, 264074, 264078, 198546, 198549, 264088, - 264092, 264096, 264100, 264104, 264108, 198576, 198579, 264118, 264122, - 264126, 264130, 264134, 264138, 133070, 133072, 198610, 133077, 198615, - -1, 133082, 198620, 133087, 133089, 133091, 131697, 133093, 133095, - 67561, 133095, 133098, 198636, 198639, 133106, 198644, -1, 133111, - 198649, 133116, 131700, 133118, 131702, 133120, 198658, 198661, 198664, - 133131, 133133, 198671, 197248, -1, -1, 133138, 198676, 133143, 133145, - 133147, 131704, -1, 198685, 198688, 198691, 133158, 133160, 198698, - 197263, 133165, 133167, 133169, 198707, 133174, 133176, 133178, 131708, - 133180, 198718, 197230, 67649, -1, -1, 198722, 133189, 198727, -1, - 133194, 198732, 133199, 131706, 133201, 131710, 133203, 131080, 133205, - -1, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, - 65536, 65536, -1, -1, -1, -1, -1, -1, 67671, -1, -1, -1, -1, -1, 133208, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67674, 133211, 198749, - -1, -1, -1, -1, -1, -1, -1, -1, 65536, -1, -1, -1, 133216, 198754, - -1, 133221, 198759, -1, -1, -1, -1, 133226, -1, 133228, -1, -1, -1, - -1, -1, -1, -1, -1, 133230, 133232, 133234, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 264308, -1, -1, -1, -1, -1, -1, -1, 65536, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67704, - 67705, -1, -1, 67706, 67707, 67708, 67709, 67710, 67711, 67712, 67713, - 67714, 67715, 67716, 67717, 67704, 65549, 65542, 65543, 67706, 67707, - 67708, 67709, 67710, 67711, 67712, 67713, 67714, 67715, 67716, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 133254, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 198792, 198795, 67726, - 133263, -1, 198801, 198804, 67735, -1, 133272, 67738, 67739, 67739, - 67739, 66124, 67740, 67741, 67741, 67742, 66146, -1, 67743, 133280, - -1, -1, 67746, 67747, 67748, 67748, 67748, -1, -1, 133285, 198823, - 133290, -1, 67756, -1, 67757, -1, 67756, -1, 67758, 131106, 67759, - 67726, -1, 67760, 67761, 67762, -1, 67763, 65550, 67764, 67765, 67766, - 67767, 67705, -1, -1, -1, 67768, 67769, 67770, 67771, -1, -1, -1, -1, - 67772, 67773, 67760, 67705, 66126, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 198846, 198849, 198852, 198855, 198858, 198861, 198864, 198867, - 198870, 198873, 198876, 198879, 133346, 67741, 133348, 198886, 133353, - 67819, 133356, 198894, 264433, 133365, 67831, 133368, 198906, 67742, - 67726, 67772, 67763, 67705, 133373, 198911, 133378, 67844, 133381, - 198919, 264458, 133390, 66147, 133392, 198930, 66146, 67861, 67773, - 67862, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133399, 133401, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133403, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133405, 133407, - 133409, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 133411, -1, -1, -1, -1, 133413, -1, -1, 133415, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 133417, -1, 133419, -1, -1, -1, -1, -1, 133421, 198959, - -1, 133426, 198964, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 133431, -1, -1, 133433, -1, -1, 133435, -1, 133437, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 133439, -1, 133441, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 133443, 133445, 133447, 133449, 133451, -1, -1, 133453, - 133455, -1, -1, 133457, 133459, -1, -1, -1, -1, -1, -1, 133461, 133463, - -1, -1, 133465, 133467, -1, -1, 133469, 133471, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133473, 133475, 133477, - 133479, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133481, - 133483, 133485, 133487, -1, -1, -1, -1, -1, -1, 133489, 133491, 133493, - 133495, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67961, 67962, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65549, - 65542, 65543, 67706, 67707, 67708, 67709, 67710, 67711, 133499, 133501, - 133503, 133505, 133507, 133509, 133511, 133513, 133515, 133517, 133519, - 199057, 199060, 199063, 199066, 199069, 199072, 199075, 199078, 199081, - 264620, 264624, 264628, 264632, 264636, 264640, 264644, 264648, 264652, - 264656, 264660, 133592, 133594, 133596, 133598, 133600, 133602, 133604, - 133606, 133608, 199146, 199149, 199152, 199155, 199158, 199161, 199164, - 199167, 199170, 199173, 199176, 199179, 199182, 199185, 199188, 199191, - 199194, 199197, 199200, 199203, 199206, 199209, 199212, 199215, 199218, - 199221, 199224, 199227, 199230, 199233, 199236, 199239, 199242, 199245, - 199248, 199251, 199254, 68185, 67759, 67726, 67772, 67761, 67762, 68186, - 67739, 67741, 68187, 67758, 67742, 67763, 67743, 68188, 67746, 67747, - 67748, 68189, 68190, 68191, 67819, 68192, 67831, 68193, 67756, 65539, - 68194, 67861, 67773, 67760, 68195, 67738, 66124, 67705, 66126, 68196, - 66146, 67862, 67717, 65550, 68197, 68198, 66127, 65892, 68199, 68200, - 67844, 66131, 66147, 66132, 68201, 67704, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 264810, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 199278, 133745, 199283, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133750, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 68216, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 68217, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 68218, 68219, 68220, 68221, 68222, 68223, 68224, 68225, - 68226, 68227, 68228, 68229, 68230, 68231, 68232, 68233, 68234, 68235, - 68236, 68237, 68238, 68239, 68240, 68241, 68242, 68243, 68244, 68245, - 68246, 68247, 68248, 68249, 68250, 68251, 68252, 68253, 68254, 68255, - 68256, 68257, 68258, 68259, 68260, 68261, 68262, 68263, 68264, 68265, - 68266, 68267, 68268, 68269, 68270, 68271, 68272, 68273, 68274, 68275, - 68276, 68277, 68278, 68279, 68280, 68281, 68282, 68283, 68284, 68285, - 68286, 68287, 68288, 68289, 68290, 68291, 68292, 68293, 68294, 68295, - 68296, 68297, 68298, 68299, 68300, 68301, 68302, 68303, 68304, 68305, - 68306, 68307, 68308, 68309, 68310, 68311, 68312, 68313, 68314, 68315, - 68316, 68317, 68318, 68319, 68320, 68321, 68322, 68323, 68324, 68325, - 68326, 68327, 68328, 68329, 68330, 68331, 68332, 68333, 68334, 68335, - 68336, 68337, 68338, 68339, 68340, 68341, 68342, 68343, 68344, 68345, - 68346, 68347, 68348, 68349, 68350, 68351, 68352, 68353, 68354, 68355, - 68356, 68357, 68358, 68359, 68360, 68361, 68362, 68363, 68364, 68365, - 68366, 68367, 68368, 68369, 68370, 68371, 68372, 68373, 68374, 68375, - 68376, 68377, 68378, 68379, 68380, 68381, 68382, 68383, 68384, 68385, - 68386, 68387, 68388, 68389, 68390, 68391, 68392, 68393, 68394, 68395, - 68396, 68397, 68398, 68399, 68400, 68401, 68402, 68403, 68404, 68405, - 68406, 68407, 68408, 68409, 68410, 68411, 68412, 68413, 68414, 68415, - 68416, 68417, 68418, 68419, 68420, 68421, 68422, 68423, 68424, 68425, - 68426, 68427, 68428, 68429, 68430, 68431, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 65536, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 68432, -1, 68241, 68433, 68434, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133971, -1, 133973, - -1, 133975, -1, 133977, -1, 133979, -1, 133981, -1, 133983, -1, 133985, - -1, 133987, -1, 133989, -1, 133991, -1, 133993, -1, -1, 133995, -1, - 133997, -1, 133999, -1, -1, -1, -1, -1, -1, 134001, 134003, -1, 134005, - 134007, -1, 134009, 134011, -1, 134013, 134015, -1, 134017, 134019, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 134021, -1, -1, -1, -1, -1, -1, 134023, 134025, - -1, 134027, 134029, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 134031, -1, 134033, -1, 134035, -1, 134037, -1, 134039, -1, 134041, - -1, 134043, -1, 134045, -1, 134047, -1, 134049, -1, 134051, -1, 134053, - -1, -1, 134055, -1, 134057, -1, 134059, -1, -1, -1, -1, -1, -1, 134061, - 134063, -1, 134065, 134067, -1, 134069, 134071, -1, 134073, 134075, - -1, 134077, 134079, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 134081, -1, -1, 134083, 134085, - 134087, 134089, -1, -1, -1, 134091, 134093, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 68559, 68560, 68561, 68562, 68563, - 68564, 68565, 68566, 68567, 68568, 68569, 68570, 68571, 68572, 68573, - 68574, 68575, 68576, 68577, 68578, 68579, 68580, 68581, 68582, 68583, - 68584, 68585, 68586, 68587, 68588, 68589, 68590, 68591, 68592, 68593, - 68594, 68595, 68596, 68597, 68598, 68599, 68600, 68601, 68602, 68603, - 68604, 68605, 68606, 68607, 68608, 68609, 68610, 68611, 68612, 68613, - 68614, 68615, 68616, 68617, 68618, 68619, 68620, 68621, 68622, 68623, - 68624, 68625, 68626, 68627, 68628, 68629, 68630, 68631, 68632, 68633, - 68634, 68635, 68636, 68637, 68638, 68639, 68640, 68641, 68642, 68643, - 68644, 68645, 68646, 68647, 68648, 68649, 68650, 68651, 68652, -1, - -1, -1, 68218, 68224, 68653, 68654, 68655, 68656, 68657, 68658, 68222, - 68659, 68660, 68661, 68662, 68226, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 199735, 199738, 199741, 199744, 199747, 199750, 199753, - 199756, 199759, 199762, 199765, 199768, 199771, 199774, 265313, 265317, - 265321, 265325, 265329, 265333, 265337, 265341, 265345, 265349, 265353, - 265357, 265361, 265365, 265369, -1, -1, -1, 199837, 199840, 199843, - 199846, 199849, 199852, 199855, 199858, 199861, 199864, 199867, 199870, - 199873, 199876, 199879, 199882, 199885, 199888, 199891, 199894, 199897, - 199900, 199903, 199906, 199909, 199912, 199915, 199918, 199921, 199924, - 199927, 199930, 199933, 199936, 199939, 199942, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 134409, 134411, 134413, 134415, 134417, - 134419, 134421, 134423, 134425, 134427, 134429, 134431, 134433, 134435, - 134437, 68559, 68562, 68565, 68567, 68575, 68576, 68579, 68581, 68582, - 68584, 68585, 68586, 68587, 68588, 134439, 134441, 134443, 134445, - 134447, 134449, 134451, 134453, 134455, 134457, 134459, 134461, 134463, - 134465, -1, -1, -1, -1, 68218, 68224, 68653, 68654, 68931, 68932, 68933, - 68229, 68934, 68241, 68291, 68303, 68302, 68292, 68384, 68249, 68289, - 68935, 68936, 68937, 68938, 68939, 68940, 68941, 68942, 68943, 68944, - 68255, 68945, 68946, 68947, 68948, 68949, 68950, 68951, 68952, 68655, - 68656, 68657, 68953, 68954, 68955, 68956, 68957, 68958, 68959, 68960, - 68961, 68962, 134499, 134501, 134503, 134505, 134507, 134509, 134511, - 134513, 134515, 134517, 134519, 134521, 134523, 134525, 134527, 134529, - 134531, 134533, 134535, 134537, 134539, 134541, 134543, 134545, 200083, - 200086, 200089, -1, -1, -1, -1, 69020, 69021, 69022, 69023, 69024, - 69025, 69026, 69027, 69028, 69029, 69030, 69031, 69032, 69033, 69034, - 69035, 69036, 69037, 69038, 69039, 69040, 69041, 69042, 69043, 69044, - 69045, 69046, 69047, 69048, 69049, 69050, 69051, 69052, 69053, 69054, - 69055, 69056, 69057, 69058, 69059, 69060, 69061, 69062, 69063, 69064, - 69065, 69066, -1, 331211, 265680, 331220, 200153, 331228, 200161, 200164, - 396775, 265709, 200177, 200180, 200183, 265722, 265726, 265730, 265734, - 265738, 265742, 265746, 396822, 134684, 396830, 396836, 331306, 265775, - 396851, 396857, 265791, 200259, 200262, 265801, 265805, 331345, 331350, - 200283, 200286, 265825, 200293, 200296, 134763, 134765, 200303, 200306, - 396917, 265851, 331391, 396932, 265866, 200334, 200337, 396948, 265882, - 396958, 200356, 331431, 200364, 265903, 200371, 265910, 331450, 265919, - 331459, 265928, 134860, 331470, 200403, 200406, 265945, 200413, 200416, - 200419, 331494, 265963, 134895, 397041, 200439, 331514, 265983, 265987, - 200455, 200458, 265997, 134929, 266003, 331543, 134940, 397086, 200484, - 134951, 134953, 134955, 134957, 134959, 134961, 134963, 134965, 134967, - 134969, 200507, 200510, 200513, 200516, 200519, 200522, 200525, 200528, - 200531, 200534, 200537, 200540, 200543, 200546, 200549, 200552, 135019, - 135021, 200559, 135026, 135028, -1, -1, -1, -1, 135030, 135032, 135034, - 135036, 266110, 135042, 135044, 135046, 135048, 135050, 135052, 135054, - 135056, 200594, 266133, 135065, 135067, 135069, 135071, 135073, 135075, - 135077, 200615, 200618, 200621, 200624, 135091, 135093, 135095, 135097, - 135099, 135101, 135103, 135105, 135107, 135109, 200647, 200650, 135117, - 200655, 200658, 200661, 135128, 200666, 200669, 266208, 135140, 200678, - 200681, 200684, 200687, 331762, 397303, 135165, 135167, 135169, 135171, - 135173, 135175, 135177, 135179, 135181, 135183, 135185, 135187, 135189, - 135191, 135193, 135195, 135197, 135199, 266273, 135205, 135207, 135209, - 266283, 200751, 135218, 135220, 135222, 135224, 135226, 135228, 135230, - 135232, 135234, 135236, 200774, 135241, 135243, 200781, 200784, 135251, - 266325, 200793, 135260, 135262, 135264, 135266, -1, -1, 135268, 135270, - 135272, 135274, 135276, 135278, 135280, 135282, 135284, 200822, 200825, - 200828, 200831, 200834, 200837, 200840, 200843, 200846, 200849, 200852, - 200855, 200858, 200861, 200864, 200867, 200870, 200873, 200876, 200879, - 200882, 200885, -1, 69816, 69817, 68376, 69818, 69819, 69820, 69821, - 68430, 68430, 69822, 68384, 69823, 69824, 69825, 69826, 69827, 69828, - 69829, 69830, 69831, 69832, 69833, 69834, 69835, 69836, 69837, 69838, - 69839, 69840, 69841, 69842, 69843, 69844, 69845, 69846, 69847, 69848, - 69849, 69850, 69851, 69852, 69853, 69854, 69855, 69856, 69857, 69858, - 69859, 69860, 69861, 69862, 69863, 68342, 69864, 69865, 69866, 69867, - 69868, 69869, 69870, 69871, 69872, 69873, 69874, 68415, 69875, 69876, - 69877, 69878, 69879, 69880, 69881, 69882, 69883, 69884, 69885, 69886, - 69887, 69888, 69889, 69890, 69891, 69892, 69893, 69894, 69895, 69896, - 69897, 69898, 69899, 69900, 69901, 69832, 69902, 69903, 69904, 69905, - 69906, 69907, 69908, 69909, 69910, 69911, 69912, 69913, 69914, 69915, - 69916, 69917, 69918, 69919, 69920, 69921, 68378, 69922, 69923, 69924, - 69925, 69926, 69927, 69928, 69929, 69930, 69931, 69932, 69933, 69934, - 69935, 69936, 68255, 69937, 69938, 69939, 69940, 69941, 69942, 69943, - 69944, 68236, 69945, 69946, 69947, 69948, 69949, 69950, 69951, 69952, - 69953, 69954, 69955, 69956, 69957, 69958, 69959, 69960, 69961, 69962, - 69963, 69964, 69965, 69966, 69920, 69967, 69968, 69969, 69970, 69971, - 69972, 69973, 69974, 69904, 69975, 69976, 69977, 69978, 69979, 69980, - 69981, 69982, 69983, 69984, 69985, 69986, 69987, 69988, 69989, 69990, - 69991, 69992, 69993, 69994, 69832, 69995, 69996, 69997, 69998, 68429, - 69999, 70000, 70001, 70002, 70003, 70004, 70005, 70006, 70007, 70008, - 70009, 70010, 68932, 70011, 70012, 70013, 70014, 70015, 70016, 70017, - 70018, 70019, 69906, 70020, 70021, 70022, 70023, 70024, 70025, 70026, - 70027, 70028, 70029, 70030, 70031, 70032, 68383, 70033, 70034, 70035, - 70036, 70037, 70038, 70039, 70040, 70041, 70042, 70043, 70044, 70045, - 68334, 70046, 70047, 70048, 70049, 70050, 70051, 70052, 70053, 70054, - 70055, 70056, 70057, 70058, 70059, 70060, 70061, 68361, 70062, 68364, - 70063, 70064, 70065, -1, -1, 70066, -1, 70067, -1, -1, 70068, 70069, - 70070, 70071, 70072, 70073, 70074, 70075, 70076, 68341, -1, 70077, - -1, 70078, -1, -1, 70079, 70080, -1, -1, -1, 70081, 70082, 70083, 70084, - -1, -1, 70085, 70086, 70087, 70088, 70089, 70090, 70091, 70092, 70093, - 70094, 70095, 70096, 68262, 70097, 70098, 70099, 70100, 70101, 70102, - 70103, 70104, 70105, 70106, 70107, 70108, 70109, 70110, 70111, 68937, - 70112, 70113, 70114, 70115, 68941, 70116, 70117, 70118, 70119, 70120, - 69956, 70121, 70122, 70123, 70124, 70125, 70126, 70126, 70127, 70128, - 70129, 70130, 70131, 70132, 70133, 70134, 70079, 70135, 70136, 70137, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 135674, 135676, - 135678, 201216, 201219, 135686, 135686, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 135688, 135690, 135692, 135694, 135696, -1, -1, - -1, -1, -1, 135698, -1, 135700, 70166, 67764, 67767, 70167, 70168, - 70169, 70170, 70171, 70172, 67712, 135709, 135711, 201249, 201252, - 135719, 135721, 135723, 135725, 135727, 135729, 135731, 135733, 135735, - -1, 135737, 135739, 135741, 135743, 135745, -1, 135747, -1, 135749, - 135751, -1, 135753, 135755, -1, 135757, 135759, 135761, 135763, 135765, - 135767, 135769, 135771, 135773, 135775, 70241, 70241, 70242, 70242, - 70242, 70242, 70243, 70243, 70243, 70243, 70244, 70244, 70244, 70244, - 70245, 70245, 70245, 70245, 70246, 70246, 70246, 70246, 70247, 70247, - 70247, 70247, 70248, 70248, 70248, 70248, 70249, 70249, 70249, 70249, - 70250, 70250, 70250, 70250, 70251, 70251, 70251, 70251, 70252, 70252, - 70252, 70252, 70253, 70253, 70253, 70253, 70254, 70254, 70255, 70255, - 70256, 70256, 70257, 70257, 70258, 70258, 70259, 70259, 70260, 70260, - 70260, 70260, 70261, 70261, 70261, 70261, 70262, 70262, 70262, 70262, - 70263, 70263, 70263, 70263, 70264, 70264, 70265, 70265, 70265, 70265, - 131874, 131874, 70266, 70266, 70266, 70266, 70267, 70267, 70267, 70267, - 70268, 70268, 131878, 131878, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 70269, 70269, 70269, 70269, 70270, 70270, 70271, - 70271, 70272, 70272, 131870, 70273, 70273, 70274, 70274, 70275, 70275, - 70276, 70276, 70276, 70276, 70277, 70277, 201350, 201350, 201353, 201353, - 201356, 201356, 201359, 201359, 201362, 201362, 201365, 201365, 201368, - 201368, 201368, 201371, 201371, 201371, 70302, 70302, 70302, 70302, - 201375, 201378, 201381, 201371, 201384, 135851, 135853, 135855, 135857, - 135859, 135861, 135863, 135865, 135867, 135869, 135871, 135873, 135875, - 135877, 135879, 135881, 135883, 135885, 135887, 135889, 135891, 135893, - 135895, 135897, 135899, 135901, 135903, 135905, 135907, 135909, 135911, - 135913, 135915, 135917, 135919, 135921, 135923, 135925, 135927, 135929, - 135931, 135933, 135935, 135937, 135939, 135941, 135943, 135945, 135947, - 135949, 135951, 135953, 135955, 135957, 135959, 135961, 135963, 135965, - 135967, 135969, 135971, 135973, 135975, 135977, 135979, 135981, 135983, - 135985, 135987, 135989, 135991, 135993, 135995, 135997, 135999, 136001, - 136003, 136005, 136007, 136009, 136011, 136013, 136015, 136017, 136019, - 136021, 136023, 136025, 136027, 201565, 201568, 201571, 201574, 201577, - 201580, 201583, 201586, 201381, 201589, 201371, 201384, 136056, 136058, - 135857, 136060, 135859, 135861, 136062, 136064, 135869, 136066, 135871, - 135873, 136068, 136070, 135877, 136072, 135879, 135881, 135939, 135941, - 135947, 135949, 135951, 135959, 135961, 135963, 135965, 135973, 135975, - 135977, 136074, 135985, 136076, 136078, 135997, 136080, 135999, 136001, - 136027, 136082, 136084, 136017, 136086, 136019, 136021, 201375, 201378, - 201624, 201381, 201627, 135851, 135853, 135855, 135857, 136094, 135863, - 135865, 135867, 135869, 136096, 135877, 135883, 135885, 135887, 135889, - 135891, 135895, 135897, 135899, 135901, 135903, 135905, 136098, 135907, - 135909, 135911, 135913, 135915, 135917, 135921, 135923, 135925, 135927, - 135929, 135931, 135933, 135935, 135937, 135943, 135945, 135953, 135955, - 135957, 135959, 135961, 135967, 135969, 135971, 135973, 136100, 135979, - 135981, 135983, 135985, 135991, 135993, 135995, 135997, 136102, 136003, - 136005, 136104, 136011, 136013, 136015, 136017, 136106, 201381, 201627, - 135857, 136094, 135869, 136096, 135877, 136108, 135903, 136110, 136112, - 136114, 135959, 135961, 135973, 135997, 136102, 136017, 136106, 201652, - 201655, 201658, 136125, 136127, 136129, 136131, 136133, 136135, 136137, - 136139, 136141, 136143, 136145, 136147, 136149, 136151, 136153, 136155, - 136157, 136159, 136161, 136163, 136165, 136167, 136169, 136112, 136171, - 136173, 136175, 136177, 136125, 136127, 136129, 136131, 136133, 136135, - 136137, 136139, 136141, 136143, 136145, 136147, 136149, 136151, 136153, - 136155, 136157, 136159, 136161, 136163, 136165, 136167, 136169, 136112, - 136171, 136173, 136175, 136177, 136165, 136167, 136169, 136112, 136110, - 136114, 135919, 135897, 135899, 135901, 136165, 136167, 136169, 135919, - 135921, 136179, 136179, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 201717, 201720, 201720, 201723, 201726, - 201729, 201732, 201735, 201738, 201738, 201741, 201744, 201747, 201750, - 201753, 201756, 201756, 201759, 201762, 201762, 201765, 201765, 201768, - 201771, 201771, 201774, 201777, 201777, 201780, 201780, 201783, 201786, - 201786, 201789, 201789, 201792, 201795, 201798, 201801, 201801, 201804, - 201807, 201810, 201813, 201816, 201816, 201819, 201822, 201825, 201828, - 201831, 201834, 201834, 201837, 201837, 201840, 201840, 201843, 201846, - 201849, 201852, 201855, 201858, 201861, -1, -1, 201864, 201867, 201870, - 201873, 201876, 201879, 201879, 201882, 201885, 201888, 201891, 201891, - 201894, 201897, 201900, 201903, 201906, 201909, 201912, 201915, 201918, - 201921, 201924, 201927, 201930, 201933, 201936, 201939, 201942, 201945, - 201948, 201951, 201954, 201957, 201819, 201825, 201960, 201963, 201966, - 201969, 201972, 201975, 201972, 201966, 201978, 201981, 201984, 201987, - 201990, 201975, 201798, 201768, 201993, 201996, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 201999, 202002, 267541, 267545, 267549, 267553, 267557, 267561, - 267565, 202033, 1185076, 529734, 267598, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133211, 70994, 70995, 70996, - 70996, 67715, 67716, 70997, 70998, 70999, 71000, 71001, 71002, 71003, - 71004, 67961, 67962, 71005, 71006, 71007, 71008, -1, -1, -1, -1, 133228, - 133228, 133228, 133228, 70996, 70996, 70996, 71009, 71010, 67674, -1, - 66157, 71011, 71012, 71013, 70994, 67715, 67716, 70997, 70998, 70999, - 71000, 71014, 71015, 71016, 67712, 71017, 71018, 71019, 67714, -1, - 71020, 71021, 71022, 71023, -1, -1, -1, -1, 136560, 136562, 136564, - -1, 136566, -1, 136568, 136570, 136572, 136574, 136576, 136578, 136580, - 136582, 136584, 136586, 71052, 131856, 131856, 131858, 131858, 131860, - 131860, 131862, 131862, 131864, 131864, 131864, 131864, 71053, 71053, - 71054, 71054, 71054, 71054, 71055, 71055, 71056, 71056, 71056, 71056, - 71057, 71057, 71057, 71057, 71058, 71058, 71058, 71058, 71059, 71059, - 71059, 71059, 71060, 71060, 71060, 71060, 71061, 71061, 71062, 71062, - 71063, 71063, 71064, 71064, 71065, 71065, 71065, 71065, 71066, 71066, - 71066, 71066, 71067, 71067, 71067, 71067, 71068, 71068, 71068, 71068, - 71069, 71069, 71069, 71069, 71070, 71070, 71070, 71070, 71071, 71071, - 71071, 71071, 71072, 71072, 71072, 71072, 71073, 71073, 71073, 71073, - 71074, 71074, 71074, 71074, 71075, 71075, 71075, 71075, 71076, 71076, - 71076, 71076, 71077, 71077, 71077, 71077, 71078, 71078, 71078, 71078, - 71079, 71079, 71079, 71079, 71080, 71080, 70277, 70277, 71081, 71081, - 71081, 71081, 202154, 202154, 202157, 202157, 202160, 202160, 136627, - 136627, -1, -1, -1, -1, 71013, 71093, 71014, 71021, 71022, 71015, 71094, - 67715, 67716, 71016, 67712, 71009, 71017, 67674, 71095, 67704, 65549, - 65542, 65543, 67706, 67707, 67708, 67709, 67710, 67711, 71011, 66157, - 71018, 67714, 71019, 71012, 71023, 68185, 67759, 67726, 67772, 67761, - 67762, 68186, 67739, 67741, 68187, 67758, 67742, 67763, 67743, 68188, - 67746, 67747, 67748, 68189, 68190, 68191, 67819, 68192, 67831, 68193, - 67756, 71096, 71020, 71097, 71098, 70996, 67649, 65539, 68194, 67861, - 67773, 67760, 68195, 67738, 66124, 67705, 66126, 68196, 66146, 67862, - 67717, 65550, 68197, 68198, 66127, 65892, 68199, 68200, 67844, 66131, - 66147, 66132, 68201, 70997, 71099, 70998, 71100, 71101, 71102, 71103, - 71005, 71006, 71010, 71104, 69066, 71105, 71106, 71107, 71108, 71109, - 71110, 71111, 71112, 71113, 71114, 69020, 69021, 69022, 69023, 69024, - 69025, 69026, 69027, 69028, 69029, 69030, 69031, 69032, 69033, 69034, - 69035, 69036, 69037, 69038, 69039, 69040, 69041, 69042, 69043, 69044, - 69045, 69046, 69047, 69048, 69049, 69050, 69051, 69052, 69053, 69054, - 69055, 69056, 69057, 69058, 69059, 69060, 69061, 69062, 69063, 71115, - 71116, 71117, 68610, 68559, 68560, 68561, 68562, 68563, 68564, 68565, - 68566, 68567, 68568, 68569, 68570, 68571, 68572, 68573, 68574, 68575, - 68576, 68577, 68578, 68579, 68580, 68581, 68582, 68583, 68584, 68585, - 68586, 68587, 68588, -1, -1, -1, 68589, 68590, 68591, 68592, 68593, - 68594, -1, -1, 68595, 68596, 68597, 68598, 68599, 68600, -1, -1, 68601, - 68602, 68603, 68604, 68605, 68606, -1, -1, 68607, 68608, 68609, -1, - -1, -1, 71118, 71119, 71120, 131076, 71121, 71122, 71123, -1, 71124, - 71125, 71126, 71127, 71128, 71129, 71130, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 136667, 136669, 202207, 202210, 202213, 202216, 202219, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 136686, 136688, 202226, 202229, 202232, 202235, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 68185, 67759, 67726, 67772, 67761, 67762, - 68186, 67739, 67741, 68187, 67758, 67742, 67763, 67743, 68188, 67746, - 67747, 67748, 68189, 68190, 68191, 67819, 68192, 67831, 68193, 67756, - 65539, 68194, 67861, 67773, 67760, 68195, 67738, 66124, 67705, 66126, - 68196, 66146, 67862, 67717, 65550, 68197, 68198, 66127, 65892, 68199, - 68200, 67844, 66131, 66147, 66132, 68201, 68185, 67759, 67726, 67772, - 67761, 67762, 68186, 67739, 67741, 68187, 67758, 67742, 67763, 67743, - 68188, 67746, 67747, 67748, 68189, 68190, 68191, 67819, 68192, 67831, - 68193, 67756, 65539, 68194, 67861, 67773, 67760, 68195, 67738, -1, - 67705, 66126, 68196, 66146, 67862, 67717, 65550, 68197, 68198, 66127, - 65892, 68199, 68200, 67844, 66131, 66147, 66132, 68201, 68185, 67759, - 67726, 67772, 67761, 67762, 68186, 67739, 67741, 68187, 67758, 67742, - 67763, 67743, 68188, 67746, 67747, 67748, 68189, 68190, 68191, 67819, - 68192, 67831, 68193, 67756, 65539, 68194, 67861, 67773, 67760, 68195, - 67738, 66124, 67705, 66126, 68196, 66146, 67862, 67717, 65550, 68197, - 68198, 66127, 65892, 68199, 68200, 67844, 66131, 66147, 66132, 68201, - 68185, -1, 67726, 67772, -1, -1, 68186, -1, -1, 68187, 67758, -1, -1, - 67743, 68188, 67746, 67747, -1, 68189, 68190, 68191, 67819, 68192, - 67831, 68193, 67756, 65539, 68194, 67861, 67773, -1, 68195, -1, 66124, - 67705, 66126, 68196, -1, 67862, 67717, -1, 68197, 68198, 66127, 65892, - 68199, 68200, 67844, 66131, 66147, 66132, 68201, 68185, 67759, 67726, - 67772, 67761, 67762, 68186, 67739, 67741, 68187, 67758, 67742, 67763, - 67743, 68188, 67746, 67747, 67748, 68189, 68190, 68191, 67819, 68192, - 67831, 68193, 67756, 65539, 68194, 67861, 67773, 67760, 68195, 67738, - 66124, 67705, 66126, 68196, 66146, 67862, 67717, 65550, 68197, 68198, - 66127, 65892, 68199, 68200, 67844, 66131, 66147, 66132, 68201, 68185, - 67759, -1, 67772, 67761, 67762, 68186, -1, -1, 68187, 67758, 67742, - 67763, 67743, 68188, 67746, 67747, -1, 68189, 68190, 68191, 67819, - 68192, 67831, 68193, -1, 65539, 68194, 67861, 67773, 67760, 68195, - 67738, 66124, 67705, 66126, 68196, 66146, 67862, 67717, 65550, 68197, - 68198, 66127, 65892, 68199, 68200, 67844, 66131, 66147, 66132, 68201, - 68185, 67759, -1, 67772, 67761, 67762, 68186, -1, 67741, 68187, 67758, - 67742, 67763, -1, 68188, -1, -1, -1, 68189, 68190, 68191, 67819, 68192, - 67831, 68193, -1, 65539, 68194, 67861, 67773, 67760, 68195, 67738, - 66124, 67705, 66126, 68196, 66146, 67862, 67717, 65550, 68197, 68198, - 66127, 65892, 68199, 68200, 67844, 66131, 66147, 66132, 68201, 68185, - 67759, 67726, 67772, 67761, 67762, 68186, 67739, 67741, 68187, 67758, - 67742, 67763, 67743, 68188, 67746, 67747, 67748, 68189, 68190, 68191, - 67819, 68192, 67831, 68193, 67756, 65539, 68194, 67861, 67773, 67760, - 68195, 67738, 66124, 67705, 66126, 68196, 66146, 67862, 67717, 65550, - 68197, 68198, 66127, 65892, 68199, 68200, 67844, 66131, 66147, 66132, - 68201, 68185, 67759, 67726, 67772, 67761, 67762, 68186, 67739, 67741, - 68187, 67758, 67742, 67763, 67743, 68188, 67746, 67747, 67748, 68189, - 68190, 68191, 67819, 68192, 67831, 68193, 67756, 65539, 68194, 67861, - 67773, 67760, 68195, 67738, 66124, 67705, 66126, 68196, 66146, 67862, - 67717, 65550, 68197, 68198, 66127, 65892, 68199, 68200, 67844, 66131, - 66147, 66132, 68201, 68185, 67759, 67726, 67772, 67761, 67762, 68186, - 67739, 67741, 68187, 67758, 67742, 67763, 67743, 68188, 67746, 67747, - 67748, 68189, 68190, 68191, 67819, 68192, 67831, 68193, 67756, 65539, - 68194, 67861, 67773, 67760, 68195, 67738, 66124, 67705, 66126, 68196, - 66146, 67862, 67717, 65550, 68197, 68198, 66127, 65892, 68199, 68200, - 67844, 66131, 66147, 66132, 68201, 68185, 67759, 67726, 67772, 67761, - 67762, 68186, 67739, 67741, 68187, 67758, 67742, 67763, 67743, 68188, - 67746, 67747, 67748, 68189, 68190, 68191, 67819, 68192, 67831, 68193, - 67756, 65539, 68194, 67861, 67773, 67760, 68195, 67738, 66124, 67705, - 66126, 68196, 66146, 67862, 67717, 65550, 68197, 68198, 66127, 65892, - 68199, 68200, 67844, 66131, 66147, 66132, 68201, 68185, 67759, 67726, - 67772, 67761, 67762, 68186, 67739, 67741, 68187, 67758, 67742, 67763, - 67743, 68188, 67746, 67747, 67748, 68189, 68190, 68191, 67819, 68192, - 67831, 68193, 67756, 65539, 68194, 67861, 67773, 67760, 68195, 67738, - 66124, 67705, 66126, 68196, 66146, 67862, 67717, 65550, 68197, 68198, - 66127, 65892, 68199, 68200, 67844, 66131, 66147, 66132, 68201, 68185, - 67759, 67726, 67772, 67761, 67762, 68186, 67739, 67741, 68187, 67758, - 67742, 67763, 67743, 68188, 67746, 67747, 67748, 68189, 68190, 68191, - 67819, 68192, 67831, 68193, 67756, 65539, 68194, 67861, 67773, 67760, - 68195, 67738, 66124, 67705, 66126, 68196, 66146, 67862, 67717, 65550, - 68197, 68198, 66127, 65892, 68199, 68200, 67844, 66131, 66147, 66132, - 68201, -1, -1, -1, -1, 71166, 71167, 67769, 71168, 71169, 71170, 71171, - 66212, 71172, 71173, 71174, 71175, 71176, 71177, 71178, 67770, 71179, - 66212, 71180, 71181, 66206, 71182, 71183, 71184, 67757, 71185, 71186, - 66204, 67768, 71187, 66213, 71188, 71189, 66205, 67561, 66209, 71190, - 65546, 71191, 71192, 71193, 66208, 66210, 66211, 71194, 71195, 71196, - 66207, 71197, 71198, 71199, 71200, 66213, 66205, 66209, 66207, 66210, - 66208, 71166, 71167, 67769, 71168, 71169, 71170, 71171, 66212, 71172, - 71173, 71174, 71175, 71176, 71177, 71178, 67770, 71179, 66212, 71180, - 71181, 66206, 71182, 71183, 71184, 67757, 71185, 71186, 66204, 67768, - 71187, 66213, 71188, 71189, 66205, 67561, 66209, 71190, 65546, 71191, - 71192, 71193, 66208, 66210, 66211, 71194, 71195, 71196, 66207, 71197, - 71198, 71199, 71200, 66213, 66205, 66209, 66207, 66210, 66208, 71166, - 71167, 67769, 71168, 71169, 71170, 71171, 66212, 71172, 71173, 71174, - 71175, 71176, 71177, 71178, 67770, 71179, 66212, 71180, 71181, 66206, - 71182, 71183, 71184, 67757, 71185, 71186, 66204, 67768, 71187, 66213, - 71188, 71189, 66205, 67561, 66209, 71190, 65546, 71191, 71192, 71193, - 66208, 66210, 66211, 71194, 71195, 71196, 66207, 71197, 71198, 71199, - 71200, 66213, 66205, 66209, 66207, 66210, 66208, 71166, 71167, 67769, - 71168, 71169, 71170, 71171, 66212, 71172, 71173, 71174, 71175, 71176, - 71177, 71178, 67770, 71179, 66212, 71180, 71181, 66206, 71182, 71183, - 71184, 67757, 71185, 71186, 66204, 67768, 71187, 66213, 71188, 71189, - 66205, 67561, 66209, 71190, 65546, 71191, 71192, 71193, 66208, 66210, - 66211, 71194, 71195, 71196, 66207, 71197, 71198, 71199, 71200, 66213, - 66205, 66209, 66207, 66210, 66208, 71166, 71167, 67769, 71168, 71169, - 71170, 71171, 66212, 71172, 71173, 71174, 71175, 71176, 71177, 71178, - 67770, 71179, 66212, 71180, 71181, 66206, 71182, 71183, 71184, 67757, - 71185, 71186, 66204, 67768, 71187, 66213, 71188, 71189, 66205, 67561, - 66209, 71190, 65546, 71191, 71192, 71193, 66208, 66210, 66211, 71194, - 71195, 71196, 66207, 71197, 71198, 71199, 71200, 66213, 66205, 66209, - 66207, 66210, 66208, -1, -1, -1, -1, 67704, 65549, 65542, 65543, 67706, - 67707, 67708, 67709, 67710, 67711, 67704, 65549, 65542, 65543, 67706, - 67707, 67708, 67709, 67710, 67711, 67704, 65549, 65542, 65543, 67706, - 67707, 67708, 67709, 67710, 67711, 67704, 65549, 65542, 65543, 67706, - 67707, 67708, 67709, 67710, 67711, 67704, 65549, 65542, 65543, 67706, - 67707, 67708, 67709, 67710, 67711, 71201, 71202, 71203, 71204, 71205, - 70085, 71206, 71207, 71208, 71209, 70086, 71210, 71211, 71212, 70087, - 71213, 71214, 71215, 71216, 71217, 71218, 71219, 71220, 71221, 71222, - 71223, 71224, 71225, 71226, 68234, 71227, 71228, 71229, 71230, 71231, - 71232, 71233, 71234, 70088, 70089, 71235, 71236, 71237, 69908, 71238, - 70090, 71239, 71240, 71241, 71242, 71242, 71242, 71243, 71244, 71245, - 71246, 71247, 71248, 71249, 71250, 71251, 71252, 71253, 71254, 71255, - 71256, 71257, 71258, 71259, 71260, 71260, 71261, 71262, 71263, 71264, - 71265, 70092, 71266, 71267, 71268, 70054, 71269, 71270, 71271, 71272, - 71273, 71274, 71275, 71276, 71277, 71278, 71279, 71280, 71281, 71282, - 71283, 71284, 71285, 71286, 71287, 71288, 71289, 71290, 71291, 71292, - 71293, 71294, 71294, 71295, 71296, 71297, 69904, 71298, 71299, 71300, - 71301, 71302, 68260, 71303, 71304, 68262, 71305, 71306, 71307, 71308, - 71309, 71310, 71311, 71312, 71313, 71314, 71315, 71316, 71317, 71318, - 71319, 71320, 71321, 71322, 71323, 71324, 71325, 69852, 71326, 68272, - 71327, 71327, 71328, 71329, 71329, 71330, 71331, 71332, 71333, 71334, - 71335, 71336, 71337, 71338, 71339, 71340, 71341, 71342, 70097, 71343, - 71344, 71345, 71346, 71347, 71346, 71348, 70099, 71349, 71350, 71351, - 71352, 70100, 69825, 71353, 71354, 71355, 71356, 71357, 71358, 71359, - 71360, 71361, 71362, 71363, 71364, 71365, 71366, 71367, 71368, 71369, - 71370, 71371, 71372, 71373, 71374, 70101, 71375, 71376, 71377, 71378, - 71379, 71380, 70103, 71381, 71382, 71383, 71384, 71385, 71386, 71387, - 71388, 69853, 71389, 71390, 71391, 71392, 71393, 71394, 71395, 71396, - 71397, 70104, 71398, 71399, 71400, 71401, 71402, 71403, 71404, 71405, - 71406, 71407, 71408, 71409, 71410, 71411, 71412, 71413, 71414, 71415, - 69921, 71416, 71417, 71418, 71419, 71420, 71421, 71422, 71423, 71424, - 71425, 71426, 70105, 70004, 71427, 71428, 71429, 71430, 71431, 71432, - 71433, 71434, 71435, 71436, 71437, 71438, 71439, 71440, 71441, 71442, - 71443, 71444, 71445, 71446, 71447, 71448, 71449, 71450, 71451, 71452, - 71453, 71454, 71455, 71456, 71457, 71458, 71459, 71460, 71461, 71462, - 71463, 71464, 71465, 71466, 71467, 71468, 71468, 71469, 71470, 71471, - 71472, 71473, 71474, 71475, 71476, 71477, 71478, 69907, 71479, 71480, - 71481, 71482, 71483, 71484, 71485, 71486, 71487, 71488, 71489, 71490, - 71491, 71492, 71492, 71493, 71494, 71495, 71496, 71497, 71498, 71499, - 69870, 71500, 71501, 71502, 70115, 71503, 71504, 70074, 71505, 71506, - 70118, 71507, 71508, 71509, 71510, 71510, 71511, 71512, 71513, 71514, - 71515, 71516, 71517, 71518, 71519, 71520, 71521, 71522, 71523, 71524, - 71525, 71526, 71527, 71528, 71529, 71530, 71531, 71532, 71533, 71534, - 71535, 71536, 71537, 70124, 71538, 71539, 71540, 71541, 71542, 71543, - 71544, 71545, 71546, 71547, 71548, 71549, 71550, 71551, 71552, 71553, - 71328, 71554, 71555, 71556, 71557, 71558, 71559, 71560, 71561, 71562, - 71563, 71564, 71565, 69924, 71566, 71567, 71568, 71569, 71570, 71571, - 70127, 71572, 71573, 71574, 71575, 71576, 71577, 71578, 71579, 71580, - 71581, 71582, 71583, 71584, 71585, 71586, 71587, 71588, 71589, 71590, - 71591, 69865, 71592, 71593, 71594, 71595, 71596, 71597, 71598, 71599, - 71600, 71601, 71602, 71603, 71604, 71605, 71606, 68362, 71607, 71608, - 71609, 71610, 71611, 71612, 71613, 71614, 71615, 71616, 71617, 71618, - 71619, 68369, 71620, 71621, 71622, 71623, 71624, 71625, 71626, 71627, - 71628, 71629, 71630, 71631, 71632, 71633, 71634, 71635, 71636, 71637, - 71638, 71639, 71640, 71641, 71642, 71643, 71644, 71645, 71646, 71647, - 71648, 71649, 71650, 71651, 71652, 71653, 71654, 71655, 71656, 71657, - 71658, 71659, 71660, 71661, 71662, 71663, 71663, 71664, 71665, 71666, - 71667, 71668, 71669, 71670, 71671, 71672, 71673, 71674, 71675, 71676, - 71677, 71678, 71679, 71680, 71681, 71682, 71683, 71684, 68417, 71685, - 68421, 71686, 71687, 71688, 71689, 68426, 71690, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 -}; - -/* - * List of decomposition sequences - */ - -static int decompList[] = { - 32, 32, 776, 97, 32, 772, 50, 51, 32, 769, 956, 32, 807, 49, 111, 49, - 8260, 52, 49, 8260, 50, 51, 8260, 52, 65, 768, 65, 769, 65, 770, 65, - 771, 65, 776, 65, 778, 67, 807, 69, 768, 69, 769, 69, 770, 69, 776, - 73, 768, 73, 769, 73, 770, 73, 776, 78, 771, 79, 768, 79, 769, 79, - 770, 79, 771, 79, 776, 85, 768, 85, 769, 85, 770, 85, 776, 89, 769, - 97, 768, 97, 769, 97, 770, 97, 771, 97, 776, 97, 778, 99, 807, 101, - 768, 101, 769, 101, 770, 101, 776, 105, 768, 105, 769, 105, 770, 105, - 776, 110, 771, 111, 768, 111, 769, 111, 770, 111, 771, 111, 776, 117, - 768, 117, 769, 117, 770, 117, 776, 121, 769, 121, 776, 65, 772, 97, - 772, 65, 774, 97, 774, 65, 808, 97, 808, 67, 769, 99, 769, 67, 770, - 99, 770, 67, 775, 99, 775, 67, 780, 99, 780, 68, 780, 100, 780, 69, - 772, 101, 772, 69, 774, 101, 774, 69, 775, 101, 775, 69, 808, 101, - 808, 69, 780, 101, 780, 71, 770, 103, 770, 71, 774, 103, 774, 71, 775, - 103, 775, 71, 807, 103, 807, 72, 770, 104, 770, 73, 771, 105, 771, - 73, 772, 105, 772, 73, 774, 105, 774, 73, 808, 105, 808, 73, 775, 73, - 74, 105, 106, 74, 770, 106, 770, 75, 807, 107, 807, 76, 769, 108, 769, - 76, 807, 108, 807, 76, 780, 108, 780, 76, 183, 108, 183, 78, 769, 110, - 769, 78, 807, 110, 807, 78, 780, 110, 780, 700, 110, 79, 772, 111, - 772, 79, 774, 111, 774, 79, 779, 111, 779, 82, 769, 114, 769, 82, 807, - 114, 807, 82, 780, 114, 780, 83, 769, 115, 769, 83, 770, 115, 770, - 83, 807, 115, 807, 83, 780, 115, 780, 84, 807, 116, 807, 84, 780, 116, - 780, 85, 771, 117, 771, 85, 772, 117, 772, 85, 774, 117, 774, 85, 778, - 117, 778, 85, 779, 117, 779, 85, 808, 117, 808, 87, 770, 119, 770, - 89, 770, 121, 770, 89, 776, 90, 769, 122, 769, 90, 775, 122, 775, 90, - 780, 122, 780, 115, 79, 795, 111, 795, 85, 795, 117, 795, 68, 90, 780, - 68, 122, 780, 100, 122, 780, 76, 74, 76, 106, 108, 106, 78, 74, 78, - 106, 110, 106, 65, 780, 97, 780, 73, 780, 105, 780, 79, 780, 111, 780, - 85, 780, 117, 780, 85, 776, 772, 117, 776, 772, 85, 776, 769, 117, - 776, 769, 85, 776, 780, 117, 776, 780, 85, 776, 768, 117, 776, 768, - 65, 776, 772, 97, 776, 772, 65, 775, 772, 97, 775, 772, 198, 772, 230, - 772, 71, 780, 103, 780, 75, 780, 107, 780, 79, 808, 111, 808, 79, 808, - 772, 111, 808, 772, 439, 780, 658, 780, 106, 780, 68, 90, 68, 122, - 100, 122, 71, 769, 103, 769, 78, 768, 110, 768, 65, 778, 769, 97, 778, - 769, 198, 769, 230, 769, 216, 769, 248, 769, 65, 783, 97, 783, 65, - 785, 97, 785, 69, 783, 101, 783, 69, 785, 101, 785, 73, 783, 105, 783, - 73, 785, 105, 785, 79, 783, 111, 783, 79, 785, 111, 785, 82, 783, 114, - 783, 82, 785, 114, 785, 85, 783, 117, 783, 85, 785, 117, 785, 83, 806, - 115, 806, 84, 806, 116, 806, 72, 780, 104, 780, 65, 775, 97, 775, 69, - 807, 101, 807, 79, 776, 772, 111, 776, 772, 79, 771, 772, 111, 771, - 772, 79, 775, 111, 775, 79, 775, 772, 111, 775, 772, 89, 772, 121, - 772, 104, 614, 106, 114, 633, 635, 641, 119, 121, 32, 774, 32, 775, - 32, 778, 32, 808, 32, 771, 32, 779, 611, 108, 120, 661, 768, 769, 787, - 776, 769, 697, 32, 837, 59, 32, 776, 769, 913, 769, 183, 917, 769, - 919, 769, 921, 769, 927, 769, 933, 769, 937, 769, 953, 776, 769, 921, - 776, 933, 776, 945, 769, 949, 769, 951, 769, 953, 769, 965, 776, 769, - 953, 776, 965, 776, 959, 769, 965, 769, 969, 769, 946, 952, 933, 966, - 960, 954, 961, 962, 920, 949, 1045, 768, 1045, 776, 1043, 769, 1030, - 776, 1050, 769, 1048, 768, 1059, 774, 1048, 774, 1080, 774, 1077, 768, - 1077, 776, 1075, 769, 1110, 776, 1082, 769, 1080, 768, 1091, 774, 1140, - 783, 1141, 783, 1046, 774, 1078, 774, 1040, 774, 1072, 774, 1040, 776, - 1072, 776, 1045, 774, 1077, 774, 1240, 776, 1241, 776, 1046, 776, 1078, - 776, 1047, 776, 1079, 776, 1048, 772, 1080, 772, 1048, 776, 1080, 776, - 1054, 776, 1086, 776, 1256, 776, 1257, 776, 1069, 776, 1101, 776, 1059, - 772, 1091, 772, 1059, 776, 1091, 776, 1059, 779, 1091, 779, 1063, 776, - 1095, 776, 1067, 776, 1099, 776, 1381, 1410, 1575, 1619, 1575, 1620, - 1608, 1620, 1575, 1621, 1610, 1620, 1575, 1652, 1608, 1652, 1735, 1652, - 1610, 1652, 1749, 1620, 1729, 1620, 1746, 1620, 2344, 2364, 2352, 2364, - 2355, 2364, 2325, 2364, 2326, 2364, 2327, 2364, 2332, 2364, 2337, 2364, - 2338, 2364, 2347, 2364, 2351, 2364, 2503, 2494, 2503, 2519, 2465, 2492, - 2466, 2492, 2479, 2492, 2610, 2620, 2616, 2620, 2582, 2620, 2583, 2620, - 2588, 2620, 2603, 2620, 2887, 2902, 2887, 2878, 2887, 2903, 2849, 2876, - 2850, 2876, 2962, 3031, 3014, 3006, 3015, 3006, 3014, 3031, 3142, 3158, - 3263, 3285, 3270, 3285, 3270, 3286, 3270, 3266, 3270, 3266, 3285, 3398, - 3390, 3399, 3390, 3398, 3415, 3545, 3530, 3545, 3535, 3545, 3535, 3530, - 3545, 3551, 3661, 3634, 3789, 3762, 3755, 3737, 3755, 3745, 3851, 3906, - 4023, 3916, 4023, 3921, 4023, 3926, 4023, 3931, 4023, 3904, 4021, 3953, - 3954, 3953, 3956, 4018, 3968, 4018, 3953, 3968, 4019, 3968, 4019, 3953, - 3968, 3953, 3968, 3986, 4023, 3996, 4023, 4001, 4023, 4006, 4023, 4011, - 4023, 3984, 4021, 4133, 4142, 65, 805, 97, 805, 66, 775, 98, 775, 66, - 803, 98, 803, 66, 817, 98, 817, 67, 807, 769, 99, 807, 769, 68, 775, - 100, 775, 68, 803, 100, 803, 68, 817, 100, 817, 68, 807, 100, 807, - 68, 813, 100, 813, 69, 772, 768, 101, 772, 768, 69, 772, 769, 101, - 772, 769, 69, 813, 101, 813, 69, 816, 101, 816, 69, 807, 774, 101, - 807, 774, 70, 775, 102, 775, 71, 772, 103, 772, 72, 775, 104, 775, - 72, 803, 104, 803, 72, 776, 104, 776, 72, 807, 104, 807, 72, 814, 104, - 814, 73, 816, 105, 816, 73, 776, 769, 105, 776, 769, 75, 769, 107, - 769, 75, 803, 107, 803, 75, 817, 107, 817, 76, 803, 108, 803, 76, 803, - 772, 108, 803, 772, 76, 817, 108, 817, 76, 813, 108, 813, 77, 769, - 109, 769, 77, 775, 109, 775, 77, 803, 109, 803, 78, 775, 110, 775, - 78, 803, 110, 803, 78, 817, 110, 817, 78, 813, 110, 813, 79, 771, 769, - 111, 771, 769, 79, 771, 776, 111, 771, 776, 79, 772, 768, 111, 772, - 768, 79, 772, 769, 111, 772, 769, 80, 769, 112, 769, 80, 775, 112, - 775, 82, 775, 114, 775, 82, 803, 114, 803, 82, 803, 772, 114, 803, - 772, 82, 817, 114, 817, 83, 775, 115, 775, 83, 803, 115, 803, 83, 769, - 775, 115, 769, 775, 83, 780, 775, 115, 780, 775, 83, 803, 775, 115, - 803, 775, 84, 775, 116, 775, 84, 803, 116, 803, 84, 817, 116, 817, - 84, 813, 116, 813, 85, 804, 117, 804, 85, 816, 117, 816, 85, 813, 117, - 813, 85, 771, 769, 117, 771, 769, 85, 772, 776, 117, 772, 776, 86, - 771, 118, 771, 86, 803, 118, 803, 87, 768, 119, 768, 87, 769, 119, - 769, 87, 776, 119, 776, 87, 775, 119, 775, 87, 803, 119, 803, 88, 775, - 120, 775, 88, 776, 120, 776, 89, 775, 121, 775, 90, 770, 122, 770, - 90, 803, 122, 803, 90, 817, 122, 817, 104, 817, 116, 776, 119, 778, - 121, 778, 97, 702, 65, 803, 97, 803, 65, 777, 97, 777, 65, 770, 769, - 97, 770, 769, 65, 770, 768, 97, 770, 768, 65, 770, 777, 97, 770, 777, - 65, 770, 771, 97, 770, 771, 65, 803, 770, 97, 803, 770, 65, 774, 769, - 97, 774, 769, 65, 774, 768, 97, 774, 768, 65, 774, 777, 97, 774, 777, - 65, 774, 771, 97, 774, 771, 65, 803, 774, 97, 803, 774, 69, 803, 101, - 803, 69, 777, 101, 777, 69, 771, 101, 771, 69, 770, 769, 101, 770, - 769, 69, 770, 768, 101, 770, 768, 69, 770, 777, 101, 770, 777, 69, - 770, 771, 101, 770, 771, 69, 803, 770, 101, 803, 770, 73, 777, 105, - 777, 73, 803, 105, 803, 79, 803, 111, 803, 79, 777, 111, 777, 79, 770, - 769, 111, 770, 769, 79, 770, 768, 111, 770, 768, 79, 770, 777, 111, - 770, 777, 79, 770, 771, 111, 770, 771, 79, 803, 770, 111, 803, 770, - 79, 795, 769, 111, 795, 769, 79, 795, 768, 111, 795, 768, 79, 795, - 777, 111, 795, 777, 79, 795, 771, 111, 795, 771, 79, 795, 803, 111, - 795, 803, 85, 803, 117, 803, 85, 777, 117, 777, 85, 795, 769, 117, - 795, 769, 85, 795, 768, 117, 795, 768, 85, 795, 777, 117, 795, 777, - 85, 795, 771, 117, 795, 771, 85, 795, 803, 117, 795, 803, 89, 768, - 121, 768, 89, 803, 121, 803, 89, 777, 121, 777, 89, 771, 121, 771, - 945, 787, 945, 788, 945, 787, 768, 945, 788, 768, 945, 787, 769, 945, - 788, 769, 945, 787, 834, 945, 788, 834, 913, 787, 913, 788, 913, 787, - 768, 913, 788, 768, 913, 787, 769, 913, 788, 769, 913, 787, 834, 913, - 788, 834, 949, 787, 949, 788, 949, 787, 768, 949, 788, 768, 949, 787, - 769, 949, 788, 769, 917, 787, 917, 788, 917, 787, 768, 917, 788, 768, - 917, 787, 769, 917, 788, 769, 951, 787, 951, 788, 951, 787, 768, 951, - 788, 768, 951, 787, 769, 951, 788, 769, 951, 787, 834, 951, 788, 834, - 919, 787, 919, 788, 919, 787, 768, 919, 788, 768, 919, 787, 769, 919, - 788, 769, 919, 787, 834, 919, 788, 834, 953, 787, 953, 788, 953, 787, - 768, 953, 788, 768, 953, 787, 769, 953, 788, 769, 953, 787, 834, 953, - 788, 834, 921, 787, 921, 788, 921, 787, 768, 921, 788, 768, 921, 787, - 769, 921, 788, 769, 921, 787, 834, 921, 788, 834, 959, 787, 959, 788, - 959, 787, 768, 959, 788, 768, 959, 787, 769, 959, 788, 769, 927, 787, - 927, 788, 927, 787, 768, 927, 788, 768, 927, 787, 769, 927, 788, 769, - 965, 787, 965, 788, 965, 787, 768, 965, 788, 768, 965, 787, 769, 965, - 788, 769, 965, 787, 834, 965, 788, 834, 933, 788, 933, 788, 768, 933, - 788, 769, 933, 788, 834, 969, 787, 969, 788, 969, 787, 768, 969, 788, - 768, 969, 787, 769, 969, 788, 769, 969, 787, 834, 969, 788, 834, 937, - 787, 937, 788, 937, 787, 768, 937, 788, 768, 937, 787, 769, 937, 788, - 769, 937, 787, 834, 937, 788, 834, 945, 768, 949, 768, 951, 768, 953, - 768, 959, 768, 965, 768, 969, 768, 945, 787, 837, 945, 788, 837, 945, - 787, 768, 837, 945, 788, 768, 837, 945, 787, 769, 837, 945, 788, 769, - 837, 945, 787, 834, 837, 945, 788, 834, 837, 913, 787, 837, 913, 788, - 837, 913, 787, 768, 837, 913, 788, 768, 837, 913, 787, 769, 837, 913, - 788, 769, 837, 913, 787, 834, 837, 913, 788, 834, 837, 951, 787, 837, - 951, 788, 837, 951, 787, 768, 837, 951, 788, 768, 837, 951, 787, 769, - 837, 951, 788, 769, 837, 951, 787, 834, 837, 951, 788, 834, 837, 919, - 787, 837, 919, 788, 837, 919, 787, 768, 837, 919, 788, 768, 837, 919, - 787, 769, 837, 919, 788, 769, 837, 919, 787, 834, 837, 919, 788, 834, - 837, 969, 787, 837, 969, 788, 837, 969, 787, 768, 837, 969, 788, 768, - 837, 969, 787, 769, 837, 969, 788, 769, 837, 969, 787, 834, 837, 969, - 788, 834, 837, 937, 787, 837, 937, 788, 837, 937, 787, 768, 837, 937, - 788, 768, 837, 937, 787, 769, 837, 937, 788, 769, 837, 937, 787, 834, - 837, 937, 788, 834, 837, 945, 774, 945, 772, 945, 768, 837, 945, 837, - 945, 769, 837, 945, 834, 945, 834, 837, 913, 774, 913, 772, 913, 768, - 913, 837, 32, 787, 953, 32, 834, 32, 776, 834, 951, 768, 837, 951, - 837, 951, 769, 837, 951, 834, 951, 834, 837, 917, 768, 919, 768, 919, - 837, 32, 787, 768, 32, 787, 769, 32, 787, 834, 953, 774, 953, 772, - 953, 776, 768, 953, 834, 953, 776, 834, 921, 774, 921, 772, 921, 768, - 32, 788, 768, 32, 788, 769, 32, 788, 834, 965, 774, 965, 772, 965, - 776, 768, 961, 787, 961, 788, 965, 834, 965, 776, 834, 933, 774, 933, - 772, 933, 768, 929, 788, 32, 776, 768, 96, 969, 768, 837, 969, 837, - 969, 769, 837, 969, 834, 969, 834, 837, 927, 768, 937, 768, 937, 837, - 32, 788, 8208, 32, 819, 46, 46, 46, 46, 46, 46, 8242, 8242, 8242, 8242, - 8242, 8245, 8245, 8245, 8245, 8245, 33, 33, 32, 773, 63, 63, 63, 33, - 33, 63, 8242, 8242, 8242, 8242, 48, 105, 52, 53, 54, 55, 56, 57, 43, - 8722, 61, 40, 41, 110, 82, 115, 97, 47, 99, 97, 47, 115, 67, 176, 67, - 99, 47, 111, 99, 47, 117, 400, 176, 70, 103, 72, 295, 73, 76, 78, 78, - 111, 80, 81, 82, 83, 77, 84, 69, 76, 84, 77, 90, 937, 75, 66, 101, - 69, 70, 77, 1488, 1489, 1490, 1491, 947, 915, 928, 8721, 68, 100, 49, - 8260, 51, 50, 8260, 51, 49, 8260, 53, 50, 8260, 53, 51, 8260, 53, 52, - 8260, 53, 49, 8260, 54, 53, 8260, 54, 49, 8260, 56, 51, 8260, 56, 53, - 8260, 56, 55, 8260, 56, 49, 8260, 73, 73, 73, 73, 73, 73, 86, 86, 86, - 73, 86, 73, 73, 86, 73, 73, 73, 73, 88, 88, 88, 73, 88, 73, 73, 105, - 105, 105, 105, 105, 105, 118, 118, 118, 105, 118, 105, 105, 118, 105, - 105, 105, 105, 120, 120, 105, 120, 105, 105, 99, 109, 8592, 824, 8594, - 824, 8596, 824, 8656, 824, 8660, 824, 8658, 824, 8707, 824, 8712, 824, - 8715, 824, 8739, 824, 8741, 824, 8747, 8747, 8747, 8747, 8747, 8750, - 8750, 8750, 8750, 8750, 8764, 824, 8771, 824, 8773, 824, 8776, 824, - 61, 824, 8801, 824, 8781, 824, 60, 824, 62, 824, 8804, 824, 8805, 824, - 8818, 824, 8819, 824, 8822, 824, 8823, 824, 8826, 824, 8827, 824, 8834, - 824, 8835, 824, 8838, 824, 8839, 824, 8866, 824, 8872, 824, 8873, 824, - 8875, 824, 8828, 824, 8829, 824, 8849, 824, 8850, 824, 8882, 824, 8883, - 824, 8884, 824, 8885, 824, 12296, 12297, 49, 48, 49, 49, 49, 50, 49, - 51, 49, 52, 49, 53, 49, 54, 49, 55, 49, 56, 49, 57, 50, 48, 40, 49, - 41, 40, 50, 41, 40, 51, 41, 40, 52, 41, 40, 53, 41, 40, 54, 41, 40, - 55, 41, 40, 56, 41, 40, 57, 41, 40, 49, 48, 41, 40, 49, 49, 41, 40, - 49, 50, 41, 40, 49, 51, 41, 40, 49, 52, 41, 40, 49, 53, 41, 40, 49, - 54, 41, 40, 49, 55, 41, 40, 49, 56, 41, 40, 49, 57, 41, 40, 50, 48, - 41, 49, 46, 50, 46, 51, 46, 52, 46, 53, 46, 54, 46, 55, 46, 56, 46, - 57, 46, 49, 48, 46, 49, 49, 46, 49, 50, 46, 49, 51, 46, 49, 52, 46, - 49, 53, 46, 49, 54, 46, 49, 55, 46, 49, 56, 46, 49, 57, 46, 50, 48, - 46, 40, 97, 41, 40, 98, 41, 40, 99, 41, 40, 100, 41, 40, 101, 41, 40, - 102, 41, 40, 103, 41, 40, 104, 41, 40, 105, 41, 40, 106, 41, 40, 107, - 41, 40, 108, 41, 40, 109, 41, 40, 110, 41, 40, 111, 41, 40, 112, 41, - 40, 113, 41, 40, 114, 41, 40, 115, 41, 40, 116, 41, 40, 117, 41, 40, - 118, 41, 40, 119, 41, 40, 120, 41, 40, 121, 41, 40, 122, 41, 65, 71, - 74, 79, 83, 84, 85, 87, 89, 98, 102, 107, 112, 113, 116, 117, 122, - 8747, 8747, 8747, 8747, 58, 58, 61, 61, 61, 61, 61, 61, 10973, 824, - 27597, 40863, 19968, 20008, 20022, 20031, 20057, 20101, 20108, 20128, - 20154, 20799, 20837, 20843, 20866, 20886, 20907, 20960, 20981, 20992, - 21147, 21241, 21269, 21274, 21304, 21313, 21340, 21353, 21378, 21430, - 21448, 21475, 22231, 22303, 22763, 22786, 22794, 22805, 22823, 22899, - 23376, 23424, 23544, 23567, 23586, 23608, 23662, 23665, 24027, 24037, - 24049, 24062, 24178, 24186, 24191, 24308, 24318, 24331, 24339, 24400, - 24417, 24435, 24515, 25096, 25142, 25163, 25903, 25908, 25991, 26007, - 26020, 26041, 26080, 26085, 26352, 26376, 26408, 27424, 27490, 27513, - 27571, 27595, 27604, 27611, 27663, 27668, 27700, 28779, 29226, 29238, - 29243, 29247, 29255, 29273, 29275, 29356, 29572, 29577, 29916, 29926, - 29976, 29983, 29992, 30000, 30091, 30098, 30326, 30333, 30382, 30399, - 30446, 30683, 30690, 30707, 31034, 31160, 31166, 31348, 31435, 31481, - 31859, 31992, 32566, 32593, 32650, 32701, 32769, 32780, 32786, 32819, - 32895, 32905, 33251, 33258, 33267, 33276, 33292, 33307, 33311, 33390, - 33394, 33400, 34381, 34411, 34880, 34892, 34915, 35198, 35211, 35282, - 35328, 35895, 35910, 35925, 35960, 35997, 36196, 36208, 36275, 36523, - 36554, 36763, 36784, 36789, 37009, 37193, 37318, 37324, 37329, 38263, - 38272, 38428, 38582, 38585, 38632, 38737, 38750, 38754, 38761, 38859, - 38893, 38899, 38913, 39080, 39131, 39135, 39318, 39321, 39340, 39592, - 39640, 39647, 39717, 39727, 39730, 39740, 39770, 40165, 40565, 40575, - 40613, 40635, 40643, 40653, 40657, 40697, 40701, 40718, 40723, 40736, - 40763, 40778, 40786, 40845, 40860, 40864, 12306, 21316, 21317, 12363, - 12441, 12365, 12441, 12367, 12441, 12369, 12441, 12371, 12441, 12373, - 12441, 12375, 12441, 12377, 12441, 12379, 12441, 12381, 12441, 12383, - 12441, 12385, 12441, 12388, 12441, 12390, 12441, 12392, 12441, 12399, - 12441, 12399, 12442, 12402, 12441, 12402, 12442, 12405, 12441, 12405, - 12442, 12408, 12441, 12408, 12442, 12411, 12441, 12411, 12442, 12358, - 12441, 32, 12441, 32, 12442, 12445, 12441, 12424, 12426, 12459, 12441, - 12461, 12441, 12463, 12441, 12465, 12441, 12467, 12441, 12469, 12441, - 12471, 12441, 12473, 12441, 12475, 12441, 12477, 12441, 12479, 12441, - 12481, 12441, 12484, 12441, 12486, 12441, 12488, 12441, 12495, 12441, - 12495, 12442, 12498, 12441, 12498, 12442, 12501, 12441, 12501, 12442, - 12504, 12441, 12504, 12442, 12507, 12441, 12507, 12442, 12454, 12441, - 12527, 12441, 12528, 12441, 12529, 12441, 12530, 12441, 12541, 12441, - 12467, 12488, 4352, 4353, 4522, 4354, 4524, 4525, 4355, 4356, 4357, - 4528, 4529, 4530, 4531, 4532, 4533, 4378, 4358, 4359, 4360, 4385, 4361, - 4362, 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370, 4449, 4450, 4451, - 4452, 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460, 4461, 4462, 4463, - 4464, 4465, 4466, 4467, 4468, 4469, 4448, 4372, 4373, 4551, 4552, 4556, - 4558, 4563, 4567, 4569, 4380, 4573, 4575, 4381, 4382, 4384, 4386, 4387, - 4391, 4393, 4395, 4396, 4397, 4398, 4399, 4402, 4406, 4416, 4423, 4428, - 4593, 4594, 4439, 4440, 4441, 4484, 4485, 4488, 4497, 4498, 4500, 4510, - 4513, 19977, 22235, 19978, 20013, 19979, 30002, 19993, 19969, 22825, - 22320, 40, 4352, 41, 40, 4354, 41, 40, 4355, 41, 40, 4357, 41, 40, - 4358, 41, 40, 4359, 41, 40, 4361, 41, 40, 4363, 41, 40, 4364, 41, 40, - 4366, 41, 40, 4367, 41, 40, 4368, 41, 40, 4369, 41, 40, 4370, 41, 40, - 4352, 4449, 41, 40, 4354, 4449, 41, 40, 4355, 4449, 41, 40, 4357, 4449, - 41, 40, 4358, 4449, 41, 40, 4359, 4449, 41, 40, 4361, 4449, 41, 40, - 4363, 4449, 41, 40, 4364, 4449, 41, 40, 4366, 4449, 41, 40, 4367, 4449, - 41, 40, 4368, 4449, 41, 40, 4369, 4449, 41, 40, 4370, 4449, 41, 40, - 4364, 4462, 41, 40, 19968, 41, 40, 20108, 41, 40, 19977, 41, 40, 22235, - 41, 40, 20116, 41, 40, 20845, 41, 40, 19971, 41, 40, 20843, 41, 40, - 20061, 41, 40, 21313, 41, 40, 26376, 41, 40, 28779, 41, 40, 27700, - 41, 40, 26408, 41, 40, 37329, 41, 40, 22303, 41, 40, 26085, 41, 40, - 26666, 41, 40, 26377, 41, 40, 31038, 41, 40, 21517, 41, 40, 29305, - 41, 40, 36001, 41, 40, 31069, 41, 40, 21172, 41, 40, 20195, 41, 40, - 21628, 41, 40, 23398, 41, 40, 30435, 41, 40, 20225, 41, 40, 36039, - 41, 40, 21332, 41, 40, 31085, 41, 40, 20241, 41, 40, 33258, 41, 40, - 33267, 41, 50, 49, 50, 50, 50, 51, 50, 52, 50, 53, 50, 54, 50, 55, - 50, 56, 50, 57, 51, 48, 51, 49, 51, 50, 51, 51, 51, 52, 51, 53, 4352, - 4449, 4354, 4449, 4355, 4449, 4357, 4449, 4358, 4449, 4359, 4449, 4361, - 4449, 4363, 4449, 4364, 4449, 4366, 4449, 4367, 4449, 4368, 4449, 4369, - 4449, 4370, 4449, 20116, 20845, 19971, 20061, 26666, 26377, 31038, - 21517, 29305, 36001, 31069, 21172, 31192, 30007, 36969, 20778, 21360, - 27880, 38917, 20241, 20889, 27491, 24038, 21491, 21307, 23447, 23398, - 30435, 20225, 36039, 21332, 22812, 51, 54, 51, 55, 51, 56, 51, 57, - 52, 48, 52, 49, 52, 50, 52, 51, 52, 52, 52, 53, 52, 54, 52, 55, 52, - 56, 52, 57, 53, 48, 49, 26376, 50, 26376, 51, 26376, 52, 26376, 53, - 26376, 54, 26376, 55, 26376, 56, 26376, 57, 26376, 49, 48, 26376, 49, - 49, 26376, 49, 50, 26376, 12450, 12452, 12454, 12456, 12458, 12459, - 12461, 12463, 12465, 12467, 12469, 12471, 12473, 12475, 12477, 12479, - 12481, 12484, 12486, 12488, 12490, 12491, 12492, 12493, 12494, 12495, - 12498, 12501, 12504, 12507, 12510, 12511, 12512, 12513, 12514, 12516, - 12518, 12520, 12521, 12522, 12523, 12524, 12525, 12527, 12528, 12529, - 12530, 12450, 12495, 12442, 12540, 12488, 12450, 12523, 12501, 12449, - 12450, 12531, 12504, 12442, 12450, 12450, 12540, 12523, 12452, 12491, - 12531, 12463, 12441, 12452, 12531, 12481, 12454, 12457, 12531, 12456, - 12473, 12463, 12540, 12488, 12441, 12456, 12540, 12459, 12540, 12458, - 12531, 12473, 12458, 12540, 12512, 12459, 12452, 12522, 12459, 12521, - 12483, 12488, 12459, 12525, 12522, 12540, 12459, 12441, 12525, 12531, - 12459, 12441, 12531, 12510, 12461, 12441, 12459, 12441, 12461, 12441, - 12491, 12540, 12461, 12517, 12522, 12540, 12461, 12441, 12523, 12479, - 12441, 12540, 12461, 12525, 12461, 12525, 12463, 12441, 12521, 12512, - 12461, 12525, 12513, 12540, 12488, 12523, 12461, 12525, 12527, 12483, - 12488, 12463, 12441, 12521, 12512, 12463, 12441, 12521, 12512, 12488, - 12531, 12463, 12523, 12475, 12441, 12452, 12525, 12463, 12525, 12540, - 12493, 12465, 12540, 12473, 12467, 12523, 12490, 12467, 12540, 12507, - 12442, 12469, 12452, 12463, 12523, 12469, 12531, 12481, 12540, 12512, - 12471, 12522, 12531, 12463, 12441, 12475, 12531, 12481, 12475, 12531, - 12488, 12479, 12441, 12540, 12473, 12486, 12441, 12471, 12488, 12441, - 12523, 12488, 12531, 12490, 12494, 12494, 12483, 12488, 12495, 12452, - 12484, 12495, 12442, 12540, 12475, 12531, 12488, 12495, 12442, 12540, - 12484, 12495, 12441, 12540, 12524, 12523, 12498, 12442, 12450, 12473, - 12488, 12523, 12498, 12442, 12463, 12523, 12498, 12442, 12467, 12498, - 12441, 12523, 12501, 12449, 12521, 12483, 12488, 12441, 12501, 12451, - 12540, 12488, 12501, 12441, 12483, 12471, 12455, 12523, 12501, 12521, - 12531, 12504, 12463, 12479, 12540, 12523, 12504, 12442, 12477, 12504, - 12442, 12491, 12498, 12504, 12523, 12484, 12504, 12442, 12531, 12473, - 12504, 12442, 12540, 12471, 12441, 12504, 12441, 12540, 12479, 12507, - 12442, 12452, 12531, 12488, 12507, 12441, 12523, 12488, 12507, 12531, - 12507, 12442, 12531, 12488, 12441, 12507, 12540, 12523, 12507, 12540, - 12531, 12510, 12452, 12463, 12525, 12510, 12452, 12523, 12510, 12483, - 12495, 12510, 12523, 12463, 12510, 12531, 12471, 12519, 12531, 12511, - 12463, 12525, 12531, 12511, 12522, 12511, 12522, 12495, 12441, 12540, - 12523, 12513, 12459, 12441, 12513, 12459, 12441, 12488, 12531, 12513, - 12540, 12488, 12523, 12516, 12540, 12488, 12441, 12516, 12540, 12523, - 12518, 12450, 12531, 12522, 12483, 12488, 12523, 12522, 12521, 12523, - 12498, 12442, 12540, 12523, 12540, 12501, 12441, 12523, 12524, 12512, - 12524, 12531, 12488, 12465, 12441, 12531, 12527, 12483, 12488, 48, - 28857, 49, 28857, 50, 28857, 51, 28857, 52, 28857, 53, 28857, 54, 28857, - 55, 28857, 56, 28857, 57, 28857, 49, 48, 28857, 49, 49, 28857, 49, - 50, 28857, 49, 51, 28857, 49, 52, 28857, 49, 53, 28857, 49, 54, 28857, - 49, 55, 28857, 49, 56, 28857, 49, 57, 28857, 50, 48, 28857, 50, 49, - 28857, 50, 50, 28857, 50, 51, 28857, 50, 52, 28857, 104, 80, 97, 100, - 97, 65, 85, 98, 97, 114, 111, 86, 112, 99, 24179, 25104, 26157, 21644, - 22823, 27491, 26126, 27835, 26666, 24335, 20250, 31038, 112, 65, 110, - 65, 956, 65, 109, 65, 107, 65, 75, 66, 77, 66, 71, 66, 99, 97, 108, - 107, 99, 97, 108, 112, 70, 110, 70, 956, 70, 956, 103, 109, 103, 107, - 103, 72, 122, 107, 72, 122, 77, 72, 122, 71, 72, 122, 84, 72, 122, - 956, 108, 109, 108, 100, 108, 107, 108, 102, 109, 110, 109, 956, 109, - 109, 109, 99, 109, 107, 109, 109, 109, 50, 99, 109, 50, 109, 50, 107, - 109, 50, 109, 109, 51, 99, 109, 51, 109, 51, 107, 109, 51, 109, 8725, - 115, 109, 8725, 115, 50, 80, 97, 107, 80, 97, 77, 80, 97, 71, 80, 97, - 114, 97, 100, 114, 97, 100, 8725, 115, 114, 97, 100, 8725, 115, 50, - 112, 115, 110, 115, 956, 115, 109, 115, 112, 86, 110, 86, 956, 86, - 109, 86, 107, 86, 77, 86, 112, 87, 110, 87, 956, 87, 109, 87, 107, - 87, 77, 87, 107, 937, 77, 937, 97, 46, 109, 46, 66, 113, 99, 99, 99, - 100, 67, 8725, 107, 103, 67, 111, 46, 100, 66, 71, 121, 104, 97, 72, - 80, 105, 110, 75, 75, 75, 77, 107, 116, 108, 109, 108, 110, 108, 111, - 103, 108, 120, 109, 98, 109, 105, 108, 109, 111, 108, 80, 72, 112, - 46, 109, 46, 80, 80, 77, 80, 82, 115, 114, 83, 118, 87, 98, 49, 26085, - 50, 26085, 51, 26085, 52, 26085, 53, 26085, 54, 26085, 55, 26085, 56, - 26085, 57, 26085, 49, 48, 26085, 49, 49, 26085, 49, 50, 26085, 49, - 51, 26085, 49, 52, 26085, 49, 53, 26085, 49, 54, 26085, 49, 55, 26085, - 49, 56, 26085, 49, 57, 26085, 50, 48, 26085, 50, 49, 26085, 50, 50, - 26085, 50, 51, 26085, 50, 52, 26085, 50, 53, 26085, 50, 54, 26085, - 50, 55, 26085, 50, 56, 26085, 50, 57, 26085, 51, 48, 26085, 51, 49, - 26085, 35912, 26356, 36040, 28369, 20018, 21477, 22865, 21895, 22856, - 25078, 30313, 32645, 34367, 34746, 35064, 37007, 27138, 27931, 28889, - 29662, 33853, 37226, 39409, 20098, 21365, 27396, 29211, 34349, 40478, - 23888, 28651, 34253, 35172, 25289, 33240, 34847, 24266, 26391, 28010, - 29436, 37070, 20358, 20919, 21214, 25796, 27347, 29200, 30439, 34310, - 34396, 36335, 38706, 39791, 40442, 30860, 31103, 32160, 33737, 37636, - 35542, 22751, 24324, 31840, 32894, 29282, 30922, 36034, 38647, 22744, - 23650, 27155, 28122, 28431, 32047, 32311, 38475, 21202, 32907, 20956, - 20940, 31260, 32190, 33777, 38517, 35712, 25295, 35582, 20025, 23527, - 24594, 29575, 30064, 21271, 30971, 20415, 24489, 19981, 27852, 25976, - 32034, 21443, 22622, 30465, 33865, 35498, 27578, 27784, 25342, 33509, - 25504, 30053, 20142, 20841, 20937, 26753, 31975, 33391, 35538, 37327, - 21237, 21570, 24300, 26053, 28670, 31018, 38317, 39530, 40599, 40654, - 26310, 27511, 36706, 24180, 24976, 25088, 25754, 28451, 29001, 29833, - 31178, 32244, 32879, 36646, 34030, 36899, 37706, 21015, 21155, 21693, - 28872, 35010, 24265, 24565, 25467, 27566, 31806, 29557, 20196, 22265, - 23994, 24604, 29618, 29801, 32666, 32838, 37428, 38646, 38728, 38936, - 20363, 31150, 37300, 38584, 24801, 20102, 20698, 23534, 23615, 26009, - 29134, 30274, 34044, 36988, 26248, 38446, 21129, 26491, 26611, 27969, - 28316, 29705, 30041, 30827, 32016, 39006, 25134, 38520, 20523, 23833, - 28138, 36650, 24459, 24900, 26647, 38534, 21033, 21519, 23653, 26131, - 26446, 26792, 27877, 29702, 30178, 32633, 35023, 35041, 38626, 21311, - 28346, 21533, 29136, 29848, 34298, 38563, 40023, 40607, 26519, 28107, - 33256, 31520, 31890, 29376, 28825, 35672, 20160, 33590, 21050, 20999, - 24230, 25299, 31958, 23429, 27934, 26292, 36667, 38477, 24275, 20800, - 21952, 22618, 26228, 20958, 29482, 30410, 31036, 31070, 31077, 31119, - 38742, 31934, 34322, 35576, 36920, 37117, 39151, 39164, 39208, 40372, - 20398, 20711, 20813, 21193, 21220, 21329, 21917, 22022, 22120, 22592, - 22696, 23652, 24724, 24936, 24974, 25074, 25935, 26082, 26257, 26757, - 28023, 28186, 28450, 29038, 29227, 29730, 30865, 31049, 31048, 31056, - 31062, 31117, 31118, 31296, 31361, 31680, 32265, 32321, 32626, 32773, - 33261, 33401, 33879, 35088, 35222, 35585, 35641, 36051, 36104, 36790, - 38627, 38911, 38971, 102, 102, 102, 105, 102, 108, 102, 102, 105, 102, - 102, 108, 115, 116, 1396, 1398, 1396, 1381, 1396, 1387, 1406, 1398, - 1396, 1389, 1497, 1460, 1522, 1463, 1506, 1492, 1499, 1500, 1501, 1512, - 1514, 1513, 1473, 1513, 1474, 1513, 1468, 1473, 1513, 1468, 1474, 1488, - 1463, 1488, 1464, 1488, 1468, 1489, 1468, 1490, 1468, 1491, 1468, 1492, - 1468, 1493, 1468, 1494, 1468, 1496, 1468, 1497, 1468, 1498, 1468, 1499, - 1468, 1500, 1468, 1502, 1468, 1504, 1468, 1505, 1468, 1507, 1468, 1508, - 1468, 1510, 1468, 1511, 1468, 1512, 1468, 1513, 1468, 1514, 1468, 1493, - 1465, 1489, 1471, 1499, 1471, 1508, 1471, 1488, 1500, 1649, 1659, 1662, - 1664, 1658, 1663, 1657, 1700, 1702, 1668, 1667, 1670, 1671, 1677, 1676, - 1678, 1672, 1688, 1681, 1705, 1711, 1715, 1713, 1722, 1723, 1729, 1726, - 1746, 1709, 1735, 1734, 1736, 1739, 1733, 1737, 1744, 1609, 1610, 1620, - 1575, 1610, 1620, 1749, 1610, 1620, 1608, 1610, 1620, 1735, 1610, 1620, - 1734, 1610, 1620, 1736, 1610, 1620, 1744, 1610, 1620, 1609, 1740, 1610, - 1620, 1580, 1610, 1620, 1581, 1610, 1620, 1605, 1610, 1620, 1610, 1576, - 1580, 1576, 1581, 1576, 1582, 1576, 1605, 1576, 1609, 1576, 1610, 1578, - 1580, 1578, 1581, 1578, 1582, 1578, 1605, 1578, 1609, 1578, 1610, 1579, - 1580, 1579, 1605, 1579, 1609, 1579, 1610, 1580, 1581, 1580, 1605, 1581, - 1580, 1581, 1605, 1582, 1580, 1582, 1581, 1582, 1605, 1587, 1580, 1587, - 1581, 1587, 1582, 1587, 1605, 1589, 1581, 1589, 1605, 1590, 1580, 1590, - 1581, 1590, 1582, 1590, 1605, 1591, 1581, 1591, 1605, 1592, 1605, 1593, - 1580, 1593, 1605, 1594, 1580, 1594, 1605, 1601, 1580, 1601, 1581, 1601, - 1582, 1601, 1605, 1601, 1609, 1601, 1610, 1602, 1581, 1602, 1605, 1602, - 1609, 1602, 1610, 1603, 1575, 1603, 1580, 1603, 1581, 1603, 1582, 1603, - 1604, 1603, 1605, 1603, 1609, 1603, 1610, 1604, 1580, 1604, 1581, 1604, - 1582, 1604, 1605, 1604, 1609, 1604, 1610, 1605, 1580, 1605, 1581, 1605, - 1582, 1605, 1605, 1605, 1609, 1605, 1610, 1606, 1580, 1606, 1581, 1606, - 1582, 1606, 1605, 1606, 1609, 1606, 1610, 1607, 1580, 1607, 1605, 1607, - 1609, 1607, 1610, 1610, 1580, 1610, 1581, 1610, 1582, 1610, 1605, 1610, - 1609, 1610, 1610, 1584, 1648, 1585, 1648, 1609, 1648, 32, 1612, 1617, - 32, 1613, 1617, 32, 1614, 1617, 32, 1615, 1617, 32, 1616, 1617, 32, - 1617, 1648, 1610, 1620, 1585, 1610, 1620, 1586, 1610, 1620, 1606, 1576, - 1585, 1576, 1586, 1576, 1606, 1578, 1585, 1578, 1586, 1578, 1606, 1579, - 1585, 1579, 1586, 1579, 1606, 1605, 1575, 1606, 1585, 1606, 1586, 1606, - 1606, 1610, 1585, 1610, 1586, 1610, 1606, 1610, 1620, 1582, 1610, 1620, - 1607, 1576, 1607, 1578, 1607, 1589, 1582, 1604, 1607, 1606, 1607, 1607, - 1648, 1610, 1607, 1579, 1607, 1587, 1607, 1588, 1605, 1588, 1607, 1600, - 1614, 1617, 1600, 1615, 1617, 1600, 1616, 1617, 1591, 1609, 1591, 1610, - 1593, 1609, 1593, 1610, 1594, 1609, 1594, 1610, 1587, 1609, 1587, 1610, - 1588, 1609, 1588, 1610, 1581, 1609, 1581, 1610, 1580, 1609, 1580, 1610, - 1582, 1609, 1582, 1610, 1589, 1609, 1589, 1610, 1590, 1609, 1590, 1610, - 1588, 1580, 1588, 1581, 1588, 1582, 1588, 1585, 1587, 1585, 1589, 1585, - 1590, 1585, 1575, 1611, 1578, 1580, 1605, 1578, 1581, 1580, 1578, 1581, - 1605, 1578, 1582, 1605, 1578, 1605, 1580, 1578, 1605, 1581, 1578, 1605, - 1582, 1580, 1605, 1581, 1581, 1605, 1610, 1581, 1605, 1609, 1587, 1581, - 1580, 1587, 1580, 1581, 1587, 1580, 1609, 1587, 1605, 1581, 1587, 1605, - 1580, 1587, 1605, 1605, 1589, 1581, 1581, 1589, 1605, 1605, 1588, 1581, - 1605, 1588, 1580, 1610, 1588, 1605, 1582, 1588, 1605, 1605, 1590, 1581, - 1609, 1590, 1582, 1605, 1591, 1605, 1581, 1591, 1605, 1605, 1591, 1605, - 1610, 1593, 1580, 1605, 1593, 1605, 1605, 1593, 1605, 1609, 1594, 1605, - 1605, 1594, 1605, 1610, 1594, 1605, 1609, 1601, 1582, 1605, 1602, 1605, - 1581, 1602, 1605, 1605, 1604, 1581, 1605, 1604, 1581, 1610, 1604, 1581, - 1609, 1604, 1580, 1580, 1604, 1582, 1605, 1604, 1605, 1581, 1605, 1581, - 1580, 1605, 1581, 1605, 1605, 1581, 1610, 1605, 1580, 1581, 1605, 1580, - 1605, 1605, 1582, 1580, 1605, 1582, 1605, 1605, 1580, 1582, 1607, 1605, - 1580, 1607, 1605, 1605, 1606, 1581, 1605, 1606, 1581, 1609, 1606, 1580, - 1605, 1606, 1580, 1609, 1606, 1605, 1610, 1606, 1605, 1609, 1610, 1605, - 1605, 1576, 1582, 1610, 1578, 1580, 1610, 1578, 1580, 1609, 1578, 1582, - 1610, 1578, 1582, 1609, 1578, 1605, 1610, 1578, 1605, 1609, 1580, 1605, - 1610, 1580, 1581, 1609, 1580, 1605, 1609, 1587, 1582, 1609, 1589, 1581, - 1610, 1588, 1581, 1610, 1590, 1581, 1610, 1604, 1580, 1610, 1604, 1605, - 1610, 1610, 1581, 1610, 1610, 1580, 1610, 1610, 1605, 1610, 1605, 1605, - 1610, 1602, 1605, 1610, 1606, 1581, 1610, 1593, 1605, 1610, 1603, 1605, - 1610, 1606, 1580, 1581, 1605, 1582, 1610, 1604, 1580, 1605, 1603, 1605, - 1605, 1580, 1581, 1610, 1581, 1580, 1610, 1605, 1580, 1610, 1601, 1605, - 1610, 1576, 1581, 1610, 1587, 1582, 1610, 1606, 1580, 1610, 1589, 1604, - 1746, 1602, 1604, 1746, 1575, 1604, 1604, 1607, 1575, 1603, 1576, 1585, - 1605, 1581, 1605, 1583, 1589, 1604, 1593, 1605, 1585, 1587, 1608, 1604, - 1593, 1604, 1610, 1607, 1608, 1587, 1604, 1605, 1589, 1604, 1609, 1589, - 1604, 1609, 32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, - 32, 1608, 1587, 1604, 1605, 1580, 1604, 32, 1580, 1604, 1575, 1604, - 1607, 1585, 1740, 1575, 1604, 8212, 8211, 95, 123, 125, 12308, 12309, - 12304, 12305, 12298, 12299, 12300, 12301, 12302, 12303, 44, 12289, - 58, 63, 33, 35, 38, 42, 45, 60, 62, 92, 36, 37, 64, 32, 1611, 1600, - 1611, 32, 1612, 32, 1613, 32, 1614, 1600, 1614, 32, 1615, 1600, 1615, - 32, 1616, 1600, 1616, 32, 1617, 1600, 1617, 32, 1618, 1600, 1618, 1569, - 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, - 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1601, 1602, 1603, 1604, - 1605, 1606, 1607, 1608, 1610, 1604, 1575, 1619, 1604, 1575, 1620, 1604, - 1575, 1621, 1604, 1575, 34, 39, 47, 91, 93, 94, 124, 126, 10629, 10630, - 12290, 12539, 12449, 12451, 12453, 12455, 12457, 12515, 12517, 12519, - 12483, 12540, 12531, 12441, 12442, 162, 163, 172, 166, 165, 8361, 9474, - 8592, 8593, 8594, 8595, 9632, 9675, 119127, 119141, 119128, 119141, - 119128, 119141, 119150, 119128, 119141, 119151, 119128, 119141, 119152, - 119128, 119141, 119153, 119128, 119141, 119154, 119225, 119141, 119226, - 119141, 119225, 119141, 119150, 119226, 119141, 119150, 119225, 119141, - 119151, 119226, 119141, 119151, 913, 914, 916, 917, 918, 919, 921, - 922, 923, 924, 925, 926, 927, 929, 931, 932, 934, 935, 936, 8711, 945, - 948, 950, 951, 955, 957, 958, 959, 963, 964, 965, 967, 968, 969, 8706, - 20029, 20024, 20033, 131362, 20320, 20411, 20482, 20602, 20633, 20687, - 13470, 132666, 20820, 20836, 20855, 132380, 13497, 20839, 20877, 132427, - 20887, 20900, 20172, 20908, 20917, 168415, 20995, 13535, 21051, 21062, - 21106, 21111, 13589, 21191, 21242, 21253, 21254, 21321, 21338, 21363, - 21373, 21375, 133676, 28784, 21450, 21471, 133987, 21483, 21489, 21510, - 21662, 21560, 21576, 21608, 21666, 21750, 21776, 21843, 21859, 21892, - 21913, 21931, 21939, 21954, 22294, 22295, 22097, 22132, 22766, 22478, - 22516, 22541, 22411, 22578, 22577, 22700, 136420, 22770, 22775, 22790, - 22810, 22818, 22882, 136872, 136938, 23020, 23067, 23079, 23000, 23142, - 14062, 136042, 23304, 23358, 137672, 23491, 23512, 23539, 138008, 23551, - 23558, 24371, 14209, 23648, 23744, 23693, 138724, 23875, 138726, 23918, - 23915, 23932, 24033, 24034, 14383, 24061, 24104, 24125, 24169, 14434, - 139651, 14460, 24240, 24243, 24246, 172946, 140081, 33281, 24354, 14535, - 144056, 156122, 24418, 24427, 14563, 24474, 24525, 24535, 24569, 24705, - 14650, 14620, 141012, 24775, 24904, 24908, 24910, 24954, 25010, 24996, - 25007, 25054, 25104, 25115, 25181, 25265, 25300, 25424, 142092, 25405, - 25340, 25448, 25475, 25572, 142321, 25634, 25541, 25513, 14894, 25705, - 25726, 25757, 25719, 14956, 25964, 143370, 26083, 26360, 26185, 15129, - 15112, 15076, 20882, 20885, 26368, 26268, 32941, 17369, 26395, 26401, - 26462, 26451, 144323, 15177, 26618, 26501, 26706, 144493, 26766, 26655, - 26900, 15261, 26946, 27043, 27114, 27304, 145059, 27355, 15384, 27425, - 145575, 27476, 15438, 27506, 27551, 27579, 146061, 138507, 146170, - 27726, 146620, 27839, 27853, 27751, 27926, 27966, 28009, 28024, 28037, - 146718, 27956, 28207, 28270, 15667, 28363, 28359, 147153, 28153, 28526, - 147294, 147342, 28614, 28729, 28702, 28699, 15766, 28746, 28797, 28791, - 28845, 132389, 28997, 148067, 29084, 17323, 29224, 29237, 29264, 149000, - 29312, 29333, 149301, 149524, 29562, 29579, 16044, 29605, 16056, 29767, - 29788, 29809, 29829, 29898, 16155, 29988, 150582, 30014, 150674, 139679, - 30224, 151457, 151480, 151620, 16380, 16392, 30452, 151795, 151794, - 151833, 151859, 30494, 30495, 30538, 16441, 30603, 16454, 16534, 152605, - 30798, 30924, 16611, 153126, 153242, 153285, 31211, 16687, 31306, 31311, - 153980, 154279, 31406, 16898, 154539, 31686, 31689, 16935, 154752, - 31954, 17056, 31976, 31971, 32000, 155526, 32099, 17153, 32199, 32258, - 32325, 17204, 156200, 156231, 17241, 156377, 32634, 156478, 32661, - 32762, 156890, 156963, 32864, 157096, 32880, 144223, 17365, 32946, - 33027, 17419, 33086, 23221, 157607, 157621, 144275, 144284, 33284, - 36766, 17515, 33425, 33419, 33437, 21171, 33457, 33459, 33469, 33510, - 158524, 33565, 33635, 33709, 33571, 33725, 33767, 33619, 33738, 33740, - 33756, 158774, 159083, 158933, 17707, 34033, 34035, 34070, 160714, - 34148, 159532, 17757, 17761, 159665, 159954, 17771, 34384, 34407, 34409, - 34473, 34440, 34574, 34530, 34681, 34600, 34667, 34694, 19799, 34785, - 34817, 17913, 34912, 161383, 35031, 35038, 17973, 35066, 13499, 161966, - 162150, 18110, 18119, 35488, 35565, 35722, 162984, 36011, 36033, 36123, - 36215, 163631, 133124, 36299, 36284, 36336, 133342, 36564, 36664, 165330, - 165357, 37012, 37105, 37137, 165678, 37147, 37432, 37591, 37592, 37500, - 37881, 37909, 166906, 38283, 18837, 38327, 167287, 18918, 38595, 23986, - 38691, 168261, 168474, 19054, 19062, 38880, 168970, 19122, 169110, - 38923, 38953, 169398, 39138, 19251, 39209, 39335, 39362, 39422, 19406, - 170800, 39698, 40000, 40189, 19662, 19693, 40295, 172238, 19704, 172293, - 172558, 172689, 19798, 40702, 40709, 40719, 40726, 173568 -}; - - -/* - * This macro extracts the information about a character from the - * Unicode character tables. - */ - -#define GetUniCharDecompInfo(ch) (decompGroupMap[(decompPageMap[(((int)(ch)) & 0x1fffff) >> DECOMP_OFFSET_BITS] << DECOMP_OFFSET_BITS) | ((ch) & ((1 << DECOMP_OFFSET_BITS)-1))]) - -#define GetDecompShift(info) ((info) & 0xffff) -#define GetDecompLen(info) ((info) >> 16) - - -#define COMP_OFFSET_BITS 8 - -/* - * The pageMap is indexed by page number and returns an alternate page number - * that identifies a unique page of characters. Many Unicode characters map - * to the same alternate page number. - */ - -static unsigned char compPageMap[] = { - 0, 1, 2, 3, 4, 5, 6, 5, 5, 7, 5, 8, 9, 10, 5, 5, 11, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 12, 13, 5, 14, 15, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5 -}; - -/* - * The groupMap is indexed by combining the alternate page number with - * the page offset and returns a group number that identifies a unique - * set of character attributes. - */ - -static int compGroupMap[] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 65564, 65640, 65738, -1, -1, 30, - 91, 141, 65, 121, 65701, 38, 94, 1, 65604, 124, 44, 100, 12, 76, 77, - -1, 48, 105, 17, 84, 136, 54, 113, 23, 24, -1, -1, -1, -1, -1, -1, - 140, 64, 120, 71, 123, 65573, 99, 10, 75, 129, 47, 104, 16, 15, 83, - 135, -1, 110, 22, 86, 137, 59, 117, 118, 28, 89, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 102, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, -1, - 65713, 65575, 101, 65550, -1, -1, 42, -1, -1, -1, -1, 65576, -1, -1, - -1, -1, 130, 50, 65678, -1, 65628, -1, -1, -1, 115, -1, -1, -1, -1, - -1, 32, -1, 65742, 65600, 67, 65704, -1, -1, 5, -1, -1, -1, -1, 65549, - -1, -1, -1, -1, 107, 20, 65626, -1, 65587, -1, -1, -1, 87, -1, -1, - -1, -1, -1, 142, 66, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 106, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 37, 93, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65624, 65722, -1, -1, -1, -1, 65632, 65730, - -1, -1, -1, -1, -1, -1, 65597, 65699, 65567, 65649, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65728, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, 131, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 119, 33, -1, -1, - -1, -1, -1, -1, 65546, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 65593, 65696, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65675, - 65554, 65625, 65724, -1, -1, -1, -1, 65731, 65590, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 65729, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 131073, 131074, 131075, 131077, 131079, -1, 131080, 131082, 131083, - 131084, 131098, 131102, 131085, -1, -1, 131086, -1, 131087, -1, 131076, - 131078, -1, -1, -1, -1, -1, -1, 131103, -1, -1, -1, -1, -1, -1, -1, - 131088, 131104, 131101, 131097, 131092, 131089, -1, -1, -1, -1, 131094, - 131093, -1, 131090, 131095, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 131091, -1, -1, 131072, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 34, -1, -1, -1, 122, -1, 96, -1, 8, -1, -1, -1, -1, -1, 80, - -1, 65586, -1, -1, -1, 85, -1, -1, -1, 26, -1, -1, 65539, -1, 65707, - -1, -1, 2, -1, -1, -1, 95, -1, 7, -1, 125, -1, -1, -1, -1, -1, 51, - -1, 111, -1, -1, -1, 56, -1, -1, -1, 0, 138, 62, -1, -1, 65664, -1, - -1, -1, 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 65736, -1, -1, -1, -1, -1, -1, -1, -1, -1, 97, -1, -1, - 65714, -1, 103, 14, 65622, 132, -1, 65581, -1, -1, -1, 65727, -1, -1, - -1, -1, 139, -1, -1, -1, 65566, -1, -1, -1, 65706, -1, 65663, -1, -1, - 72, -1, -1, 65670, -1, 79, 133, 65582, 52, -1, 65556, -1, -1, -1, 65687, - -1, -1, -1, -1, 63, -1, -1, -1, 65744, -1, -1, -1, 65659, -1, 65595, - -1, -1, -1, -1, -1, -1, -1, -1, 65658, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 65661, 65545, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 65651, 65542, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 65682, 65559, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 143, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 65733, -1, 65657, -1, -1, -1, -1, -1, -1, -1, -1, 196618, 131108, 196619, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 65618, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65612, -1, -1, 65611, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 65734, -1, -1, -1, -1, -1, -1, -1, - 65656, -1, -1, 65655, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 196611, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 196612, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 196613, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 196614, 196615, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 65577, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131105, -1, -1, - -1, -1, -1, -1, -1, 98, 65584, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 131106, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65578, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 65716, -1, -1, 196616, -1, -1, -1, 127, -1, -1, -1, 65630, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 131107, 196617, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131096, -1, - -1, -1, -1, -1, -1, -1, 19, 65695, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 196610, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 131081, -1, -1, -1, -1, 196608, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 3, -1, -1, 65538, -1, -1, 196609, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65616, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65679, - 65557, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 65685, 65561, -1, -1, -1, -1, -1, -1, 65743, 65601, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 114, 25, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65673, 65553, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 65540, 65605, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 82, 134, 65591, 65692, 65693, 65565, 65641, 65739, 58, - 116, 65568, 65652, 65543, 65609, 65610, 65710, 36, 92, -1, -1, -1, - -1, -1, -1, 9, 73, -1, -1, -1, -1, -1, -1, 53, 108, 65690, 65563, 65639, - 65737, 65598, 65700, 27, 88, 65541, 65606, 65607, 65709, 65572, 65667, - 11, 69, -1, -1, -1, -1, -1, -1, 126, 45, -1, -1, -1, -1, -1, -1, 13, - 78, -1, -1, -1, -1, -1, -1, 55, 112, -1, -1, -1, -1, -1, -1, 29, 90, - -1, -1, -1, -1, -1, -1, -1, 70, -1, -1, -1, -1, -1, -1, 128, 46, 65683, - 65560, 65635, 65732, 65592, 65694, 109, 21, 65642, 65740, 65599, 65702, - 65569, 65653, 65544, -1, -1, -1, 65574, -1, -1, -1, -1, -1, -1, -1, - 65552, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 65537, -1, -1, -1, -1, -1, -1, -1, - -1, 40, -1, -1, -1, -1, -1, -1, 65680, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65570, -1, -1, -1, -1, -1, -1, -1, 4, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 65705, -1, 65660, -1, 65614, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 65698, -1, 65644, -1, 65741, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 65711, -1, -1, -1, -1, 65619, -1, -1, 65676, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65668, -1, 65548, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65648, - -1, -1, -1, -1, -1, -1, 65547, -1, 65715, -1, -1, 65551, -1, -1, -1, - -1, 65681, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 65596, -1, -1, 65647, 65536, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 65721, 65583, -1, -1, 65558, 65631, -1, - -1, 65688, 65562, 65637, 65735, -1, -1, -1, -1, 65646, 65745, -1, -1, - 65571, 65662, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65580, 65579, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65602, -1, - -1, -1, -1, -1, 65613, 65712, -1, 65669, -1, -1, -1, -1, -1, -1, 65555, - 65629, 65725, 65588, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65718, -1, -1, - -1, -1, 65708, -1, 65703, -1, 65697, -1, 65686, -1, 65684, -1, 65677, - -1, 65671, -1, 65665, -1, 65650, -1, 65645, -1, 65638, -1, 65633, -1, - -1, 65623, -1, 65620, -1, 65615, -1, -1, -1, -1, -1, -1, 60, -1, -1, - 74, -1, -1, 68, -1, -1, 61, -1, -1, 57, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 131099, 131100, -1, -1, 65717, -1, -1, -1, -1, - -1, -1, -1, -1, 65691, -1, -1, -1, -1, 65674, -1, 65672, -1, 65666, - -1, 65654, -1, 65643, -1, 65636, -1, 65634, -1, 65627, -1, 65621, -1, - 65617, -1, 65608, -1, 65603, -1, -1, 65594, -1, 65589, -1, 65585, -1, - -1, -1, -1, -1, -1, 41, -1, -1, 31, -1, -1, 49, -1, -1, 43, -1, -1, - 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 65726, 65723, 65720, 65719, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 65689, -1, -1 -}; - -/* - * Lists of compositions for characters that appears only in one composition - */ - -static int compFirstList[][2] = { - {824, 8817}, {837, 8119}, {3530, 3549}, {837, 8116}, {770, 7896}, - {837, 8090}, {776, 1243}, {837, 8076}, {837, 8114}, {783, 1143}, - {780, 494}, {824, 8772}, {824, 8742}, {769, 7727}, {769, 7688}, - {824, 8777}, {837, 8178}, {770, 7879}, {772, 481}, {824, 8938}, - {769, 1116}, {772, 7737}, {824, 8824}, {776, 1259}, {837, 8099}, - {772, 7773}, {824, 8833}, {837, 8083}, {824, 8814}, {837, 8069}, - {776, 1268}, {776, 7802}, {837, 8074}, {837, 8110}, {837, 8183}, - {824, 8840}, {837, 8094}, {775, 7711}, {837, 8130}, {769, 506}, - {769, 7726}, {3031, 2964}, {3158, 3144}, {824, 8931}, {824, 8930}, - {769, 1036}, {776, 1247}, {824, 8821}, {3006, 3019}, {12441, 12489}, - {788, 8172}, {769, 511}, {824, 8941}, {12441, 12487}, {772, 561}, - {837, 8066}, {837, 8102}, {772, 492}, {12441, 12485}, {776, 1261}, - {824, 8802}, {769, 7800}, {837, 8086}, {837, 8108}, {769, 507}, - {775, 7785}, {824, 8876}, {12441, 12482}, {770, 308}, {770, 7897}, - {837, 8091}, {837, 8092}, {12441, 12480}, {837, 8077}, {837, 8078}, - {1620, 1728}, {1620, 1747}, {824, 8877}, {824, 8622}, {12441, 12393}, - {4142, 4134}, {12441, 12478}, {1620, 1730}, {824, 8713}, - {12441, 12391}, {12441, 12476}, {776, 1246}, {12441, 12389}, - {775, 7780}, {774, 7708}, {772, 555}, {12441, 12474}, {769, 510}, - {824, 8939}, {3285, 3275}, {824, 8825}, {775, 7782}, {12441, 12386}, - {12441, 12472}, {837, 8100}, {12441, 12470}, {824, 8928}, - {12441, 12384}, {837, 8084}, {824, 8800}, {837, 8070}, {837, 8106}, - {12441, 12468}, {824, 8655}, {12441, 12382}, {824, 8836}, - {824, 8816}, {824, 8769}, {776, 7803}, {12441, 12380}, {776, 1242}, - {837, 8075}, {837, 8111}, {12441, 12466}, {2364, 2356}, {2364, 2353}, - {1620, 1574}, {776, 1111}, {776, 1273}, {824, 8603}, {783, 1142}, - {824, 8841}, {776, 1260}, {837, 8180}, {12441, 12378}, {12441, 12464}, - {837, 8095}, {824, 8740}, {824, 8879}, {769, 1107}, {12441, 12376}, - {12441, 12462}, {770, 7878}, {12441, 12460}, {772, 480}, - {824, 8716}, {12441, 12374}, {772, 554}, {772, 7736}, {837, 8135}, - {824, 8813}, {776, 1258}, {837, 8098}, {12441, 12372}, {772, 7772}, - {12441, 12370}, {776, 1255}, {824, 8832}, {12441, 12542}, - {837, 8082}, {12441, 12532}, {837, 8067}, {837, 8068}, {837, 8103}, - {3390, 3403}, {772, 493}, {12441, 12368}, {824, 8653}, {769, 7801}, - {837, 8087}, {775, 7710}, {837, 8109}, {12441, 12366}, {769, 7689}, - {824, 8602}, {776, 1272}, {837, 8132}, {12441, 12364}, {837, 8093}, - {837, 8079}, {824, 8708}, {824, 8878}, {772, 478}, {769, 1027}, - {824, 8775}, {3285, 3264}, {12441, 12446}, {12441, 12436}, - {12441, 12538}, {12441, 12537}, {824, 8820}, {775, 7781}, - {12441, 12536}, {774, 7709}, {824, 8940}, {12441, 12535}, - {776, 1254}, {775, 7835}, {780, 495}, {775, 7783}, {772, 560}, - {837, 8101}, {1620, 1572}, {2364, 2345}, {824, 8929}, {776, 1031}, - {837, 8085}, {824, 8815}, {837, 8071}, {837, 8107}, {824, 8654}, - {772, 479}, {775, 7784}, {776, 1269}, {824, 8837} -}; - -static int compSecondList[][2] = { - {3545, 3548}, {3545, 3550}, {3398, 3404}, {2503, 2507}, {2503, 2508}, - {2887, 2891}, {2887, 2888}, {2887, 2892}, {3270, 3274}, {3270, 3272}, - {1575, 1570}, {1575, 1573} -}; - -/* - * Compositions matrix - */ - -static int compBothList[144][37] = { - { - 8179, 8060, 974, 0, 8032, 0, 8033, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 204, 205, 206, 0, 296, 0, 298, 300, 0, 304, 207, 7880, 463, - 520, 522, 7882, 302, 7724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0 - }, - { - 8115, 8048, 940, 0, 7936, 0, 7937, 8113, 8112, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 8157, 8158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7873, 7871, 0, 0, 7877, 0, 0, 0, 0, 0, 0, 7875, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7846, 7844, 0, 0, 7850, 0, 0, 0, 0, 0, 0, 7848, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 8131, 8052, 942, 0, 7968, 0, 7969, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 8154, 906, 0, 7992, 0, 7993, 8153, 8152, 0, 0, 938, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0 - }, - { - 0, 7962, 7964, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 293, 0, 0, 0, 0, 0, 0, 7715, 7719, 0, 543, 0, 0, 7717, - 0, 0, 0, 7721, 7723, 0, 7830, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 - }, - { - 0, 7986, 7988, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 504, 323, 0, 0, 209, 0, 0, 0, 0, 7748, 0, 0, 327, 0, 0, 7750, - 0, 0, 0, 325, 0, 7754, 7752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0 - }, - { - 0, 8002, 8004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 1217, 0, 0, 1244, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 505, 324, 0, 0, 241, 0, 0, 0, 0, 7749, 0, 0, 328, 0, 0, 7751, - 0, 0, 0, 326, 0, 7755, 7753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0 - }, - { - 0, 0, 7743, 0, 0, 0, 0, 0, 0, 0, 7745, 0, 0, 0, 0, 0, 7747, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7786, 0, 0, 356, 0, 0, 7788, 0, 0, - 0, 354, 0, 7792, 7790, 0, 538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7701, 7703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 7757, 0, 0, 0, 0, 557, 0, 0, 0, 7759, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 8105, 8043, 8045, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 8047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 347, 349, 0, 0, 0, 0, 0, 0, 7777, 0, 0, 353, 0, 0, 7779, - 0, 0, 0, 351, 0, 0, 0, 0, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7922, 221, 374, 0, 7928, 0, 562, 0, 0, 7822, 376, 7926, 0, 0, - 0, 7924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 - }, - { - 0, 0, 377, 7824, 0, 0, 0, 0, 0, 0, 379, 0, 0, 381, 0, 0, 7826, - 0, 0, 0, 0, 0, 0, 7828, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 7853, 0, 0, 0, 0, 7863, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 8188, 8186, 911, 0, 8040, 0, 8041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 8088, 7978, 7980, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7982, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7923, 253, 375, 0, 7929, 0, 563, 0, 0, 7823, 255, 7927, 0, 0, - 0, 7925, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7833, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 - }, - { - 0, 8018, 8020, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8022, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 192, 193, 194, 0, 195, 0, 256, 258, 0, 550, 196, 7842, 461, - 512, 514, 7840, 260, 0, 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, 7680, 0, - 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12499, 12500, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7847, 7845, 0, 0, 7851, 0, 0, 0, 0, 0, 0, 7849, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7915, 7913, 0, 0, 7919, 0, 0, 0, 0, 0, 0, 7917, 0, 0, 0, 7921, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 8124, 8122, 902, 0, 7944, 0, 7945, 8121, 8120, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12508, 12509, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7954, 7956, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7760, 7762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 500, 284, 0, 0, 0, 7712, 286, 0, 288, 0, 0, 486, 0, 0, 0, - 0, 0, 0, 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 979, 0, 0, 0, 0, 0, 0, 0, 0, 980, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 8141, 8142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12496, 12497, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7872, 7870, 0, 0, 7876, 0, 0, 0, 0, 0, 0, 7874, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12505, 12506, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 317, 0, 0, 7734, 0, 0, - 0, 315, 0, 7740, 7738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7995, 7997, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 8097, 8035, 8037, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 8039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 7729, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 489, 0, 0, 7731, 0, 0, - 0, 311, 0, 0, 7733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 340, 0, 0, 0, 0, 0, 0, 0, 7768, 0, 0, 344, 528, 530, 7770, - 0, 0, 0, 342, 0, 0, 7774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12502, 12503, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 7756, 0, 0, 0, 0, 556, 0, 0, 0, 7758, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 8056, 972, 0, 8000, 0, 8001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 1117, 0, 0, 0, 0, 0, 1251, 1081, 0, 0, 1253, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 8080, 7970, 7972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7808, 7810, 372, 0, 0, 0, 0, 0, 0, 7814, 7812, 0, 0, 0, 0, 7816, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 8010, 8012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 8058, 973, 0, 8016, 0, 8017, 8161, 8160, 0, 0, 971, 0, 0, 0, - 0, 0, 0, 0, 8166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12412, 12413, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 8072, 7946, 7948, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7950, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 7805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7807, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12400, 12401, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12409, 12410, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 8162, 944, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8167, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 1263, 1118, 0, 0, 1265, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1267, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7683, 0, 0, 0, 0, 0, 7685, 0, 0, - 0, 0, 0, 0, 7687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7690, 0, 0, 270, 0, 0, 7692, 0, 0, - 0, 7696, 0, 7698, 7694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7857, 7855, 0, 0, 7861, 0, 0, 0, 0, 0, 0, 7859, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 509, 0, 0, 0, 0, 483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12406, 12407, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7987, 7989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7991, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 8027, 8029, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8031, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7691, 0, 0, 271, 0, 0, 7693, 0, 0, - 0, 7697, 0, 7699, 7695, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 1233, 0, 0, 1235, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7963, 7965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12403, 12404, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 236, 237, 238, 0, 297, 0, 299, 301, 0, 0, 239, 7881, 464, 521, - 523, 7883, 303, 7725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 - }, - { - 0, 210, 211, 212, 0, 213, 0, 332, 334, 0, 558, 214, 7886, 465, - 524, 526, 7884, 490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 336, 416, - 0, 0, 0, 0, 0 - }, - { - 0, 0, 7764, 0, 0, 0, 0, 0, 0, 0, 7766, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 8003, 8005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 1104, 0, 0, 0, 0, 0, 0, 1239, 0, 0, 1105, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 8184, 908, 0, 8008, 0, 8009, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7900, 7898, 0, 0, 7904, 0, 0, 0, 0, 0, 0, 7902, 0, 0, 0, 7906, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 8064, 7938, 7940, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 242, 243, 244, 0, 245, 0, 333, 335, 0, 559, 246, 7887, 466, - 525, 527, 7885, 491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 337, 417, - 0, 0, 0, 0, 0 - }, - { - 0, 217, 218, 219, 0, 360, 0, 362, 364, 0, 0, 220, 7910, 467, 532, - 534, 7908, 370, 7796, 0, 0, 0, 7798, 0, 0, 0, 366, 0, 0, 0, 368, - 431, 7794, 0, 0, 0, 0 - }, - { - 0, 8170, 910, 0, 0, 0, 8025, 8169, 8168, 0, 0, 939, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7787, 7831, 0, 357, 0, 0, 7789, 0, - 0, 0, 355, 0, 7793, 7791, 0, 539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0 - }, - { - 0, 476, 472, 0, 0, 0, 0, 470, 0, 0, 0, 0, 0, 474, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 8089, 7979, 7981, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7983, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 378, 7825, 0, 0, 0, 0, 0, 0, 380, 0, 0, 382, 0, 0, 7827, - 0, 0, 0, 0, 0, 0, 7829, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 8019, 8021, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8023, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7682, 0, 0, 0, 0, 0, 7684, 0, 0, - 0, 0, 0, 0, 7686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7955, 7957, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7761, 7763, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 292, 0, 0, 0, 0, 0, 0, 7714, 7718, 0, 542, 0, 0, 7716, - 0, 0, 0, 7720, 7722, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0 - }, - { - 0, 8050, 941, 0, 7952, 0, 7953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 8140, 8138, 905, 0, 7976, 0, 7977, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 1232, 0, 0, 1234, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3018, 3020, 0, 0 - }, - { - 0, 0, 501, 285, 0, 0, 0, 7713, 287, 0, 289, 0, 0, 487, 0, 0, 0, - 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 7742, 0, 0, 0, 0, 0, 0, 0, 7744, 0, 0, 0, 0, 0, 7746, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 508, 0, 0, 0, 0, 482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 8173, 901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8129, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 1024, 0, 0, 0, 0, 0, 0, 1238, 0, 0, 1025, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 318, 0, 0, 7735, 0, 0, - 0, 316, 0, 7741, 7739, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 346, 348, 0, 0, 0, 0, 0, 0, 7776, 0, 0, 352, 0, 0, 7778, - 0, 0, 0, 350, 0, 0, 0, 0, 536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7700, 7702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7891, 7889, 0, 0, 7895, 0, 0, 0, 0, 0, 0, 7893, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 8081, 7971, 7973, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7975, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 8104, 8042, 8044, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 8046, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 341, 0, 0, 0, 0, 0, 0, 0, 7769, 0, 0, 345, 529, 531, 7771, - 0, 0, 0, 343, 0, 0, 7775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - - }, - { - 0, 0, 0, 0, 8164, 0, 8165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 8011, 8013, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7818, 7820, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 7852, 0, 0, 0, 0, 7862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 475, 471, 0, 0, 0, 0, 469, 0, 0, 0, 0, 0, 473, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 8073, 7947, 7949, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7951, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7809, 7811, 373, 0, 0, 0, 0, 0, 0, 7815, 7813, 0, 0, 0, 0, 7817, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 7832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7819, 7821, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7914, 7912, 0, 0, 7918, 0, 0, 0, 0, 0, 0, 7916, 0, 0, 0, 7920, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 263, 265, 0, 0, 0, 0, 0, 0, 267, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 200, 201, 202, 0, 7868, 0, 274, 276, 0, 278, 203, 7866, 282, - 516, 518, 7864, 280, 7706, 0, 552, 0, 7704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 8136, 904, 0, 7960, 0, 7961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 232, 233, 234, 0, 7869, 0, 275, 277, 0, 279, 235, 7867, 283, - 517, 519, 7865, 281, 7707, 0, 553, 0, 7705, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 7728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 488, 0, 0, 7730, 0, 0, - 0, 310, 0, 0, 7732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 8054, 943, 0, 7984, 0, 7985, 8145, 8144, 0, 0, 970, 0, 0, 0, - 0, 0, 0, 0, 8150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 - }, - { - 0, 7994, 7996, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3271, 0 - }, - { - 8096, 8034, 8036, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 8038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 496, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7890, 7888, 0, 0, 7894, 0, 0, 0, 0, 0, 0, 7892, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7901, 7899, 0, 0, 7905, 0, 0, 0, 0, 0, 0, 7903, 0, 0, 0, 7907, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 1037, 0, 0, 0, 0, 0, 1250, 1049, 0, 0, 1252, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 1218, 0, 0, 1245, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 8065, 7939, 7941, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7943, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 7765, 0, 0, 0, 0, 0, 0, 0, 7767, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 7804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7806, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 249, 250, 251, 0, 361, 0, 363, 365, 0, 0, 252, 7911, 468, 533, - 535, 7909, 371, 7797, 0, 0, 0, 7799, 0, 0, 0, 367, 0, 0, 0, 369, - 432, 7795, 0, 0, 0, 0 - }, - { - 0, 8146, 912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8151, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 1262, 1038, 0, 0, 1264, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1266, 0, 0, 0, 0, 0, 0 - }, - { - 0, 224, 225, 226, 0, 227, 0, 257, 259, 0, 551, 228, 7843, 462, - 513, 515, 7841, 261, 0, 0, 0, 0, 0, 0, 0, 0, 229, 0, 0, 7681, 0, - 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 262, 264, 0, 0, 0, 0, 0, 0, 266, 0, 0, 268, 0, 0, 0, 0, 0, - 0, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 7856, 7854, 0, 0, 7860, 0, 0, 0, 0, 0, 0, 7858, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1571 - }, -}; - - -#define GetUniCharCompInfo(ch) (compGroupMap[(compPageMap[(((int)(ch)) & 0x1fffff) >> COMP_OFFSET_BITS] << COMP_OFFSET_BITS) | ((ch) & ((1 << COMP_OFFSET_BITS)-1))]) - -#define CompSingleMask (1 << 16) -#define CompMask ((1 << 16) - 1) -#define CompSecondMask (1 << 17) - diff --git a/src/stringprep/uni_parse.tcl b/src/stringprep/uni_parse.tcl deleted file mode 100644 index 100631b6b..000000000 --- a/src/stringprep/uni_parse.tcl +++ /dev/null @@ -1,437 +0,0 @@ -# uni_parse.tcl -- -# -# This program parses the UnicodeData file and generates the -# corresponding uni_data.c file with compressed character -# data tables. The input to this program should be rfc3454.txt -# -# Copyright (c) 1998-1999 by Scriptics Corporation. -# All rights reserved. -# -# Modified for ejabberd by Alexey Shchepin -# -# RCS: @(#) $Id$ - - -namespace eval uni { - set shift 8; # number of bits of data within a page - # This value can be adjusted to find the - # best split to minimize table size - - variable pMap; # map from page to page index, each entry is - # an index into the pages table, indexed by - # page number - variable pages; # map from page index to page info, each - # entry is a list of indices into the groups - # table, the list is indexed by the offset - variable groups; # list of character info values, indexed by - # group number, initialized with the - # unassigned character group -} - -proc uni::getValue {i} { - variable casemap - variable casemap2 - variable tablemap - - if {[info exists tablemap($i)]} { - set tables $tablemap($i) - } else { - set tables {} - } - - if {[info exists casemap2($i)]} { - set multicase 1 - set delta $casemap2($i) - } else { - set multicase 0 - if {[info exists casemap($i)]} { - set delta $casemap($i) - } else { - set delta 0 - } - } - - if {abs($delta) > 0xFFFFF} { - puts "delta must be less than 22 bits wide" - exit - } - - set ac 0 - set c11 0 - set c21 0 - set b1 0 - set d1 0 - set d2 0 - set xnp 0 - - foreach tab $tables { - switch -glob -- $tab { - C.1.1 {set c11 1} - C.2.1 {set c21 1} - C.* {set ac 1} - A.1 {set ac 1} - B.1 {set b1 1} - D.1 {set d1 1} - D.2 {set d2 1} - XNP {set xnp 1} - } - } - - set val [expr {($ac << 0) | - ($c11 << 1) | - ($c21 << 2) | - ($b1 << 3) | - ($d1 << 4) | - ($d2 << 5) | - ($xnp << 6) | - ($multicase << 7) | - ($delta << 11)}] - - return $val -} - -proc uni::getGroup {value} { - variable groups - - set gIndex [lsearch -exact $groups $value] - if {$gIndex == -1} { - set gIndex [llength $groups] - lappend groups $value - } - return $gIndex -} - -proc uni::addPage {info} { - variable pMap - variable pages - variable pages_map - - if {[info exists pages_map($info)]} { - lappend pMap $pages_map($info) - } else { - set pIndex [llength $pages] - lappend pages $info - set pages_map($info) $pIndex - lappend pMap $pIndex - } - return -} - - -proc uni::load_tables {data} { - variable casemap - variable casemap2 - variable multicasemap - variable tablemap - - set multicasemap {} - set table "" - - foreach line [split $data \n] { - if {$table == ""} { - if {[regexp { ----- Start Table (.*) -----} $line temp table]} { - #puts "Start table '$table'" - } - } else { - if {[regexp { ----- End Table (.*) -----} $line temp table1]} { - set table "" - } else { - if {$table == "B.1"} { - if {[regexp {^ ([[:xdigit:]]+); ;} $line \ - temp val]} { - scan $val %x val - if {$val <= 0x10ffff} { - lappend tablemap($val) $table - } - } - } elseif {$table == "B.2"} { - if {[regexp {^ ([[:xdigit:]]+); ([[:xdigit:]]+);} $line \ - temp from to]} { - scan $from %x from - scan $to %x to - if {$from <= 0x10ffff && $to <= 0x10ffff} { - set casemap($from) [expr {$to - $from}] - } - } elseif {[regexp {^ ([[:xdigit:]]+); ([[:xdigit:]]+) ([[:xdigit:]]+);} $line \ - temp from to1 to2]} { - scan $from %x from - scan $to1 %x to1 - scan $to2 %x to2 - if {$from <= 0x10ffff && \ - $to1 <= 0x10ffff && $to2 <= 0x10ffff} { - set casemap2($from) [llength $multicasemap] - lappend multicasemap [list $to1 $to2] - } - } elseif {[regexp {^ ([[:xdigit:]]+); ([[:xdigit:]]+) ([[:xdigit:]]+) ([[:xdigit:]]+);} $line \ - temp from to1 to2 to3]} { - scan $from %x from - scan $to1 %x to1 - scan $to2 %x to2 - scan $to3 %x to3 - if {$from <= 0x10ffff && \ - $to1 <= 0x10ffff && $to2 <= 0x10ffff && \ - $to3 <= 0x10ffff} { - set casemap2($from) [llength $multicasemap] - lappend multicasemap [list $to1 $to2 $to3] - } - } else { - #puts "missed: $line" - } - - } elseif {$table != "B.3"} { - if {[regexp {^ ([[:xdigit:]]+)-([[:xdigit:]]+)} $line \ - temp from to]} { - scan $from %x from - scan $to %x to - for {set i $from} {$i <= $to && $i <= 0x10ffff} {incr i} { - lappend tablemap($i) $table - } - } elseif {[regexp {^ ([[:xdigit:]]+)} $line \ - temp val]} { - scan $val %x val - if {$val <= 0x10ffff} { - lappend tablemap($val) $table - } - } - } - } - } - } - - # XMPP nodeprep prohibited - foreach val {22 26 27 2f 3a 3c 3e 40} { - scan $val %x val - lappend tablemap($val) XNP - } -} - -proc uni::buildTables {} { - variable shift - - variable casemap - variable tablemap - - variable pMap {} - variable pages {} - variable groups {} - set info {} ;# temporary page info - - set mask [expr {(1 << $shift) - 1}] - - set next 0 - - for {set i 0} {$i <= 0x10ffff} {incr i} { - set gIndex [getGroup [getValue $i]] - - # Split character index into offset and page number - set offset [expr {$i & $mask}] - set page [expr {($i >> $shift)}] - - # Add the group index to the info for the current page - lappend info $gIndex - - # If this is the last entry in the page, add the page - if {$offset == $mask} { - addPage $info - set info {} - } - } - return -} - -proc uni::main {} { - global argc argv0 argv - variable pMap - variable pages - variable groups - variable shift - variable multicasemap - - if {$argc != 2} { - puts stderr "\nusage: $argv0 \n" - exit 1 - } - set f [open [lindex $argv 0] r] - set data [read $f] - close $f - - load_tables $data - buildTables - puts "X = [llength $pMap] Y= [llength $pages] A= [llength $groups]" - set size [expr {[llength $pMap] + [llength $pages]*(1<<$shift)}] - puts "shift = $shift, space = $size" - - set f [open [file join [lindex $argv 1] uni_data.c] w] - fconfigure $f -translation lf - puts $f "/* - * uni_data.c -- - * - * Declarations of Unicode character information tables. This file is - * automatically generated by the uni_parse.tcl script. Do not - * modify this file by hand. - * - * Copyright (c) 1998 by Scriptics Corporation. - * All rights reserved. - * - * Modified for ejabberd by Alexey Shchepin - * - * RCS: @(#) \$Id\$ - */ - -/* - * A 16-bit Unicode character is split into two parts in order to index - * into the following tables. The lower OFFSET_BITS comprise an offset - * into a page of characters. The upper bits comprise the page number. - */ - -#define OFFSET_BITS $shift - -/* - * The pageMap is indexed by page number and returns an alternate page number - * that identifies a unique page of characters. Many Unicode characters map - * to the same alternate page number. - */ - -static unsigned char pageMap\[\] = {" - set line " " - set last [expr {[llength $pMap] - 1}] - for {set i 0} {$i <= $last} {incr i} { - append line [lindex $pMap $i] - if {$i != $last} { - append line ", " - } - if {[string length $line] > 70} { - puts $f $line - set line " " - } - } - puts $f $line - puts $f "}; - -/* - * The groupMap is indexed by combining the alternate page number with - * the page offset and returns a group number that identifies a unique - * set of character attributes. - */ - -static unsigned short int groupMap\[\] = {" - set line " " - set lasti [expr {[llength $pages] - 1}] - for {set i 0} {$i <= $lasti} {incr i} { - set page [lindex $pages $i] - set lastj [expr {[llength $page] - 1}] - for {set j 0} {$j <= $lastj} {incr j} { - append line [lindex $page $j] - if {$j != $lastj || $i != $lasti} { - append line ", " - } - if {[string length $line] > 70} { - puts $f $line - set line " " - } - } - } - puts $f $line - puts $f "}; - -/* - * Each group represents a unique set of character attributes. The attributes - * are encoded into a 32-bit value as follows: - * - * Bit 0 A.1 | C.1.2 | C.2.2 | C.3 -- C.9 - * - * Bit 1 C.1.1 - * - * Bit 2 C.2.1 - * - * Bit 3 B.1 - * - * Bit 4 D.1 - * - * Bit 5 D.2 - * - * Bit 6 XNP - * - * Bit 7 Case maps to several characters - * - * Bits 8-10 Reserved for future use. - * - * Bits 11-31 Case delta: delta for case conversions. This should be the - * highest field so we can easily sign extend. - */ - -static int groups\[\] = {" - set line " " - set last [expr {[llength $groups] - 1}] - for {set i 0} {$i <= $last} {incr i} { - set val [lindex $groups $i] - - append line [format "%d" $val] - if {$i != $last} { - append line ", " - } - if {[string length $line] > 65} { - puts $f $line - set line " " - } - } - puts $f $line - puts $f "}; - -/* - * Table for characters that lowercased to multiple ones - */ - -static int multiCaseTable\[\]\[4\] = {" - set last [expr {[llength $multicasemap] - 1}] - for {set i 0} {$i <= $last} {incr i} { - set val [lindex $multicasemap $i] - - set line " " - append line [format "{%d, %s}" [llength $val] [join $val ", "]] - if {$i != $last} { - append line ", " - } - puts $f $line - } - puts $f "}; - -/* - * The following constants are used to determine the category of a - * Unicode character. - */ - -#define ACMask (1 << 0) -#define C11Mask (1 << 1) -#define C21Mask (1 << 2) -#define B1Mask (1 << 3) -#define D1Mask (1 << 4) -#define D2Mask (1 << 5) -#define XNPMask (1 << 6) -#define MCMask (1 << 7) - -/* - * The following macros extract the fields of the character info. The - * GetDelta() macro is complicated because we can't rely on the C compiler - * to do sign extension on right shifts. - */ - -#define GetCaseType(info) (((info) & 0xE0) >> 5) -#define GetCategory(info) ((info) & 0x1F) -#define GetDelta(info) (((info) > 0) ? ((info) >> 11) : (~(~((info)) >> 11))) -#define GetMC(info) (multiCaseTable\[GetDelta(info)\]) - -/* - * This macro extracts the information about a character from the - * Unicode character tables. - */ - -#define GetUniCharInfo(ch) (groups\[groupMap\[(pageMap\[(((int)(ch)) & 0x1fffff) >> OFFSET_BITS\] << OFFSET_BITS) | ((ch) & ((1 << OFFSET_BITS)-1))\]\]) -" - - close $f -} - -uni::main - -return diff --git a/src/stringprep/uni_parse2.tcl b/src/stringprep/uni_parse2.tcl deleted file mode 100644 index 950090a09..000000000 --- a/src/stringprep/uni_parse2.tcl +++ /dev/null @@ -1,702 +0,0 @@ -# uni_parse2.tcl -- -# -# This program parses the UnicodeData file and generates the -# corresponding uni_norm.c file with compressed character -# data tables. The input to this program should be -# UnicodeData-3.2.0.txt and CompositionExclusions-3.2.0.txt files from: -# ftp://ftp.unicode.org/Public/UNIDATA/ -# -# Copyright (c) 1998-1999 by Scriptics Corporation. -# All rights reserved. -# -# Modified for ejabberd by Alexey Shchepin -# -# RCS: @(#) $Id$ - - -namespace eval uni { - set cclass_shift 8 - set decomp_shift 8 - set comp_shift 8 - set shift 5; # number of bits of data within a page - # This value can be adjusted to find the - # best split to minimize table size - - variable pMap; # map from page to page index, each entry is - # an index into the pages table, indexed by - # page number - variable pages; # map from page index to page info, each - # entry is a list of indices into the groups - # table, the list is indexed by the offset - variable groups; # list of character info values, indexed by - # group number, initialized with the - # unassigned character group - - variable categories { - Cn Lu Ll Lt Lm Lo Mn Me Mc Nd Nl No Zs Zl Zp - Cc Cf Co Cs Pc Pd Ps Pe Pi Pf Po Sm Sc Sk So - }; # Ordered list of character categories, must - # match the enumeration in the header file. - - variable titleCount 0; # Count of the number of title case - # characters. This value is used in the - # regular expression code to allocate enough - # space for the title case variants. -} - -proc uni::getValue {items index} { - variable categories - variable titleCount - - # Extract character info - - set category [lindex $items 2] - if {[scan [lindex $items 12] %4x toupper] == 1} { - set toupper [expr {$index - $toupper}] - } else { - set toupper {} - } - if {[scan [lindex $items 13] %4x tolower] == 1} { - set tolower [expr {$tolower - $index}] - } else { - set tolower {} - } - if {[scan [lindex $items 14] %4x totitle] == 1} { - set totitle [expr {$index - $totitle}] - } else { - set totitle {} - } - - set categoryIndex [lsearch -exact $categories $category] - if {$categoryIndex < 0} { - puts "Unexpected character category: $index($category)" - set categoryIndex 0 - } elseif {$category == "Lt"} { - incr titleCount - } - - return "$categoryIndex,$toupper,$tolower,$totitle" -} - -proc uni::getGroup {value} { - variable groups - - set gIndex [lsearch -exact $groups $value] - if {$gIndex == -1} { - set gIndex [llength $groups] - lappend groups $value - } - return $gIndex -} - -proc uni::addPage {info} { - variable pMap - variable pages - - set pIndex [lsearch -exact $pages $info] - if {$pIndex == -1} { - set pIndex [llength $pages] - lappend pages $info - } - lappend pMap $pIndex - return -} - -proc uni::addPage {map_var pages_var info} { - variable $map_var - variable $pages_var - - set pIndex [lsearch -exact [set $pages_var] $info] - if {$pIndex == -1} { - set pIndex [llength [set $pages_var]] - lappend $pages_var $info - } - lappend $map_var $pIndex - return -} - -proc uni::load_exclusions {data} { - variable exclusions - - foreach line [split $data \n] { - if {$line == ""} continue - - set items [split $line " "] - - if {[lindex $items 0] == "#"} continue - - scan [lindex $items 0] %x index - - set exclusions($index) "" - } -} - -proc uni::load_tables {data} { - variable cclass_map - variable decomp_map - variable comp_map - variable comp_first - variable comp_second - variable exclusions - - foreach line [split $data \n] { - if {$line == ""} continue - - set items [split $line \;] - - scan [lindex $items 0] %x index - set cclass [lindex $items 3] - set decomp [lindex $items 5] - - set cclass_map($index) $cclass - #set decomp_map($index) $cclass - - if {$decomp != ""} { - if {[string index [lindex $decomp 0] 0] == "<"} { - set decomp1 [lreplace $decomp 0 0] - set decomp {} - foreach ch $decomp1 { - scan $ch %x ch - lappend decomp $ch - } - set decomp_map($index) $decomp - } else { - switch -- [llength $decomp] { - 1 { - scan $decomp %x ch - set decomp_map($index) $ch - } - 2 { - scan $decomp "%x %x" ch1 ch2 - set decomp [list $ch1 $ch2] - set decomp_map($index) $decomp - # hackish - if {(![info exists cclass_map($ch1)] || \ - $cclass_map($ch1) == 0) && \ - ![info exists exclusions($index)]} { - if {[info exists comp_first($ch1)]} { - incr comp_first($ch1) - } else { - set comp_first($ch1) 1 - } - if {[info exists comp_second($ch2)]} { - incr comp_second($ch2) - } else { - set comp_second($ch2) 1 - } - set comp_map($decomp) $index - } else { - puts "Excluded $index" - } - } - default { - puts "Bad canonical decomposition: $line" - } - } - } - - #puts "[format 0x%0.4x $index]\t$cclass\t$decomp_map($index)" - } - } - #puts [array get comp_first] - #puts [array get comp_second] -} - -proc uni::buildTables {} { - variable cclass_shift - variable decomp_shift - variable comp_shift - - variable cclass_map - variable cclass_pmap {} - variable cclass_pages {} - variable decomp_map - variable decomp_pmap {} - variable decomp_pages {} - variable decomp_list {} - variable comp_map - variable comp_pmap {} - variable comp_pages {} - variable comp_first - variable comp_second - variable comp_first_list {} - variable comp_second_list {} - variable comp_x_list {} - variable comp_y_list {} - variable comp_both_map {} - - set cclass_info {} - set decomp_info {} - set comp_info {} - - set cclass_mask [expr {(1 << $cclass_shift) - 1}] - set decomp_mask [expr {(1 << $decomp_shift) - 1}] - set comp_mask [expr {(1 << $comp_shift) - 1}] - - foreach comp [array names comp_map] { - set ch1 [lindex $comp 0] - if {[info exists comp_first($ch1)] && $comp_first($ch1) > 0 && \ - [info exists comp_second($ch1)] && $comp_second($ch1) > 0} { - if {[lsearch -exact $comp_x_list $ch1] < 0} { - set i [llength $comp_x_list] - lappend comp_x_list $ch1 - set comp_info_map($ch1) $i - lappend comp_y_list $ch1 - set comp_info_map($ch1) $i - puts "There should be no symbols which appears on" - puts "both first and second place in composition" - exit - } - } - } - - foreach comp [array names comp_map] { - set ch1 [lindex $comp 0] - set ch2 [lindex $comp 1] - - if {$comp_first($ch1) == 1 && ![info exists comp_second($ch1)]} { - set i [llength $comp_first_list] - lappend comp_first_list [list $ch2 $comp_map($comp)] - set comp_info_map($ch1) [expr {$i | (1 << 16)}] - } elseif {$comp_second($ch2) == 1 && ![info exists comp_first($ch2)]} { - set i [llength $comp_second_list] - lappend comp_second_list [list $ch1 $comp_map($comp)] - set comp_info_map($ch2) [expr {$i | (1 << 16) | (1 << 17)}] - } else { - if {[lsearch -exact $comp_x_list $ch1] < 0} { - set i [llength $comp_x_list] - lappend comp_x_list $ch1 - set comp_info_map($ch1) $i - } - if {[lsearch -exact $comp_y_list $ch2] < 0} { - set i [llength $comp_y_list] - lappend comp_y_list $ch2 - set comp_info_map($ch2) [expr {$i | (1 << 17)}] - } - } - } - - set next 0 - - for {set i 0} {$i <= 0x10ffff} {incr i} { - #set gIndex [getGroup [getValue $i]] - - set cclass_offset [expr {$i & $cclass_mask}] - - if {[info exists cclass_map($i)]} { - set cclass $cclass_map($i) - } else { - set cclass 0 - } - lappend cclass_info $cclass - - if {$cclass_offset == $cclass_mask} { - addPage cclass_pmap cclass_pages $cclass_info - set cclass_info {} - } - - - set decomp_offset [expr {$i & $decomp_mask}] - - if {[info exists decomp_map($i)]} { - set decomp $decomp_map($i) - set b 1 - while {$b} { - set b 0 - for {set j 0} {$j < [llength $decomp]} {incr j} { - if {[info exists \ - decomp_map([set ch1 [lindex $decomp $j]])]} { - #puts -$decomp - set decomp [eval [list lreplace $decomp $j $j] \ - $decomp_map($ch1)] - #puts +$decomp - set b 1 - } - } - } - - if {[info exists decomp_used($decomp)]} { - lappend decomp_info $decomp_used($decomp) - } else { - set val [expr {([llength $decomp] << 16) + \ - [llength $decomp_list]}] - #set val [expr {[llength $decomp_list]}] - lappend decomp_info $val - set decomp_used($decomp) $val - #puts "$val $decomp" - foreach d $decomp { - lappend decomp_list $d - } - } - } else { - lappend decomp_info -1 - } - - if {$decomp_offset == $decomp_mask} { - addPage decomp_pmap decomp_pages $decomp_info - set decomp_info {} - } - - - set comp_offset [expr {$i & $comp_mask}] - - if {[info exists comp_info_map($i)]} { - set comp $comp_info_map($i) - } else { - set comp -1 - } - lappend comp_info $comp - - if {$comp_offset == $comp_mask} { - addPage comp_pmap comp_pages $comp_info - set comp_info {} - } - } - - #puts [array get decomp_map] - #puts $decomp_list - - return -} - -proc uni::main {} { - global argc argv0 argv - variable cclass_shift - variable cclass_pmap - variable cclass_pages - variable decomp_shift - variable decomp_pmap - variable decomp_pages - variable decomp_list - variable comp_shift - variable comp_map - variable comp_pmap - variable comp_pages - variable comp_first_list - variable comp_second_list - variable comp_x_list - variable comp_y_list - variable pages - variable groups {} - variable titleCount - - if {$argc != 3} { - puts stderr "\nusage: $argv0 \n" - exit 1 - } - set f [open [lindex $argv 1] r] - set data [read $f] - close $f - - load_exclusions $data - - set f [open [lindex $argv 0] r] - set data [read $f] - close $f - - load_tables $data - buildTables - #puts "X = [llength $pMap] Y= [llength $pages] A= [llength $groups]" - #set size [expr {[llength $pMap] + [llength $pages]*(1<<$shift)}] - #puts "shift = 6, space = $size" - #puts "title case count = $titleCount" - - set f [open [file join [lindex $argv 2] uni_norm.c] w] - fconfigure $f -translation lf - puts $f "/* - * uni_norm.c -- - * - * Declarations of Unicode character information tables. This file is - * automatically generated by the uni_parse2.tcl script. Do not - * modify this file by hand. - * - * Copyright (c) 1998 by Scriptics Corporation. - * All rights reserved. - * - * Modified for ejabberd by Alexey Shchepin - * - * RCS: @(#) \$Id\$ - */ - -/* - * A 16-bit Unicode character is split into two parts in order to index - * into the following tables. The lower CCLASS_OFFSET_BITS comprise an offset - * into a page of characters. The upper bits comprise the page number. - */ - -#define CCLASS_OFFSET_BITS $cclass_shift - -/* - * The pageMap is indexed by page number and returns an alternate page number - * that identifies a unique page of characters. Many Unicode characters map - * to the same alternate page number. - */ - -static unsigned char cclassPageMap\[\] = {" - set line " " - set last [expr {[llength $cclass_pmap] - 1}] - for {set i 0} {$i <= $last} {incr i} { - append line [lindex $cclass_pmap $i] - if {$i != $last} { - append line ", " - } - if {[string length $line] > 70} { - puts $f $line - set line " " - } - } - puts $f $line - puts $f "}; - -/* - * The cclassGroupMap is indexed by combining the alternate page number with - * the page offset and returns a combining class number. - */ - -static unsigned char cclassGroupMap\[\] = {" - set line " " - set lasti [expr {[llength $cclass_pages] - 1}] - for {set i 0} {$i <= $lasti} {incr i} { - set page [lindex $cclass_pages $i] - set lastj [expr {[llength $page] - 1}] - for {set j 0} {$j <= $lastj} {incr j} { - append line [lindex $page $j] - if {$j != $lastj || $i != $lasti} { - append line ", " - } - if {[string length $line] > 70} { - puts $f $line - set line " " - } - } - } - puts $f $line - puts $f "}; - -#define GetUniCharCClass(ch) (cclassGroupMap\[(cclassPageMap\[(((int)(ch)) & 0x1fffff) >> CCLASS_OFFSET_BITS\] << CCLASS_OFFSET_BITS) | ((ch) & ((1 << CCLASS_OFFSET_BITS)-1))\]) - - -#define DECOMP_OFFSET_BITS $decomp_shift - -/* - * The pageMap is indexed by page number and returns an alternate page number - * that identifies a unique page of characters. Many Unicode characters map - * to the same alternate page number. - */ - -static unsigned char decompPageMap\[\] = {" - set line " " - set last [expr {[llength $decomp_pmap] - 1}] - for {set i 0} {$i <= $last} {incr i} { - append line [lindex $decomp_pmap $i] - if {$i != $last} { - append line ", " - } - if {[string length $line] > 70} { - puts $f $line - set line " " - } - } - puts $f $line - puts $f "}; - -/* - * The decompGroupMap is indexed by combining the alternate page number with - * the page offset and returns a group number that identifies a length and - * shift of decomposition sequence in decompList - */ - -static int decompGroupMap\[\] = {" - set line " " - set lasti [expr {[llength $decomp_pages] - 1}] - for {set i 0} {$i <= $lasti} {incr i} { - set page [lindex $decomp_pages $i] - set lastj [expr {[llength $page] - 1}] - for {set j 0} {$j <= $lastj} {incr j} { - append line [lindex $page $j] - if {$j != $lastj || $i != $lasti} { - append line ", " - } - if {[string length $line] > 70} { - puts $f $line - set line " " - } - } - } - puts $f $line - puts $f "}; - -/* - * List of decomposition sequences - */ - -static int decompList\[\] = {" - set line " " - set last [expr {[llength $decomp_list] - 1}] - for {set i 0} {$i <= $last} {incr i} { - set val [lindex $decomp_list $i] - - append line [format "%d" $val] - if {$i != $last} { - append line ", " - } - if {[string length $line] > 70} { - puts $f $line - set line " " - } - } - puts $f $line - puts $f "}; - - -/* - * This macro extracts the information about a character from the - * Unicode character tables. - */ - -#define GetUniCharDecompInfo(ch) (decompGroupMap\[(decompPageMap\[(((int)(ch)) & 0x1fffff) >> DECOMP_OFFSET_BITS\] << DECOMP_OFFSET_BITS) | ((ch) & ((1 << DECOMP_OFFSET_BITS)-1))\]) - -#define GetDecompShift(info) ((info) & 0xffff) -#define GetDecompLen(info) ((info) >> 16) - - -#define COMP_OFFSET_BITS $comp_shift - -/* - * The pageMap is indexed by page number and returns an alternate page number - * that identifies a unique page of characters. Many Unicode characters map - * to the same alternate page number. - */ - -static unsigned char compPageMap\[\] = {" - set line " " - set last [expr {[llength $comp_pmap] - 1}] - for {set i 0} {$i <= $last} {incr i} { - append line [lindex $comp_pmap $i] - if {$i != $last} { - append line ", " - } - if {[string length $line] > 70} { - puts $f $line - set line " " - } - } - puts $f $line - puts $f "}; - -/* - * The groupMap is indexed by combining the alternate page number with - * the page offset and returns a group number that identifies a unique - * set of character attributes. - */ - -static int compGroupMap\[\] = {" - set line " " - set lasti [expr {[llength $comp_pages] - 1}] - for {set i 0} {$i <= $lasti} {incr i} { - set page [lindex $comp_pages $i] - set lastj [expr {[llength $page] - 1}] - for {set j 0} {$j <= $lastj} {incr j} { - append line [lindex $page $j] - if {$j != $lastj || $i != $lasti} { - append line ", " - } - if {[string length $line] > 70} { - puts $f $line - set line " " - } - } - } - puts $f $line - puts $f "}; - -/* - * Lists of compositions for characters that appears only in one composition - */ - -static int compFirstList\[\]\[2\] = {" - set line " " - set last [expr {[llength $comp_first_list] - 1}] - for {set i 0} {$i <= $last} {incr i} { - set val [lindex $comp_first_list $i] - - append line [format "{%d, %d}" [lindex $val 0] [lindex $val 1]] - if {$i != $last} { - append line ", " - } - if {[string length $line] > 60} { - puts $f $line - set line " " - } - } - puts $f $line - puts $f "}; - -static int compSecondList\[\]\[2\] = {" - set line " " - set last [expr {[llength $comp_second_list] - 1}] - for {set i 0} {$i <= $last} {incr i} { - set val [lindex $comp_second_list $i] - - append line [format "{%d, %d}" [lindex $val 0] [lindex $val 1]] - if {$i != $last} { - append line ", " - } - if {[string length $line] > 60} { - puts $f $line - set line " " - } - } - puts $f $line - puts $f "}; - -/* - * Compositions matrix - */ - -static int compBothList\[[llength $comp_x_list]\]\[[llength $comp_y_list]\] = {" - set lastx [expr {[llength $comp_x_list] - 1}] - set lasty [expr {[llength $comp_y_list] - 1}] - for {set i 0} {$i <= $lastx} {incr i} { - puts $f " \{" - set line " " - for {set j 0} {$j <= $lasty} {incr j} { - set comp [list [lindex $comp_x_list $i] [lindex $comp_y_list $j]] - if {[info exists comp_map($comp)]} { - set val $comp_map($comp) - } else { - set val 0 - } - - append line [format "%d" $val] - if {$j != $lasty} { - append line ", " - } - if {[string length $line] > 70} { - puts $f $line - set line " " - } - } - puts $f $line - if {$j != $lasty} { - puts $f " \}," - } else { - puts $f " \}" - } - } - puts $f "}; - - -#define GetUniCharCompInfo(ch) (compGroupMap\[(compPageMap\[(((int)(ch)) & 0x1fffff) >> COMP_OFFSET_BITS\] << COMP_OFFSET_BITS) | ((ch) & ((1 << COMP_OFFSET_BITS)-1))\]) - -#define CompSingleMask (1 << 16) -#define CompMask ((1 << 16) - 1) -#define CompSecondMask (1 << 17) -" - - close $f -} - -uni::main - -return diff --git a/src/stun/Makefile.in b/src/stun/Makefile.in deleted file mode 100644 index e77da8452..000000000 --- a/src/stun/Makefile.in +++ /dev/null @@ -1,38 +0,0 @@ -# $Id: Makefile.in 1453 2008-07-16 16:58:42Z badlop $ - -CC = @CC@ -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ - -ERLANG_CFLAGS = @ERLANG_CFLAGS@ -ERLANG_LIBS = @ERLANG_LIBS@ - -EFLAGS += -I .. -EFLAGS += -pz .. - -# make debug=true to compile Erlang module with debug informations. -ifdef debug - EFLAGS+=+debug_info -endif - -OUTDIR = .. -SOURCES = $(wildcard *.erl) -BEAMS = $(addprefix $(OUTDIR)/,$(SOURCES:.erl=.beam)) - - -all: $(BEAMS) - -$(OUTDIR)/%.beam: %.erl - @ERLC@ -W $(EFLAGS) -o $(OUTDIR) $< - -clean: - rm -f $(BEAMS) - -distclean: clean - rm -f Makefile - -TAGS: - etags *.erl - diff --git a/src/stun/Makefile.win32 b/src/stun/Makefile.win32 deleted file mode 100644 index e70aba9f1..000000000 --- a/src/stun/Makefile.win32 +++ /dev/null @@ -1,18 +0,0 @@ - -include ..\Makefile.inc - -EFLAGS = -I .. -pz .. - -OUTDIR = .. -BEAMS = ..\stun_codec.beam ..\ejabberd_stun.beam - -ALL : $(BEAMS) - -CLEAN : - -@erase $(BEAMS) - -$(OUTDIR)\stun_codec.beam : stun_codec.erl - erlc -W $(EFLAGS) -o $(OUTDIR) stun_codec.erl - -$(OUTDIR)\ejabberd_stun.beam : ejabberd_stun.erl - erlc -W $(EFLAGS) -o $(OUTDIR) ejabberd_stun.erl diff --git a/src/stun/ejabberd_stun.erl b/src/stun/ejabberd_stun.erl deleted file mode 100644 index c2b6a7b59..000000000 --- a/src/stun/ejabberd_stun.erl +++ /dev/null @@ -1,230 +0,0 @@ -%%%------------------------------------------------------------------- -%%% File : ejabberd_stun.erl -%%% Author : Evgeniy Khramtsov -%%% Description : RFC5389 implementation. -%%% Currently only Binding usage is supported. -%%% -%%% Created : 8 Aug 2009 by Evgeniy Khramtsov -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2013 ProcessOne -%%% -%%% 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 -%%% -%%%------------------------------------------------------------------- --module(ejabberd_stun). - --behaviour(gen_fsm). - -%% API --export([start_link/2, start/2, socket_type/0, - udp_recv/5]). - -%% gen_fsm callbacks --export([init/1, handle_event/3, handle_sync_event/4, - handle_info/3, terminate/3, code_change/4]). - -%% gen_fsm states --export([wait_for_tls/2, session_established/2]). - --include("ejabberd.hrl"). - --include("stun.hrl"). - --define(MAX_BUF_SIZE, 64 * 1024). - --define(TIMEOUT, 10000). - --record(state, - {sock :: inet:socket() | tls:tls_socket(), - sock_mod = gen_tcp :: gen_udp | gen_tcp | tls, - certfile :: binary(), - peer = {{0,0,0,0}, 0} :: {inet:ip_address(), inet:port_number()}, - tref = make_ref() :: reference(), - buf = <<>> :: binary()}). - -start({gen_tcp, Sock}, Opts) -> - supervisor:start_child(ejabberd_stun_sup, [Sock, Opts]). - -start_link(Sock, Opts) -> - gen_fsm:start_link(?MODULE, [Sock, Opts], []). - -socket_type() -> raw. - -udp_recv(Sock, Addr, Port, Data, _Opts) -> - case stun_codec:decode(Data) of - {ok, Msg, <<>>} -> - ?DEBUG("got:~n~p", [Msg]), - case process(Addr, Port, Msg) of - RespMsg when is_record(RespMsg, stun) -> - ?DEBUG("sent:~n~p", [RespMsg]), - Data1 = stun_codec:encode(RespMsg), - gen_udp:send(Sock, Addr, Port, Data1); - _ -> ok - end; - _ -> ok - end. - -init([Sock, Opts]) -> - case inet:peername(Sock) of - {ok, Addr} -> - inet:setopts(Sock, [{active, once}]), - TRef = erlang:start_timer(?TIMEOUT, self(), stop), - State = #state{sock = Sock, peer = Addr, tref = TRef}, - case proplists:get_value(certfile, Opts) of - undefined -> {ok, session_established, State}; - CertFile -> - {ok, wait_for_tls, State#state{certfile = CertFile}} - end; - Err -> Err - end. - -wait_for_tls(Event, State) -> - ?INFO_MSG("unexpected event in wait_for_tls: ~p", - [Event]), - {next_state, wait_for_tls, State}. - -session_established(Msg, State) - when is_record(Msg, stun) -> - ?DEBUG("got:~n~p", [Msg]), - {Addr, Port} = State#state.peer, - case process(Addr, Port, Msg) of - Resp when is_record(Resp, stun) -> - ?DEBUG("sent:~n~p", [Resp]), - Data = stun_codec:encode(Resp), - (State#state.sock_mod):send(State#state.sock, Data); - _ -> ok - end, - {next_state, session_established, State}; -session_established(Event, State) -> - ?INFO_MSG("unexpected event in session_established: ~p", - [Event]), - {next_state, session_established, State}. - -handle_event(_Event, StateName, State) -> - {next_state, StateName, State}. - -handle_sync_event(_Event, _From, StateName, State) -> - {reply, {error, badarg}, StateName, State}. - -handle_info({tcp, Sock, TLSData}, wait_for_tls, - State) -> - Buf = <<(State#state.buf)/binary, TLSData/binary>>, - case Buf of - _ when byte_size(Buf) < 3 -> - {next_state, wait_for_tls, - update_state(State#state{buf = Buf})}; - <<_:16, 1, _/binary>> -> - TLSOpts = [{certfile, State#state.certfile}], - {ok, TLSSock} = tls:tcp_to_tls(Sock, TLSOpts), - NewState = State#state{sock = TLSSock, buf = <<>>, - sock_mod = tls}, - case tls:recv_data(TLSSock, Buf) of - {ok, Data} -> - process_data(session_established, NewState, Data); - _Err -> {stop, normal, NewState} - end; - _ -> process_data(session_established, State, TLSData) - end; -handle_info({tcp, _Sock, TLSData}, StateName, - #state{sock_mod = tls} = State) -> - case tls:recv_data(State#state.sock, TLSData) of - {ok, Data} -> process_data(StateName, State, Data); - _Err -> {stop, normal, State} - end; -handle_info({tcp, _Sock, Data}, StateName, State) -> - process_data(StateName, State, Data); -handle_info({tcp_closed, _Sock}, _StateName, State) -> - ?DEBUG("connection reset by peer", []), - {stop, normal, State}; -handle_info({tcp_error, _Sock, Reason}, _StateName, - State) -> - ?DEBUG("connection error: ~p", [Reason]), - {stop, normal, State}; -handle_info({timeout, TRef, stop}, _StateName, - #state{tref = TRef} = State) -> - {stop, normal, State}; -handle_info(Info, StateName, State) -> - ?INFO_MSG("unexpected info: ~p", [Info]), - {next_state, StateName, State}. - -terminate(_Reason, _StateName, State) -> - catch (State#state.sock_mod):close(State#state.sock), - ok. - -code_change(_OldVsn, StateName, State, _Extra) -> - {ok, StateName, State}. - -process(Addr, Port, - #stun{class = request, unsupported = []} = Msg) -> - Resp = prepare_response(Msg), - if Msg#stun.method == (?STUN_METHOD_BINDING) -> - case stun_codec:version(Msg) of - old -> - Resp#stun{class = response, - 'MAPPED-ADDRESS' = {Addr, Port}}; - new -> - Resp#stun{class = response, - 'XOR-MAPPED-ADDRESS' = {Addr, Port}} - end; - true -> - Resp#stun{class = error, - 'ERROR-CODE' = {405, <<"Method Not Allowed">>}} - end; -process(_Addr, _Port, #stun{class = request} = Msg) -> - Resp = prepare_response(Msg), - Resp#stun{class = error, - 'UNKNOWN-ATTRIBUTES' = Msg#stun.unsupported, - 'ERROR-CODE' = {420, stun_codec:reason(420)}}; -process(_Addr, _Port, _Msg) -> pass. - -prepare_response(Msg) -> - Version = <<"ejabberd ", (iolist_to_binary(?VERSION))/binary>>, - #stun{method = Msg#stun.method, magic = Msg#stun.magic, - trid = Msg#stun.trid, 'SOFTWARE' = Version}. - -process_data(NextStateName, #state{buf = Buf} = State, - Data) -> - NewBuf = <>, - case stun_codec:decode(NewBuf) of - {ok, Msg, Tail} -> - gen_fsm:send_event(self(), Msg), - process_data(NextStateName, State#state{buf = <<>>}, - Tail); - empty -> - NewState = State#state{buf = <<>>}, - {next_state, NextStateName, update_state(NewState)}; - more when byte_size(NewBuf) < (?MAX_BUF_SIZE) -> - NewState = State#state{buf = NewBuf}, - {next_state, NextStateName, update_state(NewState)}; - _ -> {stop, normal, State} - end. - -update_state(#state{sock = Sock} = State) -> - case State#state.sock_mod of - gen_tcp -> inet:setopts(Sock, [{active, once}]); - SockMod -> SockMod:setopts(Sock, [{active, once}]) - end, - cancel_timer(State#state.tref), - TRef = erlang:start_timer(?TIMEOUT, self(), stop), - State#state{tref = TRef}. - -cancel_timer(TRef) -> - case erlang:cancel_timer(TRef) of - false -> - receive {timeout, TRef, _} -> ok after 0 -> ok end; - _ -> ok - end. diff --git a/src/stun/stun.hrl b/src/stun/stun.hrl deleted file mode 100644 index 1033be264..000000000 --- a/src/stun/stun.hrl +++ /dev/null @@ -1,59 +0,0 @@ --define(STUN_MAGIC, 554869826). - --define(STUN_METHOD(Type), - Type band 15872 bsr 2 bor (Type band 224 bsr 1) bor - Type band 15). - --define(STUN_CLASS(Type), - Type band 256 bsr 7 bor (Type band 16 bsr 4)). - --define(STUN_TYPE(C, M), - M band 3968 bsl 2 bor (M band 112 bsl 1) bor M band 15 - bor (C band 2 bsl 7 bor (C band 1 bsl 4))). - --define(is_required(A), A =< 32767). - --define(STUN_METHOD_BINDING, 1). - --define(STUN_ATTR_MAPPED_ADDRESS, 1). - --define(STUN_ATTR_USERNAME, 6). - --define(STUN_ATTR_MESSAGE_INTEGRITY, 8). - --define(STUN_ATTR_ERROR_CODE, 9). - --define(STUN_ATTR_UNKNOWN_ATTRIBUTES, 10). - --define(STUN_ATTR_REALM, 20). - --define(STUN_ATTR_NONCE, 21). - --define(STUN_ATTR_XOR_MAPPED_ADDRESS, 32). - --define(STUN_ATTR_SOFTWARE, 32802). - --define(STUN_ATTR_ALTERNATE_SERVER, 32803). - --define(STUN_ATTR_FINGERPRINT, 32808). - --record(stun, - {class = request :: request | response | error | indication, - method = ?STUN_METHOD_BINDING :: non_neg_integer(), - magic = ?STUN_MAGIC :: non_neg_integer(), - trid = 0 :: non_neg_integer() , - unsupported = [] :: [non_neg_integer()], - 'SOFTWARE', - 'ALTERNATE-SERVER', - 'MAPPED-ADDRESS', - 'XOR-MAPPED-ADDRESS', - 'USERNAME', - 'REALM', - 'NONCE', - 'MESSAGE-INTEGRITY', - 'ERROR-CODE', - 'UNKNOWN-ATTRIBUTES' = []}). - -%% Workarounds. -%%-define(NO_PADDING, true). - diff --git a/src/stun/stun_codec.erl b/src/stun/stun_codec.erl deleted file mode 100644 index 787310a9f..000000000 --- a/src/stun/stun_codec.erl +++ /dev/null @@ -1,293 +0,0 @@ -%%%------------------------------------------------------------------- -%%% File : stun_codec.erl -%%% Author : Evgeniy Khramtsov -%%% Description : STUN codec -%%% Created : 7 Aug 2009 by Evgeniy Khramtsov -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2013 ProcessOne -%%% -%%% 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 -%%% -%%%------------------------------------------------------------------- --module(stun_codec). - -%% API --export([decode/1, encode/1, version/1, reason/1, - pp/1]). - -%% Tests --export([test_udp/2, test_tcp/2, test_tls/2, - test_public/0]). - --include("stun.hrl"). - -decode(<<0:2, Type:14, Len:16, Magic:32, TrID:96, - Body:Len/binary, Tail/binary>>) -> - case catch decode(Type, Magic, TrID, Body) of - {'EXIT', _} -> {error, unparsed}; - Res -> {ok, Res, Tail} - end; -decode(<<0:2, _/binary>>) -> more; -decode(<<>>) -> empty; -decode(_) -> {error, unparsed}. - -encode(#stun{class = Class, method = Method, - magic = Magic, trid = TrID} = - Msg) -> - ClassCode = case Class of - request -> 0; - indication -> 1; - response -> 2; - error -> 3 - end, - Type = (?STUN_TYPE(ClassCode, Method)), - Attrs = enc_attrs(Msg), - Len = byte_size(Attrs), - <<0:2, Type:14, Len:16, Magic:32, TrID:96, - Attrs/binary>>. - -pp(Term) -> io_lib_pretty:print(Term, fun pp/2). - -version(#stun{magic = ?STUN_MAGIC}) -> new; -version(#stun{}) -> old. - -reason(300) -> <<"Try Alternate">>; -reason(400) -> <<"Bad Request">>; -reason(401) -> <<"Unauthorized">>; -reason(420) -> <<"Unknown Attribute">>; -reason(438) -> <<"Stale Nonce">>; -reason(500) -> <<"Server Error">>; -reason(_) -> <<"Undefined Error">>. - -decode(Type, Magic, TrID, Body) -> - Method = (?STUN_METHOD(Type)), - Class = case ?STUN_CLASS(Type) of - 0 -> request; - 1 -> indication; - 2 -> response; - 3 -> error - end, - dec_attrs(Body, - #stun{class = Class, method = Method, magic = Magic, - trid = TrID}). - -dec_attrs(<>, Msg) -> - PaddLen = padd_len(Len), - <> = Rest, - NewMsg = dec_attr(Type, Val, Msg), - if Type == (?STUN_ATTR_MESSAGE_INTEGRITY) -> NewMsg; - true -> dec_attrs(Tail, NewMsg) - end; -dec_attrs(<<>>, Msg) -> Msg. - -enc_attrs(Msg) -> - iolist_to_binary([enc_attr(?STUN_ATTR_SOFTWARE, - Msg#stun.'SOFTWARE'), - enc_addr(?STUN_ATTR_MAPPED_ADDRESS, - Msg#stun.'MAPPED-ADDRESS'), - enc_xor_addr(?STUN_ATTR_XOR_MAPPED_ADDRESS, - Msg#stun.magic, Msg#stun.trid, - Msg#stun.'XOR-MAPPED-ADDRESS'), - enc_addr(?STUN_ATTR_ALTERNATE_SERVER, - Msg#stun.'ALTERNATE-SERVER'), - enc_attr(?STUN_ATTR_USERNAME, Msg#stun.'USERNAME'), - enc_attr(?STUN_ATTR_REALM, Msg#stun.'REALM'), - enc_attr(?STUN_ATTR_NONCE, Msg#stun.'NONCE'), - enc_error_code(Msg#stun.'ERROR-CODE'), - enc_unknown_attrs(Msg#stun.'UNKNOWN-ATTRIBUTES')]). - -dec_attr(?STUN_ATTR_MAPPED_ADDRESS, Val, Msg) -> - <<_, Family, Port:16, AddrBin/binary>> = Val, - Addr = dec_addr(Family, AddrBin), - Msg#stun{'MAPPED-ADDRESS' = {Addr, Port}}; -dec_attr(?STUN_ATTR_XOR_MAPPED_ADDRESS, Val, Msg) -> - <<_, Family, XPort:16, XAddr/binary>> = Val, - Magic = Msg#stun.magic, - Port = XPort bxor (Magic bsr 16), - Addr = dec_xor_addr(Family, Magic, Msg#stun.trid, - XAddr), - Msg#stun{'XOR-MAPPED-ADDRESS' = {Addr, Port}}; -dec_attr(?STUN_ATTR_SOFTWARE, Val, Msg) -> - Msg#stun{'SOFTWARE' = Val}; -dec_attr(?STUN_ATTR_USERNAME, Val, Msg) -> - Msg#stun{'USERNAME' = Val}; -dec_attr(?STUN_ATTR_REALM, Val, Msg) -> - Msg#stun{'REALM' = Val}; -dec_attr(?STUN_ATTR_NONCE, Val, Msg) -> - Msg#stun{'NONCE' = Val}; -dec_attr(?STUN_ATTR_MESSAGE_INTEGRITY, Val, Msg) -> - Msg#stun{'MESSAGE-INTEGRITY' = Val}; -dec_attr(?STUN_ATTR_ALTERNATE_SERVER, Val, Msg) -> - <<_, Family, Port:16, Address/binary>> = Val, - IP = dec_addr(Family, Address), - Msg#stun{'ALTERNATE-SERVER' = {IP, Port}}; -dec_attr(?STUN_ATTR_ERROR_CODE, Val, Msg) -> - <<_:21, Class:3, Number:8, Reason/binary>> = Val, - if Class >= 3, Class =< 6, Number >= 0, Number =< 99 -> - Code = Class * 100 + Number, - Msg#stun{'ERROR-CODE' = {Code, Reason}} - end; -dec_attr(?STUN_ATTR_UNKNOWN_ATTRIBUTES, Val, Msg) -> - Attrs = dec_unknown_attrs(Val, []), - Msg#stun{'UNKNOWN-ATTRIBUTES' = Attrs}; -dec_attr(Attr, _Val, #stun{unsupported = Attrs} = Msg) - when Attr =< 32767 -> - Msg#stun{unsupported = [Attr | Attrs]}; -dec_attr(_Attr, _Val, Msg) -> Msg. - -dec_addr(1, <>) -> {A1, A2, A3, A4}; -dec_addr(2, - <>) -> - {A1, A2, A3, A4, A5, A6, A7, A8}. - -dec_xor_addr(1, Magic, _TrID, <>) -> - Addr = XAddr bxor Magic, dec_addr(1, <>); -dec_xor_addr(2, Magic, TrID, <>) -> - Addr = XAddr bxor (Magic bsl 96 bor TrID), - dec_addr(2, <>). - -dec_unknown_attrs(<>, Acc) -> - dec_unknown_attrs(Tail, [Attr | Acc]); -dec_unknown_attrs(<<>>, Acc) -> lists:reverse(Acc). - -enc_attr(_Attr, undefined) -> <<>>; -enc_attr(Attr, Val) -> - Len = byte_size(Val), - PaddLen = padd_len(Len), - <>. - -enc_addr(_Type, undefined) -> <<>>; -enc_addr(Type, {{A1, A2, A3, A4}, Port}) -> - enc_attr(Type, <<0, 1, Port:16, A1, A2, A3, A4>>); -enc_addr(Type, - {{A1, A2, A3, A4, A5, A6, A7, A8}, Port}) -> - enc_attr(Type, - <<0, 2, Port:16, A1:16, A2:16, A3:16, A4:16, A5:16, - A6:16, A7:16, A8:16>>). - -enc_xor_addr(_Type, _Magic, _TrID, undefined) -> <<>>; -enc_xor_addr(Type, Magic, _TrID, - {{A1, A2, A3, A4}, Port}) -> - XPort = Port bxor (Magic bsr 16), - <> = <>, - XAddr = Addr bxor Magic, - enc_attr(Type, <<0, 1, XPort:16, XAddr:32>>); -enc_xor_addr(Type, Magic, TrID, - {{A1, A2, A3, A4, A5, A6, A7, A8}, Port}) -> - XPort = Port bxor (Magic bsr 16), - <> = <>, - XAddr = Addr bxor (Magic bsl 96 bor TrID), - enc_attr(Type, <<0, 2, XPort:16, XAddr:128>>). - -enc_error_code(undefined) -> <<>>; -enc_error_code({Code, Reason}) -> - Class = Code div 100, - Number = Code rem 100, - enc_attr(?STUN_ATTR_ERROR_CODE, - <<0:21, Class:3, Number:8, Reason/binary>>). - -enc_unknown_attrs([]) -> <<>>; -enc_unknown_attrs(Attrs) -> - enc_attr(?STUN_ATTR_UNKNOWN_ATTRIBUTES, - iolist_to_binary([<> || Attr <- Attrs])). - -pp(Tag, N) -> try pp1(Tag, N) catch _:_ -> no end. - -pp1(stun, N) -> - N = record_info(size, stun) - 1, - record_info(fields, stun); -pp1(_, _) -> no. - -%% Workaround for stupid clients. --ifdef(NO_PADDING). - -padd_len(_Len) -> 0. - --else. - -padd_len(Len) -> - case Len rem 4 of - 0 -> 0; - N -> 8 * (4 - N) - end. - --endif. - -bind_msg() -> - Msg = #stun{method = ?STUN_METHOD_BINDING, - class = request, trid = random:uniform(1 bsl 96), - 'SOFTWARE' = <<"test">>}, - encode(Msg). - -test_udp(Addr, Port) -> test(Addr, Port, gen_udp). - -test_tcp(Addr, Port) -> test(Addr, Port, gen_tcp). - -test_tls(Addr, Port) -> test(Addr, Port, ssl). - -test(Addr, Port, Mod) -> - Res = case Mod of - gen_udp -> Mod:open(0, [binary, {active, false}]); - _ -> - Mod:connect(Addr, Port, [binary, {active, false}], 1000) - end, - case Res of - {ok, Sock} -> - if Mod == gen_udp -> - Mod:send(Sock, Addr, Port, bind_msg()); - true -> Mod:send(Sock, bind_msg()) - end, - case Mod:recv(Sock, 0, 1000) of - {ok, {_, _, Data}} -> try_dec(Data); - {ok, Data} -> try_dec(Data); - Err -> io:format("err: ~p~n", [Err]) - end, - Mod:close(Sock); - Err -> io:format("err: ~p~n", [Err]) - end. - -try_dec(Data) -> - case decode(Data) of - {ok, Msg, _} -> io:format("got:~n~s~n", [pp(Msg)]); - Err -> io:format("err: ~p~n", [Err]) - end. - -public_servers() -> - [{"stun.ekiga.net", 3478, 3478, 5349}, - {"stun.ideasip.com", 3478, 3478, 5349}, - {"stun.softjoys.com", 3478, 3478, 5349}, - {"stun.voipbuster.com", 3478, 3478, 5349}, - {"stun.voxgratia.org", 3478, 3478, 5349}, - {"stunserver.org", 3478, 3478, 5349}, - {"stun.sipgate.net", 10000, 10000, 5349}, - {"numb.viagenie.ca", 3478, 3478, 5349}, - {"stun.ipshka.com", 3478, 3478, 5349}, - {"localhost", 3478, 5349, 5349}]. - -test_public() -> - ssl:start(), - lists:foreach(fun ({Addr, UDPPort, TCPPort, TLSPort}) -> - io:format("trying ~s:~p on UDP... ", [Addr, UDPPort]), - test_udp(Addr, UDPPort), - io:format("trying ~s:~p on TCP... ", [Addr, TCPPort]), - test_tcp(Addr, TCPPort), - io:format("trying ~s:~p on TLS... ", [Addr, TLSPort]), - test_tls(Addr, TLSPort) - end, - public_servers()). diff --git a/src/tls/Makefile.in b/src/tls/Makefile.in deleted file mode 100644 index 203c88ac9..000000000 --- a/src/tls/Makefile.in +++ /dev/null @@ -1,70 +0,0 @@ -# $Id$ - -CC = @CC@ -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ - -SSL_CFLAGS = @SSL_CFLAGS@ -SSL_LIBS = @SSL_LIBS@ - -ERLANG_CFLAGS = @ERLANG_CFLAGS@ -ERLANG_LIBS = @ERLANG_LIBS@ - -# Assume Linux-style dynamic library flags -DYNAMIC_LIB_CFLAGS = -fpic -shared -ifeq ($(shell uname),Darwin) - DYNAMIC_LIB_CFLAGS = -fPIC -bundle -flat_namespace -undefined suppress -endif -ifeq ($(shell uname),SunOs) - DYNAMIC_LIB_CFLAGS = -KPIC -G -z text -endif - -EFLAGS += @ERLANG_SSLVER@ -EFLAGS += -I .. -EFLAGS += -pz .. - -# make debug=true to compile Erlang module with debug informations. -ifdef debug - EFLAGS+=+debug_info -endif - -ifeq (@md2@, true) - EFLAGS+=-DHAVE_MD2 - ERLANG_CFLAGS += -DHAVE_MD2 -endif - -ERLSHLIBS = ../tls_drv.so ../sha_drv.so -OUTDIR = .. -SOURCES = $(wildcard *.erl) -BEAMS = $(addprefix $(OUTDIR)/,$(SOURCES:.erl=.beam)) - - -all: $(BEAMS) $(ERLSHLIBS) - -$(OUTDIR)/%.beam: %.erl - @ERLC@ -W $(EFLAGS) -o $(OUTDIR) $< - -#all: $(ERLSHLIBS) -# erl -s make all report "{outdir, \"..\"}" -noinput -s erlang halt - -$(ERLSHLIBS): ../%.so: %.c - $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) \ - $(subst ../,,$(subst .so,.c,$@)) \ - $(LIBS) \ - $(SSL_LIBS) \ - $(SSL_CFLAGS) \ - $(ERLANG_LIBS) \ - $(ERLANG_CFLAGS) \ - -o $@ \ - $(DYNAMIC_LIB_CFLAGS) - -clean: - rm -f $(BEAMS) $(ERLSHLIBS) - -distclean: clean - rm -f Makefile - -TAGS: - etags *.erl diff --git a/src/tls/Makefile.win32 b/src/tls/Makefile.win32 deleted file mode 100644 index f5a3dba05..000000000 --- a/src/tls/Makefile.win32 +++ /dev/null @@ -1,38 +0,0 @@ - -include ..\Makefile.inc - -EFLAGS = -I .. -pz .. - -OUTDIR = .. -BEAMS = ..\tls.beam - -SOURCE = tls_drv.c sha_drv.c -OBJECT = tls_drv.o sha_drv.o -DLL = $(OUTDIR)\tls_drv.dll $(OUTPUT)\sha_drv.dll - -ALL : $(DLL) $(BEAMS) - -CLEAN : - -@erase $(DLL) - -@erase $(OUTDIR)\tls_drv.exp - -@erase $(OUTDIR)\tls_drv.lib - -@erase $(OUTDIR)\sha_drv.exp - -@erase $(OUTDIR)\sha_drv.lib - -@erase $(OBJECT) - -@erase $(BEAMS) - -$(OUTDIR)\tls.beam : tls.erl - erlc -W $(EFLAGS) -o $(OUTDIR) tls.erl - -CC=cl.exe -CC_FLAGS=-nologo -D__WIN32__ -DWIN32 -DWINDOWS -D_WIN32 -DNT -MD -Ox -I"$(ERLANG_DIR)\usr\include" -I"$(EI_DIR)\include" -I"$(OPENSSL_DIR)\include" -I"." - -LD=link.exe -LD_FLAGS=-release -nologo -incremental:no -dll "$(EI_DIR)\lib\ei_md.lib" "$(EI_DIR)\lib\erl_interface_md.lib" "$(OPENSSL_DIR)\lib\VC\ssleay32MD.lib" "$(OPENSSL_DIR)\lib\VC\libeay32MD.lib" MSVCRT.LIB kernel32.lib advapi32.lib gdi32.lib user32.lib comctl32.lib comdlg32.lib shell32.lib - -$(DLL) : $(OBJECT) - $(LD) $(LD_FLAGS) -out:$@ $< - -$(OBJECT) : $(SOURCE) - $(CC) $(CC_FLAGS) -c -Fo$@ $< - diff --git a/src/tls/stdint.h b/src/tls/stdint.h deleted file mode 100755 index e032ff160..000000000 --- a/src/tls/stdint.h +++ /dev/null @@ -1,232 +0,0 @@ -// ISO C9x compliant stdint.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006-2008 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_STDINT_H_ // [ -#define _MSC_STDINT_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include - -// For Visual Studio 6 in C++ mode wrap include with 'extern "C++" {}' -// or compiler give many errors like this: -// error C2733: second C linkage of overloaded function 'wmemchr' not allowed -#if (_MSC_VER < 1300) && defined(__cplusplus) - extern "C++" { -#endif -# include -#if (_MSC_VER < 1300) && defined(__cplusplus) - } -#endif - -// Define _W64 macros to mark types changing their size, like intptr_t. -#ifndef _W64 -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif - - -// 7.18.1 Integer types - -// 7.18.1.1 Exact-width integer types -typedef __int8 int8_t; -typedef __int16 int16_t; -typedef __int32 int32_t; -typedef __int64 int64_t; -typedef unsigned __int8 uint8_t; -typedef unsigned __int16 uint16_t; -typedef unsigned __int32 uint32_t; -typedef unsigned __int64 uint64_t; - -// 7.18.1.2 Minimum-width integer types -typedef int8_t int_least8_t; -typedef int16_t int_least16_t; -typedef int32_t int_least32_t; -typedef int64_t int_least64_t; -typedef uint8_t uint_least8_t; -typedef uint16_t uint_least16_t; -typedef uint32_t uint_least32_t; -typedef uint64_t uint_least64_t; - -// 7.18.1.3 Fastest minimum-width integer types -typedef int8_t int_fast8_t; -typedef int16_t int_fast16_t; -typedef int32_t int_fast32_t; -typedef int64_t int_fast64_t; -typedef uint8_t uint_fast8_t; -typedef uint16_t uint_fast16_t; -typedef uint32_t uint_fast32_t; -typedef uint64_t uint_fast64_t; - -// 7.18.1.4 Integer types capable of holding object pointers -#ifdef _WIN64 // [ - typedef __int64 intptr_t; - typedef unsigned __int64 uintptr_t; -#else // _WIN64 ][ - typedef _W64 int intptr_t; - typedef _W64 unsigned int uintptr_t; -#endif // _WIN64 ] - -// 7.18.1.5 Greatest-width integer types -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; - - -// 7.18.2 Limits of specified-width integer types - -#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 - -// 7.18.2.1 Limits of exact-width integer types -#define INT8_MIN ((int8_t)_I8_MIN) -#define INT8_MAX _I8_MAX -#define INT16_MIN ((int16_t)_I16_MIN) -#define INT16_MAX _I16_MAX -#define INT32_MIN ((int32_t)_I32_MIN) -#define INT32_MAX _I32_MAX -#define INT64_MIN ((int64_t)_I64_MIN) -#define INT64_MAX _I64_MAX -#define UINT8_MAX _UI8_MAX -#define UINT16_MAX _UI16_MAX -#define UINT32_MAX _UI32_MAX -#define UINT64_MAX _UI64_MAX - -// 7.18.2.2 Limits of minimum-width integer types -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define INT_LEAST64_MIN INT64_MIN -#define INT_LEAST64_MAX INT64_MAX -#define UINT_LEAST8_MAX UINT8_MAX -#define UINT_LEAST16_MAX UINT16_MAX -#define UINT_LEAST32_MAX UINT32_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -// 7.18.2.3 Limits of fastest minimum-width integer types -#define INT_FAST8_MIN INT8_MIN -#define INT_FAST8_MAX INT8_MAX -#define INT_FAST16_MIN INT16_MIN -#define INT_FAST16_MAX INT16_MAX -#define INT_FAST32_MIN INT32_MIN -#define INT_FAST32_MAX INT32_MAX -#define INT_FAST64_MIN INT64_MIN -#define INT_FAST64_MAX INT64_MAX -#define UINT_FAST8_MAX UINT8_MAX -#define UINT_FAST16_MAX UINT16_MAX -#define UINT_FAST32_MAX UINT32_MAX -#define UINT_FAST64_MAX UINT64_MAX - -// 7.18.2.4 Limits of integer types capable of holding object pointers -#ifdef _WIN64 // [ -# define INTPTR_MIN INT64_MIN -# define INTPTR_MAX INT64_MAX -# define UINTPTR_MAX UINT64_MAX -#else // _WIN64 ][ -# define INTPTR_MIN INT32_MIN -# define INTPTR_MAX INT32_MAX -# define UINTPTR_MAX UINT32_MAX -#endif // _WIN64 ] - -// 7.18.2.5 Limits of greatest-width integer types -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#define UINTMAX_MAX UINT64_MAX - -// 7.18.3 Limits of other integer types - -#ifdef _WIN64 // [ -# define PTRDIFF_MIN _I64_MIN -# define PTRDIFF_MAX _I64_MAX -#else // _WIN64 ][ -# define PTRDIFF_MIN _I32_MIN -# define PTRDIFF_MAX _I32_MAX -#endif // _WIN64 ] - -#define SIG_ATOMIC_MIN INT_MIN -#define SIG_ATOMIC_MAX INT_MAX - -#ifndef SIZE_MAX // [ -# ifdef _WIN64 // [ -# define SIZE_MAX _UI64_MAX -# else // _WIN64 ][ -# define SIZE_MAX _UI32_MAX -# endif // _WIN64 ] -#endif // SIZE_MAX ] - -// WCHAR_MIN and WCHAR_MAX are also defined in -#ifndef WCHAR_MIN // [ -# define WCHAR_MIN 0 -#endif // WCHAR_MIN ] -#ifndef WCHAR_MAX // [ -# define WCHAR_MAX _UI16_MAX -#endif // WCHAR_MAX ] - -#define WINT_MIN 0 -#define WINT_MAX _UI16_MAX - -#endif // __STDC_LIMIT_MACROS ] - - -// 7.18.4 Limits of other integer types - -#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 - -// 7.18.4.1 Macros for minimum-width integer constants - -#define INT8_C(val) val##i8 -#define INT16_C(val) val##i16 -#define INT32_C(val) val##i32 -#define INT64_C(val) val##i64 - -#define UINT8_C(val) val##ui8 -#define UINT16_C(val) val##ui16 -#define UINT32_C(val) val##ui32 -#define UINT64_C(val) val##ui64 - -// 7.18.4.2 Macros for greatest-width integer constants -#define INTMAX_C INT64_C -#define UINTMAX_C UINT64_C - -#endif // __STDC_CONSTANT_MACROS ] - - -#endif // _MSC_STDINT_H_ ] diff --git a/src/tls/tls.erl b/src/tls/tls.erl deleted file mode 100644 index 3c10ec7de..000000000 --- a/src/tls/tls.erl +++ /dev/null @@ -1,385 +0,0 @@ -%%%---------------------------------------------------------------------- -%%% File : tls.erl -%%% Author : Alexey Shchepin -%%% Purpose : Interface to openssl -%%% Created : 24 Jul 2004 by Alexey Shchepin -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2013 ProcessOne -%%% -%%% 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 -%%% -%%%---------------------------------------------------------------------- - --module(tls). - --author('alexey@process-one.net'). - --behaviour(gen_server). - --export([start/0, start_link/0, tcp_to_tls/2, - tls_to_tcp/1, send/2, recv/2, recv/3, recv_data/2, - setopts/2, sockname/1, peername/1, - controlling_process/2, close/1, get_peer_certificate/1, - get_verify_result/1, get_cert_verify_string/2, test/0]). - -%% Internal exports, call-back functions. --export([init/1, handle_call/3, handle_cast/2, - handle_info/2, code_change/3, terminate/2]). - --include("ejabberd.hrl"). - --define(SET_CERTIFICATE_FILE_ACCEPT, 1). - --define(SET_CERTIFICATE_FILE_CONNECT, 2). - --define(SET_ENCRYPTED_INPUT, 3). - --define(SET_DECRYPTED_OUTPUT, 4). - --define(GET_ENCRYPTED_OUTPUT, 5). - --define(GET_DECRYPTED_INPUT, 6). - --define(GET_PEER_CERTIFICATE, 7). - --define(GET_VERIFY_RESULT, 8). - --define(VERIFY_NONE, 65536). - --record(tlssock, {tcpsock :: inet:socket(), - tlsport :: port()}). - --type tls_socket() :: #tlssock{}. - --type cert() :: any(). %% TODO - --export_type([tls_socket/0]). - -start() -> - gen_server:start({local, ?MODULE}, ?MODULE, [], []). - -start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], - []). - -init([]) -> - case erl_ddll:load_driver(ejabberd:get_so_path(), - tls_drv) - of - ok -> ok; - {error, already_loaded} -> ok - end, - Port = open_port({spawn, "tls_drv"}, [binary]), - Res = port_control(Port, ?SET_CERTIFICATE_FILE_ACCEPT, - <<"./ssl.pem", 0>>), - case Res of - <<0>> -> {ok, Port}; - <<1, Error/binary>> -> {error, (Error)} - end. - -%%% -------------------------------------------------------- -%%% The call-back functions. -%%% -------------------------------------------------------- - -handle_call(_, _, State) -> {noreply, State}. - -handle_cast(_, State) -> {noreply, State}. - -handle_info({'EXIT', Port, Reason}, Port) -> - {stop, {port_died, Reason}, Port}; -handle_info({'EXIT', _Pid, _Reason}, Port) -> - {noreply, Port}; -handle_info(_, State) -> {noreply, State}. - -code_change(_OldVsn, State, _Extra) -> {ok, State}. - -terminate(_Reason, Port) -> Port ! {self, close}, ok. - --spec tcp_to_tls(inet:socket(), - [{atom(), any()}]) -> {'error','no_certfile' | binary()} | - {ok, tls_socket()}. - -tcp_to_tls(TCPSocket, Options) -> - case lists:keysearch(certfile, 1, Options) of - {value, {certfile, CertFile}} -> - case erl_ddll:load_driver(ejabberd:get_so_path(), - tls_drv) - of - ok -> ok; - {error, already_loaded} -> ok - end, - Port = open_port({spawn, "tls_drv"}, [binary]), - Flags = case lists:member(verify_none, Options) of - true -> ?VERIFY_NONE; - false -> 0 - end, - Command = case lists:member(connect, Options) of - true -> ?SET_CERTIFICATE_FILE_CONNECT; - false -> ?SET_CERTIFICATE_FILE_ACCEPT - end, - CertFile1 = iolist_to_binary(CertFile), - case port_control(Port, Command bor Flags, - <>) - of - <<0>> -> - {ok, #tlssock{tcpsock = TCPSocket, tlsport = Port}}; - <<1, Error/binary>> -> {error, (Error)} - end; - false -> {error, no_certfile} - end. - --spec tls_to_tcp(tls_socket()) -> inet:socket(). - -tls_to_tcp(#tlssock{tcpsock = TCPSocket, - tlsport = Port}) -> - port_close(Port), TCPSocket. - -recv(Socket, Length) -> recv(Socket, Length, infinity). - --spec recv(tls_socket(), non_neg_integer(), - timeout()) -> {error, inet:posix()} | - {error, binary()} | - {ok, binary()}. - -recv(#tlssock{tcpsock = TCPSocket, tlsport = Port} = - TLSSock, - Length, Timeout) -> - case port_control(Port, ?GET_DECRYPTED_INPUT, - <>) - of - <<0>> -> - case gen_tcp:recv(TCPSocket, 0, Timeout) of - {ok, Packet} -> recv_data(TLSSock, Packet, Length); - {error, _Reason} = Error -> Error - end; - <<0, In/binary>> -> {ok, In}; - <<1, Error/binary>> -> {error, (Error)} - end. - -recv_data(TLSSock, Packet) -> - recv_data(TLSSock, Packet, 0). - --spec recv_data(tls_socket(), binary(), - non_neg_integer()) -> {error, inet:posix() | binary()} | - {ok, binary()}. - -recv_data(TLSSock, Packet, Length) -> - case catch recv_data1(TLSSock, Packet, Length) of - {'EXIT', Reason} -> {error, Reason}; - Res -> Res - end. - -recv_data1(#tlssock{tcpsock = TCPSocket, - tlsport = Port}, - Packet, Length) -> - case port_control(Port, ?SET_ENCRYPTED_INPUT, Packet) of - <<0>> -> - case port_control(Port, ?GET_DECRYPTED_INPUT, - <>) - of - <<0, In/binary>> -> - case port_control(Port, ?GET_ENCRYPTED_OUTPUT, []) of - <<0, Out/binary>> -> - case gen_tcp:send(TCPSocket, Out) of - ok -> {ok, In}; - Error -> Error - end; - <<1, Error/binary>> -> {error, (Error)} - end; - <<1, Error/binary>> -> {error, (Error)} - end; - <<1, Error/binary>> -> {error, (Error)} - end. - --spec send(tls_socket(), binary()) -> ok | {error, inet:posix() | - binary() | timeout}. - -send(#tlssock{tcpsock = TCPSocket, tlsport = Port} = - TLSSock, - Packet) -> - case port_control(Port, ?SET_DECRYPTED_OUTPUT, Packet) - of - <<0>> -> - case port_control(Port, ?GET_ENCRYPTED_OUTPUT, []) of - <<0, Out/binary>> -> gen_tcp:send(TCPSocket, Out); - <<1, Error/binary>> -> {error, (Error)} - end; - <<1, Error/binary>> -> {error, (Error)}; - <<2>> -> % Dirty hack - receive - {timeout, _Timer, _} -> {error, timeout} - after 100 -> send(TLSSock, Packet) - end - end. - --spec setopts(tls_socket(), list()) -> ok | {error, inet:posix()}. - -setopts(#tlssock{tcpsock = TCPSocket}, Opts) -> - inet:setopts(TCPSocket, Opts). - --spec sockname(tls_socket()) -> {ok, {inet:ip_address(), inet:port_number()}} | - {error, inet:posix()}. - -sockname(#tlssock{tcpsock = TCPSocket}) -> - inet:sockname(TCPSocket). - -peername(#tlssock{tcpsock = TCPSocket}) -> - inet:peername(TCPSocket). - -controlling_process(#tlssock{tcpsock = TCPSocket}, - Pid) -> - gen_tcp:controlling_process(TCPSocket, Pid). - -close(#tlssock{tcpsock = TCPSocket, tlsport = Port}) -> - gen_tcp:close(TCPSocket), port_close(Port). - --spec get_peer_certificate(tls_socket()) -> error | {ok, cert()}. - -get_peer_certificate(#tlssock{tlsport = Port}) -> - case port_control(Port, ?GET_PEER_CERTIFICATE, []) of - <<0, BCert/binary>> -> - case catch public_key:pkix_decode_cert(BCert, plain) - of - {ok, Cert} -> {ok, Cert}; - {'Certificate', _, _, _} = Cert -> {ok, Cert}; - _ -> error - end; - <<1>> -> error - end. - --spec get_verify_result(tls_socket()) -> byte(). - -get_verify_result(#tlssock{tlsport = Port}) -> - <> = port_control(Port, ?GET_VERIFY_RESULT, []), - Res. - -test() -> - case erl_ddll:load_driver(ejabberd:get_so_path(), - tls_drv) - of - ok -> ok; - {error, already_loaded} -> ok - end, - Port = open_port({spawn, "tls_drv"}, [binary]), - ?PRINT("open_port: ~p~n", [Port]), - PCRes = port_control(Port, ?SET_CERTIFICATE_FILE_ACCEPT, - <<"./ssl.pem", 0>>), - ?PRINT("port_control: ~p~n", [PCRes]), - {ok, ListenSocket} = gen_tcp:listen(1234, - [binary, {packet, 0}, {active, true}, - {reuseaddr, true}, {nodelay, true}]), - ?PRINT("listen: ~p~n", [ListenSocket]), - {ok, Socket} = gen_tcp:accept(ListenSocket), - ?PRINT("accept: ~p~n", [Socket]), - loop(Port, Socket). - -loop(Port, Socket) -> - receive - {tcp, Socket, Data} -> - Res = port_control(Port, ?SET_ENCRYPTED_INPUT, Data), - ?PRINT("SET_ENCRYPTED_INPUT: ~p~n", [Res]), - DIRes = port_control(Port, ?GET_DECRYPTED_INPUT, Data), - ?PRINT("GET_DECRYPTED_INPUT: ~p~n", [DIRes]), - case DIRes of - <<0, In/binary>> -> ?PRINT("input: ~s~n", [(In)]); - <<1, DIError/binary>> -> - ?PRINT("GET_DECRYPTED_INPUT error: ~p~n", [(DIError)]) - end, - EORes = port_control(Port, ?GET_ENCRYPTED_OUTPUT, Data), - ?PRINT("GET_ENCRYPTED_OUTPUT: ~p~n", [EORes]), - case EORes of - <<0, Out/binary>> -> gen_tcp:send(Socket, Out); - <<1, EOError/binary>> -> - ?PRINT("GET_ENCRYPTED_OUTPUT error: ~p~n", [(EOError)]) - end, - loop(Port, Socket); - Msg -> - ?PRINT("receive: ~p~n", [Msg]), loop(Port, Socket) - end. - --spec get_cert_verify_string(number(), cert()) -> binary(). - -get_cert_verify_string(CertVerifyRes, Cert) -> - BCert = public_key:pkix_encode('Certificate', Cert, - plain), - IsSelfsigned = public_key:pkix_is_self_signed(BCert), - case {CertVerifyRes, IsSelfsigned} of - {21, true} -> <<"self-signed certificate">>; - _ -> cert_verify_code(CertVerifyRes) - end. - -cert_verify_code(0) -> <<"ok">>; -cert_verify_code(2) -> - <<"unable to get issuer certificate">>; -cert_verify_code(3) -> - <<"unable to get certificate CRL">>; -cert_verify_code(4) -> - <<"unable to decrypt certificate's signature">>; -cert_verify_code(5) -> - <<"unable to decrypt CRL's signature">>; -cert_verify_code(6) -> - <<"unable to decode issuer public key">>; -cert_verify_code(7) -> - <<"certificate signature failure">>; -cert_verify_code(8) -> <<"CRL signature failure">>; -cert_verify_code(9) -> - <<"certificate is not yet valid">>; -cert_verify_code(10) -> <<"certificate has expired">>; -cert_verify_code(11) -> <<"CRL is not yet valid">>; -cert_verify_code(12) -> <<"CRL has expired">>; -cert_verify_code(13) -> - <<"format error in certificate's notBefore " - "field">>; -cert_verify_code(14) -> - <<"format error in certificate's notAfter " - "field">>; -cert_verify_code(15) -> - <<"format error in CRL's lastUpdate field">>; -cert_verify_code(16) -> - <<"format error in CRL's nextUpdate field">>; -cert_verify_code(17) -> <<"out of memory">>; -cert_verify_code(18) -> <<"self signed certificate">>; -cert_verify_code(19) -> - <<"self signed certificate in certificate " - "chain">>; -cert_verify_code(20) -> - <<"unable to get local issuer certificate">>; -cert_verify_code(21) -> - <<"unable to verify the first certificate">>; -cert_verify_code(22) -> - <<"certificate chain too long">>; -cert_verify_code(23) -> <<"certificate revoked">>; -cert_verify_code(24) -> <<"invalid CA certificate">>; -cert_verify_code(25) -> - <<"path length constraint exceeded">>; -cert_verify_code(26) -> - <<"unsupported certificate purpose">>; -cert_verify_code(27) -> <<"certificate not trusted">>; -cert_verify_code(28) -> <<"certificate rejected">>; -cert_verify_code(29) -> <<"subject issuer mismatch">>; -cert_verify_code(30) -> - <<"authority and subject key identifier " - "mismatch">>; -cert_verify_code(31) -> - <<"authority and issuer serial number mismatch">>; -cert_verify_code(32) -> - <<"key usage does not include certificate " - "signing">>; -cert_verify_code(50) -> - <<"application verification failure">>; -cert_verify_code(X) -> - <<"Unknown OpenSSL error code: ", (jlib:integer_to_binary(X))/binary>>. diff --git a/src/tls/tls_drv.c b/src/tls/tls_drv.c deleted file mode 100644 index 038943e22..000000000 --- a/src/tls/tls_drv.c +++ /dev/null @@ -1,655 +0,0 @@ -/* - * ejabberd, Copyright (C) 2002-2013 ProcessOne - * - * 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 - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#define BUF_SIZE 1024 - -typedef struct { - ErlDrvPort port; - BIO *bio_read; - BIO *bio_write; - SSL *ssl; -} tls_data; - -#ifdef _WIN32 -typedef unsigned __int32 uint32_t; -#endif - -#ifndef SSL_OP_NO_TICKET -#define SSL_OP_NO_TICKET 0 -#endif - -#define CIPHERS "DEFAULT:!EXPORT:!LOW:!SSLv2" - -/* - * R15B changed several driver callbacks to use ErlDrvSizeT and - * ErlDrvSSizeT typedefs instead of int. - * This provides missing typedefs on older OTP versions. - */ -#if ERL_DRV_EXTENDED_MAJOR_VERSION < 2 -typedef int ErlDrvSizeT; -typedef int ErlDrvSSizeT; -#endif - -/* - * str_hash is based on the public domain code from - * http://www.burtleburtle.net/bob/hash/doobs.html - */ -static uint32_t str_hash(char *s) -{ - unsigned char *key = (unsigned char *)s; - uint32_t hash = 0; - size_t i; - - for (i = 0; key[i] != 0; i++) { - hash += key[i]; - hash += (hash << 10); - hash ^= (hash >> 6); - } - hash += (hash << 3); - hash ^= (hash >> 11); - hash += (hash << 15); - return hash; -} - -/* Linear hashing */ - -#define MIN_LEVEL 8 -#define MAX_LEVEL 20 - -struct bucket { - uint32_t hash; - char *key_file; - time_t mtime; - SSL_CTX *ssl_ctx; - struct bucket *next; -}; - -struct hash_table { - int split; - int level; - struct bucket **buckets; - int size; -}; - -struct hash_table ht; - -static void init_hash_table() -{ - size_t size = 1 << (MIN_LEVEL + 1); - size_t i; - ht.buckets = (struct bucket **)driver_alloc(sizeof(struct bucket *) * size); - ht.split = 0; - ht.level = MIN_LEVEL; - for (i = 0; i < size; i++) - ht.buckets[i] = NULL; - -} - -static void hash_table_insert(char *key_file, time_t mtime, - SSL_CTX *ssl_ctx) -{ - int level, split; - uint32_t hash = str_hash(key_file); - size_t bucket; - int do_split = 0; - struct bucket *el; - struct bucket *new_bucket_el; - - split = ht.split; - level = ht.level; - - bucket = hash & ((1 << level) - 1); - if (bucket < split) - bucket = hash & ((1 << (level + 1)) - 1); - - el = ht.buckets[bucket]; - while (el != NULL) { - if (el->hash == hash && strcmp(el->key_file, key_file) == 0) { - el->mtime = mtime; - if (el->ssl_ctx != NULL) - SSL_CTX_free(el->ssl_ctx); - el->ssl_ctx = ssl_ctx; - break; - } - el = el->next; - } - - if (el == NULL) { - if (ht.buckets[bucket] != NULL) - do_split = !0; - - new_bucket_el = (struct bucket *)driver_alloc(sizeof(struct bucket)); - new_bucket_el->hash = hash; - new_bucket_el->key_file = (char *)driver_alloc(strlen(key_file) + 1); - strcpy(new_bucket_el->key_file, key_file); - new_bucket_el->mtime = mtime; - new_bucket_el->ssl_ctx = ssl_ctx; - new_bucket_el->next = ht.buckets[bucket]; - ht.buckets[bucket] = new_bucket_el; - } - - if (do_split) { - struct bucket **el_ptr = &ht.buckets[split]; - size_t new_bucket = split + (1 << level); - while (*el_ptr != NULL) { - uint32_t hash = (*el_ptr)->hash; - if ((hash & ((1 << (level + 1)) - 1)) == new_bucket) { - struct bucket *moved_el = *el_ptr; - *el_ptr = (*el_ptr)->next; - moved_el->next = ht.buckets[new_bucket]; - ht.buckets[new_bucket] = moved_el; - } else - el_ptr = &(*el_ptr)->next; - } - split++; - if (split == 1 << level) { - size_t size; - size_t i; - split = 0; - level++; - size = 1 << (level + 1); - ht.split = split; - ht.level = level; - ht.buckets = (struct bucket **) - driver_realloc(ht.buckets, sizeof(struct bucket *) * size); - for (i = 1 << level; i < size; i++) - ht.buckets[i] = NULL; - } else - ht.split = split; - } -} - -static SSL_CTX *hash_table_lookup(char *key_file, time_t *pmtime) -{ - int level, split; - uint32_t hash = str_hash(key_file); - size_t bucket; - struct bucket *el; - - split = ht.split; - level = ht.level; - - bucket = hash & ((1 << level) - 1); - if (bucket < split) - bucket = hash & ((1 << (level + 1)) - 1); - - el = ht.buckets[bucket]; - while (el != NULL) { - if (el->hash == hash && strcmp(el->key_file, key_file) == 0) { - *pmtime = el->mtime; - return el->ssl_ctx; - } - el = el->next; - } - - return NULL; -} - - -static ErlDrvData tls_drv_start(ErlDrvPort port, char *buff) -{ - tls_data *d = (tls_data *)driver_alloc(sizeof(tls_data)); - d->port = port; - d->bio_read = NULL; - d->bio_write = NULL; - d->ssl = NULL; - - set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY); - - return (ErlDrvData)d; -} - -static void tls_drv_stop(ErlDrvData handle) -{ - tls_data *d = (tls_data *)handle; - - if (d->ssl != NULL) - SSL_free(d->ssl); - - driver_free((char *)handle); -} - -static void tls_drv_finish() -{ - int level; - struct bucket *el; - int i; - - level = ht.level; - for (i = 0; i < 1 << (level + 1); i++) { - el = ht.buckets[i]; - while (el != NULL) { - if (el->ssl_ctx != NULL) - SSL_CTX_free(el->ssl_ctx); - driver_free(el->key_file); - el = el->next; - } - } - - driver_free(ht.buckets); -} - -static int is_key_file_modified(char *file, time_t *key_file_mtime) -{ - struct stat file_stat; - - if (stat(file, &file_stat)) - { - *key_file_mtime = 0; - return 1; - } else { - if (*key_file_mtime != file_stat.st_mtime) - { - *key_file_mtime = file_stat.st_mtime; - return 1; - } else - return 0; - } -} - -static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) -{ - return 1; -} - -/* - * ECDHE is enabled only on OpenSSL 1.0.0e and later. - * See http://www.openssl.org/news/secadv_20110906.txt - * for details. - */ -#ifndef OPENSSL_NO_ECDH -static void setup_ecdh(SSL_CTX *ctx) -{ - EC_KEY *ecdh; - - if (SSLeay() < 0x1000005fL) { - return; - } - - ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); - SSL_CTX_set_options(ctx, SSL_OP_SINGLE_ECDH_USE); - SSL_CTX_set_tmp_ecdh(ctx, ecdh); - - EC_KEY_free(ecdh); -} -#endif - -#ifndef OPENSSL_NO_DH -/* -1024-bit MODP Group with 160-bit prime order subgroup (RFC5114) ------BEGIN DH PARAMETERS----- -MIIBDAKBgQCxC4+WoIDgHd6S3l6uXVTsUsmfvPsGo8aaap3KUtI7YWBz4oZ1oj0Y -mDjvHi7mUsAT7LSuqQYRIySXXDzUm4O/rMvdfZDEvXCYSI6cIZpzck7/1vrlZEc4 -+qMaT/VbzMChUa9fDci0vUW/N982XBpl5oz9p21NpwjfH7K8LkpDcQKBgQCk0cvV -w/00EmdlpELvuZkF+BBN0lisUH/WQGz/FCZtMSZv6h5cQVZLd35pD1UE8hMWAhe0 -sBuIal6RVH+eJ0n01/vX07mpLuGQnQ0iY/gKdqaiTAh6CR9THb8KAWm2oorWYqTR -jnOvoy13nVkY0IvIhY9Nzvl8KiSFXm7rIrOy5QICAKA= ------END DH PARAMETERS----- - */ -static unsigned char dh1024_p[] = { - 0xB1,0x0B,0x8F,0x96,0xA0,0x80,0xE0,0x1D,0xDE,0x92,0xDE,0x5E, - 0xAE,0x5D,0x54,0xEC,0x52,0xC9,0x9F,0xBC,0xFB,0x06,0xA3,0xC6, - 0x9A,0x6A,0x9D,0xCA,0x52,0xD2,0x3B,0x61,0x60,0x73,0xE2,0x86, - 0x75,0xA2,0x3D,0x18,0x98,0x38,0xEF,0x1E,0x2E,0xE6,0x52,0xC0, - 0x13,0xEC,0xB4,0xAE,0xA9,0x06,0x11,0x23,0x24,0x97,0x5C,0x3C, - 0xD4,0x9B,0x83,0xBF,0xAC,0xCB,0xDD,0x7D,0x90,0xC4,0xBD,0x70, - 0x98,0x48,0x8E,0x9C,0x21,0x9A,0x73,0x72,0x4E,0xFF,0xD6,0xFA, - 0xE5,0x64,0x47,0x38,0xFA,0xA3,0x1A,0x4F,0xF5,0x5B,0xCC,0xC0, - 0xA1,0x51,0xAF,0x5F,0x0D,0xC8,0xB4,0xBD,0x45,0xBF,0x37,0xDF, - 0x36,0x5C,0x1A,0x65,0xE6,0x8C,0xFD,0xA7,0x6D,0x4D,0xA7,0x08, - 0xDF,0x1F,0xB2,0xBC,0x2E,0x4A,0x43,0x71, -}; -static unsigned char dh1024_g[] = { - 0xA4,0xD1,0xCB,0xD5,0xC3,0xFD,0x34,0x12,0x67,0x65,0xA4,0x42, - 0xEF,0xB9,0x99,0x05,0xF8,0x10,0x4D,0xD2,0x58,0xAC,0x50,0x7F, - 0xD6,0x40,0x6C,0xFF,0x14,0x26,0x6D,0x31,0x26,0x6F,0xEA,0x1E, - 0x5C,0x41,0x56,0x4B,0x77,0x7E,0x69,0x0F,0x55,0x04,0xF2,0x13, - 0x16,0x02,0x17,0xB4,0xB0,0x1B,0x88,0x6A,0x5E,0x91,0x54,0x7F, - 0x9E,0x27,0x49,0xF4,0xD7,0xFB,0xD7,0xD3,0xB9,0xA9,0x2E,0xE1, - 0x90,0x9D,0x0D,0x22,0x63,0xF8,0x0A,0x76,0xA6,0xA2,0x4C,0x08, - 0x7A,0x09,0x1F,0x53,0x1D,0xBF,0x0A,0x01,0x69,0xB6,0xA2,0x8A, - 0xD6,0x62,0xA4,0xD1,0x8E,0x73,0xAF,0xA3,0x2D,0x77,0x9D,0x59, - 0x18,0xD0,0x8B,0xC8,0x85,0x8F,0x4D,0xCE,0xF9,0x7C,0x2A,0x24, - 0x85,0x5E,0x6E,0xEB,0x22,0xB3,0xB2,0xE5, -}; - -static void setup_dh(SSL_CTX *ctx) -{ - DH *dh; - - dh = DH_new(); - if (dh == NULL) { - return; - } - - dh->p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), NULL); - dh->g = BN_bin2bn(dh1024_g, sizeof(dh1024_g), NULL); - if (dh->p == NULL || dh->g == NULL) { - DH_free(dh); - return; - } - - SSL_CTX_set_options(ctx, SSL_OP_SINGLE_DH_USE); - SSL_CTX_set_tmp_dh(ctx, dh); - - DH_free(dh); -} -#endif - -#define SET_CERTIFICATE_FILE_ACCEPT 1 -#define SET_CERTIFICATE_FILE_CONNECT 2 -#define SET_ENCRYPTED_INPUT 3 -#define SET_DECRYPTED_OUTPUT 4 -#define GET_ENCRYPTED_OUTPUT 5 -#define GET_DECRYPTED_INPUT 6 -#define GET_PEER_CERTIFICATE 7 -#define GET_VERIFY_RESULT 8 -#define VERIFY_NONE 0x10000 - - -#define die_unless(cond, errstr) \ - if (!(cond)) \ - { \ - int errstrlen = strlen(errstr); \ - unsigned long error_code = ERR_get_error(); \ - char *error_string = error_code ? \ - ERR_error_string(error_code, NULL) : \ - NULL; \ - int error_string_length = error_string ? \ - strlen(error_string) : 0; \ - if (error_code) \ - rlen = errstrlen + error_string_length + 3; \ - else \ - rlen = errstrlen + 1; \ - b = driver_alloc_binary(rlen); \ - b->orig_bytes[0] = 1; \ - strncpy(b->orig_bytes + 1, errstr, errstrlen); \ - if (error_code) { \ - strncpy(b->orig_bytes + 1 + errstrlen, \ - ": ", 2); \ - strncpy(b->orig_bytes + 3 + errstrlen, \ - error_string, error_string_length); \ - } \ - *rbuf = (char *)b; \ - return rlen; \ - } - - -static ErlDrvSSizeT tls_drv_control(ErlDrvData handle, - unsigned int command, - char *buf, ErlDrvSizeT len, - char **rbuf, ErlDrvSizeT rlen) -{ - tls_data *d = (tls_data *)handle; - int res; - int size; - ErlDrvBinary *b; - X509 *cert; - unsigned int flags = command; - - command &= 0xffff; - - ERR_clear_error(); - switch (command) - { - case SET_CERTIFICATE_FILE_ACCEPT: - case SET_CERTIFICATE_FILE_CONNECT: { - time_t mtime = 0; - SSL_CTX *ssl_ctx = hash_table_lookup(buf, &mtime); - if (is_key_file_modified(buf, &mtime) || ssl_ctx == NULL) - { - SSL_CTX *ctx; - - hash_table_insert(buf, mtime, NULL); - - ctx = SSL_CTX_new(SSLv23_method()); - die_unless(ctx, "SSL_CTX_new failed"); - - res = SSL_CTX_use_certificate_chain_file(ctx, buf); - die_unless(res > 0, "SSL_CTX_use_certificate_file failed"); - - res = SSL_CTX_use_PrivateKey_file(ctx, buf, SSL_FILETYPE_PEM); - die_unless(res > 0, "SSL_CTX_use_PrivateKey_file failed"); - - res = SSL_CTX_check_private_key(ctx); - die_unless(res > 0, "SSL_CTX_check_private_key failed"); - - SSL_CTX_set_cipher_list(ctx, CIPHERS); - -#ifndef OPENSSL_NO_ECDH - if (command == SET_CERTIFICATE_FILE_ACCEPT) { - setup_ecdh(ctx); - } -#endif -#ifndef OPENSSL_NO_DH - if (command == SET_CERTIFICATE_FILE_ACCEPT) { - setup_dh(ctx); - } -#endif - - SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF); - SSL_CTX_set_default_verify_paths(ctx); -#ifdef SSL_MODE_RELEASE_BUFFERS - SSL_CTX_set_mode(ctx, SSL_MODE_RELEASE_BUFFERS); -#endif - /* SSL_CTX_load_verify_locations(ctx, "/etc/ejabberd/ca_certificates.pem", NULL); */ - /* SSL_CTX_load_verify_locations(ctx, NULL, "/etc/ejabberd/ca_certs/"); */ - - /* This IF is commented to allow verification in all cases: */ - /* if (command == SET_CERTIFICATE_FILE_ACCEPT) */ - /* { */ - SSL_CTX_set_verify(ctx, - SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE, - verify_callback); - /* } */ - - ssl_ctx = ctx; - hash_table_insert(buf, mtime, ssl_ctx); - } - - d->ssl = SSL_new(ssl_ctx); - die_unless(d->ssl, "SSL_new failed"); - - if (flags & VERIFY_NONE) - SSL_set_verify(d->ssl, SSL_VERIFY_NONE, verify_callback); - - d->bio_read = BIO_new(BIO_s_mem()); - d->bio_write = BIO_new(BIO_s_mem()); - - SSL_set_bio(d->ssl, d->bio_read, d->bio_write); - - if (command == SET_CERTIFICATE_FILE_ACCEPT) { - SSL_set_options(d->ssl, SSL_OP_NO_SSLv2|SSL_OP_NO_TICKET|SSL_OP_ALL); - - SSL_set_accept_state(d->ssl); - } else { - SSL_set_options(d->ssl, SSL_OP_NO_SSLv2|SSL_OP_NO_TICKET); - SSL_set_connect_state(d->ssl); - } - break; - } - case SET_ENCRYPTED_INPUT: - die_unless(d->ssl, "SSL not initialized"); - BIO_write(d->bio_read, buf, len); - break; - case SET_DECRYPTED_OUTPUT: - die_unless(d->ssl, "SSL not initialized"); - - res = SSL_write(d->ssl, buf, len); - if (res <= 0) - { - res = SSL_get_error(d->ssl, res); - if (res == SSL_ERROR_WANT_READ || res == SSL_ERROR_WANT_WRITE) - { - b = driver_alloc_binary(1); - b->orig_bytes[0] = 2; - *rbuf = (char *)b; - return 1; - } else { - die_unless(0, "SSL_write failed"); - } - } - break; - case GET_ENCRYPTED_OUTPUT: - die_unless(d->ssl, "SSL not initialized"); - size = BIO_ctrl_pending(d->bio_write) + 1; - b = driver_alloc_binary(size); - b->orig_bytes[0] = 0; - BIO_read(d->bio_write, b->orig_bytes + 1, size - 1); - *rbuf = (char *)b; - return size; - case GET_DECRYPTED_INPUT: - if (!SSL_is_init_finished(d->ssl)) - { - res = SSL_do_handshake(d->ssl); - if (res <= 0) - die_unless(SSL_get_error(d->ssl, res) == SSL_ERROR_WANT_READ, - "SSL_do_handshake failed"); - } - if (SSL_is_init_finished(d->ssl)) { - size_t req_size = 0; - if (len == 4) - { - unsigned char *b = (unsigned char *)buf; - req_size = - (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3]; - } - size = BUF_SIZE + 1; - rlen = 1; - b = driver_alloc_binary(size); - b->orig_bytes[0] = 0; - - res = 0; - - while ((req_size == 0 || rlen < req_size + 1) && - (res = SSL_read(d->ssl, - b->orig_bytes + rlen, - (req_size == 0 || req_size + 1 >= size) ? - size - rlen : req_size + 1 - rlen)) > 0) - { - //printf("%d bytes of decrypted data read from state machine\r\n",res); - rlen += res; - if (size - rlen < BUF_SIZE) { - size *= 2; - b = driver_realloc_binary(b, size); - } - } - - if (res < 0) - { - int err = SSL_get_error(d->ssl, res); - - if (err == SSL_ERROR_WANT_READ) - { - //printf("SSL_read wants more data\r\n"); - //return 0; - } - // TODO - } - b = driver_realloc_binary(b, rlen); - *rbuf = (char *)b; - return rlen; - } - break; - case GET_PEER_CERTIFICATE: - cert = SSL_get_peer_certificate(d->ssl); - if (cert == NULL) - { - b = driver_alloc_binary(1); - b->orig_bytes[0] = 1; - *rbuf = (char *)b; - return 1; - } else { - unsigned char *tmp_buf; - rlen = i2d_X509(cert, NULL); - if (rlen >= 0) - { - rlen++; - b = driver_alloc_binary(rlen); - b->orig_bytes[0] = 0; - tmp_buf = (unsigned char *)&b->orig_bytes[1]; - i2d_X509(cert, &tmp_buf); - X509_free(cert); - *rbuf = (char *)b; - return rlen; - } else - X509_free(cert); - } - break; - case GET_VERIFY_RESULT: - b = driver_alloc_binary(1); - b->orig_bytes[0] = SSL_get_verify_result(d->ssl); - *rbuf = (char *)b; - return 1; - break; - } - - b = driver_alloc_binary(1); - b->orig_bytes[0] = 0; - *rbuf = (char *)b; - return 1; -} - - -ErlDrvEntry tls_driver_entry = { - NULL, /* F_PTR init, N/A */ - tls_drv_start, /* L_PTR start, called when port is opened */ - tls_drv_stop, /* F_PTR stop, called when port is closed */ - NULL, /* F_PTR output, called when erlang has sent */ - NULL, /* F_PTR ready_input, called when input descriptor ready */ - NULL, /* F_PTR ready_output, called when output descriptor ready */ - "tls_drv", /* char *driver_name, the argument to open_port */ - tls_drv_finish, /* F_PTR finish, called when unloaded */ - NULL, /* handle */ - tls_drv_control, /* F_PTR control, port_command callback */ - NULL, /* F_PTR timeout, reserved */ - NULL, /* F_PTR outputv, reserved */ - /* Added in Erlang/OTP R15B: */ - NULL, /* ready_async */ - NULL, /* flush */ - NULL, /* call */ - NULL, /* event */ - ERL_DRV_EXTENDED_MARKER, /* extended_marker */ - ERL_DRV_EXTENDED_MAJOR_VERSION, /* major_version */ - ERL_DRV_EXTENDED_MINOR_VERSION, /* minor_version */ - 0, /* driver_flags */ - NULL, /* handle2 */ - NULL, /* process_exit */ - NULL /* stop_select */ -}; - -DRIVER_INIT(tls_drv) /* must match name in driver_entry */ -{ - OpenSSL_add_ssl_algorithms(); - SSL_load_error_strings(); - init_hash_table(); - return &tls_driver_entry; -} - - diff --git a/src/translate.erl b/src/translate.erl index 3257608f7..fd2ebcc64 100644 --- a/src/translate.erl +++ b/src/translate.erl @@ -32,6 +32,7 @@ translate/2]). -include("ejabberd.hrl"). +-include("logger.hrl"). start() -> ets:new(translations, [named_table, public]), diff --git a/src/web/Makefile.in b/src/web/Makefile.in deleted file mode 100644 index 5ac2fe5e6..000000000 --- a/src/web/Makefile.in +++ /dev/null @@ -1,38 +0,0 @@ -# $Id$ - -CC = @CC@ -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ - -ERLANG_CFLAGS = @ERLANG_CFLAGS@ -ERLANG_LIBS = @ERLANG_LIBS@ - -EFLAGS += @ERLANG_SSLVER@ -EFLAGS += -I .. -EFLAGS += -pz .. - -# make debug=true to compile Erlang module with debug informations. -ifdef debug - EFLAGS+=+debug_info -endif - -SOURCES = $(wildcard *.erl) -OUTDIR = .. -BEAMS = $(addprefix $(OUTDIR)/,$(SOURCES:.erl=.beam)) - -all: $(BEAMS) - -$(OUTDIR)/%.beam: %.erl - @ERLC@ -W $(EFLAGS) -o $(OUTDIR) $< - -clean: - rm -f $(BEAMS) - -distclean: clean - rm -f Makefile - -TAGS: - etags *.erl - diff --git a/src/web/Makefile.win32 b/src/web/Makefile.win32 deleted file mode 100644 index 411d57ce8..000000000 --- a/src/web/Makefile.win32 +++ /dev/null @@ -1,33 +0,0 @@ - -include ..\Makefile.inc - -EFLAGS = -I .. -pz .. - -OUTDIR = .. -BEAMS = ..\ejabberd_http.beam ..\ejabberd_http_bind.beam ..\ejabberd_http_poll.beam ..\ejabberd_web.beam ..\ejabberd_web_admin.beam ..\mod_http_bind.beam ..\mod_http_fileserver.beam - -ALL : $(BEAMS) - -CLEAN : - -@erase $(BEAMS) - -$(OUTDIR)\ejabberd_http.beam : ejabberd_http.erl - erlc -W $(EFLAGS) -o $(OUTDIR) ejabberd_http.erl - -$(OUTDIR)\ejabberd_web.beam : ejabberd_web.erl - erlc -W $(EFLAGS) -o $(OUTDIR) ejabberd_web.erl - -$(OUTDIR)\ejabberd_web_admin.beam : ejabberd_web_admin.erl - erlc -W $(EFLAGS) -o $(OUTDIR) ejabberd_web_admin.erl - -$(OUTDIR)\ejabberd_http_bind.beam : ejabberd_http_bind.erl - erlc -W $(EFLAGS) -o $(OUTDIR) ejabberd_http_bind.erl - -$(OUTDIR)\ejabberd_http_poll.beam : ejabberd_http_poll.erl - erlc -W $(EFLAGS) -o $(OUTDIR) ejabberd_http_poll.erl - -$(OUTDIR)\mod_http_bind.beam : mod_http_bind.erl - erlc -W $(EFLAGS) -o $(OUTDIR) mod_http_bind.erl - -$(OUTDIR)\mod_http_fileserver.beam : mod_http_fileserver.erl - erlc -W $(EFLAGS) -o $(OUTDIR) mod_http_fileserver.erl diff --git a/src/web/websocket_test.erl b/src/websocket_test.erl similarity index 100% rename from src/web/websocket_test.erl rename to src/websocket_test.erl diff --git a/src/win32_dns.erl b/src/win32_dns.erl index a51c4bd21..9f80a08de 100644 --- a/src/win32_dns.erl +++ b/src/win32_dns.erl @@ -28,6 +28,7 @@ -export([get_nameservers/0]). -include("ejabberd.hrl"). +-include("logger.hrl"). -define(IF_KEY, "\\hklm\\system\\CurrentControlSet\\Services\\TcpIp\\Parameters\\Interfaces"). -define(TOP_KEY, "\\hklm\\system\\CurrentControlSet\\Services\\TcpIp\\Parameters"). diff --git a/src/xml.erl b/src/xml.erl index 68221ed37..598362fc1 100644 --- a/src/xml.erl +++ b/src/xml.erl @@ -38,6 +38,7 @@ -include("jlib.hrl"). -include("ejabberd.hrl"). +-include("logger.hrl"). %% Select at compile time how to escape characters in binary text %% nodes. diff --git a/src/xmlrpc.app b/src/xmlrpc.app deleted file mode 100644 index 2a3642ca9..000000000 --- a/src/xmlrpc.app +++ /dev/null @@ -1,9 +0,0 @@ -{application,xmlrpc, - [{description,[]}, - {vsn,"80389e7"}, - {registered,[]}, - {applications,[]}, - {env,[]}, - {modules,[beam_util,example_serv,tcp_serv,url_util,xmlrpc, - xmlrpc_decode,xmlrpc_encode,xmlrpc_http, - xmlrpc_util]}]}. diff --git a/src/xmlrpc.app.src b/src/xmlrpc.app.src deleted file mode 100644 index 9af3e4117..000000000 --- a/src/xmlrpc.app.src +++ /dev/null @@ -1,8 +0,0 @@ -{application, xmlrpc, - [ - {description, ""}, - {vsn, git}, - {registered, []}, - {applications, []}, - {env, []} - ]}. diff --git a/src/xmlrpc.erl b/src/xmlrpc.erl deleted file mode 100644 index 8bc35736c..000000000 --- a/src/xmlrpc.erl +++ /dev/null @@ -1,272 +0,0 @@ -%% Hacked by Romuald du Song -%% -%% Copyright (C) 2003 Joakim Grebenö . -%% All rights reserved. -%% -%% Redistribution and use in source and binary forms, with or without -%% modification, are permitted provided that the following conditions -%% are met: -%% -%% 1. Redistributions of source code must retain the above copyright -%% notice, this list of conditions and the following disclaimer. -%% 2. Redistributions in binary form must reproduce the above -%% copyright notice, this list of conditions and the following -%% disclaimer in the documentation and/or other materials provided -%% with the distribution. -%% -%% THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS -%% OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -%% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -%% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -%% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -%% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -%% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -%% WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -%% NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -%% SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --module(xmlrpc). --author('jocke@gleipnir.com'). --export([call/3, call/4, call/5, call/6, call/7, call/8, call2/7]). --export([start_link/1, start_link/5, start_link/6, stop/1]). - --include("log.hrl"). - --include("xmlrpc.hrl"). - -%% Exported: call/{3,4,5,6,7,8} - -call(Socket, URI, Payload) -> - call2(Socket, URI, Payload, false, 60000, "", [{ssl, false}, {header, false}]). - -call(Host, Port, URI, Payload, Options) when is_number(Port) -> - call(Host, Port, URI, Payload, false, 60000, "", Options); - -call(Socket, URI, Payload, KeepAlive, Timeout) -> - call2(Socket, URI, Payload, KeepAlive, Timeout, "", [{ssl, false}, {header, false}]). - -call(Host, Port, URI, Payload) when is_number(Port) -> - call(Host, Port, URI, Payload, false, 60000, "", [{ssl, false}, {header, false}]); - -call(Socket, URI, Payload, Options) -> - call2(Socket, URI, Payload, false, 60000, "", Options). - -call(Host, Port, URI, Payload, KeepAlive, Timeout) when is_number(Port) -> - call(Host, Port, URI, Payload, KeepAlive, Timeout, "", [{ssl, false}, {header, false}]); - -call(Socket, URI, Payload, KeepAlive, Timeout, Options) -> - call2(Socket, URI, Payload, KeepAlive, Timeout, "", Options). - -call(Host, Port, URI, Payload, KeepAlive, Timeout, Options) when is_number(Port) -> - call(Host, Port, URI, Payload, KeepAlive, Timeout, "", Options); - -call(Socket, URI, Payload, KeepAlive, Timeout, ExtraHeader, Options) -> - call2(Socket, URI, Payload, KeepAlive, Timeout, ExtraHeader, Options). - -call(Host, Port, URI, Payload, KeepAlive, Timeout, ExtraHeaders, Options) when is_number(Port) -> - case open_socket(Host, Port, Options) of - {ok, Socket} -> call2(Socket, URI, Payload, KeepAlive, Timeout, ExtraHeaders, Options); - {error, Reason} when KeepAlive == false -> {error, Reason}; - {error, Reason} -> {error, undefined, Reason} - end. - - -open_socket(Host, Port, Options) -> - case fetch_comm_module(Options) of - ssl -> - %% Start ssl application - application:start(ssl), - %% new ssl implementation does not seem to work as of R13B01 - %%{ok, SslSocket} = ssl:connect(Host, Port, [{ssl_imp, new}, {active, false}, {verify, verify_none}]), - ssl:connect(Host, Port, [{verify, 0}, {active, false}]); - _ -> - gen_tcp:connect(Host, Port, [{active, false}]) - end. - - -call2(Socket, URI, Payload, KeepAlive, Timeout, ExtraHeader, Options) -> - ?DEBUG_LOG({decoded_call, Payload}), - case xmlrpc_encode:payload(Payload) of - {ok, EncodedPayload} -> - ?DEBUG_LOG({encoded_call, EncodedPayload}), - case send(Socket, URI, KeepAlive, EncodedPayload, ExtraHeader, Options) of - ok -> - case parse_response(Socket, Timeout, Options) of - {ok, Header} -> - handle_payload(Socket, KeepAlive, Timeout, Options, Header); - {error, Reason} when KeepAlive == false -> - comm_close(Options, Socket), - {error, Reason}; - {error, Reason} -> {error, Socket, Reason} - end; - {error, Reason} when KeepAlive == false -> - comm_close(Options, Socket), - {error, Reason}; - {error, Reason} -> {error, Socket, Reason} - end; - {error, Reason} when KeepAlive == false -> - comm_close(Options, Socket), - {error, Reason}; - {error, Reason} -> {error, Socket, Reason} - end. - -send(Socket, URI, false, Payload, ExtraHeader, SslOption) -> - send(Socket, URI, lists:flatten(["Connection: close\r\n" | ExtraHeader]), Payload, SslOption); -send(Socket, URI, true, Payload, ExtraHeader, SslOption) -> - send(Socket, URI, ExtraHeader, Payload, SslOption). - -send(Socket, URI, Header, Payload, SslOption) -> - Request = - ["POST ", URI, " HTTP/1.1\r\n", - "Content-Length: ", integer_to_list(lists:flatlength(Payload)), - "\r\n", - "User-Agent: Erlang XML-RPC Client 1.13\r\n", - "Content-Type: text/xml\r\n", - Header, "\r\n", - Payload], - M = fetch_comm_module(SslOption), - apply(M, send, [Socket, Request]). - -parse_response(Socket, Timeout, SslOption) -> - M = fetch_comm_module(SslOption), - S = fetch_sets_module(SslOption), - apply(S, setopts, [Socket, [{packet, line}]]), - case apply(M, recv, [Socket, 0, Timeout]) of - {ok, "HTTP/1.1 200 OK\r\n"} -> parse_header(Socket, Timeout, SslOption); - {ok, StatusLine} -> {error, StatusLine}; - {error, Reason} -> {error, Reason} - end. - -fetch_comm_module(Options) -> - case lists:keysearch(ssl, 1, Options) of - {value, {ssl, true}} -> ssl; - _ -> gen_tcp - end. - -has_header_option(Options) -> - case lists:keysearch(header, 1, Options) of - {value, {_, true}} -> true; - _ -> false - end. - -fetch_sets_module(Options) -> - case lists:keysearch(ssl, 1, Options) of - {value, {ssl, true}} -> ssl; - _ -> inet - end. - -comm_close(Options, Socket) -> - M = fetch_comm_module(Options), - apply(M, close, [ Socket ]). - -parse_header(Socket, Timeout, SslOption) -> parse_header(Socket, Timeout, SslOption, #header{}). - -parse_header(Socket, Timeout, SslOption, Header) -> - M = fetch_comm_module(SslOption), - case apply(M, recv, [Socket, 0, Timeout]) of - {ok, "\r\n"} when Header#header.content_length == undefined -> - {error, missing_content_length}; - {ok, "\r\n"} -> {ok, Header}; - {ok, HeaderField} -> - case string:tokens(HeaderField, " \r\n") of - ["Content-Length:", ContentLength] -> - case catch list_to_integer(ContentLength) of - badarg -> - {error, {invalid_content_length, ContentLength}}; - Value -> - parse_header(Socket, Timeout, SslOption, - Header#header{content_length = - Value}) - end; - ["Connection:", "close"] -> - parse_header(Socket, Timeout, SslOption, - Header#header{connection = close}); - ["Authorization:", Authorization] -> - parse_header(Socket, Timeout, SslOption, - Header#header{authorization = Authorization}); - ["Cookie:", Cookie] -> - Cookies = [ Cookie | Header#header.cookies ], - parse_header(Socket, Timeout, SslOption, - Header#header{cookies = Cookies}); - _ -> - parse_header(Socket, Timeout, SslOption, Header) - end; - {error, Reason} -> {error, Reason} - end. - -handle_payload(Socket, KeepAlive, Timeout, Options, Header) -> - case get_payload(Socket, Timeout, Options, Header#header.content_length) of - {ok, Payload} -> - ?DEBUG_LOG({encoded_response, Payload}), - case xmlrpc_decode:payload(Payload) of - {ok, {response, DecodedPayload}} when KeepAlive == false -> - ?DEBUG_LOG({decoded_response, DecodedPayload}), - comm_close(Options, Socket), - case has_header_option(Options) of - true -> - {ok, {response, DecodedPayload, Header}}; - _ -> - {ok, {response, DecodedPayload}} - end; - {ok, {response, DecodedPayload}} when KeepAlive == true, - Header#header.connection == close -> - ?DEBUG_LOG({decoded_response, DecodedPayload}), - comm_close(Options, Socket), - case has_header_option(Options) of - true -> - {ok, Socket, {response, DecodedPayload, Header}}; - _ -> - {ok, Socket, {response, DecodedPayload}} - end; - {ok, {response, DecodedPayload}} -> - ?DEBUG_LOG({decoded_response, DecodedPayload}), - case has_header_option(Options) of - true -> - {ok, Socket, {response, DecodedPayload, Header}}; - _ -> - {ok, Socket, {response, DecodedPayload}} - end; - {error, Reason} when KeepAlive == false -> - comm_close(Options, Socket), - {error, Reason}; - {error, Reason} when KeepAlive == true, - Header#header.connection == close -> - comm_close(Options, Socket), - {error, Socket, Reason}; - {error, Reason} -> - {error, Socket, Reason} - end; - {error, Reason} when KeepAlive == false -> - gen_tcp:close(Socket), - {error, Reason}; - {error, Reason} when KeepAlive == true, - Header#header.connection == close -> - comm_close(Options, Socket), - {error, Socket, Reason}; - {error, Reason} -> {error, Socket, Reason} - end. - -get_payload(Socket, Timeout, SslOption, ContentLength) -> - M = fetch_comm_module(SslOption), - apply(fetch_sets_module(SslOption), setopts, [Socket, [{packet, raw}]]), - apply(M, recv, [Socket, ContentLength, Timeout]). - -%% Exported: start_link/{1,5,6} - -start_link(Handler) -> start_link(4567, 1000, 60000, Handler, undefined). - -start_link(Port, MaxSessions, Timeout, Handler, State) -> - start_link(all, Port, MaxSessions, Timeout, Handler, State). - -start_link(IP, Port, MaxSessions, Timeout, Handler, State) -> - OptionList = [{active, false}, {reuseaddr, true}] ++ ip(IP), - SessionHandler = {xmlrpc_http, handler, [Timeout, Handler, State]}, - tcp_serv:start_link([Port, MaxSessions, OptionList, SessionHandler]). - -ip(all) -> []; -ip(IP) when is_tuple(IP) -> [{ip, IP}]. - -%% Exported: stop/1 - -stop(Pid) -> tcp_serv:stop(Pid). diff --git a/src/xmlrpc.hrl b/src/xmlrpc.hrl deleted file mode 100644 index 3c1f18eb9..000000000 --- a/src/xmlrpc.hrl +++ /dev/null @@ -1,41 +0,0 @@ -%% Copyright (C) 2003 Joakim Grebenö . -%% All rights reserved. -%% -%% Redistribution and use in source and binary forms, with or without -%% modification, are permitted provided that the following conditions -%% are met: -%% -%% 1. Redistributions of source code must retain the above copyright -%% notice, this list of conditions and the following disclaimer. -%% 2. Redistributions in binary form must reproduce the above -%% copyright notice, this list of conditions and the following -%% disclaimer in the documentation and/or other materials provided -%% with the distribution. -%% -%% THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS -%% OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -%% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -%% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -%% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -%% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -%% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -%% WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -%% NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -%% SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --record(header, { - %% int() - content_length, - %% string() - content_type, - %% string() - user_agent, - %% close | undefined - connection, - %% string() - authorization, - %% list() - cookies = [] - }). - diff --git a/src/xmlrpc_decode.erl b/src/xmlrpc_decode.erl deleted file mode 100644 index 344d077aa..000000000 --- a/src/xmlrpc_decode.erl +++ /dev/null @@ -1,224 +0,0 @@ -%% Copyright (C) 2003 Joakim Grebenö . -%% All rights reserved. -%% -%% Redistribution and use in source and binary forms, with or without -%% modification, are permitted provided that the following conditions -%% are met: -%% -%% 1. Redistributions of source code must retain the above copyright -%% notice, this list of conditions and the following disclaimer. -%% 2. Redistributions in binary form must reproduce the above -%% copyright notice, this list of conditions and the following -%% disclaimer in the documentation and/or other materials provided -%% with the distribution. -%% -%% THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS -%% OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -%% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -%% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -%% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -%% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -%% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -%% WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -%% NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -%% SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --module(xmlrpc_decode). --author('jocke@gleipnir.com'). --export([payload/1]). - --include_lib("xmerl/include/xmerl.hrl"). - -payload(Payload) -> - case catch xmerl_scan:string(Payload, [{encoding, latin1}]) of - {'EXIT', Reason} -> {error, Reason}; - {E, _} -> - case catch decode_element(E) of - {'EXIT', Reason} -> {error, Reason}; - Result -> Result - end - end. - -decode_element(#xmlElement{name = methodCall} = MethodCall) - when record(MethodCall, xmlElement) -> - {MethodName, Rest} = - match_element([methodName], MethodCall#xmlElement.content), - TextValue = get_text_value(MethodName#xmlElement.content), - case match_element(normal, [params], Rest) of - {error, {missing_element, _}} -> - {ok, {call, list_to_atom(TextValue), []}}; - {Params, _} -> - DecodedParams = decode_params(Params#xmlElement.content), - {ok, {call, list_to_atom(TextValue), DecodedParams}} - end; -decode_element(#xmlElement{name = methodResponse} = MethodResponse) - when record(MethodResponse, xmlElement) -> - case match_element([fault, params], MethodResponse#xmlElement.content) of - {Fault, _} when Fault#xmlElement.name == fault -> - {Value, _} = match_element([value], Fault#xmlElement.content), - case decode(Value#xmlElement.content) of - {struct, [{faultCode, Code}, - {faultString, String}]} when integer(Code) -> - case xmlrpc_util:is_string(String) of - yes -> {ok, {response, {fault, Code, String}}}; - no -> {error, {bad_string, String}} - end; - {struct, [{faultString, String}, - {faultCode, Code}]} when integer(Code) -> - %% This case has been found in java xmlrpc - case xmlrpc_util:is_string(String) of - yes -> {ok, {response, {fault, Code, String}}}; - no -> {error, {bad_string, String}} - end; - _ -> - {error, {bad_element, MethodResponse}} - end; - {Params, _} -> - case decode_params(Params#xmlElement.content) of - [DecodedParam] -> {ok, {response, [DecodedParam]}}; - DecodedParams -> {error, {to_many_params, DecodedParams}} - end - end; -decode_element(E) -> {error, {bad_element, E}}. - -match_element(NameList, Content) -> match_element(throw, NameList, Content). - -match_element(Type, NameList, []) -> - return(Type, {error, {missing_element, NameList}}); -match_element(Type, NameList, [E|Rest]) when record(E, xmlElement) -> - case lists:member(E#xmlElement.name, NameList) of - true -> {E, Rest}; - false -> return(Type, {error, {unexpected_element, E#xmlElement.name}}) - end; -match_element(Type, NameList, [T|Rest]) when record(T, xmlText) -> - case only_whitespace(T#xmlText.value) of - yes -> match_element(Type, NameList, Rest); - no -> - return(Type, {error, {unexpected_text, T#xmlText.value, NameList}}) - end. - -return(throw, Result) -> throw(Result); -return(normal, Result) -> Result. - -only_whitespace([]) -> yes; -only_whitespace([$ |Rest]) -> only_whitespace(Rest); -only_whitespace([$\n|Rest]) -> only_whitespace(Rest); -only_whitespace([$\t|Rest]) -> only_whitespace(Rest); -only_whitespace(_) -> no. - -get_text_value([]) -> []; -get_text_value([T|Rest]) when record(T, xmlText) -> - T#xmlText.value++get_text_value(Rest); -get_text_value(_) -> throw({error, missing_text}). - -decode_params([]) -> []; -decode_params(Content) -> - case match_element(normal, [param], Content) of - {error, {missing_element, _}} -> []; - {Param, Rest} -> - {Value, _} = match_element([value], Param#xmlElement.content), - [decode(Value#xmlElement.content)|decode_params(Rest)] - end. - -decode(Content) when list(Content) -> - case get_value(Content) of - {text_value, TextValue} -> TextValue; - E -> decode(E) - end; -decode(String) when record(String, xmlText) -> String#xmlText.value; -decode(Struct) when Struct#xmlElement.name == struct -> - {struct, decode_members(Struct#xmlElement.content)}; -decode(Array) when Array#xmlElement.name == array -> - {Data, _} = match_element([data], Array#xmlElement.content), - {array, decode_values(Data#xmlElement.content)}; -decode(Int) when Int#xmlElement.name == int; Int#xmlElement.name == i4 -> - TextValue = get_text_value(Int#xmlElement.content), - make_integer(TextValue); -decode(Boolean) when Boolean#xmlElement.name == boolean -> - case get_text_value(Boolean#xmlElement.content) of - "1" -> true; - "0" -> false; - TextValue -> throw({error, {invalid_boolean, TextValue}}) - end; -decode(String) when String#xmlElement.name == string -> - get_text_value(String#xmlElement.content); -decode(Double) when Double#xmlElement.name == double -> - TextValue = get_text_value(Double#xmlElement.content), - make_double(TextValue); -decode(Date) when Date#xmlElement.name == 'dateTime.iso8601' -> - TextValue = get_text_value(Date#xmlElement.content), -% {date, ensure_iso8601_date(TextValue)}; % FIXME - {date, TextValue}; -decode(Base64) when Base64#xmlElement.name == base64 -> - TextValue = get_text_value(Base64#xmlElement.content), -% {base64, ensure_base64(TextValue)}; % FIXME - {base64, TextValue}; -decode(Value) -> throw({error, {bad_value, Value}}). - -get_value(Content) -> - case any_element(Content) of - false -> {text_value, get_text_value(Content)}; - true -> get_element(Content) - end. - -any_element([]) -> false; -any_element([E|_]) when record(E, xmlElement) -> true; -any_element([_|Rest]) -> any_element(Rest). - -get_element([]) -> throw({error, missing_element}); -get_element([E|_]) when record(E, xmlElement) -> E; -get_element([T|Rest]) when record(T, xmlText) -> - case only_whitespace(T#xmlText.value) of - yes -> get_element(Rest); - no -> throw({error, {unexpected_text, T#xmlText.value}}) - end. - -decode_members(Content) -> - case match_element(normal, [member], Content) of - {error, {missing_element, _}} -> []; - {Member, Rest} -> - {Name, Rest2} = match_element([name], Member#xmlElement.content), - TextValue = get_text_value(Name#xmlElement.content), - {Value, _} = match_element([value], Rest2), - [{list_to_atom(TextValue), - decode(Value#xmlElement.content)}|decode_members(Rest)] - end. - -decode_values([]) -> []; -decode_values(Content) -> - case match_element(normal, [value], Content) of - {error, {missing_element, _}} -> []; - {Value, Rest} -> - [decode(Value#xmlElement.content)|decode_values(Rest)] - end. - -make_integer(Integer) -> - case catch list_to_integer(Integer) of - {'EXIT', _Reason} -> throw({error, {not_integer, Integer}}); - Value -> Value - end. - -make_double(Double) -> - case catch list_to_float(Double) of - {'EXIT', _} -> - case catch list_to_integer(Double) of - {'EXIT', _} -> - throw({error, {not_double, Double}}); - Value -> float(Value) - end; - Value -> Value - end. - -% FIXME -%ensure_iso8601_date(Date) -> -% case xmlrpc_util:is_iso8601_date(Date) of -% no -> throw({error, {not_iso8601_date, Date}}); -% yes -> Date -% end. -% -%ensure_base64(Base64) -> -% case xmlrpc_util:is_base64(Base64) of -% no -> throw({error, {not_base64, Base64}}); -% yes -> Base64 -% end. diff --git a/src/xmlrpc_encode.erl b/src/xmlrpc_encode.erl deleted file mode 100644 index f7d0ff19e..000000000 --- a/src/xmlrpc_encode.erl +++ /dev/null @@ -1,145 +0,0 @@ -%% Copyright (C) 2003 Joakim Grebenö . -%% All rights reserved. -%% -%% Redistribution and use in source and binary forms, with or without -%% modification, are permitted provided that the following conditions -%% are met: -%% -%% 1. Redistributions of source code must retain the above copyright -%% notice, this list of conditions and the following disclaimer. -%% 2. Redistributions in binary form must reproduce the above -%% copyright notice, this list of conditions and the following -%% disclaimer in the documentation and/or other materials provided -%% with the distribution. -%% -%% THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS -%% OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -%% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -%% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -%% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -%% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -%% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -%% WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -%% NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -%% SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --module(xmlrpc_encode). --author('jocke@gleipnir.com'). --export([payload/1]). - -%% Exported: payload/1 - -payload({call, Name, Params}) when atom(Name), list(Params) -> - case encode_params(Params) of - {error, Reason} -> {error, Reason}; - EncodedParams -> - EncodedPayload = - ["", - atom_to_list(Name), "", EncodedParams, - ""], - {ok, EncodedPayload} - end; -payload({response, {fault, Code, String}}) when integer(Code) -> - case xmlrpc_util:is_string(String) of - yes -> - EncodedPayload = - ["" - "faultCode", - integer_to_list(Code), "" - "faultString", escape_string(String), - "", - ""], - {ok, EncodedPayload}; - no -> {error, {bad_string, String}} - end; -payload({response, []} = Payload) -> - {ok, [""]}; -payload({response, [Param]} = Payload) -> - case encode_params([Param]) of - {error, Reason} -> {error, Reason}; - EncodedParam -> - {ok, ["", EncodedParam, - ""]} - end; -payload(Payload) -> {error, {bad_payload, Payload}}. - -encode_params(Params) -> encode_params(Params, []). - -encode_params([], []) -> []; -encode_params([], Acc) -> ["", Acc, ""]; -encode_params([Param|Rest], Acc) -> - case encode(Param) of - {error, Reason} -> {error, Reason}; - EncodedParam -> - NewAcc = Acc++["", EncodedParam, ""], - encode_params(Rest, NewAcc) - end. - -encode({struct, Struct}) -> - case encode_members(Struct) of - {error, Reason} -> {error, Reason}; - Members -> ["", Members, ""] - end; -encode({array, Array}) when list(Array) -> - case encode_values(Array)of - {error, Reason} -> {error, Reason}; - Values -> ["", Values, ""] - end; -encode(Integer) when integer(Integer) -> - ["", integer_to_list(Integer), ""]; -encode(true) -> "1"; % duh! -encode(false) -> "0"; % duh! -encode(Double) when float(Double) -> - ["", io_lib:format("~p", [Double]), ""]; -encode({date, Date}) -> - case xmlrpc_util:is_iso8601_date(Date) of - yes -> ["", Date, ""]; - no -> {error, {bad_date, Date}} - end; -encode({base64, Base64}) -> - case xmlrpc_util:is_base64(Base64) of - yes -> ["", Base64, ""]; - no -> {error, {bad_base64, Base64}} - end; -encode(Value) -> - case xmlrpc_util:is_string(Value) of - yes -> ["", escape_string(Value), ""]; - no -> {error, {bad_value, Value}} - end. - -escape_string([]) -> []; -escape_string([$<|Rest]) -> ["<", escape_string(Rest)]; -escape_string([$>|Rest]) -> [">", escape_string(Rest)]; -escape_string([$&|Rest]) -> ["&", escape_string(Rest)]; -escape_string([C|Rest]) -> [C|escape_string(Rest)]. - -encode_members(Struct) -> encode_members(Struct, []). - -encode_members([], Acc) -> Acc; -encode_members([{Name, Value}|Rest], Acc) when atom(Name) -> - case encode(Value) of - {error, Reason} -> {error, Reason}; - EncodedValue -> - NewAcc = - Acc++["", atom_to_list(Name), "", - EncodedValue, ""], - encode_members(Rest, NewAcc) - end; -encode_members([{Name, Value}|Rest], Acc) -> {error, {invalid_name, Name}}; -encode_members(UnknownMember, Acc) -> - {error, {unknown_member, UnknownMember}}. - -encode_values(Array) -> encode_values(Array, []). - -encode_values([], Acc) -> Acc; -encode_values([Value|Rest], Acc) -> - case encode(Value) of - {error, Reason} -> {error, Reason}; - EncodedValue -> - NewAcc = Acc++["", EncodedValue, ""], - encode_values(Rest, NewAcc) - end; -encode_values([{Name, Value}|Rest], Acc) -> {error, {invalid_name, Name}}; -encode_values(UnknownMember, Acc) -> - {error, {unknown_member, UnknownMember}}. diff --git a/src/xmlrpc_http.erl b/src/xmlrpc_http.erl deleted file mode 100644 index 399e20824..000000000 --- a/src/xmlrpc_http.erl +++ /dev/null @@ -1,230 +0,0 @@ -%% Copyright (C) 2003 Joakim Grebenö . -%% All rights reserved. -%% -%% Redistribution and use in source and binary forms, with or without -%% modification, are permitted provided that the following conditions -%% are met: -%% -%% 1. Redistributions of source code must retain the above copyright -%% notice, this list of conditions and the following disclaimer. -%% 2. Redistributions in binary form must reproduce the above -%% copyright notice, this list of conditions and the following -%% disclaimer in the documentation and/or other materials provided -%% with the distribution. -%% -%% THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS -%% OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -%% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -%% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -%% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -%% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -%% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -%% WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -%% NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -%% SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --module(xmlrpc_http). --author('jocke@gleipnir.com'). --export([handler/4]). - --include("log.hrl"). - --include("xmlrpc.hrl"). - -%% Exported: handler/4 - -handler(Socket, Timeout, Handler, State) -> - case parse_request(Socket, Timeout) of - {ok, Header} -> - ?DEBUG_LOG({header, Header}), - handle_payload(Socket, Timeout, Handler, State, Header); - {status, StatusCode} -> - send(Socket, StatusCode), - handler(Socket, Timeout, Handler, State); - {error, Reason} -> {error, Reason} - end. - -parse_request(Socket, Timeout) -> - inet:setopts(Socket, [list, {packet, line}]), - case gen_tcp:recv(Socket, 0, Timeout) of - {ok, RequestLine} -> - case string:tokens(RequestLine, " \r\n") of - ["POST", _, "HTTP/1.0"] -> - ?DEBUG_LOG({http_version, "1.0"}), - parse_header(Socket, Timeout, #header{connection = close}); - ["POST", _, "HTTP/1.1"] -> - ?DEBUG_LOG({http_version, "1.1"}), - parse_header(Socket, Timeout); - [_Method, _, "HTTP/1.1"] -> {status, 501}; - ["POST", _, _HTTPVersion] -> {status, 505}; - _ -> {status, 400} - end; - {error, Reason} -> {error, Reason} - end. - -parse_header(Socket, Timeout) -> parse_header(Socket, Timeout, #header{}). - -parse_header(Socket, Timeout, Header) -> - case gen_tcp:recv(Socket, 0, Timeout) of - {ok, "\r\n"} when Header#header.content_length == undefined -> - {status, 411}; - {ok, "\r\n"} when Header#header.content_type == undefined -> - {status, 400}; - {ok, "\r\n"} when Header#header.user_agent == undefined -> - {status, 400}; - {ok, "\r\n"} -> {ok, Header}; - {ok, HeaderField} -> - case split_header_field(HeaderField) of - {[$C,$o,$n,$t,$e,$n,$t,$-,_,$e,$n,$g,$t,$h,$:], - ContentLength} -> - case catch list_to_integer(ContentLength) of - N when is_integer(N) -> - parse_header(Socket, Timeout, - Header#header{content_length = N}); - _ -> {status, 400} - end; - {"Content-Type:", "text/xml"} -> - parse_header(Socket, Timeout, - Header#header{content_type = "text/xml"}); - {"Content-Type:", "text/xml; charset=utf-8"} -> - parse_header(Socket, Timeout, - Header#header{content_type = "text/xml; charset=utf-8"}); - {"Content-Type:", _ContentType} -> {status, 415}; - {"User-Agent:", UserAgent} -> - parse_header(Socket, Timeout, - Header#header{user_agent = UserAgent}); - {"Connection:", "close"} -> - parse_header(Socket, Timeout, - Header#header{connection = close}); - {"Connection:", [_,$e,$e,$p,$-,_,$l,$i,$v,$e]} -> - parse_header(Socket, Timeout, - Header#header{connection = undefined}); - {"Authorization:", Authorization} -> - parse_header(Socket, Timeout, - Header#header{authorization = Authorization}); - {"Cookie:", Cookie} -> - Cookies = [ Cookie | Header#header.cookies ], - parse_header(Socket, Timeout, - Header#header{cookies = Cookies}); - _ -> - ?DEBUG_LOG({skipped_header, HeaderField}), - parse_header(Socket, Timeout, Header) - end; - {error, Reason} -> {error, Reason} - end. - -split_header_field(HeaderField) -> split_header_field(HeaderField, []). - -split_header_field([], Name) -> {Name, ""}; -split_header_field([$ |Rest], Name) -> {lists:reverse(Name), Rest -- "\r\n"}; -split_header_field([C|Rest], Name) -> split_header_field(Rest, [C|Name]). - -handle_payload(Socket, Timeout, Handler, State, - #header{connection = Connection} = Header) -> - case get_payload(Socket, Timeout, Header#header.content_length) of - {ok, Payload} -> - ?DEBUG_LOG({encoded_call, Payload}), - case xmlrpc_decode:payload(Payload) of - {ok, DecodedPayload} -> - ?DEBUG_LOG({decoded_call, DecodedPayload}), - eval_payload(Socket, Timeout, Handler, State, Connection, - DecodedPayload, Header); - {error, Reason} when Connection == close -> - ?ERROR_LOG({xmlrpc_decode, payload, Payload, Reason}), - send(Socket, 400); - {error, Reason} -> - ?ERROR_LOG({xmlrpc_decode, payload, Payload, Reason}), - send(Socket, 400), - handler(Socket, Timeout, Handler, State) - end; - {error, Reason} -> {error, Reason} - end. - -get_payload(Socket, Timeout, ContentLength) -> - inet:setopts(Socket, [{packet, raw}]), - gen_tcp:recv(Socket, ContentLength, Timeout). - -%% Check whether module has defined new function -%% M:F(State, Payload, Header) -has_newcall(M, F) -> - erlang:function_exported(M, F, 3). - -%% Handle module call -do_call({M, F} = _Handler, State, Payload, Header) -> - case has_newcall(M, F) of - true -> - M:F(State, Payload, Header); - false -> - M:F(State, Payload) - end. - -eval_payload(Socket, Timeout, {M, F} = Handler, State, Connection, Payload, Header) -> - case catch do_call(Handler, State, Payload, Header) of - {'EXIT', Reason} when Connection == close -> - ?ERROR_LOG({M, F, {'EXIT', Reason}}), - send(Socket, 500, "Connection: close\r\n"); - {'EXIT', Reason} -> - ?ERROR_LOG({M, F, {'EXIT', Reason}}), - send(Socket, 500), - handler(Socket, Timeout, Handler, State); - {error, Reason} when Connection == close -> - ?ERROR_LOG({M, F, Reason}), - send(Socket, 500, "Connection: close\r\n"); - {error, Reason} -> - ?ERROR_LOG({M, F, Reason}), - send(Socket, 500), - handler(Socket, Timeout, Handler, State); - {false, ResponsePayload} -> - encode_send(Socket, 200, "Connection: close\r\n", ResponsePayload); - {false, ResponsePayload, ExtraHeaders} -> - encode_send(Socket, 200, [ExtraHeaders, "Connection: close\r\n"], ResponsePayload); - {true, _NewTimeout, _NewState, ResponsePayload} when - Connection == close -> - encode_send(Socket, 200, "Connection: close\r\n", ResponsePayload); - {true, NewTimeout, NewState, ResponsePayload} -> - encode_send(Socket, 200, "", ResponsePayload), - handler(Socket, NewTimeout, Handler, NewState); - {true, _NewTimeout, _NewState, ResponsePayload, ExtraHeaders} when - Connection == close -> - encode_send(Socket, 200, [ExtraHeaders, "Connection: close\r\n"], ResponsePayload); - {true, NewTimeout, NewState, ResponsePayload, ExtraHeaders} -> - encode_send(Socket, 200, ExtraHeaders, ResponsePayload), - handler(Socket, NewTimeout, Handler, NewState) - end. - -encode_send(Socket, StatusCode, ExtraHeader, Payload) -> - ?DEBUG_LOG({decoded_response, Payload}), - case xmlrpc_encode:payload(Payload) of - {ok, EncodedPayload} -> - ?DEBUG_LOG({encoded_response, lists:flatten(EncodedPayload)}), - send(Socket, StatusCode, ExtraHeader, EncodedPayload); - {error, Reason} -> - ?ERROR_LOG({xmlrpc_encode, payload, Payload, Reason}), - send(Socket, 500) - end. - -send(Socket, StatusCode) -> send(Socket, StatusCode, "", ""). - -send(Socket, StatusCode, ExtraHeader) -> - send(Socket, StatusCode, ExtraHeader, ""). - -send(Socket, StatusCode, ExtraHeader, Payload) -> - Response = - ["HTTP/1.1 ", integer_to_list(StatusCode), " ", - reason_phrase(StatusCode), "\r\n", - "Content-Length: ", integer_to_list(lists:flatlength(Payload)), - "\r\n", - "Server: Erlang/1.13\r\n", - "Content-Type: text/xml\r\n", - ExtraHeader, "\r\n", - Payload], - gen_tcp:send(Socket, Response). - -reason_phrase(200) -> "OK"; -reason_phrase(400) -> "Bad Request"; -reason_phrase(411) -> "Length required"; -reason_phrase(415) -> "Unsupported Media Type"; -reason_phrase(500) -> "Internal Server Error"; -reason_phrase(501) -> "Not Implemented"; -reason_phrase(505) -> "HTTP Version not supported". diff --git a/src/xmlrpc_util.erl b/src/xmlrpc_util.erl deleted file mode 100644 index d46c5c07b..000000000 --- a/src/xmlrpc_util.erl +++ /dev/null @@ -1,37 +0,0 @@ -%% Copyright (C) 2003 Joakim Grebenö . -%% All rights reserved. -%% -%% Redistribution and use in source and binary forms, with or without -%% modification, are permitted provided that the following conditions -%% are met: -%% -%% 1. Redistributions of source code must retain the above copyright -%% notice, this list of conditions and the following disclaimer. -%% 2. Redistributions in binary form must reproduce the above -%% copyright notice, this list of conditions and the following -%% disclaimer in the documentation and/or other materials provided -%% with the distribution. -%% -%% THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS -%% OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -%% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -%% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -%% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -%% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -%% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -%% WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -%% NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -%% SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --module(xmlrpc_util). --author('jocke@gleipnir.com'). --export([is_string/1, is_iso8601_date/1, is_base64/1]). - -is_string([C|Rest]) when C >= 0, C =< 255 -> is_string(Rest); -is_string([]) -> yes; -is_string(_) -> no. - -is_iso8601_date(_) -> yes. % FIXME - -is_base64(_) -> yes. % FIXME diff --git a/src/web/xmpp_json.erl b/src/xmpp_json.erl similarity index 100% rename from src/web/xmpp_json.erl rename to src/xmpp_json.erl diff --git a/src/win32/CheckReqs.ini b/win32/CheckReqs.ini similarity index 100% rename from src/win32/CheckReqs.ini rename to win32/CheckReqs.ini diff --git a/src/win32/CheckReqs1.ini b/win32/CheckReqs1.ini similarity index 100% rename from src/win32/CheckReqs1.ini rename to win32/CheckReqs1.ini diff --git a/src/win32/CheckReqs1H.ini b/win32/CheckReqs1H.ini similarity index 100% rename from src/win32/CheckReqs1H.ini rename to win32/CheckReqs1H.ini diff --git a/src/win32/CheckService.ini b/win32/CheckService.ini similarity index 100% rename from src/win32/CheckService.ini rename to win32/CheckService.ini diff --git a/src/win32/CheckUser.ini b/win32/CheckUser.ini similarity index 100% rename from src/win32/CheckUser.ini rename to win32/CheckUser.ini diff --git a/src/win32/CheckUserH.ini b/win32/CheckUserH.ini similarity index 100% rename from src/win32/CheckUserH.ini rename to win32/CheckUserH.ini diff --git a/src/win32/ejabberd.cfg b/win32/ejabberd.cfg similarity index 100% rename from src/win32/ejabberd.cfg rename to win32/ejabberd.cfg diff --git a/src/win32/ejabberd.ico b/win32/ejabberd.ico similarity index 100% rename from src/win32/ejabberd.ico rename to win32/ejabberd.ico diff --git a/src/win32/ejabberd.nsi b/win32/ejabberd.nsi similarity index 100% rename from src/win32/ejabberd.nsi rename to win32/ejabberd.nsi diff --git a/src/win32/ejabberd_header.bmp b/win32/ejabberd_header.bmp similarity index 100% rename from src/win32/ejabberd_header.bmp rename to win32/ejabberd_header.bmp diff --git a/src/win32/ejabberd_intro.bmp b/win32/ejabberd_intro.bmp similarity index 100% rename from src/win32/ejabberd_intro.bmp rename to win32/ejabberd_intro.bmp diff --git a/src/win32/inetrc b/win32/inetrc similarity index 100% rename from src/win32/inetrc rename to win32/inetrc From 04f20a21fbc592976c84557801071d8114d3f0e2 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 1 May 2013 21:02:29 +1000 Subject: [PATCH 02/53] Improve build procedure --- .gitignore | 20 - Makefile.in | 17 +- c_src/expat_erl.c | 316 ---- c_src/sha_drv.c | 120 -- c_src/xml.c | 261 ---- configure | 2482 ++++++++++-------------------- configure.ac | 57 +- include/ejabberd.hrl | 2 +- include/jlib.hrl | 15 +- rebar | Bin 0 -> 276843 bytes rebar.config.in | 19 +- rel/reltool.config.in | 47 + src/ejabberd.app.src | 37 - src/ejabberd.app.src.in | 16 + src/ejabberd.erl | 31 +- src/ejabberd_admin.erl | 2 +- src/ejabberd_app.erl | 29 +- src/ejabberd_auth_pam.erl | 2 +- src/ejabberd_config.erl | 2 +- src/ejabberd_frontend_socket.erl | 2 +- src/ejabberd_receiver.erl | 16 +- src/ejabberd_socket.erl | 10 +- src/eldap.erl | 1 - src/http_p1.erl | 18 +- src/mod_applepush_service.erl | 1 - src/mod_ip_blacklist.erl | 1 - src/mod_irc.erl | 2 +- src/sha.erl | 114 -- src/xml.erl | 433 ------ src/xml_stream.erl | 246 --- 30 files changed, 928 insertions(+), 3391 deletions(-) delete mode 100644 c_src/expat_erl.c delete mode 100644 c_src/sha_drv.c delete mode 100644 c_src/xml.c create mode 100755 rebar create mode 100644 rel/reltool.config.in delete mode 100644 src/ejabberd.app.src create mode 100644 src/ejabberd.app.src.in delete mode 100644 src/sha.erl delete mode 100644 src/xml.erl delete mode 100644 src/xml_stream.erl diff --git a/.gitignore b/.gitignore index 60f1a2614..51166f509 100644 --- a/.gitignore +++ b/.gitignore @@ -16,23 +16,3 @@ /doc/*.toc /doc/contributed_modules.tex /doc/version.tex -/src/*.beam -/src/*.so -/src/*.so.dSYM -/src/*/*.beam -/src/*/Makefile -/src/Makefile -/src/XmppAddr.asn1db -/src/XmppAddr.erl -/src/XmppAddr.hrl -/src/aclocal.m4 -/src/autom4te.cache -/src/config.log -/src/config.status -/src/ejabberd.init -/src/ejabberdctl.example -/src/eldap/ELDAPv3.asn1db -/src/eldap/ELDAPv3.erl -/src/eldap/ELDAPv3.hrl -/src/eldap/eldap_filter_yecc.erl -/src/epam diff --git a/Makefile.in b/Makefile.in index 0977e93a8..6f6716790 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,4 +1,4 @@ -REBAR = @REBAR@ +REBAR = rebar INSTALL = @INSTALL@ SED = @SED@ ERL = @ERL@ @@ -94,16 +94,25 @@ edoc: 'case edoc:application(ejabberd, ".", []) of ok -> halt(0); error -> halt(1) end.' clean: - rebar clean + $(REBAR) clean distclean: clean rm -f config.status rm -f config.log rm -f rebar.config - rm -rf deps/* + rm -rf deps rm -f Makefile + rm -rf rel/files + rm -rf rel/ejabberd + rm -f rel/reltool.config + rm -f src/ejabberd.app.src [ ! -f ../ChangeLog ] || rm -f ../ChangeLog +rel: + mkdir -p rel ; cd rel ; rm -rf files ejabberd ; \ + $(REBAR) create-node nodeid=ejabberd || exit 1; \ + $(REBAR) generate + TAGS: etags *.erl @@ -112,4 +121,4 @@ Makefile: Makefile.in dialyzer: $(BEAMS) @dialyzer -c . -.PHONY: src doc edoc dialyzer Makefile TAGS clean distclean +.PHONY: src doc edoc dialyzer Makefile TAGS clean distclean rel diff --git a/c_src/expat_erl.c b/c_src/expat_erl.c deleted file mode 100644 index 94f5446b5..000000000 --- a/c_src/expat_erl.c +++ /dev/null @@ -1,316 +0,0 @@ -/* - * ejabberd, Copyright (C) 2002-2013 ProcessOne - * - * 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 - * - */ - - -#include -#include -#include -#include -#include - - -#define XML_START 0 -#define XML_END 1 -#define XML_CDATA 2 -#define XML_ERROR 3 - -#define PARSE_COMMAND 0 -#define PARSE_FINAL_COMMAND 1 - -/* - * R15B changed several driver callbacks to use ErlDrvSizeT and - * ErlDrvSSizeT typedefs instead of int. - * This provides missing typedefs on older OTP versions. - */ -#if ERL_DRV_EXTENDED_MAJOR_VERSION < 2 -typedef int ErlDrvSizeT; -typedef int ErlDrvSSizeT; -#endif - -ei_x_buff event_buf; -ei_x_buff xmlns_buf; - -typedef struct { - ErlDrvPort port; - XML_Parser parser; -} expat_data; - -static XML_Memory_Handling_Suite ms; - -void encode_name(const XML_Char *name) -{ - char *name_start; - char *prefix_start; - char *buf; - int name_len, prefix_len, buf_len; - - if ((name_start = strchr(name, '\n'))) { - if ((prefix_start = strchr(name_start+1, '\n'))) { - name_len = prefix_start - name_start; - prefix_len = strlen(prefix_start+1); - buf_len = prefix_len + name_len; - buf = driver_alloc(buf_len); - memcpy(buf, prefix_start+1, prefix_len); - memcpy(buf+prefix_len, name_start, name_len); - buf[prefix_len] = ':'; - ei_x_encode_binary(&event_buf, buf, buf_len); - driver_free(buf); - } else { - ei_x_encode_binary(&event_buf, name_start+1, strlen(name_start+1)); - }; - } else { - ei_x_encode_binary(&event_buf, name, strlen(name)); - } -} - -void *erlXML_StartElementHandler(expat_data *d, - const XML_Char *name, - const XML_Char **atts) -{ - int i; - - ei_x_encode_list_header(&event_buf, 1); - ei_x_encode_tuple_header(&event_buf, 2); - ei_x_encode_long(&event_buf, XML_START); - ei_x_encode_tuple_header(&event_buf, 2); - encode_name(name); - ei_x_append(&event_buf, &xmlns_buf); - ei_x_free(&xmlns_buf); - ei_x_new(&xmlns_buf); - - for (i = 0; atts[i]; i += 2) {} - - if (i > 0) - { - ei_x_encode_list_header(&event_buf, i/2); - - for (i = 0; atts[i]; i += 2) - { - ei_x_encode_tuple_header(&event_buf, 2); - encode_name(atts[i]); - ei_x_encode_binary(&event_buf, atts[i+1], strlen(atts[i+1])); - } - } - - ei_x_encode_empty_list(&event_buf); - - return NULL; -} - -void *erlXML_EndElementHandler(expat_data *d, - const XML_Char *name) -{ - ei_x_encode_list_header(&event_buf, 1); - ei_x_encode_tuple_header(&event_buf, 2); - ei_x_encode_long(&event_buf, XML_END); - encode_name(name); - return NULL; -} - -void *erlXML_CharacterDataHandler(expat_data *d, - const XML_Char *s, - int len) -{ - ei_x_encode_list_header(&event_buf, 1); - ei_x_encode_tuple_header(&event_buf, 2); - ei_x_encode_long(&event_buf, XML_CDATA); - ei_x_encode_binary(&event_buf, s, len); - return NULL; -} - -void *erlXML_StartNamespaceDeclHandler(expat_data *d, - const XML_Char *prefix, - const XML_Char *uri) -{ - int prefix_len; - char *buf; - - /* From the expat documentation: - "For a default namespace declaration (xmlns='...'), - the prefix will be null ... - ... The URI will be null for the case where - the default namespace is being unset." - - FIXME: I'm not quite sure what all that means */ - if (uri == NULL) - return NULL; - - ei_x_encode_list_header(&xmlns_buf, 1); - ei_x_encode_tuple_header(&xmlns_buf, 2); - if (prefix) { - prefix_len = strlen(prefix); - buf = driver_alloc(7 + prefix_len); - strcpy(buf, "xmlns:"); - strcpy(buf+6, prefix); - ei_x_encode_binary(&xmlns_buf, buf, strlen(buf)); - driver_free(buf); - } else { - ei_x_encode_binary(&xmlns_buf, "xmlns", strlen("xmlns")); - }; - ei_x_encode_binary(&xmlns_buf, uri, strlen(uri)); - - return NULL; -} - -static ErlDrvData expat_erl_start(ErlDrvPort port, char *buff) -{ - expat_data* d = (expat_data*)driver_alloc(sizeof(expat_data)); - d->port = port; - d->parser = XML_ParserCreate_MM("UTF-8", &ms, "\n"); - XML_SetUserData(d->parser, d); - - set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY); - - XML_SetStartElementHandler( - d->parser, (XML_StartElementHandler)erlXML_StartElementHandler); - XML_SetEndElementHandler( - d->parser, (XML_EndElementHandler)erlXML_EndElementHandler); - XML_SetCharacterDataHandler( - d->parser, (XML_CharacterDataHandler)erlXML_CharacterDataHandler); - - XML_SetStartNamespaceDeclHandler( - d->parser, (XML_StartNamespaceDeclHandler) erlXML_StartNamespaceDeclHandler); - XML_SetReturnNSTriplet(d->parser, 1); - - XML_SetDefaultHandler(d->parser, NULL); - - return (ErlDrvData)d; -} - -static void expat_erl_stop(ErlDrvData handle) -{ - XML_ParserFree(((expat_data *)handle)->parser); - driver_free((char*)handle); -} - -static ErlDrvSSizeT expat_erl_control(ErlDrvData drv_data, - unsigned int command, - char *buf, ErlDrvSizeT len, - char **rbuf, ErlDrvSizeT rlen) -{ - expat_data* d = (expat_data*)drv_data; - int res, errcode; - char *errstring; - ErlDrvBinary *b; - size_t size; - - switch (command) - { - case PARSE_COMMAND: - case PARSE_FINAL_COMMAND: - ei_x_new_with_version(&event_buf); - ei_x_new(&xmlns_buf); -#ifdef ENABLE_FLASH_HACK - /* Flash hack - Flash clients send a null byte after the stanza. Remove that... */ - { - int i; - int found_null = 0; - - /* Maybe the Flash client sent many stanzas in one packet. - If so, there is a null byte between every stanza. */ - for (i = 0; i < len; i++) { - if (buf[i] == '\0') { - buf[i] = ' '; - found_null = 1; - } - } - - /* And also remove the closing slash if this is a - flash:stream element. Assume that flash:stream is the - last element in the packet, and entirely contained in - it. This requires that a null byte has been found. */ - if (found_null && strstr(buf, " - buf[len - 3] is / (maybe) - */ - if (buf[len - 3] == '/') - buf[len - 3] = ' '; - } -#endif /* ENABLE_FLASH_HACK */ - - res = XML_Parse(d->parser, buf, len, command == PARSE_FINAL_COMMAND); - - if(!res) - { - errcode = XML_GetErrorCode(d->parser); - errstring = (char *)XML_ErrorString(errcode); - - ei_x_encode_list_header(&event_buf, 1); - ei_x_encode_tuple_header(&event_buf, 2); - ei_x_encode_long(&event_buf, XML_ERROR); - ei_x_encode_tuple_header(&event_buf, 2); - ei_x_encode_long(&event_buf, errcode); - ei_x_encode_binary(&event_buf, errstring, strlen(errstring)); - } - - ei_x_encode_empty_list(&event_buf); - - size = event_buf.index; - - b = driver_alloc_binary(size); - memcpy(b->orig_bytes, event_buf.buff, size); - - ei_x_free(&event_buf); - ei_x_free(&xmlns_buf); - - *rbuf = (char *)b; - return size; - default: - return 0; - } -} - -ErlDrvEntry expat_driver_entry = { - NULL, /* F_PTR init, N/A */ - expat_erl_start, /* L_PTR start, called when port is opened */ - expat_erl_stop, /* F_PTR stop, called when port is closed */ - NULL, /* F_PTR output, called when erlang has sent */ - NULL, /* F_PTR ready_input, called when input descriptor ready */ - NULL, /* F_PTR ready_output, called when output descriptor ready */ - "expat_erl", /* char *driver_name, the argument to open_port */ - NULL, /* F_PTR finish, called when unloaded */ - NULL, /* handle */ - expat_erl_control, /* F_PTR control, port_command callback */ - NULL, /* F_PTR timeout, reserved */ - NULL, /* F_PTR outputv, reserved */ - /* Added in Erlang/OTP R15B: */ - NULL, /* ready_async */ - NULL, /* flush */ - NULL, /* call */ - NULL, /* event */ - ERL_DRV_EXTENDED_MARKER, /* extended_marker */ - ERL_DRV_EXTENDED_MAJOR_VERSION, /* major_version */ - ERL_DRV_EXTENDED_MINOR_VERSION, /* minor_version */ - 0, /* driver_flags */ - NULL, /* handle2 */ - NULL, /* process_exit */ - NULL /* stop_select */ -}; - -DRIVER_INIT(expat_erl) /* must match name in driver_entry */ -{ - ms.malloc_fcn = driver_alloc; - ms.realloc_fcn = driver_realloc; - ms.free_fcn = driver_free; - return &expat_driver_entry; -} - - diff --git a/c_src/sha_drv.c b/c_src/sha_drv.c deleted file mode 100644 index 3558f790a..000000000 --- a/c_src/sha_drv.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - * ejabberd, Copyright (C) 2002-2013 ProcessOne - * - * 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 - * - */ - -#include -#include -#ifdef HAVE_MD2 -#include -#endif - -/* - * R15B changed several driver callbacks to use ErlDrvSizeT and - * ErlDrvSSizeT typedefs instead of int. - * This provides missing typedefs on older OTP versions. - */ -#if ERL_DRV_EXTENDED_MAJOR_VERSION < 2 -typedef int ErlDrvSizeT; -typedef int ErlDrvSSizeT; -#endif - -static ErlDrvData sha_drv_start(ErlDrvPort port, char *buf) -{ - set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY); - return NULL; -} - -static ErlDrvSSizeT sha_drv_control(ErlDrvData handle, - unsigned int command, - char *buf, ErlDrvSizeT len, - char **rbuf, ErlDrvSizeT rlen) -{ - ErlDrvBinary *b = NULL; - - switch (command) { -#ifdef HAVE_MD2 - case 2: - rlen = MD2_DIGEST_LENGTH; - b = driver_alloc_binary(rlen); - if (b) MD2((unsigned char*)buf, len, (unsigned char*)b->orig_bytes); - break; -#endif - case 224: - rlen = SHA224_DIGEST_LENGTH; - b = driver_alloc_binary(rlen); - if (b) SHA224((unsigned char*)buf, len, (unsigned char*)b->orig_bytes); - break; - case 256: - rlen = SHA256_DIGEST_LENGTH; - b = driver_alloc_binary(rlen); - if (b) SHA256((unsigned char*)buf, len, (unsigned char*)b->orig_bytes); - break; - case 384: - rlen = SHA384_DIGEST_LENGTH; - b = driver_alloc_binary(rlen); - if (b) SHA384((unsigned char*)buf, len, (unsigned char*)b->orig_bytes); - break; - case 512: - rlen = SHA512_DIGEST_LENGTH; - b = driver_alloc_binary(rlen); - if (b) SHA512((unsigned char*)buf, len, (unsigned char*)b->orig_bytes); - break; - }; - - if (b) { - *rbuf = (char *)b; - } else { - *rbuf = NULL; - rlen = 0; - }; - - return rlen; -} - -ErlDrvEntry sha_driver_entry = { - NULL, /* F_PTR init, N/A */ - sha_drv_start, /* L_PTR start, called when port is opened */ - NULL, /* F_PTR stop, called when port is closed */ - NULL, /* F_PTR output, called when erlang has sent */ - NULL, /* F_PTR ready_input, called when input descriptor ready */ - NULL, /* F_PTR ready_output, called when output descriptor ready */ - "sha_drv", /* char *driver_name, the argument to open_port */ - NULL, /* F_PTR finish, called when unloaded */ - NULL, /* handle */ - sha_drv_control, /* F_PTR control, port_command callback */ - NULL, /* F_PTR timeout, reserved */ - NULL, /* F_PTR outputv, reserved */ - /* Added in Erlang/OTP R15B: */ - NULL, /* ready_async */ - NULL, /* flush */ - NULL, /* call */ - NULL, /* event */ - ERL_DRV_EXTENDED_MARKER, /* extended_marker */ - ERL_DRV_EXTENDED_MAJOR_VERSION, /* major_version */ - ERL_DRV_EXTENDED_MINOR_VERSION, /* minor_version */ - 0, /* driver_flags */ - NULL, /* handle2 */ - NULL, /* process_exit */ - NULL /* stop_select */ -}; - -DRIVER_INIT(sha_drv) /* must match name in driver_entry */ -{ - return &sha_driver_entry; -} diff --git a/c_src/xml.c b/c_src/xml.c deleted file mode 100644 index 053694514..000000000 --- a/c_src/xml.c +++ /dev/null @@ -1,261 +0,0 @@ -#include -#include -#include - -#define SSL40 - -#ifdef SSL40 -#define ENIF_ALLOC(SIZE) enif_alloc(SIZE) -#define ENIF_FREE(PTR) enif_free(PTR) -#define ENIF_REALLOC(PTR, SIZE) enif_realloc(PTR, SIZE) -#define ENIF_ALLOC_BINARY(SIZE, BIN) enif_alloc_binary(SIZE, BIN) -#define ENIF_COMPARE(TERM1, TERM2) enif_compare(TERM1, TERM2) -#else -#define ENIF_ALLOC(SIZE) enif_alloc(env, SIZE) -#define ENIF_FREE(PTR) enif_free(env, PTR) -#define ENIF_REALLOC(PTR, SIZE) enif_realloc(env, PTR, SIZE) -#define ENIF_ALLOC_BINARY(SIZE, BIN) enif_alloc_binary(env, SIZE, BIN) -#define ENIF_COMPARE(TERM1, TERM2) enif_compare(env, TERM1, TERM2) -#endif - -static ERL_NIF_TERM atom_xmlelement; -static ERL_NIF_TERM atom_xmlcdata; - -struct buf { - int limit; - int len; - unsigned char *b; -}; - -static int make_element(ErlNifEnv* env, struct buf *rbuf, ERL_NIF_TERM el); - -static int load(ErlNifEnv* env, void** priv, ERL_NIF_TERM load_info) -{ - atom_xmlelement = enif_make_atom(env, "xmlel"); - atom_xmlcdata = enif_make_atom(env, "xmlcdata"); - return 0; -} - -static struct buf *init_buf(ErlNifEnv* env) -{ - struct buf *rbuf = ENIF_ALLOC(sizeof(struct buf)); - rbuf->limit = 1024; - rbuf->len = 0; - rbuf->b = ENIF_ALLOC(rbuf->limit); - return rbuf; -} - -static void destroy_buf(ErlNifEnv* env, struct buf *rbuf) -{ - if (rbuf) { - if (rbuf->b) { - ENIF_FREE(rbuf->b); - }; - ENIF_FREE(rbuf); - }; -} - -inline void resize_buf(ErlNifEnv* env, struct buf *rbuf, int len_to_add) -{ - int new_len = rbuf->len + len_to_add; - - if (new_len > rbuf->limit) { - while (new_len > rbuf->limit) - rbuf->limit *= 2; - rbuf->b = ENIF_REALLOC(rbuf->b, rbuf->limit); - } -} - -static void buf_add_char(ErlNifEnv* env, struct buf *rbuf, unsigned char c) -{ - resize_buf(env, rbuf, 1); - (rbuf->b)[rbuf->len] = c; - rbuf->len += 1; -} - -static void buf_add_str(ErlNifEnv* env, struct buf *rbuf, char *data, int len) -{ - resize_buf(env, rbuf, len); - memcpy(rbuf->b + rbuf->len, data, len); - rbuf->len += len; -} - -inline void crypt(ErlNifEnv* env, struct buf *rbuf, unsigned char *data, int len) -{ - int i; - - for (i = 0; i < len; i++) { - switch (data[i]) { - case '&': - buf_add_str(env, rbuf, "&", 5); - break; - case '<': - buf_add_str(env, rbuf, "<", 4); - break; - case '>': - buf_add_str(env, rbuf, ">", 4); - break; - case '"': - buf_add_str(env, rbuf, """, 6); - break; - case '\'': - buf_add_str(env, rbuf, "'", 6); - break; - default: - buf_add_char(env, rbuf, data[i]); - break; - }; - }; -} - -static int make_elements(ErlNifEnv* env, struct buf *rbuf, ERL_NIF_TERM els) -{ - ERL_NIF_TERM head, tail; - int ret = 0; - - while (enif_get_list_cell(env, els, &head, &tail)) { - ret = make_element(env, rbuf, head); - if (ret) { - els = tail; - } else { - break; - }; - }; - - return ret; -} - -static int make_attrs(ErlNifEnv* env, struct buf *rbuf, ERL_NIF_TERM attrs) -{ - ErlNifBinary name, data; - ERL_NIF_TERM head, tail; - const ERL_NIF_TERM *tuple; - int arity, ret = 1; - - while (enif_get_list_cell(env, attrs, &head, &tail)) { - if (enif_get_tuple(env, head, &arity, &tuple)) { - if (arity == 2) { - if (enif_inspect_iolist_as_binary(env, tuple[0], &name) && - enif_inspect_iolist_as_binary(env, tuple[1], &data)) { - buf_add_char(env, rbuf, ' '); - buf_add_str(env, rbuf, (char *)name.data, name.size); - buf_add_str(env, rbuf, "='", 2); - crypt(env, rbuf, data.data, data.size); - buf_add_char(env, rbuf, '\''); - attrs = tail; - } else { - ret = 0; - break; - }; - } else { - ret = 0; - break; - }; - } else { - ret = 0; - break; - }; - }; - - return ret; -} - -static int make_element(ErlNifEnv* env, struct buf *rbuf, ERL_NIF_TERM el) -{ - ErlNifBinary cdata, name; - const ERL_NIF_TERM *tuple; - int arity, ret = 0; - - if (enif_get_tuple(env, el, &arity, &tuple)) { - if (arity == 2) { - if (!ENIF_COMPARE(tuple[0], atom_xmlcdata)) { - if (enif_inspect_iolist_as_binary(env, tuple[1], &cdata)) { - crypt(env, rbuf, cdata.data, cdata.size); - ret = 1; - }; - }; - }; - if (arity == 4) { - if (!ENIF_COMPARE(tuple[0], atom_xmlelement)) { - if (enif_inspect_iolist_as_binary(env, tuple[1], &name)) { - buf_add_char(env, rbuf, '<'); - buf_add_str(env, rbuf, (char *)name.data, name.size); - ret = make_attrs(env, rbuf, tuple[2]); - if (ret) { - if (enif_is_empty_list(env, tuple[3])) { - buf_add_str(env, rbuf, "/>", 2); - } else { - buf_add_char(env, rbuf, '>'); - ret = make_elements(env, rbuf, tuple[3]); - if (ret) { - buf_add_str(env, rbuf, "'); - }; - }; - }; - }; - }; - }; - }; - - return ret; -} - -static ERL_NIF_TERM element_to(ErlNifEnv* env, int argc, - const ERL_NIF_TERM argv[], - int as_string) -{ - ErlNifBinary output; - ERL_NIF_TERM result; - struct buf *rbuf; - - if (argc == 1) { - rbuf = init_buf(env); - if (make_element(env, rbuf, argv[0])) { - if (as_string) { - (rbuf->b)[rbuf->len] = 0; - result = enif_make_string(env, (char *) rbuf->b, ERL_NIF_LATIN1); - destroy_buf(env, rbuf); - return result; - } else { - if (ENIF_ALLOC_BINARY(rbuf->len, &output)) { - memcpy(output.data, rbuf->b, rbuf->len); - result = enif_make_binary(env, &output); - destroy_buf(env, rbuf); - return result; - }; - }; - }; - destroy_buf(env, rbuf); - }; - - return enif_make_badarg(env); -} - -#ifdef SSL40 -static ERL_NIF_TERM element_to_string(ErlNifEnv* env, int argc, - const ERL_NIF_TERM argv[]) -{ - return element_to(env, argc, argv, 1); -} -#endif - -static ERL_NIF_TERM element_to_binary(ErlNifEnv* env, int argc, - const ERL_NIF_TERM argv[]) -{ - return element_to(env, argc, argv, 0); -} - -static ErlNifFunc nif_funcs[] = - { - /* Stupid Erlang bug with enif_make_string() is fixed - in R14A only (OTP-8685), so we can't use - element_to_string in Erlang < R14A.*/ -#ifdef SSL40 - {"element_to_string", 1, element_to_string}, -#endif - {"element_to_binary", 1, element_to_binary} - }; - -ERL_NIF_INIT(xml, nif_funcs, load, NULL, NULL, NULL) diff --git a/configure b/configure index 245fadd68..52268fbb1 100755 --- a/configure +++ b/configure @@ -557,6 +557,7 @@ PACKAGE_STRING='ejabberd 3.0.0' PACKAGE_BUGREPORT='ejabberd@process-one.net' PACKAGE_URL='' +ac_default_prefix=/ # Factoring default headers for most tests. ac_includes_default="\ #include @@ -593,8 +594,8 @@ ac_includes_default="\ # include #endif" -ac_default_prefix=/ ac_subst_vars='LTLIBOBJS +LIBOBJS target_os target_vendor target_cpu @@ -608,9 +609,17 @@ build_vendor build_cpu build md2 +EGREP +GREP +CPP +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC INSTALLUSER -SSL_CFLAGS -SSL_LIBS nif full_xml transient_supervisors @@ -618,21 +627,8 @@ db_type flash_hack roster_gateway_workaround hipe -PAM_LIBS -PAM_CFLAGS -make_pam -pam -ZLIB_LIBS -ZLIB_CFLAGS -LIBOBJS -EXPAT_LIBS -EXPAT_CFLAGS -EGREP -GREP -CPP -LIBICONV MAKE -REBAR +ESCRIPT ERLANG_LIB_DIR ERLANG_ROOT_DIR ERLCFLAGS @@ -643,13 +639,6 @@ INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM SET_MAKE -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC target_alias host_alias build_alias @@ -691,11 +680,6 @@ SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking -with_libiconv_prefix -with_expat -with_zlib -enable_pam -with_pam enable_hipe enable_roster_gateway_workaround enable_flash_hack @@ -703,20 +687,19 @@ enable_mssql enable_transient_supervisors enable_full_xml enable_nif -with_openssl enable_user ' ac_precious_vars='build_alias host_alias target_alias +ERL +ERLC +ERLCFLAGS CC CFLAGS LDFLAGS LIBS CPPFLAGS -ERL -ERLC -ERLCFLAGS CPP' @@ -1334,7 +1317,6 @@ 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-pam enable pam (default: no) --enable-hipe compile natively with HiPE, not recommended (default: no) --enable-roster-gateway-workaround @@ -1354,17 +1336,10 @@ Optional Features: allow this system user to start ejabberd (default: no) -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-libiconv-prefix=PREFIX - prefix where libiconv is installed - --with-expat=PREFIX prefix where EXPAT is installed - --with-zlib=PREFIX prefix where zlib is installed - --with-pam=PREFIX prefix where PAM is installed - --with-openssl=PREFIX prefix where OPENSSL is installed - Some influential environment variables: + ERL Erlang/OTP interpreter command [autodetected] + ERLC Erlang/OTP compiler command [autodetected] + ERLCFLAGS Erlang/OTP compiler flags [none] CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a @@ -1372,9 +1347,6 @@ Some influential environment variables: 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 - ERL Erlang/OTP interpreter command [autodetected] - ERLC Erlang/OTP compiler command [autodetected] - ERLCFLAGS Erlang/OTP compiler flags [none] CPP C preprocessor Use these variables to override the choices made by `configure' or to help @@ -1457,44 +1429,6 @@ 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_compile - # ac_fn_erl_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes @@ -1537,21 +1471,21 @@ fi } # ac_fn_erl_try_run -# ac_fn_c_try_link LINENO -# ----------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () +# 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 conftest$ac_exeext - if { { ac_try="$ac_link" + 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_link") 2>conftest.err + (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 @@ -1562,10 +1496,7 @@ $as_echo "$ac_try_echo"; } >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then : + } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 @@ -1573,15 +1504,10 @@ 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval -} # ac_fn_c_try_link +} # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- @@ -2137,6 +2063,763 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # Checks for programs. +{ $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 "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; 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 + +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 test "${ac_cv_path_install+set}" = set; 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 { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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 for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if test "${ac_cv_path_SED+set}" = set; 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" + { test -f "$ac_path_SED" && $as_test_x "$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 + + +if test "x$GCC" = "xyes"; then + CFLAGS="$CFLAGS -Wall" +fi + +# Checks Erlang runtime and compiler +if test -n "$ERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for erl" >&5 +$as_echo_n "checking for erl... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERL" >&5 +$as_echo "$ERL" >&6; } +else + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}erl", so it can be a program name with args. +set dummy ${ac_tool_prefix}erl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_ERL+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $ERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_ERL="$ERL" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ERL="$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 +ERL=$ac_cv_path_ERL +if test -n "$ERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERL" >&5 +$as_echo "$ERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_ERL"; then + ac_pt_ERL=$ERL + # Extract the first word of "erl", so it can be a program name with args. +set dummy erl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_ac_pt_ERL+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_ERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_ERL="$ac_pt_ERL" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ac_pt_ERL="$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_ERL=$ac_cv_path_ac_pt_ERL +if test -n "$ac_pt_ERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_ERL" >&5 +$as_echo "$ac_pt_ERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_ERL" = x; then + ERL="not found" + 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 + ERL=$ac_pt_ERL + fi +else + ERL="$ac_cv_path_ERL" +fi +fi + +if test "$ERL" = "not found"; then + as_fn_error $? "Erlang/OTP interpreter (erl) not found but required" "$LINENO" 5 +fi + +if test -n "$ERLC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for erlc" >&5 +$as_echo_n "checking for erlc... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERLC" >&5 +$as_echo "$ERLC" >&6; } +else + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}erlc", so it can be a program name with args. +set dummy ${ac_tool_prefix}erlc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_ERLC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $ERLC in + [\\/]* | ?:[\\/]*) + ac_cv_path_ERLC="$ERLC" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ERLC="$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 +ERLC=$ac_cv_path_ERLC +if test -n "$ERLC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERLC" >&5 +$as_echo "$ERLC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_ERLC"; then + ac_pt_ERLC=$ERLC + # Extract the first word of "erlc", so it can be a program name with args. +set dummy erlc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_ac_pt_ERLC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_ERLC in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_ERLC="$ac_pt_ERLC" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ac_pt_ERLC="$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_ERLC=$ac_cv_path_ac_pt_ERLC +if test -n "$ac_pt_ERLC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_ERLC" >&5 +$as_echo "$ac_pt_ERLC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_ERLC" = x; then + ERLC="not found" + 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 + ERLC=$ac_pt_ERLC + fi +else + ERLC="$ac_cv_path_ERLC" +fi + +fi + +if test "$ERLC" = "not found"; then + as_fn_error $? "Erlang/OTP compiler (erlc) not found but required" "$LINENO" 5 +fi + + +# Checks and sets ERLANG_ROOT_DIR and ERLANG_LIB_DIR variable + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP root directory" >&5 +$as_echo_n "checking for Erlang/OTP root directory... " >&6; } +if test "${ac_cv_erlang_root_dir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=erl +ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' +ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' + if test "$cross_compiling" = yes; then : + { { $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 test program while cross compiling +See \`config.log' for more details" "$LINENO" 5 ; } +else + cat > conftest.$ac_ext <<_ACEOF +-module(conftest). +-export([start/0]). + +start() -> + RootDir = code:root_dir(), + file:write_file("conftest.out", RootDir), + ReturnValue = 0, + halt(ReturnValue) +. + +_ACEOF +if ac_fn_erl_try_run "$LINENO"; then : + ac_cv_erlang_root_dir=`cat conftest.out` + rm -f conftest.out +else + rm -f conftest.out + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "test Erlang program execution failed +See \`config.log' for more details" "$LINENO" 5 ; } +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +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 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_root_dir" >&5 +$as_echo "$ac_cv_erlang_root_dir" >&6; } +ERLANG_ROOT_DIR=$ac_cv_erlang_root_dir + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP library base directory" >&5 +$as_echo_n "checking for Erlang/OTP library base directory... " >&6; } +if test "${ac_cv_erlang_lib_dir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=erl +ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' +ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' + if test "$cross_compiling" = yes; then : + { { $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 test program while cross compiling +See \`config.log' for more details" "$LINENO" 5 ; } +else + cat > conftest.$ac_ext <<_ACEOF +-module(conftest). +-export([start/0]). + +start() -> + LibDir = code:lib_dir(), + file:write_file("conftest.out", LibDir), + ReturnValue = 0, + halt(ReturnValue) +. + +_ACEOF +if ac_fn_erl_try_run "$LINENO"; then : + ac_cv_erlang_lib_dir=`cat conftest.out` + rm -f conftest.out +else + rm -f conftest.out + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "test Erlang program execution failed +See \`config.log' for more details" "$LINENO" 5 ; } +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +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 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_dir" >&5 +$as_echo "$ac_cv_erlang_lib_dir" >&6; } +ERLANG_LIB_DIR=$ac_cv_erlang_lib_dir + + + +#locating escript +# Extract the first word of "escript", so it can be a program name with args. +set dummy escript; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_ESCRIPT+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $ESCRIPT in + [\\/]* | ?:[\\/]*) + ac_cv_path_ESCRIPT="$ESCRIPT" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ESCRIPT="$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 +ESCRIPT=$ac_cv_path_ESCRIPT +if test -n "$ESCRIPT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ESCRIPT" >&5 +$as_echo "$ESCRIPT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +#locating make +# Extract the first word of "make", so it can be a program name with args. +set dummy make; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_MAKE+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MAKE"; then + ac_cv_prog_MAKE="$MAKE" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_MAKE="make" + $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 +MAKE=$ac_cv_prog_MAKE +if test -n "$MAKE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAKE" >&5 +$as_echo "$MAKE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +if test "x$ESCRIPT" = "x"; then + as_fn_error $? "'escript' was not found" "$LINENO" 5 +fi + +if test "x$MAKE" = "x"; then + as_fn_error $? "'make' was not found" "$LINENO" 5 +fi + +# Change default prefix + + +# Check whether --enable-hipe was given. +if test "${enable_hipe+set}" = set; then : + enableval=$enable_hipe; case "${enableval}" in + yes) hipe=true ;; + no) hipe=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-hipe" "$LINENO" 5 ;; +esac +else + hipe=false +fi + + + +# Check whether --enable-roster_gateway_workaround was given. +if test "${enable_roster_gateway_workaround+set}" = set; then : + enableval=$enable_roster_gateway_workaround; case "${enableval}" in + yes) roster_gateway_workaround=true ;; + no) roster_gateway_workaround=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-roster-gateway-workaround" "$LINENO" 5 ;; +esac +else + roster_gateway_workaround=false +fi + + + +# Check whether --enable-flash_hack was given. +if test "${enable_flash_hack+set}" = set; then : + enableval=$enable_flash_hack; case "${enableval}" in + yes) flash_hack=true ;; + no) flash_hack=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-flash-hack" "$LINENO" 5 ;; +esac +else + flash_hack=false +fi + + + +# Check whether --enable-mssql was given. +if test "${enable_mssql+set}" = set; then : + enableval=$enable_mssql; case "${enableval}" in + yes) db_type=mssql ;; + no) db_type=generic ;; + *) as_fn_error $? "bad value ${enableval} for --enable-mssql" "$LINENO" 5 ;; +esac +else + db_type=generic +fi + + + +# Check whether --enable-transient_supervisors was given. +if test "${enable_transient_supervisors+set}" = set; then : + enableval=$enable_transient_supervisors; case "${enableval}" in + yes) transient_supervisors=true ;; + no) transient_supervisors=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-transient_supervisors" "$LINENO" 5 ;; +esac +else + transient_supervisors=true +fi + + + +# Check whether --enable-full_xml was given. +if test "${enable_full_xml+set}" = set; then : + enableval=$enable_full_xml; case "${enableval}" in + yes) full_xml=true ;; + no) full_xml=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-full-xml" "$LINENO" 5 ;; +esac +else + full_xml=false +fi + + + +# Check whether --enable-nif was given. +if test "${enable_nif+set}" = set; then : + enableval=$enable_nif; case "${enableval}" in + yes) nif=true ;; + no) nif=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-nif" "$LINENO" 5 ;; +esac +else + nif=false +fi + + + +ac_config_files="$ac_config_files Makefile rebar.config src/ejabberd.app.src rel/reltool.config" + + +ENABLEUSER="" +# Check whether --enable-user was given. +if test "${enable_user+set}" = set; then : + enableval=$enable_user; case "${enableval}" in + yes) ENABLEUSER=`whoami` ;; + no) ENABLEUSER="" ;; + *) ENABLEUSER=$enableval + esac +fi + +if test "$ENABLEUSER" != ""; then + echo "allow this system user to start ejabberd: $ENABLEUSER" + INSTALLUSER=$ENABLEUSER + +fi + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -2927,815 +3610,7 @@ 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 ${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 "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; 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 -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 test "${ac_cv_path_install+set}" = set; 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 { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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 for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if test "${ac_cv_path_SED+set}" = set; 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" - { test -f "$ac_path_SED" && $as_test_x "$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 - - -if test "x$GCC" = "xyes"; then - CFLAGS="$CFLAGS -Wall" -fi - -# Checks Erlang runtime and compiler -if test -n "$ERL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for erl" >&5 -$as_echo_n "checking for erl... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERL" >&5 -$as_echo "$ERL" >&6; } -else - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}erl", so it can be a program name with args. -set dummy ${ac_tool_prefix}erl; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ERL+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $ERL in - [\\/]* | ?:[\\/]*) - ac_cv_path_ERL="$ERL" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_ERL="$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 -ERL=$ac_cv_path_ERL -if test -n "$ERL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERL" >&5 -$as_echo "$ERL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_ERL"; then - ac_pt_ERL=$ERL - # Extract the first word of "erl", so it can be a program name with args. -set dummy erl; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ac_pt_ERL+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_ERL in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_ERL="$ac_pt_ERL" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_ac_pt_ERL="$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_ERL=$ac_cv_path_ac_pt_ERL -if test -n "$ac_pt_ERL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_ERL" >&5 -$as_echo "$ac_pt_ERL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_ERL" = x; then - ERL="not found" - 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 - ERL=$ac_pt_ERL - fi -else - ERL="$ac_cv_path_ERL" -fi -fi - -if test "$ERL" = "not found"; then - as_fn_error $? "Erlang/OTP interpreter (erl) not found but required" "$LINENO" 5 -fi - -if test -n "$ERLC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for erlc" >&5 -$as_echo_n "checking for erlc... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERLC" >&5 -$as_echo "$ERLC" >&6; } -else - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}erlc", so it can be a program name with args. -set dummy ${ac_tool_prefix}erlc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ERLC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $ERLC in - [\\/]* | ?:[\\/]*) - ac_cv_path_ERLC="$ERLC" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_ERLC="$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 -ERLC=$ac_cv_path_ERLC -if test -n "$ERLC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERLC" >&5 -$as_echo "$ERLC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_ERLC"; then - ac_pt_ERLC=$ERLC - # Extract the first word of "erlc", so it can be a program name with args. -set dummy erlc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ac_pt_ERLC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_ERLC in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_ERLC="$ac_pt_ERLC" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_ac_pt_ERLC="$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_ERLC=$ac_cv_path_ac_pt_ERLC -if test -n "$ac_pt_ERLC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_ERLC" >&5 -$as_echo "$ac_pt_ERLC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_ERLC" = x; then - ERLC="not found" - 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 - ERLC=$ac_pt_ERLC - fi -else - ERLC="$ac_cv_path_ERLC" -fi - -fi - -if test "$ERLC" = "not found"; then - as_fn_error $? "Erlang/OTP compiler (erlc) not found but required" "$LINENO" 5 -fi - - -# Checks and sets ERLANG_ROOT_DIR and ERLANG_LIB_DIR variable - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP root directory" >&5 -$as_echo_n "checking for Erlang/OTP root directory... " >&6; } -if test "${ac_cv_erlang_root_dir+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_ext=erl -ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' -ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' - if test "$cross_compiling" = yes; then : - { { $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 test program while cross compiling -See \`config.log' for more details" "$LINENO" 5 ; } -else - cat > conftest.$ac_ext <<_ACEOF --module(conftest). --export([start/0]). - -start() -> - RootDir = code:root_dir(), - file:write_file("conftest.out", RootDir), - ReturnValue = 0, - halt(ReturnValue) -. - -_ACEOF -if ac_fn_erl_try_run "$LINENO"; then : - ac_cv_erlang_root_dir=`cat conftest.out` - rm -f conftest.out -else - rm -f conftest.out - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "test Erlang program execution failed -See \`config.log' for more details" "$LINENO" 5 ; } -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -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 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_root_dir" >&5 -$as_echo "$ac_cv_erlang_root_dir" >&6; } -ERLANG_ROOT_DIR=$ac_cv_erlang_root_dir - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP library base directory" >&5 -$as_echo_n "checking for Erlang/OTP library base directory... " >&6; } -if test "${ac_cv_erlang_lib_dir+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_ext=erl -ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' -ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' - if test "$cross_compiling" = yes; then : - { { $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 test program while cross compiling -See \`config.log' for more details" "$LINENO" 5 ; } -else - cat > conftest.$ac_ext <<_ACEOF --module(conftest). --export([start/0]). - -start() -> - LibDir = code:lib_dir(), - file:write_file("conftest.out", LibDir), - ReturnValue = 0, - halt(ReturnValue) -. - -_ACEOF -if ac_fn_erl_try_run "$LINENO"; then : - ac_cv_erlang_lib_dir=`cat conftest.out` - rm -f conftest.out -else - rm -f conftest.out - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "test Erlang program execution failed -See \`config.log' for more details" "$LINENO" 5 ; } -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -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 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_dir" >&5 -$as_echo "$ac_cv_erlang_lib_dir" >&6; } -ERLANG_LIB_DIR=$ac_cv_erlang_lib_dir - - - -#locating rebar -# Extract the first word of "rebar", so it can be a program name with args. -set dummy rebar; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_REBAR+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $REBAR in - [\\/]* | ?:[\\/]*) - ac_cv_path_REBAR="$REBAR" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_REBAR="$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 -REBAR=$ac_cv_path_REBAR -if test -n "$REBAR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $REBAR" >&5 -$as_echo "$REBAR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -#locating make -# Extract the first word of "make", so it can be a program name with args. -set dummy make; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_MAKE+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$MAKE"; then - ac_cv_prog_MAKE="$MAKE" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_MAKE="make" - $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 -MAKE=$ac_cv_prog_MAKE -if test -n "$MAKE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAKE" >&5 -$as_echo "$MAKE" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - -if test "x$REBAR" = "x"; then - as_fn_error $? "'rebar' was not found" "$LINENO" 5 -fi - -if test "x$MAKE" = "x"; then - as_fn_error $? "'make' was not found" "$LINENO" 5 -fi - -#locating iconv - - - -# Check whether --with-libiconv-prefix was given. -if test "${with_libiconv_prefix+set}" = set; then : - withval=$with_libiconv_prefix; - for dir in `echo "$withval" | tr : ' '`; do - if test -d $dir/include; then CPPFLAGS="$CPPFLAGS -I$dir/include"; fi - if test -d $dir/include; then CFLAGS="$CFLAGS -I$dir/include"; fi - if test -d $dir/lib; then LDFLAGS="$LDFLAGS -L$dir/lib"; fi - done - -fi - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 -$as_echo_n "checking for iconv... " >&6; } -if test "${am_cv_func_iconv+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - - am_cv_func_iconv="no, consider installing GNU libiconv" - am_cv_lib_iconv=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -int -main () -{ -iconv_t cd = iconv_open("",""); - iconv(cd,NULL,NULL,NULL,NULL); - iconv_close(cd); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - am_cv_func_iconv=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test "$am_cv_func_iconv" != yes; then - am_save_LIBS="$LIBS" - LIBS="$LIBS -liconv" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -int -main () -{ -iconv_t cd = iconv_open("",""); - iconv(cd,NULL,NULL,NULL,NULL); - iconv_close(cd); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - am_cv_lib_iconv=yes - am_cv_func_iconv=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LIBS="$am_save_LIBS" - fi - if test "$am_cv_func_iconv" != yes; then - am_save_LIBS="$LIBS" - am_save_CFLAGS="$CFLAGS" - am_save_LDFLAGS="$LDFLAGS" - LIBS="$LIBS -liconv" - LDFLAGS="$LDFLAGS -L/usr/local/lib" - CFLAGS="$CFLAGS -I/usr/local/include" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -int -main () -{ -iconv_t cd = iconv_open("",""); - iconv(cd,NULL,NULL,NULL,NULL); - iconv_close(cd); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - am_cv_lib_iconv=yes - am_cv_func_iconv=yes - CPPFLAGS="$CPPFLAGS -I/usr/local/include" -else - LDFLAGS="$am_save_LDFLAGS" - CFLAGS="$am_save_CFLAGS" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LIBS="$am_save_LIBS" - fi - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 -$as_echo "$am_cv_func_iconv" >&6; } - if test "$am_cv_func_iconv" = yes; then - -$as_echo "#define HAVE_ICONV 1" >>confdefs.h - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 -$as_echo_n "checking for iconv declaration... " >&6; } - if test "${am_cv_proto_iconv+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#include -#include -extern -#ifdef __cplusplus -"C" -#endif -#if defined(__STDC__) || defined(__cplusplus) -size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); -#else -size_t iconv(); -#endif - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - am_cv_proto_iconv_arg1="" -else - am_cv_proto_iconv_arg1="const" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" -fi - - am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_t:- - }$am_cv_proto_iconv" >&5 -$as_echo "${ac_t:- - }$am_cv_proto_iconv" >&6; } - -cat >>confdefs.h <<_ACEOF -#define ICONV_CONST $am_cv_proto_iconv_arg1 -_ACEOF - - fi - LIBICONV= - if test "$am_cv_lib_iconv" = yes; then - LIBICONV="-liconv" - fi - - -#locating libexpat ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -4133,791 +4008,6 @@ fi done - -# Check whether --with-expat was given. -if test "${with_expat+set}" = set; then : - withval=$with_expat; -fi - - - EXPAT_CFLAGS= - EXPAT_LIBS= - if test x"$with_expat" != x; then - EXPAT_CFLAGS="-I$with_expat/include" - EXPAT_LIBS="-L$with_expat/lib" - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML_ParserCreate in -lexpat" >&5 -$as_echo_n "checking for XML_ParserCreate in -lexpat... " >&6; } -if test "${ac_cv_lib_expat_XML_ParserCreate+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lexpat "$EXPAT_LIBS" $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 XML_ParserCreate (); -int -main () -{ -return XML_ParserCreate (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_expat_XML_ParserCreate=yes -else - ac_cv_lib_expat_XML_ParserCreate=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_expat_XML_ParserCreate" >&5 -$as_echo "$ac_cv_lib_expat_XML_ParserCreate" >&6; } -if test "x$ac_cv_lib_expat_XML_ParserCreate" = x""yes; then : - EXPAT_LIBS="$EXPAT_LIBS -lexpat" - expat_found=yes -else - expat_found=no -fi - - if test $expat_found = no; then - as_fn_error $? "Could not find development files of Expat library" "$LINENO" 5 - fi - expat_save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $EXPAT_CFLAGS" - expat_save_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $EXPAT_CFLAGS" - for ac_header in expat.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "expat.h" "ac_cv_header_expat_h" "$ac_includes_default" -if test "x$ac_cv_header_expat_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_EXPAT_H 1 -_ACEOF - -else - expat_found=no -fi - -done - - if test $expat_found = no; then - as_fn_error $? "Could not find expat.h" "$LINENO" 5 - fi - CFLAGS="$expat_save_CFLAGS" - CPPFLAGS="$expat_save_CPPFLAGS" - - - - - -# Checks for typedefs, structures, and compiler characteristics. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 -$as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if test "${ac_cv_c_const+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -/* FIXME: Include the comments suggested by Paul. */ -#ifndef __cplusplus - /* Ultrix mips cc rejects this. */ - typedef int charset[2]; - const charset cs; - /* SunOS 4.1.1 cc rejects this. */ - char const *const *pcpcc; - char **ppc; - /* NEC SVR4.0.2 mips cc rejects this. */ - struct point {int x, y;}; - static struct point const zero = {0,0}; - /* AIX XL C 1.02.0.0 rejects this. - It does not let you subtract one const X* pointer from another in - an arm of an if-expression whose if-part is not a constant - expression */ - const char *g = "string"; - pcpcc = &g + (g ? g-g : 0); - /* HPUX 7.0 cc rejects these. */ - ++pcpcc; - ppc = (char**) pcpcc; - pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this. */ - char *t; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; - if (s) return 0; - } - { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25, 17}; - const int *foo = &x[0]; - ++foo; - } - { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ - typedef const int *iptr; - iptr p = 0; - ++p; - } - { /* AIX XL C 1.02.0.0 rejects this saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; - } - { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; - if (!foo) return 0; - } - return !cs[0] && !zero.x; -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_const=yes -else - ac_cv_c_const=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 -$as_echo "$ac_cv_c_const" >&6; } -if test $ac_cv_c_const = no; then - -$as_echo "#define const /**/" >>confdefs.h - -fi - - -# Check Erlang headers are installed -#AC_CHECK_HEADER(erl_driver.h,,[AC_MSG_ERROR([cannot find Erlang header files])]) - -# Change default prefix - - -# Checks for library functions. -for ac_header in stdlib.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" -if test "x$ac_cv_header_stdlib_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_STDLIB_H 1 -_ACEOF - -fi - -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 -$as_echo_n "checking for GNU libc compatible malloc... " >&6; } -if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_func_malloc_0_nonnull=no -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined STDC_HEADERS || defined HAVE_STDLIB_H -# include -#else -char *malloc (); -#endif - -int -main () -{ -return ! malloc (0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_malloc_0_nonnull=yes -else - ac_cv_func_malloc_0_nonnull=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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 -$as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } -if test $ac_cv_func_malloc_0_nonnull = yes; then : - -$as_echo "#define HAVE_MALLOC 1" >>confdefs.h - -else - $as_echo "#define HAVE_MALLOC 0" >>confdefs.h - - case " $LIBOBJS " in - *" malloc.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS malloc.$ac_objext" - ;; -esac - - -$as_echo "#define malloc rpl_malloc" >>confdefs.h - -fi - - -{ $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 test "${ac_cv_header_stdc+set}" = set; 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 - - -#locating zlib - -# Check whether --with-zlib was given. -if test "${with_zlib+set}" = set; then : - withval=$with_zlib; -fi - - -if test x"$ejabberd_zlib" != x; then - ZLIB_CFLAGS= - ZLIB_LIBS= - if test x"$with_zlib" != x; then - ZLIB_CFLAGS="-I$with_zlib/include" - ZLIB_LIBS="-L$with_zlib/lib" - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzgets in -lz" >&5 -$as_echo_n "checking for gzgets in -lz... " >&6; } -if test "${ac_cv_lib_z_gzgets+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lz "$ZLIB_LIBS" $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 gzgets (); -int -main () -{ -return gzgets (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_z_gzgets=yes -else - ac_cv_lib_z_gzgets=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_z_gzgets" >&5 -$as_echo "$ac_cv_lib_z_gzgets" >&6; } -if test "x$ac_cv_lib_z_gzgets" = x""yes; then : - ZLIB_LIBS="$ZLIB_LIBS -lz" - zlib_found=yes -else - zlib_found=no -fi - - if test $zlib_found = no; then - as_fn_error $? "Could not find development files of zlib library. Install them or disable \`ejabberd_zlib' with: --disable-ejabberd_zlib" "$LINENO" 5 - fi - zlib_save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $ZLIB_CFLAGS" - zlib_save_CPPFLAGS="$CFLAGS" - CPPFLAGS="$CPPFLAGS $ZLIB_CFLAGS" - for ac_header in zlib.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" -if test "x$ac_cv_header_zlib_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_ZLIB_H 1 -_ACEOF - -else - zlib_found=no -fi - -done - - if test $zlib_found = no; then - as_fn_error $? "Could not find zlib.h. Install it or disable \`ejabberd_zlib' with: --disable-ejabberd_zlib" "$LINENO" 5 - fi - CFLAGS="$zlib_save_CFLAGS" - CPPFLAGS="$zlib_save_CPPFLAGS" - - - -fi - - - -pam= -make_pam= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build pam" >&5 -$as_echo_n "checking whether build pam... " >&6; } -# Check whether --enable-pam was given. -if test "${enable_pam+set}" = set; then : - enableval=$enable_pam; mr_enable_pam="$enableval" -else - mr_enable_pam=no -fi - -if test "$mr_enable_pam" = "yes"; then -pam=pam -make_pam=pam/Makefile -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_pam" >&5 -$as_echo "$mr_enable_pam" >&6; } - - - - -#locating PAM - -# Check whether --with-pam was given. -if test "${with_pam+set}" = set; then : - withval=$with_pam; -fi - -if test x"$pam" != x; then - PAM_CFLAGS= - PAM_LIBS= - if test x"$with_pam" != x; then - PAM_CFLAGS="-I$with_pam/include" - PAM_LIBS="-L$with_pam/lib" - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pam_start in -lpam" >&5 -$as_echo_n "checking for pam_start in -lpam... " >&6; } -if test "${ac_cv_lib_pam_pam_start+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpam "$PAM_LIBS" $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 pam_start (); -int -main () -{ -return pam_start (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_pam_pam_start=yes -else - ac_cv_lib_pam_pam_start=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_pam_pam_start" >&5 -$as_echo "$ac_cv_lib_pam_pam_start" >&6; } -if test "x$ac_cv_lib_pam_pam_start" = x""yes; then : - PAM_LIBS="$PAM_LIBS -lpam" - pam_found=yes -else - pam_found=no -fi - - if test $pam_found = no; then - as_fn_error $? "Could not find development files of PAM library. Install them or disable \`pam' with: --disable-pam" "$LINENO" 5 - fi - pam_save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PAM_CFLAGS" - pam_save_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $PAM_CFLAGS" - for ac_header in security/pam_appl.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "security/pam_appl.h" "ac_cv_header_security_pam_appl_h" "$ac_includes_default" -if test "x$ac_cv_header_security_pam_appl_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_SECURITY_PAM_APPL_H 1 -_ACEOF - -else - pam_found=no -fi - -done - - if test $pam_found = no; then - as_fn_error $? "Could not find security/pam_appl.h. Install it or disable \`pam' with: --disable-pam" "$LINENO" 5 - fi - CFLAGS="$pam_save_CFLAGS" - CPPFLAGS="$pam_save_CPPFLAGS" - - - -fi - - -# Check whether --enable-hipe was given. -if test "${enable_hipe+set}" = set; then : - enableval=$enable_hipe; case "${enableval}" in - yes) hipe=true ;; - no) hipe=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-hipe" "$LINENO" 5 ;; -esac -else - hipe=false -fi - - - -# Check whether --enable-roster_gateway_workaround was given. -if test "${enable_roster_gateway_workaround+set}" = set; then : - enableval=$enable_roster_gateway_workaround; case "${enableval}" in - yes) roster_gateway_workaround=true ;; - no) roster_gateway_workaround=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-roster-gateway-workaround" "$LINENO" 5 ;; -esac -else - roster_gateway_workaround=false -fi - - - -# Check whether --enable-flash_hack was given. -if test "${enable_flash_hack+set}" = set; then : - enableval=$enable_flash_hack; case "${enableval}" in - yes) flash_hack=true ;; - no) flash_hack=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-flash-hack" "$LINENO" 5 ;; -esac -else - flash_hack=false -fi - - - -# Check whether --enable-mssql was given. -if test "${enable_mssql+set}" = set; then : - enableval=$enable_mssql; case "${enableval}" in - yes) db_type=mssql ;; - no) db_type=generic ;; - *) as_fn_error $? "bad value ${enableval} for --enable-mssql" "$LINENO" 5 ;; -esac -else - db_type=generic -fi - - - -# Check whether --enable-transient_supervisors was given. -if test "${enable_transient_supervisors+set}" = set; then : - enableval=$enable_transient_supervisors; case "${enableval}" in - yes) transient_supervisors=true ;; - no) transient_supervisors=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-transient_supervisors" "$LINENO" 5 ;; -esac -else - transient_supervisors=true -fi - - - -# Check whether --enable-full_xml was given. -if test "${enable_full_xml+set}" = set; then : - enableval=$enable_full_xml; case "${enableval}" in - yes) full_xml=true ;; - no) full_xml=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-full-xml" "$LINENO" 5 ;; -esac -else - full_xml=false -fi - - - -# Check whether --enable-nif was given. -if test "${enable_nif+set}" = set; then : - enableval=$enable_nif; case "${enableval}" in - yes) nif=true ;; - no) nif=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-nif" "$LINENO" 5 ;; -esac -else - nif=false -fi - - - -ac_config_files="$ac_config_files Makefile rebar.config" - - -#openssl - -# Check whether --with-openssl was given. -if test "${with_openssl+set}" = set; then : - withval=$with_openssl; -fi - -unset SSL_LIBS; -unset SSL_CFLAGS; -have_openssl=no -if test x"$tls" != x; then - for ssl_prefix in $withval /usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /usr; do - printf "looking for openssl in $ssl_prefix...\n" - SSL_CFLAGS="-I$ssl_prefix/include" - SSL_LIBS="-L$ssl_prefix/lib -lcrypto" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_new in -lssl" >&5 -$as_echo_n "checking for SSL_new in -lssl... " >&6; } -if test "${ac_cv_lib_ssl_SSL_new+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lssl $SSL_LIBS $SSL_CFLAGS $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_new (); -int -main () -{ -return SSL_new (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_ssl_SSL_new=yes -else - ac_cv_lib_ssl_SSL_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_new" >&5 -$as_echo "$ac_cv_lib_ssl_SSL_new" >&6; } -if test "x$ac_cv_lib_ssl_SSL_new" = x""yes; then : - have_openssl=yes -else - have_openssl=no -fi - - if test x"$have_openssl" = xyes; then - save_CPPFLAGS=$CPPFLAGS - CPPFLAGS="-I$ssl_prefix/include $CPPFLAGS" - for ac_header in openssl/ssl.h -do : - 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" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_OPENSSL_SSL_H 1 -_ACEOF - have_openssl_h=yes -fi - -done - - CPPFLAGS=$save_CPPFLAGS - if test x"$have_openssl_h" = xyes; then - have_openssl=yes - printf "openssl found in $ssl_prefix\n"; - SSL_LIBS="-L$ssl_prefix/lib -lssl -lcrypto" - CPPFLAGS="-I$ssl_prefix/include $CPPFLAGS" - SSL_CFLAGS="-DHAVE_SSL" - break - fi - else - # Clear this from the autoconf cache, so in the next pass of - # this loop with different -L arguments, it will test again. - unset ac_cv_lib_ssl_SSL_new - fi - done -if test x${have_openssl} != xyes; then - as_fn_error $? "Could not find development files of OpenSSL library. Install them or disable \`tls' with: --disable-tls" "$LINENO" 5 -fi - - -fi - -# If ssl is kerberized it need krb5.h -# On RedHat and OpenBSD, krb5.h is in an unsual place: -KRB5_INCLUDE="`krb5-config --cflags 2>/dev/null`" -if test -n "$KRB5_INCLUDE" ; then - CPPFLAGS="$CPPFLAGS $KRB5_INCLUDE" -else - # For RedHat For BSD - for D in /usr/kerberos/include /usr/include/kerberos /usr/include/kerberosV - do - if test -d $D ; then - CPPFLAGS="$CPPFLAGS -I$D" - fi - done -fi -ac_fn_c_check_header_mongrel "$LINENO" "krb5.h" "ac_cv_header_krb5_h" "$ac_includes_default" -if test "x$ac_cv_header_krb5_h" = x""yes; then : - -fi - - - -ENABLEUSER="" -# Check whether --enable-user was given. -if test "${enable_user+set}" = set; then : - enableval=$enable_user; case "${enableval}" in - yes) ENABLEUSER=`whoami` ;; - no) ENABLEUSER="" ;; - *) ENABLEUSER=$enableval - esac -fi - -if test "$ENABLEUSER" != ""; then - echo "allow this system user to start ejabberd: $ENABLEUSER" - INSTALLUSER=$ENABLEUSER - -fi - ac_fn_c_check_header_mongrel "$LINENO" "openssl/md2.h" "ac_cv_header_openssl_md2_h" "$ac_includes_default" if test "x$ac_cv_header_openssl_md2_h" = x""yes; then : md2=true @@ -5797,6 +4887,8 @@ do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "rebar.config") CONFIG_FILES="$CONFIG_FILES rebar.config" ;; + "src/ejabberd.app.src") CONFIG_FILES="$CONFIG_FILES src/ejabberd.app.src" ;; + "rel/reltool.config") CONFIG_FILES="$CONFIG_FILES rel/reltool.config" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; esac diff --git a/configure.ac b/configure.ac index 5b6e1de05..be1004945 100644 --- a/configure.ac +++ b/configure.ac @@ -2,10 +2,10 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.53) -AC_INIT(ejabberd, m4_esyscmd([grep -o -E "\{vsn,.\".*\"\}" src/ejabberd.app.src | cut -d \" -f 2 | tr -d '\n']), [ejabberd@process-one.net], [ejabberd]) +AC_PACKAGE_VERSION(3.0.0) +AC_INIT(ejabberd, 3.0.0, [ejabberd@process-one.net], [ejabberd]) # Checks for programs. -AC_PROG_CC AC_PROG_MAKE_SET AC_PROG_INSTALL AC_PROG_SED @@ -22,44 +22,23 @@ AC_ERLANG_NEED_ERLC AC_ERLANG_SUBST_ROOT_DIR AC_ERLANG_SUBST_LIB_DIR -#locating rebar -AC_PATH_PROG([REBAR], [rebar], []) +#locating escript +AC_PATH_PROG([ESCRIPT], [escript], []) + #locating make AC_CHECK_PROG([MAKE], [make], [make], []) -if test "x$REBAR" = "x"; then - AC_MSG_ERROR(['rebar' was not found]) +if test "x$ESCRIPT" = "x"; then + AC_MSG_ERROR(['escript' was not found]) fi if test "x$MAKE" = "x"; then AC_MSG_ERROR(['make' was not found]) fi -#locating iconv -AM_ICONV -#locating libexpat -AM_WITH_EXPAT - -# Checks for typedefs, structures, and compiler characteristics. -AC_C_CONST - -# Check Erlang headers are installed -#AC_CHECK_HEADER(erl_driver.h,,[AC_MSG_ERROR([cannot find Erlang header files])]) - # Change default prefix AC_PREFIX_DEFAULT(/) -# Checks for library functions. -AC_FUNC_MALLOC -AC_HEADER_STDC - -#locating zlib -AM_WITH_ZLIB - -AC_MOD_ENABLE(pam, no) -#locating PAM -AM_WITH_PAM - AC_ARG_ENABLE(hipe, [AC_HELP_STRING([--enable-hipe], [compile natively with HiPE, not recommended (default: no)])], [case "${enableval}" in @@ -124,25 +103,9 @@ esac],[nif=false]) AC_SUBST(nif) AC_CONFIG_FILES([Makefile - rebar.config]) - -#openssl -AM_WITH_OPENSSL -# If ssl is kerberized it need krb5.h -# On RedHat and OpenBSD, krb5.h is in an unsual place: -KRB5_INCLUDE="`krb5-config --cflags 2>/dev/null`" -if test -n "$KRB5_INCLUDE" ; then - CPPFLAGS="$CPPFLAGS $KRB5_INCLUDE" -else - # For RedHat For BSD - for D in /usr/kerberos/include /usr/include/kerberos /usr/include/kerberosV - do - if test -d $D ; then - CPPFLAGS="$CPPFLAGS -I$D" - fi - done -fi -AC_CHECK_HEADER(krb5.h,,) + rebar.config + src/ejabberd.app.src + rel/reltool.config]) ENABLEUSER="" AC_ARG_ENABLE(user, diff --git a/include/ejabberd.hrl b/include/ejabberd.hrl index e36139a0c..4a2d25cd1 100644 --- a/include/ejabberd.hrl +++ b/include/ejabberd.hrl @@ -27,7 +27,7 @@ -define(MYLANG, ejabberd_config:get_mylang()). --define(MSGS_DIR, <<"msgs">>). +-define(MSGS_DIR, filename:join(["priv", "msgs"])). -define(CONFIG_PATH, <<"ejabberd.cfg">>). diff --git a/include/jlib.hrl b/include/jlib.hrl index fe4dbbf02..271c32a8d 100644 --- a/include/jlib.hrl +++ b/include/jlib.hrl @@ -215,6 +215,8 @@ -define(NS_BOB, <<"urn:xmpp:bob">>). +-include("xml.hrl"). + -define(STANZA_ERROR(Code, Type, Condition), #xmlel{name = <<"error">>, attrs = [{<<"code">>, Code}, {<<"type">>, Type}], @@ -617,19 +619,6 @@ -type(ljid() :: {binary(), binary(), binary()}). --record(xmlel, -{ - name = <<"">> :: binary(), - attrs = [] :: [attr()], - children = [] :: [xmlel() | cdata()] -}). - --type(cdata() :: {xmlcdata, CData::binary()}). - --type(attr() :: {Name::binary(), Value::binary()}). - --type(xmlel() :: #xmlel{}). - -record(iq, {id = <<"">> :: binary(), type = get :: get | set | result | error, xmlns = <<"">> :: binary(), diff --git a/rebar b/rebar new file mode 100755 index 0000000000000000000000000000000000000000..cacba57df1ec603b8c9405071301d284c16f9114 GIT binary patch literal 276843 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 z

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 SUGt-OBW6R literal 0 HcmV?d00001 diff --git a/rebar.config.in b/rebar.config.in index 7b64741ca..bf7cbfeb2 100644 --- a/rebar.config.in +++ b/rebar.config.in @@ -1,8 +1,13 @@ -{erl_opts, [debug_info, {i, "include"}, {i, "deps/logger/include"}]}. +{erl_opts, [debug_info, + {i, "include"}, + {i, "deps/logger/include"}, + {i, "deps/xml/include"}]}. %%{src_dirs, [asn1, src, mod_pubsub_ng]}. {src_dirs, [asn1, src]}. +{sub_dirs, ["rel"]}. + {deps, [{mysql, ".*", {git, "git://github.com/processone/mysql"}}, {pgsql, ".*", {git, "git://github.com/processone/pgsql"}}, {iconv, ".*", {git, "git://github.com/processone/eiconv"}}, @@ -11,14 +16,14 @@ {tls, ".*", {git, "git://github.com/processone/tls"}}, {ezlib, ".*", {git, "git://github.com/processone/zlib"}}, {stun, ".*", {git, "git://github.com/processone/stun"}}, + {stringprep, ".*", {git, "git://github.com/processone/stringprep"}}, + {riakc, ".*", {git, "git://github.com/basho/riak-erlang-client"}}, + {jiffy, ".*", {git, "git://github.com/davisp/jiffy"}}, + {ibrowse, ".*", {git, "git://github.com/cmullaparthi/ibrowse"}}, + {lhttpc, ".*", {git, "git://github.com/esl/lhttpc"}}, + %%{xml, ".*", {git, "git://github.com/processone/xml"}}, {xmlrpc, ".*", {git, "git://github.com/etnt/xmlrpc"}}]}. -{port_env, [{"CFLAGS", "-g -O2 -Wall"}]}. - -{port_specs, [{"priv/lib/sha_drv.so", ["c_src/sha_drv.c"]}, - {"priv/lib/expat_erl.so", ["c_src/expat_erl.c"]}, - {"priv/lib/xml.so", ["c_src/xml.c"]}]}. - %% Local Variables: %% mode: erlang %% End: diff --git a/rel/reltool.config.in b/rel/reltool.config.in new file mode 100644 index 000000000..b058b92bd --- /dev/null +++ b/rel/reltool.config.in @@ -0,0 +1,47 @@ +{sys, [ + {lib_dirs, []}, + {erts, [{mod_cond, derived}, {app_file, strip}]}, + {app_file, strip}, + {rel, "@PACKAGE_NAME@", "@PACKAGE_VERSION@", + [ + kernel, + stdlib, + sasl, + ejabberd + ]}, + {rel, "start_clean", "", + [ + kernel, + stdlib + ]}, + {boot_rel, "ejabberd"}, + {profile, embedded}, + {incl_cond, exclude}, + {excl_archive_filters, [".*"]}, %% Do not archive built libs + {excl_sys_filters, ["^bin/.*", "^erts.*/bin/(dialyzer|typer)", + "^erts.*/(doc|info|include|lib|man|src)"]}, + {excl_app_filters, ["\.gitignore"]}, + {app, sasl, [{incl_cond, include}]}, + {app, stdlib, [{incl_cond, include}]}, + {app, kernel, [{incl_cond, include}]}, + {app, ejabberd, [{incl_cond, include}, {lib_dir, ".."}]} + ]}. + +{target_dir, "ejabberd"}. + +{overlay, [ + {mkdir, "log/sasl"}, + {copy, "files/erl", "\{\{erts_vsn\}\}/bin/erl"}, + {copy, "files/nodetool", "\{\{erts_vsn\}\}/bin/nodetool"}, + {copy, "files/ejabberd", "bin/ejabberd"}, + {copy, "files/ejabberd.cmd", "bin/ejabberd.cmd"}, + {copy, "files/start_erl.cmd", "bin/start_erl.cmd"}, + {copy, "files/install_upgrade.escript", "bin/install_upgrade.escript"}, + {copy, "files/sys.config", "releases/\{\{rel_vsn\}\}/sys.config"}, + {copy, "files/vm.args", "releases/\{\{rel_vsn\}\}/vm.args"} + ]}. + +%%% Local Variables: +%%% mode: erlang +%%% End: +%%% vim: set filetype=erlang tabstop=8 foldmarker=%%%',%%%. foldmethod=marker: diff --git a/src/ejabberd.app.src b/src/ejabberd.app.src deleted file mode 100644 index 06077042c..000000000 --- a/src/ejabberd.app.src +++ /dev/null @@ -1,37 +0,0 @@ -%% $Id$ - -{application, ejabberd, - [{description, "ejabberd"}, - {vsn, "3.0.0"}, - {modules, []}, - {registered, [ejabberd, - ejabberd_sup, - ejabberd_auth, - ejabberd_router, - ejabberd_router_multicast, - ejabberd_sm, - ejabberd_s2s, - ejabberd_local, - ejabberd_listeners, - ejabberd_iq_sup, - ejabberd_service_sup, - ejabberd_s2s_out_sup, - ejabberd_s2s_in_sup, - ejabberd_c2s_sup, - ejabberd_mod_roster, - ejabberd_mod_echo, - ejabberd_mod_pubsub, - ejabberd_mod_irc, - ejabberd_mod_muc, - ejabberd_offline, - random_generator - ]}, - {applications, [kernel, stdlib]}, - {env, []}, - {mod, {ejabberd_app, []}}]}. - - -%% Local Variables: -%% mode: erlang -%% End: -%% vim: set filetype=erlang tabstop=8: diff --git a/src/ejabberd.app.src.in b/src/ejabberd.app.src.in new file mode 100644 index 000000000..4b0864831 --- /dev/null +++ b/src/ejabberd.app.src.in @@ -0,0 +1,16 @@ +%% $Id$ + +{application, ejabberd, + [{description, "@PACKAGE_NAME@"}, + {vsn, "@PACKAGE_VERSION@"}, + {modules, []}, + {registered, []}, + {applications, [kernel, stdlib]}, + {env, []}, + {mod, {ejabberd_app, []}}]}. + + +%% Local Variables: +%% mode: erlang +%% End: +%% vim: set filetype=erlang tabstop=8: diff --git a/src/ejabberd.erl b/src/ejabberd.erl index 258662473..02b24e5a2 100644 --- a/src/ejabberd.erl +++ b/src/ejabberd.erl @@ -28,8 +28,9 @@ -author('alexey@process-one.net'). -export([start/0, stop/0, - get_pid_file/0, - get_so_path/0, get_bin_path/0]). + get_pid_file/0]). + +-include("logger.hrl"). start() -> %%ejabberd_cover:start(), @@ -39,32 +40,6 @@ stop() -> application:stop(ejabberd). %%ejabberd_cover:stop(). -get_so_path() -> - case os:getenv("EJABBERD_SO_PATH") of - false -> - case code:priv_dir(ejabberd) of - {error, _} -> - "."; - Path -> - filename:join([Path, "lib"]) - end; - Path -> - Path - end. - -get_bin_path() -> - case os:getenv("EJABBERD_BIN_PATH") of - false -> - case code:priv_dir(ejabberd) of - {error, _} -> - "."; - Path -> - filename:join([Path, "bin"]) - end; - Path -> - Path - end. - %% @spec () -> false | string() get_pid_file() -> case os:getenv("EJABBERD_PID_PATH") of diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl index b95afd7d2..c58bbb3b6 100644 --- a/src/ejabberd_admin.erl +++ b/src/ejabberd_admin.erl @@ -110,7 +110,7 @@ commands() -> result = {res, rescode}}, #ejabberd_commands{name = get_loglevel, tags = [logs, server], desc = "Get the current loglevel", - module = ejabberd_loglevel, function = get, + module = loglevel, function = get, args = [], result = {leveltuple, {tuple, [{levelnumber, integer}, {levelatom, atom}, diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl index 167a9874c..182d55322 100644 --- a/src/ejabberd_app.erl +++ b/src/ejabberd_app.erl @@ -34,20 +34,16 @@ -include("ejabberd.hrl"). -include("logger.hrl"). - %%% %%% Application API %%% start(normal, _Args) -> - ejabberd_loglevel:set(4), + loglevel:set(4), write_pid_file(), - application:start(sasl), + start_apps(), randoms:start(), db_init(), - sha:start(), - stringprep_sup:start_link(), - xml:start(), start(), translate:start(), acl:start(), @@ -109,19 +105,12 @@ init() -> %error_logger:logfile({open, ?LOG_PATH}), LogPath = get_log_path(), error_logger:add_report_handler(ejabberd_logger_h, LogPath), - erl_ddll:load_driver(ejabberd:get_so_path(), tls_drv), - case erl_ddll:load_driver(ejabberd:get_so_path(), expat_erl) of - ok -> ok; - {error, already_loaded} -> ok - end, - Port = open_port({spawn, "expat_erl"}, [binary]), - loop(Port). + loop(). - -loop(Port) -> +loop() -> receive _ -> - loop(Port) + loop() end. db_init() -> @@ -250,3 +239,11 @@ delete_pid_file() -> PidFilename -> file:delete(PidFilename) end. + +start_apps() -> + application:start(sasl), + application:start(ssl), + application:start(tls), + application:start(xml), + application:start(stringprep), + application:start(ezlib). diff --git a/src/ejabberd_auth_pam.erl b/src/ejabberd_auth_pam.erl index 092728136..af3bb17f2 100644 --- a/src/ejabberd_auth_pam.erl +++ b/src/ejabberd_auth_pam.erl @@ -40,7 +40,7 @@ plain_password_required/0]). start(_Host) -> - case epam:start() of + case application:start(epam) of {ok, _} -> ok; {error, {already_started, _}} -> ok; Err -> Err diff --git a/src/ejabberd_config.erl b/src/ejabberd_config.erl index 71f5fba0c..c973c19b2 100644 --- a/src/ejabberd_config.erl +++ b/src/ejabberd_config.erl @@ -453,7 +453,7 @@ process_term(Term, State) -> {ejabberdctl_access_commands, ACs} -> add_option(ejabberdctl_access_commands, ACs, State); {loglevel, Loglevel} -> - ejabberd_loglevel:set(Loglevel), + loglevel:set(Loglevel), State; {max_fsm_queue, N} -> add_option(max_fsm_queue, N, State); diff --git a/src/ejabberd_frontend_socket.erl b/src/ejabberd_frontend_socket.erl index 0f5cb35d2..fb4d74bd5 100644 --- a/src/ejabberd_frontend_socket.erl +++ b/src/ejabberd_frontend_socket.erl @@ -157,7 +157,7 @@ handle_call({compress, Data}, _From, State) -> Reply = ok, {reply, Reply, State#socket_state{socket = ZlibSocket, - sockmod = ejabberd_zlib}, + sockmod = ezlib}, ?HIBERNATE_TIMEOUT}; handle_call(reset_stream, _From, State) -> ejabberd_receiver:reset_stream(State#socket_state.receiver), diff --git a/src/ejabberd_receiver.erl b/src/ejabberd_receiver.erl index 2fc542b39..99fcecf68 100644 --- a/src/ejabberd_receiver.erl +++ b/src/ejabberd_receiver.erl @@ -44,8 +44,8 @@ -include("logger.hrl"). -record(state, - {socket :: inet:socket() | tls:tls_socket() | ejabberd_zlib:zlib_socket(), - sock_mod = gen_tcp :: gen_tcp | tls | ejabberd_zlib, + {socket :: inet:socket() | tls:tls_socket() | ezlib:zlib_socket(), + sock_mod = gen_tcp :: gen_tcp | tls | ezlib, shaper_state = none :: shaper:shaper(), c2s_pid :: pid(), max_stanza_size = infinity :: non_neg_integer() | infinity, @@ -99,7 +99,7 @@ starttls(Pid, TLSOpts, Data) -> do_call(Pid, {starttls, TLSOpts, Data}). -spec compress(pid(), iodata() | undefined) -> {error, any()} | - {ok, ejabberd_zlib:zlib_socket()}. + {ok, ezlib:zlib_socket()}. compress(Pid, Data) -> do_call(Pid, {compress, Data}). @@ -171,7 +171,7 @@ handle_call({compress, Data}, _From, c2s_pid = C2SPid, socket = Socket, sock_mod = SockMod, max_stanza_size = MaxStanzaSize} = State) -> - {ok, ZlibSocket} = ejabberd_zlib:enable_zlib(SockMod, + {ok, ZlibSocket} = ezlib:enable_zlib(SockMod, Socket), if Data /= undefined -> do_send(State, Data); true -> ok @@ -180,9 +180,9 @@ handle_call({compress, Data}, _From, NewXMLStreamState = xml_stream:new(C2SPid, MaxStanzaSize), NewState = State#state{socket = ZlibSocket, - sock_mod = ejabberd_zlib, + sock_mod = ezlib, xml_stream_state = NewXMLStreamState}, - case ejabberd_zlib:recv_data(ZlibSocket, <<"">>) of + case ezlib:recv_data(ZlibSocket, <<"">>) of {ok, ZlibData} -> {reply, {ok, ZlibSocket}, process_data(ZlibData, NewState), ?HIBERNATE_TIMEOUT}; @@ -250,8 +250,8 @@ handle_info({Tag, _TCPSocket, Data}, ?HIBERNATE_TIMEOUT}; {error, _Reason} -> {stop, normal, State} end; - ejabberd_zlib -> - case ejabberd_zlib:recv_data(Socket, Data) of + ezlib -> + case ezlib:recv_data(Socket, Data) of {ok, ZlibData} -> {noreply, process_data(ZlibData, State), ?HIBERNATE_TIMEOUT}; diff --git a/src/ejabberd_socket.erl b/src/ejabberd_socket.erl index 1fe17aaa4..096bc46a9 100644 --- a/src/ejabberd_socket.erl +++ b/src/ejabberd_socket.erl @@ -43,11 +43,11 @@ -type sockmod() :: ejabberd_http_poll | ejabberd_bosh | ejabberd_http_bind | ejabberd_http_bindjson | ejabberd_http_ws | ejabberd_http_wsjson | - gen_tcp | tls | ejabberd_zlib. + gen_tcp | tls | ezlib. -type receiver() :: pid () | atom(). -type socket() :: pid() | inet:socket() | tls:tls_socket() | - ejabberd_zlib:zlib_socket() | + ezlib:zlib_socket() | ejabberd_bosh:bosh_socket() | ejabberd_http_ws:ws_socket() | ejabberd_http_poll:poll_socket(). @@ -152,7 +152,7 @@ compress(SocketData, Data) -> ejabberd_receiver:compress(SocketData#socket_state.receiver, Data), SocketData#socket_state{socket = ZlibSocket, - sockmod = ejabberd_zlib}. + sockmod = ezlib}. reset_stream(SocketData) when is_pid(SocketData#socket_state.receiver) -> @@ -255,8 +255,8 @@ get_conn_type(#socket_state{sockmod = SockMod, socket = Socket}) -> case SockMod of gen_tcp -> c2s; tls -> c2s_tls; - ejabberd_zlib -> - case ejabberd_zlib:get_sockmod(Socket) of + ezlib -> + case ezlib:get_sockmod(Socket) of gen_tcp -> c2s_compressed; tls -> c2s_compressed_tls end; diff --git a/src/eldap.erl b/src/eldap.erl index d894b55e1..dbfdb3adc 100644 --- a/src/eldap.erl +++ b/src/eldap.erl @@ -430,7 +430,6 @@ get_handle(Name) when is_binary(Name) -> %%%---------------------------------------------------------------------- init([Hosts, Port, Rootdn, Passwd, Opts]) -> - catch ssl:start(), Encrypt = case gen_mod:get_opt(encrypt, Opts, fun(tls) -> tls; (starttls) -> starttls; diff --git a/src/http_p1.erl b/src/http_p1.erl index 38a8cb716..497375581 100644 --- a/src/http_p1.erl +++ b/src/http_p1.erl @@ -39,11 +39,10 @@ -ifdef(USE_IBROWSE). start() -> - ibrowse:start(), - ssl:start(). + application:start(ibrowse). stop() -> - ibrowse:stop(). + application:stop(ibrowse). request(Method, URL, Hdrs, Body, Opts) -> TimeOut = proplists:get_value(timeout, Opts, infinity), @@ -62,13 +61,10 @@ request(Method, URL, Hdrs, Body, Opts) -> -ifdef(USE_LHTTPC). start() -> - application:start(crypto), - application:start(ssl), - lhttpc:start(). + application:start(lhttpc). stop() -> - lhttpc:stop(), - application:stop(ssl). + application:stop(lhttpc). request(Method, URL, Hdrs, Body, Opts) -> TimeOut = proplists:get_value(timeout, Opts, infinity), @@ -86,12 +82,10 @@ request(Method, URL, Hdrs, Body, Opts) -> -else. start() -> - inets:start(), - ssl:start(). + application:start(inets). stop() -> - inets:stop(), - ssl:stop(). + application:start(inets). to_list(Str) when is_binary(Str) -> binary_to_list(Str); diff --git a/src/mod_applepush_service.erl b/src/mod_applepush_service.erl index 698f87c2b..437b6f552 100644 --- a/src/mod_applepush_service.erl +++ b/src/mod_applepush_service.erl @@ -66,7 +66,6 @@ start_link(Host, Opts) -> gen_server:start_link({local, Proc}, ?MODULE, [Host, Opts], []). start(Host, Opts) -> - ssl:start(), MyHosts = case catch gen_mod:get_opt( hosts, Opts, fun(L) when is_list(L) -> diff --git a/src/mod_ip_blacklist.erl b/src/mod_ip_blacklist.erl index 9477451c0..3e8e2d2e3 100644 --- a/src/mod_ip_blacklist.erl +++ b/src/mod_ip_blacklist.erl @@ -69,7 +69,6 @@ preinit(Parent, State) -> stop(_Host) -> ok. init(State) -> - inets:start(), ets:new(bl_c2s, [named_table, public, {keypos, #bl_c2s.ip}]), update_bl_c2s(), diff --git a/src/mod_irc.erl b/src/mod_irc.erl index dbaeff9d0..1773a3934 100644 --- a/src/mod_irc.erl +++ b/src/mod_irc.erl @@ -99,7 +99,7 @@ stop(Host) -> %%==================================================================== init([Host, Opts]) -> - iconv:start(), + application:start(iconv), MyHost = gen_mod:get_opt_host(Host, Opts, <<"irc.@HOST@">>), case gen_mod:db_type(Opts) of diff --git a/src/sha.erl b/src/sha.erl deleted file mode 100644 index ebe9cfce9..000000000 --- a/src/sha.erl +++ /dev/null @@ -1,114 +0,0 @@ -%%%---------------------------------------------------------------------- -%%% File : sha.erl -%%% Author : Alexey Shchepin -%%% Purpose : -%%% Created : 20 Dec 2002 by Alexey Shchepin -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2013 ProcessOne -%%% -%%% 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 -%%% -%%%---------------------------------------------------------------------- - --module(sha). - --author('alexey@process-one.net'). - --export([start/0, sha/1, sha1/1, sha224/1, sha256/1, - sha384/1, sha512/1, to_hexlist/1]). - --ifdef(HAVE_MD2). - --export([md2/1]). - --endif. - --include("ejabberd.hrl"). --include("logger.hrl"). - --define(DRIVER, sha_drv). - -start() -> - crypto:start(), - Res = case erl_ddll:load_driver(ejabberd:get_so_path(), - ?DRIVER) - of - ok -> ok; - {error, already_loaded} -> ok; - Err -> Err - end, - case Res of - ok -> - Port = open_port({spawn, atom_to_list(?DRIVER)}, - [binary]), - register(?DRIVER, Port); - {error, Reason} -> - ?CRITICAL_MSG("unable to load driver '~s': ~s", - [driver_path(), erl_ddll:format_error(Reason)]) - end. - -digit_to_xchar(D) when (D >= 0) and (D < 10) -> D + 48; -digit_to_xchar(D) -> D + 87. - --spec sha(binary()) -> binary(). - -sha(Text) -> - Bin = crypto:sha(Text), - to_hexlist(Bin). - --spec to_hexlist(binary()) -> binary(). - -to_hexlist(Bin) -> - iolist_to_binary(lists:reverse(ints_to_rxstr(binary_to_list(Bin), []))). - -ints_to_rxstr([], Res) -> Res; -ints_to_rxstr([N | Ns], Res) -> - ints_to_rxstr(Ns, - [digit_to_xchar(N rem 16), digit_to_xchar(N div 16) - | Res]). - --spec sha1(binary()) -> binary(). --spec sha224(binary()) -> binary(). --spec sha256(binary()) -> binary(). --spec sha384(binary()) -> binary(). --spec sha512(binary()) -> binary(). - -sha1(Text) -> crypto:sha(Text). - -sha224(Text) -> erlang:port_control(?DRIVER, 224, Text). - -sha256(Text) -> erlang:port_control(?DRIVER, 256, Text). - -sha384(Text) -> erlang:port_control(?DRIVER, 384, Text). - -sha512(Text) -> erlang:port_control(?DRIVER, 512, Text). - --ifdef(HAVE_MD2). - --spec md2(binary()) -> binary(). - -md2(Text) -> erlang:port_control(?DRIVER, 2, Text). - --endif. - -driver_path() -> - Suffix = case os:type() of - {win32, _} -> ".dll"; - _ -> ".so" - end, - filename:join(ejabberd:get_so_path(), - atom_to_list(?DRIVER) ++ Suffix). diff --git a/src/xml.erl b/src/xml.erl deleted file mode 100644 index 598362fc1..000000000 --- a/src/xml.erl +++ /dev/null @@ -1,433 +0,0 @@ -%%%---------------------------------------------------------------------- -%%% File : xml.erl -%%% Author : Alexey Shchepin -%%% Purpose : XML utils -%%% Created : 20 Nov 2002 by Alexey Shchepin -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2013 ProcessOne -%%% -%%% 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 -%%% -%%%---------------------------------------------------------------------- - --module(xml). - --author('alexey@process-one.net'). - --export([element_to_binary/1, - crypt/1, make_text_node/1, remove_cdata/1, - remove_subtags/3, get_cdata/1, get_tag_cdata/1, - get_attr/2, get_attr_s/2, get_tag_attr/2, - get_tag_attr_s/2, get_subtag/2, get_subtag_cdata/2, - append_subtags/2, get_path_s/2, start/0, - replace_tag_attr/3, to_xmlel/1]). - --include("jlib.hrl"). --include("ejabberd.hrl"). --include("logger.hrl"). - -%% Select at compile time how to escape characters in binary text -%% nodes. -%% Can be choosen with ./configure --enable-full-xml --ifdef(FULL_XML_SUPPORT). - --define(ESCAPE_BINARY(CData), make_text_node(CData)). - --else. - --define(ESCAPE_BINARY(CData), crypt(CData)). - --endif. - -%% Replace element_to_binary/1 with NIF -%% Can be choosen with ./configure --enable-nif --ifdef(NIF). - -start() -> - SOPath = filename:join(ejabberd:get_so_path(), "xml"), - case catch erlang:load_nif(SOPath, 0) of - ok -> ok; - Err -> ?WARNING_MSG("unable to load xml NIF: ~p", [Err]) - end. - --else. - -start() -> ok. - --endif. - -%% --spec(element_to_binary/1 :: -( - El :: xmlel() | cdata()) - -> binary() -). - -element_to_binary(El) -> - iolist_to_binary(element_to_string(El)). - -%% --spec(element_to_string/1 :: -( - El :: xmlel() | cdata()) - -> string() -). - -element_to_string(El) -> - case catch element_to_string_nocatch(El) of - {'EXIT', Reason} -> erlang:error({badxml, El, Reason}); - Result -> Result - end. - --spec(element_to_string_nocatch/1 :: -( - El :: xmlel() | cdata()) - -> iolist() -). - -element_to_string_nocatch(El) -> - case El of - #xmlel{name = Name, attrs = Attrs, children = Els} -> - if Els /= [] -> - [$<, Name, attrs_to_list(Attrs), $>, - [element_to_string_nocatch(E) || E <- Els], $<, $/, - Name, $>]; - true -> [$<, Name, attrs_to_list(Attrs), $/, $>] - end; - %% We do not crypt CDATA binary, but we enclose it in XML CDATA - {xmlcdata, CData} -> - ?ESCAPE_BINARY(CData) - end. - -attrs_to_list(Attrs) -> [attr_to_list(A) || A <- Attrs]. - -attr_to_list({Name, Value}) -> - [$\s, Name, $=, $', crypt(Value), $']. - -crypt(S) -> - << <<(case C of - $& -> <<"&">>; - $< -> <<"<">>; - $> -> <<">">>; - $" -> <<""">>; - $' -> <<"'">>; - _ -> <> - end)/binary>> - || <> <= S >>. - -%% --spec(make_text_node/1 :: -( - CData :: binary()) - -> binary() -). - -make_text_node(CData) -> - case cdata_need_escape(CData) of - cdata -> - CDATA1 = <<">, - CDATA2 = <<"]]>">>, - iolist_to_binary([CDATA1, CData, CDATA2]); - none -> CData; - {cdata, EndTokens} -> - EscapedCData = escape_cdata(CData, EndTokens), - iolist_to_binary(EscapedCData) - end. - -cdata_need_escape(CData) -> - cdata_need_escape(CData, 0, false, []). - -cdata_need_escape(<<>>, _, false, _) -> none; -cdata_need_escape(<<>>, _, true, []) -> cdata; -cdata_need_escape(<<>>, _, true, CDataEndTokens) -> - {cdata, lists:reverse(CDataEndTokens)}; -cdata_need_escape(<<$], $], $>, Rest/binary>>, - CurrentPosition, _XMLEscape, CDataEndTokens) -> - NewPosition = CurrentPosition + 3, - cdata_need_escape(Rest, NewPosition, true, - [CurrentPosition + 1 | CDataEndTokens]); -%% Only <, & need to be escaped in XML text node -%% See reference: http://www.w3.org/TR/xml11/#syntax -cdata_need_escape(<<$<, Rest/binary>>, CurrentPosition, - _XMLEscape, CDataEndTokens) -> - cdata_need_escape(Rest, CurrentPosition + 1, true, - CDataEndTokens); -cdata_need_escape(<<$&, Rest/binary>>, CurrentPosition, - _XMLEscape, CDataEndTokens) -> - cdata_need_escape(Rest, CurrentPosition + 1, true, - CDataEndTokens); -cdata_need_escape(<<_:8, Rest/binary>>, CurrentPosition, - XMLEscape, CDataEndTokens) -> - cdata_need_escape(Rest, CurrentPosition + 1, XMLEscape, - CDataEndTokens). - -escape_cdata(CData, EndTokens) -> - escape_cdata(CData, 0, EndTokens, []). - -escape_cdata(<<>>, _CurrentPosition, [], Acc) -> - lists:reverse(Acc); -escape_cdata(Rest, CurrentPosition, [], Acc) -> - CDATA1 = <<">, - CDATA2 = <<"]]>">>, - escape_cdata(<<>>, CurrentPosition, [], - [CDATA2, Rest, CDATA1 | Acc]); -escape_cdata(CData, Index, [Pos | Positions], Acc) -> - CDATA1 = <<">, - CDATA2 = <<"]]>">>, - Split = Pos - Index, - {Part, Rest} = split_binary(CData, Split + 1), - escape_cdata(Rest, Pos + 1, Positions, - [CDATA2, Part, CDATA1 | Acc]). - -%% --spec(remove_cdata_p/1 :: -( - El :: xmlel() | cdata()) - -> boolean() -). - -remove_cdata_p(#xmlel{}) -> true; -remove_cdata_p(_) -> false. - -%% --spec(remove_cdata/1 :: -( - L :: [xmlel() | cdata()]) - -> [xmlel()] -). - -remove_cdata(L) -> [E || E <- L, remove_cdata_p(E)]. - --spec(remove_subtags/3 :: -( - Xmlel :: xmlel(), - Name :: binary(), - Attr :: attr()) - -> Xmlel :: xmlel() -). - -remove_subtags(#xmlel{name = TagName, attrs = TagAttrs, children = Els}, - Name, Attr) -> - #xmlel{name = TagName, attrs = TagAttrs, - children = remove_subtags1(Els, [], Name, Attr)}. - -%% --spec(remove_subtags1/4 :: -( - Els :: [xmlel() | cdata()], - NewEls :: [xmlel()], - Name :: binary(), - Attr :: attr()) - -> NewEls :: [xmlel()] -). - -remove_subtags1([], NewEls, _Name, _Attr) -> - lists:reverse(NewEls); -remove_subtags1([El | Els], NewEls, Name, - {AttrName, AttrValue} = Attr) -> - case El of - #xmlel{name = Name, attrs = Attrs} -> - case get_attr(AttrName, Attrs) of - false -> - remove_subtags1(Els, [El | NewEls], Name, Attr); - {value, AttrValue} -> - remove_subtags1(Els, NewEls, Name, Attr); - _ -> remove_subtags1(Els, [El | NewEls], Name, Attr) - end; - _ -> remove_subtags1(Els, [El | NewEls], Name, Attr) - end. - --spec(get_cdata/1 :: -( - L :: [xmlel() | cdata()]) - -> binary() -). - -get_cdata(L) -> - (iolist_to_binary(get_cdata(L, <<"">>))). - --spec(get_cdata/2 :: -( - L :: [xmlel() | cdata()], - S :: binary() | iolist()) - -> binary() | iolist() -). - -get_cdata([{xmlcdata, CData} | L], S) -> - get_cdata(L, [S, CData]); -get_cdata([_ | L], S) -> get_cdata(L, S); -get_cdata([], S) -> S. - --spec(get_tag_cdata/1 :: -( - Xmlel :: xmlel()) - -> binary() -). - -get_tag_cdata(#xmlel{children = Els}) -> get_cdata(Els). - -%% --spec(get_attr/2 :: -( - AttrName :: binary(), - Attrs :: [attr()]) - -> {value, binary()} - | false -). - -get_attr(AttrName, Attrs) -> - case lists:keysearch(AttrName, 1, Attrs) of - {value, {_, Val}} -> {value, Val}; - _ -> false - end. - -%% --spec(get_attr_s/2 :: -( - AttrName :: binary(), - Attrs :: [attr()]) - -> Val :: binary() -). - -get_attr_s(AttrName, Attrs) -> - case lists:keysearch(AttrName, 1, Attrs) of - {value, {_, Val}} -> Val; - _ -> <<"">> - end. - -%% --spec(get_tag_attr/2 :: -( - AttrName :: binary(), - Xmlel :: xmlel()) - -> {value, binary()} - | false -). - -get_tag_attr(AttrName, #xmlel{attrs = Attrs}) -> - get_attr(AttrName, Attrs). - -%% --spec(get_tag_attr_s/2 :: -( - AttrName :: binary(), - Xmlel :: xmlel()) - -> binary() -). - -get_tag_attr_s(AttrName, #xmlel{attrs = Attrs}) -> - get_attr_s(AttrName, Attrs). - -%% --spec(get_subtag/2 :: -( - Xmlel :: xmlel(), - Name :: binary()) - -> xmlel() | false -). - -get_subtag(#xmlel{children = Els}, Name) -> - get_subtag1(Els, Name). - -%% --spec(get_subtag1/2 :: -( - Els :: [xmlel() | cdata()], - Name :: binary()) - -> xmlel() | false -). - -get_subtag1([El | Els], Name) -> - case El of - #xmlel{name = Name} -> El; - _ -> get_subtag1(Els, Name) - end; -get_subtag1([], _) -> false. - -%% --spec(get_subtag_cdata/2 :: -( - Tag :: xmlel(), - Name :: binary()) - -> binary() -). - -get_subtag_cdata(Tag, Name) -> - case get_subtag(Tag, Name) of - false -> <<"">>; - Subtag -> get_tag_cdata(Subtag) - end. - -%% --spec(append_subtags/2 :: -( - Xmlel :: xmlel(), - SubTags2 :: [xmlel() | cdata()]) - -> Xmlel :: xmlel() -). - -append_subtags(#xmlel{name = Name, attrs = Attrs, children = SubTags1}, SubTags2) -> - #xmlel{name = Name, attrs = Attrs, children = SubTags1 ++ SubTags2}. - -%% --spec(get_path_s/2 :: -( - El :: xmlel(), - Path :: [{elem, Name::binary()} - |{attr, Name::binary()} - |cdata]) - -> xmlel() - | binary() -). - -get_path_s(El, []) -> El; -get_path_s(El, [{elem, Name} | Path]) -> - case get_subtag(El, Name) of - false -> <<"">>; - SubEl -> get_path_s(SubEl, Path) - end; -get_path_s(El, [{attr, Name}]) -> - get_tag_attr_s(Name, El); -get_path_s(El, [cdata]) -> get_tag_cdata(El). - -%% --spec(replace_tag_attr/3 :: -( - Name :: binary(), - Value :: binary(), - Xmlel :: xmlel()) - -> Xmlel :: #xmlel{ - name :: binary(), - attrs :: [attr(),...], - children :: [xmlel() | cdata()] - } -). - -replace_tag_attr(Name, Value, Xmlel) -> - Xmlel#xmlel{ - attrs = [{Name, Value} | lists:keydelete(Name, 1, Xmlel#xmlel.attrs)] - }. - --spec to_xmlel(xmlelement() | xmlel()) -> xmlel(). - -to_xmlel({_, Name, Attrs, Els}) -> - #xmlel{name = iolist_to_binary(Name), - attrs = [{iolist_to_binary(K), iolist_to_binary(V)} - || {K, V} <- Attrs], - children = [to_xmlel(El) || El <- Els]}; -to_xmlel({xmlcdata, CData}) -> - {xmlcdata, iolist_to_binary(CData)}. diff --git a/src/xml_stream.erl b/src/xml_stream.erl deleted file mode 100644 index a743bae86..000000000 --- a/src/xml_stream.erl +++ /dev/null @@ -1,246 +0,0 @@ -%%%---------------------------------------------------------------------- -%%% File : xml_stream.erl -%%% Author : Alexey Shchepin -%%% Purpose : Parse XML streams -%%% Created : 17 Nov 2002 by Alexey Shchepin -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2013 ProcessOne -%%% -%%% 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 -%%% -%%%---------------------------------------------------------------------- - --module(xml_stream). - --author('alexey@process-one.net'). - --export([new/1, new/2, parse/2, close/1, - change_callback_pid/2, parse_element/1]). - --define(XML_START, 0). - --define(XML_END, 1). - --define(XML_CDATA, 2). - --define(XML_ERROR, 3). - --define(PARSE_COMMAND, 0). - --define(PARSE_FINAL_COMMAND, 1). - --record(xml_stream_state, - {callback_pid = self() :: pid(), - port :: port(), - stack = [] :: stack(), - size = 0 :: non_neg_integer(), - maxsize = infinity :: non_neg_integer() | infinity}). - --type xml_stream_el() :: {xmlstreamraw, binary()} | - {xmlstreamcdata, binary()} | - {xmlstreamelement, xmlel()} | - {xmlstreamend, binary()} | - {xmlstreamstart, binary(), [attr()]} | - {xmlstreamerror, binary()}. - --type xml_stream_state() :: #xml_stream_state{}. --type stack() :: [xmlel()]. --type event() :: {?XML_START, {binary(), [attr()]}} | - {?XML_END, binary()} | - {?XML_CDATA, binary()} | - {?XML_ERROR, binary()}. - --export_type([xml_stream_state/0, xml_stream_el/0]). - --include("jlib.hrl"). - -process_data(CallbackPid, Stack, Data) -> - case Data of - {?XML_START, {Name, Attrs}} -> - if - Stack == [] -> - catch gen_fsm:send_event(CallbackPid, - {xmlstreamstart, Name, Attrs}), - %% There is no need to store name or attributes of - %% stream opening element as it is not used - %% anymore. - [xmlstreamstart]; - true -> - [#xmlel{name = Name, attrs = Attrs, children = []} - | Stack] - end; - {?XML_END, EndName} -> - case Stack of - [xmlstreamstart] -> - catch gen_fsm:send_event(CallbackPid, - {xmlstreamend, EndName}), - []; - [#xmlel{name = Name, attrs = Attrs, children = Els}, - xmlstreamstart] -> - NewEl = #xmlel{name = Name, attrs = Attrs, - children = lists:reverse(Els)}, - catch gen_fsm:send_event(CallbackPid, - {xmlstreamelement, NewEl}), - [xmlstreamstart]; - [#xmlel{name = Name, attrs = Attrs, children = Els}, - #xmlel{name = Name1, attrs = Attrs1, children = Els1} - | Tail] -> - NewEl = #xmlel{name = Name, attrs = Attrs, - children = lists:reverse(Els)}, - [{xmlel, Name1, Attrs1, [NewEl | Els1]} | Tail] - end; - {?XML_CDATA, CData} -> - case Stack of - [xmlstreamstart] -> - catch gen_fsm:send_all_state_event(CallbackPid, - {xmlstreamcdata, CData}), - [xmlstreamstart]; - %% Merge CDATA nodes if they are contiguous - %% This does not change the semantic: the split in - %% several CDATA nodes depends on the TCP/IP packet - %% fragmentation - [#xmlel{name = Name, attrs = Attrs, - children = [{xmlcdata, PreviousCData} | Els]} - | Tail] -> - [#xmlel{name = Name, attrs = Attrs, - children = - [{xmlcdata, - iolist_to_binary([PreviousCData, CData])} - | Els]} - | Tail]; - %% No previous CDATA - [#xmlel{name = Name, attrs = Attrs, children = Els} - | Tail] -> - [#xmlel{name = Name, attrs = Attrs, - children = [{xmlcdata, CData} | Els]} - | Tail]; - [] -> [] - end; - {?XML_ERROR, Err} -> - catch gen_fsm:send_event(CallbackPid, - {xmlstreamerror, Err}) - end. - --spec new(pid()) -> xml_stream_state(). - -new(CallbackPid) -> new(CallbackPid, infinity). - --spec new(pid(), non_neg_integer() | infinity) -> xml_stream_state(). - -new(CallbackPid, MaxSize) -> - Port = open_port({spawn, "expat_erl"}, [binary]), - #xml_stream_state{callback_pid = CallbackPid, - port = Port, stack = [], size = 0, maxsize = MaxSize}. - --spec change_callback_pid(xml_stream_state(), pid()) -> xml_stream_state(). - -change_callback_pid(State, CallbackPid) -> - State#xml_stream_state{callback_pid = CallbackPid}. - --spec parse(xml_stream_state(), iodata()) -> xml_stream_state(). - -parse(#xml_stream_state{callback_pid = CallbackPid, - port = Port, stack = Stack, size = Size, - maxsize = MaxSize} = - State, - Str) -> - StrSize = byte_size(Str), - Res = port_control(Port, ?PARSE_COMMAND, Str), - {NewStack, NewSize} = lists:foldl(fun (Data, - {St, Sz}) -> - NewSt = process_data(CallbackPid, - St, Data), - case NewSt of - [_] -> {NewSt, 0}; - _ -> {NewSt, Sz} - end - end, - {Stack, Size + StrSize}, - binary_to_term(Res)), - if NewSize > MaxSize -> - catch gen_fsm:send_event(CallbackPid, - {xmlstreamerror, - <<"XML stanza is too big">>}); - true -> ok - end, - State#xml_stream_state{stack = NewStack, - size = NewSize}. - --spec close(xml_stream_state()) -> true. - -close(#xml_stream_state{port = Port}) -> - port_close(Port). - --spec parse_element(iodata()) -> xmlel() | - {error, parse_error} | - {error, binary()}. - -parse_element(Str) -> - Port = open_port({spawn, "expat_erl"}, [binary]), - Res = port_control(Port, ?PARSE_FINAL_COMMAND, Str), - port_close(Port), - process_element_events(binary_to_term(Res)). - -process_element_events(Events) -> - process_element_events(Events, []). - --spec process_element_events([event()], stack()) -> xmlel() | - {error, parse_error} | - {error, binary()}. - -process_element_events([], _Stack) -> - {error, parse_error}; -process_element_events([Event | Events], Stack) -> - case Event of - {?XML_START, {Name, Attrs}} -> - process_element_events(Events, - [#xmlel{name = Name, attrs = Attrs, - children = []} - | Stack]); - {?XML_END, _EndName} -> - case Stack of - [#xmlel{name = Name, attrs = Attrs, children = Els} - | Tail] -> - NewEl = #xmlel{name = Name, attrs = Attrs, - children = lists:reverse(Els)}, - case Tail of - [] -> - if Events == [] -> NewEl; - true -> {error, parse_error} - end; - [#xmlel{name = Name1, attrs = Attrs1, children = Els1} - | Tail1] -> - process_element_events(Events, - [#xmlel{name = Name1, - attrs = Attrs1, - children = [NewEl | Els1]} - | Tail1]) - end - end; - {?XML_CDATA, CData} -> - case Stack of - [#xmlel{name = Name, attrs = Attrs, children = Els} - | Tail] -> - process_element_events(Events, - [#xmlel{name = Name, attrs = Attrs, - children = - [{xmlcdata, CData} | Els]} - | Tail]); - [] -> process_element_events(Events, []) - end; - {?XML_ERROR, Err} -> {error, Err} - end. From 2ddb7be19afdfe806bcaf7003aacd50ea3a188ce Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 1 May 2013 21:35:57 +1000 Subject: [PATCH 03/53] Replace stand-alone Rebar script with the new one --- rebar | Bin 276843 -> 150274 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rebar b/rebar index cacba57df1ec603b8c9405071301d284c16f9114..68a96bd058d193aea1b1cc5bf08f2d8cfb2476cc 100755 GIT binary patch delta 140864 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

Xl;ZRTZ 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

v5CF0w!}q9gVubHi*q#7O6qQ4o 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

7M*h+zlZUlunzCATO=QSyMhr)V1$ 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 VLo6(-;Dnq|1-#R2-^Y+2=pU9@0nPvb From eda6b80ece163078ab3915c2902d40718981a77e Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 1 May 2013 23:22:26 +1000 Subject: [PATCH 04/53] Use dynamic Rebar configuration --- Makefile.in | 2 +- acinclude.m4 | 350 -------- config.guess | 1533 --------------------------------- config.rebar.in | 16 + config.sub | 1693 ------------------------------------- configure | 1829 +++------------------------------------- configure.ac | 113 ++- rebar.config.in | 30 - rebar.config.script | 69 ++ src/ejabberd_rdbms.erl | 12 +- 10 files changed, 297 insertions(+), 5350 deletions(-) delete mode 100644 acinclude.m4 delete mode 100644 config.guess create mode 100644 config.rebar.in delete mode 100644 config.sub delete mode 100644 rebar.config.in create mode 100644 rebar.config.script diff --git a/Makefile.in b/Makefile.in index 6f6716790..e2de949bf 100644 --- a/Makefile.in +++ b/Makefile.in @@ -99,7 +99,7 @@ clean: distclean: clean rm -f config.status rm -f config.log - rm -f rebar.config + rm -f config.rebar rm -rf deps rm -f Makefile rm -rf rel/files diff --git a/acinclude.m4 b/acinclude.m4 deleted file mode 100644 index 62b40ab2b..000000000 --- a/acinclude.m4 +++ /dev/null @@ -1,350 +0,0 @@ -AC_DEFUN([AM_WITH_EXPAT], -[ AC_ARG_WITH(expat, - [AC_HELP_STRING([--with-expat=PREFIX], [prefix where EXPAT is installed])]) - - EXPAT_CFLAGS= - EXPAT_LIBS= - if test x"$with_expat" != x; then - EXPAT_CFLAGS="-I$with_expat/include" - EXPAT_LIBS="-L$with_expat/lib" - fi - - AC_CHECK_LIB(expat, XML_ParserCreate, - [ EXPAT_LIBS="$EXPAT_LIBS -lexpat" - expat_found=yes ], - [ expat_found=no ], - "$EXPAT_LIBS") - if test $expat_found = no; then - AC_MSG_ERROR([Could not find development files of Expat library]) - fi - expat_save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $EXPAT_CFLAGS" - expat_save_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $EXPAT_CFLAGS" - AC_CHECK_HEADERS(expat.h, , expat_found=no) - if test $expat_found = no; then - AC_MSG_ERROR([Could not find expat.h]) - fi - CFLAGS="$expat_save_CFLAGS" - CPPFLAGS="$expat_save_CPPFLAGS" - - AC_SUBST(EXPAT_CFLAGS) - AC_SUBST(EXPAT_LIBS) -]) - -AC_DEFUN([AM_WITH_ZLIB], -[ AC_ARG_WITH(zlib, - [AC_HELP_STRING([--with-zlib=PREFIX], [prefix where zlib is installed])]) - -if test x"$ejabberd_zlib" != x; then - ZLIB_CFLAGS= - ZLIB_LIBS= - if test x"$with_zlib" != x; then - ZLIB_CFLAGS="-I$with_zlib/include" - ZLIB_LIBS="-L$with_zlib/lib" - fi - - AC_CHECK_LIB(z, gzgets, - [ ZLIB_LIBS="$ZLIB_LIBS -lz" - zlib_found=yes ], - [ zlib_found=no ], - "$ZLIB_LIBS") - if test $zlib_found = no; then - AC_MSG_ERROR([Could not find development files of zlib library. Install them or disable `ejabberd_zlib' with: --disable-ejabberd_zlib]) - fi - zlib_save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $ZLIB_CFLAGS" - zlib_save_CPPFLAGS="$CFLAGS" - CPPFLAGS="$CPPFLAGS $ZLIB_CFLAGS" - AC_CHECK_HEADERS(zlib.h, , zlib_found=no) - if test $zlib_found = no; then - AC_MSG_ERROR([Could not find zlib.h. Install it or disable `ejabberd_zlib' with: --disable-ejabberd_zlib]) - fi - CFLAGS="$zlib_save_CFLAGS" - CPPFLAGS="$zlib_save_CPPFLAGS" - - AC_SUBST(ZLIB_CFLAGS) - AC_SUBST(ZLIB_LIBS) -fi -]) - -AC_DEFUN([AM_WITH_PAM], -[ AC_ARG_WITH(pam, - [AC_HELP_STRING([--with-pam=PREFIX], [prefix where PAM is installed])]) -if test x"$pam" != x; then - PAM_CFLAGS= - PAM_LIBS= - if test x"$with_pam" != x; then - PAM_CFLAGS="-I$with_pam/include" - PAM_LIBS="-L$with_pam/lib" - fi - - AC_CHECK_LIB(pam, pam_start, - [ PAM_LIBS="$PAM_LIBS -lpam" - pam_found=yes ], - [ pam_found=no ], - "$PAM_LIBS") - if test $pam_found = no; then - AC_MSG_ERROR([Could not find development files of PAM library. Install them or disable `pam' with: --disable-pam]) - fi - pam_save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PAM_CFLAGS" - pam_save_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $PAM_CFLAGS" - AC_CHECK_HEADERS(security/pam_appl.h, , pam_found=no) - if test $pam_found = no; then - AC_MSG_ERROR([Could not find security/pam_appl.h. Install it or disable `pam' with: --disable-pam]) - fi - CFLAGS="$pam_save_CFLAGS" - CPPFLAGS="$pam_save_CPPFLAGS" - - AC_SUBST(PAM_CFLAGS) - AC_SUBST(PAM_LIBS) -fi -]) - -AC_DEFUN([AM_WITH_ERLANG], -[ AC_ARG_WITH(erlang, - [AC_HELP_STRING([--with-erlang=PREFIX], [path to erlc and erl])]) - - AC_PATH_TOOL(ERLC, erlc, , $with_erlang:$with_erlang/bin:$PATH) - AC_PATH_TOOL(ERL, erl, , $with_erlang:$with_erlang/bin:$PATH) - - if test "z$ERLC" = "z" || test "z$ERL" = "z"; then - AC_MSG_ERROR([erlang not found]) - fi - - - cat >>conftest.erl <<_EOF - --module(conftest). --author('alexey@sevcom.net'). - --export([[start/0]]). - -start() -> - EIDirS = code:lib_dir("erl_interface") ++ "\n", - EILibS = libpath("erl_interface") ++ "\n", - RootDirS = code:root_dir() ++ "\n", - file:write_file("conftest.out", list_to_binary(EIDirS ++ EILibS ++ ssldef() ++ RootDirS)), - halt(). - -ssldef() -> - OTP = (catch erlang:system_info(otp_release)), - if - OTP >= "R14" -> "-DSSL40\n"; - OTP >= "R12" -> "-DSSL39\n"; - true -> "\n" - end. - -%% return physical architecture based on OS/Processor -archname() -> - ArchStr = erlang:system_info(system_architecture), - case os:type() of - {win32, _} -> "windows"; - {unix,UnixName} -> - Specs = string:tokens(ArchStr,"-"), - Cpu = case lists:nth(2,Specs) of - "pc" -> "x86"; - _ -> hd(Specs) - end, - atom_to_list(UnixName) ++ "-" ++ Cpu; - _ -> "generic" - end. - -%% Return arch-based library path or a default value if this directory -%% does not exist -libpath(App) -> - PrivDir = code:priv_dir(App), - ArchDir = archname(), - LibArchDir = filename:join([[PrivDir,"lib",ArchDir]]), - case file:list_dir(LibArchDir) of - %% Arch lib dir exists: We use it - {ok, _List} -> LibArchDir; - %% Arch lib dir does not exist: Return the default value - %% ({error, enoent}): - _Error -> code:lib_dir("erl_interface") ++ "/lib" - end. - -_EOF - - if ! $ERLC conftest.erl; then - AC_MSG_ERROR([could not compile sample program]) - fi - - if ! $ERL -s conftest -noshell; then - AC_MSG_ERROR([could not run sample program]) - fi - - if ! test -f conftest.out; then - AC_MSG_ERROR([erlang program was not properly executed, (conftest.out was not produced)]) - fi - - # First line - ERLANG_EI_DIR=`cat conftest.out | head -n 1` - # Second line - ERLANG_EI_LIB=`cat conftest.out | head -n 2 | tail -n 1` - # Third line - ERLANG_SSLVER=`cat conftest.out | head -n 3 | tail -n 1` - # End line - ERLANG_DIR=`cat conftest.out | tail -n 1` - - ERLANG_CFLAGS="-I$ERLANG_EI_DIR/include -I$ERLANG_DIR/usr/include" - ERLANG_LIBS="-L$ERLANG_EI_LIB -lerl_interface -lei" - - AC_SUBST(ERLANG_CFLAGS) - AC_SUBST(ERLANG_LIBS) - AC_SUBST(ERLANG_SSLVER) - AC_SUBST(ERLC) - AC_SUBST(ERL) -]) - -AC_DEFUN([AC_MOD_ENABLE], -[ -$1= -make_$1= -AC_MSG_CHECKING([whether build $1]) -AC_ARG_ENABLE($1, - [AC_HELP_STRING([--enable-$1], [enable $1 (default: $2)])], - [mr_enable_$1="$enableval"], - [mr_enable_$1=$2]) -if test "$mr_enable_$1" = "yes"; then -$1=$1 -make_$1=$1/Makefile -fi -AC_MSG_RESULT($mr_enable_$1) -AC_SUBST($1) -AC_SUBST(make_$1) - -]) - - -dnl From Bruno Haible. - -AC_DEFUN([AM_ICONV], -[ - dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and - dnl those with the standalone portable GNU libiconv installed). - AC_ARG_WITH([libiconv-prefix], - [AC_HELP_STRING([--with-libiconv-prefix=PREFIX], [prefix where libiconv is installed])], [ - for dir in `echo "$withval" | tr : ' '`; do - if test -d $dir/include; then CPPFLAGS="$CPPFLAGS -I$dir/include"; fi - if test -d $dir/include; then CFLAGS="$CFLAGS -I$dir/include"; fi - if test -d $dir/lib; then LDFLAGS="$LDFLAGS -L$dir/lib"; fi - done - ]) - - AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ - am_cv_func_iconv="no, consider installing GNU libiconv" - am_cv_lib_iconv=no - AC_TRY_LINK([#include -#include ], - [iconv_t cd = iconv_open("",""); - iconv(cd,NULL,NULL,NULL,NULL); - iconv_close(cd);], - am_cv_func_iconv=yes) - if test "$am_cv_func_iconv" != yes; then - am_save_LIBS="$LIBS" - LIBS="$LIBS -liconv" - AC_TRY_LINK([#include -#include ], - [iconv_t cd = iconv_open("",""); - iconv(cd,NULL,NULL,NULL,NULL); - iconv_close(cd);], - am_cv_lib_iconv=yes - am_cv_func_iconv=yes) - LIBS="$am_save_LIBS" - fi - dnl trying /usr/local - if test "$am_cv_func_iconv" != yes; then - am_save_LIBS="$LIBS" - am_save_CFLAGS="$CFLAGS" - am_save_LDFLAGS="$LDFLAGS" - LIBS="$LIBS -liconv" - LDFLAGS="$LDFLAGS -L/usr/local/lib" - CFLAGS="$CFLAGS -I/usr/local/include" - AC_TRY_LINK([#include -#include ], - [iconv_t cd = iconv_open("",""); - iconv(cd,NULL,NULL,NULL,NULL); - iconv_close(cd);], - am_cv_lib_iconv=yes - am_cv_func_iconv=yes - CPPFLAGS="$CPPFLAGS -I/usr/local/include", - LDFLAGS="$am_save_LDFLAGS" - CFLAGS="$am_save_CFLAGS") - LIBS="$am_save_LIBS" - fi - - ]) - if test "$am_cv_func_iconv" = yes; then - AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) - AC_MSG_CHECKING([for iconv declaration]) - AC_CACHE_VAL(am_cv_proto_iconv, [ - AC_TRY_COMPILE([ -#include -#include -extern -#ifdef __cplusplus -"C" -#endif -#if defined(__STDC__) || defined(__cplusplus) -size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); -#else -size_t iconv(); -#endif -], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") - am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) - am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` - AC_MSG_RESULT([$]{ac_t:- - }[$]am_cv_proto_iconv) - AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, - [Define as const if the declaration of iconv() needs const.]) - fi - LIBICONV= - if test "$am_cv_lib_iconv" = yes; then - LIBICONV="-liconv" - fi - AC_SUBST(LIBICONV) -]) - -dnl -AC_DEFUN([AM_WITH_OPENSSL], -[ AC_ARG_WITH(openssl, - [AC_HELP_STRING([--with-openssl=PREFIX], [prefix where OPENSSL is installed])]) -unset SSL_LIBS; -unset SSL_CFLAGS; -have_openssl=no -if test x"$tls" != x; then - for ssl_prefix in $withval /usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /usr; do - printf "looking for openssl in $ssl_prefix...\n" - SSL_CFLAGS="-I$ssl_prefix/include" - SSL_LIBS="-L$ssl_prefix/lib -lcrypto" - AC_CHECK_LIB(ssl, SSL_new, [ have_openssl=yes ], [ have_openssl=no ], [ $SSL_LIBS $SSL_CFLAGS ]) - if test x"$have_openssl" = xyes; then - save_CPPFLAGS=$CPPFLAGS - CPPFLAGS="-I$ssl_prefix/include $CPPFLAGS" - AC_CHECK_HEADERS(openssl/ssl.h, have_openssl_h=yes) - CPPFLAGS=$save_CPPFLAGS - if test x"$have_openssl_h" = xyes; then - have_openssl=yes - printf "openssl found in $ssl_prefix\n"; - SSL_LIBS="-L$ssl_prefix/lib -lssl -lcrypto" - CPPFLAGS="-I$ssl_prefix/include $CPPFLAGS" - SSL_CFLAGS="-DHAVE_SSL" - break - fi - else - # Clear this from the autoconf cache, so in the next pass of - # this loop with different -L arguments, it will test again. - unset ac_cv_lib_ssl_SSL_new - fi - done -if test x${have_openssl} != xyes; then - AC_MSG_ERROR([Could not find development files of OpenSSL library. Install them or disable `tls' with: --disable-tls]) -fi -AC_SUBST(SSL_LIBS) -AC_SUBST(SSL_CFLAGS) -fi -]) -dnl diff --git a/config.guess b/config.guess deleted file mode 100644 index e3a2116a7..000000000 --- a/config.guess +++ /dev/null @@ -1,1533 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 -# Free Software Foundation, Inc. - -timestamp='2009-06-10' - -# 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 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., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, 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. - - -# Originally written by Per Bothner . -# Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. -# -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. -# -# The plan is that this can be called by configure scripts if you -# don't specify an explicit build system type. - -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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 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 - -# 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 tupples: *-*-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 ;; - *: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'` - exit ;; - 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: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:*:[456]) - 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:*:*) - case ${UNAME_MACHINE} in - pc98) - echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - esac - exit ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; - *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; - i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit ;; - *:Interix*:[3456]*) - case ${UNAME_MACHINE} in - x86) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; - EM64T | authenticamd | genuineintel) - 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-gnu`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/[-(].*//'`-gnu - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - 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-gnu - else - echo ${UNAME_MACHINE}-unknown-linux-gnueabi - fi - exit ;; - avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - cris:Linux:*:*) - echo cris-axis-linux-gnu - exit ;; - crisv32:Linux:*:*) - echo crisv32-axis-linux-gnu - exit ;; - frv:Linux:*:*) - echo frv-unknown-linux-gnu - exit ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - 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 | sed -n ' - /^CPU/{ - s: ::g - p - }'`" - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } - ;; - or32:Linux:*:*) - echo or32-unknown-linux-gnu - exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu - 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="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit ;; - padre:Linux:*:*) - echo sparc-unknown-linux-gnu - 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-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; - esac - exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu - exit ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit ;; - sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu - exit ;; - x86_64:Linux:*:*) - echo x86_64-unknown-linux-gnu - exit ;; - xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - i*86:Linux:*:*) - # The BFD linker knows what the default object file format is, so - # first see if it will tell us. cd to the root directory to prevent - # problems with other programs or directories called `ld' in the path. - # Set LC_ALL=C to ensure ld outputs messages in English. - ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ - | sed -ne '/supported targets:/!d - s/[ ][ ]*/ /g - s/.*supported targets: *// - s/ .*// - p'` - case "$ld_supported_targets" in - elf32-i386) - TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" - ;; - esac - # Determine whether the default compiler is a.out or elf - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - #ifdef __ELF__ - # ifdef __GLIBC__ - # if __GLIBC__ >= 2 - LIBC=gnu - # else - LIBC=gnulibc1 - # endif - # else - LIBC=gnulibc1 - # endif - #else - #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) - LIBC=gnu - #else - LIBC=gnuaout - #endif - #endif - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^LIBC/{ - s: ::g - p - }'`" - test x"${LIBC}" != x && { - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - exit - } - test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; 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 ;; - 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 - case $UNAME_PROCESSOR in - unknown) UNAME_PROCESSOR=powerpc ;; - esac - 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 ;; - 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 ;; -esac - -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - -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: diff --git a/config.rebar.in b/config.rebar.in new file mode 100644 index 000000000..d7557855c --- /dev/null +++ b/config.rebar.in @@ -0,0 +1,16 @@ +%% Macros +{roster_gateway_workaround, @roster_gateway_workaround@}. +{flash_hack, @flash_hack@}. +{transient_supervisors, @transient_supervisors@}. +{full_xml, @full_xml@}. +{nif, @nif@}. +{db_type, @db_type@}. + +%% Dependencies +{mysql, @mysql@}. +{pgsql, @pgsql@}. +{pam, @pam@}. +{zlib, @zlib@}. +{stun, @stun@}. +{riak, @riak@}. +{json, @json@}. diff --git a/config.sub b/config.sub deleted file mode 100644 index eb0389a69..000000000 --- a/config.sub +++ /dev/null @@ -1,1693 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 -# Free Software Foundation, Inc. - -timestamp='2009-06-11' - -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# 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 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., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, 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. - - -# Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. -# -# 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. - -# 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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 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-dietlibc | linux-newlib* | 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/'` - ;; - *) - 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) - 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*) - 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 \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | 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 \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nios | nios2 \ - | ns16k | ns32k \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ - | pyramid \ - | 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 | strongarm \ - | tahoe | thumb | tic4x | tic80 | tron \ - | v850 | v850e \ - | we32k \ - | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12) - # Motorola 68HC11/12. - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - ms1) - basic_machine=mt-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-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ - | 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-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | 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-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nios-* | nios2-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ - | pyramid-* \ - | romp-* | rs6000-* \ - | 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-* | strongarm-* | sv1-* | sx?-* \ - | tahoe-* | thumb-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ - | tron-* \ - | v850-* | v850e-* | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ - | 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 - ;; - 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) - 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'm not sure what "Sysv32" means. Should this be sysv3.2? - 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 - ;; - mingw32) - basic_machine=i386-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 - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - 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 - ;; - 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) basic_machine=powerpc-unknown - ;; - ppc-*) 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-*) 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) - 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 - ;; - 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 - ;; - tic54x | c54x*) - basic_machine=tic54x-unknown - os=-coff - ;; - tic55x | c55x*) - basic_machine=tic55x-unknown - os=-coff - ;; - tic6x | c6x*) - basic_machine=tic6x-unknown - os=-coff - ;; - tile*) - basic_machine=tile-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 - ;; - 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. - -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* | -solaris* | -sym* \ - | -kopensolaris* \ - | -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* \ - | -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* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ - | -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*) - # 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 - ;; - -kaos*) - os=-kaos - ;; - -zvmoe) - os=-zvmoe - ;; - -dicos*) - os=-dicos - ;; - -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 - ;; - # 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 - # This also exists in the configure program, but was not the - # default. - # os=-sunos4 - ;; - 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: diff --git a/configure b/configure index 52268fbb1..1ed777f6e 100755 --- a/configure +++ b/configure @@ -558,72 +558,20 @@ PACKAGE_BUGREPORT='ejabberd@process-one.net' PACKAGE_URL='' ac_default_prefix=/ -# 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='LTLIBOBJS LIBOBJS -target_os -target_vendor -target_cpu -target -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -md2 -EGREP -GREP -CPP -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC INSTALLUSER +json +riak +stun +zlib +pam +pgsql +mysql +db_type nif full_xml transient_supervisors -db_type flash_hack roster_gateway_workaround hipe @@ -683,10 +631,17 @@ enable_option_checking enable_hipe enable_roster_gateway_workaround enable_flash_hack -enable_mssql enable_transient_supervisors enable_full_xml enable_nif +enable_mssql +enable_mysql +enable_pgsql +enable_pam +enable_zlib +enable_stun +enable_riak +enable_json enable_user ' ac_precious_vars='build_alias @@ -694,13 +649,7 @@ host_alias target_alias ERL ERLC -ERLCFLAGS -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CPP' +ERLCFLAGS' # Initialize some variables set by options. @@ -1299,11 +1248,6 @@ Fine tuning of the installation directories: _ACEOF cat <<\_ACEOF - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] - --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi @@ -1323,8 +1267,6 @@ Optional Features: turn on workaround for processing gateway subscriptions (default: no) --enable-flash-hack support Adobe Flash client XML (default: no) - --enable-mssql use Microsoft SQL Server database (default: no, - requires --enable-odbc) --enable-transient_supervisors use Erlang supervision for transient process (default: yes) @@ -1332,6 +1274,16 @@ Optional Features: (default: no, requires XML compliant clients) --enable-nif replace some functions with C equivalents. Requires Erlang R13B04 or higher (default: no) + --enable-mssql use Microsoft SQL Server database (default: no, + requires --enable-odbc) + --enable-mysql enable MySQL support (default: no) + --enable-pgsql enable PostgreSQL support (default: no) + --enable-pam enable PAM support (default: no) + --enable-zlib enable Stream Compression (XEP-0138) using zlib + (default: yes) + --enable-stun enable STUN support (default: no) + --enable-riak enable Riak support (default: no) + --enable-json enable JSON support for mod_bosh (default: no) --enable-user[[[=USER]]] allow this system user to start ejabberd (default: no) @@ -1340,14 +1292,6 @@ Some influential environment variables: ERL Erlang/OTP interpreter command [autodetected] ERLC Erlang/OTP compiler command [autodetected] ERLCFLAGS Erlang/OTP compiler flags [none] - 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 Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -1470,245 +1414,6 @@ fi as_fn_set_status $ac_retval } # ac_fn_erl_try_run - -# 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# 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 "test \"\${$3+set}\"" = set; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; 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;} -( $as_echo "## --------------------------------------- ## -## Report this to ejabberd@process-one.net ## -## --------------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_c_check_header_mongrel - -# 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - -# 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 "test \"\${$3+set}\"" = set; 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_c_check_header_compile cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. @@ -2749,19 +2454,6 @@ fi -# Check whether --enable-mssql was given. -if test "${enable_mssql+set}" = set; then : - enableval=$enable_mssql; case "${enableval}" in - yes) db_type=mssql ;; - no) db_type=generic ;; - *) as_fn_error $? "bad value ${enableval} for --enable-mssql" "$LINENO" 5 ;; -esac -else - db_type=generic -fi - - - # Check whether --enable-transient_supervisors was given. if test "${enable_transient_supervisors+set}" = set; then : enableval=$enable_transient_supervisors; case "${enableval}" in @@ -2801,7 +2493,111 @@ fi -ac_config_files="$ac_config_files Makefile rebar.config src/ejabberd.app.src rel/reltool.config" +# Check whether --enable-mssql was given. +if test "${enable_mssql+set}" = set; then : + enableval=$enable_mssql; case "${enableval}" in + yes) db_type=mssql ;; + no) db_type=generic ;; + *) as_fn_error $? "bad value ${enableval} for --enable-mssql" "$LINENO" 5 ;; +esac +else + db_type=generic +fi + + + +# Check whether --enable-mysql was given. +if test "${enable_mysql+set}" = set; then : + enableval=$enable_mysql; case "${enableval}" in + yes) mysql=true ;; + no) mysql=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-mysql" "$LINENO" 5 ;; +esac +else + mysql=false +fi + + + +# Check whether --enable-pgsql was given. +if test "${enable_pgsql+set}" = set; then : + enableval=$enable_pgsql; case "${enableval}" in + yes) pgsql=true ;; + no) pgsql=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-pgsql" "$LINENO" 5 ;; +esac +else + pgsql=false +fi + + + +# Check whether --enable-pam was given. +if test "${enable_pam+set}" = set; then : + enableval=$enable_pam; case "${enableval}" in + yes) pam=true ;; + no) pam=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-pam" "$LINENO" 5 ;; +esac +else + pam=false +fi + + + +# Check whether --enable-zlib was given. +if test "${enable_zlib+set}" = set; then : + enableval=$enable_zlib; case "${enableval}" in + yes) zlib=true ;; + no) zlib=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-zlib" "$LINENO" 5 ;; +esac +else + zlib=true +fi + + + +# Check whether --enable-stun was given. +if test "${enable_stun+set}" = set; then : + enableval=$enable_stun; case "${enableval}" in + yes) stun=true ;; + no) stun=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-stun" "$LINENO" 5 ;; +esac +else + stun=false +fi + + + +# Check whether --enable-riak was given. +if test "${enable_riak+set}" = set; then : + enableval=$enable_riak; case "${enableval}" in + yes) riak=true ;; + no) riak=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-riak" "$LINENO" 5 ;; +esac +else + riak=false +fi + + + +# Check whether --enable-json was given. +if test "${enable_json+set}" = set; then : + enableval=$enable_json; case "${enableval}" in + yes) json=true ;; + no) json=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-json" "$LINENO" 5 ;; +esac +else + json=false +fi + + + +ac_config_files="$ac_config_files Makefile config.rebar src/ejabberd.app.src rel/reltool.config" ENABLEUSER="" @@ -2820,1365 +2616,6 @@ if test "$ENABLEUSER" != ""; 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 -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 test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_objext+set}" = set; 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 test "${ac_cv_c_compiler_gnu+set}" = set; 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 test "${ac_cv_prog_cc_g+set}" = set; 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 test "${ac_cv_prog_cc_c89+set}" = set; 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 -#include -#include -/* 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 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 test "${ac_cv_prog_CPP+set}" = set; 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 grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if test "${ac_cv_path_GREP+set}" = set; 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" - { test -f "$ac_path_GREP" && $as_test_x "$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 test "${ac_cv_path_EGREP+set}" = set; 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" - { test -f "$ac_path_EGREP" && $as_test_x "$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 ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if test "${ac_cv_header_stdc+set}" = set; 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 - - -ac_fn_c_check_header_mongrel "$LINENO" "openssl/md2.h" "ac_cv_header_openssl_md2_h" "$ac_includes_default" -if test "x$ac_cv_header_openssl_md2_h" = x""yes; then : - md2=true -else - md2=false -fi - - - - -# 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 test "${ac_cv_build+set}" = set; 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 test "${ac_cv_host+set}" = set; 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 - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 -$as_echo_n "checking target system type... " >&6; } -if test "${ac_cv_target+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "x$target_alias" = x; then - ac_cv_target=$ac_cv_host -else - ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 -$as_echo "$ac_cv_target" >&6; } -case $ac_cv_target in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5 ;; -esac -target=$ac_cv_target -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_target -shift -target_cpu=$1 -target_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -target_os=$* -IFS=$ac_save_IFS -case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac - - -# The aliases save the names the user supplied, while $host etc. -# will get canonicalized. -test -n "$target_alias" && - test "$program_prefix$program_suffix$program_transform_name" = \ - NONENONEs,x,x, && - program_prefix=${target_alias}- - -#AC_DEFINE_UNQUOTED(CPU_VENDOR_OS, "$target") -#AC_SUBST(target_os) - - -case "$target_os" in - *darwin10*) - echo "Target OS is 'Darwin10'" - ac_ext=erl -ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' -ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' - - if test "$cross_compiling" = yes; then : - { { $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 test program while cross compiling -See \`config.log' for more details" "$LINENO" 5 ; } -else - cat > conftest.$ac_ext <<_ACEOF --module(conftest). --export([start/0]). - -start() -> - halt(case erlang:system_info(wordsize) of - 8 -> 0; 4 -> 1 end) -. - -_ACEOF -if ac_fn_erl_try_run "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: found 64-bit Erlang" >&5 -$as_echo "$as_me: found 64-bit Erlang" >&6;} - CBIT=-m64 -else - { $as_echo "$as_me:${as_lineno-$LINENO}: found 32-bit Erlang" >&5 -$as_echo "$as_me: found 32-bit Erlang" >&6;} - CBIT=-m32 -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - - ;; - *) - echo "Target OS is '$target_os'" - CBIT="" - ;; -esac -CFLAGS="$CFLAGS $CBIT" -LD_SHARED="$LD_SHARED $CBIT" -echo "CBIT is set to '$CBIT'" - 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 @@ -4886,7 +3323,7 @@ for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "rebar.config") CONFIG_FILES="$CONFIG_FILES rebar.config" ;; + "config.rebar") CONFIG_FILES="$CONFIG_FILES config.rebar" ;; "src/ejabberd.app.src") CONFIG_FILES="$CONFIG_FILES src/ejabberd.app.src" ;; "rel/reltool.config") CONFIG_FILES="$CONFIG_FILES rel/reltool.config" ;; diff --git a/configure.ac b/configure.ac index be1004945..2f2c23691 100644 --- a/configure.ac +++ b/configure.ac @@ -66,15 +66,6 @@ AC_ARG_ENABLE(flash_hack, esac],[flash_hack=false]) AC_SUBST(flash_hack) -AC_ARG_ENABLE(mssql, -[AC_HELP_STRING([--enable-mssql], [use Microsoft SQL Server database (default: no, requires --enable-odbc)])], -[case "${enableval}" in - yes) db_type=mssql ;; - no) db_type=generic ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-mssql) ;; -esac],[db_type=generic]) -AC_SUBST(db_type) - AC_ARG_ENABLE(transient_supervisors, [AC_HELP_STRING([--enable-transient_supervisors], [use Erlang supervision for transient process (default: yes)])], [case "${enableval}" in @@ -102,8 +93,80 @@ AC_ARG_ENABLE(nif, esac],[nif=false]) AC_SUBST(nif) +AC_ARG_ENABLE(mssql, +[AC_HELP_STRING([--enable-mssql], [use Microsoft SQL Server database (default: no, requires --enable-odbc)])], +[case "${enableval}" in + yes) db_type=mssql ;; + no) db_type=generic ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-mssql) ;; +esac],[db_type=generic]) +AC_SUBST(db_type) + +AC_ARG_ENABLE(mysql, +[AC_HELP_STRING([--enable-mysql], [enable MySQL support (default: no)])], +[case "${enableval}" in + yes) mysql=true ;; + no) mysql=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-mysql) ;; +esac],[mysql=false]) +AC_SUBST(mysql) + +AC_ARG_ENABLE(pgsql, +[AC_HELP_STRING([--enable-pgsql], [enable PostgreSQL support (default: no)])], +[case "${enableval}" in + yes) pgsql=true ;; + no) pgsql=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-pgsql) ;; +esac],[pgsql=false]) +AC_SUBST(pgsql) + +AC_ARG_ENABLE(pam, +[AC_HELP_STRING([--enable-pam], [enable PAM support (default: no)])], +[case "${enableval}" in + yes) pam=true ;; + no) pam=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-pam) ;; +esac],[pam=false]) +AC_SUBST(pam) + +AC_ARG_ENABLE(zlib, +[AC_HELP_STRING([--enable-zlib], [enable Stream Compression (XEP-0138) using zlib (default: yes)])], +[case "${enableval}" in + yes) zlib=true ;; + no) zlib=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-zlib) ;; +esac],[zlib=true]) +AC_SUBST(zlib) + +AC_ARG_ENABLE(stun, +[AC_HELP_STRING([--enable-stun], [enable STUN support (default: no)])], +[case "${enableval}" in + yes) stun=true ;; + no) stun=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-stun) ;; +esac],[stun=false]) +AC_SUBST(stun) + +AC_ARG_ENABLE(riak, +[AC_HELP_STRING([--enable-riak], [enable Riak support (default: no)])], +[case "${enableval}" in + yes) riak=true ;; + no) riak=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-riak) ;; +esac],[riak=false]) +AC_SUBST(riak) + +AC_ARG_ENABLE(json, +[AC_HELP_STRING([--enable-json], [enable JSON support for mod_bosh (default: no)])], +[case "${enableval}" in + yes) json=true ;; + no) json=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-json) ;; +esac],[json=false]) +AC_SUBST(json) + AC_CONFIG_FILES([Makefile - rebar.config + config.rebar src/ejabberd.app.src rel/reltool.config]) @@ -121,34 +184,4 @@ if test "$ENABLEUSER" != ""; then AC_SUBST([INSTALLUSER], [$ENABLEUSER]) fi -AC_CHECK_HEADER(openssl/md2.h, md2=true, md2=false) -AC_SUBST(md2) - -AC_CANONICAL_SYSTEM -#AC_DEFINE_UNQUOTED(CPU_VENDOR_OS, "$target") -#AC_SUBST(target_os) - - -case "$target_os" in - *darwin10*) - echo "Target OS is 'Darwin10'" - AC_LANG(Erlang) - AC_RUN_IFELSE( - [AC_LANG_PROGRAM([],[dnl - halt(case erlang:system_info(wordsize) of - 8 -> 0; 4 -> 1 end)])], - [AC_MSG_NOTICE(found 64-bit Erlang) - CBIT=-m64], - [AC_MSG_NOTICE(found 32-bit Erlang) - CBIT=-m32]) - ;; - *) - echo "Target OS is '$target_os'" - CBIT="" - ;; -esac -CFLAGS="$CFLAGS $CBIT" -LD_SHARED="$LD_SHARED $CBIT" -echo "CBIT is set to '$CBIT'" - AC_OUTPUT diff --git a/rebar.config.in b/rebar.config.in deleted file mode 100644 index bf7cbfeb2..000000000 --- a/rebar.config.in +++ /dev/null @@ -1,30 +0,0 @@ -{erl_opts, [debug_info, - {i, "include"}, - {i, "deps/logger/include"}, - {i, "deps/xml/include"}]}. - -%%{src_dirs, [asn1, src, mod_pubsub_ng]}. -{src_dirs, [asn1, src]}. - -{sub_dirs, ["rel"]}. - -{deps, [{mysql, ".*", {git, "git://github.com/processone/mysql"}}, - {pgsql, ".*", {git, "git://github.com/processone/pgsql"}}, - {iconv, ".*", {git, "git://github.com/processone/eiconv"}}, - {epam, ".*", {git, "git://github.com/processone/epam"}}, - {logger, ".*", {git, "git://github.com/processone/p1_logger"}}, - {tls, ".*", {git, "git://github.com/processone/tls"}}, - {ezlib, ".*", {git, "git://github.com/processone/zlib"}}, - {stun, ".*", {git, "git://github.com/processone/stun"}}, - {stringprep, ".*", {git, "git://github.com/processone/stringprep"}}, - {riakc, ".*", {git, "git://github.com/basho/riak-erlang-client"}}, - {jiffy, ".*", {git, "git://github.com/davisp/jiffy"}}, - {ibrowse, ".*", {git, "git://github.com/cmullaparthi/ibrowse"}}, - {lhttpc, ".*", {git, "git://github.com/esl/lhttpc"}}, - %%{xml, ".*", {git, "git://github.com/processone/xml"}}, - {xmlrpc, ".*", {git, "git://github.com/etnt/xmlrpc"}}]}. - -%% Local Variables: -%% mode: erlang -%% End: -%% vim: set filetype=erlang tabstop=8: diff --git a/rebar.config.script b/rebar.config.script new file mode 100644 index 000000000..ddc30934a --- /dev/null +++ b/rebar.config.script @@ -0,0 +1,69 @@ +%%%------------------------------------------------------------------- +%%% @author Evgeniy Khramtsov +%%% @copyright (C) 2013, Evgeniy Khramtsov +%%% @doc +%%% +%%% @end +%%% Created : 1 May 2013 by Evgeniy Khramtsov +%%%------------------------------------------------------------------- +Cfg = case file:consult("config.rebar") of + {ok, Terms} -> + Terms; + {error, _} -> + [] + end, +Macros = lists:flatmap( + fun({roster_gateway_workaround, true}) -> + [{d, 'ROSTER_GATEWAY_WORKAROUND'}]; + ({flash_hack, true}) -> + [{d, 'ENABLE_FLASH_HACK'}]; + ({transient_supervisors, true}) -> + [{d, 'NO_TRANSIENT_SUPERVISORS'}]; + ({full_xml, true}) -> + [{d, 'FULL_XML_SUPPORT'}]; + ({nif, true}) -> + [{d, 'NIF'}]; + ({db_type, mssql}) -> + [{d, 'mssql'}]; + (_) -> + [] + end, Cfg), +Head = [{erl_opts, [debug_info, + {i, "include"}, + {i, "deps/logger/include"}, + {i, "deps/xml/include"} + | Macros]}, + {src_dirs, [asn1, src]}, + {sub_dirs, ["rel"]}], +Deps = [{logger, ".*", {git, "git://github.com/processone/p1_logger"}}, + {tls, ".*", {git, "git://github.com/processone/tls"}}, + {stringprep, ".*", {git, "git://github.com/processone/stringprep"}}, + {ibrowse, ".*", {git, "git://github.com/cmullaparthi/ibrowse"}}, + {lhttpc, ".*", {git, "git://github.com/esl/lhttpc"}}, + {iconv, ".*", {git, "git://github.com/processone/eiconv"}}, + %%{xml, ".*", {git, "git://github.com/processone/xml"}}, + {xmlrpc, ".*", {git, "git://github.com/etnt/xmlrpc"}}], +CfgDeps = lists:flatmap( + fun({mysql, true}) -> + [{mysql, ".*", {git, "git://github.com/processone/mysql"}}]; + ({pgsql, true}) -> + [{pgsql, ".*", {git, "git://github.com/processone/pgsql"}}]; + ({pam, true}) -> + [{epam, ".*", {git, "git://github.com/processone/epam"}}]; + ({zlib, true}) -> + [{ezlib, ".*", {git, "git://github.com/processone/zlib"}}]; + ({stun, true}) -> + [{stun, ".*", {git, "git://github.com/processone/stun"}}]; + ({riak, true}) -> + [{riakc, ".*", {git, "git://github.com/basho/riak-erlang-client"}}]; + ({json, true}) -> + [{jiffy, ".*", {git, "git://github.com/davisp/jiffy"}}]; + (_) -> + [] + end, Cfg), +Head ++ [{deps, Deps ++ CfgDeps}]. + +%% Local Variables: +%% mode: erlang +%% End: +%% vim: set filetype=erlang tabstop=8: diff --git a/src/ejabberd_rdbms.erl b/src/ejabberd_rdbms.erl index be1531853..6e1ce7333 100644 --- a/src/ejabberd_rdbms.erl +++ b/src/ejabberd_rdbms.erl @@ -34,13 +34,11 @@ -include("logger.hrl"). start() -> - case catch ejabberd_odbc_sup:module_info() of - {'EXIT', {undef, _}} -> - ?INFO_MSG("ejabberd has not been compiled with " - "relational database support. Skipping " - "database startup.", - []); - _ -> start_hosts() + case lists:any(fun needs_odbc/1, ?MYHOSTS) of + true -> + start_hosts(); + false -> + ok end. start_hosts() -> From 7bbc98b04cc8ed6c137e4b25d9e90eb99f8ce607 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 1 May 2013 23:35:01 +1000 Subject: [PATCH 05/53] Make iconv dependency optional --- config.rebar.in | 6 ++++++ configure | 16 ++++++++++++++++ configure.ac | 9 +++++++++ rebar.config.script | 3 ++- 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/config.rebar.in b/config.rebar.in index d7557855c..fc3331715 100644 --- a/config.rebar.in +++ b/config.rebar.in @@ -14,3 +14,9 @@ {stun, @stun@}. {riak, @riak@}. {json, @json@}. +{iconv, @iconv@}. + +%% Local Variables: +%% mode: erlang +%% End: +%% vim: set filetype=erlang tabstop=8: diff --git a/configure b/configure index 1ed777f6e..bc24c4b81 100755 --- a/configure +++ b/configure @@ -561,6 +561,7 @@ ac_default_prefix=/ ac_subst_vars='LTLIBOBJS LIBOBJS INSTALLUSER +iconv json riak stun @@ -642,6 +643,7 @@ enable_zlib enable_stun enable_riak enable_json +enable_iconv enable_user ' ac_precious_vars='build_alias @@ -1284,6 +1286,7 @@ Optional Features: --enable-stun enable STUN support (default: no) --enable-riak enable Riak support (default: no) --enable-json enable JSON support for mod_bosh (default: no) + --enable-iconv enable iconv support (default: no) --enable-user[[[=USER]]] allow this system user to start ejabberd (default: no) @@ -2597,6 +2600,19 @@ fi +# Check whether --enable-iconv was given. +if test "${enable_iconv+set}" = set; then : + enableval=$enable_iconv; case "${enableval}" in + yes) iconv=true ;; + no) iconv=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-iconv" "$LINENO" 5 ;; +esac +else + iconv=false +fi + + + ac_config_files="$ac_config_files Makefile config.rebar src/ejabberd.app.src rel/reltool.config" diff --git a/configure.ac b/configure.ac index 2f2c23691..a70b2b924 100644 --- a/configure.ac +++ b/configure.ac @@ -165,6 +165,15 @@ AC_ARG_ENABLE(json, esac],[json=false]) AC_SUBST(json) +AC_ARG_ENABLE(iconv, +[AC_HELP_STRING([--enable-iconv], [enable iconv support (default: no)])], +[case "${enableval}" in + yes) iconv=true ;; + no) iconv=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-iconv) ;; +esac],[iconv=false]) +AC_SUBST(iconv) + AC_CONFIG_FILES([Makefile config.rebar src/ejabberd.app.src diff --git a/rebar.config.script b/rebar.config.script index ddc30934a..4bca701d2 100644 --- a/rebar.config.script +++ b/rebar.config.script @@ -40,7 +40,6 @@ Deps = [{logger, ".*", {git, "git://github.com/processone/p1_logger"}}, {stringprep, ".*", {git, "git://github.com/processone/stringprep"}}, {ibrowse, ".*", {git, "git://github.com/cmullaparthi/ibrowse"}}, {lhttpc, ".*", {git, "git://github.com/esl/lhttpc"}}, - {iconv, ".*", {git, "git://github.com/processone/eiconv"}}, %%{xml, ".*", {git, "git://github.com/processone/xml"}}, {xmlrpc, ".*", {git, "git://github.com/etnt/xmlrpc"}}], CfgDeps = lists:flatmap( @@ -58,6 +57,8 @@ CfgDeps = lists:flatmap( [{riakc, ".*", {git, "git://github.com/basho/riak-erlang-client"}}]; ({json, true}) -> [{jiffy, ".*", {git, "git://github.com/davisp/jiffy"}}]; + ({iconv, true}) -> + [{iconv, ".*", {git, "git://github.com/processone/eiconv"}}]; (_) -> [] end, Cfg), From 5ec65571f8e47dd2d3dfc3c67504ec5e5f58189b Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 1 May 2013 23:36:16 +1000 Subject: [PATCH 06/53] Update README file --- README | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README b/README index bd54491f4..32b68109e 100644 --- a/README +++ b/README @@ -14,8 +14,6 @@ To compile ejabberd you need: - OpenSSL 0.9.8 or higher, for STARTTLS, SASL and SSL encryption. - Zlib 1.2.3 or higher, for Stream Compression support (XEP-0138). Optional. - - Erlang mysql library. Optional. MySQL authentication/storage. - - Erlang pgsql library. Optional. PostgreSQL authentication/storage. - PAM library. Optional. For Pluggable Authentication Modules (PAM). - GNU Iconv 1.8 or higher, for the IRC Transport (mod_irc). Optional. Not needed on systems with GNU Libc. @@ -25,7 +23,7 @@ To compile ejabberd you need: 1. Compile and install on *nix systems -To compile ejabberd, go to the directory src/ and execute the commands: +To compile ejabberd execute the commands: ./configure make From 0eaab78f67f96cb0a33e2447a39ff5664859fc5b Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 2 May 2013 18:15:03 +1000 Subject: [PATCH 07/53] Add --enable-debug compile option --- config.rebar.in | 22 --------- configure | 20 ++++++++- configure.ac | 11 ++++- rebar.config.script => rebar.config.script.in | 45 ++++++++++++++----- 4 files changed, 62 insertions(+), 36 deletions(-) delete mode 100644 config.rebar.in rename rebar.config.script => rebar.config.script.in (74%) diff --git a/config.rebar.in b/config.rebar.in deleted file mode 100644 index fc3331715..000000000 --- a/config.rebar.in +++ /dev/null @@ -1,22 +0,0 @@ -%% Macros -{roster_gateway_workaround, @roster_gateway_workaround@}. -{flash_hack, @flash_hack@}. -{transient_supervisors, @transient_supervisors@}. -{full_xml, @full_xml@}. -{nif, @nif@}. -{db_type, @db_type@}. - -%% Dependencies -{mysql, @mysql@}. -{pgsql, @pgsql@}. -{pam, @pam@}. -{zlib, @zlib@}. -{stun, @stun@}. -{riak, @riak@}. -{json, @json@}. -{iconv, @iconv@}. - -%% Local Variables: -%% mode: erlang -%% End: -%% vim: set filetype=erlang tabstop=8: diff --git a/configure b/configure index bc24c4b81..216784267 100755 --- a/configure +++ b/configure @@ -561,6 +561,7 @@ ac_default_prefix=/ ac_subst_vars='LTLIBOBJS LIBOBJS INSTALLUSER +debug iconv json riak @@ -644,6 +645,7 @@ enable_stun enable_riak enable_json enable_iconv +enable_debug enable_user ' ac_precious_vars='build_alias @@ -1287,6 +1289,7 @@ Optional Features: --enable-riak enable Riak support (default: no) --enable-json enable JSON support for mod_bosh (default: no) --enable-iconv enable iconv support (default: no) + --enable-debug enable debug information (default: yes) --enable-user[[[=USER]]] allow this system user to start ejabberd (default: no) @@ -2613,7 +2616,20 @@ fi -ac_config_files="$ac_config_files Makefile config.rebar src/ejabberd.app.src rel/reltool.config" +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; case "${enableval}" in + yes) debug=true ;; + no) debug=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; +esac +else + debug=true +fi + + + +ac_config_files="$ac_config_files Makefile rebar.config.script src/ejabberd.app.src rel/reltool.config" ENABLEUSER="" @@ -3339,7 +3355,7 @@ for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "config.rebar") CONFIG_FILES="$CONFIG_FILES config.rebar" ;; + "rebar.config.script") CONFIG_FILES="$CONFIG_FILES rebar.config.script" ;; "src/ejabberd.app.src") CONFIG_FILES="$CONFIG_FILES src/ejabberd.app.src" ;; "rel/reltool.config") CONFIG_FILES="$CONFIG_FILES rel/reltool.config" ;; diff --git a/configure.ac b/configure.ac index a70b2b924..e44414e0c 100644 --- a/configure.ac +++ b/configure.ac @@ -174,8 +174,17 @@ AC_ARG_ENABLE(iconv, esac],[iconv=false]) AC_SUBST(iconv) +AC_ARG_ENABLE(debug, +[AC_HELP_STRING([--enable-debug], [enable debug information (default: yes)])], +[case "${enableval}" in + yes) debug=true ;; + no) debug=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; +esac],[debug=true]) +AC_SUBST(debug) + AC_CONFIG_FILES([Makefile - config.rebar + rebar.config.script src/ejabberd.app.src rel/reltool.config]) diff --git a/rebar.config.script b/rebar.config.script.in similarity index 74% rename from rebar.config.script rename to rebar.config.script.in index 4bca701d2..8c83c6b05 100644 --- a/rebar.config.script +++ b/rebar.config.script.in @@ -6,12 +6,25 @@ %%% @end %%% Created : 1 May 2013 by Evgeniy Khramtsov %%%------------------------------------------------------------------- -Cfg = case file:consult("config.rebar") of - {ok, Terms} -> - Terms; - {error, _} -> - [] - end, +Cfg = [%% Macros + {roster_gateway_workaround, @roster_gateway_workaround@}, + {flash_hack, @flash_hack@}, + {transient_supervisors, @transient_supervisors@}, + {full_xml, @full_xml@}, + {nif, @nif@}, + {db_type, @db_type@}, + {debug, @debug@}, + + %% Dependencies + {mysql, @mysql@}, + {pgsql, @pgsql@}, + {pam, @pam@}, + {zlib, @zlib@}, + {stun, @stun@}, + {riak, @riak@}, + {json, @json@}, + {iconv, @iconv@}], + Macros = lists:flatmap( fun({roster_gateway_workaround, true}) -> [{d, 'ROSTER_GATEWAY_WORKAROUND'}]; @@ -28,13 +41,21 @@ Macros = lists:flatmap( (_) -> [] end, Cfg), -Head = [{erl_opts, [debug_info, - {i, "include"}, - {i, "deps/logger/include"}, - {i, "deps/xml/include"} - | Macros]}, + +DebugInfo = case lists:keysearch(debug, 1, Cfg) of + {value, {debug, true}} -> + [debug_info]; + _ -> + [] + end, + +Head = [{erl_opts, [{i, "include"}, + {i, filename:join(["deps", "logger", "include"])}, + {i, filename:join(["deps", "xml", "include"])}] + ++ Macros ++ DebugInfo}, {src_dirs, [asn1, src]}, {sub_dirs, ["rel"]}], + Deps = [{logger, ".*", {git, "git://github.com/processone/p1_logger"}}, {tls, ".*", {git, "git://github.com/processone/tls"}}, {stringprep, ".*", {git, "git://github.com/processone/stringprep"}}, @@ -42,6 +63,7 @@ Deps = [{logger, ".*", {git, "git://github.com/processone/p1_logger"}}, {lhttpc, ".*", {git, "git://github.com/esl/lhttpc"}}, %%{xml, ".*", {git, "git://github.com/processone/xml"}}, {xmlrpc, ".*", {git, "git://github.com/etnt/xmlrpc"}}], + CfgDeps = lists:flatmap( fun({mysql, true}) -> [{mysql, ".*", {git, "git://github.com/processone/mysql"}}]; @@ -62,6 +84,7 @@ CfgDeps = lists:flatmap( (_) -> [] end, Cfg), + Head ++ [{deps, Deps ++ CfgDeps}]. %% Local Variables: From 042172eae1c9e1d2166af8ceb0592806b669b87c Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 2 May 2013 18:17:05 +1000 Subject: [PATCH 08/53] Disable transient_supervisors compile option as it is not needed anymore in the newer Erlang versions --- configure | 2 +- configure.ac | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 216784267..8c4e0301d 100755 --- a/configure +++ b/configure @@ -2468,7 +2468,7 @@ if test "${enable_transient_supervisors+set}" = set; then : *) as_fn_error $? "bad value ${enableval} for --enable-transient_supervisors" "$LINENO" 5 ;; esac else - transient_supervisors=true + transient_supervisors=false fi diff --git a/configure.ac b/configure.ac index e44414e0c..a26afc3d1 100644 --- a/configure.ac +++ b/configure.ac @@ -72,7 +72,7 @@ AC_ARG_ENABLE(transient_supervisors, yes) transient_supervisors=true ;; no) transient_supervisors=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-transient_supervisors) ;; -esac],[transient_supervisors=true]) +esac],[transient_supervisors=false]) AC_SUBST(transient_supervisors) AC_ARG_ENABLE(full_xml, From eda360914e94cd1c6da00dff7eddee994caa2dad Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 2 May 2013 18:29:40 +1000 Subject: [PATCH 09/53] Add --enable-pubsub_ng option --- Makefile.in | 2 +- configure | 16 ++++++++++++++++ configure.ac | 9 +++++++++ rebar.config.script.in | 30 +++++++++++++++++++++++------- 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/Makefile.in b/Makefile.in index e2de949bf..cc29360b2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -99,7 +99,7 @@ clean: distclean: clean rm -f config.status rm -f config.log - rm -f config.rebar + rm -f rebar.config.script rm -rf deps rm -f Makefile rm -rf rel/files diff --git a/configure b/configure index 8c4e0301d..5b54f7f5b 100755 --- a/configure +++ b/configure @@ -561,6 +561,7 @@ ac_default_prefix=/ ac_subst_vars='LTLIBOBJS LIBOBJS INSTALLUSER +pubsub_ng debug iconv json @@ -646,6 +647,7 @@ enable_riak enable_json enable_iconv enable_debug +enable_pubsub_ng enable_user ' ac_precious_vars='build_alias @@ -1290,6 +1292,7 @@ Optional Features: --enable-json enable JSON support for mod_bosh (default: no) --enable-iconv enable iconv support (default: no) --enable-debug enable debug information (default: yes) + --enable-pubsub_ng enable PubSub NG (default: no) --enable-user[[[=USER]]] allow this system user to start ejabberd (default: no) @@ -2629,6 +2632,19 @@ fi +# Check whether --enable-pubsub_ng was given. +if test "${enable_pubsub_ng+set}" = set; then : + enableval=$enable_pubsub_ng; case "${enableval}" in + yes) pubsub_ng=true ;; + no) pubsub_ng=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-pubsub_ng" "$LINENO" 5 ;; +esac +else + pubsub_ng=false +fi + + + ac_config_files="$ac_config_files Makefile rebar.config.script src/ejabberd.app.src rel/reltool.config" diff --git a/configure.ac b/configure.ac index a26afc3d1..db0c85d3f 100644 --- a/configure.ac +++ b/configure.ac @@ -183,6 +183,15 @@ AC_ARG_ENABLE(debug, esac],[debug=true]) AC_SUBST(debug) +AC_ARG_ENABLE(pubsub_ng, +[AC_HELP_STRING([--enable-pubsub_ng], [enable PubSub NG (default: no)])], +[case "${enableval}" in + yes) pubsub_ng=true ;; + no) pubsub_ng=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-pubsub_ng) ;; +esac],[pubsub_ng=false]) +AC_SUBST(pubsub_ng) + AC_CONFIG_FILES([Makefile rebar.config.script src/ejabberd.app.src diff --git a/rebar.config.script.in b/rebar.config.script.in index 8c83c6b05..38779997f 100644 --- a/rebar.config.script.in +++ b/rebar.config.script.in @@ -14,6 +14,8 @@ Cfg = [%% Macros {nif, @nif@}, {db_type, @db_type@}, {debug, @debug@}, + {hipe, @hipe@}, + {pubsub_ng, @pubsub_ng@}, %% Dependencies {mysql, @mysql@}, @@ -49,12 +51,23 @@ DebugInfo = case lists:keysearch(debug, 1, Cfg) of [] end, -Head = [{erl_opts, [{i, "include"}, - {i, filename:join(["deps", "logger", "include"])}, - {i, filename:join(["deps", "xml", "include"])}] - ++ Macros ++ DebugInfo}, - {src_dirs, [asn1, src]}, - {sub_dirs, ["rel"]}], +HiPE = case lists:keysearch(hipe, 1, Cfg) of + {value, {hipe, true}} -> + [native]; + _ -> + [] + end, + +Includes = [{i, "include"}, + {i, filename:join(["deps", "logger", "include"])}, + {i, filename:join(["deps", "xml", "include"])}], + +SrcDirs = lists:foldl( + fun({pubsub_ng, true}, Acc) -> + [mod_pubsub_ng|Acc]; + (_, Acc) -> + Acc + end, [], Cfg), Deps = [{logger, ".*", {git, "git://github.com/processone/p1_logger"}}, {tls, ".*", {git, "git://github.com/processone/tls"}}, @@ -85,7 +98,10 @@ CfgDeps = lists:flatmap( [] end, Cfg), -Head ++ [{deps, Deps ++ CfgDeps}]. +[{erl_opts, Includes ++ Macros ++ HiPE ++ DebugInfo}, + {src_dirs, [asn1, src | SrcDirs]}, + {sub_dirs, ["rel"]}, + {deps, Deps ++ CfgDeps}]. %% Local Variables: %% mode: erlang From 2bb0095a325e9fd0a7bcb529f768515d4cb69581 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 2 May 2013 18:41:51 +1000 Subject: [PATCH 10/53] Add install target (not working so far) --- Makefile.in | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) diff --git a/Makefile.in b/Makefile.in index cc29360b2..819f41f69 100644 --- a/Makefile.in +++ b/Makefile.in @@ -93,6 +93,122 @@ edoc: $(ERL) -noinput +B -eval \ 'case edoc:application(ejabberd, ".", []) of ok -> halt(0); error -> halt(1) end.' +install: all + # + # Configuration files + $(INSTALL) -d -m 750 $(G_USER) $(ETCDIR) + [ -f $(ETCDIR)/ejabberd.cfg ] \ + && $(INSTALL) -b -m 640 $(G_USER) ejabberd.cfg.example $(ETCDIR)/ejabberd.cfg-new \ + || $(INSTALL) -b -m 640 $(G_USER) ejabberd.cfg.example $(ETCDIR)/ejabberd.cfg + $(SED) -e "s*@rootdir@*@prefix@*" \ + -e "s*@installuser@*@INSTALLUSER@*" \ + -e "s*@LIBDIR@*@libdir@*" \ + -e "s*@SYSCONFDIR@*@sysconfdir@*" \ + -e "s*@LOCALSTATEDIR@*@localstatedir@*" \ + -e "s*@DOCDIR@*@docdir@*" \ + -e "s*@erl@*@ERL@*" ejabberdctl.template \ + > ejabberdctl.example + [ -f $(ETCDIR)/ejabberdctl.cfg ] \ + && $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg-new \ + || $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg + $(INSTALL) -b -m 644 $(G_USER) inetrc $(ETCDIR)/inetrc + # + # Administration script + [ -d $(SBINDIR) ] || $(INSTALL) -d -m 755 $(SBINDIR) + $(INSTALL) -m 550 $(G_USER) ejabberdctl.example $(SBINDIR)/ejabberdctl + # + # Init script + $(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*" \ + -e "s*@installuser@*$(INIT_USER)*" ejabberd.init.template \ + > ejabberd.init + chmod 755 ejabberd.init + # + # Binary Erlang files + $(INSTALL) -d $(BEAMDIR) + $(INSTALL) -m 644 *.app $(BEAMDIR) + $(INSTALL) -m 644 *.beam $(BEAMDIR) + rm -f $(BEAMDIR)/configure.beam + # + # ejabberd header files + $(INSTALL) -d $(INCLUDEDIR) + $(INSTALL) -m 644 *.hrl $(INCLUDEDIR) + $(INSTALL) -d $(INCLUDEDIR)/eldap/ + $(INSTALL) -m 644 eldap/*.hrl $(INCLUDEDIR)/eldap/ + $(INSTALL) -d $(INCLUDEDIR)/mod_muc/ + $(INSTALL) -m 644 mod_muc/*.hrl $(INCLUDEDIR)/mod_muc/ + $(INSTALL) -d $(INCLUDEDIR)/mod_proxy65/ + $(INSTALL) -m 644 mod_proxy65/*.hrl $(INCLUDEDIR)/mod_proxy65/ + $(INSTALL) -d $(INCLUDEDIR)/mod_pubsub/ + $(INSTALL) -m 644 mod_pubsub/*.hrl $(INCLUDEDIR)/mod_pubsub/ + $(INSTALL) -d $(INCLUDEDIR)/mod_pubsub_ng/ + $(INSTALL) -m 644 mod_pubsub_ng/*.hrl $(INCLUDEDIR)/mod_pubsub_ng/ + $(INSTALL) -d $(INCLUDEDIR)/web/ + $(INSTALL) -m 644 web/*.hrl $(INCLUDEDIR)/web/ + # + # Binary C programs + $(INSTALL) -d $(PBINDIR) + $(INSTALL) -m 750 $(O_USER) ../tools/captcha.sh $(PBINDIR) + # + # Binary system libraries + $(INSTALL) -d $(SODIR) + $(INSTALL) -m 644 *.so $(SODIR) + # + # Translated strings + $(INSTALL) -d $(MSGSDIR) + $(INSTALL) -m 644 msgs/*.msg $(MSGSDIR) + # + # Spool directory + $(INSTALL) -d -m 750 $(O_USER) $(SPOOLDIR) + $(CHOWN_COMMAND) -R @INSTALLUSER@ $(SPOOLDIR) >$(CHOWN_OUTPUT) + chmod -R 750 $(SPOOLDIR) + [ ! -f $(COOKIEFILE) ] || { $(CHOWN_COMMAND) @INSTALLUSER@ $(COOKIEFILE) >$(CHOWN_OUTPUT) ; chmod 400 $(COOKIEFILE) ; } + # + # ejabberdctl lock directory + $(INSTALL) -d -m 750 $(O_USER) $(CTLLOCKDIR) + $(CHOWN_COMMAND) -R @INSTALLUSER@ $(CTLLOCKDIR) >$(CHOWN_OUTPUT) + chmod -R 750 $(CTLLOCKDIR) + # + # Log directory + $(INSTALL) -d -m 750 $(O_USER) $(LOGDIR) + $(CHOWN_COMMAND) -R @INSTALLUSER@ $(LOGDIR) >$(CHOWN_OUTPUT) + chmod -R 750 $(LOGDIR) + # + # Documentation + $(INSTALL) -d $(DOCDIR) + $(INSTALL) -m 644 ../doc/dev.html $(DOCDIR) + $(INSTALL) -m 644 ../doc/guide.html $(DOCDIR) + $(INSTALL) -m 644 ../doc/*.png $(DOCDIR) + $(INSTALL) -m 644 ../doc/*.txt $(DOCDIR) + [ -f ../doc/guide.pdf ] \ + && $(INSTALL) -m 644 ../doc/guide.pdf $(DOCDIR) \ + || echo "No ../doc/guide.pdf was built" + $(INSTALL) -m 644 ../COPYING $(DOCDIR) + +uninstall: uninstall-binary + +uninstall-binary: + rm -f $(SBINDIR)/ejabberdctl + rm -fr $(DOCDIR) + rm -f $(BEAMDIR)/*.beam + rm -f $(BEAMDIR)/*.app + rm -fr $(BEAMDIR) + rm -f $(INCLUDEDIR)/*.hrl + rm -fr $(INCLUDEDIR) + rm -fr $(PBINDIR) + rm -f $(SODIR)/*.so + rm -fr $(SODIR) + rm -f $(MSGSDIR)/*.msgs + rm -fr $(MSGSDIR) + rm -fr $(PRIVDIR) + rm -fr $(EJABBERDDIR) + +uninstall-all: uninstall-binary + rm -rf $(ETCDIR) + rm -rf $(EJABBERDDIR) + rm -rf $(SPOOLDIR) + rm -rf $(CTLLOCKDIR) + rm -rf $(LOGDIR) + clean: $(REBAR) clean From b9d5a3350d2e6ffba99bc58074606e66a1df4337 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 2 May 2013 19:02:40 +1000 Subject: [PATCH 11/53] Better rebar detection --- Makefile.in | 2 +- configure | 44 ++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 3 +++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 819f41f69..1a65f9db4 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,4 +1,4 @@ -REBAR = rebar +REBAR = @REBAR@ INSTALL = @INSTALL@ SED = @SED@ ERL = @ERL@ diff --git a/configure b/configure index 5b54f7f5b..57c7091be 100755 --- a/configure +++ b/configure @@ -579,6 +579,7 @@ flash_hack roster_gateway_workaround hipe MAKE +REBAR ESCRIPT ERLANG_LIB_DIR ERLANG_ROOT_DIR @@ -2374,6 +2375,49 @@ fi +#locating rebar +# Extract the first word of "rebar", so it can be a program name with args. +set dummy rebar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_REBAR+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $REBAR in + [\\/]* | ?:[\\/]*) + ac_cv_path_REBAR="$REBAR" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_REBAR="$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 + + test -z "$ac_cv_path_REBAR" && ac_cv_path_REBAR="./rebar" + ;; +esac +fi +REBAR=$ac_cv_path_REBAR +if test -n "$REBAR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $REBAR" >&5 +$as_echo "$REBAR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + #locating make # Extract the first word of "make", so it can be a program name with args. set dummy make; ac_word=$2 diff --git a/configure.ac b/configure.ac index db0c85d3f..8fd33c7d5 100644 --- a/configure.ac +++ b/configure.ac @@ -25,6 +25,9 @@ AC_ERLANG_SUBST_LIB_DIR #locating escript AC_PATH_PROG([ESCRIPT], [escript], []) +#locating rebar +AC_PATH_PROG([REBAR], [rebar], [./rebar]) + #locating make AC_CHECK_PROG([MAKE], [make], [make], []) From c801bd941139e1ac6438b15aaaea6f4d3e6ce19f Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 2 May 2013 19:31:59 +1000 Subject: [PATCH 12/53] Do not try to start STUN supervisor --- src/ejabberd_sup.erl | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/ejabberd_sup.erl b/src/ejabberd_sup.erl index 26ea97403..a7acb8d7d 100644 --- a/src/ejabberd_sup.erl +++ b/src/ejabberd_sup.erl @@ -175,14 +175,6 @@ init([]) -> infinity, supervisor, [ejabberd_sm_sup]}, - STUNSupervisor = - {ejabberd_stun_sup, - {ejabberd_tmp_sup, start_link, - [ejabberd_stun_sup, ejabberd_stun]}, - permanent, - infinity, - supervisor, - [ejabberd_tmp_sup]}, CacheTabSupervisor = {cache_tab_sup, {cache_tab_sup, start_link, []}, @@ -208,7 +200,6 @@ init([]) -> HTTPSupervisor, HTTPPollSupervisor, IQSupervisor, - STUNSupervisor, FrontendSocketSupervisor, CacheTabSupervisor, Listener]}}. From 8fc80178b684aba0835a9a5ee0d20d08e2d4c0f0 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 2 May 2013 20:00:04 +1000 Subject: [PATCH 13/53] Fix STUN startup --- src/ejabberd_app.erl | 2 ++ src/ejabberd_listener.erl | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl index 182d55322..b101747e3 100644 --- a/src/ejabberd_app.erl +++ b/src/ejabberd_app.erl @@ -242,6 +242,8 @@ delete_pid_file() -> start_apps() -> application:start(sasl), + application:start(crypto), + application:start(public_key), application:start(ssl), application:start(tls), application:start(xml), diff --git a/src/ejabberd_listener.erl b/src/ejabberd_listener.erl index 292a96dc6..55d607484 100644 --- a/src/ejabberd_listener.erl +++ b/src/ejabberd_listener.erl @@ -594,7 +594,8 @@ check_rate_limit(Interval) -> validate_cfg(L) -> lists:map( - fun({PortIPTransport, Mod, Opts}) when is_atom(Mod), is_list(Opts) -> + fun({PortIPTransport, Mod1, Opts}) when is_atom(Mod1), is_list(Opts) -> + Mod = prepare_mod(Mod1), case PortIPTransport of Port when ?IS_PORT(Port) -> {Port, Mod, Opts}; @@ -619,3 +620,11 @@ prepare_ip(IP) when is_list(IP) -> Addr; prepare_ip(IP) when is_binary(IP) -> prepare_ip(binary_to_list(IP)). + +prepare_mod(ejabberd_stun) -> + prepare_mod(stun); +prepare_mod(stun) -> + application:start(stun), + stun; +prepare_mod(Mod) -> + Mod. From d9e2d4e6a99e6e8ec04cd062f5552ced28b62992 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 2 May 2013 20:17:58 +1000 Subject: [PATCH 14/53] Get rid of useless makefiles --- mod_pubsub_ng/Makefile.in | 62 ------------------------- mod_pubsub_ng/Makefile.win32 | 88 ------------------------------------ 2 files changed, 150 deletions(-) delete mode 100644 mod_pubsub_ng/Makefile.in delete mode 100644 mod_pubsub_ng/Makefile.win32 diff --git a/mod_pubsub_ng/Makefile.in b/mod_pubsub_ng/Makefile.in deleted file mode 100644 index 9a114a1a3..000000000 --- a/mod_pubsub_ng/Makefile.in +++ /dev/null @@ -1,62 +0,0 @@ -CC = @CC@ -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ - -ERLANG_CFLAGS = @ERLANG_CFLAGS@ -ERLANG_LIBS = @ERLANG_LIBS@ - -EFLAGS += -I .. -EFLAGS += -pz .. - -# make debug=true to compile Erlang module with debug informations. -ifdef debug - EFLAGS+=+debug_info -endif - -OUTDIR = .. -ERLBEHAVS = gen_pubsub_node.erl gen_pubsub_nodetree.erl -SOURCES_ALL = $(wildcard *.erl) -SOURCES = $(filter-out $(ERLBEHAVS),$(SOURCES_ALL)) -ERLBEHAVBEAMS = $(addprefix $(OUTDIR)/,$(ERLBEHAVS:.erl=.beam)) -BEAMS = $(addprefix $(OUTDIR)/,$(SOURCES:.erl=.beam)) - - -all: $(ERLBEHAVBEAMS) $(BEAMS) - -$(BEAMS): $(ERLBEHAVBEAMS) - -$(OUTDIR)/%.beam: %.erl - @ERLC@ -W $(EFLAGS) -o $(OUTDIR) $< - -clean: - rm -f $(BEAMS) - -distclean: clean - rm -f Makefile - - - -TAGS: - etags *.erl - - -DEVDOCDIR=../../doc/devdoc -DDTDIR=.. -HTMLS = $(SOURCES:%.erl=../../doc/devdoc/%.html) -ERLHTMLS = $(SOURCES:%.erl=../../doc/devdoc/%.erl.html) -SVGS = $(SOURCES:%.erl=../../doc/devdoc/%.svg) - -devdoc: $(HTMLS) $(ERLHTMLS) $(SVGS) - -$(DEVDOCDIR)/%.erl.html: %.erl - @ERL@ -noshell -pa $(DEVDOCDIR) -run escobar_run file $< $(DDTDIR) -s init stop - -$(DEVDOCDIR)/%.html: %.erl - @ERL@ -noshell -run edoc_run file $< \ - '[{dir,"$(DDTDIR)"},{packages,false},{todo,true},{private,true},{def,{vsn,"$(VSN)"}},{stylesheet,"process-one.css"},{overview,"overview.edoc"}]' -s init stop - -$(DEVDOCDIR)/%.svg: %.erl - @ERL@ -noshell -pa $(DEVDOCDIR) -run funrelg dir $< $(DDTDIR) -s init stop - diff --git a/mod_pubsub_ng/Makefile.win32 b/mod_pubsub_ng/Makefile.win32 deleted file mode 100644 index 6d5707b23..000000000 --- a/mod_pubsub_ng/Makefile.win32 +++ /dev/null @@ -1,88 +0,0 @@ - -include ..\Makefile.inc - -EFLAGS = -I .. -pz .. - -OUTDIR = .. -BEAMS = ..\exmpp_pubsub.beam ..\pubsub_disco.beam ..\mod_pubsub_dev.beam ..\pubsub_hooks.beam ..\mod_pubsub_odbc.beam ..\pubsub_index_dev.beam ..\pubsub_broadcast.beam ..\pubsub_options.beam ..\pubsub_core.beam ..\pubsub_parser.beam ..\pubsub_db.beam ..\xmpp_xdata.beam ..\pubsub_db_mnesia.beam - - -ALL : $(BEAMS) - -CLEAN : - -@erase $(BEAMS) - -$(OUTDIR)\gen_pubsub_node.beam : gen_pubsub_node.erl - erlc -W $(EFLAGS) -o $(OUTDIR) gen_pubsub_node.erl - -$(OUTDIR)\gen_pubsub_nodetree.beam : gen_pubsub_nodetree.erl - erlc -W $(EFLAGS) -o $(OUTDIR) gen_pubsub_nodetree.erl - -$(OUTDIR)\mod_pubsub.beam : mod_pubsub.erl - erlc -W $(EFLAGS) -o $(OUTDIR) mod_pubsub.erl - -$(OUTDIR)\mod_pubsub_odbc.beam : mod_pubsub_odbc.erl - erlc -W $(EFLAGS) -o $(OUTDIR) mod_pubsub_odbc.erl - -$(OUTDIR)\node_buddy.beam : node_buddy.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_buddy.erl - -$(OUTDIR)\node_club.beam : node_club.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_club.erl - -$(OUTDIR)\node_dag.beam : node_dag.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_dag.erl - -$(OUTDIR)\node_dispatch.beam : node_dispatch.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_dispatch.erl - -$(OUTDIR)\node_flat.beam : node_flat.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_flat.erl - -$(OUTDIR)\node_flat_odbc.beam : node_flat_odbc.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_flat_odbc.erl - -$(OUTDIR)\node_hometree.beam : node_hometree.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_hometree.erl - -$(OUTDIR)\node_hometree_odbc.beam : node_hometree_odbc.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_hometree_odbc.erl - -$(OUTDIR)\node_mb.beam : node_mb.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_mb.erl - -$(OUTDIR)\node_pep.beam : node_pep.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_pep.erl - -$(OUTDIR)\node_pep_odbc.beam : node_pep_odbc.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_pep_odbc.erl - -$(OUTDIR)\node_private.beam : node_private.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_private.erl - -$(OUTDIR)\node_public.beam : node_public.erl - erlc -W $(EFLAGS) -o $(OUTDIR) node_public.erl - -$(OUTDIR)\nodetree_dag.beam : nodetree_dag.erl - erlc -W $(EFLAGS) -o $(OUTDIR) nodetree_dag.erl - -$(OUTDIR)\nodetree_tree.beam : nodetree_tree.erl - erlc -W $(EFLAGS) -o $(OUTDIR) nodetree_tree.erl - -$(OUTDIR)\nodetree_tree_odbc.beam : nodetree_tree_odbc.erl - erlc -W $(EFLAGS) -o $(OUTDIR) nodetree_tree_odbc.erl - -$(OUTDIR)\nodetree_virtual.beam : nodetree_virtual.erl - erlc -W $(EFLAGS) -o $(OUTDIR) nodetree_virtual.erl - -$(OUTDIR)\pubsub_db_odbc.beam : pubsub_db_odbc.erl - erlc -W $(EFLAGS) -o $(OUTDIR) pubsub_db_odbc.erl - -$(OUTDIR)\pubsub_index.beam : pubsub_index.erl - erlc -W $(EFLAGS) -o $(OUTDIR) pubsub_index.erl - -$(OUTDIR)\pubsub_subscription.beam : pubsub_subscription.erl - erlc -W $(EFLAGS) -o $(OUTDIR) pubsub_subscription.erl - -$(OUTDIR)\pubsub_subscription_odbc.beam : pubsub_subscription_odbc.erl - erlc -W $(EFLAGS) -o $(OUTDIR) pubsub_subscription_odbc.erl From 60b0b918a62ac3ff86235ef12ec816cd3922b887 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 2 May 2013 20:27:53 +1000 Subject: [PATCH 15/53] Dump the resulting Rebar configuration --- rebar.config.script.in | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/rebar.config.script.in b/rebar.config.script.in index 38779997f..9b8081214 100644 --- a/rebar.config.script.in +++ b/rebar.config.script.in @@ -98,10 +98,12 @@ CfgDeps = lists:flatmap( [] end, Cfg), -[{erl_opts, Includes ++ Macros ++ HiPE ++ DebugInfo}, - {src_dirs, [asn1, src | SrcDirs]}, - {sub_dirs, ["rel"]}, - {deps, Deps ++ CfgDeps}]. +Config = [{erl_opts, Includes ++ Macros ++ HiPE ++ DebugInfo}, + {src_dirs, [asn1, src | SrcDirs]}, + {sub_dirs, ["rel"]}, + {deps, Deps ++ CfgDeps}], +io:format("dynamic configuration:~n ~p~n", [Config]), +Config. %% Local Variables: %% mode: erlang From dc7208ed1cb8ffef70932fa16e9542489d53c23f Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 2 May 2013 20:36:10 +1000 Subject: [PATCH 16/53] Only compile ibrowse and lhttpc when needed --- configure | 17 +++++++++++++++++ configure.ac | 9 +++++++++ rebar.config.script.in | 6 ++++-- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 57c7091be..b8f2e856b 100755 --- a/configure +++ b/configure @@ -561,6 +561,7 @@ ac_default_prefix=/ ac_subst_vars='LTLIBOBJS LIBOBJS INSTALLUSER +http pubsub_ng debug iconv @@ -649,6 +650,7 @@ enable_json enable_iconv enable_debug enable_pubsub_ng +enable_http enable_user ' ac_precious_vars='build_alias @@ -1294,6 +1296,8 @@ Optional Features: --enable-iconv enable iconv support (default: no) --enable-debug enable debug information (default: yes) --enable-pubsub_ng enable PubSub NG (default: no) + --enable-http build external HTTP libraries ('ibrowse' and + 'lhttpc', default: no) --enable-user[[[=USER]]] allow this system user to start ejabberd (default: no) @@ -2689,6 +2693,19 @@ fi +# Check whether --enable-http was given. +if test "${enable_http+set}" = set; then : + enableval=$enable_http; case "${enableval}" in + yes) http=true ;; + no) http=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-http" "$LINENO" 5 ;; +esac +else + http=false +fi + + + ac_config_files="$ac_config_files Makefile rebar.config.script src/ejabberd.app.src rel/reltool.config" diff --git a/configure.ac b/configure.ac index 8fd33c7d5..e164dde8a 100644 --- a/configure.ac +++ b/configure.ac @@ -195,6 +195,15 @@ AC_ARG_ENABLE(pubsub_ng, esac],[pubsub_ng=false]) AC_SUBST(pubsub_ng) +AC_ARG_ENABLE(http, +[AC_HELP_STRING([--enable-http], [build external HTTP libraries ('ibrowse' and 'lhttpc', default: no)])], +[case "${enableval}" in + yes) http=true ;; + no) http=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-http) ;; +esac],[http=false]) +AC_SUBST(http) + AC_CONFIG_FILES([Makefile rebar.config.script src/ejabberd.app.src diff --git a/rebar.config.script.in b/rebar.config.script.in index 9b8081214..f7055275c 100644 --- a/rebar.config.script.in +++ b/rebar.config.script.in @@ -25,6 +25,7 @@ Cfg = [%% Macros {stun, @stun@}, {riak, @riak@}, {json, @json@}, + {http, @http@}, {iconv, @iconv@}], Macros = lists:flatmap( @@ -72,8 +73,6 @@ SrcDirs = lists:foldl( Deps = [{logger, ".*", {git, "git://github.com/processone/p1_logger"}}, {tls, ".*", {git, "git://github.com/processone/tls"}}, {stringprep, ".*", {git, "git://github.com/processone/stringprep"}}, - {ibrowse, ".*", {git, "git://github.com/cmullaparthi/ibrowse"}}, - {lhttpc, ".*", {git, "git://github.com/esl/lhttpc"}}, %%{xml, ".*", {git, "git://github.com/processone/xml"}}, {xmlrpc, ".*", {git, "git://github.com/etnt/xmlrpc"}}], @@ -94,6 +93,9 @@ CfgDeps = lists:flatmap( [{jiffy, ".*", {git, "git://github.com/davisp/jiffy"}}]; ({iconv, true}) -> [{iconv, ".*", {git, "git://github.com/processone/eiconv"}}]; + ({http, true}) -> + [{ibrowse, ".*", {git, "git://github.com/cmullaparthi/ibrowse"}}, + {lhttpc, ".*", {git, "git://github.com/esl/lhttpc"}}]; (_) -> [] end, Cfg), From 8f8b6870a0018a53a43153139a6c912610828324 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 2 May 2013 20:36:45 +1000 Subject: [PATCH 17/53] Fix a typo --- configure | 2 +- configure.ac | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index b8f2e856b..a246c3b84 100755 --- a/configure +++ b/configure @@ -1278,7 +1278,7 @@ Optional Features: --enable-flash-hack support Adobe Flash client XML (default: no) --enable-transient_supervisors use Erlang supervision for transient process - (default: yes) + (default: no) --enable-full-xml use XML features in XMPP stream (ex: CDATA) (default: no, requires XML compliant clients) --enable-nif replace some functions with C equivalents. Requires diff --git a/configure.ac b/configure.ac index e164dde8a..3b6ee27da 100644 --- a/configure.ac +++ b/configure.ac @@ -70,7 +70,7 @@ esac],[flash_hack=false]) AC_SUBST(flash_hack) AC_ARG_ENABLE(transient_supervisors, -[AC_HELP_STRING([--enable-transient_supervisors], [use Erlang supervision for transient process (default: yes)])], +[AC_HELP_STRING([--enable-transient_supervisors], [use Erlang supervision for transient process (default: no)])], [case "${enableval}" in yes) transient_supervisors=true ;; no) transient_supervisors=false ;; From 0168e39bb378826117ab57286e01f0db4051264f Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 2 May 2013 21:04:55 +1000 Subject: [PATCH 18/53] Use xml repo --- rebar.config.script.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rebar.config.script.in b/rebar.config.script.in index f7055275c..b0bda6d1b 100644 --- a/rebar.config.script.in +++ b/rebar.config.script.in @@ -73,7 +73,7 @@ SrcDirs = lists:foldl( Deps = [{logger, ".*", {git, "git://github.com/processone/p1_logger"}}, {tls, ".*", {git, "git://github.com/processone/tls"}}, {stringprep, ".*", {git, "git://github.com/processone/stringprep"}}, - %%{xml, ".*", {git, "git://github.com/processone/xml"}}, + {xml, ".*", {git, "git://github.com/processone/xml"}}, {xmlrpc, ".*", {git, "git://github.com/etnt/xmlrpc"}}], CfgDeps = lists:flatmap( From 4e807d69e8cab4afcd6c78f47cdbfd636df89d62 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 6 May 2013 12:52:26 +0200 Subject: [PATCH 19/53] Fix paths for "install" target --- Makefile.in | 48 +++++++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/Makefile.in b/Makefile.in index 1a65f9db4..979db3277 100644 --- a/Makefile.in +++ b/Makefile.in @@ -93,7 +93,13 @@ edoc: $(ERL) -noinput +B -eval \ 'case edoc:application(ejabberd, ".", []) of ok -> halt(0); error -> halt(1) end.' -install: all +install-deps: + install -d priv/lib/ + @subdirs=`ls -1 deps`; for subdir in $$subdirs; do \ + (cd deps/$$subdir && $(MAKE) install) || exit 1; \ + done + +install: all install-deps # # Configuration files $(INSTALL) -d -m 750 $(G_USER) $(ETCDIR) @@ -125,37 +131,25 @@ install: all # # Binary Erlang files $(INSTALL) -d $(BEAMDIR) - $(INSTALL) -m 644 *.app $(BEAMDIR) - $(INSTALL) -m 644 *.beam $(BEAMDIR) + $(INSTALL) -m 644 ebin/*.app $(BEAMDIR) + $(INSTALL) -m 644 ebin/*.beam $(BEAMDIR) rm -f $(BEAMDIR)/configure.beam # # ejabberd header files $(INSTALL) -d $(INCLUDEDIR) - $(INSTALL) -m 644 *.hrl $(INCLUDEDIR) - $(INSTALL) -d $(INCLUDEDIR)/eldap/ - $(INSTALL) -m 644 eldap/*.hrl $(INCLUDEDIR)/eldap/ - $(INSTALL) -d $(INCLUDEDIR)/mod_muc/ - $(INSTALL) -m 644 mod_muc/*.hrl $(INCLUDEDIR)/mod_muc/ - $(INSTALL) -d $(INCLUDEDIR)/mod_proxy65/ - $(INSTALL) -m 644 mod_proxy65/*.hrl $(INCLUDEDIR)/mod_proxy65/ - $(INSTALL) -d $(INCLUDEDIR)/mod_pubsub/ - $(INSTALL) -m 644 mod_pubsub/*.hrl $(INCLUDEDIR)/mod_pubsub/ - $(INSTALL) -d $(INCLUDEDIR)/mod_pubsub_ng/ - $(INSTALL) -m 644 mod_pubsub_ng/*.hrl $(INCLUDEDIR)/mod_pubsub_ng/ - $(INSTALL) -d $(INCLUDEDIR)/web/ - $(INSTALL) -m 644 web/*.hrl $(INCLUDEDIR)/web/ + $(INSTALL) -m 644 include/*.hrl $(INCLUDEDIR) # # Binary C programs $(INSTALL) -d $(PBINDIR) - $(INSTALL) -m 750 $(O_USER) ../tools/captcha.sh $(PBINDIR) + $(INSTALL) -m 750 $(O_USER) tools/captcha.sh $(PBINDIR) # # Binary system libraries $(INSTALL) -d $(SODIR) - $(INSTALL) -m 644 *.so $(SODIR) + $(INSTALL) -m 644 priv/lib/*.so $(SODIR) # # Translated strings $(INSTALL) -d $(MSGSDIR) - $(INSTALL) -m 644 msgs/*.msg $(MSGSDIR) + $(INSTALL) -m 644 priv/msgs/*.msg $(MSGSDIR) # # Spool directory $(INSTALL) -d -m 750 $(O_USER) $(SPOOLDIR) @@ -175,14 +169,14 @@ install: all # # Documentation $(INSTALL) -d $(DOCDIR) - $(INSTALL) -m 644 ../doc/dev.html $(DOCDIR) - $(INSTALL) -m 644 ../doc/guide.html $(DOCDIR) - $(INSTALL) -m 644 ../doc/*.png $(DOCDIR) - $(INSTALL) -m 644 ../doc/*.txt $(DOCDIR) - [ -f ../doc/guide.pdf ] \ - && $(INSTALL) -m 644 ../doc/guide.pdf $(DOCDIR) \ - || echo "No ../doc/guide.pdf was built" - $(INSTALL) -m 644 ../COPYING $(DOCDIR) + $(INSTALL) -m 644 doc/dev.html $(DOCDIR) + $(INSTALL) -m 644 doc/guide.html $(DOCDIR) + $(INSTALL) -m 644 doc/*.png $(DOCDIR) + $(INSTALL) -m 644 doc/*.txt $(DOCDIR) + [ -f doc/guide.pdf ] \ + && $(INSTALL) -m 644 doc/guide.pdf $(DOCDIR) \ + || echo "No doc/guide.pdf was built" + $(INSTALL) -m 644 COPYING $(DOCDIR) uninstall: uninstall-binary From 0c18dd7068da2c91e131b39732a0561f2e9cd247 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Tue, 7 May 2013 17:23:34 +1000 Subject: [PATCH 20/53] Improve "install" target --- Makefile.in | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Makefile.in b/Makefile.in index 979db3277..dca73220b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -93,13 +93,7 @@ edoc: $(ERL) -noinput +B -eval \ 'case edoc:application(ejabberd, ".", []) of ok -> halt(0); error -> halt(1) end.' -install-deps: - install -d priv/lib/ - @subdirs=`ls -1 deps`; for subdir in $$subdirs; do \ - (cd deps/$$subdir && $(MAKE) install) || exit 1; \ - done - -install: all install-deps +install: all # # Configuration files $(INSTALL) -d -m 750 $(G_USER) $(ETCDIR) @@ -133,11 +127,14 @@ install: all install-deps $(INSTALL) -d $(BEAMDIR) $(INSTALL) -m 644 ebin/*.app $(BEAMDIR) $(INSTALL) -m 644 ebin/*.beam $(BEAMDIR) + $(INSTALL) -m 644 deps/*/ebin/*.app $(BEAMDIR) + $(INSTALL) -m 644 deps/*/ebin/*.beam $(BEAMDIR) rm -f $(BEAMDIR)/configure.beam # # ejabberd header files $(INSTALL) -d $(INCLUDEDIR) $(INSTALL) -m 644 include/*.hrl $(INCLUDEDIR) + $(INSTALL) -m 644 deps/*/include/*.hrl $(INCLUDEDIR) # # Binary C programs $(INSTALL) -d $(PBINDIR) @@ -145,7 +142,8 @@ install: all install-deps # # Binary system libraries $(INSTALL) -d $(SODIR) - $(INSTALL) -m 644 priv/lib/*.so $(SODIR) + #$(INSTALL) -m 644 priv/lib/*.so $(SODIR) + $(INSTALL) -m 644 deps/*/priv/lib/*.so $(SODIR) # # Translated strings $(INSTALL) -d $(MSGSDIR) From cf11acc450de560ed7e0e0c3bb915c0c4b99db92 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Tue, 7 May 2013 17:56:35 +1000 Subject: [PATCH 21/53] Add stub Rebar config --- rebar.config | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 rebar.config diff --git a/rebar.config b/rebar.config new file mode 100644 index 000000000..78d6ef845 --- /dev/null +++ b/rebar.config @@ -0,0 +1,34 @@ +%% !!!!! DO NOT EDIT !!!!! +%% Edit rebar.config.script.in instead + +%% This is a stub config. It's only needed when ejabberd +%% is built as a part of rebar dependencies, +%% i.e. when it is included in another application. + +{erl_opts,[{i,"include"}, + {i,"deps/logger/include"}, + {i,"deps/xml/include"}, + debug_info]}. + +{src_dirs,[asn1,src]}. + +{sub_dirs,["rel"]}. + +{deps,[{logger,".*",{git,"git://github.com/processone/p1_logger"}}, + {tls,".*",{git,"git://github.com/processone/tls"}}, + {stringprep,".*",{git,"git://github.com/processone/stringprep"}}, + {xml,".*",{git,"git://github.com/processone/xml"}}, + {xmlrpc,".*",{git,"git://github.com/etnt/xmlrpc"}}, + {mysql,".*",{git,"git://github.com/processone/mysql"}}, + {pgsql,".*",{git,"git://github.com/processone/pgsql"}}, + {epam,".*",{git,"git://github.com/processone/epam"}}, + {ezlib,".*",{git,"git://github.com/processone/zlib"}}, + {stun,".*",{git,"git://github.com/processone/stun"}}, + {riakc,".*",{git,"git://github.com/basho/riak-erlang-client"}}, + {jiffy,".*",{git,"git://github.com/davisp/jiffy"}}, + {iconv,".*",{git,"git://github.com/processone/eiconv"}}]}. + +%% Local Variables: +%% mode: erlang +%% End: +%% vim: set filetype=erlang tabstop=8: From 50b8500bd53702a9b28a779637e5c67fa4c1047f Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 8 May 2013 13:32:18 +1000 Subject: [PATCH 22/53] Run the corresponding configure scripts by ourselves --- Makefile.in | 4 ++-- rebar.config.script.in | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/Makefile.in b/Makefile.in index dca73220b..6b3a69182 100644 --- a/Makefile.in +++ b/Makefile.in @@ -68,9 +68,9 @@ else INIT_USER=$(INSTALLUSER) endif -all: deps/% src +all: deps src -deps/%: +deps: $(REBAR) get-deps src: diff --git a/rebar.config.script.in b/rebar.config.script.in index b0bda6d1b..2de7efbf7 100644 --- a/rebar.config.script.in +++ b/rebar.config.script.in @@ -35,8 +35,6 @@ Macros = lists:flatmap( [{d, 'ENABLE_FLASH_HACK'}]; ({transient_supervisors, true}) -> [{d, 'NO_TRANSIENT_SUPERVISORS'}]; - ({full_xml, true}) -> - [{d, 'FULL_XML_SUPPORT'}]; ({nif, true}) -> [{d, 'NIF'}]; ({db_type, mssql}) -> @@ -76,6 +74,25 @@ Deps = [{logger, ".*", {git, "git://github.com/processone/p1_logger"}}, {xml, ".*", {git, "git://github.com/processone/xml"}}, {xmlrpc, ".*", {git, "git://github.com/etnt/xmlrpc"}}], +ConfigureCmd = fun(Pkg, Flags) -> + {'get-deps', + "sh -c 'cd deps/" ++ Pkg ++ + " && ./configure" ++ Flags ++ "'"} + end, + +XMLFlags = lists:foldl( + fun({nif, true}, Acc) -> + Acc ++ " --enable-nif"; + ({full_xml, true}, Acc) -> + Acc ++ " --enable-full-xml"; + (_, Acc) -> + Acc + end, "", Cfg), + +PostHooks = [ConfigureCmd("tls", ""), + ConfigureCmd("stringprep", ""), + ConfigureCmd("xml", XMLFlags)], + CfgDeps = lists:flatmap( fun({mysql, true}) -> [{mysql, ".*", {git, "git://github.com/processone/mysql"}}]; @@ -100,11 +117,23 @@ CfgDeps = lists:flatmap( [] end, Cfg), +CfgPostHooks = lists:flatmap( + fun({pam, true}) -> + [ConfigureCmd("epam", "")]; + ({zlib, true}) -> + [ConfigureCmd("ezlib", "")]; + ({iconv, true}) -> + [ConfigureCmd("iconv", "")]; + (_) -> + [] + end, Cfg), + Config = [{erl_opts, Includes ++ Macros ++ HiPE ++ DebugInfo}, {src_dirs, [asn1, src | SrcDirs]}, {sub_dirs, ["rel"]}, + {post_hooks, PostHooks ++ CfgPostHooks}, {deps, Deps ++ CfgDeps}], -io:format("dynamic configuration:~n ~p~n", [Config]), +io:format("ejabberd configuration:~n ~p~n", [Config]), Config. %% Local Variables: From f08595b0e5d923135a5defcf6a8876ca7822ab7a Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 8 May 2013 14:48:52 +1000 Subject: [PATCH 23/53] Get rid of stub rebar.config --- rebar.config | 34 ---------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 rebar.config diff --git a/rebar.config b/rebar.config deleted file mode 100644 index 78d6ef845..000000000 --- a/rebar.config +++ /dev/null @@ -1,34 +0,0 @@ -%% !!!!! DO NOT EDIT !!!!! -%% Edit rebar.config.script.in instead - -%% This is a stub config. It's only needed when ejabberd -%% is built as a part of rebar dependencies, -%% i.e. when it is included in another application. - -{erl_opts,[{i,"include"}, - {i,"deps/logger/include"}, - {i,"deps/xml/include"}, - debug_info]}. - -{src_dirs,[asn1,src]}. - -{sub_dirs,["rel"]}. - -{deps,[{logger,".*",{git,"git://github.com/processone/p1_logger"}}, - {tls,".*",{git,"git://github.com/processone/tls"}}, - {stringprep,".*",{git,"git://github.com/processone/stringprep"}}, - {xml,".*",{git,"git://github.com/processone/xml"}}, - {xmlrpc,".*",{git,"git://github.com/etnt/xmlrpc"}}, - {mysql,".*",{git,"git://github.com/processone/mysql"}}, - {pgsql,".*",{git,"git://github.com/processone/pgsql"}}, - {epam,".*",{git,"git://github.com/processone/epam"}}, - {ezlib,".*",{git,"git://github.com/processone/zlib"}}, - {stun,".*",{git,"git://github.com/processone/stun"}}, - {riakc,".*",{git,"git://github.com/basho/riak-erlang-client"}}, - {jiffy,".*",{git,"git://github.com/davisp/jiffy"}}, - {iconv,".*",{git,"git://github.com/processone/eiconv"}}]}. - -%% Local Variables: -%% mode: erlang -%% End: -%% vim: set filetype=erlang tabstop=8: From 23dd81d18c40b7f785ee001de506914cc038bd9d Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 8 May 2013 15:17:11 +1000 Subject: [PATCH 24/53] Move cache_tab code to deps --- rebar.config.script.in | 1 + src/cache_tab.erl | 610 ----------------------------------------- src/cache_tab_sup.erl | 53 ---- src/ejabberd_app.erl | 3 +- src/ejabberd_sup.erl | 8 - 5 files changed, 3 insertions(+), 672 deletions(-) delete mode 100644 src/cache_tab.erl delete mode 100644 src/cache_tab_sup.erl diff --git a/rebar.config.script.in b/rebar.config.script.in index 2de7efbf7..e4c3ac9a5 100644 --- a/rebar.config.script.in +++ b/rebar.config.script.in @@ -69,6 +69,7 @@ SrcDirs = lists:foldl( end, [], Cfg), Deps = [{logger, ".*", {git, "git://github.com/processone/p1_logger"}}, + {cache_tab, ".*", {git, "git://github.com/processone/cache_tab"}}, {tls, ".*", {git, "git://github.com/processone/tls"}}, {stringprep, ".*", {git, "git://github.com/processone/stringprep"}}, {xml, ".*", {git, "git://github.com/processone/xml"}}, diff --git a/src/cache_tab.erl b/src/cache_tab.erl deleted file mode 100644 index e2d25579c..000000000 --- a/src/cache_tab.erl +++ /dev/null @@ -1,610 +0,0 @@ -%%%------------------------------------------------------------------- -%%% File : cache_tab.erl -%%% Author : Evgeniy Khramtsov -%%% Description : Caching key-value table -%%% -%%% Created : 29 Aug 2010 by Evgeniy Khramtsov -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2013 ProcessOne -%%% -%%% 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 -%%% -%%%------------------------------------------------------------------- --module(cache_tab). - --define(GEN_SERVER, gen_server). - --behaviour(?GEN_SERVER). - -%% API --export([start_link/4, new/2, delete/1, delete/3, lookup/3, - insert/4, info/2, tab2list/1, setopts/2, - dirty_lookup/3, dirty_insert/4, dirty_delete/3, - all/0, test/0]). - -%% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). - --include("ejabberd.hrl"). --include("logger.hrl"). - --record(state, {tab = treap:empty(), - name, - size = 0, - owner, - max_size, - life_time, - warn, - hits = 0, - miss = 0, - procs_num, - cache_missed, - lru, - shrink_size}). - --define(PROCNAME, ?MODULE). --define(CALL_TIMEOUT, 60000). - -%% Defaults --define(MAX_SIZE, 1000). --define(WARN, true). --define(CACHE_MISSED, true). --define(LRU, true). --define(LIFETIME, 600). %% 10 minutes - -%%==================================================================== -%% API -%%==================================================================== -start_link(Proc, Tab, Opts, Owner) -> - ?GEN_SERVER:start_link( - {local, Proc}, ?MODULE, [Tab, Opts, get_proc_num(), Owner], []). - -new(Tab, Opts) -> - Res = lists:flatmap( - fun(Proc) -> - Spec = {{Tab, Proc}, - {?MODULE, start_link, - [Proc, Tab, Opts, self()]}, - permanent, - brutal_kill, - worker, - [?MODULE]}, - case supervisor:start_child(cache_tab_sup, Spec) of - {ok, _Pid} -> - [ok]; - R -> - [R] - end - end, get_all_procs(Tab)), - case lists:filter(fun(ok) -> false; (_) -> true end, Res) of - [] -> - ok; - Err -> - {error, Err} - end. - -delete(Tab) -> - lists:foreach( - fun(Proc) -> - supervisor:terminate_child(cache_tab_sup, {Tab, Proc}), - supervisor:delete_child(cache_tab_sup, {Tab, Proc}) - end, get_all_procs(Tab)). - -delete(Tab, Key, F) -> - ?GEN_SERVER:call( - get_proc_by_hash(Tab, Key), {delete, Key, F}, ?CALL_TIMEOUT). - -dirty_delete(Tab, Key, F) -> - F(), - ?GEN_SERVER:call( - get_proc_by_hash(Tab, Key), {cache_delete, Key}, ?CALL_TIMEOUT). - -lookup(Tab, Key, F) -> - ?GEN_SERVER:call( - get_proc_by_hash(Tab, Key), {lookup, Key, F}, ?CALL_TIMEOUT). - -dirty_lookup(Tab, Key, F) -> - Proc = get_proc_by_hash(Tab, Key), - case ?GEN_SERVER:call(Proc, {cache_lookup, Key}, ?CALL_TIMEOUT) of - {ok, '$cached_mismatch'} -> - error; - {ok, Val} -> - {ok, Val}; - _ -> - {Result, NewVal} = case F() of - {ok, Val} -> - {{ok, Val}, Val}; - _ -> - {error, '$cached_mismatch'} - end, - ?GEN_SERVER:call( - Proc, {cache_insert, Key, NewVal}, ?CALL_TIMEOUT), - Result - end. - -insert(Tab, Key, Val, F) -> - ?GEN_SERVER:call( - get_proc_by_hash(Tab, Key), {insert, Key, Val, F}, ?CALL_TIMEOUT). - -dirty_insert(Tab, Key, Val, F) -> - F(), - ?GEN_SERVER:call( - get_proc_by_hash(Tab, Key), {cache_insert, Key, Val}, ?CALL_TIMEOUT). - -info(Tab, Info) -> - case lists:map( - fun(Proc) -> - ?GEN_SERVER:call(Proc, {info, Info}, ?CALL_TIMEOUT) - end, get_all_procs(Tab)) of - Res when Info == size -> - {ok, lists:sum(Res)}; - Res when Info == all -> - {ok, Res}; - Res when Info == ratio -> - {H, M} = lists:foldl( - fun({Hits, Miss}, {HitsAcc, MissAcc}) -> - {HitsAcc + Hits, MissAcc + Miss} - end, {0, 0}, Res), - {ok, [{hits, H}, {miss, M}]}; - _ -> - {error, badarg} - end. - -setopts(Tab, Opts) -> - lists:foreach( - fun(Proc) -> - ?GEN_SERVER:call(Proc, {setopts, Opts}, ?CALL_TIMEOUT) - end, get_all_procs(Tab)). - -tab2list(Tab) -> - lists:flatmap( - fun(Proc) -> - ?GEN_SERVER:call(Proc, tab2list, ?CALL_TIMEOUT) - end, get_all_procs(Tab)). - -all() -> - lists:usort( - [Tab || {{Tab, _}, _, _, _} <- supervisor:which_children(cache_tab_sup)]). - -%%==================================================================== -%% gen_server callbacks -%%==================================================================== -init([Tab, Opts, N, Pid]) -> - State = #state{procs_num = N, - owner = Pid, - name = Tab}, - {ok, do_setopts(State, Opts)}. - -handle_call({lookup, Key, F}, _From, #state{tab = T} = State) -> - CleanPrio = clean_priority(State#state.life_time), - case treap:lookup(Key, T) of - {ok, Prio, Val} when (State#state.lru == true) or (Prio =< CleanPrio) -> - Hits = State#state.hits, - NewState = treap_update(Key, Val, State#state{hits = Hits + 1}), - case Val of - '$cached_mismatch' -> - {reply, error, NewState}; - _ -> - {reply, {ok, Val}, NewState} - end; - _ -> - case catch F() of - {ok, Val} -> - Miss = State#state.miss, - NewState = treap_insert(Key, Val, State), - {reply, {ok, Val}, NewState#state{miss = Miss + 1}}; - {'EXIT', Reason} -> - print_error(lookup, [Key], Reason, State), - {reply, error, State}; - _ -> - Miss = State#state.miss, - NewState = State#state{miss = Miss + 1}, - if State#state.cache_missed -> - {reply, error, - treap_insert(Key, '$cached_mismatch', NewState)}; - true -> - {reply, error, NewState} - end - end - end; -handle_call({cache_lookup, Key}, _From, #state{tab = T} = State) -> - CleanPrio = clean_priority(State#state.life_time), - case treap:lookup(Key, T) of - {ok, Prio, Val} when (State#state.lru == true) or (Prio =< CleanPrio) -> - Hits = State#state.hits, - NewState = treap_update(Key, Val, State#state{hits = Hits + 1}), - {reply, {ok, Val}, NewState}; - _ -> - Miss = State#state.miss, - NewState = State#state{miss = Miss + 1}, - {reply, error, NewState} - end; -handle_call({insert, Key, Val, F}, _From, #state{tab = T} = State) -> - case treap:lookup(Key, T) of - {ok, _Prio, Val} -> - {reply, ok, treap_update(Key, Val, State)}; - _ -> - case catch F() of - {'EXIT', Reason} -> - print_error(insert, [Key, Val], Reason, State), - {reply, ok, State}; - _ -> - {reply, ok, treap_insert(Key, Val, State)} - end - end; -handle_call({cache_insert, _, '$cached_mismatch'}, _From, - #state{cache_missed = false} = State) -> - {reply, ok, State}; -handle_call({cache_insert, Key, Val}, _From, State) -> - {reply, ok, treap_insert(Key, Val, State)}; -handle_call({delete, Key, F}, _From, State) -> - NewState = treap_delete(Key, State), - case catch F() of - {'EXIT', Reason} -> - print_error(delete, [Key], Reason, State); - _ -> - ok - end, - {reply, ok, NewState}; -handle_call({cache_delete, Key}, _From, State) -> - NewState = treap_delete(Key, State), - {reply, ok, NewState}; -handle_call({info, Info}, _From, State) -> - Res = case Info of - size -> - State#state.size; - ratio -> - {State#state.hits, State#state.miss}; - all -> - [{max_size, State#state.max_size}, - {life_time, State#state.life_time}, - {shrink_size, State#state.shrink_size}, - {size, State#state.size}, - {owner, State#state.owner}, - {hits, State#state.hits}, - {miss, State#state.miss}, - {cache_missed, State#state.cache_missed}, - {lru, State#state.lru}, - {warn, State#state.warn}]; - _ -> - badarg - end, - {reply, Res, State}; -handle_call(tab2list, _From, #state{tab = T} = State) -> - Res = treap:fold( - fun({Key, _, Val}, Acc) -> - [{Key, Val}|Acc] - end, [], T), - {reply, Res, State}; -handle_call({setopts, Opts}, _From, State) -> - {reply, ok, do_setopts(State, Opts)}; -handle_call(_Request, _From, State) -> - Reply = ok, - {reply, Reply, State}. - -handle_cast(_Msg, State) -> - {noreply, State}. - -handle_info(_Info, State) -> - {noreply, State}. - -terminate(_Reason, _State) -> - ok. - -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - -%%-------------------------------------------------------------------- -%%% Internal functions -%%-------------------------------------------------------------------- -do_setopts(#state{procs_num = N} = State, Opts) -> - MaxSize = case {proplists:get_value(max_size, Opts), - State#state.max_size} of - {MS, _} when is_integer(MS), MS > 0 -> - round(MS/N); - {unlimited, _} -> - unlimited; - {_, undefined} -> - round(?MAX_SIZE/N); - {_, MS} -> - MS - end, - LifeTime = case {proplists:get_value(life_time, Opts), - State#state.life_time} of - {LT, _} when is_integer(LT), LT > 0 -> - LT*1000*1000; - {unlimited, _} -> - unlimited; - {_, undefined} -> - ?LIFETIME*1000*1000; - {_, LT} -> - LT - end, - ShrinkSize = case {proplists:get_value(shrink_size, Opts), - State#state.shrink_size} of - {SS, _} when is_integer(SS), SS > 0 -> - round(SS/N); - _ when is_integer(MaxSize) -> - round(MaxSize/2); - _ -> - unlimited - end, - Warn = case {proplists:get_value(warn, Opts), - State#state.warn} of - {true, _} -> - true; - {false, _} -> - false; - {_, undefined} -> - ?WARN; - {_, W} -> - W - end, - CacheMissed = case proplists:get_value( - cache_missed, Opts, State#state.cache_missed) of - false -> - false; - true -> - true; - _ -> - ?CACHE_MISSED - end, - LRU = case proplists:get_value( - lru, Opts, State#state.lru) of - false -> - false; - true -> - true; - _ -> - ?LRU - end, - State#state{max_size = MaxSize, - warn = Warn, - life_time = LifeTime, - cache_missed = CacheMissed, - lru = LRU, - shrink_size = ShrinkSize}. - -get_proc_num() -> - case catch erlang:system_info(logical_processors) of - Num when is_integer(Num) -> - Num; - _ -> - 1 - end. - -get_proc_by_hash(Tab, Term) -> - N = erlang:phash2(Term, get_proc_num()) + 1, - get_proc(Tab, N). - -get_proc(Tab, N) -> - list_to_atom(atom_to_list(?PROCNAME) ++ "_" ++ - atom_to_list(Tab) ++ "_" ++ integer_to_list(N)). - -get_all_procs(Tab) -> - [get_proc(Tab, N) || N <- lists:seq(1, get_proc_num())]. - -now_priority() -> - {MSec, Sec, USec} = now(), - -((MSec*1000000 + Sec)*1000000 + USec). - -clean_priority(LifeTime) -> - if is_integer(LifeTime) -> - now_priority() + LifeTime; - true -> - unlimited - end. - -treap_update(Key, Val, #state{tab = T, lru = LRU} = State) -> - if LRU -> - Priority = now_priority(), - NewT = treap:insert(Key, Priority, Val, T), - State#state{tab = NewT}; - true -> - State - end. - -treap_insert(Key, Val, State) -> - State1 = clean_treap(State), - #state{size = Size} = State2 = shrink_treap(State1), - T = State2#state.tab, - case treap:lookup(Key, T) of - {ok, _, Val} -> - treap_update(Key, Val, State2); - {ok, _, _} -> - NewT = treap:insert(Key, now_priority(), Val, T), - State2#state{tab = NewT}; - _ -> - NewT = treap:insert(Key, now_priority(), Val, T), - State2#state{tab = NewT, size = Size+1} - end. - -treap_delete(Key, #state{tab = T, size = Size} = State) -> - case treap:lookup(Key, T) of - {ok, _, _} -> - NewT = treap:delete(Key, T), - clean_treap(State#state{tab = NewT, size = Size-1}); - _ -> - State - end. - -clean_treap(#state{tab = T, size = Size, life_time = LifeTime} = State) -> - if is_integer(LifeTime) -> - Priority = now_priority(), - {Cleaned, NewT} = clean_treap(T, Priority + LifeTime, 0), - State#state{size = Size - Cleaned, tab = NewT}; - true -> - State - end. - -clean_treap(Treap, CleanPriority, N) -> - case treap:is_empty(Treap) of - true -> - {N, Treap}; - false -> - {_Key, Priority, _Value} = treap:get_root(Treap), - if Priority > CleanPriority -> - clean_treap(treap:delete_root(Treap), CleanPriority, N+1); - true -> - {N, Treap} - end - end. - -shrink_treap(#state{tab = T, - max_size = MaxSize, - shrink_size = ShrinkSize, - warn = Warn, - size = Size} = State) when Size >= MaxSize -> - if Warn -> - ?WARNING_MSG("shrinking table:~n" - "** Table: ~p~n" - "** Processes Number: ~p~n" - "** Max Size: ~p items~n" - "** Shrink Size: ~p items~n" - "** Life Time: ~p microseconds~n" - "** Hits/Miss: ~p/~p~n" - "** Owner: ~p~n" - "** Cache Missed: ~p~n" - "** Instruction: you have to tune cacheing options" - " if this message repeats too frequently", - [State#state.name, State#state.procs_num, - MaxSize, ShrinkSize, State#state.life_time, - State#state.hits, State#state.miss, - State#state.owner, State#state.cache_missed]); - true -> - ok - end, - {Shrinked, NewT} = shrink_treap(T, ShrinkSize, 0), - State#state{tab = NewT, size = Size - Shrinked}; -shrink_treap(State) -> - State. - -shrink_treap(T, ShrinkSize, ShrinkSize) -> - {ShrinkSize, T}; -shrink_treap(T, ShrinkSize, N) -> - case treap:is_empty(T) of - true -> - {N, T}; - false -> - shrink_treap(treap:delete_root(T), ShrinkSize, N+1) - end. - -print_error(Operation, Args, Reason, State) -> - ?ERROR_MSG("callback failed:~n" - "** Tab: ~p~n" - "** Owner: ~p~n" - "** Operation: ~p~n" - "** Args: ~p~n" - "** Reason: ~p", - [State#state.name, State#state.owner, - Operation, Args, Reason]). - -%%-------------------------------------------------------------------- -%%% Tests -%%-------------------------------------------------------------------- --define(lookup, dirty_lookup). --define(delete, dirty_delete). --define(insert, dirty_insert). -%%-define(lookup, lookup). -%%-define(delete, delete). -%%-define(insert, insert). - -test() -> - LifeTime = 2, - ok = new(test_tbl, [{life_time, LifeTime}, {max_size, unlimited}]), - check([]), - ok = ?insert(test_tbl, "key", "value", fun() -> ok end), - check([{"key", "value"}]), - {ok, "value"} = ?lookup(test_tbl, "key", fun() -> error end), - check([{"key", "value"}]), - io:format("** waiting for ~p seconds to check if LRU works fine...~n", - [LifeTime+1]), - timer:sleep(timer:seconds(LifeTime+1)), - ok = ?insert(test_tbl, "key1", "value1", fun() -> ok end), - check([{"key1", "value1"}]), - ok = ?delete(test_tbl, "key1", fun() -> ok end), - {ok, "value"} = ?lookup(test_tbl, "key", fun() -> {ok, "value"} end), - check([{"key", "value"}]), - ok = ?delete(test_tbl, "key", fun() -> ok end), - check([]), - %% io:format("** testing buggy callbacks...~n"), - %% delete(test_tbl, "key", fun() -> erlang:error(badarg) end), - %% insert(test_tbl, "key", "val", fun() -> erlang:error(badarg) end), - %% lookup(test_tbl, "key", fun() -> erlang:error(badarg) end), - check([]), - delete(test_tbl), - test1(). - -test1() -> - MaxSize = 10, - ok = new(test_tbl, [{max_size, MaxSize}, {shrink_size, 1}, {warn, false}]), - lists:foreach( - fun(N) -> - ok = ?insert(test_tbl, N, N, fun() -> ok end) - end, lists:seq(1, MaxSize*get_proc_num())), - {ok, MaxSize} = info(test_tbl, size), - delete(test_tbl), - test2(). - -test2() -> - LifeTime = 2, - ok = new(test_tbl, [{life_time, LifeTime}, - {max_size, unlimited}, - {lru, false}]), - check([]), - ok = ?insert(test_tbl, "key", "value", fun() -> ok end), - {ok, "value"} = ?lookup(test_tbl, "key", fun() -> error end), - check([{"key", "value"}]), - io:format("** waiting for ~p seconds to check if non-LRU works fine...~n", - [LifeTime+1]), - timer:sleep(timer:seconds(LifeTime+1)), - error = ?lookup(test_tbl, "key", fun() -> error end), - check([{"key", '$cached_mismatch'}]), - ok = ?insert(test_tbl, "key", "value1", fun() -> ok end), - check([{"key", "value1"}]), - delete(test_tbl), - io:format("** testing speed, this may take a while...~n"), - test3(1000), - test3(10000), - test3(100000), - test3(1000000). - -test3(Iter) -> - ok = new(test_tbl, [{max_size, unlimited}, {life_time, unlimited}]), - L = lists:seq(1, Iter), - T1 = now(), - lists:foreach( - fun(N) -> - ok = ?insert(test_tbl, N, N, fun() -> ok end) - end, L), - io:format("** average insert (size = ~p): ~p usec~n", - [Iter, round(timer:now_diff(now(), T1)/Iter)]), - T2 = now(), - lists:foreach( - fun(N) -> - {ok, N} = ?lookup(test_tbl, N, fun() -> ok end) - end, L), - io:format("** average lookup (size = ~p): ~p usec~n", - [Iter, round(timer:now_diff(now(), T2)/Iter)]), - {ok, Iter} = info(test_tbl, size), - delete(test_tbl). - -check(List) -> - Size = length(List), - {ok, Size} = info(test_tbl, size), - List = tab2list(test_tbl). diff --git a/src/cache_tab_sup.erl b/src/cache_tab_sup.erl deleted file mode 100644 index 5b016f681..000000000 --- a/src/cache_tab_sup.erl +++ /dev/null @@ -1,53 +0,0 @@ -%%%------------------------------------------------------------------- -%%% File : cache_tab_sup.erl -%%% Author : Evgeniy Khramtsov -%%% Description : Cache tables supervisor -%%% -%%% Created : 30 Aug 2010 by Evgeniy Khramtsov -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2013 ProcessOne -%%% -%%% 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 -%%% -%%%------------------------------------------------------------------- --module(cache_tab_sup). - --behaviour(supervisor). - -%% API --export([start_link/0]). - -%% Supervisor callbacks --export([init/1]). - --define(SERVER, ?MODULE). - -%%==================================================================== -%% API functions -%%==================================================================== -start_link() -> - supervisor:start_link({local, ?SERVER}, ?MODULE, []). - -%%==================================================================== -%% Supervisor callbacks -%%==================================================================== -init([]) -> - {ok, {{one_for_one,10,1}, []}}. - -%%==================================================================== -%% Internal functions -%%==================================================================== diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl index b101747e3..f897a4385 100644 --- a/src/ejabberd_app.erl +++ b/src/ejabberd_app.erl @@ -248,4 +248,5 @@ start_apps() -> application:start(tls), application:start(xml), application:start(stringprep), - application:start(ezlib). + application:start(ezlib), + application:start(cache_tab). diff --git a/src/ejabberd_sup.erl b/src/ejabberd_sup.erl index a7acb8d7d..5b85f1f33 100644 --- a/src/ejabberd_sup.erl +++ b/src/ejabberd_sup.erl @@ -175,13 +175,6 @@ init([]) -> infinity, supervisor, [ejabberd_sm_sup]}, - CacheTabSupervisor = - {cache_tab_sup, - {cache_tab_sup, start_link, []}, - permanent, - infinity, - supervisor, - [cache_tab_sup]}, {ok, {{one_for_one, 10, 1}, [Hooks, SystemMonitor, @@ -201,7 +194,6 @@ init([]) -> HTTPPollSupervisor, IQSupervisor, FrontendSocketSupervisor, - CacheTabSupervisor, Listener]}}. From 476acbfa440b15687977c2cba9633b6749912dea Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 8 May 2013 19:27:25 +1000 Subject: [PATCH 25/53] Move configure variables to a separate file --- Makefile.in | 19 ++-- config.vars.in | 39 ++++++++ configure | 5 +- configure.ac | 5 +- rebar.config.script.in => rebar.config.script | 27 ++---- rel/reltool.config.in | 47 ---------- rel/reltool.config.script | 92 +++++++++++++++++++ 7 files changed, 152 insertions(+), 82 deletions(-) create mode 100644 config.vars.in rename rebar.config.script.in => rebar.config.script (88%) delete mode 100644 rel/reltool.config.in create mode 100644 rel/reltool.config.script diff --git a/Makefile.in b/Makefile.in index 6b3a69182..ae11cb5ea 100644 --- a/Makefile.in +++ b/Makefile.in @@ -204,20 +204,23 @@ uninstall-all: uninstall-binary clean: $(REBAR) clean -distclean: clean - rm -f config.status - rm -f config.log - rm -f rebar.config.script - rm -rf deps - rm -f Makefile +clean-rel: rm -rf rel/files rm -rf rel/ejabberd rm -f rel/reltool.config + +distclean: clean clean-rel + rm -f config.status + rm -f config.log + rm -rf deps + rm -rf ebin + rm -f Makefile + rm -f config.vars rm -f src/ejabberd.app.src [ ! -f ../ChangeLog ] || rm -f ../ChangeLog -rel: - mkdir -p rel ; cd rel ; rm -rf files ejabberd ; \ +rel: clean-rel + cd rel ; \ $(REBAR) create-node nodeid=ejabberd || exit 1; \ $(REBAR) generate diff --git a/config.vars.in b/config.vars.in new file mode 100644 index 000000000..f8a33940c --- /dev/null +++ b/config.vars.in @@ -0,0 +1,39 @@ +%%%------------------------------------------------------------------- +%%% @author Evgeniy Khramtsov +%%% @copyright (C) 2013, Evgeniy Khramtsov +%%% @doc +%%% +%%% @end +%%% Created : 8 May 2013 by Evgeniy Khramtsov +%%%------------------------------------------------------------------- +%% Macros +{roster_gateway_workaround, @roster_gateway_workaround@}. +{flash_hack, @flash_hack@}. +{transient_supervisors, @transient_supervisors@}. +{full_xml, @full_xml@}. +{nif, @nif@}. +{db_type, @db_type@}. +{debug, @debug@}. +{hipe, @hipe@}. + +%% Ad-hoc directories with source files +{pubsub_ng, @pubsub_ng@}. + +%% Dependencies +{mysql, @mysql@}. +{pgsql, @pgsql@}. +{pam, @pam@}. +{zlib, @zlib@}. +{stun, @stun@}. +{riak, @riak@}. +{json, @json@}. +{http, @http@}. +{iconv, @iconv@}. + +%% Version +{vsn, "@PACKAGE_VERSION@"}. + +%% Local Variables: +%% mode: erlang +%% End: +%% vim: set filetype=erlang tabstop=8: diff --git a/configure b/configure index a246c3b84..4ad4b78db 100755 --- a/configure +++ b/configure @@ -2706,7 +2706,7 @@ fi -ac_config_files="$ac_config_files Makefile rebar.config.script src/ejabberd.app.src rel/reltool.config" +ac_config_files="$ac_config_files Makefile config.vars src/ejabberd.app.src" ENABLEUSER="" @@ -3432,9 +3432,8 @@ for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "rebar.config.script") CONFIG_FILES="$CONFIG_FILES rebar.config.script" ;; + "config.vars") CONFIG_FILES="$CONFIG_FILES config.vars" ;; "src/ejabberd.app.src") CONFIG_FILES="$CONFIG_FILES src/ejabberd.app.src" ;; - "rel/reltool.config") CONFIG_FILES="$CONFIG_FILES rel/reltool.config" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; esac diff --git a/configure.ac b/configure.ac index 3b6ee27da..05180bb77 100644 --- a/configure.ac +++ b/configure.ac @@ -205,9 +205,8 @@ esac],[http=false]) AC_SUBST(http) AC_CONFIG_FILES([Makefile - rebar.config.script - src/ejabberd.app.src - rel/reltool.config]) + config.vars + src/ejabberd.app.src]) ENABLEUSER="" AC_ARG_ENABLE(user, diff --git a/rebar.config.script.in b/rebar.config.script similarity index 88% rename from rebar.config.script.in rename to rebar.config.script index e4c3ac9a5..e003667d5 100644 --- a/rebar.config.script.in +++ b/rebar.config.script @@ -6,27 +6,12 @@ %%% @end %%% Created : 1 May 2013 by Evgeniy Khramtsov %%%------------------------------------------------------------------- -Cfg = [%% Macros - {roster_gateway_workaround, @roster_gateway_workaround@}, - {flash_hack, @flash_hack@}, - {transient_supervisors, @transient_supervisors@}, - {full_xml, @full_xml@}, - {nif, @nif@}, - {db_type, @db_type@}, - {debug, @debug@}, - {hipe, @hipe@}, - {pubsub_ng, @pubsub_ng@}, - - %% Dependencies - {mysql, @mysql@}, - {pgsql, @pgsql@}, - {pam, @pam@}, - {zlib, @zlib@}, - {stun, @stun@}, - {riak, @riak@}, - {json, @json@}, - {http, @http@}, - {iconv, @iconv@}], +Cfg = case file:consult("config.vars") of + {ok, Terms} -> + Terms; + _Err -> + [] + end, Macros = lists:flatmap( fun({roster_gateway_workaround, true}) -> diff --git a/rel/reltool.config.in b/rel/reltool.config.in deleted file mode 100644 index b058b92bd..000000000 --- a/rel/reltool.config.in +++ /dev/null @@ -1,47 +0,0 @@ -{sys, [ - {lib_dirs, []}, - {erts, [{mod_cond, derived}, {app_file, strip}]}, - {app_file, strip}, - {rel, "@PACKAGE_NAME@", "@PACKAGE_VERSION@", - [ - kernel, - stdlib, - sasl, - ejabberd - ]}, - {rel, "start_clean", "", - [ - kernel, - stdlib - ]}, - {boot_rel, "ejabberd"}, - {profile, embedded}, - {incl_cond, exclude}, - {excl_archive_filters, [".*"]}, %% Do not archive built libs - {excl_sys_filters, ["^bin/.*", "^erts.*/bin/(dialyzer|typer)", - "^erts.*/(doc|info|include|lib|man|src)"]}, - {excl_app_filters, ["\.gitignore"]}, - {app, sasl, [{incl_cond, include}]}, - {app, stdlib, [{incl_cond, include}]}, - {app, kernel, [{incl_cond, include}]}, - {app, ejabberd, [{incl_cond, include}, {lib_dir, ".."}]} - ]}. - -{target_dir, "ejabberd"}. - -{overlay, [ - {mkdir, "log/sasl"}, - {copy, "files/erl", "\{\{erts_vsn\}\}/bin/erl"}, - {copy, "files/nodetool", "\{\{erts_vsn\}\}/bin/nodetool"}, - {copy, "files/ejabberd", "bin/ejabberd"}, - {copy, "files/ejabberd.cmd", "bin/ejabberd.cmd"}, - {copy, "files/start_erl.cmd", "bin/start_erl.cmd"}, - {copy, "files/install_upgrade.escript", "bin/install_upgrade.escript"}, - {copy, "files/sys.config", "releases/\{\{rel_vsn\}\}/sys.config"}, - {copy, "files/vm.args", "releases/\{\{rel_vsn\}\}/vm.args"} - ]}. - -%%% Local Variables: -%%% mode: erlang -%%% End: -%%% vim: set filetype=erlang tabstop=8 foldmarker=%%%',%%%. foldmethod=marker: diff --git a/rel/reltool.config.script b/rel/reltool.config.script new file mode 100644 index 000000000..62b2b1f52 --- /dev/null +++ b/rel/reltool.config.script @@ -0,0 +1,92 @@ +%%%------------------------------------------------------------------- +%%% @author Evgeniy Khramtsov +%%% @copyright (C) 2013, Evgeniy Khramtsov +%%% @doc +%%% +%%% @end +%%% Created : 8 May 2013 by Evgeniy Khramtsov +%%%------------------------------------------------------------------- +Vars = case file:consult(filename:join(["..", "config.vars"])) of + {ok, Terms} -> + Terms; + _Err -> + [] + end, + +OTPApps = [sasl, crypto, public_key, ssl, + mnesia, inets, odbc, tools], + +DepRequiredApps = [logger, cache_tab, tls, stringprep, xml, xmlrpc], + +DepConfiguredApps = lists:flatmap( + fun({mysql, true}) -> [mysql]; + ({pgsql, true}) -> [pgsql]; + ({pam, true}) -> [epam]; + ({zlib, true}) -> [ezlib]; + ({stun, true}) -> [stun]; + ({riak, true}) -> [riakc]; + ({json, true}) -> [jiffy]; + ({iconv, true}) -> [iconv]; + ({http, true}) -> [ibrowse, lhttpc]; + (_) -> [] + end, Vars), + +DepApps = DepRequiredApps ++ DepConfiguredApps, + +Sys = [{lib_dirs, []}, + {erts, [{mod_cond, derived}, {app_file, strip}]}, + {app_file, strip}, + {rel, "ejabberd", proplists:get_value(vsn, Vars), + [ + kernel, + stdlib, + ejabberd + ] ++ OTPApps ++ DepApps}, + {rel, "start_clean", "", + [ + kernel, + stdlib + ]}, + {boot_rel, "ejabberd"}, + {profile, embedded}, + {incl_cond, exclude}, + {excl_archive_filters, [".*"]}, %% Do not archive built libs + {excl_sys_filters, ["^bin/.*", "^erts.*/bin/(dialyzer|typer)", + "^erts.*/(doc|info|include|lib|man|src)"]}, + {excl_app_filters, ["\.gitignore"]}, + {app, stdlib, [{incl_cond, include}]}, + {app, kernel, [{incl_cond, include}]}, + {app, ejabberd, [{incl_cond, include}, {lib_dir, ".."}]}] +++ lists:map( + fun(App) -> + {app, App, [{incl_cond, include}, + {lib_dir, "../deps/" ++ atom_to_list(App)}]} + end, DepApps) +++ lists:map( + fun(App) -> + {app, App, [{incl_cond, include}]} + end, OTPApps). + +Overlay = [ + {mkdir, "log/sasl"}, + {copy, "files/erl", "\{\{erts_vsn\}\}/bin/erl"}, + {copy, "files/nodetool", "\{\{erts_vsn\}\}/bin/nodetool"}, + {copy, "files/ejabberd", "bin/ejabberd"}, + {copy, "files/ejabberd.cmd", "bin/ejabberd.cmd"}, + {copy, "files/start_erl.cmd", "bin/start_erl.cmd"}, + {copy, "files/install_upgrade.escript", "bin/install_upgrade.escript"}, + {copy, "files/sys.config", "releases/\{\{rel_vsn\}\}/sys.config"}, + {copy, "files/vm.args", "releases/\{\{rel_vsn\}\}/vm.args"} + ], + +Config = [{sys, Sys}, + {target_dir, "ejabberd"}, + {overlay, Overlay}], + +io:format("ejabberd release:~n ~p~n", [Config]), +Config. + +%% Local Variables: +%% mode: erlang +%% End: +%% vim: set filetype=erlang tabstop=8: From 8229ee8dd8362af26a9a600bbd4d184bb23d33bb Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 8 May 2013 21:56:29 +1000 Subject: [PATCH 26/53] Make it possible to generate an OTP application release --- Makefile.in | 19 +++++------- config.vars.in | 12 ++++++++ configure | 4 +++ configure.ac | 3 ++ ejabberdctl.template | 50 ++++++++++++++++--------------- rel/files/erl | 31 +++++++++++++++++++ rel/files/install_upgrade.escript | 44 +++++++++++++++++++++++++++ rel/reltool.config.script | 22 +++++++------- 8 files changed, 140 insertions(+), 45 deletions(-) mode change 100644 => 100755 ejabberdctl.template create mode 100755 rel/files/erl create mode 100644 rel/files/install_upgrade.escript diff --git a/Makefile.in b/Makefile.in index ae11cb5ea..6abb98ff7 100644 --- a/Makefile.in +++ b/Makefile.in @@ -100,13 +100,13 @@ install: all [ -f $(ETCDIR)/ejabberd.cfg ] \ && $(INSTALL) -b -m 640 $(G_USER) ejabberd.cfg.example $(ETCDIR)/ejabberd.cfg-new \ || $(INSTALL) -b -m 640 $(G_USER) ejabberd.cfg.example $(ETCDIR)/ejabberd.cfg - $(SED) -e "s*@rootdir@*@prefix@*" \ - -e "s*@installuser@*@INSTALLUSER@*" \ - -e "s*@LIBDIR@*@libdir@*" \ - -e "s*@SYSCONFDIR@*@sysconfdir@*" \ - -e "s*@LOCALSTATEDIR@*@localstatedir@*" \ - -e "s*@DOCDIR@*@docdir@*" \ - -e "s*@erl@*@ERL@*" ejabberdctl.template \ + $(SED) -e "s*{{rootdir}}*@prefix@*" \ + -e "s*{{installuser}}*@INSTALLUSER@*" \ + -e "s*{{libdir}}*@libdir@*" \ + -e "s*{{sysconfdir}}*@sysconfdir@*" \ + -e "s*{{localstatedir}}*@localstatedir@*" \ + -e "s*{{docdir}}*@docdir@*" \ + -e "s*{{erl}}*@ERL@*" ejabberdctl.template \ > ejabberdctl.example [ -f $(ETCDIR)/ejabberdctl.cfg ] \ && $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg-new \ @@ -205,9 +205,7 @@ clean: $(REBAR) clean clean-rel: - rm -rf rel/files rm -rf rel/ejabberd - rm -f rel/reltool.config distclean: clean clean-rel rm -f config.status @@ -219,9 +217,8 @@ distclean: clean clean-rel rm -f src/ejabberd.app.src [ ! -f ../ChangeLog ] || rm -f ../ChangeLog -rel: clean-rel +rel: clean-rel all cd rel ; \ - $(REBAR) create-node nodeid=ejabberd || exit 1; \ $(REBAR) generate TAGS: diff --git a/config.vars.in b/config.vars.in index f8a33940c..00f6d7341 100644 --- a/config.vars.in +++ b/config.vars.in @@ -33,6 +33,18 @@ %% Version {vsn, "@PACKAGE_VERSION@"}. +%% Variables for overlay template files + +%% Platform-specific installation paths +{release, true}. +{release_dir, "@RELEASE_DIR@"}. +{sysconfdir, "{{release_dir}}/etc"}. +{installuser, "@INSTALLUSER@"}. +{erl, "{{release_dir}}/{{erts_vsn}}/bin/erl"}. +{localstatedir, "{{release_dir}}"}. +{libdir, "{{release_dir}}/lib"}. +{docdir, "{{release_dir}}/doc"}. + %% Local Variables: %% mode: erlang %% End: diff --git a/configure b/configure index 4ad4b78db..949790e33 100755 --- a/configure +++ b/configure @@ -560,6 +560,7 @@ PACKAGE_URL='' ac_default_prefix=/ ac_subst_vars='LTLIBOBJS LIBOBJS +RELEASE_DIR INSTALLUSER http pubsub_ng @@ -2725,6 +2726,9 @@ if test "$ENABLEUSER" != ""; then fi +RELEASE_DIR=$(pwd)/rel/ejabberd + + 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 diff --git a/configure.ac b/configure.ac index 05180bb77..0d8782a56 100644 --- a/configure.ac +++ b/configure.ac @@ -222,4 +222,7 @@ if test "$ENABLEUSER" != ""; then AC_SUBST([INSTALLUSER], [$ENABLEUSER]) fi +RELEASE_DIR=$(pwd)/rel/ejabberd +AC_SUBST(RELEASE_DIR) + AC_OUTPUT diff --git a/ejabberdctl.template b/ejabberdctl.template old mode 100644 new mode 100755 index 7957cacc1..bb707b2ae --- a/ejabberdctl.template +++ b/ejabberdctl.template @@ -11,8 +11,8 @@ ERL_MAX_ETS_TABLES=1400 NODE=ejabberd HOST=localhost ERLANG_NODE=$NODE@$HOST -ERL=@erl@ -INSTALLUSER=@installuser@ +ERL={{erl}} +INSTALLUSER={{installuser}} # parse command line parameters ARGS= @@ -33,7 +33,7 @@ done # Define ejabberd variable if they have not been defined from the command line if [ "$ETCDIR" = "" ] ; then - ETCDIR=@SYSCONFDIR@/ejabberd + ETCDIR={{sysconfdir}}/ejabberd fi if [ "$EJABBERD_CONFIG_PATH" = "" ] ; then EJABBERD_CONFIG_PATH=$ETCDIR/ejabberd.cfg @@ -45,13 +45,13 @@ if [ -f "$EJABBERDCTL_CONFIG_PATH" ] ; then . "$EJABBERDCTL_CONFIG_PATH" fi if [ "$LOGS_DIR" = "" ] ; then - LOGS_DIR=@LOCALSTATEDIR@/log/ejabberd + LOGS_DIR={{localstatedir}}/log/ejabberd fi if [ "$SPOOLDIR" = "" ] ; then - SPOOLDIR=@LOCALSTATEDIR@/lib/ejabberd + SPOOLDIR={{localstatedir}}/lib/ejabberd fi if [ "$EJABBERD_DOC_PATH" = "" ] ; then - EJABBERD_DOC_PATH=@DOCDIR@ + EJABBERD_DOC_PATH={{docdir}} fi if [ "$ERLANG_NODE_ARG" != "" ] ; then ERLANG_NODE=$ERLANG_NODE_ARG @@ -92,23 +92,25 @@ fi ERLANG_OPTS="+K $POLL -smp $SMP +P $ERL_PROCESSES $ERL_OPTIONS" # define additional environment variables -if [ "$EJABBERDDIR" = "" ] ; then - EJABBERDDIR=@LIBDIR@/ejabberd -fi -if [ "$EJABBERD_EBIN_PATH" = "" ] ; then - EJABBERD_EBIN_PATH=$EJABBERDDIR/ebin -fi -if [ "$EJABBERD_PRIV_PATH" = "" ] ; then - EJABBERD_PRIV_PATH=$EJABBERDDIR/priv -fi -if [ "$EJABBERD_BIN_PATH" = "" ] ; then - EJABBERD_BIN_PATH=$EJABBERD_PRIV_PATH/bin -fi -if [ "$EJABBERD_SO_PATH" = "" ] ; then - EJABBERD_SO_PATH=$EJABBERD_PRIV_PATH/lib -fi -if [ "$EJABBERD_MSGS_PATH" = "" ] ; then - EJABBERD_MSGS_PATH=$EJABBERD_PRIV_PATH/msgs +if [ "{{release}}" != "true" ] ; then + if [ "$EJABBERDDIR" = "" ] ; then + EJABBERDDIR={{libdir}}/ejabberd + fi + if [ "$EJABBERD_EBIN_PATH" = "" ] ; then + EJABBERD_EBIN_PATH=$EJABBERDDIR/ebin + fi + if [ "$EJABBERD_PRIV_PATH" = "" ] ; then + EJABBERD_PRIV_PATH=$EJABBERDDIR/priv + fi + if [ "$EJABBERD_BIN_PATH" = "" ] ; then + EJABBERD_BIN_PATH=$EJABBERD_PRIV_PATH/bin + fi + if [ "$EJABBERD_SO_PATH" = "" ] ; then + EJABBERD_SO_PATH=$EJABBERD_PRIV_PATH/lib + fi + if [ "$EJABBERD_MSGS_PATH" = "" ] ; then + EJABBERD_MSGS_PATH=$EJABBERD_PRIV_PATH/msgs + fi fi EJABBERD_LOG_PATH=$LOGS_DIR/ejabberd.log @@ -258,7 +260,7 @@ ctl () # using flock if available. Expects a linux-style # flock that can lock a file descriptor. MAXCONNID=100 - CONNLOCKDIR=@LOCALSTATEDIR@/lock/ejabberdctl + CONNLOCKDIR={{localstatedir}}/lock/ejabberdctl FLOCK='/usr/bin/flock' if [ ! -x "$FLOCK" ] || [ ! -d "$CONNLOCKDIR" ] ; then JOT='/usr/bin/jot' diff --git a/rel/files/erl b/rel/files/erl new file mode 100755 index 000000000..34c158340 --- /dev/null +++ b/rel/files/erl @@ -0,0 +1,31 @@ +#!/bin/sh + +## This script replaces the default "erl" in erts-VSN/bin. This is necessary +## as escript depends on erl and in turn, erl depends on having access to a +## bootscript (start.boot). Note that this script is ONLY invoked as a side-effect +## of running escript -- the embedded node bypasses erl and uses erlexec directly +## (as it should). +## +## Note that this script makes the assumption that there is a start_clean.boot +## file available in $ROOTDIR/release/VSN. + +# Now determine the root directory -- this script runs from erts-VSN/bin, +# so we simply need to strip off two dirs from the end of the ERTS_BIN_DIR +# path. +ROOTDIR={{release_dir}} + +# Parse out release and erts info +START_ERL=`cat $ROOTDIR/releases/start_erl.data` +ERTS_VSN=${START_ERL% *} +APP_VSN=${START_ERL#* } + +BINDIR=$ROOTDIR/erts-$ERTS_VSN/bin +EMU=beam +PROGNAME=`echo $0 | sed 's/.*\\///'` +CMD="$BINDIR/erlexec" +export EMU +export ROOTDIR +export BINDIR +export PROGNAME + +exec $CMD -boot $ROOTDIR/releases/$APP_VSN/start_clean ${1+"$@"} diff --git a/rel/files/install_upgrade.escript b/rel/files/install_upgrade.escript new file mode 100644 index 000000000..56cea1963 --- /dev/null +++ b/rel/files/install_upgrade.escript @@ -0,0 +1,44 @@ +#!/usr/bin/env escript +%%! -noshell -noinput +%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*- +%% ex: ft=erlang ts=4 sw=4 et + +-define(TIMEOUT, 60000). +-define(INFO(Fmt,Args), io:format(Fmt,Args)). + +main([NodeName, Cookie, ReleasePackage]) -> + TargetNode = start_distribution(NodeName, Cookie), + {ok, Vsn} = rpc:call(TargetNode, release_handler, unpack_release, + [ReleasePackage], ?TIMEOUT), + ?INFO("Unpacked Release ~p~n", [Vsn]), + {ok, OtherVsn, Desc} = rpc:call(TargetNode, release_handler, + check_install_release, [Vsn], ?TIMEOUT), + {ok, OtherVsn, Desc} = rpc:call(TargetNode, release_handler, + install_release, [Vsn], ?TIMEOUT), + ?INFO("Installed Release ~p~n", [Vsn]), + ok = rpc:call(TargetNode, release_handler, make_permanent, [Vsn], ?TIMEOUT), + ?INFO("Made Release ~p Permanent~n", [Vsn]); +main(_) -> + init:stop(1). + +start_distribution(NodeName, Cookie) -> + MyNode = make_script_node(NodeName), + {ok, _Pid} = net_kernel:start([MyNode, shortnames]), + erlang:set_cookie(node(), list_to_atom(Cookie)), + TargetNode = make_target_node(NodeName), + case {net_kernel:hidden_connect_node(TargetNode), + net_adm:ping(TargetNode)} of + {true, pong} -> + ok; + {_, pang} -> + io:format("Node ~p not responding to pings.\n", [TargetNode]), + init:stop(1) + end, + TargetNode. + +make_target_node(Node) -> + [_, Host] = string:tokens(atom_to_list(node()), "@"), + list_to_atom(lists:concat([Node, "@", Host])). + +make_script_node(Node) -> + list_to_atom(lists:concat([Node, "_upgrader_", os:getpid()])). diff --git a/rel/reltool.config.script b/rel/reltool.config.script index 62b2b1f52..19f4814b9 100644 --- a/rel/reltool.config.script +++ b/rel/reltool.config.script @@ -24,7 +24,7 @@ DepConfiguredApps = lists:flatmap( ({pam, true}) -> [epam]; ({zlib, true}) -> [ezlib]; ({stun, true}) -> [stun]; - ({riak, true}) -> [riakc]; + ({riak, true}) -> [riakc, riak_pb, protobuffs]; ({json, true}) -> [jiffy]; ({iconv, true}) -> [iconv]; ({http, true}) -> [ibrowse, lhttpc]; @@ -68,18 +68,20 @@ Sys = [{lib_dirs, []}, end, OTPApps). Overlay = [ - {mkdir, "log/sasl"}, - {copy, "files/erl", "\{\{erts_vsn\}\}/bin/erl"}, - {copy, "files/nodetool", "\{\{erts_vsn\}\}/bin/nodetool"}, - {copy, "files/ejabberd", "bin/ejabberd"}, - {copy, "files/ejabberd.cmd", "bin/ejabberd.cmd"}, - {copy, "files/start_erl.cmd", "bin/start_erl.cmd"}, - {copy, "files/install_upgrade.escript", "bin/install_upgrade.escript"}, - {copy, "files/sys.config", "releases/\{\{rel_vsn\}\}/sys.config"}, - {copy, "files/vm.args", "releases/\{\{rel_vsn\}\}/vm.args"} + {mkdir, "log"}, + {mkdir, "lock"}, + {mkdir, "etc/ejabberd"}, + {mkdir, "doc"}, + {template, "files/erl", "\{\{erts_vsn\}\}/bin/erl"}, + {template, "../ejabberdctl.template", "bin/ejabberdctl"}, + {copy, "../ejabberdctl.cfg.example", "etc/ejabberd/ejabberdctl.cfg"}, + {copy, "../ejabberd.cfg.example", "etc/ejabberd/ejabberd.cfg"}, + {copy, "../inetrc", "etc/ejabberd/inetrc"}, + {copy, "files/install_upgrade.escript", "bin/install_upgrade.escript"} ], Config = [{sys, Sys}, + {overlay_vars, "../config.vars"}, {target_dir, "ejabberd"}, {overlay, Overlay}], From b13c51c8cff91501a740e8ffc86b94a110e80f44 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 8 May 2013 22:52:10 +1000 Subject: [PATCH 27/53] Better release directory detection --- config.vars.in | 2 +- ejabberdctl.template | 2 ++ rel/files/erl | 5 ++++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/config.vars.in b/config.vars.in index 00f6d7341..42cdabbac 100644 --- a/config.vars.in +++ b/config.vars.in @@ -37,7 +37,7 @@ %% Platform-specific installation paths {release, true}. -{release_dir, "@RELEASE_DIR@"}. +{release_dir, "${SCRIPT_DIR%/*}"}. {sysconfdir, "{{release_dir}}/etc"}. {installuser, "@INSTALLUSER@"}. {erl, "{{release_dir}}/{{erts_vsn}}/bin/erl"}. diff --git a/ejabberdctl.template b/ejabberdctl.template index bb707b2ae..387eaab7b 100755 --- a/ejabberdctl.template +++ b/ejabberdctl.template @@ -7,6 +7,8 @@ ERL_MAX_PORTS=32000 ERL_PROCESSES=250000 ERL_MAX_ETS_TABLES=1400 +SCRIPT_DIR=$(cd ${0%/*} && pwd) + # define default environment variables NODE=ejabberd HOST=localhost diff --git a/rel/files/erl b/rel/files/erl index 34c158340..6f65e3fc9 100755 --- a/rel/files/erl +++ b/rel/files/erl @@ -9,10 +9,13 @@ ## Note that this script makes the assumption that there is a start_clean.boot ## file available in $ROOTDIR/release/VSN. +# Determine the abspath of where this script is executing from. +ERTS_BIN_DIR=$(cd ${0%/*} && pwd) + # Now determine the root directory -- this script runs from erts-VSN/bin, # so we simply need to strip off two dirs from the end of the ERTS_BIN_DIR # path. -ROOTDIR={{release_dir}} +ROOTDIR=${ERTS_BIN_DIR%/*/*} # Parse out release and erts info START_ERL=`cat $ROOTDIR/releases/start_erl.data` From 9664de5242ef38254b77dea4434356e87d35cb7a Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 8 May 2013 23:11:17 +1000 Subject: [PATCH 28/53] Properly create log directory --- rel/reltool.config.script | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rel/reltool.config.script b/rel/reltool.config.script index 19f4814b9..26903e383 100644 --- a/rel/reltool.config.script +++ b/rel/reltool.config.script @@ -68,7 +68,7 @@ Sys = [{lib_dirs, []}, end, OTPApps). Overlay = [ - {mkdir, "log"}, + {mkdir, "log/ejabberd"}, {mkdir, "lock"}, {mkdir, "etc/ejabberd"}, {mkdir, "doc"}, From af9ff6f1a19218b85f0d5862431cb83363fd13f5 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 8 May 2013 23:51:21 +1000 Subject: [PATCH 29/53] Fix logging --- rel/reltool.config.script | 2 +- src/ejabberd_admin.erl | 4 ++-- src/ejabberd_app.erl | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rel/reltool.config.script b/rel/reltool.config.script index 26903e383..a60762b0c 100644 --- a/rel/reltool.config.script +++ b/rel/reltool.config.script @@ -14,7 +14,7 @@ Vars = case file:consult(filename:join(["..", "config.vars"])) of end, OTPApps = [sasl, crypto, public_key, ssl, - mnesia, inets, odbc, tools], + mnesia, inets, odbc, tools, compiler], DepRequiredApps = [logger, cache_tab, tls, stringprep, xml, xmlrpc], diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl index c58bbb3b6..cef10013b 100644 --- a/src/ejabberd_admin.erl +++ b/src/ejabberd_admin.erl @@ -281,11 +281,11 @@ status() -> reopen_log() -> ejabberd_hooks:run(reopen_log_hook, []), %% TODO: Use the Reopen log API for logger_h ? - ejabberd_logger_h:reopen_log(), + logger_h:reopen_log(), case application:get_env(sasl,sasl_error_logger) of {ok, {file, SASLfile}} -> error_logger:delete_report_handler(sasl_report_file_h), - ejabberd_logger_h:rotate_log(SASLfile), + logger_h:rotate_log(SASLfile), error_logger:add_report_handler(sasl_report_file_h, {SASLfile, get_sasl_error_logger_type()}); _ -> false diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl index f897a4385..218a714c7 100644 --- a/src/ejabberd_app.erl +++ b/src/ejabberd_app.erl @@ -104,7 +104,7 @@ init() -> %erlang:system_flag(fullsweep_after, 0), %error_logger:logfile({open, ?LOG_PATH}), LogPath = get_log_path(), - error_logger:add_report_handler(ejabberd_logger_h, LogPath), + error_logger:add_report_handler(logger_h, LogPath), loop(). loop() -> From 612f15ab17cabc8418525fe9fede332fd358d3e4 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 8 May 2013 23:51:56 +1000 Subject: [PATCH 30/53] Do not dump the release file --- rel/reltool.config.script | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rel/reltool.config.script b/rel/reltool.config.script index a60762b0c..2a301ce1f 100644 --- a/rel/reltool.config.script +++ b/rel/reltool.config.script @@ -85,7 +85,7 @@ Config = [{sys, Sys}, {target_dir, "ejabberd"}, {overlay, Overlay}], -io:format("ejabberd release:~n ~p~n", [Config]), +%%io:format("ejabberd release:~n ~p~n", [Config]), Config. %% Local Variables: From 7f11f4a1fb8097c24da9cf12854537dd5d898687 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 8 May 2013 23:59:58 +1000 Subject: [PATCH 31/53] Do not `cd` when generating a release --- Makefile.in | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Makefile.in b/Makefile.in index 6abb98ff7..c8112bee8 100644 --- a/Makefile.in +++ b/Makefile.in @@ -217,8 +217,7 @@ distclean: clean clean-rel rm -f src/ejabberd.app.src [ ! -f ../ChangeLog ] || rm -f ../ChangeLog -rel: clean-rel all - cd rel ; \ +rel: all $(REBAR) generate TAGS: From 3d4775d555d66839b343ca4b88f0ca0935fde494 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 9 May 2013 01:14:58 +1000 Subject: [PATCH 32/53] Update dialyzer target --- Makefile.in | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/Makefile.in b/Makefile.in index c8112bee8..c9815dd7d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -79,12 +79,6 @@ src: translations: contrib/extract_translations/prepare-translation.sh -updateall -doc: - @subdirs="$(SUBDIRS)"; for subdir in $$subdirs; do \ - echo making $$target in $$subdir; \ - (cd $$subdir && $(MAKE) $$target) || exit 1; \ - done - doc: echo making $$target in doc; \ (cd doc && $(MAKE) $$target) || exit 1 @@ -225,7 +219,17 @@ TAGS: Makefile: Makefile.in -dialyzer: $(BEAMS) - @dialyzer -c . +erlang.plt: + -dialyzer --build_plt --output_plt erlang.plt \ + --apps kernel stdlib sasl crypto public_key ssl mnesia \ + inets odbc tools compiler erts webtool runtime_tools asn1 \ + observer xmerl et gs wx deps/*/ebin -.PHONY: src doc edoc dialyzer Makefile TAGS clean distclean rel +plt: erlang.plt + +dialyzer: plt + -dialyzer --plt erlang.plt --add_to_plt --output_plt ejabberd.plt \ + --get_warnings -o dialyzer.log ebin + +.PHONY: src doc edoc dialyzer Makefile TAGS clean clean-rel distclean rel plt \ + install uninstall uninstall-binary uninstall-all translations From eedd9496e4d80aa506c1409b10ed23d897174537 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 9 May 2013 11:30:10 +1000 Subject: [PATCH 33/53] Add --enable-all compiler option --- configure | 53 ++++++++++++++++++++++++++++++++-------------------- configure.ac | 46 +++++++++++++++++++++++++-------------------- 2 files changed, 59 insertions(+), 40 deletions(-) diff --git a/configure b/configure index 949790e33..027e15f92 100755 --- a/configure +++ b/configure @@ -560,8 +560,6 @@ PACKAGE_URL='' ac_default_prefix=/ ac_subst_vars='LTLIBOBJS LIBOBJS -RELEASE_DIR -INSTALLUSER http pubsub_ng debug @@ -580,6 +578,7 @@ transient_supervisors flash_hack roster_gateway_workaround hipe +INSTALLUSER MAKE REBAR ESCRIPT @@ -652,6 +651,7 @@ enable_iconv enable_debug enable_pubsub_ng enable_http +enable_all enable_user ' ac_precious_vars='build_alias @@ -1299,6 +1299,11 @@ Optional Features: --enable-pubsub_ng enable PubSub NG (default: no) --enable-http build external HTTP libraries ('ibrowse' and 'lhttpc', default: no) + --enable-all same as --enable-nif --enable-mysql --enable-pgsql + --enable-pam --enable-zlib --enable-stun + --enable-riak --enable-json --enable-iconv + --enable-debug --enable-pubsub_ng --enable-http + (useful for Dialyzer checks, default: no) --enable-user[[[=USER]]] allow this system user to start ejabberd (default: no) @@ -2485,7 +2490,6 @@ else fi - # Check whether --enable-roster_gateway_workaround was given. if test "${enable_roster_gateway_workaround+set}" = set; then : enableval=$enable_roster_gateway_workaround; case "${enableval}" in @@ -2498,7 +2502,6 @@ else fi - # Check whether --enable-flash_hack was given. if test "${enable_flash_hack+set}" = set; then : enableval=$enable_flash_hack; case "${enableval}" in @@ -2511,7 +2514,6 @@ else fi - # Check whether --enable-transient_supervisors was given. if test "${enable_transient_supervisors+set}" = set; then : enableval=$enable_transient_supervisors; case "${enableval}" in @@ -2524,7 +2526,6 @@ else fi - # Check whether --enable-full_xml was given. if test "${enable_full_xml+set}" = set; then : enableval=$enable_full_xml; case "${enableval}" in @@ -2537,7 +2538,6 @@ else fi - # Check whether --enable-nif was given. if test "${enable_nif+set}" = set; then : enableval=$enable_nif; case "${enableval}" in @@ -2550,7 +2550,6 @@ else fi - # Check whether --enable-mssql was given. if test "${enable_mssql+set}" = set; then : enableval=$enable_mssql; case "${enableval}" in @@ -2563,7 +2562,6 @@ else fi - # Check whether --enable-mysql was given. if test "${enable_mysql+set}" = set; then : enableval=$enable_mysql; case "${enableval}" in @@ -2576,7 +2574,6 @@ else fi - # Check whether --enable-pgsql was given. if test "${enable_pgsql+set}" = set; then : enableval=$enable_pgsql; case "${enableval}" in @@ -2589,7 +2586,6 @@ else fi - # Check whether --enable-pam was given. if test "${enable_pam+set}" = set; then : enableval=$enable_pam; case "${enableval}" in @@ -2602,7 +2598,6 @@ else fi - # Check whether --enable-zlib was given. if test "${enable_zlib+set}" = set; then : enableval=$enable_zlib; case "${enableval}" in @@ -2615,7 +2610,6 @@ else fi - # Check whether --enable-stun was given. if test "${enable_stun+set}" = set; then : enableval=$enable_stun; case "${enableval}" in @@ -2628,7 +2622,6 @@ else fi - # Check whether --enable-riak was given. if test "${enable_riak+set}" = set; then : enableval=$enable_riak; case "${enableval}" in @@ -2641,7 +2634,6 @@ else fi - # Check whether --enable-json was given. if test "${enable_json+set}" = set; then : enableval=$enable_json; case "${enableval}" in @@ -2654,7 +2646,6 @@ else fi - # Check whether --enable-iconv was given. if test "${enable_iconv+set}" = set; then : enableval=$enable_iconv; case "${enableval}" in @@ -2667,7 +2658,6 @@ else fi - # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; case "${enableval}" in @@ -2680,7 +2670,6 @@ else fi - # Check whether --enable-pubsub_ng was given. if test "${enable_pubsub_ng+set}" = set; then : enableval=$enable_pubsub_ng; case "${enableval}" in @@ -2693,7 +2682,6 @@ else fi - # Check whether --enable-http was given. if test "${enable_http+set}" = set; then : enableval=$enable_http; case "${enableval}" in @@ -2706,6 +2694,15 @@ else fi +# Check whether --enable-all was given. +if test "${enable_all+set}" = set; then : + enableval=$enable_all; case "${enableval}" in + yes) nif=true mysql=true pgsql=true pam=true zlib=true stun=true riak=true json=true iconv=true debug=true pubsub_ng=true http=true ;; + no) nif=false mysql=false pgsql=false pam=false zlib=false stun=false riak=false json=false iconv=false debug=false pubsub_ng=false http=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-all" "$LINENO" 5 ;; +esac +fi + ac_config_files="$ac_config_files Makefile config.vars src/ejabberd.app.src" @@ -2726,7 +2723,23 @@ if test "$ENABLEUSER" != ""; then fi -RELEASE_DIR=$(pwd)/rel/ejabberd + + + + + + + + + + + + + + + + + cat >confcache <<\_ACEOF diff --git a/configure.ac b/configure.ac index 0d8782a56..814c07bed 100644 --- a/configure.ac +++ b/configure.ac @@ -49,7 +49,6 @@ AC_ARG_ENABLE(hipe, no) hipe=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-hipe) ;; esac],[hipe=false]) -AC_SUBST(hipe) AC_ARG_ENABLE(roster_gateway_workaround, [AC_HELP_STRING([--enable-roster-gateway-workaround], [turn on workaround for processing gateway subscriptions (default: no)])], @@ -58,7 +57,6 @@ AC_ARG_ENABLE(roster_gateway_workaround, no) roster_gateway_workaround=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-roster-gateway-workaround) ;; esac],[roster_gateway_workaround=false]) -AC_SUBST(roster_gateway_workaround) AC_ARG_ENABLE(flash_hack, [AC_HELP_STRING([--enable-flash-hack], [support Adobe Flash client XML (default: no)])], @@ -67,7 +65,6 @@ AC_ARG_ENABLE(flash_hack, no) flash_hack=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-flash-hack) ;; esac],[flash_hack=false]) -AC_SUBST(flash_hack) AC_ARG_ENABLE(transient_supervisors, [AC_HELP_STRING([--enable-transient_supervisors], [use Erlang supervision for transient process (default: no)])], @@ -76,7 +73,6 @@ AC_ARG_ENABLE(transient_supervisors, no) transient_supervisors=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-transient_supervisors) ;; esac],[transient_supervisors=false]) -AC_SUBST(transient_supervisors) AC_ARG_ENABLE(full_xml, [AC_HELP_STRING([--enable-full-xml], [use XML features in XMPP stream (ex: CDATA) (default: no, requires XML compliant clients)])], @@ -85,7 +81,6 @@ AC_ARG_ENABLE(full_xml, no) full_xml=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-full-xml) ;; esac],[full_xml=false]) -AC_SUBST(full_xml) AC_ARG_ENABLE(nif, [AC_HELP_STRING([--enable-nif], [replace some functions with C equivalents. Requires Erlang R13B04 or higher (default: no)])], @@ -94,7 +89,6 @@ AC_ARG_ENABLE(nif, no) nif=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-nif) ;; esac],[nif=false]) -AC_SUBST(nif) AC_ARG_ENABLE(mssql, [AC_HELP_STRING([--enable-mssql], [use Microsoft SQL Server database (default: no, requires --enable-odbc)])], @@ -103,7 +97,6 @@ AC_ARG_ENABLE(mssql, no) db_type=generic ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-mssql) ;; esac],[db_type=generic]) -AC_SUBST(db_type) AC_ARG_ENABLE(mysql, [AC_HELP_STRING([--enable-mysql], [enable MySQL support (default: no)])], @@ -112,7 +105,6 @@ AC_ARG_ENABLE(mysql, no) mysql=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-mysql) ;; esac],[mysql=false]) -AC_SUBST(mysql) AC_ARG_ENABLE(pgsql, [AC_HELP_STRING([--enable-pgsql], [enable PostgreSQL support (default: no)])], @@ -121,7 +113,6 @@ AC_ARG_ENABLE(pgsql, no) pgsql=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-pgsql) ;; esac],[pgsql=false]) -AC_SUBST(pgsql) AC_ARG_ENABLE(pam, [AC_HELP_STRING([--enable-pam], [enable PAM support (default: no)])], @@ -130,7 +121,6 @@ AC_ARG_ENABLE(pam, no) pam=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-pam) ;; esac],[pam=false]) -AC_SUBST(pam) AC_ARG_ENABLE(zlib, [AC_HELP_STRING([--enable-zlib], [enable Stream Compression (XEP-0138) using zlib (default: yes)])], @@ -139,7 +129,6 @@ AC_ARG_ENABLE(zlib, no) zlib=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-zlib) ;; esac],[zlib=true]) -AC_SUBST(zlib) AC_ARG_ENABLE(stun, [AC_HELP_STRING([--enable-stun], [enable STUN support (default: no)])], @@ -148,7 +137,6 @@ AC_ARG_ENABLE(stun, no) stun=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-stun) ;; esac],[stun=false]) -AC_SUBST(stun) AC_ARG_ENABLE(riak, [AC_HELP_STRING([--enable-riak], [enable Riak support (default: no)])], @@ -157,7 +145,6 @@ AC_ARG_ENABLE(riak, no) riak=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-riak) ;; esac],[riak=false]) -AC_SUBST(riak) AC_ARG_ENABLE(json, [AC_HELP_STRING([--enable-json], [enable JSON support for mod_bosh (default: no)])], @@ -166,7 +153,6 @@ AC_ARG_ENABLE(json, no) json=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-json) ;; esac],[json=false]) -AC_SUBST(json) AC_ARG_ENABLE(iconv, [AC_HELP_STRING([--enable-iconv], [enable iconv support (default: no)])], @@ -175,7 +161,6 @@ AC_ARG_ENABLE(iconv, no) iconv=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-iconv) ;; esac],[iconv=false]) -AC_SUBST(iconv) AC_ARG_ENABLE(debug, [AC_HELP_STRING([--enable-debug], [enable debug information (default: yes)])], @@ -184,7 +169,6 @@ AC_ARG_ENABLE(debug, no) debug=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; esac],[debug=true]) -AC_SUBST(debug) AC_ARG_ENABLE(pubsub_ng, [AC_HELP_STRING([--enable-pubsub_ng], [enable PubSub NG (default: no)])], @@ -193,7 +177,6 @@ AC_ARG_ENABLE(pubsub_ng, no) pubsub_ng=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-pubsub_ng) ;; esac],[pubsub_ng=false]) -AC_SUBST(pubsub_ng) AC_ARG_ENABLE(http, [AC_HELP_STRING([--enable-http], [build external HTTP libraries ('ibrowse' and 'lhttpc', default: no)])], @@ -202,7 +185,14 @@ AC_ARG_ENABLE(http, no) http=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-http) ;; esac],[http=false]) -AC_SUBST(http) + +AC_ARG_ENABLE(all, +[AC_HELP_STRING([--enable-all], [same as --enable-nif --enable-mysql --enable-pgsql --enable-pam --enable-zlib --enable-stun --enable-riak --enable-json --enable-iconv --enable-debug --enable-pubsub_ng --enable-http (useful for Dialyzer checks, default: no)])], +[case "${enableval}" in + yes) nif=true mysql=true pgsql=true pam=true zlib=true stun=true riak=true json=true iconv=true debug=true pubsub_ng=true http=true ;; + no) nif=false mysql=false pgsql=false pam=false zlib=false stun=false riak=false json=false iconv=false debug=false pubsub_ng=false http=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-all) ;; +esac],[]) AC_CONFIG_FILES([Makefile config.vars @@ -222,7 +212,23 @@ if test "$ENABLEUSER" != ""; then AC_SUBST([INSTALLUSER], [$ENABLEUSER]) fi -RELEASE_DIR=$(pwd)/rel/ejabberd -AC_SUBST(RELEASE_DIR) +AC_SUBST(hipe) +AC_SUBST(roster_gateway_workaround) +AC_SUBST(flash_hack) +AC_SUBST(transient_supervisors) +AC_SUBST(full_xml) +AC_SUBST(nif) +AC_SUBST(db_type) +AC_SUBST(mysql) +AC_SUBST(pgsql) +AC_SUBST(pam) +AC_SUBST(zlib) +AC_SUBST(stun) +AC_SUBST(riak) +AC_SUBST(json) +AC_SUBST(iconv) +AC_SUBST(debug) +AC_SUBST(pubsub_ng) +AC_SUBST(http) AC_OUTPUT From a2d258119934fd9a82d674d318ac4f747dac8013 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 9 May 2013 11:56:01 +1000 Subject: [PATCH 34/53] Do not dump dynamic configuration --- rebar.config.script | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rebar.config.script b/rebar.config.script index e003667d5..a99943dfb 100644 --- a/rebar.config.script +++ b/rebar.config.script @@ -119,7 +119,7 @@ Config = [{erl_opts, Includes ++ Macros ++ HiPE ++ DebugInfo}, {sub_dirs, ["rel"]}, {post_hooks, PostHooks ++ CfgPostHooks}, {deps, Deps ++ CfgDeps}], -io:format("ejabberd configuration:~n ~p~n", [Config]), +%%io:format("ejabberd configuration:~n ~p~n", [Config]), Config. %% Local Variables: From e7b1f21e1c9fc6141723ce2c68c765a916a7d9fb Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 9 May 2013 17:03:47 +1000 Subject: [PATCH 35/53] Add syntax_tools to the PLT list --- Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index c9815dd7d..71b926b3c 100644 --- a/Makefile.in +++ b/Makefile.in @@ -223,7 +223,7 @@ erlang.plt: -dialyzer --build_plt --output_plt erlang.plt \ --apps kernel stdlib sasl crypto public_key ssl mnesia \ inets odbc tools compiler erts webtool runtime_tools asn1 \ - observer xmerl et gs wx deps/*/ebin + observer xmerl et gs wx syntax_tools deps/*/ebin plt: erlang.plt From e52c324a5eb7ee01fd189c110d175f191a18a5c4 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 9 May 2013 17:58:29 +1000 Subject: [PATCH 36/53] Exclude riak_pb from the PLT --- Makefile.in | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 71b926b3c..505b66261 100644 --- a/Makefile.in +++ b/Makefile.in @@ -219,11 +219,13 @@ TAGS: Makefile: Makefile.in +deps := $(filter-out deps/riak_pb/ebin, $(wildcard deps/*/ebin)) + erlang.plt: -dialyzer --build_plt --output_plt erlang.plt \ --apps kernel stdlib sasl crypto public_key ssl mnesia \ inets odbc tools compiler erts webtool runtime_tools asn1 \ - observer xmerl et gs wx syntax_tools deps/*/ebin + observer xmerl et gs wx syntax_tools $(deps) plt: erlang.plt From 6e1691e2fa6568c37ca9c7d4ccd459718881721b Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 9 May 2013 19:00:25 +1000 Subject: [PATCH 37/53] Do not set ERLANG_ROOT_DIR and ERLANG_LIB_DIR variable --- configure | 151 +-------------------------------------------------- configure.ac | 4 +- 2 files changed, 4 insertions(+), 151 deletions(-) diff --git a/configure b/configure index 027e15f92..434a9690e 100755 --- a/configure +++ b/configure @@ -582,8 +582,6 @@ INSTALLUSER MAKE REBAR ESCRIPT -ERLANG_LIB_DIR -ERLANG_ROOT_DIR ERLCFLAGS ERLC ERL @@ -1392,48 +1390,6 @@ fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## - -# ac_fn_erl_try_run LINENO -# ------------------------ -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_erl_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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_erl_try_run cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. @@ -2237,111 +2193,8 @@ fi # Checks and sets ERLANG_ROOT_DIR and ERLANG_LIB_DIR variable - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP root directory" >&5 -$as_echo_n "checking for Erlang/OTP root directory... " >&6; } -if test "${ac_cv_erlang_root_dir+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_ext=erl -ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' -ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' - if test "$cross_compiling" = yes; then : - { { $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 test program while cross compiling -See \`config.log' for more details" "$LINENO" 5 ; } -else - cat > conftest.$ac_ext <<_ACEOF --module(conftest). --export([start/0]). - -start() -> - RootDir = code:root_dir(), - file:write_file("conftest.out", RootDir), - ReturnValue = 0, - halt(ReturnValue) -. - -_ACEOF -if ac_fn_erl_try_run "$LINENO"; then : - ac_cv_erlang_root_dir=`cat conftest.out` - rm -f conftest.out -else - rm -f conftest.out - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "test Erlang program execution failed -See \`config.log' for more details" "$LINENO" 5 ; } -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -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 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_root_dir" >&5 -$as_echo "$ac_cv_erlang_root_dir" >&6; } -ERLANG_ROOT_DIR=$ac_cv_erlang_root_dir - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP library base directory" >&5 -$as_echo_n "checking for Erlang/OTP library base directory... " >&6; } -if test "${ac_cv_erlang_lib_dir+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_ext=erl -ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' -ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' - if test "$cross_compiling" = yes; then : - { { $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 test program while cross compiling -See \`config.log' for more details" "$LINENO" 5 ; } -else - cat > conftest.$ac_ext <<_ACEOF --module(conftest). --export([start/0]). - -start() -> - LibDir = code:lib_dir(), - file:write_file("conftest.out", LibDir), - ReturnValue = 0, - halt(ReturnValue) -. - -_ACEOF -if ac_fn_erl_try_run "$LINENO"; then : - ac_cv_erlang_lib_dir=`cat conftest.out` - rm -f conftest.out -else - rm -f conftest.out - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "test Erlang program execution failed -See \`config.log' for more details" "$LINENO" 5 ; } -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -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 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_dir" >&5 -$as_echo "$ac_cv_erlang_lib_dir" >&6; } -ERLANG_LIB_DIR=$ac_cv_erlang_lib_dir - - +# AC_ERLANG_SUBST_ROOT_DIR +# AC_ERLANG_SUBST_LIB_DIR #locating escript # Extract the first word of "escript", so it can be a program name with args. diff --git a/configure.ac b/configure.ac index 814c07bed..23a98d950 100644 --- a/configure.ac +++ b/configure.ac @@ -19,8 +19,8 @@ AC_ERLANG_NEED_ERL AC_ERLANG_NEED_ERLC # Checks and sets ERLANG_ROOT_DIR and ERLANG_LIB_DIR variable -AC_ERLANG_SUBST_ROOT_DIR -AC_ERLANG_SUBST_LIB_DIR +# AC_ERLANG_SUBST_ROOT_DIR +# AC_ERLANG_SUBST_LIB_DIR #locating escript AC_PATH_PROG([ESCRIPT], [escript], []) From 80ff4ad3d3a9178d8361048ff9bfc8aa190a69fc Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 9 May 2013 19:05:35 +1000 Subject: [PATCH 38/53] Rename config.vars to vars.config --- Makefile.in | 2 +- configure | 4 ++-- configure.ac | 2 +- rebar.config.script | 2 +- rel/reltool.config.script | 4 ++-- config.vars.in => vars.config.in | 0 6 files changed, 7 insertions(+), 7 deletions(-) rename config.vars.in => vars.config.in (100%) diff --git a/Makefile.in b/Makefile.in index 505b66261..fbbd1f45b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -207,7 +207,7 @@ distclean: clean clean-rel rm -rf deps rm -rf ebin rm -f Makefile - rm -f config.vars + rm -f vars.config rm -f src/ejabberd.app.src [ ! -f ../ChangeLog ] || rm -f ../ChangeLog diff --git a/configure b/configure index 434a9690e..f772762e7 100755 --- a/configure +++ b/configure @@ -2557,7 +2557,7 @@ esac fi -ac_config_files="$ac_config_files Makefile config.vars src/ejabberd.app.src" +ac_config_files="$ac_config_files Makefile vars.config src/ejabberd.app.src" ENABLEUSER="" @@ -3302,7 +3302,7 @@ for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "config.vars") CONFIG_FILES="$CONFIG_FILES config.vars" ;; + "vars.config") CONFIG_FILES="$CONFIG_FILES vars.config" ;; "src/ejabberd.app.src") CONFIG_FILES="$CONFIG_FILES src/ejabberd.app.src" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; diff --git a/configure.ac b/configure.ac index 23a98d950..da82e2d6d 100644 --- a/configure.ac +++ b/configure.ac @@ -195,7 +195,7 @@ AC_ARG_ENABLE(all, esac],[]) AC_CONFIG_FILES([Makefile - config.vars + vars.config src/ejabberd.app.src]) ENABLEUSER="" diff --git a/rebar.config.script b/rebar.config.script index a99943dfb..6258bb055 100644 --- a/rebar.config.script +++ b/rebar.config.script @@ -6,7 +6,7 @@ %%% @end %%% Created : 1 May 2013 by Evgeniy Khramtsov %%%------------------------------------------------------------------- -Cfg = case file:consult("config.vars") of +Cfg = case file:consult("vars.config") of {ok, Terms} -> Terms; _Err -> diff --git a/rel/reltool.config.script b/rel/reltool.config.script index 2a301ce1f..05ff9022e 100644 --- a/rel/reltool.config.script +++ b/rel/reltool.config.script @@ -6,7 +6,7 @@ %%% @end %%% Created : 8 May 2013 by Evgeniy Khramtsov %%%------------------------------------------------------------------- -Vars = case file:consult(filename:join(["..", "config.vars"])) of +Vars = case file:consult(filename:join(["..", "vars.config"])) of {ok, Terms} -> Terms; _Err -> @@ -81,7 +81,7 @@ Overlay = [ ], Config = [{sys, Sys}, - {overlay_vars, "../config.vars"}, + {overlay_vars, "../vars.config"}, {target_dir, "ejabberd"}, {overlay, Overlay}], diff --git a/config.vars.in b/vars.config.in similarity index 100% rename from config.vars.in rename to vars.config.in From af198dbe92f30b781ec5e3e872ad3f50e0bf40b2 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 9 May 2013 19:30:03 +1000 Subject: [PATCH 39/53] Change {{localstatedir}} overlay variable --- rel/reltool.config.script | 5 +++-- vars.config.in | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/rel/reltool.config.script b/rel/reltool.config.script index 05ff9022e..217ee5ecc 100644 --- a/rel/reltool.config.script +++ b/rel/reltool.config.script @@ -68,8 +68,9 @@ Sys = [{lib_dirs, []}, end, OTPApps). Overlay = [ - {mkdir, "log/ejabberd"}, - {mkdir, "lock"}, + {mkdir, "var/log/ejabberd"}, + {mkdir, "var/lock"}, + {mkdir, "var/lib/ejabberd"}, {mkdir, "etc/ejabberd"}, {mkdir, "doc"}, {template, "files/erl", "\{\{erts_vsn\}\}/bin/erl"}, diff --git a/vars.config.in b/vars.config.in index 42cdabbac..86f56cd0e 100644 --- a/vars.config.in +++ b/vars.config.in @@ -41,7 +41,7 @@ {sysconfdir, "{{release_dir}}/etc"}. {installuser, "@INSTALLUSER@"}. {erl, "{{release_dir}}/{{erts_vsn}}/bin/erl"}. -{localstatedir, "{{release_dir}}"}. +{localstatedir, "{{release_dir}}/var"}. {libdir, "{{release_dir}}/lib"}. {docdir, "{{release_dir}}/doc"}. From 1cd1dd9f2322cf0039ef450778af07a56dccd4e4 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 9 May 2013 20:57:27 +1000 Subject: [PATCH 40/53] Use another XML-RPC library --- rebar.config.script | 2 +- src/beam_util.erl | 56 -------------------------------------- src/url_util.erl | 65 --------------------------------------------- 3 files changed, 1 insertion(+), 122 deletions(-) delete mode 100644 src/beam_util.erl delete mode 100644 src/url_util.erl diff --git a/rebar.config.script b/rebar.config.script index 6258bb055..4301786cd 100644 --- a/rebar.config.script +++ b/rebar.config.script @@ -58,7 +58,7 @@ Deps = [{logger, ".*", {git, "git://github.com/processone/p1_logger"}}, {tls, ".*", {git, "git://github.com/processone/tls"}}, {stringprep, ".*", {git, "git://github.com/processone/stringprep"}}, {xml, ".*", {git, "git://github.com/processone/xml"}}, - {xmlrpc, ".*", {git, "git://github.com/etnt/xmlrpc"}}], + {xmlrpc, ".*", {git, "git://github.com/rds13/xmlrpc"}}], ConfigureCmd = fun(Pkg, Flags) -> {'get-deps', diff --git a/src/beam_util.erl b/src/beam_util.erl deleted file mode 100644 index 5104ca285..000000000 --- a/src/beam_util.erl +++ /dev/null @@ -1,56 +0,0 @@ -%% Copyright (C) 2009 Romuald du Song . -%% All rights reserved. -%% -%% Redistribution and use in source and binary forms, with or without -%% modification, are permitted provided that the following conditions -%% are met: -%% -%% 1. Redistributions of source code must retain the above copyright -%% notice, this list of conditions and the following disclaimer. -%% 2. Redistributions in binary form must reproduce the above -%% copyright notice, this list of conditions and the following -%% disclaimer in the documentation and/or other materials provided -%% with the distribution. -%% -%% THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS -%% OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -%% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -%% ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -%% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -%% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -%% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -%% WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -%% NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -%% SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --module(beam_util). - --export([module_export_list/1, filter_arity/3]). - - -%% Module = string() -%% Function = atom() -module_export_list( Module ) -> - {_Module, _Binary, Filename} = code:get_object_code(Module), - case beam_lib:info( Filename ) of - {error, beam_lib, _} -> - false; - [ _ , _ , _ ] -> - case beam_lib:chunks( Filename, [exports]) of - {ok, {_, [{exports, Exports}]}} -> - Exports; - {error, beam_lib, Er} -> - false - end - end. - -%% Module = string() -%% Arity = integer() -%% Exports = list() -filter_arity( Function, Arity, Exports) -> - case lists:filter( - fun( EFName ) -> {Function, Arity} == EFName end, - Exports ) of - [{_, _}] -> true; - [] -> false - end. diff --git a/src/url_util.erl b/src/url_util.erl deleted file mode 100644 index 64140321b..000000000 --- a/src/url_util.erl +++ /dev/null @@ -1,65 +0,0 @@ -%% Author: Romuald du Song -%% Created: 9 oct. 2009 -%% Description: -%% Hacked from Joe Armtrong http://www.erlang.org/examples/small_examples/urlget.erl - --module(url_util). - -%% -%% Include files -%% - -%% -%% Exported Functions -%% --export([parse/1]). - -%% -%% API Functions -%% - -%%---------------------------------------------------------------------- -%% parse(URL) -> {http, Site, Port, File} | -%% {file, File} | {error,Why} -%% (primitive) - -parse([$h,$t,$t,$p,$:,$/,$/|T]) -> parse_http(T, http); -parse([$h,$t,$t,$p,$s,$:,$/,$/|T]) -> parse_http(T, https); -parse([$f,$t,$p,$:,$/,$/|_T]) -> {error, no_ftp}; -parse([$f,$i,$l,$e,$:,$/,$/|F]) -> {file, F}; -parse(_X) -> {error, unknown_url_type}. - - -%% -%% Local Functions -%% - -parse_http(X, Protocol) -> - case string:chr(X, $/) of - 0 -> - %% not terminated by "/" (sigh) - %% try again - parse_http(X ++ "/", Protocol); - N -> - %% The Host is up to the first "/" - %% The file is everything else - Host = string:substr(X, 1, N-1), - File = string:substr(X, N, length(X)), - %% Now check to see if the host name contains a colon - %% i.e. there is an explicit port address in the hostname - case string:chr(Host, $:) of - 0 -> - %% no colon - Port = 80, - {Protocol, Host, Port, File}; - M -> - Site = string:substr(Host,1,M-1), - case (catch list_to_integer( - string:substr(Host, M+1, length(Host)))) of - {'EXIT', _} -> - {Protocol, Site, 80, File}; - Port -> - {Protocol, Site, Port, File} - end - end - end. From d6709bd53a45799c705d48a87b915cf1cc85fd57 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 9 May 2013 21:22:27 +1000 Subject: [PATCH 41/53] Fix --enable-pubsub_ng configuration option --- rebar.config.script | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rebar.config.script b/rebar.config.script index 4301786cd..b826e9dee 100644 --- a/rebar.config.script +++ b/rebar.config.script @@ -114,8 +114,8 @@ CfgPostHooks = lists:flatmap( [] end, Cfg), -Config = [{erl_opts, Includes ++ Macros ++ HiPE ++ DebugInfo}, - {src_dirs, [asn1, src | SrcDirs]}, +Config = [{erl_opts, Includes ++ Macros ++ HiPE ++ DebugInfo ++ + [{src_dirs, [asn1, src | SrcDirs]}]}, {sub_dirs, ["rel"]}, {post_hooks, PostHooks ++ CfgPostHooks}, {deps, Deps ++ CfgDeps}], From bec499a4a1d4010a2d2f1c3577aee342b6d22b18 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Sat, 11 May 2013 15:46:01 +1000 Subject: [PATCH 42/53] Check if all needed Erlang applications are installed --- configure | 773 +++++++++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 19 ++ 2 files changed, 792 insertions(+) diff --git a/configure b/configure index f772762e7..098ce95b2 100755 --- a/configure +++ b/configure @@ -582,6 +582,24 @@ INSTALLUSER MAKE REBAR ESCRIPT +ERLANG_LIB_VER_compiler +ERLANG_LIB_DIR_compiler +ERLANG_LIB_VER_tools +ERLANG_LIB_DIR_tools +ERLANG_LIB_VER_odbc +ERLANG_LIB_DIR_odbc +ERLANG_LIB_VER_inets +ERLANG_LIB_DIR_inets +ERLANG_LIB_VER_mnesia +ERLANG_LIB_DIR_mnesia +ERLANG_LIB_VER_ssl +ERLANG_LIB_DIR_ssl +ERLANG_LIB_VER_public_key +ERLANG_LIB_DIR_public_key +ERLANG_LIB_VER_crypto +ERLANG_LIB_DIR_crypto +ERLANG_LIB_VER_sasl +ERLANG_LIB_DIR_sasl ERLCFLAGS ERLC ERL @@ -1390,6 +1408,48 @@ fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## + +# ac_fn_erl_try_run LINENO +# ------------------------ +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_erl_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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_erl_try_run cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. @@ -2192,6 +2252,719 @@ if test "$ERLC" = "not found"; then fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'sasl' library subdirectory" >&5 +$as_echo_n "checking for Erlang/OTP 'sasl' library subdirectory... " >&6; } +if test "${ac_cv_erlang_lib_dir_sasl+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=erl +ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' +ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' + if test "$cross_compiling" = yes; then : + { { $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 test program while cross compiling +See \`config.log' for more details" "$LINENO" 5 ; } +else + cat > conftest.$ac_ext <<_ACEOF +-module(conftest). +-export([start/0]). + +start() -> + ReturnValue = case code:lib_dir("sasl") of + {error, bad_name} -> + file:write_file("conftest.out", "not found\n"), + 1; + LibDir -> + file:write_file("conftest.out", LibDir), + 0 + end, + halt(ReturnValue) +. + +_ACEOF +if ac_fn_erl_try_run "$LINENO"; then : + ac_cv_erlang_lib_dir_sasl=`cat conftest.out` + rm -f conftest.out +else + if test ! -f conftest.out; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "test Erlang program execution failed +See \`config.log' for more details" "$LINENO" 5 ; } + else + ac_cv_erlang_lib_dir_sasl="not found" + rm -f conftest.out + fi +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +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 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_dir_sasl" >&5 +$as_echo "$ac_cv_erlang_lib_dir_sasl" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'sasl' library version" >&5 +$as_echo_n "checking for Erlang/OTP 'sasl' library version... " >&6; } +if test "${ac_cv_erlang_lib_ver_sasl+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$ac_cv_erlang_lib_dir_sasl" = "not found"; then : + ac_cv_erlang_lib_ver_sasl="not found" +else + ac_cv_erlang_lib_ver_sasl=`$as_echo "$ac_cv_erlang_lib_dir_sasl" | sed -n -e 's,^.*-\([^/-]*\)$,\1,p'` +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_ver_sasl" >&5 +$as_echo "$ac_cv_erlang_lib_ver_sasl" >&6; } +ERLANG_LIB_DIR_sasl=$ac_cv_erlang_lib_dir_sasl + +ERLANG_LIB_VER_sasl=$ac_cv_erlang_lib_ver_sasl + +if test "$ac_cv_erlang_lib_dir_sasl" = "not found"; then : + as_fn_error $? "Erlang application 'sasl' was not found" "$LINENO" 5 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'crypto' library subdirectory" >&5 +$as_echo_n "checking for Erlang/OTP 'crypto' library subdirectory... " >&6; } +if test "${ac_cv_erlang_lib_dir_crypto+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=erl +ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' +ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' + if test "$cross_compiling" = yes; then : + { { $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 test program while cross compiling +See \`config.log' for more details" "$LINENO" 5 ; } +else + cat > conftest.$ac_ext <<_ACEOF +-module(conftest). +-export([start/0]). + +start() -> + ReturnValue = case code:lib_dir("crypto") of + {error, bad_name} -> + file:write_file("conftest.out", "not found\n"), + 1; + LibDir -> + file:write_file("conftest.out", LibDir), + 0 + end, + halt(ReturnValue) +. + +_ACEOF +if ac_fn_erl_try_run "$LINENO"; then : + ac_cv_erlang_lib_dir_crypto=`cat conftest.out` + rm -f conftest.out +else + if test ! -f conftest.out; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "test Erlang program execution failed +See \`config.log' for more details" "$LINENO" 5 ; } + else + ac_cv_erlang_lib_dir_crypto="not found" + rm -f conftest.out + fi +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +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 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_dir_crypto" >&5 +$as_echo "$ac_cv_erlang_lib_dir_crypto" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'crypto' library version" >&5 +$as_echo_n "checking for Erlang/OTP 'crypto' library version... " >&6; } +if test "${ac_cv_erlang_lib_ver_crypto+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$ac_cv_erlang_lib_dir_crypto" = "not found"; then : + ac_cv_erlang_lib_ver_crypto="not found" +else + ac_cv_erlang_lib_ver_crypto=`$as_echo "$ac_cv_erlang_lib_dir_crypto" | sed -n -e 's,^.*-\([^/-]*\)$,\1,p'` +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_ver_crypto" >&5 +$as_echo "$ac_cv_erlang_lib_ver_crypto" >&6; } +ERLANG_LIB_DIR_crypto=$ac_cv_erlang_lib_dir_crypto + +ERLANG_LIB_VER_crypto=$ac_cv_erlang_lib_ver_crypto + +if test "$ac_cv_erlang_lib_dir_crypto" = "not found"; then : + as_fn_error $? "Erlang application 'crypto' was not found" "$LINENO" 5 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'public_key' library subdirectory" >&5 +$as_echo_n "checking for Erlang/OTP 'public_key' library subdirectory... " >&6; } +if test "${ac_cv_erlang_lib_dir_public_key+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=erl +ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' +ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' + if test "$cross_compiling" = yes; then : + { { $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 test program while cross compiling +See \`config.log' for more details" "$LINENO" 5 ; } +else + cat > conftest.$ac_ext <<_ACEOF +-module(conftest). +-export([start/0]). + +start() -> + ReturnValue = case code:lib_dir("public_key") of + {error, bad_name} -> + file:write_file("conftest.out", "not found\n"), + 1; + LibDir -> + file:write_file("conftest.out", LibDir), + 0 + end, + halt(ReturnValue) +. + +_ACEOF +if ac_fn_erl_try_run "$LINENO"; then : + ac_cv_erlang_lib_dir_public_key=`cat conftest.out` + rm -f conftest.out +else + if test ! -f conftest.out; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "test Erlang program execution failed +See \`config.log' for more details" "$LINENO" 5 ; } + else + ac_cv_erlang_lib_dir_public_key="not found" + rm -f conftest.out + fi +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +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 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_dir_public_key" >&5 +$as_echo "$ac_cv_erlang_lib_dir_public_key" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'public_key' library version" >&5 +$as_echo_n "checking for Erlang/OTP 'public_key' library version... " >&6; } +if test "${ac_cv_erlang_lib_ver_public_key+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$ac_cv_erlang_lib_dir_public_key" = "not found"; then : + ac_cv_erlang_lib_ver_public_key="not found" +else + ac_cv_erlang_lib_ver_public_key=`$as_echo "$ac_cv_erlang_lib_dir_public_key" | sed -n -e 's,^.*-\([^/-]*\)$,\1,p'` +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_ver_public_key" >&5 +$as_echo "$ac_cv_erlang_lib_ver_public_key" >&6; } +ERLANG_LIB_DIR_public_key=$ac_cv_erlang_lib_dir_public_key + +ERLANG_LIB_VER_public_key=$ac_cv_erlang_lib_ver_public_key + +if test "$ac_cv_erlang_lib_dir_public_key" = "not found"; then : + as_fn_error $? "Erlang application 'public_key' was not found" "$LINENO" 5 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'ssl' library subdirectory" >&5 +$as_echo_n "checking for Erlang/OTP 'ssl' library subdirectory... " >&6; } +if test "${ac_cv_erlang_lib_dir_ssl+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=erl +ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' +ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' + if test "$cross_compiling" = yes; then : + { { $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 test program while cross compiling +See \`config.log' for more details" "$LINENO" 5 ; } +else + cat > conftest.$ac_ext <<_ACEOF +-module(conftest). +-export([start/0]). + +start() -> + ReturnValue = case code:lib_dir("ssl") of + {error, bad_name} -> + file:write_file("conftest.out", "not found\n"), + 1; + LibDir -> + file:write_file("conftest.out", LibDir), + 0 + end, + halt(ReturnValue) +. + +_ACEOF +if ac_fn_erl_try_run "$LINENO"; then : + ac_cv_erlang_lib_dir_ssl=`cat conftest.out` + rm -f conftest.out +else + if test ! -f conftest.out; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "test Erlang program execution failed +See \`config.log' for more details" "$LINENO" 5 ; } + else + ac_cv_erlang_lib_dir_ssl="not found" + rm -f conftest.out + fi +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +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 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_dir_ssl" >&5 +$as_echo "$ac_cv_erlang_lib_dir_ssl" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'ssl' library version" >&5 +$as_echo_n "checking for Erlang/OTP 'ssl' library version... " >&6; } +if test "${ac_cv_erlang_lib_ver_ssl+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$ac_cv_erlang_lib_dir_ssl" = "not found"; then : + ac_cv_erlang_lib_ver_ssl="not found" +else + ac_cv_erlang_lib_ver_ssl=`$as_echo "$ac_cv_erlang_lib_dir_ssl" | sed -n -e 's,^.*-\([^/-]*\)$,\1,p'` +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_ver_ssl" >&5 +$as_echo "$ac_cv_erlang_lib_ver_ssl" >&6; } +ERLANG_LIB_DIR_ssl=$ac_cv_erlang_lib_dir_ssl + +ERLANG_LIB_VER_ssl=$ac_cv_erlang_lib_ver_ssl + +if test "$ac_cv_erlang_lib_dir_ssl" = "not found"; then : + as_fn_error $? "Erlang application 'ssl' was not found" "$LINENO" 5 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'mnesia' library subdirectory" >&5 +$as_echo_n "checking for Erlang/OTP 'mnesia' library subdirectory... " >&6; } +if test "${ac_cv_erlang_lib_dir_mnesia+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=erl +ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' +ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' + if test "$cross_compiling" = yes; then : + { { $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 test program while cross compiling +See \`config.log' for more details" "$LINENO" 5 ; } +else + cat > conftest.$ac_ext <<_ACEOF +-module(conftest). +-export([start/0]). + +start() -> + ReturnValue = case code:lib_dir("mnesia") of + {error, bad_name} -> + file:write_file("conftest.out", "not found\n"), + 1; + LibDir -> + file:write_file("conftest.out", LibDir), + 0 + end, + halt(ReturnValue) +. + +_ACEOF +if ac_fn_erl_try_run "$LINENO"; then : + ac_cv_erlang_lib_dir_mnesia=`cat conftest.out` + rm -f conftest.out +else + if test ! -f conftest.out; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "test Erlang program execution failed +See \`config.log' for more details" "$LINENO" 5 ; } + else + ac_cv_erlang_lib_dir_mnesia="not found" + rm -f conftest.out + fi +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +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 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_dir_mnesia" >&5 +$as_echo "$ac_cv_erlang_lib_dir_mnesia" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'mnesia' library version" >&5 +$as_echo_n "checking for Erlang/OTP 'mnesia' library version... " >&6; } +if test "${ac_cv_erlang_lib_ver_mnesia+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$ac_cv_erlang_lib_dir_mnesia" = "not found"; then : + ac_cv_erlang_lib_ver_mnesia="not found" +else + ac_cv_erlang_lib_ver_mnesia=`$as_echo "$ac_cv_erlang_lib_dir_mnesia" | sed -n -e 's,^.*-\([^/-]*\)$,\1,p'` +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_ver_mnesia" >&5 +$as_echo "$ac_cv_erlang_lib_ver_mnesia" >&6; } +ERLANG_LIB_DIR_mnesia=$ac_cv_erlang_lib_dir_mnesia + +ERLANG_LIB_VER_mnesia=$ac_cv_erlang_lib_ver_mnesia + +if test "$ac_cv_erlang_lib_dir_mnesia" = "not found"; then : + as_fn_error $? "Erlang application 'mnesia' was not found" "$LINENO" 5 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'inets' library subdirectory" >&5 +$as_echo_n "checking for Erlang/OTP 'inets' library subdirectory... " >&6; } +if test "${ac_cv_erlang_lib_dir_inets+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=erl +ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' +ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' + if test "$cross_compiling" = yes; then : + { { $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 test program while cross compiling +See \`config.log' for more details" "$LINENO" 5 ; } +else + cat > conftest.$ac_ext <<_ACEOF +-module(conftest). +-export([start/0]). + +start() -> + ReturnValue = case code:lib_dir("inets") of + {error, bad_name} -> + file:write_file("conftest.out", "not found\n"), + 1; + LibDir -> + file:write_file("conftest.out", LibDir), + 0 + end, + halt(ReturnValue) +. + +_ACEOF +if ac_fn_erl_try_run "$LINENO"; then : + ac_cv_erlang_lib_dir_inets=`cat conftest.out` + rm -f conftest.out +else + if test ! -f conftest.out; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "test Erlang program execution failed +See \`config.log' for more details" "$LINENO" 5 ; } + else + ac_cv_erlang_lib_dir_inets="not found" + rm -f conftest.out + fi +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +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 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_dir_inets" >&5 +$as_echo "$ac_cv_erlang_lib_dir_inets" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'inets' library version" >&5 +$as_echo_n "checking for Erlang/OTP 'inets' library version... " >&6; } +if test "${ac_cv_erlang_lib_ver_inets+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$ac_cv_erlang_lib_dir_inets" = "not found"; then : + ac_cv_erlang_lib_ver_inets="not found" +else + ac_cv_erlang_lib_ver_inets=`$as_echo "$ac_cv_erlang_lib_dir_inets" | sed -n -e 's,^.*-\([^/-]*\)$,\1,p'` +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_ver_inets" >&5 +$as_echo "$ac_cv_erlang_lib_ver_inets" >&6; } +ERLANG_LIB_DIR_inets=$ac_cv_erlang_lib_dir_inets + +ERLANG_LIB_VER_inets=$ac_cv_erlang_lib_ver_inets + +if test "$ac_cv_erlang_lib_dir_inets" = "not found"; then : + as_fn_error $? "Erlang application 'inets' was not found" "$LINENO" 5 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'odbc' library subdirectory" >&5 +$as_echo_n "checking for Erlang/OTP 'odbc' library subdirectory... " >&6; } +if test "${ac_cv_erlang_lib_dir_odbc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=erl +ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' +ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' + if test "$cross_compiling" = yes; then : + { { $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 test program while cross compiling +See \`config.log' for more details" "$LINENO" 5 ; } +else + cat > conftest.$ac_ext <<_ACEOF +-module(conftest). +-export([start/0]). + +start() -> + ReturnValue = case code:lib_dir("odbc") of + {error, bad_name} -> + file:write_file("conftest.out", "not found\n"), + 1; + LibDir -> + file:write_file("conftest.out", LibDir), + 0 + end, + halt(ReturnValue) +. + +_ACEOF +if ac_fn_erl_try_run "$LINENO"; then : + ac_cv_erlang_lib_dir_odbc=`cat conftest.out` + rm -f conftest.out +else + if test ! -f conftest.out; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "test Erlang program execution failed +See \`config.log' for more details" "$LINENO" 5 ; } + else + ac_cv_erlang_lib_dir_odbc="not found" + rm -f conftest.out + fi +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +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 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_dir_odbc" >&5 +$as_echo "$ac_cv_erlang_lib_dir_odbc" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'odbc' library version" >&5 +$as_echo_n "checking for Erlang/OTP 'odbc' library version... " >&6; } +if test "${ac_cv_erlang_lib_ver_odbc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$ac_cv_erlang_lib_dir_odbc" = "not found"; then : + ac_cv_erlang_lib_ver_odbc="not found" +else + ac_cv_erlang_lib_ver_odbc=`$as_echo "$ac_cv_erlang_lib_dir_odbc" | sed -n -e 's,^.*-\([^/-]*\)$,\1,p'` +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_ver_odbc" >&5 +$as_echo "$ac_cv_erlang_lib_ver_odbc" >&6; } +ERLANG_LIB_DIR_odbc=$ac_cv_erlang_lib_dir_odbc + +ERLANG_LIB_VER_odbc=$ac_cv_erlang_lib_ver_odbc + +if test "$ac_cv_erlang_lib_dir_odbc" = "not found"; then : + as_fn_error $? "Erlang application 'odbc' was not found" "$LINENO" 5 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'tools' library subdirectory" >&5 +$as_echo_n "checking for Erlang/OTP 'tools' library subdirectory... " >&6; } +if test "${ac_cv_erlang_lib_dir_tools+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=erl +ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' +ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' + if test "$cross_compiling" = yes; then : + { { $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 test program while cross compiling +See \`config.log' for more details" "$LINENO" 5 ; } +else + cat > conftest.$ac_ext <<_ACEOF +-module(conftest). +-export([start/0]). + +start() -> + ReturnValue = case code:lib_dir("tools") of + {error, bad_name} -> + file:write_file("conftest.out", "not found\n"), + 1; + LibDir -> + file:write_file("conftest.out", LibDir), + 0 + end, + halt(ReturnValue) +. + +_ACEOF +if ac_fn_erl_try_run "$LINENO"; then : + ac_cv_erlang_lib_dir_tools=`cat conftest.out` + rm -f conftest.out +else + if test ! -f conftest.out; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "test Erlang program execution failed +See \`config.log' for more details" "$LINENO" 5 ; } + else + ac_cv_erlang_lib_dir_tools="not found" + rm -f conftest.out + fi +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +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 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_dir_tools" >&5 +$as_echo "$ac_cv_erlang_lib_dir_tools" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'tools' library version" >&5 +$as_echo_n "checking for Erlang/OTP 'tools' library version... " >&6; } +if test "${ac_cv_erlang_lib_ver_tools+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$ac_cv_erlang_lib_dir_tools" = "not found"; then : + ac_cv_erlang_lib_ver_tools="not found" +else + ac_cv_erlang_lib_ver_tools=`$as_echo "$ac_cv_erlang_lib_dir_tools" | sed -n -e 's,^.*-\([^/-]*\)$,\1,p'` +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_ver_tools" >&5 +$as_echo "$ac_cv_erlang_lib_ver_tools" >&6; } +ERLANG_LIB_DIR_tools=$ac_cv_erlang_lib_dir_tools + +ERLANG_LIB_VER_tools=$ac_cv_erlang_lib_ver_tools + +if test "$ac_cv_erlang_lib_dir_tools" = "not found"; then : + as_fn_error $? "Erlang application 'tools' was not found" "$LINENO" 5 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'compiler' library subdirectory" >&5 +$as_echo_n "checking for Erlang/OTP 'compiler' library subdirectory... " >&6; } +if test "${ac_cv_erlang_lib_dir_compiler+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=erl +ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' +ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' + if test "$cross_compiling" = yes; then : + { { $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 test program while cross compiling +See \`config.log' for more details" "$LINENO" 5 ; } +else + cat > conftest.$ac_ext <<_ACEOF +-module(conftest). +-export([start/0]). + +start() -> + ReturnValue = case code:lib_dir("compiler") of + {error, bad_name} -> + file:write_file("conftest.out", "not found\n"), + 1; + LibDir -> + file:write_file("conftest.out", LibDir), + 0 + end, + halt(ReturnValue) +. + +_ACEOF +if ac_fn_erl_try_run "$LINENO"; then : + ac_cv_erlang_lib_dir_compiler=`cat conftest.out` + rm -f conftest.out +else + if test ! -f conftest.out; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "test Erlang program execution failed +See \`config.log' for more details" "$LINENO" 5 ; } + else + ac_cv_erlang_lib_dir_compiler="not found" + rm -f conftest.out + fi +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +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 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_dir_compiler" >&5 +$as_echo "$ac_cv_erlang_lib_dir_compiler" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'compiler' library version" >&5 +$as_echo_n "checking for Erlang/OTP 'compiler' library version... " >&6; } +if test "${ac_cv_erlang_lib_ver_compiler+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$ac_cv_erlang_lib_dir_compiler" = "not found"; then : + ac_cv_erlang_lib_ver_compiler="not found" +else + ac_cv_erlang_lib_ver_compiler=`$as_echo "$ac_cv_erlang_lib_dir_compiler" | sed -n -e 's,^.*-\([^/-]*\)$,\1,p'` +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_ver_compiler" >&5 +$as_echo "$ac_cv_erlang_lib_ver_compiler" >&6; } +ERLANG_LIB_DIR_compiler=$ac_cv_erlang_lib_dir_compiler + +ERLANG_LIB_VER_compiler=$ac_cv_erlang_lib_ver_compiler + +if test "$ac_cv_erlang_lib_dir_compiler" = "not found"; then : + as_fn_error $? "Erlang application 'compiler' was not found" "$LINENO" 5 +fi + + # Checks and sets ERLANG_ROOT_DIR and ERLANG_LIB_DIR variable # AC_ERLANG_SUBST_ROOT_DIR # AC_ERLANG_SUBST_LIB_DIR diff --git a/configure.ac b/configure.ac index da82e2d6d..e62a2353d 100644 --- a/configure.ac +++ b/configure.ac @@ -18,6 +18,25 @@ fi AC_ERLANG_NEED_ERL AC_ERLANG_NEED_ERLC +AC_ERLANG_CHECK_LIB([sasl], [], + [AC_MSG_ERROR([Erlang application 'sasl' was not found])]) +AC_ERLANG_CHECK_LIB([crypto], [], + [AC_MSG_ERROR([Erlang application 'crypto' was not found])]) +AC_ERLANG_CHECK_LIB([public_key], [], + [AC_MSG_ERROR([Erlang application 'public_key' was not found])]) +AC_ERLANG_CHECK_LIB([ssl], [], + [AC_MSG_ERROR([Erlang application 'ssl' was not found])]) +AC_ERLANG_CHECK_LIB([mnesia], [], + [AC_MSG_ERROR([Erlang application 'mnesia' was not found])]) +AC_ERLANG_CHECK_LIB([inets], [], + [AC_MSG_ERROR([Erlang application 'inets' was not found])]) +AC_ERLANG_CHECK_LIB([odbc], [], + [AC_MSG_ERROR([Erlang application 'odbc' was not found])]) +AC_ERLANG_CHECK_LIB([tools], [], + [AC_MSG_ERROR([Erlang application 'tools' was not found])]) +AC_ERLANG_CHECK_LIB([compiler], [], + [AC_MSG_ERROR([Erlang application 'compiler' was not found])]) + # Checks and sets ERLANG_ROOT_DIR and ERLANG_LIB_DIR variable # AC_ERLANG_SUBST_ROOT_DIR # AC_ERLANG_SUBST_LIB_DIR From 170874e115c7644d1246172ff9539105836a73fc Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Sat, 11 May 2013 20:53:51 +1000 Subject: [PATCH 43/53] Fix PubSub NG compilation --- mod_pubsub_ng/exmpp_pubsub.erl | 18 +++++++++--------- mod_pubsub_ng/node_flat_dev.erl | 1 - mod_pubsub_ng/pubsub_db.erl | 1 - mod_pubsub_ng/pubsub_dev.hrl | 1 + mod_pubsub_ng/pubsub_groups.erl | 8 ++++---- 5 files changed, 14 insertions(+), 15 deletions(-) diff --git a/mod_pubsub_ng/exmpp_pubsub.erl b/mod_pubsub_ng/exmpp_pubsub.erl index 9486cbd8d..f7d4d2ad6 100644 --- a/mod_pubsub_ng/exmpp_pubsub.erl +++ b/mod_pubsub_ng/exmpp_pubsub.erl @@ -273,15 +273,15 @@ Subscription_Options :: []} ). --type(subscription() - :: {Subscription_State :: exmpp_pubsub:subscription_state(), - SubId :: exmpp_pubsub:subId(), - Resource :: undefined | xmpp_jid:resource_jid() | {'caps', xmpp_jid:resource_jid()}, - Subscription_Options :: [] | pubsub_options:options_subscription()} -%% :: exmpp_pubsub:subscription_subscribed() -%% | exmpp_pubsub:subscription_pending() -%% | exmpp_pubsub:subscription_unconfigured() -). +%% -type(subscription() +%% :: {Subscription_State :: exmpp_pubsub:subscription_state(), +%% SubId :: exmpp_pubsub:subId(), +%% Resource :: undefined | xmpp_jid:resource_jid() | {'caps', xmpp_jid:resource_jid()}, +%% Subscription_Options :: [] | pubsub_options:options_subscription()} +%% %% :: exmpp_pubsub:subscription_subscribed() +%% %% | exmpp_pubsub:subscription_pending() +%% %% | exmpp_pubsub:subscription_unconfigured() +%% ). -type(subscriptions() :: [exmpp_pubsub:subscription(),...] diff --git a/mod_pubsub_ng/node_flat_dev.erl b/mod_pubsub_ng/node_flat_dev.erl index f8cdcb5ea..27c02c109 100644 --- a/mod_pubsub_ng/node_flat_dev.erl +++ b/mod_pubsub_ng/node_flat_dev.erl @@ -29,7 +29,6 @@ -include("pubsub_dev.hrl"). -include("pubsub_api.hrl"). --include("logger.hrl"). -compile(export_all). diff --git a/mod_pubsub_ng/pubsub_db.erl b/mod_pubsub_ng/pubsub_db.erl index 1a9ea53de..37e8e4473 100644 --- a/mod_pubsub_ng/pubsub_db.erl +++ b/mod_pubsub_ng/pubsub_db.erl @@ -31,7 +31,6 @@ -include("pubsub_dev.hrl"). -include("pubsub_api.hrl"). --include("logger.hrl"). -import(pubsub_tools, diff --git a/mod_pubsub_ng/pubsub_dev.hrl b/mod_pubsub_ng/pubsub_dev.hrl index 9a695ca16..e2c873b1e 100644 --- a/mod_pubsub_ng/pubsub_dev.hrl +++ b/mod_pubsub_ng/pubsub_dev.hrl @@ -2,6 +2,7 @@ %-include_lib("exmpp/include/exmpp.hrl"). %-include_lib("exmpp/include/exmpp_jid.hrl"). +-include("logger.hrl"). -include("ejabberd.hrl"). -include("mod_roster.hrl"). -include("jlib.hrl"). diff --git a/mod_pubsub_ng/pubsub_groups.erl b/mod_pubsub_ng/pubsub_groups.erl index 79270637a..622094401 100644 --- a/mod_pubsub_ng/pubsub_groups.erl +++ b/mod_pubsub_ng/pubsub_groups.erl @@ -76,10 +76,10 @@ -type(n0des() :: [Node::n0de(),...]). --type(subscription() - :: {NodeIdx :: exmpp_pubsub:nodeIdx(), - Groups :: roster_groups()} -). +%% -type(subscription() +%% :: {NodeIdx :: exmpp_pubsub:nodeIdx(), +%% Groups :: roster_groups()} +%% ). -type(subscriptions() :: [Subscription::subscription(),...]). From f364fcda5665847add2f34fce30ad0edf0544baa Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Sun, 12 May 2013 14:13:16 +1000 Subject: [PATCH 44/53] Add --enable-tools configure option --- configure | 986 ++++++++++++++++++++----------------- configure.ac | 51 +- rebar.config.script | 2 + rel/reltool.config.script | 13 +- {src => tools}/p1_prof.erl | 0 vars.config.in | 1 + 6 files changed, 589 insertions(+), 464 deletions(-) rename {src => tools}/p1_prof.erl (100%) diff --git a/configure b/configure index 098ce95b2..f3b2b9011 100755 --- a/configure +++ b/configure @@ -560,6 +560,7 @@ PACKAGE_URL='' ac_default_prefix=/ ac_subst_vars='LTLIBOBJS LIBOBJS +tools http pubsub_ng debug @@ -578,14 +579,12 @@ transient_supervisors flash_hack roster_gateway_workaround hipe -INSTALLUSER -MAKE -REBAR -ESCRIPT -ERLANG_LIB_VER_compiler -ERLANG_LIB_DIR_compiler +ERLANG_LIB_VER_runtime_tools +ERLANG_LIB_DIR_runtime_tools ERLANG_LIB_VER_tools ERLANG_LIB_DIR_tools +ERLANG_LIB_VER_compiler +ERLANG_LIB_DIR_compiler ERLANG_LIB_VER_odbc ERLANG_LIB_DIR_odbc ERLANG_LIB_VER_inets @@ -600,6 +599,10 @@ ERLANG_LIB_VER_crypto ERLANG_LIB_DIR_crypto ERLANG_LIB_VER_sasl ERLANG_LIB_DIR_sasl +INSTALLUSER +MAKE +REBAR +ESCRIPT ERLCFLAGS ERLC ERL @@ -667,6 +670,7 @@ enable_iconv enable_debug enable_pubsub_ng enable_http +enable_tools enable_all enable_user ' @@ -1315,6 +1319,8 @@ Optional Features: --enable-pubsub_ng enable PubSub NG (default: no) --enable-http build external HTTP libraries ('ibrowse' and 'lhttpc', default: no) + --enable-tools build development tools (currently the ejabberd + profiler only, default: no) --enable-all same as --enable-nif --enable-mysql --enable-pgsql --enable-pam --enable-zlib --enable-stun --enable-riak --enable-json --enable-iconv @@ -2252,6 +2258,402 @@ if test "$ERLC" = "not found"; then fi +# Checks and sets ERLANG_ROOT_DIR and ERLANG_LIB_DIR variable +# AC_ERLANG_SUBST_ROOT_DIR +# AC_ERLANG_SUBST_LIB_DIR + +#locating escript +# Extract the first word of "escript", so it can be a program name with args. +set dummy escript; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_ESCRIPT+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $ESCRIPT in + [\\/]* | ?:[\\/]*) + ac_cv_path_ESCRIPT="$ESCRIPT" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ESCRIPT="$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 +ESCRIPT=$ac_cv_path_ESCRIPT +if test -n "$ESCRIPT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ESCRIPT" >&5 +$as_echo "$ESCRIPT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +#locating rebar +# Extract the first word of "rebar", so it can be a program name with args. +set dummy rebar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_REBAR+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $REBAR in + [\\/]* | ?:[\\/]*) + ac_cv_path_REBAR="$REBAR" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_REBAR="$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 + + test -z "$ac_cv_path_REBAR" && ac_cv_path_REBAR="./rebar" + ;; +esac +fi +REBAR=$ac_cv_path_REBAR +if test -n "$REBAR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $REBAR" >&5 +$as_echo "$REBAR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +#locating make +# Extract the first word of "make", so it can be a program name with args. +set dummy make; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_MAKE+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MAKE"; then + ac_cv_prog_MAKE="$MAKE" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_MAKE="make" + $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 +MAKE=$ac_cv_prog_MAKE +if test -n "$MAKE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAKE" >&5 +$as_echo "$MAKE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +if test "x$ESCRIPT" = "x"; then + as_fn_error $? "'escript' was not found" "$LINENO" 5 +fi + +if test "x$MAKE" = "x"; then + as_fn_error $? "'make' was not found" "$LINENO" 5 +fi + +# Change default prefix + + +# Check whether --enable-hipe was given. +if test "${enable_hipe+set}" = set; then : + enableval=$enable_hipe; case "${enableval}" in + yes) hipe=true ;; + no) hipe=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-hipe" "$LINENO" 5 ;; +esac +else + hipe=false +fi + + +# Check whether --enable-roster_gateway_workaround was given. +if test "${enable_roster_gateway_workaround+set}" = set; then : + enableval=$enable_roster_gateway_workaround; case "${enableval}" in + yes) roster_gateway_workaround=true ;; + no) roster_gateway_workaround=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-roster-gateway-workaround" "$LINENO" 5 ;; +esac +else + roster_gateway_workaround=false +fi + + +# Check whether --enable-flash_hack was given. +if test "${enable_flash_hack+set}" = set; then : + enableval=$enable_flash_hack; case "${enableval}" in + yes) flash_hack=true ;; + no) flash_hack=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-flash-hack" "$LINENO" 5 ;; +esac +else + flash_hack=false +fi + + +# Check whether --enable-transient_supervisors was given. +if test "${enable_transient_supervisors+set}" = set; then : + enableval=$enable_transient_supervisors; case "${enableval}" in + yes) transient_supervisors=true ;; + no) transient_supervisors=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-transient_supervisors" "$LINENO" 5 ;; +esac +else + transient_supervisors=false +fi + + +# Check whether --enable-full_xml was given. +if test "${enable_full_xml+set}" = set; then : + enableval=$enable_full_xml; case "${enableval}" in + yes) full_xml=true ;; + no) full_xml=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-full-xml" "$LINENO" 5 ;; +esac +else + full_xml=false +fi + + +# Check whether --enable-nif was given. +if test "${enable_nif+set}" = set; then : + enableval=$enable_nif; case "${enableval}" in + yes) nif=true ;; + no) nif=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-nif" "$LINENO" 5 ;; +esac +else + nif=false +fi + + +# Check whether --enable-mssql was given. +if test "${enable_mssql+set}" = set; then : + enableval=$enable_mssql; case "${enableval}" in + yes) db_type=mssql ;; + no) db_type=generic ;; + *) as_fn_error $? "bad value ${enableval} for --enable-mssql" "$LINENO" 5 ;; +esac +else + db_type=generic +fi + + +# Check whether --enable-mysql was given. +if test "${enable_mysql+set}" = set; then : + enableval=$enable_mysql; case "${enableval}" in + yes) mysql=true ;; + no) mysql=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-mysql" "$LINENO" 5 ;; +esac +else + mysql=false +fi + + +# Check whether --enable-pgsql was given. +if test "${enable_pgsql+set}" = set; then : + enableval=$enable_pgsql; case "${enableval}" in + yes) pgsql=true ;; + no) pgsql=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-pgsql" "$LINENO" 5 ;; +esac +else + pgsql=false +fi + + +# Check whether --enable-pam was given. +if test "${enable_pam+set}" = set; then : + enableval=$enable_pam; case "${enableval}" in + yes) pam=true ;; + no) pam=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-pam" "$LINENO" 5 ;; +esac +else + pam=false +fi + + +# Check whether --enable-zlib was given. +if test "${enable_zlib+set}" = set; then : + enableval=$enable_zlib; case "${enableval}" in + yes) zlib=true ;; + no) zlib=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-zlib" "$LINENO" 5 ;; +esac +else + zlib=true +fi + + +# Check whether --enable-stun was given. +if test "${enable_stun+set}" = set; then : + enableval=$enable_stun; case "${enableval}" in + yes) stun=true ;; + no) stun=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-stun" "$LINENO" 5 ;; +esac +else + stun=false +fi + + +# Check whether --enable-riak was given. +if test "${enable_riak+set}" = set; then : + enableval=$enable_riak; case "${enableval}" in + yes) riak=true ;; + no) riak=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-riak" "$LINENO" 5 ;; +esac +else + riak=false +fi + + +# Check whether --enable-json was given. +if test "${enable_json+set}" = set; then : + enableval=$enable_json; case "${enableval}" in + yes) json=true ;; + no) json=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-json" "$LINENO" 5 ;; +esac +else + json=false +fi + + +# Check whether --enable-iconv was given. +if test "${enable_iconv+set}" = set; then : + enableval=$enable_iconv; case "${enableval}" in + yes) iconv=true ;; + no) iconv=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-iconv" "$LINENO" 5 ;; +esac +else + iconv=false +fi + + +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; case "${enableval}" in + yes) debug=true ;; + no) debug=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; +esac +else + debug=true +fi + + +# Check whether --enable-pubsub_ng was given. +if test "${enable_pubsub_ng+set}" = set; then : + enableval=$enable_pubsub_ng; case "${enableval}" in + yes) pubsub_ng=true ;; + no) pubsub_ng=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-pubsub_ng" "$LINENO" 5 ;; +esac +else + pubsub_ng=false +fi + + +# Check whether --enable-http was given. +if test "${enable_http+set}" = set; then : + enableval=$enable_http; case "${enableval}" in + yes) http=true ;; + no) http=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-http" "$LINENO" 5 ;; +esac +else + http=false +fi + + +# Check whether --enable-tools was given. +if test "${enable_tools+set}" = set; then : + enableval=$enable_tools; case "${enableval}" in + yes) tools=true ;; + no) tools=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-tools" "$LINENO" 5 ;; +esac +else + tools=false +fi + + +# Check whether --enable-all was given. +if test "${enable_all+set}" = set; then : + enableval=$enable_all; case "${enableval}" in + yes) nif=true mysql=true pgsql=true pam=true zlib=true stun=true riak=true json=true iconv=true debug=true pubsub_ng=true http=true ;; + no) nif=false mysql=false pgsql=false pam=false zlib=false stun=false riak=false json=false iconv=false debug=false pubsub_ng=false http=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-all" "$LINENO" 5 ;; +esac +fi + + +ac_config_files="$ac_config_files Makefile vars.config src/ejabberd.app.src" + + +ENABLEUSER="" +# Check whether --enable-user was given. +if test "${enable_user+set}" = set; then : + enableval=$enable_user; case "${enableval}" in + yes) ENABLEUSER=`whoami` ;; + no) ENABLEUSER="" ;; + *) ENABLEUSER=$enableval + esac +fi + +if test "$ENABLEUSER" != ""; then + echo "allow this system user to start ejabberd: $ENABLEUSER" + INSTALLUSER=$ENABLEUSER + +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'sasl' library subdirectory" >&5 $as_echo_n "checking for Erlang/OTP 'sasl' library subdirectory... " >&6; } @@ -2806,85 +3208,6 @@ if test "$ac_cv_erlang_lib_dir_odbc" = "not found"; then : as_fn_error $? "Erlang application 'odbc' was not found" "$LINENO" 5 fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'tools' library subdirectory" >&5 -$as_echo_n "checking for Erlang/OTP 'tools' library subdirectory... " >&6; } -if test "${ac_cv_erlang_lib_dir_tools+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_ext=erl -ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' -ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' - if test "$cross_compiling" = yes; then : - { { $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 test program while cross compiling -See \`config.log' for more details" "$LINENO" 5 ; } -else - cat > conftest.$ac_ext <<_ACEOF --module(conftest). --export([start/0]). - -start() -> - ReturnValue = case code:lib_dir("tools") of - {error, bad_name} -> - file:write_file("conftest.out", "not found\n"), - 1; - LibDir -> - file:write_file("conftest.out", LibDir), - 0 - end, - halt(ReturnValue) -. - -_ACEOF -if ac_fn_erl_try_run "$LINENO"; then : - ac_cv_erlang_lib_dir_tools=`cat conftest.out` - rm -f conftest.out -else - if test ! -f conftest.out; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "test Erlang program execution failed -See \`config.log' for more details" "$LINENO" 5 ; } - else - ac_cv_erlang_lib_dir_tools="not found" - rm -f conftest.out - fi -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -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 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_dir_tools" >&5 -$as_echo "$ac_cv_erlang_lib_dir_tools" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'tools' library version" >&5 -$as_echo_n "checking for Erlang/OTP 'tools' library version... " >&6; } -if test "${ac_cv_erlang_lib_ver_tools+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "$ac_cv_erlang_lib_dir_tools" = "not found"; then : - ac_cv_erlang_lib_ver_tools="not found" -else - ac_cv_erlang_lib_ver_tools=`$as_echo "$ac_cv_erlang_lib_dir_tools" | sed -n -e 's,^.*-\([^/-]*\)$,\1,p'` -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_ver_tools" >&5 -$as_echo "$ac_cv_erlang_lib_ver_tools" >&6; } -ERLANG_LIB_DIR_tools=$ac_cv_erlang_lib_dir_tools - -ERLANG_LIB_VER_tools=$ac_cv_erlang_lib_ver_tools - -if test "$ac_cv_erlang_lib_dir_tools" = "not found"; then : - as_fn_error $? "Erlang application 'tools' was not found" "$LINENO" 5 -fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'compiler' library subdirectory" >&5 $as_echo_n "checking for Erlang/OTP 'compiler' library subdirectory... " >&6; } if test "${ac_cv_erlang_lib_dir_compiler+set}" = set; then : @@ -2964,391 +3287,168 @@ if test "$ac_cv_erlang_lib_dir_compiler" = "not found"; then : as_fn_error $? "Erlang application 'compiler' was not found" "$LINENO" 5 fi - -# Checks and sets ERLANG_ROOT_DIR and ERLANG_LIB_DIR variable -# AC_ERLANG_SUBST_ROOT_DIR -# AC_ERLANG_SUBST_LIB_DIR - -#locating escript -# Extract the first word of "escript", so it can be a program name with args. -set dummy escript; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ESCRIPT+set}" = set; then : +if test "x$tools" = "xtrue"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'tools' library subdirectory" >&5 +$as_echo_n "checking for Erlang/OTP 'tools' library subdirectory... " >&6; } +if test "${ac_cv_erlang_lib_dir_tools+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $ESCRIPT in - [\\/]* | ?:[\\/]*) - ac_cv_path_ESCRIPT="$ESCRIPT" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_ESCRIPT="$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 -ESCRIPT=$ac_cv_path_ESCRIPT -if test -n "$ESCRIPT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ESCRIPT" >&5 -$as_echo "$ESCRIPT" >&6; } + ac_ext=erl +ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' +ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' + if test "$cross_compiling" = yes; then : + { { $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 test program while cross compiling +See \`config.log' for more details" "$LINENO" 5 ; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + cat > conftest.$ac_ext <<_ACEOF +-module(conftest). +-export([start/0]). + +start() -> + ReturnValue = case code:lib_dir("tools") of + {error, bad_name} -> + file:write_file("conftest.out", "not found\n"), + 1; + LibDir -> + file:write_file("conftest.out", LibDir), + 0 + end, + halt(ReturnValue) +. + +_ACEOF +if ac_fn_erl_try_run "$LINENO"; then : + ac_cv_erlang_lib_dir_tools=`cat conftest.out` + rm -f conftest.out +else + if test ! -f conftest.out; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "test Erlang program execution failed +See \`config.log' for more details" "$LINENO" 5 ; } + else + ac_cv_erlang_lib_dir_tools="not found" + rm -f conftest.out + fi +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext 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 - -#locating rebar -# Extract the first word of "rebar", so it can be a program name with args. -set dummy rebar; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_REBAR+set}" = set; then : +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_dir_tools" >&5 +$as_echo "$ac_cv_erlang_lib_dir_tools" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'tools' library version" >&5 +$as_echo_n "checking for Erlang/OTP 'tools' library version... " >&6; } +if test "${ac_cv_erlang_lib_ver_tools+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $REBAR in - [\\/]* | ?:[\\/]*) - ac_cv_path_REBAR="$REBAR" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_REBAR="$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 - - test -z "$ac_cv_path_REBAR" && ac_cv_path_REBAR="./rebar" - ;; -esac -fi -REBAR=$ac_cv_path_REBAR -if test -n "$REBAR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $REBAR" >&5 -$as_echo "$REBAR" >&6; } + if test "$ac_cv_erlang_lib_dir_tools" = "not found"; then : + ac_cv_erlang_lib_ver_tools="not found" else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + ac_cv_erlang_lib_ver_tools=`$as_echo "$ac_cv_erlang_lib_dir_tools" | sed -n -e 's,^.*-\([^/-]*\)$,\1,p'` +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_ver_tools" >&5 +$as_echo "$ac_cv_erlang_lib_ver_tools" >&6; } +ERLANG_LIB_DIR_tools=$ac_cv_erlang_lib_dir_tools + +ERLANG_LIB_VER_tools=$ac_cv_erlang_lib_ver_tools + +if test "$ac_cv_erlang_lib_dir_tools" = "not found"; then : + as_fn_error $? "Erlang application 'tools' was not found" "$LINENO" 5 fi - - -#locating make -# Extract the first word of "make", so it can be a program name with args. -set dummy make; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_MAKE+set}" = set; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'runtime_tools' library subdirectory" >&5 +$as_echo_n "checking for Erlang/OTP 'runtime_tools' library subdirectory... " >&6; } +if test "${ac_cv_erlang_lib_dir_runtime_tools+set}" = set; then : $as_echo_n "(cached) " >&6 else - if test -n "$MAKE"; then - ac_cv_prog_MAKE="$MAKE" # Let the user override the test. + ac_ext=erl +ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5' +ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext' + if test "$cross_compiling" = yes; then : + { { $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 test program while cross compiling +See \`config.log' for more details" "$LINENO" 5 ; } 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_MAKE="make" - $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 + cat > conftest.$ac_ext <<_ACEOF +-module(conftest). +-export([start/0]). -fi -fi -MAKE=$ac_cv_prog_MAKE -if test -n "$MAKE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAKE" >&5 -$as_echo "$MAKE" >&6; } +start() -> + ReturnValue = case code:lib_dir("runtime_tools") of + {error, bad_name} -> + file:write_file("conftest.out", "not found\n"), + 1; + LibDir -> + file:write_file("conftest.out", LibDir), + 0 + end, + halt(ReturnValue) +. + +_ACEOF +if ac_fn_erl_try_run "$LINENO"; then : + ac_cv_erlang_lib_dir_runtime_tools=`cat conftest.out` + rm -f conftest.out else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + if test ! -f conftest.out; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "test Erlang program execution failed +See \`config.log' for more details" "$LINENO" 5 ; } + else + ac_cv_erlang_lib_dir_runtime_tools="not found" + rm -f conftest.out + fi +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext 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 "x$ESCRIPT" = "x"; then - as_fn_error $? "'escript' was not found" "$LINENO" 5 fi - -if test "x$MAKE" = "x"; then - as_fn_error $? "'make' was not found" "$LINENO" 5 -fi - -# Change default prefix - - -# Check whether --enable-hipe was given. -if test "${enable_hipe+set}" = set; then : - enableval=$enable_hipe; case "${enableval}" in - yes) hipe=true ;; - no) hipe=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-hipe" "$LINENO" 5 ;; -esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_dir_runtime_tools" >&5 +$as_echo "$ac_cv_erlang_lib_dir_runtime_tools" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Erlang/OTP 'runtime_tools' library version" >&5 +$as_echo_n "checking for Erlang/OTP 'runtime_tools' library version... " >&6; } +if test "${ac_cv_erlang_lib_ver_runtime_tools+set}" = set; then : + $as_echo_n "(cached) " >&6 else - hipe=false -fi - - -# Check whether --enable-roster_gateway_workaround was given. -if test "${enable_roster_gateway_workaround+set}" = set; then : - enableval=$enable_roster_gateway_workaround; case "${enableval}" in - yes) roster_gateway_workaround=true ;; - no) roster_gateway_workaround=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-roster-gateway-workaround" "$LINENO" 5 ;; -esac + if test "$ac_cv_erlang_lib_dir_runtime_tools" = "not found"; then : + ac_cv_erlang_lib_ver_runtime_tools="not found" else - roster_gateway_workaround=false + ac_cv_erlang_lib_ver_runtime_tools=`$as_echo "$ac_cv_erlang_lib_dir_runtime_tools" | sed -n -e 's,^.*-\([^/-]*\)$,\1,p'` +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_erlang_lib_ver_runtime_tools" >&5 +$as_echo "$ac_cv_erlang_lib_ver_runtime_tools" >&6; } +ERLANG_LIB_DIR_runtime_tools=$ac_cv_erlang_lib_dir_runtime_tools + +ERLANG_LIB_VER_runtime_tools=$ac_cv_erlang_lib_ver_runtime_tools + +if test "$ac_cv_erlang_lib_dir_runtime_tools" = "not found"; then : + as_fn_error $? "Erlang application 'runtime_tools' was not found" "$LINENO" 5 fi - -# Check whether --enable-flash_hack was given. -if test "${enable_flash_hack+set}" = set; then : - enableval=$enable_flash_hack; case "${enableval}" in - yes) flash_hack=true ;; - no) flash_hack=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-flash-hack" "$LINENO" 5 ;; -esac -else - flash_hack=false fi -# Check whether --enable-transient_supervisors was given. -if test "${enable_transient_supervisors+set}" = set; then : - enableval=$enable_transient_supervisors; case "${enableval}" in - yes) transient_supervisors=true ;; - no) transient_supervisors=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-transient_supervisors" "$LINENO" 5 ;; -esac -else - transient_supervisors=false -fi - - -# Check whether --enable-full_xml was given. -if test "${enable_full_xml+set}" = set; then : - enableval=$enable_full_xml; case "${enableval}" in - yes) full_xml=true ;; - no) full_xml=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-full-xml" "$LINENO" 5 ;; -esac -else - full_xml=false -fi - - -# Check whether --enable-nif was given. -if test "${enable_nif+set}" = set; then : - enableval=$enable_nif; case "${enableval}" in - yes) nif=true ;; - no) nif=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-nif" "$LINENO" 5 ;; -esac -else - nif=false -fi - - -# Check whether --enable-mssql was given. -if test "${enable_mssql+set}" = set; then : - enableval=$enable_mssql; case "${enableval}" in - yes) db_type=mssql ;; - no) db_type=generic ;; - *) as_fn_error $? "bad value ${enableval} for --enable-mssql" "$LINENO" 5 ;; -esac -else - db_type=generic -fi - - -# Check whether --enable-mysql was given. -if test "${enable_mysql+set}" = set; then : - enableval=$enable_mysql; case "${enableval}" in - yes) mysql=true ;; - no) mysql=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-mysql" "$LINENO" 5 ;; -esac -else - mysql=false -fi - - -# Check whether --enable-pgsql was given. -if test "${enable_pgsql+set}" = set; then : - enableval=$enable_pgsql; case "${enableval}" in - yes) pgsql=true ;; - no) pgsql=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-pgsql" "$LINENO" 5 ;; -esac -else - pgsql=false -fi - - -# Check whether --enable-pam was given. -if test "${enable_pam+set}" = set; then : - enableval=$enable_pam; case "${enableval}" in - yes) pam=true ;; - no) pam=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-pam" "$LINENO" 5 ;; -esac -else - pam=false -fi - - -# Check whether --enable-zlib was given. -if test "${enable_zlib+set}" = set; then : - enableval=$enable_zlib; case "${enableval}" in - yes) zlib=true ;; - no) zlib=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-zlib" "$LINENO" 5 ;; -esac -else - zlib=true -fi - - -# Check whether --enable-stun was given. -if test "${enable_stun+set}" = set; then : - enableval=$enable_stun; case "${enableval}" in - yes) stun=true ;; - no) stun=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-stun" "$LINENO" 5 ;; -esac -else - stun=false -fi - - -# Check whether --enable-riak was given. -if test "${enable_riak+set}" = set; then : - enableval=$enable_riak; case "${enableval}" in - yes) riak=true ;; - no) riak=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-riak" "$LINENO" 5 ;; -esac -else - riak=false -fi - - -# Check whether --enable-json was given. -if test "${enable_json+set}" = set; then : - enableval=$enable_json; case "${enableval}" in - yes) json=true ;; - no) json=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-json" "$LINENO" 5 ;; -esac -else - json=false -fi - - -# Check whether --enable-iconv was given. -if test "${enable_iconv+set}" = set; then : - enableval=$enable_iconv; case "${enableval}" in - yes) iconv=true ;; - no) iconv=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-iconv" "$LINENO" 5 ;; -esac -else - iconv=false -fi - - -# Check whether --enable-debug was given. -if test "${enable_debug+set}" = set; then : - enableval=$enable_debug; case "${enableval}" in - yes) debug=true ;; - no) debug=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; -esac -else - debug=true -fi - - -# Check whether --enable-pubsub_ng was given. -if test "${enable_pubsub_ng+set}" = set; then : - enableval=$enable_pubsub_ng; case "${enableval}" in - yes) pubsub_ng=true ;; - no) pubsub_ng=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-pubsub_ng" "$LINENO" 5 ;; -esac -else - pubsub_ng=false -fi - - -# Check whether --enable-http was given. -if test "${enable_http+set}" = set; then : - enableval=$enable_http; case "${enableval}" in - yes) http=true ;; - no) http=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-http" "$LINENO" 5 ;; -esac -else - http=false -fi - - -# Check whether --enable-all was given. -if test "${enable_all+set}" = set; then : - enableval=$enable_all; case "${enableval}" in - yes) nif=true mysql=true pgsql=true pam=true zlib=true stun=true riak=true json=true iconv=true debug=true pubsub_ng=true http=true ;; - no) nif=false mysql=false pgsql=false pam=false zlib=false stun=false riak=false json=false iconv=false debug=false pubsub_ng=false http=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-all" "$LINENO" 5 ;; -esac -fi - - -ac_config_files="$ac_config_files Makefile vars.config src/ejabberd.app.src" - - -ENABLEUSER="" -# Check whether --enable-user was given. -if test "${enable_user+set}" = set; then : - enableval=$enable_user; case "${enableval}" in - yes) ENABLEUSER=`whoami` ;; - no) ENABLEUSER="" ;; - *) ENABLEUSER=$enableval - esac -fi - -if test "$ENABLEUSER" != ""; then - echo "allow this system user to start ejabberd: $ENABLEUSER" - INSTALLUSER=$ENABLEUSER - -fi - diff --git a/configure.ac b/configure.ac index e62a2353d..18cf8e8bc 100644 --- a/configure.ac +++ b/configure.ac @@ -18,25 +18,6 @@ fi AC_ERLANG_NEED_ERL AC_ERLANG_NEED_ERLC -AC_ERLANG_CHECK_LIB([sasl], [], - [AC_MSG_ERROR([Erlang application 'sasl' was not found])]) -AC_ERLANG_CHECK_LIB([crypto], [], - [AC_MSG_ERROR([Erlang application 'crypto' was not found])]) -AC_ERLANG_CHECK_LIB([public_key], [], - [AC_MSG_ERROR([Erlang application 'public_key' was not found])]) -AC_ERLANG_CHECK_LIB([ssl], [], - [AC_MSG_ERROR([Erlang application 'ssl' was not found])]) -AC_ERLANG_CHECK_LIB([mnesia], [], - [AC_MSG_ERROR([Erlang application 'mnesia' was not found])]) -AC_ERLANG_CHECK_LIB([inets], [], - [AC_MSG_ERROR([Erlang application 'inets' was not found])]) -AC_ERLANG_CHECK_LIB([odbc], [], - [AC_MSG_ERROR([Erlang application 'odbc' was not found])]) -AC_ERLANG_CHECK_LIB([tools], [], - [AC_MSG_ERROR([Erlang application 'tools' was not found])]) -AC_ERLANG_CHECK_LIB([compiler], [], - [AC_MSG_ERROR([Erlang application 'compiler' was not found])]) - # Checks and sets ERLANG_ROOT_DIR and ERLANG_LIB_DIR variable # AC_ERLANG_SUBST_ROOT_DIR # AC_ERLANG_SUBST_LIB_DIR @@ -205,6 +186,14 @@ AC_ARG_ENABLE(http, *) AC_MSG_ERROR(bad value ${enableval} for --enable-http) ;; esac],[http=false]) +AC_ARG_ENABLE(tools, +[AC_HELP_STRING([--enable-tools], [build development tools (currently the ejabberd profiler only, default: no)])], +[case "${enableval}" in + yes) tools=true ;; + no) tools=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-tools) ;; +esac],[tools=false]) + AC_ARG_ENABLE(all, [AC_HELP_STRING([--enable-all], [same as --enable-nif --enable-mysql --enable-pgsql --enable-pam --enable-zlib --enable-stun --enable-riak --enable-json --enable-iconv --enable-debug --enable-pubsub_ng --enable-http (useful for Dialyzer checks, default: no)])], [case "${enableval}" in @@ -231,6 +220,29 @@ if test "$ENABLEUSER" != ""; then AC_SUBST([INSTALLUSER], [$ENABLEUSER]) fi +AC_ERLANG_CHECK_LIB([sasl], [], + [AC_MSG_ERROR([Erlang application 'sasl' was not found])]) +AC_ERLANG_CHECK_LIB([crypto], [], + [AC_MSG_ERROR([Erlang application 'crypto' was not found])]) +AC_ERLANG_CHECK_LIB([public_key], [], + [AC_MSG_ERROR([Erlang application 'public_key' was not found])]) +AC_ERLANG_CHECK_LIB([ssl], [], + [AC_MSG_ERROR([Erlang application 'ssl' was not found])]) +AC_ERLANG_CHECK_LIB([mnesia], [], + [AC_MSG_ERROR([Erlang application 'mnesia' was not found])]) +AC_ERLANG_CHECK_LIB([inets], [], + [AC_MSG_ERROR([Erlang application 'inets' was not found])]) +AC_ERLANG_CHECK_LIB([odbc], [], + [AC_MSG_ERROR([Erlang application 'odbc' was not found])]) +AC_ERLANG_CHECK_LIB([compiler], [], + [AC_MSG_ERROR([Erlang application 'compiler' was not found])]) +if test "x$tools" = "xtrue"; then + AC_ERLANG_CHECK_LIB([tools], [], + [AC_MSG_ERROR([Erlang application 'tools' was not found])]) + AC_ERLANG_CHECK_LIB([runtime_tools], [], + [AC_MSG_ERROR([Erlang application 'runtime_tools' was not found])]) +fi + AC_SUBST(hipe) AC_SUBST(roster_gateway_workaround) AC_SUBST(flash_hack) @@ -249,5 +261,6 @@ AC_SUBST(iconv) AC_SUBST(debug) AC_SUBST(pubsub_ng) AC_SUBST(http) +AC_SUBST(tools) AC_OUTPUT diff --git a/rebar.config.script b/rebar.config.script index b826e9dee..751c05096 100644 --- a/rebar.config.script +++ b/rebar.config.script @@ -49,6 +49,8 @@ Includes = [{i, "include"}, SrcDirs = lists:foldl( fun({pubsub_ng, true}, Acc) -> [mod_pubsub_ng|Acc]; + ({tools, true}, Acc) -> + [tools|Acc]; (_, Acc) -> Acc end, [], Cfg), diff --git a/rel/reltool.config.script b/rel/reltool.config.script index 217ee5ecc..54b97ed00 100644 --- a/rel/reltool.config.script +++ b/rel/reltool.config.script @@ -13,8 +13,17 @@ Vars = case file:consult(filename:join(["..", "vars.config"])) of [] end, -OTPApps = [sasl, crypto, public_key, ssl, - mnesia, inets, odbc, tools, compiler], +RequiredOTPApps = [sasl, crypto, public_key, ssl, + mnesia, inets, odbc, compiler], + +ConfiguredOTPApps = lists:flatmap( + fun({tools, true}) -> + [tools, runtime_tools]; + (_) -> + [] + end, Vars), + +OTPApps = RequiredOTPApps ++ ConfiguredOTPApps, DepRequiredApps = [logger, cache_tab, tls, stringprep, xml, xmlrpc], diff --git a/src/p1_prof.erl b/tools/p1_prof.erl similarity index 100% rename from src/p1_prof.erl rename to tools/p1_prof.erl diff --git a/vars.config.in b/vars.config.in index 86f56cd0e..f40837076 100644 --- a/vars.config.in +++ b/vars.config.in @@ -18,6 +18,7 @@ %% Ad-hoc directories with source files {pubsub_ng, @pubsub_ng@}. +{tools, @tools@}. %% Dependencies {mysql, @mysql@}. From 5968b35320cfefadec4206d016cff92541fd1002 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Sun, 12 May 2013 14:30:49 +1000 Subject: [PATCH 45/53] Make it possible to combine --enable-all with other configure options --- configure | 314 +++++++++++++++++++++++++-------------------------- configure.ac | 192 +++++++++++++++---------------- 2 files changed, 253 insertions(+), 253 deletions(-) diff --git a/configure b/configure index f3b2b9011..15197807e 100755 --- a/configure +++ b/configure @@ -657,8 +657,10 @@ enable_roster_gateway_workaround enable_flash_hack enable_transient_supervisors enable_full_xml -enable_nif enable_mssql +enable_tools +enable_all +enable_nif enable_mysql enable_pgsql enable_pam @@ -670,8 +672,6 @@ enable_iconv enable_debug enable_pubsub_ng enable_http -enable_tools -enable_all enable_user ' ac_precious_vars='build_alias @@ -1302,10 +1302,17 @@ Optional Features: (default: no) --enable-full-xml use XML features in XMPP stream (ex: CDATA) (default: no, requires XML compliant clients) - --enable-nif replace some functions with C equivalents. Requires - Erlang R13B04 or higher (default: no) --enable-mssql use Microsoft SQL Server database (default: no, requires --enable-odbc) + --enable-tools build development tools (currently the ejabberd + profiler only, default: no) + --enable-all same as --enable-nif --enable-mysql --enable-pgsql + --enable-pam --enable-zlib --enable-stun + --enable-riak --enable-json --enable-iconv + --enable-debug --enable-pubsub_ng --enable-http + (useful for Dialyzer checks, default: no) + --enable-nif replace some functions with C equivalents. Requires + Erlang R13B04 or higher (default: no) --enable-mysql enable MySQL support (default: no) --enable-pgsql enable PostgreSQL support (default: no) --enable-pam enable PAM support (default: no) @@ -1314,18 +1321,11 @@ Optional Features: --enable-stun enable STUN support (default: no) --enable-riak enable Riak support (default: no) --enable-json enable JSON support for mod_bosh (default: no) - --enable-iconv enable iconv support (default: no) + --enable-iconv enable iconv support (default: yes) --enable-debug enable debug information (default: yes) --enable-pubsub_ng enable PubSub NG (default: no) --enable-http build external HTTP libraries ('ibrowse' and 'lhttpc', default: no) - --enable-tools build development tools (currently the ejabberd - profiler only, default: no) - --enable-all same as --enable-nif --enable-mysql --enable-pgsql - --enable-pam --enable-zlib --enable-stun - --enable-riak --enable-json --enable-iconv - --enable-debug --enable-pubsub_ng --enable-http - (useful for Dialyzer checks, default: no) --enable-user[[[=USER]]] allow this system user to start ejabberd (default: no) @@ -2457,18 +2457,6 @@ else fi -# Check whether --enable-nif was given. -if test "${enable_nif+set}" = set; then : - enableval=$enable_nif; case "${enableval}" in - yes) nif=true ;; - no) nif=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-nif" "$LINENO" 5 ;; -esac -else - nif=false -fi - - # Check whether --enable-mssql was given. if test "${enable_mssql+set}" = set; then : enableval=$enable_mssql; case "${enableval}" in @@ -2481,138 +2469,6 @@ else fi -# Check whether --enable-mysql was given. -if test "${enable_mysql+set}" = set; then : - enableval=$enable_mysql; case "${enableval}" in - yes) mysql=true ;; - no) mysql=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-mysql" "$LINENO" 5 ;; -esac -else - mysql=false -fi - - -# Check whether --enable-pgsql was given. -if test "${enable_pgsql+set}" = set; then : - enableval=$enable_pgsql; case "${enableval}" in - yes) pgsql=true ;; - no) pgsql=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-pgsql" "$LINENO" 5 ;; -esac -else - pgsql=false -fi - - -# Check whether --enable-pam was given. -if test "${enable_pam+set}" = set; then : - enableval=$enable_pam; case "${enableval}" in - yes) pam=true ;; - no) pam=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-pam" "$LINENO" 5 ;; -esac -else - pam=false -fi - - -# Check whether --enable-zlib was given. -if test "${enable_zlib+set}" = set; then : - enableval=$enable_zlib; case "${enableval}" in - yes) zlib=true ;; - no) zlib=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-zlib" "$LINENO" 5 ;; -esac -else - zlib=true -fi - - -# Check whether --enable-stun was given. -if test "${enable_stun+set}" = set; then : - enableval=$enable_stun; case "${enableval}" in - yes) stun=true ;; - no) stun=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-stun" "$LINENO" 5 ;; -esac -else - stun=false -fi - - -# Check whether --enable-riak was given. -if test "${enable_riak+set}" = set; then : - enableval=$enable_riak; case "${enableval}" in - yes) riak=true ;; - no) riak=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-riak" "$LINENO" 5 ;; -esac -else - riak=false -fi - - -# Check whether --enable-json was given. -if test "${enable_json+set}" = set; then : - enableval=$enable_json; case "${enableval}" in - yes) json=true ;; - no) json=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-json" "$LINENO" 5 ;; -esac -else - json=false -fi - - -# Check whether --enable-iconv was given. -if test "${enable_iconv+set}" = set; then : - enableval=$enable_iconv; case "${enableval}" in - yes) iconv=true ;; - no) iconv=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-iconv" "$LINENO" 5 ;; -esac -else - iconv=false -fi - - -# Check whether --enable-debug was given. -if test "${enable_debug+set}" = set; then : - enableval=$enable_debug; case "${enableval}" in - yes) debug=true ;; - no) debug=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; -esac -else - debug=true -fi - - -# Check whether --enable-pubsub_ng was given. -if test "${enable_pubsub_ng+set}" = set; then : - enableval=$enable_pubsub_ng; case "${enableval}" in - yes) pubsub_ng=true ;; - no) pubsub_ng=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-pubsub_ng" "$LINENO" 5 ;; -esac -else - pubsub_ng=false -fi - - -# Check whether --enable-http was given. -if test "${enable_http+set}" = set; then : - enableval=$enable_http; case "${enableval}" in - yes) http=true ;; - no) http=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-http" "$LINENO" 5 ;; -esac -else - http=false -fi - - # Check whether --enable-tools was given. if test "${enable_tools+set}" = set; then : enableval=$enable_tools; case "${enableval}" in @@ -2635,6 +2491,150 @@ esac fi +# Check whether --enable-nif was given. +if test "${enable_nif+set}" = set; then : + enableval=$enable_nif; case "${enableval}" in + yes) nif=true ;; + no) nif=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-nif" "$LINENO" 5 ;; +esac +else + if test "x$nif" = "x"; then nif=false; fi +fi + + +# Check whether --enable-mysql was given. +if test "${enable_mysql+set}" = set; then : + enableval=$enable_mysql; case "${enableval}" in + yes) mysql=true ;; + no) mysql=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-mysql" "$LINENO" 5 ;; +esac +else + if test "x$mysql" = "x"; then mysql=false; fi +fi + + +# Check whether --enable-pgsql was given. +if test "${enable_pgsql+set}" = set; then : + enableval=$enable_pgsql; case "${enableval}" in + yes) pgsql=true ;; + no) pgsql=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-pgsql" "$LINENO" 5 ;; +esac +else + if test "x$pgsql" = "x"; then pgsql=false; fi +fi + + +# Check whether --enable-pam was given. +if test "${enable_pam+set}" = set; then : + enableval=$enable_pam; case "${enableval}" in + yes) pam=true ;; + no) pam=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-pam" "$LINENO" 5 ;; +esac +else + if test "x$pam" = "x"; then pam=false; fi +fi + + +# Check whether --enable-zlib was given. +if test "${enable_zlib+set}" = set; then : + enableval=$enable_zlib; case "${enableval}" in + yes) zlib=true ;; + no) zlib=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-zlib" "$LINENO" 5 ;; +esac +else + if test "x$zlib" = "x"; then zlib=true; fi +fi + + +# Check whether --enable-stun was given. +if test "${enable_stun+set}" = set; then : + enableval=$enable_stun; case "${enableval}" in + yes) stun=true ;; + no) stun=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-stun" "$LINENO" 5 ;; +esac +else + if test "x$stun" = "x"; then stun=false; fi +fi + + +# Check whether --enable-riak was given. +if test "${enable_riak+set}" = set; then : + enableval=$enable_riak; case "${enableval}" in + yes) riak=true ;; + no) riak=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-riak" "$LINENO" 5 ;; +esac +else + if test "x$riak" = "x"; then riak=false; fi +fi + + +# Check whether --enable-json was given. +if test "${enable_json+set}" = set; then : + enableval=$enable_json; case "${enableval}" in + yes) json=true ;; + no) json=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-json" "$LINENO" 5 ;; +esac +else + if test "x$json" = "x"; then json=false; fi +fi + + +# Check whether --enable-iconv was given. +if test "${enable_iconv+set}" = set; then : + enableval=$enable_iconv; case "${enableval}" in + yes) iconv=true ;; + no) iconv=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-iconv" "$LINENO" 5 ;; +esac +else + if test "x$iconv" = "x"; then iconv=true; fi +fi + + +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; case "${enableval}" in + yes) debug=true ;; + no) debug=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; +esac +else + if test "x$debug" = "x"; then debug=true; fi +fi + + +# Check whether --enable-pubsub_ng was given. +if test "${enable_pubsub_ng+set}" = set; then : + enableval=$enable_pubsub_ng; case "${enableval}" in + yes) pubsub_ng=true ;; + no) pubsub_ng=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-pubsub_ng" "$LINENO" 5 ;; +esac +else + if test "x$pubsub_ng" = "x"; then pubsub_ng=false; fi +fi + + +# Check whether --enable-http was given. +if test "${enable_http+set}" = set; then : + enableval=$enable_http; case "${enableval}" in + yes) http=true ;; + no) http=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-http" "$LINENO" 5 ;; +esac +else + if test "x$http" = "x"; then http=false; fi +fi + + ac_config_files="$ac_config_files Makefile vars.config src/ejabberd.app.src" diff --git a/configure.ac b/configure.ac index 18cf8e8bc..441ee7cc3 100644 --- a/configure.ac +++ b/configure.ac @@ -82,14 +82,6 @@ AC_ARG_ENABLE(full_xml, *) AC_MSG_ERROR(bad value ${enableval} for --enable-full-xml) ;; esac],[full_xml=false]) -AC_ARG_ENABLE(nif, -[AC_HELP_STRING([--enable-nif], [replace some functions with C equivalents. Requires Erlang R13B04 or higher (default: no)])], -[case "${enableval}" in - yes) nif=true ;; - no) nif=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-nif) ;; -esac],[nif=false]) - AC_ARG_ENABLE(mssql, [AC_HELP_STRING([--enable-mssql], [use Microsoft SQL Server database (default: no, requires --enable-odbc)])], [case "${enableval}" in @@ -98,94 +90,6 @@ AC_ARG_ENABLE(mssql, *) AC_MSG_ERROR(bad value ${enableval} for --enable-mssql) ;; esac],[db_type=generic]) -AC_ARG_ENABLE(mysql, -[AC_HELP_STRING([--enable-mysql], [enable MySQL support (default: no)])], -[case "${enableval}" in - yes) mysql=true ;; - no) mysql=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-mysql) ;; -esac],[mysql=false]) - -AC_ARG_ENABLE(pgsql, -[AC_HELP_STRING([--enable-pgsql], [enable PostgreSQL support (default: no)])], -[case "${enableval}" in - yes) pgsql=true ;; - no) pgsql=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-pgsql) ;; -esac],[pgsql=false]) - -AC_ARG_ENABLE(pam, -[AC_HELP_STRING([--enable-pam], [enable PAM support (default: no)])], -[case "${enableval}" in - yes) pam=true ;; - no) pam=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-pam) ;; -esac],[pam=false]) - -AC_ARG_ENABLE(zlib, -[AC_HELP_STRING([--enable-zlib], [enable Stream Compression (XEP-0138) using zlib (default: yes)])], -[case "${enableval}" in - yes) zlib=true ;; - no) zlib=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-zlib) ;; -esac],[zlib=true]) - -AC_ARG_ENABLE(stun, -[AC_HELP_STRING([--enable-stun], [enable STUN support (default: no)])], -[case "${enableval}" in - yes) stun=true ;; - no) stun=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-stun) ;; -esac],[stun=false]) - -AC_ARG_ENABLE(riak, -[AC_HELP_STRING([--enable-riak], [enable Riak support (default: no)])], -[case "${enableval}" in - yes) riak=true ;; - no) riak=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-riak) ;; -esac],[riak=false]) - -AC_ARG_ENABLE(json, -[AC_HELP_STRING([--enable-json], [enable JSON support for mod_bosh (default: no)])], -[case "${enableval}" in - yes) json=true ;; - no) json=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-json) ;; -esac],[json=false]) - -AC_ARG_ENABLE(iconv, -[AC_HELP_STRING([--enable-iconv], [enable iconv support (default: no)])], -[case "${enableval}" in - yes) iconv=true ;; - no) iconv=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-iconv) ;; -esac],[iconv=false]) - -AC_ARG_ENABLE(debug, -[AC_HELP_STRING([--enable-debug], [enable debug information (default: yes)])], -[case "${enableval}" in - yes) debug=true ;; - no) debug=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; -esac],[debug=true]) - -AC_ARG_ENABLE(pubsub_ng, -[AC_HELP_STRING([--enable-pubsub_ng], [enable PubSub NG (default: no)])], -[case "${enableval}" in - yes) pubsub_ng=true ;; - no) pubsub_ng=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-pubsub_ng) ;; -esac],[pubsub_ng=false]) - -AC_ARG_ENABLE(http, -[AC_HELP_STRING([--enable-http], [build external HTTP libraries ('ibrowse' and 'lhttpc', default: no)])], -[case "${enableval}" in - yes) http=true ;; - no) http=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-http) ;; -esac],[http=false]) - AC_ARG_ENABLE(tools, [AC_HELP_STRING([--enable-tools], [build development tools (currently the ejabberd profiler only, default: no)])], [case "${enableval}" in @@ -202,6 +106,102 @@ AC_ARG_ENABLE(all, *) AC_MSG_ERROR(bad value ${enableval} for --enable-all) ;; esac],[]) +AC_ARG_ENABLE(nif, +[AC_HELP_STRING([--enable-nif], [replace some functions with C equivalents. Requires Erlang R13B04 or higher (default: no)])], +[case "${enableval}" in + yes) nif=true ;; + no) nif=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-nif) ;; +esac],[if test "x$nif" = "x"; then nif=false; fi]) + +AC_ARG_ENABLE(mysql, +[AC_HELP_STRING([--enable-mysql], [enable MySQL support (default: no)])], +[case "${enableval}" in + yes) mysql=true ;; + no) mysql=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-mysql) ;; +esac],[if test "x$mysql" = "x"; then mysql=false; fi]) + +AC_ARG_ENABLE(pgsql, +[AC_HELP_STRING([--enable-pgsql], [enable PostgreSQL support (default: no)])], +[case "${enableval}" in + yes) pgsql=true ;; + no) pgsql=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-pgsql) ;; +esac],[if test "x$pgsql" = "x"; then pgsql=false; fi]) + +AC_ARG_ENABLE(pam, +[AC_HELP_STRING([--enable-pam], [enable PAM support (default: no)])], +[case "${enableval}" in + yes) pam=true ;; + no) pam=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-pam) ;; +esac],[if test "x$pam" = "x"; then pam=false; fi]) + +AC_ARG_ENABLE(zlib, +[AC_HELP_STRING([--enable-zlib], [enable Stream Compression (XEP-0138) using zlib (default: yes)])], +[case "${enableval}" in + yes) zlib=true ;; + no) zlib=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-zlib) ;; +esac],[if test "x$zlib" = "x"; then zlib=true; fi]) + +AC_ARG_ENABLE(stun, +[AC_HELP_STRING([--enable-stun], [enable STUN support (default: no)])], +[case "${enableval}" in + yes) stun=true ;; + no) stun=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-stun) ;; +esac],[if test "x$stun" = "x"; then stun=false; fi]) + +AC_ARG_ENABLE(riak, +[AC_HELP_STRING([--enable-riak], [enable Riak support (default: no)])], +[case "${enableval}" in + yes) riak=true ;; + no) riak=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-riak) ;; +esac],[if test "x$riak" = "x"; then riak=false; fi]) + +AC_ARG_ENABLE(json, +[AC_HELP_STRING([--enable-json], [enable JSON support for mod_bosh (default: no)])], +[case "${enableval}" in + yes) json=true ;; + no) json=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-json) ;; +esac],[if test "x$json" = "x"; then json=false; fi]) + +AC_ARG_ENABLE(iconv, +[AC_HELP_STRING([--enable-iconv], [enable iconv support (default: yes)])], +[case "${enableval}" in + yes) iconv=true ;; + no) iconv=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-iconv) ;; +esac],[if test "x$iconv" = "x"; then iconv=true; fi]) + +AC_ARG_ENABLE(debug, +[AC_HELP_STRING([--enable-debug], [enable debug information (default: yes)])], +[case "${enableval}" in + yes) debug=true ;; + no) debug=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; +esac],[if test "x$debug" = "x"; then debug=true; fi]) + +AC_ARG_ENABLE(pubsub_ng, +[AC_HELP_STRING([--enable-pubsub_ng], [enable PubSub NG (default: no)])], +[case "${enableval}" in + yes) pubsub_ng=true ;; + no) pubsub_ng=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-pubsub_ng) ;; +esac],[if test "x$pubsub_ng" = "x"; then pubsub_ng=false; fi]) + +AC_ARG_ENABLE(http, +[AC_HELP_STRING([--enable-http], [build external HTTP libraries ('ibrowse' and 'lhttpc', default: no)])], +[case "${enableval}" in + yes) http=true ;; + no) http=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-http) ;; +esac],[if test "x$http" = "x"; then http=false; fi]) + AC_CONFIG_FILES([Makefile vars.config src/ejabberd.app.src]) From 09250d612163a85282fb739c013004e5f56fef95 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Sun, 12 May 2013 14:37:57 +1000 Subject: [PATCH 46/53] Do not allow underscores in configure options --- configure | 6 +++--- configure.ac | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/configure b/configure index 15197807e..e6ab4a344 100755 --- a/configure +++ b/configure @@ -1309,7 +1309,7 @@ Optional Features: --enable-all same as --enable-nif --enable-mysql --enable-pgsql --enable-pam --enable-zlib --enable-stun --enable-riak --enable-json --enable-iconv - --enable-debug --enable-pubsub_ng --enable-http + --enable-debug --enable-pubsub-ng --enable-http (useful for Dialyzer checks, default: no) --enable-nif replace some functions with C equivalents. Requires Erlang R13B04 or higher (default: no) @@ -1323,7 +1323,7 @@ Optional Features: --enable-json enable JSON support for mod_bosh (default: no) --enable-iconv enable iconv support (default: yes) --enable-debug enable debug information (default: yes) - --enable-pubsub_ng enable PubSub NG (default: no) + --enable-pubsub-ng enable PubSub NG (default: no) --enable-http build external HTTP libraries ('ibrowse' and 'lhttpc', default: no) --enable-user[[[=USER]]] @@ -2616,7 +2616,7 @@ if test "${enable_pubsub_ng+set}" = set; then : enableval=$enable_pubsub_ng; case "${enableval}" in yes) pubsub_ng=true ;; no) pubsub_ng=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-pubsub_ng" "$LINENO" 5 ;; + *) as_fn_error $? "bad value ${enableval} for --enable-pubsub-ng" "$LINENO" 5 ;; esac else if test "x$pubsub_ng" = "x"; then pubsub_ng=false; fi diff --git a/configure.ac b/configure.ac index 441ee7cc3..1b016ea27 100644 --- a/configure.ac +++ b/configure.ac @@ -99,7 +99,7 @@ AC_ARG_ENABLE(tools, esac],[tools=false]) AC_ARG_ENABLE(all, -[AC_HELP_STRING([--enable-all], [same as --enable-nif --enable-mysql --enable-pgsql --enable-pam --enable-zlib --enable-stun --enable-riak --enable-json --enable-iconv --enable-debug --enable-pubsub_ng --enable-http (useful for Dialyzer checks, default: no)])], +[AC_HELP_STRING([--enable-all], [same as --enable-nif --enable-mysql --enable-pgsql --enable-pam --enable-zlib --enable-stun --enable-riak --enable-json --enable-iconv --enable-debug --enable-pubsub-ng --enable-http (useful for Dialyzer checks, default: no)])], [case "${enableval}" in yes) nif=true mysql=true pgsql=true pam=true zlib=true stun=true riak=true json=true iconv=true debug=true pubsub_ng=true http=true ;; no) nif=false mysql=false pgsql=false pam=false zlib=false stun=false riak=false json=false iconv=false debug=false pubsub_ng=false http=false ;; @@ -187,11 +187,11 @@ AC_ARG_ENABLE(debug, esac],[if test "x$debug" = "x"; then debug=true; fi]) AC_ARG_ENABLE(pubsub_ng, -[AC_HELP_STRING([--enable-pubsub_ng], [enable PubSub NG (default: no)])], +[AC_HELP_STRING([--enable-pubsub-ng], [enable PubSub NG (default: no)])], [case "${enableval}" in yes) pubsub_ng=true ;; no) pubsub_ng=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-pubsub_ng) ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-pubsub-ng) ;; esac],[if test "x$pubsub_ng" = "x"; then pubsub_ng=false; fi]) AC_ARG_ENABLE(http, From 8bea14837e48cd6e6aeb682efd42d084ca79a966 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Sun, 12 May 2013 14:40:26 +1000 Subject: [PATCH 47/53] Do not forget to remove autom4te.cache on distclean --- Makefile.in | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.in b/Makefile.in index fbbd1f45b..60478c6ac 100644 --- a/Makefile.in +++ b/Makefile.in @@ -204,6 +204,7 @@ clean-rel: distclean: clean clean-rel rm -f config.status rm -f config.log + rm -rf autom4te.cache rm -rf deps rm -rf ebin rm -f Makefile From 951599be21484d954c12ac221075254b52f7e424 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Sun, 12 May 2013 16:05:41 +1000 Subject: [PATCH 48/53] Describe the new configure options in the guide --- doc/guide.tex | 118 ++++++++++++++++++-------------------------------- 1 file changed, 42 insertions(+), 76 deletions(-) diff --git a/doc/guide.tex b/doc/guide.tex index 390f0743e..1785cc6a6 100644 --- a/doc/guide.tex +++ b/doc/guide.tex @@ -386,10 +386,34 @@ Some options that you may be interested in modifying: \titem{--enable-pam} Enable the PAM authentication method (see section \ref{pam}). - \titem{--enable-odbc or --enable-mssql} + \titem{--enable-mssql} Required if you want to use an external database. See section~\ref{database} for more information. + \titem{--enable-tools} + Enable the use of development tools. + + \titem{--enable-mysql} + Enable MySQL support (see section \ref{mysql}). + + \titem{--enable-pgsql} + Enable PostgreSQL support (see section \ref{pgsql}). + + \titem{--enable-zlib} + Enable Stream Compression (XEP-0138) using zlib. + + \titem{--enable-stun} + Enable STUN support (see section \ref{stun}). + + \titem{--enable-riak} + Enable Riak support. + + \titem{--enable-iconv} + Enable iconv support. This is needed for \term{mod\_irc} (see seciont \ref{modirc}). + + \titem{--enable-debug} + Compile with \term{+debug\_info} enabled. + \titem{--enable-full-xml} Enable the use of XML based optimisations. It will for example use CDATA to escape characters in the XMPP stream. @@ -1257,6 +1281,7 @@ The following authentication methods are supported by \ejabberd{}: \ref{mssql} and \ref{odbc}. \item anonymous --- See section~\ref{saslanonymous}. \item pam --- See section~\ref{pam}. +\item riak --- See section~\ref{riak}. \end{itemize} Account creation is only supported by internal, external and odbc methods. @@ -1972,14 +1997,8 @@ For example: \makesubsection{mysql}{MySQL} \ind{MySQL}\ind{MySQL!schema} -Although this section will describe \ejabberd{}'s configuration when you want to -use the native MySQL driver, it does not describe MySQL's installation and -database creation. Check the MySQL documentation and the tutorial \footahref{http://support.process-one.net/doc/display/MESSENGER/Using+ejabberd+with+MySQL+native+driver}{Using ejabberd with MySQL native driver} for information regarding these topics. -Note that the tutorial contains information about \ejabberd{}'s configuration -which is duplicate to this section. - -Moreover, the file mysql.sql in the directory src/odbc might be interesting for -you. This file contains the \ejabberd{} schema for MySQL. At the end of the file +There is a file \term{mysql.sql} in the directory \term{odbc}. +This file contains the \ejabberd{} schema for MySQL. At the end of the file you can find information to update your database schema. @@ -1987,19 +2006,13 @@ you can find information to update your database schema. \ind{MySQL!Driver Compilation} You can skip this step if you installed \ejabberd{} using a binary installer or -if the binary packages of \ejabberd{} you are using include support for MySQL. +if the binary packages of \ejabberd{} you are using include support for ODBC. -\begin{enumerate} -\item First, install the \footahref{http://support.process-one.net/doc/display/CONTRIBS/Yxa}{Erlang - MySQL library}. Make sure the compiled files are in your Erlang path; you can - put them for example in the same directory as your \ejabberd{} .beam files. -\item Then, configure and install \ejabberd{} with ODBC support enabled (this is - also needed for native MySQL support!). This can be done, by using next - commands: +Use \term{--enable-mysql} configure option in order to build \ejabberd{} with +MySQL support: \begin{verbatim} -./configure --enable-odbc && make install +./configure --enable-mysql && make install \end{verbatim} -\end{enumerate} \makesubsubsection{configuremysql}{Database Connection} @@ -2072,16 +2085,9 @@ that you cannot have several variants of the same module loaded! \makesubsection{mssql}{Microsoft SQL Server} \ind{Microsoft SQL Server}\ind{Microsoft SQL Server!schema} -Although this section will describe \ejabberd{}'s configuration when you want to -use Microsoft SQL Server, it does not describe Microsoft SQL Server's -installation and database creation. Check the MySQL documentation and the -tutorial \footahref{http://support.process-one.net/doc/display/MESSENGER/Using+ejabberd+with+MySQL+native+driver}{Using ejabberd with MySQL native driver} for information regarding these topics. -Note that the tutorial contains information about \ejabberd{}'s configuration -which is duplicate to this section. - -Moreover, the file mssql.sql in the directory src/odbc might be interesting for -you. This file contains the \ejabberd{} schema for Microsoft SQL Server. At the end -of the file you can find information to update your database schema. +There is a file \term{mssql.sql} in the directory \term{odbc}. +This file contains the \ejabberd{} schema for Microsoft SQL Server. At the end of the file +you can find information to update your database schema. \makesubsubsection{compilemssql}{Driver Compilation} @@ -2090,11 +2096,10 @@ of the file you can find information to update your database schema. You can skip this step if you installed \ejabberd{} using a binary installer or if the binary packages of \ejabberd{} you are using include support for ODBC. -If you want to use Microsoft SQL Server with ODBC, you need to configure, -compile and install \ejabberd{} with support for ODBC and Microsoft SQL Server -enabled. This can be done, by using next commands: +Use \term{--enable-mssql} configure option in order to build \ejabberd{} with +Microsoft SQL Server support: \begin{verbatim} -./configure --enable-odbc --enable-mssql && make install +./configure --enable-mssql && make install \end{verbatim} @@ -2139,13 +2144,7 @@ module loaded! \makesubsection{pgsql}{PostgreSQL} \ind{PostgreSQL}\ind{PostgreSQL!schema} -Although this section will describe \ejabberd{}'s configuration when you want to -use the native PostgreSQL driver, it does not describe PostgreSQL's installation -and database creation. Check the PostgreSQL documentation and the tutorial \footahref{http://support.process-one.net/doc/display/MESSENGER/Using+ejabberd+with+MySQL+native+driver}{Using ejabberd with MySQL native driver} for information regarding these topics. -Note that the tutorial contains information about \ejabberd{}'s configuration -which is duplicate to this section. - -Also the file pg.sql in the directory src/odbc might be interesting for you. +There is a file \term{pg.sql} in the directory \term{odbc}. This file contains the \ejabberd{} schema for PostgreSQL. At the end of the file you can find information to update your database schema. @@ -2157,19 +2156,11 @@ You can skip this step if you installed \ejabberd{} using a binary installer or if the binary packages of \ejabberd{} you are using include support for PostgreSQL. -\begin{enumerate} -\item First, install the Erlang pgsql library from - \footahref{http://www.ejabberd.im/ejabberd-modules/}{ejabberd-modules SVN repository}. - Make sure the compiled - files are in your Erlang path; you can put them for example in the same - directory as your \ejabberd{} .beam files. -\item Then, configure, compile and install \ejabberd{} with ODBC support enabled - (this is also needed for native PostgreSQL support!). This can be done, by - using next commands: +Use \term{--enable-pgsql} configure option in order to build \ejabberd{} with +PostgreSQL support: \begin{verbatim} -./configure --enable-odbc && make install +./configure --enable-pgsql && make install \end{verbatim} -\end{enumerate} \makesubsubsection{configurepgsql}{Database Connection} @@ -2236,31 +2227,6 @@ Keep in mind that you cannot have several variants of the same module loaded! \makesubsection{odbc}{ODBC Compatible} \ind{databases!ODBC} -Although this section will describe \ejabberd{}'s configuration when you want to -use the ODBC driver, it does not describe the installation and database creation -of your database. Check the documentation of your database. The tutorial \footahref{http://support.process-one.net/doc/display/MESSENGER/Using+ejabberd+with+MySQL+native+driver}{Using ejabberd with MySQL native driver} also can help you. Note that the tutorial -contains information about \ejabberd{}'s configuration which is duplicate to -this section. - - -\makesubsubsection{compileodbc}{Driver Compilation} - -You can skip this step if you installed \ejabberd{} using a binary installer or -if the binary packages of \ejabberd{} you are using include support for -ODBC. - -\begin{enumerate} -\item First, install the \footahref{http://support.process-one.net/doc/display/CONTRIBS/Yxa}{Erlang - MySQL library}. Make sure the compiled files are in your Erlang path; you can - put them for example in the same directory as your \ejabberd{} .beam files. -\item Then, configure, compile and install \ejabberd{} with ODBC support - enabled. This can be done, by using next commands: -\begin{verbatim} -./configure --enable-odbc && make install -\end{verbatim} -\end{enumerate} - - \makesubsubsection{configureodbc}{Database Connection} \ind{ODBC!Database Connection} From 300e765e203880d9398bcecbedc9ca8ad9966cbf Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Sun, 12 May 2013 19:41:59 +1000 Subject: [PATCH 49/53] Call all logging functions via single module --- include/logger.hrl | 36 ++++++++++++++++++++ rebar.config.script | 3 +- rel/reltool.config.script | 2 +- src/ejabberd_admin.erl | 24 ++------------ src/ejabberd_app.erl | 4 +-- src/ejabberd_config.erl | 2 +- src/ejabberd_logger.erl | 70 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 113 insertions(+), 28 deletions(-) create mode 100644 include/logger.hrl create mode 100644 src/ejabberd_logger.erl diff --git a/include/logger.hrl b/include/logger.hrl new file mode 100644 index 000000000..d61b61ac0 --- /dev/null +++ b/include/logger.hrl @@ -0,0 +1,36 @@ +%%%---------------------------------------------------------------------- +%%% +%%% ejabberd, Copyright (C) 2002-2013 ProcessOne +%%% +%%% 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 +%%% +%%%---------------------------------------------------------------------- +-define(PRINT(Format, Args), io:format(Format, Args)). + +-define(DEBUG(Format, Args), + ejabberd_logger:debug_msg(?MODULE, ?LINE, Format, Args)). + +-define(INFO_MSG(Format, Args), + ejabberd_logger:info_msg(?MODULE, ?LINE, Format, Args)). + +-define(WARNING_MSG(Format, Args), + ejabberd_logger:warning_msg(?MODULE, ?LINE, Format, Args)). + +-define(ERROR_MSG(Format, Args), + ejabberd_logger:error_msg(?MODULE, ?LINE, Format, Args)). + +-define(CRITICAL_MSG(Format, Args), + ejabberd_logger:critical_msg(?MODULE, ?LINE, Format, Args)). diff --git a/rebar.config.script b/rebar.config.script index 751c05096..d8280ab59 100644 --- a/rebar.config.script +++ b/rebar.config.script @@ -43,7 +43,6 @@ HiPE = case lists:keysearch(hipe, 1, Cfg) of end, Includes = [{i, "include"}, - {i, filename:join(["deps", "logger", "include"])}, {i, filename:join(["deps", "xml", "include"])}], SrcDirs = lists:foldl( @@ -55,7 +54,7 @@ SrcDirs = lists:foldl( Acc end, [], Cfg), -Deps = [{logger, ".*", {git, "git://github.com/processone/p1_logger"}}, +Deps = [{p1_logger, ".*", {git, "git://github.com/processone/p1_logger"}}, {cache_tab, ".*", {git, "git://github.com/processone/cache_tab"}}, {tls, ".*", {git, "git://github.com/processone/tls"}}, {stringprep, ".*", {git, "git://github.com/processone/stringprep"}}, diff --git a/rel/reltool.config.script b/rel/reltool.config.script index 54b97ed00..dc23ed904 100644 --- a/rel/reltool.config.script +++ b/rel/reltool.config.script @@ -25,7 +25,7 @@ ConfiguredOTPApps = lists:flatmap( OTPApps = RequiredOTPApps ++ ConfiguredOTPApps, -DepRequiredApps = [logger, cache_tab, tls, stringprep, xml, xmlrpc], +DepRequiredApps = [p1_logger, cache_tab, tls, stringprep, xml, xmlrpc], DepConfiguredApps = lists:flatmap( fun({mysql, true}) -> [mysql]; diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl index cef10013b..b0f847337 100644 --- a/src/ejabberd_admin.erl +++ b/src/ejabberd_admin.erl @@ -110,7 +110,7 @@ commands() -> result = {res, rescode}}, #ejabberd_commands{name = get_loglevel, tags = [logs, server], desc = "Get the current loglevel", - module = loglevel, function = get, + module = ejabberd_logger, function = get, args = [], result = {leveltuple, {tuple, [{levelnumber, integer}, {levelatom, atom}, @@ -280,27 +280,7 @@ status() -> reopen_log() -> ejabberd_hooks:run(reopen_log_hook, []), - %% TODO: Use the Reopen log API for logger_h ? - logger_h:reopen_log(), - case application:get_env(sasl,sasl_error_logger) of - {ok, {file, SASLfile}} -> - error_logger:delete_report_handler(sasl_report_file_h), - logger_h:rotate_log(SASLfile), - error_logger:add_report_handler(sasl_report_file_h, - {SASLfile, get_sasl_error_logger_type()}); - _ -> false - end, - ok. - -%% Function copied from Erlang/OTP lib/sasl/src/sasl.erl which doesn't export it -get_sasl_error_logger_type () -> - case application:get_env (sasl, errlog_type) of - {ok, error} -> error; - {ok, progress} -> progress; - {ok, all} -> all; - {ok, Bad} -> exit ({bad_config, {sasl, {errlog_type, Bad}}}); - _ -> all - end. + ejabberd_logger:reopen_log(). %%% %%% Stop Kindly diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl index 218a714c7..3cedf352f 100644 --- a/src/ejabberd_app.erl +++ b/src/ejabberd_app.erl @@ -39,7 +39,7 @@ %%% start(normal, _Args) -> - loglevel:set(4), + ejabberd_logger:set(4), write_pid_file(), start_apps(), randoms:start(), @@ -104,7 +104,7 @@ init() -> %erlang:system_flag(fullsweep_after, 0), %error_logger:logfile({open, ?LOG_PATH}), LogPath = get_log_path(), - error_logger:add_report_handler(logger_h, LogPath), + ejabberd_logger:set_logfile(LogPath), loop(). loop() -> diff --git a/src/ejabberd_config.erl b/src/ejabberd_config.erl index c973c19b2..c4206426e 100644 --- a/src/ejabberd_config.erl +++ b/src/ejabberd_config.erl @@ -453,7 +453,7 @@ process_term(Term, State) -> {ejabberdctl_access_commands, ACs} -> add_option(ejabberdctl_access_commands, ACs, State); {loglevel, Loglevel} -> - loglevel:set(Loglevel), + ejabberd_logger:set(Loglevel), State; {max_fsm_queue, N} -> add_option(max_fsm_queue, N, State); diff --git a/src/ejabberd_logger.erl b/src/ejabberd_logger.erl new file mode 100644 index 000000000..afb1f3f3d --- /dev/null +++ b/src/ejabberd_logger.erl @@ -0,0 +1,70 @@ +%%%------------------------------------------------------------------- +%%% @author Evgeniy Khramtsov +%%% @copyright (C) 2013, Evgeniy Khramtsov +%%% @doc +%%% +%%% @end +%%% Created : 12 May 2013 by Evgeniy Khramtsov +%%%------------------------------------------------------------------- +-module(ejabberd_logger). + +%% API +-export([start/0, set_logfile/1, reopen_log/0, get/0, set/1, + debug_msg/4, info_msg/4, warning_msg/4, error_msg/4, + critical_msg/4]). + +%%%=================================================================== +%%% API +%%%=================================================================== +start() -> + ok. + +set_logfile(FileName) -> + error_logger:add_report_handler(p1_logger_h, FileName). + +reopen_log() -> + %% TODO: Use the Reopen log API for logger_h ? + p1_logger_h:reopen_log(), + case application:get_env(sasl,sasl_error_logger) of + {ok, {file, SASLfile}} -> + error_logger:delete_report_handler(sasl_report_file_h), + p1_logger_h:rotate_log(SASLfile), + error_logger:add_report_handler(sasl_report_file_h, + {SASLfile, get_sasl_error_logger_type()}); + _ -> false + end, + ok. + +get() -> + p1_loglevel:get(). + +set(LogLevel) -> + p1_loglevel:set(LogLevel). + +debug_msg(Mod, Line, Format, Args) -> + p1_logger:debug_msg(Mod, Line, Format, Args). + +info_msg(Mod, Line, Format, Args) -> + p1_logger:info_msg(Mod, Line, Format, Args). + +warning_msg(Mod, Line, Format, Args) -> + p1_logger:warning_msg(Mod, Line, Format, Args). + +error_msg(Mod, Line, Format, Args) -> + p1_logger:error_msg(Mod, Line, Format, Args). + +critical_msg(Mod, Line, Format, Args) -> + p1_logger:critical_msg(Mod, Line, Format, Args). + +%%%=================================================================== +%%% Internal functions +%%%=================================================================== +%% Function copied from Erlang/OTP lib/sasl/src/sasl.erl which doesn't export it +get_sasl_error_logger_type () -> + case application:get_env (sasl, errlog_type) of + {ok, error} -> error; + {ok, progress} -> progress; + {ok, all} -> all; + {ok, Bad} -> exit ({bad_config, {sasl, {errlog_type, Bad}}}); + _ -> all + end. From 08774b1b5a38dacbedc24148f4f03616055e0036 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Mon, 13 May 2013 15:55:46 +1000 Subject: [PATCH 50/53] Pass --enable-flash-hack flag to "xml" app --- rebar.config.script | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rebar.config.script b/rebar.config.script index d8280ab59..82727a5b2 100644 --- a/rebar.config.script +++ b/rebar.config.script @@ -72,6 +72,8 @@ XMLFlags = lists:foldl( Acc ++ " --enable-nif"; ({full_xml, true}, Acc) -> Acc ++ " --enable-full-xml"; + ({flash_hack, true}, Acc) -> + Acc ++ " --enable-flash-hack"; (_, Acc) -> Acc end, "", Cfg), From 1a45637860a033c23e31a39d969c88cafc91e1ec Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 15 May 2013 16:34:02 +1000 Subject: [PATCH 51/53] Improve the profiler --- tools/p1_prof.erl | 106 ++++++++++++++++++++-------------------------- 1 file changed, 45 insertions(+), 61 deletions(-) diff --git a/tools/p1_prof.erl b/tools/p1_prof.erl index d4f4b8856..cec73d506 100644 --- a/tools/p1_prof.erl +++ b/tools/p1_prof.erl @@ -34,56 +34,64 @@ reds/0, reds/1, trace/1, help/0, q/0, m/0, r/0, q/1, m/1, r/1]). --define(APPS, [ejabberd, mnesia]). +-define(TRACE_FILE, "/tmp/fprof.trace"). +-define(ANALYSIS_FILE, "/tmp/fprof.analysis"). %%==================================================================== %% API %%==================================================================== eprof_start() -> eprof:start(), - case lists:keyfind(running, 1, application:info()) of - {_, Apps} -> - case get_procs(?APPS, Apps) of - [] -> - {error, no_procs_found}; - Procs -> - eprof:start_profiling(Procs) - end; - _ -> - {error, no_app_info} + case get_procs() of + [] -> + {error, no_procs_found}; + Procs -> + eprof:start_profiling(Procs) end. fprof_start() -> fprof_start(0). fprof_start(Duration) -> - case lists:keyfind(running, 1, application:info()) of - {_, Apps} -> - case get_procs(?APPS, Apps) of - [] -> - {error, no_procs_found}; - Procs -> - fprof:trace([start, {procs, Procs}]), - io:format("Profiling started~n"), - if Duration > 0 -> - timer:sleep(Duration*1000), - fprof:trace([stop]), - fprof:stop(); - true-> - ok - end - end; - _ -> - {error, no_app_info} + case get_procs() of + [] -> + {error, no_procs_found}; + Procs -> + case fprof:trace([start, {procs, Procs}, {file, ?TRACE_FILE}]) of + ok -> + io:format("Profiling started, writing trace data to ~s~n", + [?TRACE_FILE]), + if Duration > 0 -> + timer:sleep(Duration*1000), + fprof:trace([stop]), + fprof:stop(); + true-> + ok + end; + Err -> + io:format("Couldn't start profiling: ~p~n", [Err]), + Err + end end. fprof_stop() -> fprof:trace([stop]), - fprof:profile(), - fprof:analyse([totals, no_details, {sort, own}, - no_callers, {dest, "fprof.analysis"}]), - fprof:stop(), - format_fprof_analyze(). + case fprof:profile([{file, ?TRACE_FILE}]) of + ok -> + case fprof:analyse([totals, no_details, {sort, own}, + no_callers, {dest, ?ANALYSIS_FILE}]) of + ok -> + fprof:stop(), + format_fprof_analyze(); + Err -> + io:format("Couldn't analyze: ~p~n", [Err]), + Err + end; + Err -> + io:format("Couldn't compile a trace into profile data: ~p~n", + [Err]), + Err + end. fprof_analyze() -> fprof_stop(). @@ -175,35 +183,11 @@ trace_loop() -> %%==================================================================== %% Internal functions %%==================================================================== -get_procs(Apps, AppList) -> - io:format("Searching for processes to profile...~n", []), - Procs = lists:flatmap( - fun({App, Leader}) when is_pid(Leader) -> - case lists:member(App, Apps) of - true -> - get_procs(Leader); - false -> - [] - end; - (_) -> - [] - end, AppList), - io:format("Found ~p processes~n", [length(Procs)]), - Procs. - -get_procs(Leader) -> - lists:filter( - fun(Pid) -> - case process_info(Pid, group_leader) of - {_, Leader} -> - true; - _ -> - false - end - end, processes()). +get_procs() -> + processes(). format_fprof_analyze() -> - case file:consult("fprof.analysis") of + case file:consult(?ANALYSIS_FILE) of {ok, [_, [{totals, _, _, TotalOWN}] | Rest]} -> OWNs = lists:flatmap( fun({MFA, _, _, OWN}) -> From a8e5984f5fd2d68ccb0c6e9877e157691b6c22cd Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 15 May 2013 17:33:49 +1000 Subject: [PATCH 52/53] Reflect applications name change --- rebar.config.script | 34 +++++++++++++++++----------------- rel/reltool.config.script | 14 +++++++------- src/ejabberd_app.erl | 10 +++++----- src/ejabberd_auth_pam.erl | 2 +- src/ejabberd_listener.erl | 2 +- src/mod_irc.erl | 2 +- 6 files changed, 32 insertions(+), 32 deletions(-) diff --git a/rebar.config.script b/rebar.config.script index 82727a5b2..b4d1047af 100644 --- a/rebar.config.script +++ b/rebar.config.script @@ -43,7 +43,7 @@ HiPE = case lists:keysearch(hipe, 1, Cfg) of end, Includes = [{i, "include"}, - {i, filename:join(["deps", "xml", "include"])}], + {i, filename:join(["deps", "p1_xml", "include"])}], SrcDirs = lists:foldl( fun({pubsub_ng, true}, Acc) -> @@ -55,10 +55,10 @@ SrcDirs = lists:foldl( end, [], Cfg), Deps = [{p1_logger, ".*", {git, "git://github.com/processone/p1_logger"}}, - {cache_tab, ".*", {git, "git://github.com/processone/cache_tab"}}, - {tls, ".*", {git, "git://github.com/processone/tls"}}, - {stringprep, ".*", {git, "git://github.com/processone/stringprep"}}, - {xml, ".*", {git, "git://github.com/processone/xml"}}, + {p1_cache_tab, ".*", {git, "git://github.com/processone/cache_tab"}}, + {p1_tls, ".*", {git, "git://github.com/processone/tls"}}, + {p1_stringprep, ".*", {git, "git://github.com/processone/stringprep"}}, + {p1_xml, ".*", {git, "git://github.com/processone/xml"}}, {xmlrpc, ".*", {git, "git://github.com/rds13/xmlrpc"}}], ConfigureCmd = fun(Pkg, Flags) -> @@ -78,27 +78,27 @@ XMLFlags = lists:foldl( Acc end, "", Cfg), -PostHooks = [ConfigureCmd("tls", ""), - ConfigureCmd("stringprep", ""), - ConfigureCmd("xml", XMLFlags)], +PostHooks = [ConfigureCmd("p1_tls", ""), + ConfigureCmd("p1_stringprep", ""), + ConfigureCmd("p1_xml", XMLFlags)], CfgDeps = lists:flatmap( fun({mysql, true}) -> - [{mysql, ".*", {git, "git://github.com/processone/mysql"}}]; + [{p1_mysql, ".*", {git, "git://github.com/processone/mysql"}}]; ({pgsql, true}) -> - [{pgsql, ".*", {git, "git://github.com/processone/pgsql"}}]; + [{p1_pgsql, ".*", {git, "git://github.com/processone/pgsql"}}]; ({pam, true}) -> - [{epam, ".*", {git, "git://github.com/processone/epam"}}]; + [{p1_pam, ".*", {git, "git://github.com/processone/epam"}}]; ({zlib, true}) -> - [{ezlib, ".*", {git, "git://github.com/processone/zlib"}}]; + [{p1_zlib, ".*", {git, "git://github.com/processone/zlib"}}]; ({stun, true}) -> - [{stun, ".*", {git, "git://github.com/processone/stun"}}]; + [{p1_stun, ".*", {git, "git://github.com/processone/stun"}}]; ({riak, true}) -> [{riakc, ".*", {git, "git://github.com/basho/riak-erlang-client"}}]; ({json, true}) -> [{jiffy, ".*", {git, "git://github.com/davisp/jiffy"}}]; ({iconv, true}) -> - [{iconv, ".*", {git, "git://github.com/processone/eiconv"}}]; + [{p1_iconv, ".*", {git, "git://github.com/processone/eiconv"}}]; ({http, true}) -> [{ibrowse, ".*", {git, "git://github.com/cmullaparthi/ibrowse"}}, {lhttpc, ".*", {git, "git://github.com/esl/lhttpc"}}]; @@ -108,11 +108,11 @@ CfgDeps = lists:flatmap( CfgPostHooks = lists:flatmap( fun({pam, true}) -> - [ConfigureCmd("epam", "")]; + [ConfigureCmd("p1_pam", "")]; ({zlib, true}) -> - [ConfigureCmd("ezlib", "")]; + [ConfigureCmd("p1_zlib", "")]; ({iconv, true}) -> - [ConfigureCmd("iconv", "")]; + [ConfigureCmd("p1_iconv", "")]; (_) -> [] end, Cfg), diff --git a/rel/reltool.config.script b/rel/reltool.config.script index dc23ed904..64ba40491 100644 --- a/rel/reltool.config.script +++ b/rel/reltool.config.script @@ -25,17 +25,17 @@ ConfiguredOTPApps = lists:flatmap( OTPApps = RequiredOTPApps ++ ConfiguredOTPApps, -DepRequiredApps = [p1_logger, cache_tab, tls, stringprep, xml, xmlrpc], +DepRequiredApps = [p1_logger, p1_cache_tab, p1_tls, p1_stringprep, p1_xml, xmlrpc], DepConfiguredApps = lists:flatmap( - fun({mysql, true}) -> [mysql]; - ({pgsql, true}) -> [pgsql]; - ({pam, true}) -> [epam]; - ({zlib, true}) -> [ezlib]; - ({stun, true}) -> [stun]; + fun({mysql, true}) -> [p1_mysql]; + ({pgsql, true}) -> [p1_pgsql]; + ({pam, true}) -> [p1_pam]; + ({zlib, true}) -> [p1_zlib]; + ({stun, true}) -> [p1_stun]; ({riak, true}) -> [riakc, riak_pb, protobuffs]; ({json, true}) -> [jiffy]; - ({iconv, true}) -> [iconv]; + ({iconv, true}) -> [p1_iconv]; ({http, true}) -> [ibrowse, lhttpc]; (_) -> [] end, Vars), diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl index 3cedf352f..2732e7c43 100644 --- a/src/ejabberd_app.erl +++ b/src/ejabberd_app.erl @@ -245,8 +245,8 @@ start_apps() -> application:start(crypto), application:start(public_key), application:start(ssl), - application:start(tls), - application:start(xml), - application:start(stringprep), - application:start(ezlib), - application:start(cache_tab). + application:start(p1_tls), + application:start(p1_xml), + application:start(p1_stringprep), + application:start(p1_zlib), + application:start(p1_cache_tab). diff --git a/src/ejabberd_auth_pam.erl b/src/ejabberd_auth_pam.erl index af3bb17f2..8413faaae 100644 --- a/src/ejabberd_auth_pam.erl +++ b/src/ejabberd_auth_pam.erl @@ -40,7 +40,7 @@ plain_password_required/0]). start(_Host) -> - case application:start(epam) of + case application:start(p1_pam) of {ok, _} -> ok; {error, {already_started, _}} -> ok; Err -> Err diff --git a/src/ejabberd_listener.erl b/src/ejabberd_listener.erl index 55d607484..b675785e6 100644 --- a/src/ejabberd_listener.erl +++ b/src/ejabberd_listener.erl @@ -624,7 +624,7 @@ prepare_ip(IP) when is_binary(IP) -> prepare_mod(ejabberd_stun) -> prepare_mod(stun); prepare_mod(stun) -> - application:start(stun), + application:start(p1_stun), stun; prepare_mod(Mod) -> Mod. diff --git a/src/mod_irc.erl b/src/mod_irc.erl index 1773a3934..3a5f99844 100644 --- a/src/mod_irc.erl +++ b/src/mod_irc.erl @@ -99,7 +99,7 @@ stop(Host) -> %%==================================================================== init([Host, Opts]) -> - application:start(iconv), + application:start(p1_iconv), MyHost = gen_mod:get_opt_host(Host, Opts, <<"irc.@HOST@">>), case gen_mod:db_type(Opts) of From 16cd93d587a21921cc187f2736a5fb9ea4227b12 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 15 May 2013 18:46:56 +1000 Subject: [PATCH 53/53] Improve applications startup --- src/ejabberd.erl | 27 ++++++++++++++++++++++++++- src/ejabberd_app.erl | 16 +++++++--------- src/ejabberd_auth_pam.erl | 6 +----- src/ejabberd_listener.erl | 2 +- src/ejabberd_odbc.erl | 2 +- src/ejabberd_riak_sup.erl | 1 + src/http_p1.erl | 8 ++++---- src/mod_bosh.erl | 4 +--- src/mod_irc.erl | 2 +- 9 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/ejabberd.erl b/src/ejabberd.erl index 02b24e5a2..7b83f19a1 100644 --- a/src/ejabberd.erl +++ b/src/ejabberd.erl @@ -27,7 +27,7 @@ -module(ejabberd). -author('alexey@process-one.net'). --export([start/0, stop/0, +-export([start/0, stop/0, start_app/1, get_pid_file/0]). -include("logger.hrl"). @@ -50,3 +50,28 @@ get_pid_file() -> Path -> Path end. + +start_app(App) when not is_list(App) -> + start_app([App]); +start_app([App|Apps]) -> + case application:start(App) of + ok -> + start_app(Apps); + {error, {already_started, _}} -> + start_app(Apps); + {error, {not_started, DepApp}} -> + case lists:member(DepApp, [App|Apps]) of + true -> + ?CRITICAL_MSG("failed to start application '~p': " + "circular dependency on '~p' detected", + [App, DepApp]), + erlang:error(application_start_failed); + false -> + start_app([DepApp,App|Apps]) + end; + Err -> + ?CRITICAL_MSG("failed to start application '~p': ~p", [App, Err]), + erlang:error(application_start_failed) + end; +start_app([]) -> + ok. diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl index 2732e7c43..4db7307e5 100644 --- a/src/ejabberd_app.erl +++ b/src/ejabberd_app.erl @@ -241,12 +241,10 @@ delete_pid_file() -> end. start_apps() -> - application:start(sasl), - application:start(crypto), - application:start(public_key), - application:start(ssl), - application:start(p1_tls), - application:start(p1_xml), - application:start(p1_stringprep), - application:start(p1_zlib), - application:start(p1_cache_tab). + ejabberd:start_app(sasl), + ejabberd:start_app(ssl), + ejabberd:start_app(p1_tls), + ejabberd:start_app(p1_xml), + ejabberd:start_app(p1_stringprep), + ejabberd:start_app(p1_zlib), + ejabberd:start_app(p1_cache_tab). diff --git a/src/ejabberd_auth_pam.erl b/src/ejabberd_auth_pam.erl index 8413faaae..b6747a52c 100644 --- a/src/ejabberd_auth_pam.erl +++ b/src/ejabberd_auth_pam.erl @@ -40,11 +40,7 @@ plain_password_required/0]). start(_Host) -> - case application:start(p1_pam) of - {ok, _} -> ok; - {error, {already_started, _}} -> ok; - Err -> Err - end. + ejabberd:start_app(p1_pam). set_password(_User, _Server, _Password) -> {error, not_allowed}. diff --git a/src/ejabberd_listener.erl b/src/ejabberd_listener.erl index b675785e6..fefb5591c 100644 --- a/src/ejabberd_listener.erl +++ b/src/ejabberd_listener.erl @@ -624,7 +624,7 @@ prepare_ip(IP) when is_binary(IP) -> prepare_mod(ejabberd_stun) -> prepare_mod(stun); prepare_mod(stun) -> - application:start(p1_stun), + ejabberd:start_app(p1_stun), stun; prepare_mod(Mod) -> Mod. diff --git a/src/ejabberd_odbc.erl b/src/ejabberd_odbc.erl index 194dd9eba..1308e8665 100644 --- a/src/ejabberd_odbc.erl +++ b/src/ejabberd_odbc.erl @@ -463,7 +463,7 @@ abort_on_driver_error(Reply, From) -> %% == pure ODBC code odbc_connect(SQLServer) -> - application:start(odbc), + ejabberd:start_app(odbc), odbc:connect(SQLServer, [{scrollable_cursors, off}]). %% == Native PostgreSQL code diff --git a/src/ejabberd_riak_sup.erl b/src/ejabberd_riak_sup.erl index fbb4b5689..5f27e0a7f 100644 --- a/src/ejabberd_riak_sup.erl +++ b/src/ejabberd_riak_sup.erl @@ -55,6 +55,7 @@ start() -> riak_server, fun(_) -> true end, false), if StartRiak -> + ejabberd:start_app(riakc), do_start(); true -> ok diff --git a/src/http_p1.erl b/src/http_p1.erl index 497375581..343a0bf46 100644 --- a/src/http_p1.erl +++ b/src/http_p1.erl @@ -39,7 +39,7 @@ -ifdef(USE_IBROWSE). start() -> - application:start(ibrowse). + ejabberd:start_app(ibrowse). stop() -> application:stop(ibrowse). @@ -61,7 +61,7 @@ request(Method, URL, Hdrs, Body, Opts) -> -ifdef(USE_LHTTPC). start() -> - application:start(lhttpc). + ejabberd:start_app(lhttpc). stop() -> application:stop(lhttpc). @@ -82,10 +82,10 @@ request(Method, URL, Hdrs, Body, Opts) -> -else. start() -> - application:start(inets). + ejabberd:start_app(inets). stop() -> - application:start(inets). + ejabberd:start_app(inets). to_list(Str) when is_binary(Str) -> binary_to_list(Str); diff --git a/src/mod_bosh.erl b/src/mod_bosh.erl index c173f2416..85ce101a5 100644 --- a/src/mod_bosh.erl +++ b/src/mod_bosh.erl @@ -186,11 +186,9 @@ start_jiffy(Opts) -> false -> ok; true -> - case application:start(jiffy) of + case catch ejabberd:start_app(jiffy) of ok -> ok; - {error, {already_started, _}} -> - ok; Err -> ?WARNING_MSG("Failed to start JSON codec (jiffy): ~p. " "JSON support will be disabled", [Err]) diff --git a/src/mod_irc.erl b/src/mod_irc.erl index 3a5f99844..ec9c68699 100644 --- a/src/mod_irc.erl +++ b/src/mod_irc.erl @@ -99,7 +99,7 @@ stop(Host) -> %%==================================================================== init([Host, Opts]) -> - application:start(p1_iconv), + ejabberd:start_app(p1_iconv), MyHost = gen_mod:get_opt_host(Host, Opts, <<"irc.@HOST@">>), case gen_mod:db_type(Opts) of